![]() |
CASToR
1.0
Tomographic Reconstruction (PET/SPECT)
|
00001 00009 #ifndef ODYNAMICDATAMANAGER_HH 00010 #define ODYNAMICDATAMANAGER_HH 1 00011 00012 #define DYNAMIC_SWITCH_NOTHING 0 00013 #define DYNAMIC_SWITCH_CONTINUE 1 00014 #define DYNAMIC_SWITCH_DEFORMATION 2 00015 00016 #include "gVariables.hh" 00017 #include "gOptions.hh" 00018 #include "sOutputManager.hh" 00019 00020 class oImageDimensionsAndQuantification; 00021 class vDataFile; 00022 00023 00024 00025 00033 class oDynamicDataManager 00034 { 00035 // ------------------------------------------------------------------- 00036 // Constructor & Destructor 00037 public: 00042 oDynamicDataManager(); 00046 ~oDynamicDataManager(); 00047 00048 // ------------------------------------------------------------------- 00049 // Public member functions 00050 public: 00063 int InitDynamicData( int a_nbRespGates, int a_nbCardGates, const string& a_pathTo4DDataSplittingFile, 00064 int a_rmMCorrFlag, int a_cMmCorrFlag, int a_pMotionCorrFlag ); 00072 int SetDynamicSpecificQuantificationFactors(FLTNB** a2p_quantificationFactors); 00079 int CheckParameters(int64_t a_nbEvents); 00084 void ResetCurrentDynamicIndices(); 00098 int DynamicSwitch(int64_t a_index, uint32_t a_time, int a_bed, int a_th); 00099 00100 // ------------------------------------------------------------------- 00101 // Public Get & Set functions 00102 public: 00108 inline void SetVerbose(int a_verboseLevel) 00109 {m_verbose = a_verboseLevel;}; 00115 inline void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification* ap_ImageDimensionsAndQuantification) 00116 {mp_ID = ap_ImageDimensionsAndQuantification;}; 00121 inline void SetRespMotionFlagOn() 00122 {m_rMotionCorrFlag = true;} 00127 inline void SetCardMotionFlagOn() 00128 {m_cMotionCorrFlag = true;} 00133 inline void SetPMotionFlagOn() 00134 {m_pMotionCorrFlag = true;} 00139 inline bool IsRespMotionEnabled() 00140 {return m_rMotionCorrFlag;} 00145 inline bool IsCardMotionEnabled() 00146 {return m_cMotionCorrFlag;} 00151 inline bool IsPMotionEnabled() 00152 {return m_pMotionCorrFlag;} 00159 inline int GetCurrentPMotionIndex(int a_th) 00160 {return mp_currentPMotionIndex[a_th] ;} 00167 inline int GetCurrentTimeFrame(int a_th) 00168 {return mp_currentFrameIndex[a_th];} 00175 inline int GetCurrentRespGate(int a_th) 00176 {return mp_currentRespGateIndex[a_th];} 00184 inline int GetCurrentRespImage(int a_th) 00185 {return m_rMotionCorrFlag ? 0 : mp_currentRespGateIndex[a_th];} 00192 inline int GetCurrentCardGate(int a_th) 00193 {return mp_currentCardGateIndex[a_th];} 00201 inline int GetCurrentCardImage(int a_th) 00202 {return m_cMotionCorrFlag ? 0 : mp_currentCardGateIndex[a_th];} 00208 inline int GetSensNbCardGates() 00209 {return m_nbCardGates;} 00215 inline int GetSensNbRespGates() 00216 {return m_nbRespGates;} 00217 00218 00219 00220 // ------------------------------------------------------------------- 00221 // Private member functions 00222 private: 00230 int InitDynamicDataGating(const string& a_pathToGateFile); 00238 int InitDynamicDataPatientMotion(const string& a_pathToFile); 00239 00240 00241 00242 // ------------------------------------------------------------------- 00243 // Data members 00244 private: 00245 oImageDimensionsAndQuantification* mp_ID; 00246 int m_verbose; 00248 // Framing 00249 int* mp_currentFrameIndex; 00250 int m_nbTimeFrames; 00252 // Respiratory gating 00253 bool m_respGatingFlag; 00254 bool m_rMotionCorrFlag; 00255 int m_nbRespGates; 00256 int64_t** m2p_nbEventsPerRespGate; 00257 int64_t** m2p_indexLastEventRespGate; 00258 int* mp_currentRespGateIndex; 00260 // Cardiac gating 00261 bool m_cardGatingFlag; 00262 bool m_cMotionCorrFlag; 00263 int m_nbCardGates; 00264 int64_t** m2p_nbEventsPerCardGate; 00265 int64_t** m2p_indexLastEventCardGate; 00266 int* mp_currentCardGateIndex; 00268 // Involuntary motion 00269 bool m_pMotionCorrFlag; 00270 int m_nbPMotionTriggers; 00271 uint32_t* mp_listPMotionTriggers; 00272 int* mp_currentPMotionIndex; 00273 }; 00274 #endif