CASToR  3.2
Tomographic Reconstruction (PET/SPECT/CT)
include/image/oImageDimensionsAndQuantification.hh
Go to the documentation of this file.
1 
8 #ifndef OIMAGEDIMENSIONSANDQUANTIFICATION_HH
9 #define OIMAGEDIMENSIONSANDQUANTIFICATION_HH 1
10 
11 #include "gVariables.hh"
12 #include "sOutputManager.hh"
13 #include "gOptions.hh"
14 #include "oDynamicDataManager.hh"
15 #include "oArterialInputCurve.hh"
16 // #include "oDynamicModelManager.hh"
17 
18 
27 #define STATIC_RECO 0
28 
29 #define DYN_RECO_FRAMING 1
30 
31 #define DYN_RECO_GATING 2
32 
33 #define DYN_RECO_MCGATING 3
34 
35 #define DYN_RECO_IPMC 4
36 
48 {
49  // -----------------------------------------------------------------------------------------
50  // Constructor & Destructor
51  public:
66 
67 
68  // -----------------------------------------------------------------------------------------
69  // Public member functions
70  public:
76  void SetDefault();
84  int CheckParameters();
94  int Initialize();
111  int DealWithBedPositions(vDataFile** a2p_DataFile);
118 
119 
120  // -----------------------------------------------------------------------------------------
121  // Private member functions
122  private:
139  // int InitializeTimeBasisFunctions();
148  // int InitializeRespBasisFunctions();
157  // int InitializeCardBasisFunctions();
167 
168 
169  // -----------------------------------------------------------------------------------------
170  // Public dynamic data management functions
171  public:
190  int InitDynamicData( string a_pathTo4DDataSplittingFile,
191  int a_respMotionCorrectionFlag, int a_cardMotionCorrectionFlag, int a_invMotionCorrectionFlag,
192  int a_nbRespGates, int a_nbCardGates );
199  int CheckDynamicParameters(int64_t a_nbEvents);
209  inline int DynamicSwitch( int64_t a_currentEventIndex, uint32_t a_currentTime, int a_bed, int a_th )
210  {return mp_DynamicDataManager->DynamicSwitch(a_currentEventIndex, a_currentTime, a_bed, a_th);}
211 
212 
218  inline bool IsRespMotionEnabled()
225  inline bool IsCardMotionEnabled()
232  inline bool IsPMotionEnabled()
234 
235  // -----------------------------------------------------------------------------------------
236  // Public Get & Set functions related to the dynamic data management
237  public:
242  inline void SetRespMotionFlagOn()
248  inline void SetCardMotionFlagOn()
254  inline void SetPMotionFlagOn()
262  inline int GetCurrentRespGate(int a_th)
270  inline int GetCurrentCardGate(int a_th)
278  inline int GetPMotionFirstIndexForFrame(int a_fr)
280 
287  inline int GetPMotionLastIndexForFrame(int a_fr)
289 
296  inline int GetNb1stMotImgsForLMS(int a_fr)
305 
306 
312  inline FLTNB GetListPMotionWeightInFrameForLMS(int a_fr, int a_pmsset)
314 
315 
316 
323  inline int GetCurrentRespImage(int a_th)
331  inline int GetCurrentCardImage(int a_th)
339  inline int GetCurrentTimeFrame(int a_th)
347  inline int GetCurrentPMotionIndex(int a_th)
349 
357 
363  inline HPFLTNB GetdurationPerGate(int a_fr, int a_respGate)
364  {return mp_DynamicDataManager->GetDurationPerGate(a_fr,a_respGate);}
365 
370  inline bool GateDurationProvided()
372 
377  inline int GetDynRecoType()
378  {return m_dynRecoTypeFlag;}
379 
380 
381  // -----------------------------------------------------------------------------------------
382  // Get & Set functions
383  public:
389  inline void SetVerbose(int a_verbose)
390  {m_verbose = a_verbose;}
397  {return m_nbThreadsForProjection;}
410  inline int GetNbThreadsMax()
412  else return m_nbThreadsForImageComputation; }
421  int SetNbThreads(const string& a_nbThreads);
428  inline void SetMPIRankAndSize(int a_mpiRank, int a_mpiSize)
429  {m_mpiRank = a_mpiRank; m_mpiSize = a_mpiSize;}
435  inline int GetMPISize()
436  {return m_mpiSize;}
442  inline int GetMPIRank()
443  {return m_mpiRank;}
449  inline int GetNbBeds()
450  {return m_nbBeds;}
456  inline void SetNbBeds(int a_nbBeds)
457  {m_nbBeds = a_nbBeds; if (mp_bedPositions!=NULL) free(mp_bedPositions); mp_bedPositions = (FLTNB*)calloc(m_nbBeds,sizeof(FLTNB));}
464  inline FLTNB GetBedPosition(int a_bedIndex)
465  {return mp_bedPositions[a_bedIndex];}
477  inline int GetNbTimeFrames()
478  {return m_nbTimeFrames;}
485  {return m_nbTimeBasisFunctions;}
493  inline FLTNB GetTimeBasisCoefficient(int a_timeBasisFunction, int a_timeFrame)
494  {return m2p_timeBasisFunctions[a_timeBasisFunction][a_timeFrame];}
502  inline FLTNB GetFrameDurationInSec(int a_bed, int a_frame)
503  {return ((FLTNB)(m2p_frameDurationsInMs[a_bed][a_frame]))/1000.;}
511  inline FLTNB GetFrameTimeStartInSec(int a_bed, int a_frame)
512  {return ((FLTNB)(m2p_frameTimeStartInMs[a_bed][a_frame]))/1000.;}
520  inline FLTNB GetFrameTimeStopInSec(int a_bed, int a_frame)
521  {return ((FLTNB)(m2p_frameTimeStopInMs[a_bed][a_frame]))/1000.;}
528  inline FLTNB GetFinalTimeStopInSec(int a_bed)
529  {return ((FLTNB)(m2p_frameTimeStopInMs[a_bed][m_nbTimeFrames-1]))/1000.;}
537  inline uint32_t GetFrameDurationInMs(int a_bed, int a_frame)
538  {return m2p_frameDurationsInMs[a_bed][a_frame];}
546  inline uint32_t GetFrameTimeStartInMs(int a_bed, int a_frame)
547  {return m2p_frameTimeStartInMs[a_bed][a_frame];}
555  inline uint32_t GetFrameTimeStopInMs(int a_bed, int a_frame)
556  {return m2p_frameTimeStopInMs[a_bed][a_frame];}
563  inline uint32_t GetFinalTimeStopInMs(int a_bed)
564  {return m2p_frameTimeStopInMs[a_bed][m_nbTimeFrames-1];}
571  inline uint32_t* GetFramesTimeStartsArray(int a_bed)
572  {return m2p_frameTimeStartInMs[a_bed];}
579  inline uint32_t* GetFramesTimeStopArray(int a_bed)
580  {return m2p_frameTimeStopInMs[a_bed];}
587  inline uint32_t* GetFramesTimeDurationsArray(int a_bed)
588  {return m2p_frameDurationsInMs[a_bed];}
594  inline void SetFrames(const string& a_frameList)
595  {m_frameList = a_frameList;}
601  // TODO: Remove this function and option from castor-recon
602  inline void SetNbTimeBasisFunctions(int a_nbTimeBasisFunctions)
603  {m_nbTimeBasisFunctions = a_nbTimeBasisFunctions;}
609  inline void SetTimeBasisFunctions(FLTNB** a_m2pTimeBasisFunctions)
610  {m2p_timeBasisFunctions = a_m2pTimeBasisFunctions;}
616  inline void SetRespBasisFunctions(FLTNB** a_m2pRespBasisFunctions)
617  {m2p_respBasisFunctions = a_m2pRespBasisFunctions;}
623  inline void SetCardBasisFunctions(FLTNB** a_m2pCardBasisFunctions)
624  {m2p_cardBasisFunctions = a_m2pCardBasisFunctions;}
635  int SetAcquisitionTime(int a_bed, FLTNB a_timeStartInSec, FLTNB a_durationInSec, string a_GateListDurationsInSec);
641  inline bool GetTimeStaticFlag()
642  {return m_timeStaticFlag;}
648  inline int GetNbRespGates()
649  {return m_nbRespGates;}
656  {return m_nbRespBasisFunctions;}
664  inline FLTNB GetRespBasisCoefficient(int a_respBasisFunction, int a_respGate)
665  {return m2p_respBasisFunctions[a_respBasisFunction][a_respGate];}
671  inline void SetNbRespGates(int a_nbRespGates)
672  {m_nbRespGates = a_nbRespGates;}
678  inline void SetNbRespBasisFunctions(int a_nbRespBasisFunctions)
679  {m_nbRespBasisFunctions = a_nbRespBasisFunctions;}
685  inline void SetRespBasisFunctionsFile(const string& a_respBasisFunctionsFile)
686  {m_respBasisFunctionsFile = a_respBasisFunctionsFile;}
692  inline bool GetRespStaticFlag()
693  {return m_respStaticFlag;}
699  inline int GetNbCardGates()
700  {return m_nbCardGates;}
707  {return m_nbCardBasisFunctions;}
715  inline FLTNB GetCardBasisCoefficient(int a_cardBasisFunction, int a_cardGate)
716  {return m2p_cardBasisFunctions[a_cardBasisFunction][a_cardGate];}
722  inline void SetNbCardGates(int a_nbCardGates)
723  {m_nbCardGates = a_nbCardGates;}
729  inline void SetNbCardBasisFunctions(int a_nbCardBasisFunctions)
730  {m_nbCardBasisFunctions = a_nbCardBasisFunctions;}
736  inline void SetCardBasisFunctionsFile(const string& a_cardBasisFunctionsFile)
737  {m_cardBasisFunctionsFile = a_cardBasisFunctionsFile;}
743  inline bool GetCardStaticFlag()
744  {return m_cardStaticFlag;}
750  inline INTNB GetNbVoxX()
751  {return m_nbVoxX;}
757  inline INTNB GetNbVoxY()
758  {return m_nbVoxY;}
764  inline INTNB GetNbVoxZ()
765  {return m_nbVoxZ;}
771  inline INTNB GetNbVoxXY()
772  {return m_nbVoxXY;}
779  {return m_nbVoxXYZ;}
786  { return ((INTNB)(sqrt( ((FLTNB)m_nbVoxX) * ((FLTNB)m_nbVoxX) +
787  ((FLTNB)m_nbVoxY) * ((FLTNB)m_nbVoxY) +
788  ((FLTNB)m_nbVoxZ) * ((FLTNB)m_nbVoxZ) ))); }
794  inline void SetNbVoxX(INTNB a_nbVoxX)
795  {m_nbVoxX = a_nbVoxX;}
801  inline void SetNbVoxY(INTNB a_nbVoxY)
802  {m_nbVoxY = a_nbVoxY;}
808  inline void SetNbVoxZ(INTNB a_nbVoxZ)
809  {m_nbVoxZ = a_nbVoxZ;}
816  {return m_voxSizeX;}
823  {return m_voxSizeY;}
830  {return m_voxSizeZ;}
837  {return m_fovSizeX;}
844  {return m_fovSizeY;}
851  {return m_fovSizeZ;}
857  inline void SetVoxSizeX(FLTNB a_voxSizeX)
858  {m_voxSizeX = a_voxSizeX;}
864  inline void SetVoxSizeY(FLTNB a_voxSizeY)
865  {m_voxSizeY = a_voxSizeY;}
871  inline void SetVoxSizeZ(FLTNB a_voxSizeZ)
872  {m_voxSizeZ = a_voxSizeZ;}
878  inline void SetFOVSizeX(FLTNB a_fovSizeX)
879  {m_fovSizeX = a_fovSizeX;}
885  inline void SetFOVSizeY(FLTNB a_fovSizeY)
886  {m_fovSizeY = a_fovSizeY;}
892  inline void SetFOVSizeZ(FLTNB a_fovSizeZ)
893  {m_fovSizeZ = a_fovSizeZ;}
900  inline void SetFOVOutMasking(FLTNB a_fovOutPercent, INTNB a_nbSliceOutMask)
901  {m_fovOutPercent = a_fovOutPercent; m_nbSliceOutMask = a_nbSliceOutMask;}
908  {return m_fovOutPercent;}
915  {return m_nbSliceOutMask;}
922  int SetFlipOut(const string& a_flipOut);
928  inline bool GetFlipOutX()
929  {return m_flipOutX;}
935  inline bool GetFlipOutY()
936  {return m_flipOutY;}
942  inline bool GetFlipOutZ()
943  {return m_flipOutZ;}
949  inline FLTNB GetOffsetX()
950  {return m_offsetX;}
956  inline FLTNB GetOffsetY()
957  {return m_offsetY;}
963  inline FLTNB GetOffsetZ()
964  {return m_offsetZ;}
970  inline void SetOffsetX(FLTNB a_offsetX)
971  {m_offsetX = a_offsetX;}
977  inline void SetOffsetY(FLTNB a_offsetY)
978  {m_offsetY = a_offsetY;}
984  inline void SetOffsetZ(FLTNB a_offsetZ)
985  {m_offsetZ = a_offsetZ;}
994  FLTNB GetQuantificationFactor(int a_bed, int a_frame, int a_respGate, int a_cardGate);
999  inline long double GetLambda() {return m_lambda;}
1008  int SetCalibrationFactor(int a_bed, FLTNB a_calibrationFactor);
1017  int SetPETIsotope(int a_bed, const string& a_isotope);
1026  int SetSPECTIsotope(int a_bed, const string& a_isotope);
1034  int SetDynamicSpecificQuantificationFactors(const string& a_quantificationFile);
1035 
1036  int ProcessAndSetMask(FLTNB* ap_maskImage);
1037  bool IsVoxelMasked(INTNB a_voxIndex);
1038 
1044  inline void SetIgnoredCorrections(const string& a_ignoredCorrectionsList)
1045  {m_ignoredCorrectionsList = a_ignoredCorrectionsList;}
1052  {return m_ignoreAttnCorrectionFlag;}
1058  inline void SetIgnoreAttnCorrectionFlag(bool a_ignoreAttnCorrectionFlag)
1059  {m_ignoreAttnCorrectionFlag = a_ignoreAttnCorrectionFlag;}
1066  {return m_ignoreNormCorrectionFlag;}
1072  inline void SetIgnoreNormCorrectionFlag(bool a_ignoreNormCorrectionFlag)
1073  {m_ignoreNormCorrectionFlag = a_ignoreNormCorrectionFlag;}
1080  {return m_ignoreScatCorrectionFlag;}
1086  inline void SetIgnoreScatCorrectionFlag(bool a_ignoreScatCorrectionFlag)
1087  {m_ignoreScatCorrectionFlag = a_ignoreScatCorrectionFlag;}
1094  {return m_ignoreRandCorrectionFlag;}
1100  inline void SetIgnoreRandCorrectionFlag(bool a_ignoreRandCorrectionFlag)
1101  {m_ignoreRandCorrectionFlag = a_ignoreRandCorrectionFlag;}
1108  {return m_ignoreDecaCorrectionFlag;}
1114  inline void SetIgnoreDecaCorrectionFlag(bool a_ignoreDecaCorrectionFlag)
1115  {m_ignoreDecaCorrectionFlag = a_ignoreDecaCorrectionFlag;}
1122  {return m_ignoreBratCorrectionFlag;}
1128  inline void SetIgnoreBratCorrectionFlag(bool a_ignoreBratCorrectionFlag)
1129  {m_ignoreBratCorrectionFlag = a_ignoreBratCorrectionFlag;}
1136  {return m_ignoreFdurCorrectionFlag;}
1142  inline void SetIgnoreFdurCorrectionFlag(bool a_ignoreFdurCorrectionFlag)
1143  {m_ignoreFdurCorrectionFlag = a_ignoreFdurCorrectionFlag;}
1150  {return m_ignoreCaliCorrectionFlag;}
1156  inline void SetIgnoreCaliCorrectionFlag(bool a_ignoreCaliCorrectionFlag)
1157  {m_ignoreCaliCorrectionFlag = a_ignoreCaliCorrectionFlag;}
1164  {return m_nbMultiModalImages;}
1170  inline int GetNbFramesToSkip()
1171  {return m_nbFramesToSkip;}
1177  inline void SetNbMultiModalImages(int a_nbMultiModalImages)
1178  {m_nbMultiModalImages = a_nbMultiModalImages;}
1184  inline void SetTimeStaticFlag(bool a_flag)
1185  {m_timeStaticFlag = a_flag ;}
1191  inline void SetRespStaticFlag(bool a_flag)
1192  {m_respStaticFlag = a_flag ;}
1198  inline void SetCardStaticFlag(bool a_flag)
1199  {m_cardStaticFlag = a_flag ;}
1205  inline void SetnbFramesToSkip(int a_FramesToSkip)
1206  {m_nbFramesToSkip = a_FramesToSkip ;}
1211  inline bool IsInitialized() {return m_initialized;}
1216  inline bool HasMask() {return m_hasMask;}
1217 
1218 
1219 
1220 
1221  // -----------------------------------------------------------------------------------------
1222  // Data members
1223  private:
1225  // oDynamicModelManager* mp_DynamicModelManager; /*!< oDynamicModelManager object related to dynamic model management*/
1226  // Number of threads
1229  // MPI size and rank
1230  int m_mpiRank;
1231  int m_mpiSize;
1232  // Number of beds
1233  int m_nbBeds;
1235  bool m_providedBedPosition;
1236  // Framing of the acquisition
1237  string m_frameList;
1238  int m_nbFramesToSkip;
1241  int m_nbTimeFrames;
1243  uint32_t** m2p_frameDurationsInMs;
1244  uint32_t** m2p_frameTimeStartInMs;
1245  uint32_t** m2p_frameTimeStopInMs;
1246  bool m_timeStaticFlag;
1247  int m_dynRecoTypeFlag;
1249  // Quantification
1251  string m_ignoredCorrectionsList;
1260  long double m_lambda;
1261  // Respiratory gating
1263  int m_nbRespGates;
1265  string m_respBasisFunctionsFile;
1266  bool m_respStaticFlag;
1267  // Cardiac gating
1269  int m_nbCardGates;
1271  string m_cardBasisFunctionsFile;
1272  bool m_cardStaticFlag;
1273  // Image discretization
1274  INTNB m_nbVoxX;
1275  INTNB m_nbVoxY;
1276  INTNB m_nbVoxZ;
1277  INTNB m_nbVoxXY;
1278  INTNB m_nbVoxXYZ;
1279  FLTNB m_voxSizeX;
1280  FLTNB m_voxSizeY;
1281  FLTNB m_voxSizeZ;
1282  FLTNB m_fovSizeX;
1283  FLTNB m_fovSizeY;
1284  FLTNB m_fovSizeZ;
1285  FLTNB m_offsetX;
1286  FLTNB m_offsetY;
1287  FLTNB m_offsetZ;
1288  // Percentage of transaxial FOV unmasked before saving
1291  // Output flip
1292  bool m_flipOutX;
1293  bool m_flipOutY;
1294  bool m_flipOutZ;
1295  // Parameters checked
1296  bool m_checked;
1297  // Object initialized
1298  bool m_initialized;
1299  // Verbose
1300  int m_verbose;
1301  int m_nbMultiModalImages;
1302  // Bool mask to exclude voxels from computations (projection, convolution, etc.)
1303  bool m_hasMask;
1304  bool* mp_mask;
1305 };
1306 
1307 #endif
int InitializeFramingAndQuantification()
A function used to initialize the framing and quantification tables.
int GetCurrentRespGate(int a_th)
Return the index indicating the current respiratory gate for this thread.
This class is designed to be a mother virtual class for DataFile.
FLTNB GetListPMotionWeightInFrameForLMS(int a_fr, int a_pmsset)
oImageDimensionsAndQuantification()
The constructor of oImageDimensionsAndQuantification.
void SetRespMotionFlagOn()
set the respiratory motion flag to &#39;true&#39;
void SetCardMotionFlagOn()
set the cardiac motion flag to &#39;true&#39;
FLTNB GetTimeBasisCoefficient(int a_timeBasisFunction, int a_timeFrame)
void SetIgnoreNormCorrectionFlag(bool a_ignoreNormCorrectionFlag)
Set the boolean m_ignoreNormCorrectionFlag to a_ignoreNormCorrectionFlag.
This class gathers the information about the dynamic splitting of the data.
void ResetCurrentDynamicIndices()
Reset to 0 the multithreaded dynamic arrays gathering the indices of current frame, gates and involuntary motion.
int SetCalibrationFactor(int a_bed, FLTNB a_calibrationFactor)
void CheckNumberOfProjectionThreadsConsistencyWithDataFileSize(vDataFile **a2p_DataFile)
int GetNbIPatMotionSubsets()
return the number of involuntary patient motion transformations
int DynamicSwitch(int64_t a_currentEventIndex, uint32_t a_currentTime, int a_bed, int a_th)
void SetIgnoreScatCorrectionFlag(bool a_ignoreScatCorrectionFlag)
Set the boolean m_ignoreScatCorrectionFlag to a_ignoreScatCorrectionFlag.
~oImageDimensionsAndQuantification()
The destructor of oImageDimensionsAndQuantification.
void SetIgnoreAttnCorrectionFlag(bool a_ignoreAttnCorrectionFlag)
Set the boolean m_ignoreAttnCorrectionFlag to a_ignoreAttnCorrectionFlag.
int DynamicSwitch(int64_t a_index, uint32_t a_time, int a_bed, int a_th)
int GetNb2ndMotImgsForLMS()
return the number of secundary motion (typically cardiac) images to be used in the ImageSpace matrice...
int ResetQuantificationFactors()
If already initialized, set the quantification factors to 1.
int CheckParameters()
A function used to check the parameters settings.
FLTNB GetRespBasisCoefficient(int a_respBasisFunction, int a_respGate)
int Initialize()
A function used to initialize all that is needed.
int GetCurrentTimeFrame(int a_th)
Return the index indicating the current time frame for this thread.
FLTNB GetCardBasisCoefficient(int a_cardBasisFunction, int a_cardGate)
void SetIgnoreFdurCorrectionFlag(bool a_ignoreFdurCorrectionFlag)
Set the boolean m_ignoreFdurCorrectionFlag to a_ignoreFdurCorrectionFlag.
FLTNB GetQuantificationFactor(int a_bed, int a_frame, int a_respGate, int a_cardGate)
void SetIgnoreBratCorrectionFlag(bool a_ignoreBratCorrectionFlag)
Set the boolean m_ignoreBratCorrectionFlag to a_ignoreBratCorrectionFlag.
int InitDynamicData(string a_pathTo4DDataSplittingFile, int a_respMotionCorrectionFlag, int a_cardMotionCorrectionFlag, int a_invMotionCorrectionFlag, int a_nbRespGates, int a_nbCardGates)
void SetIgnoredCorrections(const string &a_ignoredCorrectionsList)
void SetFOVOutMasking(FLTNB a_fovOutPercent, INTNB a_nbSliceOutMask)
void SetIgnoreCaliCorrectionFlag(bool a_ignoreCaliCorrectionFlag)
Set the boolean m_ignoreCaliCorrectionFlag to a_ignoreCaliCorrectionFlag.
void SetIgnoreRandCorrectionFlag(bool a_ignoreRandCorrectionFlag)
Set the boolean m_ignoreRandCorrectionFlag to a_ignoreRandCorrectionFlag.
void SetCardBasisFunctionsFile(const string &a_cardBasisFunctionsFile)
void SetIgnoreDecaCorrectionFlag(bool a_ignoreDecaCorrectionFlag)
Set the boolean m_ignoreDecaCorrectionFlag to a_ignoreDecaCorrectionFlag.
This class is designed to manage all dimensions and quantification related stuff. ...
HPFLTNB GetDurationPerGate(int a_fr, int a_respGate)
void SetDefault()
A function used to set number of threads and MPI instances to 1 and bypass the CheckParameters() func...
int SetAcquisitionTime(int a_bed, FLTNB a_timeStartInSec, FLTNB a_durationInSec, string a_GateListDurationsInSec)
int InitializeIgnoredCorrections()
A function used to initialize the ignored corrections.
void SetRespBasisFunctionsFile(const string &a_respBasisFunctionsFile)
void SetPMotionFlagOn()
set the involuntary patient motion flag to &#39;true&#39;
int SetDynamicSpecificQuantificationFactors(const string &a_quantificationFile)