12 #include "gVariables.hh" 13 #include "gOptions.hh" 14 #include "iRCPGSAlgorithm.hh" 15 #include "vAlgorithm.hh" 16 #include "iIterativeAlgorithm.hh" 17 #include "oSensitivityGenerator.hh" 18 #include "oImageDimensionsAndQuantification.hh" 19 #include "iDataFilePET.hh" 20 #include "iDataFileSPECT.hh" 21 #include "iDataFileCT.hh" 22 #include "sOutputManager.hh" 23 #include "sScannerManager.hh" 24 #include "sRandomNumberGenerator.hh" 25 #include "iScannerPET.hh" 26 #include "sAddonManager.hh" 27 #include "sChronoManager.hh" 47 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
48 if (mpi_rank!=0)
return;
52 cout <<
"Usage: castor-recon.exe -df file.cdh -(f/d)out output -it iter [settings]" << endl;
54 cout <<
"[Main options]:" << endl;
55 cout <<
" -df file.cdh : Give an input CASTOR datafile header (no default)." << endl;
57 cout <<
" -fout name : Give the root name for all output files (no default, alternative to -dout)" << endl;
58 cout <<
" -dout name : Give the name of the output directory where all output files will be written (no default, alternative to -fout)" << endl;
59 cout <<
" -it list : Give the sequence of iterations:subsets separated by commas (no default)." << endl;
60 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
61 cout <<
" -fov x,y,z : Give the size of the field-of-view in each dimension, in mm (default: those of the scanner, or calculated from" << endl;
62 cout <<
" the voxel sizes provided using '-vox')." << endl;
63 cout <<
" -vox x,y,z : Give the size of the voxels in each dimension, in mm (default: those of the scanner, or calculated from the fov" << endl;
64 cout <<
" if a fov value is provided using '-fov')." << endl;
65 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
67 cout <<
"[Specific help options]:" << endl;
68 cout <<
" -help-dim : Print out specific help about dimensions settings." << endl;
69 cout <<
" -help-in : Print out specific help about input settings." << endl;
70 cout <<
" -help-out : Print out specific help about output settings." << endl;
71 cout <<
" -help-algo : Print out specific help about reconstruction algorithms and their settings." << endl;
72 cout <<
" -help-proj : Print out specific help about projection operators." << endl;
73 cout <<
" -help-dynamic : Print out specific help about dynamic methodologies settings." << endl;
74 cout <<
" -help-imgp : Print out specific help about image processing modules." << endl;
75 cout <<
" -help-comp : Print out specific help about computing settings." << endl;
76 cout <<
" -help-corr : Print out specific help about all corrections that can be disabled." << endl;
77 cout <<
" -help-misc : Print out specific help about miscellaneous and verbose settings." << endl;
79 cout <<
"[Implemented Modules]:" << endl;
80 cout <<
" -help-scan : Show the list of all scanners from the configuration directory." << endl;
81 cout <<
" -help-projm : Show the list and description of all implemented projectors." << endl;
82 cout <<
" -help-opti : Show the list and description of all implemented optimizer algorithms." << endl;
83 cout <<
" -help-pnlt : Show the list and description of all implemented penalties for optimizers." << endl;
84 cout <<
" -help-motion-model : Show the list and description of all implemented image-based deformation models." << endl;
85 cout <<
" -help-dynamic-model : Show the list and description of all implemented dynamic models." << endl;
86 cout <<
" -help-conv : Show the list and description of all implemented image convolvers." << endl;
87 cout <<
" -help-proc : Show the list and description of all implemented image processing modules." << endl;
90 cout <<
" --help,-h,-help : Print out this help page." << endl;
93 cout <<
" Compiled with MPI" << endl;
96 cout <<
" Compiled with OpenMP" << endl;
99 cout <<
" Compiled for GPU" << endl;
101 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU) 105 cout <<
" Build date: " << BUILD_DATE << endl;
108 #ifdef CASTOR_VERSION 109 cout <<
" This program is part of the CASToR release version " <<
CASTOR_VERSION <<
"." << endl;
127 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
128 if (mpi_rank!=0)
return;
132 cout <<
"[Input settings]:" << endl;
137 cout <<
" -df file.cdf : Give an input CASTOR datafile header (no default)." << endl;
139 cout <<
" -img file.hdr : Give an input image as the initialization of the algorithm (default: uniform value)." << endl;
141 cout <<
" -sens file.hdr : Provide the sensitivity image (default: sensitivity image is computed before reconstruction)." << endl;
142 cout <<
" The image file should integrate all sensitivity images if more than one are required. If dual-gating is enabled and if it" << endl;
143 cout <<
" requires sensitivity images for each gate, the image should integrate nb_resp_gates * nb_card_gates sensitivity images" << endl;
144 cout <<
" (all cardiac-gated based sensitivity images for each one of the respiratory gates)." << endl;
146 cout <<
" -multimodal file.hdr : Provide additional images, from other modalities (anatomical, functional), or processed, for use in constrained reconstruction." << endl;
147 cout <<
" Multiple additional images can be provided by using the option multiple times. The additional images will be linearly interpolated" << endl;
148 cout <<
" to match the dimensions of the reconstructed images." << endl;
150 cout <<
" -mask file.hdr : Provide a mask image for avoiding computations (projection, convolution, penalty) on irrelevant voxels (background)."<<endl;
151 cout <<
" The mask should contain zero values for the background and non zero values for relevant voxels." << endl;
153 cout <<
" -norm file.cdh : For list-mode data, provide a normalization data file for sensitivity computation (default: use the scanner LUT and" << endl;
154 cout <<
" assume all LORs with a weight of 1.). This restricts the computation of the sensitivity to the LORs provided in the" << endl;
155 cout <<
" normalization file and associated normalization factors and/or attenuation factors." << endl;
156 cout <<
" For dynamic reconstructions with multiple frames, as many normalization files as frames can be supplied, their names" << endl;
157 cout <<
" separated by commas. This is useful when dead-times correction is included in the normalization factors." << endl;
160 cout <<
" -atn file.hdr : Give an input attenuation image (unit has to be cm-1) for sensitivity image generation or SPECT attenuation correction." << endl;
162 cout <<
" -help-in : Print out this help." << endl;
180 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
181 if (mpi_rank!=0)
return;
185 cout <<
"[Output settings]:" << endl;
187 cout <<
" -fout name : Give the root name for all output files. All output files will be written as 'name_suffix.ext'." << endl;
188 cout <<
" So the provided name should not end with '.' or '/' character. (no default, alternative to -dout)" << endl;
189 cout <<
" -dout name : Give the name of the output directory where all output files will be written. All files will also" << endl;
190 cout <<
" be prefixed by the name of the directory. The provided name should not end with '.' or '/' character." << endl;
191 cout <<
" (no default, alternative to -fout)" << endl;
193 cout <<
" -oit list : Give the sequence of output iterations as a list of 'a:b' pairs separated by commas. This will output one" << endl;
194 cout <<
" iteration over 'a' until 'b' is reached, then it goes to the next pair of setting." << endl;
195 cout <<
" Set '-1' to save only the last iteration. (default: save all iterations)" << endl;
197 cout <<
" -fov-out percent : Give the percentage of the eliptical transaxial FOV to be kept while saving the image (default: no making)." << endl;
199 cout <<
" -slice-out value : Give the number of axial slices to be masked at each border of the axial field-of-view (default: 0)." << endl;
201 cout <<
" -flip-out value : Flip the image before saving it (not done in the computation); specify the axis (e.g. 'X', 'XY', 'YZ') (default: no flip)." << endl;
203 cout <<
" -onbp value : By default, numbers are displayed using scientific format. This option allows to customize the format and precision" << endl;
204 cout <<
" : The format is format,precision. f is the format (s=scientific, f=fixed), p is the precision" << endl;
205 cout <<
" eg: -onbp f,5 --> fixed with 5 digits precision, -onbp --> scientific with max precision." << endl;
207 cout <<
" -omd : (M)erge (D)ynamic images. Indicate if a dynamic serie of 3D images should be written on disk in one file" << endl;
208 cout <<
" instead of a serie of 3D images associated with an interfile metaheader." << endl;
210 cout <<
" -odyn : Flag to say that we want to save the dynamic basis function coefficients images too (default: only the frames/gates are saved)." << endl;
212 cout <<
" -osens : Flag to say that we want to save the sensitivity image of each subset/iteration, when in histogram mode." << endl;
214 cout <<
" -osub : Flag to say that we want to save the image after each subset." << endl;
216 cout <<
" -olut : If a scanner LUT (geometry information) is computed from a .geom file, it will be save on disk in the scanner repository." << endl;
218 cout <<
" -sens-histo : If input file is a histogram, compute the global sensitivity from it (and still proceed to normal reconstruction after)." << endl;
220 cout <<
" -sens-only : For list-mode data, exit directly after computing and saving the sensitivity." << endl;
222 cout <<
" -help-out : Print out this help." << endl;
239 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
240 if (mpi_rank!=0)
return;
244 cout <<
"[Dimensions options]:" << endl;
246 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
248 cout <<
" -fov x,y,z : Give the size of the field-of-view in each dimension, in mm (default: those of the scanner)." << endl;
250 cout <<
" -vox x,y,z : Give the size of the voxels in each dimension, in mm (default: those of the scanner, or calculated from the fov if a fov value is provided using '-fov')." << endl;
252 cout <<
" -off x,y,z : Give the offset of the field-of-view in each dimension, in mm (default: 0.,0.,0.)." << endl;
253 cout <<
" (note this has no effect when using a pre-computed system matrix)" << endl;
255 cout <<
" -help-dim : Print out this help." << endl;
276 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
277 if (mpi_rank!=0)
return;
280 cout <<
"[Algorithm settings]:" << endl;
282 cout <<
" -opti param : Specify the iterative optimization algorithm to be used, along with a configuration file (algo:file.conf) or the list of parameters" << endl;
283 cout <<
" associated to the algorithm (algo,param1,param2,...). If the algorithm only is specified, the default" << endl;
284 cout <<
" configuration file is used if any. By default, the MLEM algorithm is used. For specific help, use option -help-opti." << endl;
286 cout <<
" -opti-fom : Flag to say that we want to compute and print figures-of-merit (likelihood and RMSE) in the data-space." << endl;
288 cout <<
" -opti-stat : Flag to say that we want to compute and print basic statistics about the image update." << endl;
290 cout <<
" -pnlt param : Give the penalty to be used with the algorithm (if the latter allows to do so), along with a configuration file (penalty:file.conf)" << endl;
291 cout <<
" or the list of parameters associated to the penalty (penalty,param1,param2,...). If only the penalty name is specified, the default" << endl;
292 cout <<
" configuration file is used if any. By default, no penalty is used. For specific help, use option -help-pnlt." << endl;
293 cout <<
" -pnlt-beta : Give the strength of the penalty defined by the '-pnlt' option." << endl;
294 cout <<
" -prob : Specify the probabilistic (Bayesian inference) algorithm, along with a configuration file or a list of parameters, use option -help-prob for more details." << endl;
296 cout <<
" -help-opti : Print out specific help about optimizer settings." << endl;
298 cout <<
" -help-pnlt : Print out specific help about penalty settings." << endl;
299 cout <<
" -help-algo : Print out specific help about the available algorithms." << endl;
316 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
317 if (mpi_rank!=0)
return;
320 cout <<
"[Projector settings]:" << endl;
322 cout <<
" -proj param : Give the projector to be used for both forward and backward projections, along with a configuration file (proj:file.conf)" << endl;
323 cout <<
" or the list of parameters associated to the projector (proj,param1,param2,...). If the projector only is specified, the" << endl;
324 cout <<
" default configuration file is used. By default, the Siddon projector is used. For specific help, use option -help-proj." << endl;
326 cout <<
" -projF param : Give the projector to be used for forward projections. See option -proj for details." << endl;
328 cout <<
" -projB param : Give the projector to be used for backward projections. See option -proj for details." << endl;
330 cout <<
" -proj-common : Give common projector-related options, such as TOF implementation options, see -help-projm for more details." << endl;
336 cout <<
" -ignore-TOF : Flag to say that we want to ignore any potential TOF information (default: use it if present in the datafile)." << endl;
338 cout <<
" -help-projm : Print out specific help about projector settings." << endl;
355 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
356 if (mpi_rank!=0)
return;
359 cout <<
"[Image processing settings]:" << endl;
361 cout <<
" -conv param;when : Give an image convolver model to be used within the algorithm, along with a configuration file (conv:file.conf::when) or the" << endl;
362 cout <<
" list of parameters associated to the convolver (conv,param1,param2,...::when). If the convolver only is specified, its default" << endl;
363 cout <<
" configuration file is used. By default, no convolver is applied. Multiple convolvers can be combined simply by repeating this" << endl;
364 cout <<
" this option. The mandatory 'when' parameter specifies when the convolver is applied (psf, sieve, forward, backward, post, intra)." << endl;
365 cout <<
" For more specific help, use option -help-conv." << endl;
367 cout <<
" -help-conv : Print out specific help about the image convolver settings." << endl;
369 cout <<
" -proc param;when : Give an image processing module to be used within the algorithm, along with a configuration file (proc:file.conf;when) or the" << endl;
370 cout <<
" list of parameters associated to the module (proc,param1,param2,...;when). If the module only is specified, its default" << endl;
371 cout <<
" configuration file is used. By default, no image processing module is applied. Multiple modules can be combined simply by" << endl;
372 cout <<
" repeating this this option. The mandatory 'when' parameter specifies when the module is applied (forward, backward, post, intra)." << endl;
373 cout <<
" For more specific help, use option -help-proc." << endl;
375 cout <<
" -help-proc : Print out specific help about the image processing module settings." << endl;
392 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
393 if (mpi_rank!=0)
return;
397 cout <<
"[Dynamic settings]:" << endl;
399 cout <<
" -frm list : Give the framing details for the reconstruction where 'list' is a list of frame start times, separated with commas. " << endl;
400 cout <<
" Duration for each frame can also be specified using a colon after the frame start time. "<< endl;
401 cout <<
" When no duration is specified for a frame, the duration will be set equal to the difference between the start of this frame and the next one."<< endl;
402 cout <<
" It is mandatory to specify the duration of the last frame. For example '-frm start1:duration1,start2,start3:duration3'."<< endl;
403 cout <<
" Add 's' or 'm' to specify if values are seconds or minutes (seconds is the default if none provided). " << endl;
404 cout <<
" Maximum precision of frames is milliseconds. (default: 1 frame of the whole input file duration)." << endl;
406 cout <<
" -g path_to_file : Provide text file for dynamic data splitting associated to respiratory/cardiac gating or involuntary patient motion correction" << endl;
418 cout <<
" -dynamic-model param : Dynamic model applied to either the frames of a dynamic acquisition, respiratory-gated frames, cardiac-gated frames, or simultaneously between these datasets." << endl;
419 cout <<
" Select the dynamic model to be used, along with a configuration file (model:file) or the list of parameters associated to the model (model_name,param1,param2,...)." << endl;
421 cout <<
" -rm param : Provide an image-based deformation model to be used for respiratory motion correction, along with a configuration file (deformation:file)" << endl;
422 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
424 cout <<
" -cm param : Provide an image-based deformation model to be used for cardiac motion correction, along with a configuration file (deformation:file)" << endl;
425 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
430 cout <<
" -im param : Provide an image-based deformation model to be used for involuntary motion correction, along with a configuration file (deformation:file)" << endl;
431 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
433 cout <<
" -qdyn file : Provide a text file containing quantitative factors specific to dynamic frames, respiratory or cardiac gates." << endl;
434 cout <<
" The file should provide factors with the keywords 'FRAME_QUANTIFICATION_FACTORS' and 'GATE_QUANTIFICATION_FACTORS' " << endl;
435 cout <<
" The number of factors must be consistent with the number of frames/gates " << endl;
436 cout <<
" If the data contains several frames and gates, the gate quantification factors should be entered on a separate line for each frame " << endl;
438 cout <<
" -help-dynamic-model : Print out specific help about dynamic model." << endl;
440 cout <<
" -help-motion-model : Print out specific help about deformation models." << endl;
442 cout <<
" -help-dynamic : Print out this help." << endl;
460 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
461 if (mpi_rank!=0)
return;
465 cout <<
"[Computation settings]:" << endl;
468 cout <<
" -th param : Set the number of threads for parallel computation (default: 1). If 0 is given, then the maximum number of available threads is automatically determined." << endl;
469 cout <<
" Can also give two parameters separated by a comma (e.g. 16,4), to distinguish between the number of threads for projection and image operations respectively." << endl;
473 cout <<
" -gpu : Flag to say that we want to use the GPU device (default: use the CPU only)." << endl;
476 cout <<
" -proj-comp : Give the strategy for projection line computation. Here are the three different strategies that can be used:" << endl;
477 cout <<
" 1 : Image-based system matrix elements storage: The voxels weights are added in a matrix representing the whole image, so" << endl;
478 cout <<
" the addition of a new line to the previous ones is straightforward only by adding the weights to the corresponding voxels." << endl;
479 cout <<
" As it is insanely long, it can possibly be used for example with extremely complex projectors that makes use of huge number" << endl;
480 cout <<
" of ray tracings for a single event, where the list of contributions can become longer than the number of voxels in the image." << endl;
481 cout <<
" This strategy is not compatible with SPECT reconstruction including attenuation correction." << endl;
482 cout <<
" 2 : Fixed-size list storage of system matrix elements: The voxels are added one by one in two separated lists, one containing voxel" << endl;
483 cout <<
" indices and the other voxel weights. When a voxel is added to the oProjectionLine, it is simply pilled-up to the list. The list" << endl;
484 cout <<
" has a fixed size which is provided by the EstimateMaxNumberOfVoxelsPerLine() function from the vProjector class. There are no" << endl;
485 cout <<
" ckecks at all for possible buffer overflows. This is the fastest strategy and default one." << endl;
486 cout <<
" 3 : Adaptative-size list storage of system matrix elements: This is the same as the fixed-size strategy except that the size can be" << endl;
487 cout <<
" upgraded if the current number of contributing voxels exceed the list's size. The first allocated size corresponds to the diagonal" << endl;
488 cout <<
" of the image. During the first iteration, this size will be upgraded until it will reach a size suitable for all events. Thus it" << endl;
489 cout <<
" is a bit slower than the fixed-list strategy during the first iteration, but is optimal with respect to RAM usage." << endl;
491 cout <<
" -rng-seed : Give a seed for the random number generator (should be >=0)" << endl;
493 cout <<
" -rng-extra : Give the number of additional random number generators, if needed (in addition to one rng per thread) " << endl;
495 cout <<
" -help-comp : Print out this help." << endl;
498 cout <<
" Compiled with MPI" << endl;
501 cout <<
" Compiled with OpenMP" << endl;
504 cout <<
" Compiled for GPU" << endl;
506 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU) 524 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
525 if (mpi_rank!=0)
return;
529 cout <<
"[Miscellaneous settings]:" << endl;
531 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
532 cout <<
" -vb-algo : Give the verbose level specific to the algorithm (default: same as general verbose level)." << endl;
533 cout <<
" -vb-opti : Give the verbose level specific to the optimizer (default: same as general verbose level)." << endl;
534 cout <<
" -vb-proj : Give the verbose level specific to the projector (default: same as general verbose level)." << endl;
535 cout <<
" -vb-conv : Give the verbose level specific to the image convolver (default: same as general verbose level)." << endl;
536 cout <<
" -vb-proc : Give the verbose level specific to the image processing (default: same as general verbose level)." << endl;
537 cout <<
" -vb-scan : Give the verbose level specific to the scanner (default: same as general verbose level)." << endl;
538 cout <<
" -vb-data : Give the verbose level specific to the data and image management (default: same as general verbose level)." << endl;
539 cout <<
" -vb-defo : Give the verbose level specific to the deformation (default: same as general verbose level)." << endl;
540 cout <<
" -vb-dyna : Give the verbose level specific to the dynamic model (default: same as general verbose level)." << endl;
541 cout <<
" -vb-sens : Give the verbose level specific to the sensitivity computation (default: same as general verbose level)." << endl;
543 cout <<
" -conf : Give the path to the CASToR config directory (default: located through the CASTOR_CONFIG environment variable)." << endl;
545 cout <<
" -help-misc : Print out this help." << endl;
562 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
563 if (mpi_rank!=0)
return;
567 cout <<
"[Correction settings]:" << endl;
569 cout <<
" -ignore-corr list : Give the list of corrections that should be ignored, separated by commas (default: all corrections applied if present)." << endl;
570 cout <<
" Here is a list of all corrections that can be ignored:" << endl;
571 cout <<
" - attn: to ignore the attenuation correction (emission only)" << endl;
572 cout <<
" - norm: to ignore the normalization correction (emission only)" << endl;
573 cout <<
" - rand: to ignore the random correction (PET only)" << endl;
574 cout <<
" - scat: to ignore the scatter correction" << endl;
575 cout <<
" - deca: to ignore the decay correction (emission only)" << endl;
576 cout <<
" - brat: to ignore the branching ratio correction (emission only)" << endl;
577 cout <<
" - fdur: to ignore the frame duration correction (emission only)" << endl;
578 cout <<
" - cali: to ignore the calibration correction (emission only)" << endl;
590 int main(
int argc,
char** argv)
598 MPI_Init(&argc, &argv);
599 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
600 MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
619 INTNB nb_voxX=-1, nb_voxY=-1, nb_voxZ=-1;
620 FLTNB fov_sizeX=-1., fov_sizeY=-1., fov_sizeZ=-1.;
621 FLTNB vox_sizeX=-1., vox_sizeY=-1., vox_sizeZ=-1.;
623 FLTNB offsetX = 0., offsetY = 0., offsetZ = 0.;
627 string flip_out =
"";
634 string frame_list =
"";
636 int nb_resp_gates = 1;
638 int nb_card_gates = 1;
640 string path_to_4D_data_splitting_file =
"";
642 string dynamic_model_options =
"";
644 string resp_motion_options =
"";
646 string card_motion_options =
"";
648 string double_motion_options =
"";
650 string ipat_motion_options =
"";
652 int nb_resp_basis = 1;
653 string path_to_resp_basis_coef =
"";
655 int nb_card_basis = 1;
656 string path_to_card_basis_coef =
"";
658 string path_to_dynamic_quantification_file=
"";
668 vector<string> path_to_data_filename;
670 bool invert_datafile_bed_order_flag =
false;
672 string path_to_initial_img =
"";
674 string path_to_sensitivity_img =
"";
676 vector<string> path_to_normalization_filename;
678 string path_to_attenuation_img;
680 vector<string> path_to_multimodal_img;
682 string path_to_mask_img =
"";
684 int nb_atn_resp_imgs = 1;
685 int nb_atn_card_imgs = 1;
687 string ignored_corrections =
"";
694 string path_dout =
"";
696 string path_fout =
"";
698 string output_iterations =
"";
700 bool merge_dynamic_imgs_flag =
false;
702 bool save_LUT_flag =
false;
704 bool save_sens_histo =
false;
706 bool save_subset_image =
false;
708 bool save_dynamic_basis_coefficients_flag =
false;
710 bool exit_after_sensitivity =
false;
712 bool sensitivity_from_histogram =
false;
714 string onb_prec =
"s,0";
721 string options_projector =
"incrementalSiddon";
722 string options_projectorF =
"incrementalSiddon";
723 string options_projectorB =
"incrementalSiddon";
724 string options_projector_common =
"3.,1,1";
728 bool ignore_POI =
false;
729 bool ignore_TOF =
false;
736 string nb_iterations_subsets =
"";
738 string options_optimizer =
"MLEM";
740 bool optimizer_fom =
false;
742 bool optimizer_stat =
false;
744 string options_penalty =
"";
746 string options_prob =
"";
748 FLTNB penalty_beta = -1.;
756 vector<string> options_image_convolver;
758 vector<string> options_image_processing;
765 bool gpu_flag =
false;
767 string nb_threads =
"1";
774 int verbose_general = 1;
776 int verbose_algo = -1;
777 int verbose_opti = -1;
778 int verbose_proj = -1;
779 int verbose_conv = -1;
780 int verbose_proc = -1;
781 int verbose_scan = -1;
782 int verbose_data = -1;
783 int verbose_defo = -1;
784 int verbose_dyna = -1;
785 int verbose_sens = -1;
787 string path_to_config_dir =
"";
789 int64_t random_generator_seed = -1;
790 int nb_extra_random_generators = 0;
799 for (
int i=1; i<argc; i++)
803 string option = (string)argv[i];
810 if (option==
"-h" || option==
"--help" || option==
"-help")
816 else if (option==
"-help-scan")
819 Cerr(
"***** castor-recon() -> An error occurred when trying to output the available scanners from the scanner repository !'" << endl;);
823 else if (option==
"-help-prob")
832 else if (option==
"-help-opti")
838 else if (option==
"-help-pnlt")
844 else if (option==
"-help-projm")
853 else if (option==
"-help-conv")
862 else if (option==
"-help-proc")
871 else if (option==
"-help-dynamic-model")
877 else if (option==
"-help-motion-model")
883 else if (option==
"-help-in")
889 else if (option==
"-help-out")
895 else if (option==
"-help-dim")
901 else if (option==
"-help-algo")
907 else if (option==
"-help-proj")
913 else if (option==
"-help-imgp")
919 else if (option==
"-help-comp")
925 else if (option==
"-help-misc")
931 else if (option==
"-help-dynamic")
937 else if (option==
"-help-corr")
943 else if (option==
"-vb")
947 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
952 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_general <<
" for option: " << option << endl);
958 else if (option==
"-vb-algo")
962 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
967 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_algo <<
" for option: " << option << endl);
973 else if (option==
"-vb-opti")
977 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
982 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_opti <<
" for option: " << option << endl);
988 else if (option==
"-vb-proj")
992 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
997 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proj <<
" for option: " << option << endl);
1003 else if (option==
"-vb-conv")
1007 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1012 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_conv <<
" for option: " << option << endl);
1018 else if (option==
"-vb-proc")
1022 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1027 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proc <<
" for option: " << option << endl);
1033 else if (option==
"-vb-scan")
1037 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1042 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_scan <<
" for option: " << option << endl);
1048 else if (option==
"-vb-data")
1052 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1057 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_data <<
" for option: " << option << endl);
1063 else if (option==
"-vb-defo")
1067 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1072 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_defo <<
" for option: " << option << endl);
1078 else if (option==
"-vb-dyna")
1082 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1087 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_dyna <<
" for option: " << option << endl);
1093 else if (option==
"-vb-sens")
1097 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1102 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_sens <<
" for option: " << option << endl);
1108 else if (option==
"-rng-seed")
1112 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1117 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << random_generator_seed <<
" for option: " << option << endl);
1123 else if (option==
"-rng-extra")
1127 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1132 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << nb_extra_random_generators <<
" for option: " << option << endl);
1138 else if (option==
"-conf")
1142 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1145 path_to_config_dir = (string)argv[i+1];
1154 else if (option==
"-dim")
1158 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1164 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1173 else if (option==
"-fov")
1177 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1183 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1186 fov_sizeX = input[0];
1187 fov_sizeY = input[1];
1188 fov_sizeZ = input[2];
1192 else if (option==
"-vox")
1196 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1202 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1205 vox_sizeX = input[0];
1206 vox_sizeY = input[1];
1207 vox_sizeZ = input[2];
1211 else if (option==
"-off")
1215 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1221 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1230 else if (option==
"-fov-out")
1234 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1237 fov_out = atof(argv[i+1]);
1241 else if (option==
"-slice-out")
1245 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1248 slice_out = ((
INTNB)(atoi(argv[i+1])));
1252 else if (option==
"-flip-out")
1256 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1259 flip_out = (string)(argv[i+1]);
1268 else if (option==
"-frm")
1272 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1275 frame_list = (string)argv[i+1];
1279 else if (option==
"-g")
1283 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1287 path_to_4D_data_splitting_file = ((string)argv[i+1]);
1291 Cerr(
"***** castor-recon() -> Error when trying to read the number of respiratory gates in the file " << path_to_4D_data_splitting_file <<
" for option " << option << endl);
1297 Cerr(
"***** castor-recon() -> Error when trying to read the number of cardiac gates in the file " << path_to_4D_data_splitting_file <<
" for option " << option << endl);
1301 if (nb_resp_gates<1 || nb_card_gates <1)
1303 Cerr(
"***** castor-recon() -> Incorrect initialization of the number of gates for the option: " << option <<
". This number should be >= 1" << endl);
1370 else if (option==
"-dynamic-model")
1374 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1377 dynamic_model_options = (string)argv[i+1];
1381 else if (option==
"-rm")
1385 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1388 resp_motion_options = (string)argv[i+1];
1392 else if (option==
"-cm")
1396 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1399 card_motion_options = (string)argv[i+1];
1415 else if (option==
"-im")
1419 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1422 ipat_motion_options = (string)argv[i+1];
1426 else if (option==
"-qdyn")
1430 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1433 path_to_dynamic_quantification_file = (string)argv[i+1];
1442 else if (option==
"-df")
1446 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1449 string file_name = (string)argv[i+1];
1450 path_to_data_filename.push_back(file_name);
1455 else if (option==
"-df-inv")
1457 invert_datafile_bed_order_flag =
true;
1460 else if (option==
"-img")
1464 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1467 path_to_initial_img = argv[i+1];
1471 else if (option==
"-sens")
1475 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1479 path_to_sensitivity_img = argv[i+1];
1483 else if (option==
"-norm")
1487 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1490 string file_name = (string)argv[i+1];
1491 path_to_normalization_filename.push_back(file_name);
1496 else if (option==
"-atn")
1500 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1504 path_to_attenuation_img = (string)argv[i+1];
1506 if (path_to_attenuation_img !=
"")
1513 Cerr(
"***** castor-recon() -> An error occurred while trying to read the interfile header of attenuation file " << path_to_attenuation_img <<
" !" << endl);
1522 else if (option==
"-multimodal")
1526 Cerr(
"***** Argument missing for option: " << option << endl);
1529 string file_name = (string)argv[i+1];
1530 path_to_multimodal_img.push_back(file_name);
1534 else if (option==
"-mask")
1538 Cerr(
"***** Argument missing for option: " << option << endl);
1542 path_to_mask_img = argv[i+1];
1551 else if (option==
"-dout")
1555 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1558 path_dout = argv[i+1];
1562 else if (option==
"-fout")
1566 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1569 path_fout = argv[i+1];
1573 else if (option==
"-oit")
1577 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1580 output_iterations = (string)argv[i+1];
1584 else if (option==
"-onbp")
1588 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1591 onb_prec = argv[i+1];
1595 else if (option==
"-omd")
1597 merge_dynamic_imgs_flag =
true;
1600 else if (option==
"-olut")
1602 save_LUT_flag =
true;
1605 else if (option==
"-osens")
1607 save_sens_histo =
true;
1610 else if (option==
"-osub")
1612 save_subset_image =
true;
1615 else if (option==
"-odyn")
1617 save_dynamic_basis_coefficients_flag =
true;
1620 else if (option==
"-sens-only")
1622 exit_after_sensitivity =
true;
1625 else if (option==
"-sens-histo")
1627 sensitivity_from_histogram =
true;
1635 else if (option==
"-it")
1639 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1642 nb_iterations_subsets = (string)argv[i+1];
1646 else if (option==
"-opti")
1650 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1653 options_optimizer = (string)argv[i+1];
1657 else if (option==
"-opti-fom")
1659 optimizer_fom =
true;
1662 else if (option==
"-opti-stat")
1664 optimizer_stat =
true;
1667 else if (option==
"-pnlt")
1671 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1674 options_penalty = (string)argv[i+1];
1679 else if (option==
"-prob")
1683 Cerr(
"***** Argument missing for option: " << option << endl);
1686 options_prob = (string)argv[i+1];
1690 else if (option==
"-pnlt-beta")
1694 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1697 penalty_beta = (
FLTNB)atof(argv[i+1]);
1701 else if (option==
"-conv")
1705 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1708 string convolver = (string)argv[i+1];
1709 options_image_convolver.push_back(convolver);
1713 else if (option==
"-proc")
1717 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1720 string module = (string)argv[i+1];
1721 options_image_processing.push_back(module);
1730 else if (option==
"-proj")
1734 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1737 options_projectorF = (string)argv[i+1];
1738 options_projectorB = (string)argv[i+1];
1742 else if (option==
"-projF")
1746 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1749 options_projectorF = (string)argv[i+1];
1753 else if (option==
"-projB")
1757 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1760 options_projectorB = (string)argv[i+1];
1764 else if (option==
"-proj-common")
1768 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1771 options_projector_common = (string)argv[i+1];
1775 else if (option==
"-ignore-TOF")
1780 else if (option==
"-ignore-POI")
1785 else if (option==
"-proj-comp")
1789 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1792 projector_computation_strategy = atoi(argv[i+1]);
1801 else if (option==
"-ignore-corr")
1805 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1808 ignored_corrections = (string)argv[i+1];
1818 else if (option==
"-gpu")
1825 else if (option==
"-th")
1829 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1832 nb_threads = (string)argv[i+1];
1836 else if (option==
"-th")
1840 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1843 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1844 Cerr(
"!!!!! castor-recon() -> Option -th is available only if the code is compiled using the CASTOR_OMP environment variable set to 1 !" << endl);
1845 Cerr(
"!!!!! The execution will continue BUT WITH ONLY ONE THREAD !" << endl);
1846 Cerr(
"!!!!! We strongly advice to compile CASToR with OpenMP !" << endl);
1847 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1858 Cerr(
"***** castor-recon() -> Unknown option '" << option <<
"' !" << endl);
1865 MPI_Barrier(MPI_COMM_WORLD);
1869 if (verbose_algo==-1) verbose_algo = verbose_general;
1870 if (verbose_opti==-1) verbose_opti = verbose_general;
1871 if (verbose_proj==-1) verbose_proj = verbose_general;
1872 if (verbose_conv==-1) verbose_conv = verbose_general;
1873 if (verbose_proc==-1) verbose_proc = verbose_general;
1874 if (verbose_scan==-1) verbose_scan = verbose_general;
1875 if (verbose_data==-1) verbose_data = verbose_general;
1876 if (verbose_defo==-1) verbose_defo = verbose_general;
1877 if (verbose_dyna==-1) verbose_dyna = verbose_general;
1878 if (verbose_sens==-1) verbose_sens = verbose_general;
1887 Cerr(
"***** castor-recon() -> Please provide at least one data filename !" << endl);
1891 if (path_fout.empty() && path_dout.empty())
1893 Cerr(
"***** castor-recon() -> Please provide an output option for output files (-fout or -dout) !" << endl);
1897 if (!path_fout.empty() && !path_dout.empty())
1899 Cerr(
"***** castor-recon() -> Please provide either output option -fout or -dout but not both !" << endl);
1905 if ( (nb_resp_gates>1 || nb_card_gates>1) && path_to_4D_data_splitting_file.empty() )
1907 Cerr(
"***** castor-recon() -> gating is enabled, but no file describing the splitting of the data has been provided (-g option) !" << endl);
1912 if (!options_prob.empty())
1914 if (!options_image_convolver.empty())
1916 Cerr(
"***** castor-recon() -> Image convolution option is not compatible with the RCP-GS algorithm !" << endl);
1920 if (!frame_list.empty() || !path_to_4D_data_splitting_file.empty())
1922 Cerr(
"***** castor-recon() -> Dynamic reconstruction is not compatible with the RCP-GS algorithm !" << endl);
1925 if (nb_extra_random_generators!=2)
1927 Cerr(
"***** castor-recon() -> The number of random generators must be 2 for the RCP-GS algorithm!" << endl);
1930 if (!options_penalty.empty())
1932 Cerr(
"***** castor-recon() -> Penalties are not compatible with the RCP-GS algorithm !" << endl);
1941 if (verbose_general>=5)
Cout(
"----- Singletons initializations ... -----" << endl);
1951 p_outputManager->
SetVerbose(verbose_general);
1965 Cerr(
"***** castor-recon() -> A problem occurred while checking for the config directory path !" << endl);
1971 Cerr(
"***** castor-recon() -> A problem occurred while initializing output directory !" << endl);
1975 #ifdef CASTOR_VERSION 1976 Cout(
"castor-recon() -> Launch reconstruction from CASToR version " <<
CASTOR_VERSION <<
"." << endl);
1981 Cerr(
"***** castor-recon() -> A problem occurred while logging command line arguments !" << endl);
1994 if (p_ImageDimensionsAndQuantification->
SetNbThreads(nb_threads))
1996 Cerr(
"***** castor-recon() -> A problem occurred while setting the number of threads !" << endl);
2008 if (verbose_general>=5)
Cout(
"----- Geometry Initialization ... -----" << endl);
2013 string scanner_name =
"";
2016 Cerr(
"***** castor-recon() -> A problem occurred while trying to find the system name in the datafile header !" << endl);
2021 Cerr(
"***** castor-recon() -> A problem occurred while searching for scanner system !" << endl);
2026 Cerr(
"***** castor-recon() -> A problem occurred during scanner object construction ! !" << endl);
2031 Cerr(
"***** castor-recon() -> A problem occurred while creating Scanner object !" << endl);
2036 Cerr(
"***** castor-recon() -> A problem occurred while retrieving scanner fields from the datafile header !" << endl);
2041 Cerr(
"***** castor-recon() -> A problem occurred while generating/reading the LUT !" << endl);
2047 Cerr(
"***** castor-recon() -> A problem occurred while checking scanner manager parameters !" << endl);
2052 Cerr(
"***** castor-recon() -> A problem occurred while initializing scanner !" << endl);
2057 if (nb_voxX<=0 || nb_voxY<=0 || nb_voxZ<=0)
2061 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of transaxial voxels !" << endl);
2066 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of transaxial voxels !" << endl);
2071 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of axial voxels !" << endl);
2076 if ( (fov_sizeX<=0 || fov_sizeY<=0 || fov_sizeZ<=0) && (vox_sizeX<=0 || vox_sizeY<=0 || vox_sizeZ<=0) )
2080 Cerr(
"***** castor-recon() -> A problem occurred while reading for default transaxial FOV size !" << endl);
2085 Cerr(
"***** castor-recon() -> A problem occurred while reading for default transaxial FOV size !" << endl);
2090 Cerr(
"***** castor-recon() -> A problem occurred while reading for default axial FOV size !" << endl);
2095 if (verbose_general>=5)
Cout(
"----- Geometry Initialization OK -----" << endl);
2101 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization ... -----" << endl);
2103 p_ImageDimensionsAndQuantification->
SetNbBeds(nb_beds);
2104 p_ImageDimensionsAndQuantification->
SetNbVoxX(nb_voxX);
2105 p_ImageDimensionsAndQuantification->
SetNbVoxY(nb_voxY);
2106 p_ImageDimensionsAndQuantification->
SetNbVoxZ(nb_voxZ);
2107 p_ImageDimensionsAndQuantification->
SetVoxSizeX(vox_sizeX);
2108 p_ImageDimensionsAndQuantification->
SetVoxSizeY(vox_sizeY);
2109 p_ImageDimensionsAndQuantification->
SetVoxSizeZ(vox_sizeZ);
2110 p_ImageDimensionsAndQuantification->
SetFOVSizeX(fov_sizeX);
2111 p_ImageDimensionsAndQuantification->
SetFOVSizeY(fov_sizeY);
2112 p_ImageDimensionsAndQuantification->
SetFOVSizeZ(fov_sizeZ);
2114 p_ImageDimensionsAndQuantification->
SetOffsetX(offsetX);
2115 p_ImageDimensionsAndQuantification->
SetOffsetY(offsetY);
2116 p_ImageDimensionsAndQuantification->
SetOffsetZ(offsetZ);
2118 p_ImageDimensionsAndQuantification->
SetVerbose(verbose_data);
2120 p_ImageDimensionsAndQuantification->
SetFrames(frame_list);
2122 if (p_ImageDimensionsAndQuantification->
SetFlipOut(flip_out))
2124 Cerr(
"***** castor-recon() -> A problem occurred while setting the output flip option !" << endl);
2128 if (resp_motion_options==
"" && double_motion_options==
"")
2130 p_ImageDimensionsAndQuantification->
SetNbRespGates(nb_resp_gates);
2136 if (path_to_resp_basis_coef!=
"")
2138 Cerr(
"***** castor-recon() -> Cannot use both respiratory motion correction and respiratory basis functions, it has no sense !" << endl);
2144 if (card_motion_options==
"" && double_motion_options==
"")
2146 p_ImageDimensionsAndQuantification->
SetNbCardGates(nb_card_gates);
2152 if (path_to_card_basis_coef!=
"")
2154 Cerr(
"***** castor-recon() -> Cannot use both cardiac motion correction and cardiac basis functions, it has no sense !" << endl);
2162 Cerr(
"***** castor-recon() -> A problem occurred while checking image dimensions parameters !" << endl);
2165 if (p_ImageDimensionsAndQuantification->
Initialize())
2167 Cerr(
"***** castor-recon() -> A problem occurred while initializing image dimensions !" << endl);
2198 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization OK -----" << endl);
2212 if (!path_to_mask_img.empty())
2216 Cerr(
"The option for using a mask image is set, but the mask image is not provided or could not be loaded !" << endl);
2228 if (verbose_general>=5)
Cout(
"----- Random number generator initialization ... -----" << endl);
2231 p_RandomNumberGenerator->
SetVerbose(verbose_general);
2233 if (random_generator_seed>=0) p_RandomNumberGenerator->
Initialize(random_generator_seed, p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2234 else p_RandomNumberGenerator->
Initialize(p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2236 if (verbose_general >=5)
Cout(
"----- Random number generator initialization OK -----" << endl);
2242 if (verbose_general>=5)
Cout(
"----- DataFile initialization ... -----" << endl);
2249 for (
int i=0 ; i<nb_beds ; i++)
2252 (
dynamic_cast<iDataFilePET*
>(p_DataFile[i]))->SetIgnoreTOFFlag(ignore_TOF);
2258 for (
int i=0 ; i<nb_beds ; i++)
2266 for (
int i=0 ; i<nb_beds ; i++)
2274 Cerr(
"***** castor-recon() -> Unknown scanner type (" << p_ScannerManager->
GetScannerType() <<
") for datafile construction ! Abort." << endl);
2279 for (
int bed=0 ; bed<nb_beds ; bed++)
2282 if (invert_datafile_bed_order_flag) p_DataFile[bed]->
SetHeaderDataFileName(path_to_data_filename.at(nb_beds-1-bed));
2288 if (p_DataFile[bed]->ReadInfoInHeader())
2290 Cerr(
"***** castor-recon() -> A problem occurred during datafile header reading ! Abort." << endl);
2293 if (p_DataFile[bed]->CheckParameters())
2295 Cerr(
"***** castor-recon() -> A problem occurred while checking datafile parameters ! Abort." << endl);
2298 if (p_DataFile[bed]->ComputeSizeEvent())
2300 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2303 if (p_DataFile[bed]->InitializeMappedFile())
2305 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2308 if (p_DataFile[bed]->PrepareDataFile())
2310 Cerr(
"***** castor-recon() -> A problem occurred in datafile preparation ! Abort." << endl);
2315 for (
int bed=1; bed<nb_beds; bed++)
2317 if (p_DataFile[0]->CheckConsistencyWithAnotherBedDataFile(p_DataFile[bed]))
2319 int bed_index_problem = bed + 1;
2320 if (invert_datafile_bed_order_flag) bed_index_problem = nb_beds - bed;
2321 Cerr(
"***** castor-recon() -> A problem occurred while checking consistency between first bed and bed " << bed_index_problem <<
" !" << endl);
2328 Cerr(
"***** castor-recon() -> A problem occurred while dealing with the bed positions !" << endl);
2332 if (verbose_general>=5)
Cout(
"----- DataFile initialization OK -----" << endl);
2335 if (verbose_general>=5)
Cout(
"----- Dynamic Data Manager initialization ... -----" << endl);
2338 if (p_ImageDimensionsAndQuantification->
InitDynamicData(path_to_4D_data_splitting_file,
2339 !resp_motion_options.empty(),
2340 !card_motion_options.empty(),
2341 !ipat_motion_options.empty(),
2345 Cerr(
"***** castor-recon() -> A problem occurred while initializing Dynamic data manager's class !" << endl);
2350 int64_t nb_events = 0;
2355 Cerr(
"***** castor-recon() -> A problem occurred while checking Dynamic data manager's parameters !" << endl);
2361 Cerr(
"***** castor-recon() -> A problem occurred while initializing specific dynamic quantification factors!" << endl);
2365 if (verbose_general>=5)
Cout(
"----- Dynamic Data Manager initialization OK -----" << endl);
2372 if (verbose_general>=5)
Cout(
"----- Projector initialization ... -----" << endl);
2383 p_ProjectorManager->
SetVerbose(verbose_proj);
2387 Cerr(
"***** castor-recon() -> A problem occurred while checking projector manager's parameters !" << endl);
2393 Cerr(
"***** castor-recon() -> A problem occurred while initializing projector manager !" << endl);
2399 Cerr(
"***** castor-recon() -> A problem occurred while checking projector's compatibility with SPECT and attenuation correction !" << endl);
2403 if (verbose_general>=5)
Cout(
"----- Projector initialization OK -----" << endl);
2410 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization (if any) ... -----" << endl);
2415 p_DynamicModelManager->
SetOptions(dynamic_model_options);
2416 p_DynamicModelManager->
SetVerbose(verbose_dyna);
2421 Cerr(
"***** castor-recon() -> A problem occurred while checking dynamic model manager's parameters !" << endl);
2425 int DynamicModelinitialisation = p_DynamicModelManager->
Initialize();
2426 if (DynamicModelinitialisation ==1)
2428 Cerr(
"***** castor-recon() -> A problem occurred while initializing dynamic model manager !" << endl);
2432 else if (DynamicModelinitialisation ==2)
2434 Cout(
"----- Dynamic model: No parameters given - setting diagonal basis functions !" << endl);
2438 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization OK -----" << endl);
2446 if (verbose_general>=5)
Cout(
"----- Optimizer initialization ... -----" << endl);
2452 p_OptimizerManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2453 p_OptimizerManager->
SetDataType(p_DataFile[0]->GetDataType());
2454 p_OptimizerManager->
SetDataSpec(p_DataFile[0]->GetDataSpec());
2460 p_OptimizerManager->
SetVerbose(verbose_opti);
2464 Cerr(
"***** castor-recon() -> A problem occurred while checking optimizer manager's parameters !" << endl);
2470 Cerr(
"***** castor-recon() -> A problem occurred while initializing optimizer manager !" << endl);
2474 if (verbose_general>=5)
Cout(
"----- Optimizer initialization OK -----" << endl);
2481 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization (if any) ... -----" << endl);
2485 p_ImageConvolverManager->
SetVerbose(verbose_conv);
2487 p_ImageConvolverManager->
SetOptions(options_image_convolver);
2491 Cerr(
"***** castor-recon() -> A problem occurred while checking image convolver manager's parameters !" << endl);
2497 Cerr(
"***** castor-recon() -> A problem occurred while initializing image convolver manager !" << endl);
2501 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization OK -----" << endl);
2508 if (verbose_general>=5)
Cout(
"----- Image Processing initialization (if any) ... -----" << endl);
2512 p_ImageProcessingManager->
SetVerbose(verbose_proc);
2514 p_ImageProcessingManager->
SetOptions(options_image_processing);
2518 Cerr(
"***** castor-recon() -> A problem occurred while checking image processing manager's parameters !" << endl);
2524 Cerr(
"***** castor-recon() -> A problem occurred while initializing image processing manager !" << endl);
2528 if (verbose_general>=5)
Cout(
"----- Image Processing initialization OK -----" << endl);
2536 if (verbose_general>=5)
Cout(
"----- Image deformation initialization (if any) ... -----" << endl);
2541 p_DeformationManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2543 if(resp_motion_options !=
"")
2545 p_DeformationManager->
SetOptions(resp_motion_options);
2549 else if (card_motion_options !=
"")
2551 p_DeformationManager->
SetOptions(card_motion_options);
2555 else if (double_motion_options !=
"")
2557 p_DeformationManager->
SetOptions(double_motion_options);
2561 else if (ipat_motion_options !=
"")
2563 p_DeformationManager->
SetOptions(ipat_motion_options);
2570 p_DeformationManager->
SetVerbose(verbose_defo);
2574 Cerr(
"***** castor-recon() -> A problem occurred while checking image deformation manager's parameters !" << endl);
2580 Cerr(
"***** castor-recon() -> A problem occurred while initializing image deformation manager !" << endl);
2584 if (verbose_general >=5)
Cout(
"----- Image deformation initialization OK -----" << endl);
2603 if ( path_to_sensitivity_img.empty() && (p_DataFile[0]->
GetDataMode()==
MODE_LIST || sensitivity_from_histogram) )
2606 if (verbose_general>=5)
Cout(
"----- Image Sensitivity generation initialization ... -----" << endl);
2626 Cerr(
"***** castor-recon() -> A problem occurred while checking parameters of the sensitivity generator !" << endl);
2632 Cerr(
"***** castor-recon() -> A problem occurred while initializing the sensitivity generator !" << endl);
2638 if (p_Sensitivity->
Launch())
2640 Cerr(
"***** castor-recon() -> A problem occurred while computing the sensitivity !" << endl);
2650 else path_to_sensitivity_img =
"";
2652 delete p_Sensitivity;
2654 if (exit_after_sensitivity)
2656 if (verbose_general>=
VERBOSE_LIGHT)
Cout(
"castor-recon() -> Asked to exit after sensitivity computation." << endl);
2658 delete p_ImageSpace;
2659 delete p_DeformationManager;
2660 delete p_DynamicModelManager;
2661 delete p_ImageProcessingManager;
2662 delete p_ImageConvolverManager;
2663 delete p_OptimizerManager;
2664 delete p_ProjectorManager;
2665 for (
int i=0 ; i<nb_beds ; i++)
delete p_DataFile[i];
2666 delete[] p_DataFile;
2667 delete p_ImageDimensionsAndQuantification;
2682 if (verbose_general>=5)
Cout(
"----- Iterative reconstruction algorithm initialization ... -----" << endl);
2686 string algorithm_options =
"";
2693 if (!options_prob.empty())
2695 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization ... -----" << endl);
2700 p_ChronoManager->
SetVerbose(verbose_general);
2703 Cerr(
"***** castor-recon() -> A problem occured while checking parameters for the chrono manager !" << endl);
2708 Cerr(
"***** castor-recon() -> A problem occured while initializing the chrono manager !" << endl);
2712 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization OK -----" << endl);
2716 algorithm_options = options_prob;
2718 else if (!options_optimizer.empty())
2724 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization ... -----" << endl);
2730 p_ChronoManager->
SetVerbose(verbose_general);
2733 Cerr(
"***** castor-recon() -> A problem occured while checking parameters for the chrono manager !" << endl);
2738 Cerr(
"***** castor-recon() -> A problem occured while initializing the chrono manager !" << endl);
2742 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization OK -----" << endl);
2771 Cerr(
"***** castor-recon() -> Error while setting the numbers of iterations and subsets !" << endl);
2776 Cerr(
"***** castor-recon() -> Error while setting the selected output iterations !" << endl);
2781 Cerr(
"***** Error while setting specific options for this algorithm !" << endl);
2784 if (p_Algorithm->
Run())
2786 Cerr(
"***** castor-recon() -> Error while performing the reconstruction" << endl);
2798 if (verbose_general>=5)
Cout(
"----- Deleting CASToR objects ... -----" << endl);
2801 delete p_ImageSpace;
2802 delete p_DeformationManager;
2803 delete p_DynamicModelManager;
2804 delete p_ImageProcessingManager;
2805 delete p_ImageConvolverManager;
2806 delete p_OptimizerManager;
2807 delete p_ProjectorManager;
2811 if (verbose_general>=5)
Cout(
"----- CASToR objects successfully deleted -----" << endl);
2814 if (verbose_general>=1)
Cout(endl);
2818 return EXIT_SUCCESS;
void SetDataFile(vDataFile **a2p_DataFile)
void SetDataMode(int a_dataMode)
void SetIgnorePOIFlag(bool a_ignorePOIFlag)
void SetVerbose(int a_verboseLevel)
void SetOptionsPenalty(const string &a_optionsPenalty, FLTNB a_penaltyStrength)
This class is designed to be a mother virtual class for DataFile.
static sScannerManager * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
void SetDataSpec(int a_dataSpec)
void SetGPUflag(bool a_flagGPU)
static sRandomNumberGenerator * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
void SetNbCardGates(int a_nbCardGates)
void SetNumberOfAtnGateImages(int a_nbAtnRespGateImages, int a_nbAtnCardGateImages)
virtual int InitSpecificOptions(string a_specificOptions)
void SetVerbose(int a_verbose)
static void ShowCommonHelp()
This function is used to print out some help about the use of options common to all projectors...
void SetVerbose(int a_verboseLevel)
int ReadStringOption(const string &a_input, T *ap_return, int a_nbElts, const string &sep, const string &a_option)
Parse the 'a_input' string corresponding to the 'a_option' into 'a_nbElts' elements, using the 'sep' separator. The results are returned in the templated 'ap_return' dynamic templated array. Call "ConvertFromString()" to perform the correct conversion depending on the type of the data to convert.
void SetDynamicModelManager(oDynamicModelManager *ap_DynamicModelManager)
void SetSaveSubsetImageFlag(bool a_saveImageAfterSubsets)
int SetNbIterationsAndSubsets(const string &a_nbIterationsSubsets)
int InitMaskImage(const string &a_pathToImage)
void ShowHelpDynamicModel()
Show help about all implemented dynamic models.
void ShowHelpDeformation()
Show help about all implemented deformations.
void SetOptionsCommon(const string &a_optionsCommon)
int Initialize()
A function used to initialize the manager and the projectors or system matrices it manages...
static void ShowCommonHelp()
This function does not take any parameter and is used to display some help about the syntax of the op...
int Initialize()
A public function used to initialize the sensitivity generator.
void SetImageConvolverManager(oImageConvolverManager *ap_ImageConvolverManager)
void SetScanner(vScanner *ap_Scanner)
void SetPathToAttenuationImage(string a_pathToAttenuationImage)
void SetVerbose(int a_verboseLevel)
int FindScannerSystem(string a_scannerName)
int CheckParameters()
Check validity of all parameters.
void SetFOVSizeX(FLTNB a_fovSizeX)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
void SetPathInitImage(string a_pathToInitialImage)
int BuildScannerObject()
Instantiate the specific scanner object related to the modality, and set verbosity of scanner object...
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
string GetPathToSensitivityImage()
This function return the path to the sensitivity image.
void SetVoxSizeY(FLTNB a_voxSizeY)
void SetOptionsForward(const string &a_optionsForward)
void ShowHelpMiscellaneous()
int CheckParameters()
A function used to check the parameters settings.
void SetOptimizerManager(oOptimizerManager *ap_OptimizerManager)
This class is designed to manage the optimization part of an iterative reconstruction.
void CheckNumberOfProjectionThreadsConsistencyWithDataFileSize(vDataFile **a2p_DataFile)
void SetOffsetZ(FLTNB a_offsetZ)
void ShowHelpImageProcessingModule()
Show help about all implemented image processing modules.
void SetProjectorManager(oProjectorManager *ap_ProjectorManager)
void SetVerbose(int a_verboseLevel)
int Run()
Just call either the RunCPU or the RunGPU function as asked for.
int DealWithBedPositions(vDataFile **a2p_DataFile)
void SetVoxSizeX(FLTNB a_voxSizeX)
void SetSensitivityModeOff()
Say that the projector will no longer be used to compute the global sensitivity.
void SetNbRespGates(int a_nbRespGates)
void SetNbVoxY(INTNB a_nbVoxY)
void ShowHelpComputation()
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
int Launch()
A public function used to launch the sensitivity generator (compute the sensitivity image) ...
int Initialize()
A function used to initialize the manager and all image processing modules it manages.
string GetPathToScannerFile()
void SetVerbose(int a_verboseLevel)
Set verbosity level.
void ShowHelpPenalty()
Show help about all implemented penalties.
int Initialize()
Set the dynamic model flag and instanciate/initialize model objects through the ParseOptionsAndInitia...
static sOutputManager * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
void SetVerbose(int a_verboseLevel)
void SetDataType(int a_dataType)
void SetSaveLUTFlag(bool a_flag)
void SetNbCustomSteps(int a_nbCustomSteps)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
int Initialize()
A function used to initialize the manager and the optimizer it manages.
void SetNbRespBasisFunctions(int a_nbRespBasisFunctions)
int CheckParameters()
Check if all parameters have been correctly initialized, and call the CheckParameters function of the...
int SetNbThreads(const string &a_nbThreads)
void DeallocateMaskImage()
Free memory for the mask image.
void SetOptionsOptimizer(const string &a_optionsOptimizer)
int SetOutNbPrec(string a_format)
int InstantiateScanner()
Instantiate scanner using the related function in the scanner classes.
int LogCommandLine(int argc, char **argv)
void SetPathToAttenuationImage(string a_pathToAttenuationImage)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
static sAddonManager * GetInstance()
void SetFOVSizeY(FLTNB a_fovSizeY)
void SetOptimizerFOMFlag(bool a_optimizerFOMFlag)
void SetDeformationManager(oDeformationManager *ap_DeformationManager)
#define FIXED_LIST_COMPUTATION_STRATEGY
void SetNbVoxZ(INTNB a_nbVoxZ)
int CheckConfigDir(const string &a_path)
void SetOffsetY(FLTNB a_offsetY)
void SetGPUflag(bool a_flagGPU)
int CheckParameters()
A function used to check the parameters settings.
void SetNbBeds(int a_nbBeds)
#define SCANNER_SPECT_CONVERGENT
void SetImageConvolverManager(oImageConvolverManager *ap_ImageConvolverManager)
int BuildLUT()
Call the eponym function of the scanner class.
int GetNbIPatMotionSubsets()
call the eponym function from the oDynamicDataManager object
int Initialize()
A function used to initialize all that is needed.
Singleton class that manages output writing on disk (images, sinograms, etc). It also manages loggi...
void SetComputationStrategy(int a_computationStrategy)
void SetNbCardBasisFunctions(int a_nbCardBasisFunctions)
void SetNbThreads(int a_nbThreadsForProjection, int a_nbThreadsForImageComputation)
void SetProjectorManager(oProjectorManager *ap_ProjectorManager)
void SetOptionsBackward(const string &a_optionsBackward)
This class is designed to manage the use of dynamic model in the reconstruction.
void ShowHelpCorrection()
void SetFOVSizeZ(FLTNB a_fovSizeZ)
RCP-GS : Random Clustering Prior - Gibbs Sampler.
void SetDataFile(vDataFile *ap_DataFile)
int GetNbThreadsMax()
Get the maximum between the number of threads used for projections and image operations.
Singleton class that Instantiate and initialize the scanner object.
void SetVerbose(int a_verboseLevel)
int Initialize(int a_nbThreads, int a_nbExtra)
Instantiate pseudo random number generators, one per thread by default, and additional extra ones if ...
void SetComputeFromHistogramFlag(bool a_computeFromHistogramFlag)
void SetSaveDynamicBasisCoefficientImages(bool a_saveDynamicBasisCoefficients)
int CheckParameters()
A function used to check the parameters settings.
void SetImageProcessingManager(oImageProcessingManager *ap_ImageProcessingManager)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Inherit from vDataFile. Class that manages the reading of a SPECT input file (header + data)...
This class is designed to manage the different image convolvers and to apply them.
void SetHeaderDataFileName(const string &a_headerFileName)
vScanner * GetScannerObject()
int CheckParameters()
A function used to check the parameters settings.
void SetUseModelInReconstruction(bool a_useModelInReconstruction)
void SetSensitivityModeOn()
Say that the projector will be used to compute the global sensitivity.
void SetMergeDynImagesFlag(bool a_flag)
void SetNbTOFBins(int a_nbTOFBins)
void SetMPIRank(int a_mpiRank)
int InitDynamicData(string a_pathTo4DDataSplittingFile, int a_respMotionCorrectionFlag, int a_cardMotionCorrectionFlag, int a_invMotionCorrectionFlag, int a_nbRespGates, int a_nbCardGates)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
void ShowHelpProjector()
Show help about all implemented projectors.
#define KEYWORD_MANDATORY
bool GetNeedGlobalSensitivity()
Get the boolean saying if the sensitivity has to be computed globally.
int CheckParameters()
A function used to check the parameters settings.
void ShowHelpDimensions()
void SetImageSpace(oImageSpace *ap_ImageSpace)
static void ShowCommonHelp()
This function does not take any parameter and is used to display some help about the syntax of the op...
int CheckParameters()
This function is used to check parameters after the latter have been all set using Set functions...
Singleton class that generate a thread-safe random generator number for openMP As singleton...
void IntfKeyInitFields(Intf_fields *ap_IF)
Init the file of an Interfile fields structure passed in parameter to their default values...
void SetIgnoredCorrections(const string &a_ignoredCorrectionsList)
void SetFOVOutMasking(FLTNB a_fovOutPercent, INTNB a_nbSliceOutMask)
void SetSaveSensitivityHistoFlag(bool a_saveSensitivityHistoFlag)
int Initialize()
Initialization : .
void SetNbBeds(int a_nbBeds)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ID)
void SetVoxSizeZ(FLTNB a_voxSizeZ)
int ProcessAndSetMask(FLTNB *ap_maskImage)
int Initialize()
Initialize all thread-safe buffers for profiling.
void SetPathToNormalizationFileName(vector< string > ap_pathToNormalizationFileName, bool a_inverseDataFileOrderFlag)
int CheckDynamicParameters(int64_t a_nbEvents)
This class is designed to manage the different image processing modules and to apply them...
void SetPathToMultiModalImage(vector< string > a_pathToMultiModalImage)
This class is designed to manage the projection part of the reconstruction.
int GetNbTOFBins()
Get the number of TOF bins associated to the projector.
Interfile fields. This structure contains all the Interfile keys currently managed by CASToR Decl...
void SetBedIndex(int a_bedIndex)
This is the base class for reconstructions, containing a framework with iteration and data subset loo...
void SetOptions(vector< string > a_options)
void GetUserEndianness()
Check user/host computer endianness and write it to the global variable User_Endianness.
void SetCardBasisFunctionsFile(const string &a_cardBasisFunctionsFile)
This class holds all the matrices in the image domain that can be used in the algorithm: image...
void SetVerbose(int a_verbose)
int GetNbThreadsForImageComputation()
Get the number of threads used for image operations.
int SetOutputIterations(const string &a_outputIterations)
int InitOutputDirectory(const string &a_pathFout, const string &a_pathDout)
int ConvertFromString(const string &a_str, string *a_result)
Copy the 'a_str' string in the position pointed by 'a_result'.
void ShowHelpSpecific()
Show help for the child algorithm.
int CheckParameters()
A public function used to check the parameters settings.
Inherit from vDataFile. Class that manages the reading of a CT input file (header + data)...
void SetOptions(vector< string > a_options)
void SetNbVoxX(INTNB a_nbVoxX)
void SetScanner(vScanner *ap_Scanner)
void SetOffsetX(FLTNB a_offsetX)
This class is designed to manage all dimensions and quantification related stuff. ...
int GetNbThreadsForProjection()
Get the number of threads used for projections.
void SetDataFile(vDataFile **a2p_DataFile)
int main(int argc, char **argv)
void SetOptions(const string &a_options)
void SetImageSpace(oImageSpace *ap_ImageSpace)
void SetImageSpace(oImageSpace *ap_ImageSpace)
void SetVerbose(int a_verboseLevel)
void SetFrames(const string &a_frameList)
int CheckSPECTAttenuationCompatibility(const string &a_pathToAttenuationImage)
This class is designed to manage some profiling of the code.
void SetDataFileName(vector< string > ap_dataFileName)
void SetNbMultiModalImages(int a_nbMultiModalImages)
int IntfReadHeader(const string &a_pathToHeaderFile, Intf_fields *ap_IntfFields, int vb)
Read an Interfile header.
void ShowHelpOptimizer()
Show help about all implemented optimizers.
void SetVerbose(int a_verbose)
void SetDeformationManager(oDeformationManager *ap_DeformationManager)
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...
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Inherit from vDataFile. Class that manages the reading of a PET input file (header + data)...
int GetGeometricInfoFromDataFile(string a_pathToDataFilename)
void SetMPIRankAndSize(int a_mpiRank, int a_mpiSize)
void SetRespBasisFunctionsFile(const string &a_respBasisFunctionsFile)
static sChronoManager * GetInstance()
Instantiate the singleton if not already done, then return the pointer to its instance.
void SetVerbose(int a_verboseLevel)
This class is designed to manage the computation of the sensitivity image.
void SetVerbose(int a_verboseLevel)
void SetVerbose(int a_verboseLevel)
void SetOptimizerImageStatFlag(bool a_optimizerImageStatFlag)
int SetFlipOut(const string &a_flipOut)
void SetPathToSensitivityImage(string a_pathToSensitivityImage)
int Initialize()
A function used to initialize the manager and all image convolvers it manages.
#define KEYWORD_OPTIONAL_ERROR
int SetDynamicSpecificQuantificationFactors(const string &a_quantificationFile)
void ShowHelpImageConvolver()
Show help about all implemented image convolvers.
void Display()
Display the results of the duration buffers.