88 if (
m_verbose>=
VERBOSE_NORMAL)
Cout(
"iScannerPET::Instantiate() -> Create scanner structure and read parameters from configuration file"<< endl);
97 Cerr(
"***** iScannerPET::Instantiate() -> An error occurred while trying to read the number of layers in the scanner header file !" << endl);
103 Cerr(
"***** iScannerPET::Instantiate() -> Incorrect value for the number of layer (should be >0) !" << endl);
109 Cerr(
"***** iScannerPET::Instantiate() -> An error occurred while trying to read the number of elements in the scanner header file !" << endl);
138 if (a_scannerFileIsLUT)
145 Cerr(
"***** iScannerPET::Instantiate() -> An error occurred while trying to read the crystals size in the scanner header file !" << endl);
156 Cerr(
"***** iScannerPET::Instantiate() -> An error occurred while trying to read the crystals size in the scanner header file !" << endl);
173 Cerr(
"***** iScannerPET::Instantiate() -> An error occurred while trying to read the mean depth of interaction in the scanner header file !" << endl);
178 Cerr(
"***** iScannerPET::Instantiate() -> An error occurred while trying to read the min angle difference in the scanner header file !" << endl);
183 Cerr(
"***** iScannerPET::Instantiate() -> An error occurred while trying to read the multiple bed displacement in the scanner header file !" << endl);
213 if (
m_verbose>=
VERBOSE_NORMAL)
Cout(
"iScannerPET::BuildLUT() -> Build LUT for scanner elements coordinates and orientations"<< endl);
216 if (!a_scannerFileIsLUT)
220 Cerr(
"***** iScannerPET::BuildLUT() -> A problem occured while generating scanner LUT !" << endl);
228 Cerr(
"***** iScannerPET::BuildLUT() -> A problem occured while loading scanner LUT !" << endl);
257 Cerr(
"***** iScannerPET::CheckParameters() -> Scanner type not initialized !" << endl);
262 Cerr(
"***** iScannerPET::CheckParameters() -> Verbosity not initialized !" << endl);
267 Cerr(
"***** iScannerPET::CheckParameters() -> Incorrect value for the number of layer (should be >0) !" << endl);
272 Cerr(
"***** iScannerPET::CheckParameters() -> Number of crystals not initialized !" << endl);
277 Cerr(
"***** iScannerPET::CheckParameters() -> Number of rings not initialized !" << endl);
282 Cerr(
"***** iScannerPET::CheckParameters() -> Number of crystals in layer(s) not initialized !" << endl);
287 Cerr(
"***** iScannerPET::CheckParameters() -> Crystals central positions not initialized !" << endl);
292 Cerr(
"***** iScannerPET::CheckParameters() -> Crystals orientations not initialized !" << endl);
297 Cerr(
"***** iScannerPET::CheckParameters() -> Crystals dimensions not initialized !" << endl);
302 Cout(
"***** iScannerPET::CheckParameters() -> Mean depth of interaction not initialized !" << endl);
307 Cerr(
"***** iScannerPET::CheckParameters() -> Minimum angle difference not initialized !" << endl);
312 Cerr(
"***** iScannerPET::CheckParameters() -> Maximal ring difference not initialized !" << endl);
317 Cerr(
"***** iScannerPET::CheckParameters() -> Scanner type not initialized !" << endl);
322 Cerr(
"***** iScannerPET::CheckParameters() -> Scanner type not initialized !" << endl);
349 Cerr(
"***** iScannerPET::Initialize() -> Parameters have not been checked !" << endl);
388 Cerr(
"***** iScannerPET::LoadLUT() -> An error occurred while trying to read a mandatory parameter in the scanner header file !" << endl);
396 scanner_lut_file = scanner_lut_file.substr(0, scanner_lut_file.find_last_of(
".")).append(
".lut");
399 FILE* LUT_file = fopen(scanner_lut_file.c_str(),
"rb");
402 Cerr(
"***** iScannerPET::LoadLUT() -> Input LUT file '" << scanner_lut_file <<
"' is missing or corrupted !" << endl);
407 int nb_data_read = 0;
412 nb_data_read += fread(&buffer,
sizeof(
FLTNBLUT),1,LUT_file);
414 nb_data_read += fread(&buffer,
sizeof(
FLTNBLUT),1,LUT_file);
416 nb_data_read += fread(&buffer,
sizeof(
FLTNBLUT),1,LUT_file);
419 nb_data_read += fread(&buffer,
sizeof(
FLTNBLUT),1,LUT_file);
421 nb_data_read += fread(&buffer,
sizeof(
FLTNBLUT),1,LUT_file);
423 nb_data_read += fread(&buffer,
sizeof(
FLTNBLUT),1,LUT_file);
431 if (nb_data_read!=m_nbCrystals*6)
433 Cerr(
"***** iScannerPET::LoadLUT() -> Failed to read all data in input LUT file '" << scanner_lut_file <<
"' !" << endl);
466 int *nb_rsectors_lyr,
469 *nb_trans_submod_lyr,
470 *nb_axial_submod_lyr,
471 *nb_trans_crystal_lyr,
472 *nb_axial_crystal_lyr;
475 *rsector_first_angle_lyr,
476 *rsector_angular_span_lyr,
479 *gap_trans_submod_lyr,
480 *gap_axial_submod_lyr,
481 *gap_trans_crystal_lyr,
482 *gap_axial_crystal_lyr;
502 string rotation_direction =
"";
514 Cerr(
"***** iScannerPET::ComputeLUT() -> An error occurred while trying to read a mandatory parameter for scanner LUT generation in the scanner header file !" << endl);
524 nb_trans_mod_lyr[ l ] =1;
525 nb_axial_mod_lyr[ l ] =1;
526 nb_trans_submod_lyr[ l ] = 1;
527 nb_axial_submod_lyr[ l ] = 1;
528 gap_trans_mod_lyr[ l ] = 0.;
529 gap_axial_mod_lyr[ l ] = 0.;
530 gap_trans_submod_lyr[ l ] = 0.;
531 gap_axial_submod_lyr[ l ] = 0.;
532 gap_trans_crystal_lyr[ l ] = 0.;
533 gap_axial_crystal_lyr[ l ] = 0.;
534 rsector_first_angle_lyr[ l ] = 0;
535 rsector_angular_span_lyr[ l ] = 360.*(
FLTNBLUT)(nb_rsectors_lyr[l]-1)/(nb_rsectors_lyr[l]);
552 Cerr(
"***** iScannerPET::ComputeLUT() -> An error occurred while trying to read an optionnal parameter for scanner LUT generation in the scanner header file !" << endl);
559 * nb_axial_submod_lyr[ lyr ]
560 * nb_axial_crystal_lyr[ lyr ];
565 Cerr(
"***** iScannerPET::ComputeLUT() -> Error occured while trying to initialize head rotation orientation " << endl);
572 int rsector_nb_zshift;
580 Cerr(
"***** iScannerPET::ComputeLUT() -> Error occurred when trying to read z-shift nb !" << endl);
584 else if( rvalue > 1 || rsector_nb_zshift==0)
586 rsector_nb_zshift = 1;
587 zshift =
new FLTNBLUT[rsector_nb_zshift];
593 zshift =
new FLTNBLUT[rsector_nb_zshift];
597 Cerr(
"***** iScannerPET::ComputeLUT() -> No data found about modules z-shift in the scanner header file, whereas z-shift is enabled !" << endl);
603 int nb_crystals_cur = 0;
611 int nb_rsectors = nb_rsectors_lyr[lyr],
612 nb_trans_mod = nb_trans_mod_lyr[lyr],
613 nb_axial_mod = nb_axial_mod_lyr[lyr],
614 nb_trans_submod = nb_trans_submod_lyr[lyr],
615 nb_axial_submod = nb_axial_submod_lyr[lyr],
616 nb_trans_crystal = nb_trans_crystal_lyr[lyr],
617 nb_axial_crystal = nb_axial_crystal_lyr[lyr];
620 rsector_first_angle = rsector_first_angle_lyr[lyr],
621 angular_span = rsector_angular_span_lyr[lyr],
622 gap_trans_mod = gap_trans_mod_lyr[lyr],
623 gap_axial_mod = gap_axial_mod_lyr[lyr],
624 gap_trans_submod = gap_trans_submod_lyr[lyr],
625 gap_axial_submod = gap_axial_submod_lyr[lyr],
626 gap_trans_crystal = gap_trans_crystal_lyr[lyr],
627 gap_axial_crystal = gap_axial_crystal_lyr[lyr];
631 FLTNBLUT size_trans_mod = nb_trans_submod*size_trans_submod + (nb_trans_submod-1)*gap_trans_submod;
632 FLTNBLUT size_axial_mod = nb_axial_submod*size_axial_submod + (nb_axial_submod-1)*gap_axial_submod;
634 int nb_mod = nb_axial_mod * nb_trans_mod;
635 int nb_submod = nb_axial_submod * nb_trans_submod;
636 int nb_crystal = nb_axial_crystal * nb_trans_crystal;
639 int nb_crystals = nb_rsectors*nb_mod*nb_submod*nb_crystal + nb_crystals_cur;
642 Cerr(
"***** iScannerPET::ComputeLUT() -> Computed number of crystals computed from the geom file ("<< nb_crystals
643 <<
") > not consistent with the total number of crystals (including potential layers) provided in the geom file ("<<
m_nbCrystals <<
") !" << endl);
659 for(
int i = 0; i < nb_rsectors+1 ; i++)
661 crystal_center[i] =
new oMatrix ***[nb_axial_mod * nb_trans_mod];
663 for (
int j = 0; j<nb_axial_mod*nb_trans_mod ; j++)
665 crystal_center[i][j] =
new oMatrix **[nb_axial_submod * nb_trans_submod];
667 for (
int k = 0; k<nb_axial_submod*nb_trans_submod; k++)
669 crystal_center[i][j][k] =
new oMatrix*[nb_axial_crystal * nb_trans_crystal];
671 for (
int l = 0; l<nb_axial_crystal*nb_trans_crystal; l++)
673 crystal_center[i][j][k][l] =
new oMatrix(3,1);
682 for(
int i=0; i<nb_rsectors; i++)
683 rotation_mtx[i] =
new oMatrix(3,3);
686 FLTNBLUT rsector_first_angle_rad = rsector_first_angle*M_PI/180.;
687 FLTNBLUT angular_span_rad = angular_span*M_PI/180.;
692 for (
int i = 0; i<nb_rsectors; i++)
694 FLTNBLUT angle = remainderf(rsector_first_angle_rad + ((
FLTNBLUT)i)*angular_span_rad/((
FLTNBLUT)(nb_rsectors-1)), 2.*M_PI);
707 for (
int i=0; i < nb_mod ; i++)
710 FLTNBLUT x_start_m = -dir*(nb_trans_mod*size_trans_mod + (nb_trans_mod-1)*gap_trans_mod) / 2.;
711 FLTNBLUT z_start_m = -(nb_axial_mod*size_axial_mod + (nb_axial_mod-1)*gap_axial_mod) / 2.;
715 x_start_m += dir*(i%nb_trans_mod) * (size_trans_mod + gap_trans_mod);
716 z_start_m += int(i/nb_trans_mod) * (size_axial_mod + gap_axial_mod);
718 for (
int j=0 ; j < nb_submod ; j++)
723 x_start_sm += dir*(j%nb_trans_submod) * (size_trans_submod + gap_trans_submod);
724 z_start_sm += int(j/nb_trans_submod) * (size_axial_submod + gap_axial_submod);
726 for (
int k=0 ; k < nb_crystal ; k++)
747 for (
int rs=0 ; rs<nb_rsectors ; rs++)
748 for (
int m=0 ; m<nb_mod ; m++)
749 for (
int sm=0 ; sm<nb_submod ; sm++)
750 for (
int c=0 ; c<nb_crystal ; c++)
753 int cryID = int(m/nb_trans_mod)*nb_axial_submod*nb_axial_crystal*number_crystals_in_ring
754 + int(sm/nb_trans_submod)*nb_axial_crystal*number_crystals_in_ring
755 + int(c/nb_trans_crystal)*number_crystals_in_ring
756 + rs*nb_trans_mod*nb_trans_submod*nb_trans_crystal
757 + m%nb_trans_mod*nb_trans_submod*nb_trans_crystal
758 + sm%nb_trans_submod*nb_trans_crystal
764 rotation_mtx[rs]->
Multiplication(crystal_center[0][m][sm][c], crystal_center[rs+1][m][sm][c]);
783 for (
int i = 0; i < nb_rsectors+1 ; i++)
784 for (
int j = 0; j<nb_axial_mod*nb_trans_mod; j++)
785 for (
int k = 0; k<nb_axial_submod*nb_trans_submod; k++)
786 for (
int l = 0; l<nb_axial_crystal*nb_trans_crystal; l++)
788 delete crystal_center[i][j][k][l];
792 for(
int i = 0; i < nb_rsectors+1 ; i++)
793 for (
int j = 0; j<nb_axial_mod*nb_trans_mod; j++)
794 for (
int k = 0; k<nb_axial_submod*nb_trans_submod; k++)
796 delete crystal_center[i][j][k];
800 for(
int i = 0; i < nb_rsectors+1 ; i++)
801 for (
int j = 0; j<nb_axial_mod*nb_trans_mod; j++)
803 delete[] crystal_center[i][j];
807 for(
int i = 0; i < nb_rsectors+1 ; i++)
808 delete[] crystal_center[i];
810 for(
int i = 0; i < nb_rsectors ; i++)
811 delete rotation_mtx[i];
813 delete[] crystal_center;
814 delete[] rotation_mtx;
825 string path_to_LUT = path_to_geom_file.substr(0, path_to_geom_file.find_last_of(
"."));
826 string path_to_header_LUT = path_to_LUT +
".ghscan";
827 path_to_LUT.append(
".glut");
831 ofstream LUT_file, header_LUT_file;
832 LUT_file.open(path_to_LUT.c_str(), ios::binary | ios::out);
850 header_LUT_file.open(path_to_header_LUT.c_str(), ios::out);
852 string scanner_name = path_to_geom_file.substr(0, path_to_geom_file.find_last_of(
"."));
853 header_LUT_file <<
"scanner name:" <<
" " <<
GetFileFromPath(scanner_name) << endl;
854 header_LUT_file <<
"modality:" <<
" " <<
"PET" << endl;
856 header_LUT_file <<
"scanner radius:" <<
" " << radius_lyr[0];
858 header_LUT_file <<
"," << radius_lyr[lyr] ; header_LUT_file << endl;
860 header_LUT_file <<
"number of rings in scanner:" <<
" " <<
mp_nbRings[0];
862 header_LUT_file <<
","<< mp_nbRings[lyr] ; header_LUT_file << endl;
863 header_LUT_file <<
"number of elements:" <<
" " << m_nbCrystals << endl;
864 header_LUT_file <<
"number of layers:" <<
" " << m_nbLayers << endl;
867 header_LUT_file <<
","<< mp_nbCrystalsInLayer[lyr] ; header_LUT_file << endl;
871 header_LUT_file <<
","<< mp_sizeCrystalDepth[lyr] ; header_LUT_file << endl;
875 header_LUT_file <<
","<< mp_sizeCrystalTrans[lyr] ; header_LUT_file << endl;
879 header_LUT_file <<
","<< mp_sizeCrystalAxial[lyr] ; header_LUT_file << endl;
882 uint32_t def_dim_trans = 0, def_dim_axial = 0;
883 FLTNB def_FOV_trans = -1., def_FOV_axial = -1;
890 Cerr(
"***** iScannerPET::ComputeLUT() -> Error occurred when trying to read transaxial/axial dimensions and voxel sizes from scanner geom file !" << endl);
894 header_LUT_file <<
"voxels number transaxial:" <<
" " << def_dim_trans << endl;
895 header_LUT_file <<
"voxels number axial:" <<
" " << def_dim_axial << endl;
897 header_LUT_file <<
"field of view transaxial:" <<
" " << def_FOV_trans << endl;
898 header_LUT_file <<
"field of view axial:" <<
" " << def_FOV_axial << endl;
904 header_LUT_file <<
"," << mp_meanDepthOfInteraction[lyr] ;
905 header_LUT_file <<
" #optional (default value : center of crystal ). Input value must correspond to the distance from the crystal surface, or negative value if default" << endl;
909 if(
m_verbose>=2)
Cout(
"iScannerPET::ComputeLUT() -> Header LUT file writing completed" << endl);
912 delete nb_rsectors_lyr;
913 delete nb_trans_mod_lyr;
914 delete nb_axial_mod_lyr;
915 delete nb_trans_submod_lyr;
916 delete nb_axial_submod_lyr;
917 delete nb_trans_crystal_lyr;
918 delete nb_axial_crystal_lyr;
921 delete rsector_angular_span_lyr;
922 delete rsector_first_angle_lyr;
924 delete gap_trans_mod_lyr;
925 delete gap_axial_mod_lyr;
926 delete gap_trans_submod_lyr;
927 delete gap_axial_submod_lyr;
928 delete gap_trans_crystal_lyr;
929 delete gap_axial_crystal_lyr;
959 FLTNB ap_Orientation1[3],
FLTNB ap_Orientation2[3],
967 Cerr(
"***** iScannerPET::GetPositionsAndOrientations() -> Crystal index 1 (" << a_index1 <<
") out of range [0:" <<
m_nbCrystals-1 <<
"] !" << endl);
972 Cerr(
"***** iScannerPET::GetPositionsAndOrientations() -> Crystal index 2 (" << a_index2 <<
") out of range [0:" <<
m_nbCrystals-1 <<
"] !" << endl);
995 else if (ap_POI1[2]<0.)
1000 else if (ap_POI1[0]==0. && ap_POI1[1]==0.)
1022 else if (ap_POI2[2]<0.)
1027 else if (ap_POI2[0]==0. && ap_POI2[1]==0.)
1075 FLTNB ap_Position1[3],
FLTNB ap_Position2[3],
1076 FLTNB ap_Orientation1[3],
FLTNB ap_Orientation2[3] )
1083 Cerr(
"***** iScannerPET::GetRdmPositionsAndOrientations() -> Crystal index 1 (" << a_index1 <<
") out of range [0:" <<
m_nbCrystals-1 <<
"] !" << endl);
1088 Cerr(
"***** iScannerPET::GetRdmPositionsAndOrientations() -> Crystal index 2 (" << a_index2 <<
") out of range [0:" <<
m_nbCrystals-1 <<
"] !" << endl);
1095 Cerr(
"***** iScannerPET::GetRdmPositionsAndOrientations() -> Crystal sizes are unknown or equal to 0. Crystal dimensions are mandatory for this function !" << endl);
1110 FLTNB axial1 = (rdm_axial1-0.5) * size_crystalAxial1;
1111 FLTNB trans1 = (rdm_trans1-0.5) * size_crystalTrans1;
1112 FLTNB depth1 = (rdm_depth1-0.5) * size_crystalDepth1;
1125 + depth1 * mp_crystalOrientationZ[a_index1]
1126 + axial1 * sqrt(1-mp_crystalOrientationZ[a_index1] * mp_crystalOrientationZ[a_index1]);
1131 ap_Orientation1[2] = mp_crystalOrientationZ[a_index1];
1142 FLTNB axial2 = (rdm_axial2-0.5) * size_crystalAxial2;
1143 FLTNB trans2 = (rdm_trans2-0.5) * size_crystalTrans2;
1144 FLTNB depth2 = (rdm_depth2-0.5) * size_crystalDepth2;
1157 + depth2 * mp_crystalOrientationZ[a_index2]
1158 + axial2 * sqrt(1-mp_crystalOrientationZ[a_index2] * mp_crystalOrientationZ[a_index2]);
1163 ap_Orientation2[2] = mp_crystalOrientationZ[a_index2];
1229 FLTNB ap_CornerInf1[3],
FLTNB ap_CornerSup1[3],
1230 FLTNB ap_CornerInf2[3],
FLTNB ap_CornerSup2[3])
1236 Cerr(
"***** iScannerPET::GetTwoCorners() -> Crystal index out of range !" << endl);
1243 Cerr(
"***** iScannerPET::GetRdmPositionsAndOrientations() -> Crystal sizes are unknown or equal to 0. Crystal dimensions are mandatory for this function !" << endl);
1247 Cerr(
"***** iScannerPET::GetTwoCorners() -> Not implemented yet !" << endl);
1268 while (a_idx >= sum_crystals)
1295 int start_index = 0;
1301 while(layer_id < layer)
1312 int ringID = (int)((a_idx-start_index)/nb_crystals_in_ring);
1348 abs_angle = (abs_angle>1.) ? 1 : abs_angle;
1349 abs_angle = (abs_angle<-1.) ? -1 : abs_angle;
1351 FLTNB angle_diff = acos(abs_angle);
1391 Cerr(
"***** iScannerPET::GetGeometricInfoFromDatafile() -> Error while reading max number of ring difference in the header data file '" << endl);
1397 Cerr(
"***** iScannerPET::GetGeometricInfoFromDatafile() -> An error occurred while trying to read the multiple bed displacement in the datafile header !" << endl);
1424 Cerr(
"***** iScannerPET::PROJ_GetPETSpecificParameters() -> Parameters have not been checked !" << endl);
1447 cout <<
"This scanner class is dedicated to the description of PET systems." << endl;
int GetPositionWithRandomDepth(int a_index1, int a_index2, FLTNB ap_Position1[3], FLTNB ap_Position2[3])
Get the positions and orientations of scanner elements from their indices, with a random depth...
#define VERBOSE_DEBUG_MAX
int CheckParameters()
Check if all parameters have been correctly initialized.
int GetRingID(int a_idx)
Get the ring which the #a_idx crystal belongs to.
static sScannerManager * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
static sRandomNumberGenerator * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
#define VERBOSE_DEBUG_EVENT
FLTNB * mp_sizeCrystalAxial
int Instantiate(bool a_scannerFileIsLUT)
Get mandatory informations from the scanner file and allocate memory for the member variables...
int IsAvailableLOR(int a_elt1, int a_elt2)
Check if the LOR formed by the crystalf whose indices are passed in parameters is available according...
double GenerateRdmNber()
Generate a random number for the thread whose index is recovered from the ompenMP function...
FLTNB * mp_crystalOrientationX
int Initialize()
Check general initialization and set several parameters to their default value.
int GetTwoCorners(int a_index1, int a_index2, FLTNB ap_CornerInf1[3], FLTNB ap_CornerSup1[3], FLTNB ap_CornerInf2[3], FLTNB ap_CornerSup2[3])
Get the cartesian coordinaters of the two opposite corners of a scanner element.
FLTNB m_minAngleDifference
FLTNB * mp_crystalOrientationY
oMatrix * mp_positionMatrix_out
FLTNB * mp_meanDepthOfInteraction
string GetPathToScannerFile()
int SetMatriceElt(uint16_t l, uint16_t c, FLTNBLUT a_val)
Set the matrix element corresponding to the argument indices with the provided value.
int GetRdmPositionsAndOrientations(int a_index1, int a_index2, FLTNB ap_Position1[3], FLTNB ap_Position2[3], FLTNB ap_Orientation1[3], FLTNB ap_Orientation2[3])
Get random positions of the scanner elements and their orientations from their indices.
FLTNB * mp_crystalOrientationZ
string GetFileFromPath(const string &a_pathToFile)
Simply return the file from a path string passed in parameter.
Declaration of class iScannerPET.
FLTNB * mp_crystalCentralPositionZ
FLTNB m_multiBedDisplacementInMm
oMatrix * mp_rotationMatrix
#define VERBOSE_DEBUG_LIGHT
virtual int SetRotDirection(string a_rotDirection)
Set rotation direction of the system.
int ReadDataASCIIFile(const string &a_file, const string &a_keyword, T *ap_return, int a_nbElts, bool a_mandatoryFlag)
Look for "a_nbElts" elts in the "a_file" file matching the "a_keyword" string passed as parameter a...
Singleton class that Instantiate and initialize the scanner object.
int GetLayer(int a_idx)
Get the layer from which the 'a_index' crystal belongs to.
int GetPositionsAndOrientations(int a_index1, int a_index2, FLTNB ap_Position1[3], FLTNB ap_Position2[3], FLTNB ap_Orientation1[3], FLTNB ap_Orientation2[3], FLTNB *ap_POI1=NULL, FLTNB *ap_POI2=NULL)
Get the central positions and orientations of the scanner elements from their indices.
Declaration of class sScannerManager.
int Multiplication(oMatrix *a_Mtx, oMatrix *a_MtxResult)
Multiply the member matrix with the matrix provided in 1st parameter Return the result in the matric ...
bool SaveLUTFlag()
Get flag indicating a LUT generated by a geom file should be written on disk or not.
FLTNB * mp_sizeCrystalDepth
bool m_allParametersChecked
#define KEYWORD_MANDATORY
int GetGeometricInfoFromDatafile(string a_pathToDataFilename)
Retrieve PET geometric informations from the datafile.
FLTNB * mp_crystalCentralPositionY
Singleton class that generate a thread-safe random generator number for openMP As singleton...
int LoadLUT()
Load a precomputed scanner LUT.
iScannerPET()
iScannerPET constructor. Initialize the member variables to their default values. ...
Declaration of class sOutputManager.
void ShowHelp()
Display help.
oMatrix * mp_positionMatrix_ref
Structure designed for basic matrices operations.
FLTNB * mp_crystalCentralPositionX
FLTNB * mp_sizeCrystalTrans
#define DEBUG_VERBOSE(IGNORED1, IGNORED2)
~iScannerPET()
iScannerPET destructor.
int PROJ_GetPETSpecificParameters(int *ap_maxRingDiff)
Set pointers passed in argument with the related PET specific variables This function is used to reco...
int BuildLUT(bool a_scannerFileIsLUT)
Call the functions to generate the LUT or read the user-made LUT depending on the user choice...
Generic class for scanner objects.
int * mp_nbCrystalsInLayer
bool FLTNBIsEqual(FLTNB a, FLTNB b, FLTNB a_eps)
Comparison of FLTNB numbers.
int ComputeLUT()
Compute the LUT of the scanner from a generic (.geom) file.