![]() |
CASToR
1.0
Tomographic Reconstruction (PET/SPECT)
|
00001 00009 #ifndef OIMAGEDIMENSIONSANDQUANTIFICATION_HH 00010 #define OIMAGEDIMENSIONSANDQUANTIFICATION_HH 1 00011 00012 #include "gVariables.hh" 00013 #include "sOutputManager.hh" 00014 #include "gOptions.hh" 00015 #include "oDynamicDataManager.hh" 00016 00017 00025 class oImageDimensionsAndQuantification 00026 { 00027 // ----------------------------------------------------------------------------------------- 00028 // Constructor & Destructor 00029 public: 00036 oImageDimensionsAndQuantification(); 00043 ~oImageDimensionsAndQuantification(); 00044 00045 00046 // ----------------------------------------------------------------------------------------- 00047 // Public member functions 00048 public: 00056 int CheckParameters(); 00066 int Initialize(); 00067 00068 00069 // ----------------------------------------------------------------------------------------- 00070 // Private member functions 00071 private: 00079 int InitializeFramingAndQuantification(); 00088 int InitializeTimeBasisFunctions(); 00097 int InitializeRespBasisFunctions(); 00106 int InitializeCardBasisFunctions(); 00115 int InitializeIgnoredCorrections(); 00116 00117 00118 // ----------------------------------------------------------------------------------------- 00119 // Public dynamic data management functions 00120 public: 00125 inline void ResetCurrentDynamicIndices() 00126 {mp_DynamicDataManager->ResetCurrentDynamicIndices();} 00139 int InitDynamicData( string a_pathTo4DDataSplittingFile, 00140 int a_respMotionCorrectionFlag, int a_cardMotionCorrectionFlag, int a_invMotionCorrectionFlag, 00141 int a_nbRespGates, int a_nbCardGates ); 00148 int CheckDynamicParameters(int64_t a_nbEvents); 00158 inline int DynamicSwitch( int64_t a_currentEventIndex, uint32_t a_currentTime, int a_bed, int a_th ) 00159 {return mp_DynamicDataManager->DynamicSwitch(a_currentEventIndex, a_currentTime, a_bed, a_th);} 00160 00161 00162 // ----------------------------------------------------------------------------------------- 00163 // Public Get & Set functions related to the dynamic data management 00164 public: 00169 inline void SetRespMotionFlagOn() 00170 {mp_DynamicDataManager->SetRespMotionFlagOn();} 00175 inline void SetCardMotionFlagOn() 00176 {mp_DynamicDataManager->SetCardMotionFlagOn();} 00181 inline void SetPMotionFlagOn() 00182 {mp_DynamicDataManager->SetPMotionFlagOn();} 00189 inline int GetCurrentRespGate(int a_th) 00190 {return mp_DynamicDataManager->GetCurrentRespGate(a_th);} 00197 inline int GetCurrentCardGate(int a_th) 00198 {return mp_DynamicDataManager->GetCurrentCardGate(a_th);} 00204 inline int GetSensNbRespGates() 00205 {return mp_DynamicDataManager->GetSensNbRespGates();} 00211 inline int GetSensNbCardGates() 00212 {return mp_DynamicDataManager->GetSensNbCardGates();} 00219 inline int GetCurrentRespImage(int a_th) 00220 {return mp_DynamicDataManager->GetCurrentRespImage(a_th);} 00227 inline int GetCurrentCardImage(int a_th) 00228 {return mp_DynamicDataManager->GetCurrentCardImage(a_th);} 00235 inline int GetCurrentTimeFrame(int a_th) 00236 {return mp_DynamicDataManager->GetCurrentTimeFrame(a_th);} 00243 inline int GetCurrentPMotionIndex(int a_th) 00244 {return mp_DynamicDataManager->GetCurrentPMotionIndex(a_th);} 00245 00246 00247 // ----------------------------------------------------------------------------------------- 00248 // Get & Set functions 00249 public: 00255 inline void SetVerbose(int a_verbose) 00256 {m_verbose = a_verbose;} 00262 inline int GetNbThreadsForProjection() 00263 {return m_nbThreadsForProjection;} 00269 inline int GetNbThreadsForImageComputation() 00270 {return m_nbThreadsForImageComputation;} 00276 inline int GetNbThreadsMax() 00277 { if (m_nbThreadsForProjection>m_nbThreadsForImageComputation) return m_nbThreadsForProjection; 00278 else return m_nbThreadsForImageComputation; } 00287 int SetNbThreads(const string& a_nbThreads); 00294 inline void SetMPIRankAndSize(int a_mpiRank, int a_mpiSize) 00295 {m_mpiRank = a_mpiRank; m_mpiSize = a_mpiSize;} 00301 inline int GetMPISize() 00302 {return m_mpiSize;} 00308 inline int GetMPIRank() 00309 {return m_mpiRank;} 00315 inline int GetNbBeds() 00316 {return m_nbBeds;} 00322 inline void SetNbBeds(int a_nbBeds) 00323 {m_nbBeds = a_nbBeds;} 00329 inline int GetNbTimeFrames() 00330 {return m_nbTimeFrames;} 00336 inline int GetNbTimeBasisFunctions() 00337 {return m_nbTimeBasisFunctions;} 00345 inline FLTNB GetTimeBasisCoefficient(int a_timeBasisFunction, int a_timeFrame) 00346 {return m2p_timeBasisFunctions[a_timeBasisFunction][a_timeFrame];} 00354 inline FLTNB GetFrameDurationInSec(int a_bed, int a_frame) 00355 {return ((FLTNB)(m2p_frameDurationsInMs[a_bed][a_frame]))/1000.;} 00363 inline FLTNB GetFrameTimeStartInSec(int a_bed, int a_frame) 00364 {return ((FLTNB)(m2p_frameTimeStartInMs[a_bed][a_frame]))/1000.;} 00372 inline FLTNB GetFrameTimeStopInSec(int a_bed, int a_frame) 00373 {return ((FLTNB)(m2p_frameTimeStopInMs[a_bed][a_frame]))/1000.;} 00380 inline FLTNB GetFinalTimeStopInSec(int a_bed) 00381 {return ((FLTNB)(m2p_frameTimeStopInMs[a_bed][m_nbTimeFrames-1]))/1000.;} 00389 inline uint32_t GetFrameDurationInMs(int a_bed, int a_frame) 00390 {return m2p_frameDurationsInMs[a_bed][a_frame];} 00398 inline uint32_t GetFrameTimeStartInMs(int a_bed, int a_frame) 00399 {return m2p_frameTimeStartInMs[a_bed][a_frame];} 00407 inline uint32_t GetFrameTimeStopInMs(int a_bed, int a_frame) 00408 {return m2p_frameTimeStopInMs[a_bed][a_frame];} 00415 inline uint32_t GetFinalTimeStopInMs(int a_bed) 00416 {return m2p_frameTimeStopInMs[a_bed][m_nbTimeFrames-1];} 00422 inline void SetFrames(const string& a_frameList) 00423 {m_frameList = a_frameList;} 00429 inline void SetNbTimeBasisFunctions(int a_nbTimeBasisFunctions) 00430 {m_nbTimeBasisFunctions = a_nbTimeBasisFunctions;} 00436 inline void SetTimeBasisFunctionsFile(const string& a_timeBasisFunctionsFile) 00437 {m_timeBasisFunctionsFile = a_timeBasisFunctionsFile;} 00447 int SetAcquisitionTime(int a_bed, FLTNB a_timeStartInSec, FLTNB a_durationInSec); 00453 inline bool GetTimeStaticFlag() 00454 {return m_timeStaticFlag;} 00460 inline int GetNbRespGates() 00461 {return m_nbRespGates;} 00467 inline int GetNbRespBasisFunctions() 00468 {return m_nbRespBasisFunctions;} 00476 inline FLTNB GetRespBasisCoefficient(int a_respBasisFunction, int a_respGate) 00477 {return m2p_respBasisFunctions[a_respBasisFunction][a_respGate];} 00483 inline void SetNbRespGates(int a_nbRespGates) 00484 {m_nbRespGates = a_nbRespGates;} 00490 inline void SetNbRespBasisFunctions(int a_nbRespBasisFunctions) 00491 {m_nbRespBasisFunctions = a_nbRespBasisFunctions;} 00497 inline void SetRespBasisFunctionsFile(const string& a_respBasisFunctionsFile) 00498 {m_respBasisFunctionsFile = a_respBasisFunctionsFile;} 00504 inline bool GetRespStaticFlag() 00505 {return m_respStaticFlag;} 00511 inline int GetNbCardGates() 00512 {return m_nbCardGates;} 00518 inline int GetNbCardBasisFunctions() 00519 {return m_nbCardBasisFunctions;} 00527 inline FLTNB GetCardBasisCoefficient(int a_cardBasisFunction, int a_cardGate) 00528 {return m2p_cardBasisFunctions[a_cardBasisFunction][a_cardGate];} 00534 inline void SetNbCardGates(int a_nbCardGates) 00535 {m_nbCardGates = a_nbCardGates;} 00541 inline void SetNbCardBasisFunctions(int a_nbCardBasisFunctions) 00542 {m_nbCardBasisFunctions = a_nbCardBasisFunctions;} 00548 inline void SetCardBasisFunctionsFile(const string& a_cardBasisFunctionsFile) 00549 {m_cardBasisFunctionsFile = a_cardBasisFunctionsFile;} 00555 inline bool GetCardStaticFlag() 00556 {return m_cardStaticFlag;} 00562 inline INTNB GetNbVoxX() 00563 {return m_nbVoxX;} 00569 inline INTNB GetNbVoxY() 00570 {return m_nbVoxY;} 00576 inline INTNB GetNbVoxZ() 00577 {return m_nbVoxZ;} 00583 inline INTNB GetNbVoxXY() 00584 {return m_nbVoxXY;} 00590 inline INTNB GetNbVoxXYZ() 00591 {return m_nbVoxXYZ;} 00597 inline INTNB GetNbVoxDiagonal() 00598 { return ((INTNB)(sqrt( ((FLTNB)m_nbVoxX) * ((FLTNB)m_nbVoxX) + 00599 ((FLTNB)m_nbVoxY) * ((FLTNB)m_nbVoxY) + 00600 ((FLTNB)m_nbVoxZ) * ((FLTNB)m_nbVoxZ) ))); } 00606 inline void SetNbVoxX(INTNB a_nbVoxX) 00607 {m_nbVoxX = a_nbVoxX;} 00613 inline void SetNbVoxY(INTNB a_nbVoxY) 00614 {m_nbVoxY = a_nbVoxY;} 00620 inline void SetNbVoxZ(INTNB a_nbVoxZ) 00621 {m_nbVoxZ = a_nbVoxZ;} 00627 inline FLTNB GetVoxSizeX() 00628 {return m_voxSizeX;} 00634 inline FLTNB GetVoxSizeY() 00635 {return m_voxSizeY;} 00641 inline FLTNB GetVoxSizeZ() 00642 {return m_voxSizeZ;} 00648 inline FLTNB GetFOVSizeX() 00649 {return m_fovSizeX;} 00655 inline FLTNB GetFOVSizeY() 00656 {return m_fovSizeY;} 00662 inline FLTNB GetFOVSizeZ() 00663 {return m_fovSizeZ;} 00669 inline void SetVoxSizeX(FLTNB a_voxSizeX) 00670 {m_voxSizeX = a_voxSizeX;} 00676 inline void SetVoxSizeY(FLTNB a_voxSizeY) 00677 {m_voxSizeY = a_voxSizeY;} 00683 inline void SetVoxSizeZ(FLTNB a_voxSizeZ) 00684 {m_voxSizeZ = a_voxSizeZ;} 00690 inline void SetFOVSizeX(FLTNB a_fovSizeX) 00691 {m_fovSizeX = a_fovSizeX;} 00697 inline void SetFOVSizeY(FLTNB a_fovSizeY) 00698 {m_fovSizeY = a_fovSizeY;} 00704 inline void SetFOVSizeZ(FLTNB a_fovSizeZ) 00705 {m_fovSizeZ = a_fovSizeZ;} 00712 inline void SetFOVOutMasking(FLTNB a_fovOutPercent, INTNB a_nbSliceOutMask) 00713 {m_fovOutPercent = a_fovOutPercent; m_nbSliceOutMask = a_nbSliceOutMask;} 00719 inline FLTNB GetFOVOutPercent() 00720 {return m_fovOutPercent;} 00726 inline INTNB GetNbSliceOutMask() 00727 {return m_nbSliceOutMask;} 00734 int SetFlipOut(const string& a_flipOut); 00740 inline bool GetFlipOutX() 00741 {return m_flipOutX;} 00747 inline bool GetFlipOutY() 00748 {return m_flipOutY;} 00754 inline bool GetFlipOutZ() 00755 {return m_flipOutZ;} 00761 inline FLTNB GetOffsetX() 00762 {return m_offsetX;} 00768 inline FLTNB GetOffsetY() 00769 {return m_offsetY;} 00775 inline FLTNB GetOffsetZ() 00776 {return m_offsetZ;} 00782 inline void SetOffsetX(FLTNB a_offsetX) 00783 {m_offsetX = a_offsetX;} 00789 inline void SetOffsetY(FLTNB a_offsetY) 00790 {m_offsetY = a_offsetY;} 00796 inline void SetOffsetZ(FLTNB a_offsetZ) 00797 {m_offsetZ = a_offsetZ;} 00806 FLTNB GetQuantificationFactor(int a_bed, int a_frame, int a_respGate, int a_cardGate); 00815 int SetCalibrationFactor(int a_bed, FLTNB a_calibrationFactor); 00824 int SetPETIsotope(int a_bed, const string& a_isotope); 00833 int SetSPECTIsotope(int a_bed, const string& a_isotope); 00841 int SetDynamicSpecificQuantificationFactors(const string& a_quantificationFile); 00847 inline void SetIgnoredCorrections(const string& a_ignoredCorrectionsList) 00848 {m_ignoredCorrectionsList = a_ignoredCorrectionsList;} 00854 inline bool GetIgnoreAttnCorrectionFlag() 00855 {return m_ignoreAttnCorrectionFlag;} 00861 inline bool GetIgnoreNormCorrectionFlag() 00862 {return m_ignoreNormCorrectionFlag;} 00868 inline bool GetIgnoreScatCorrectionFlag() 00869 {return m_ignoreScatCorrectionFlag;} 00875 inline bool GetIgnoreRandCorrectionFlag() 00876 {return m_ignoreRandCorrectionFlag;} 00882 inline bool GetIgnoreDecaCorrectionFlag() 00883 {return m_ignoreDecaCorrectionFlag;} 00889 inline bool GetIgnoreBratCorrectionFlag() 00890 {return m_ignoreBratCorrectionFlag;} 00896 inline bool GetIgnoreFdurCorrectionFlag() 00897 {return m_ignoreFdurCorrectionFlag;} 00903 inline bool GetIgnoreCaliCorrectionFlag() 00904 {return m_ignoreCaliCorrectionFlag;} 00905 00906 00907 // ----------------------------------------------------------------------------------------- 00908 // Data members 00909 private: 00910 oDynamicDataManager* mp_DynamicDataManager; 00911 // Number of threads 00912 int m_nbThreadsForProjection; 00913 int m_nbThreadsForImageComputation; 00914 // MPI size and rank 00915 int m_mpiRank; 00916 int m_mpiSize; 00917 // Number of beds 00918 int m_nbBeds; 00919 // Framing of the acquisition 00920 string m_frameList; 00921 int m_nbTimeBasisFunctions; 00922 int m_nbTimeFrames; 00923 FLTNB** m2p_timeBasisFunctions; 00924 uint32_t** m2p_frameDurationsInMs; 00925 uint32_t** m2p_frameTimeStartInMs; 00926 uint32_t** m2p_frameTimeStopInMs; 00927 string m_timeBasisFunctionsFile; 00928 bool m_timeStaticFlag; 00929 // Quantification 00930 FLTNB*** m3p_quantificationFactors; 00931 string m_ignoredCorrectionsList; 00932 bool m_ignoreAttnCorrectionFlag; 00933 bool m_ignoreNormCorrectionFlag; 00934 bool m_ignoreRandCorrectionFlag; 00935 bool m_ignoreScatCorrectionFlag; 00936 bool m_ignoreDecaCorrectionFlag; 00937 bool m_ignoreBratCorrectionFlag; 00938 bool m_ignoreFdurCorrectionFlag; 00939 bool m_ignoreCaliCorrectionFlag; 00940 // Respiratory gating 00941 int m_nbRespBasisFunctions; 00942 int m_nbRespGates; 00943 FLTNB** m2p_respBasisFunctions; 00944 string m_respBasisFunctionsFile; 00945 bool m_respStaticFlag; 00946 // Cardiac gating 00947 int m_nbCardBasisFunctions; 00948 int m_nbCardGates; 00949 FLTNB** m2p_cardBasisFunctions; 00950 string m_cardBasisFunctionsFile; 00951 bool m_cardStaticFlag; 00952 // Image discretization 00953 INTNB m_nbVoxX; 00954 INTNB m_nbVoxY; 00955 INTNB m_nbVoxZ; 00956 INTNB m_nbVoxXY; 00957 INTNB m_nbVoxXYZ; 00958 FLTNB m_voxSizeX; 00959 FLTNB m_voxSizeY; 00960 FLTNB m_voxSizeZ; 00961 FLTNB m_fovSizeX; 00962 FLTNB m_fovSizeY; 00963 FLTNB m_fovSizeZ; 00964 FLTNB m_offsetX; 00965 FLTNB m_offsetY; 00966 FLTNB m_offsetZ; 00967 // Percentage of transaxial FOV unmasked before saving 00968 FLTNB m_fovOutPercent; 00969 INTNB m_nbSliceOutMask; 00970 // Output flip 00971 bool m_flipOutX; 00972 bool m_flipOutY; 00973 bool m_flipOutZ; 00974 // Parameters checked 00975 bool m_checked; 00976 // Object initialized 00977 bool m_initialized; 00978 // Verbose 00979 int m_verbose; 00980 }; 00981 00982 #endif