69 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
70 if (mpi_rank!=0)
return;
74 cout <<
"Usage: castor-recon.exe -df file.cdh -(f/d)out output -it iter [settings]" << endl;
76 cout <<
"[Main options]:" << endl;
77 cout <<
" -df file.cdh : Give an input CASTOR datafile header (no default)." << endl;
80 cout <<
" -fout name : Give the root name for all output files (no default, alternative to -dout)" << endl;
81 cout <<
" -dout name : Give the name of the output directory where all output files will be written (no default, alternative to -fout)" << endl;
82 cout <<
" -it list : Give the sequence of iterations:subsets separated by commas (no default)." << endl;
83 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
84 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;
85 cout <<
" the voxel sizes provided using '-vox')." << endl;
86 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;
87 cout <<
" if a fov value is provided using '-fov')." << endl;
88 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
90 cout <<
"[Specific options]:" << endl;
91 cout <<
" -help-dim : Print out specific help about dimensions settings." << endl;
92 cout <<
" -help-in : Print out specific help about input settings." << endl;
93 cout <<
" -help-out : Print out specific help about output settings." << endl;
94 cout <<
" -help-algo : Print out specific help about reconstruction optimizer algorithm settings." << endl;
95 cout <<
" -help-proj : Print out specific help about projection operators." << endl;
96 cout <<
" -help-dynamic : Print out specific help about dynamic methodologies settings." << endl;
97 cout <<
" -help-imgp : Print out specific help about image processing modules." << endl;
98 cout <<
" -help-comp : Print out specific help about computing settings." << endl;
99 cout <<
" -help-corr : Print out specific help about all corrections that can be disabled." << endl;
100 cout <<
" -help-misc : Print out specific help about miscellaneous and verbose settings." << endl;
102 cout <<
"[Implemented Modules]:" << endl;
103 cout <<
" -help-scan : Show the list of all scanners from the configuration directory." << endl;
104 cout <<
" -help-projm : Show the list and description of all implemented projectors." << endl;
105 cout <<
" -help-opti : Show the list and description of all implemented optimizer algorithms." << endl;
109 cout <<
" -help-conv : Show the list and description of all implemented image convolvers." << endl;
110 cout <<
" -help-proc : Show the list and description of all implemented image processing modules." << endl;
113 cout <<
" --help,-h,-help : Print out this help page." << endl;
116 cout <<
" Compiled with MPI" << endl;
119 cout <<
" Compiled with OpenMP" << endl;
122 cout <<
" Compiled for GPU" << endl;
124 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU)
128 cout <<
" Build date: " << BUILD_DATE << endl;
131 #ifdef CASTOR_VERSION
132 cout <<
" This program is part of the CASToR release version " <<
CASTOR_VERSION <<
"." << endl;
150 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
151 if (mpi_rank!=0)
return;
155 cout <<
"[Input settings]:" << endl;
164 cout <<
" -df file.Cdf : Give an input CASTOR datafile header (no default)." << endl;
166 cout <<
" -img file.hdr : Give an input image as the initialization of the algorithm (default: uniform value)." << endl;
168 cout <<
" -sens file.hdr : Provide the sensitivity image (default: sensitivity image is computed before reconstruction)." << endl;
169 cout <<
" The image file should integrate all sensitivity images if more than one are required. If dual-gating is enabled and if it" << endl;
170 cout <<
" requires sensitivity images for each gate, the image should integrate nb_resp_gates * nb_card_gates sensitivity images" << endl;
171 cout <<
" (all cardiac-gated based sensitivity images for each one of the respiratory gates)." << endl;
173 cout <<
" -multimodal file.hdr : Provide additional images, from other modalities (anatomical, functional), or processed, for use in constrained recon " << endl;
174 cout <<
" To provide several additional images for a single reconstructed image, the option should be used several times, new option for new image file " << endl;
176 cout <<
" -mask file.hdr : Provide a mask image. The mask image is used in the projection, which requires the application of this same mask to the sensitivity, to avoid border issues. " << endl;
178 cout <<
" -norm file.cdh : For list-mode data, provide a normalization data file for sensitivity computation (default: use the scanner LUT and" << endl;
179 cout <<
" assume all LORs with a weight of 1.). This restricts the computation of the sensitivity to the LORs provided in the" << endl;
180 cout <<
" normalization file and associated normalization factors and/or attenuation factors." << endl;
181 cout <<
" For dynamic reconstructions with multiple frames, as many normalization files as frames can be supplied, their names" << endl;
182 cout <<
" separated by commas. This is useful when dead-times correction is included in the normalization factors." << endl;
185 cout <<
" -atn file.hdr : Give an input attenuation image (unit has to be cm-1) for sensitivity image generation or SPECT attenuation correction." << endl;
187 cout <<
" -help-in : Print out this help." << endl;
204 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
205 if (mpi_rank!=0)
return;
209 cout <<
"[Output settings]:" << endl;
211 cout <<
" -fout name : Give the root name for all output files. All output files will be written as 'name_suffix.ext'." << endl;
212 cout <<
" So the provided name should not end with '.' or '/' character. (no default, alternative to -dout)" << endl;
213 cout <<
" -dout name : Give the name of the output directory where all output files will be written. All files will also" << endl;
214 cout <<
" be prefixed by the name of the directory. The provided name should not end with '.' or '/' character." << endl;
215 cout <<
" (no default, alternative to -fout)" << endl;
217 cout <<
" -oit list : Give the sequence of output iterations as a list of 'a:b' pairs separated by commas. This will output one" << endl;
218 cout <<
" iteration over 'a' until 'b' is reached, then it goes to the next pair of setting." << endl;
219 cout <<
" Set '-1' to save only the last iteration. (default: save all iterations)" << endl;
221 cout <<
" -onbp prec : By default, numbers are displayed using scientific format. This option allows to customize the format and precision" << endl;
222 cout <<
" : The format is format,precision. f is the format (s=scientific, f=fixed), p is the precision" << endl;
223 cout <<
" eg: -onbp f,5 --> fixed with 5 digits precision, -onbp --> scientifici with max precision." << endl;
225 cout <<
" -omd : (M)erge (D)ynamic images. Indicate if a dynamic serie of 3D images should be written on disk in one file" << endl;
226 cout <<
" instead of a serie of 3D images associated with an interfile metaheader" << endl;
232 cout <<
" -osens : Flag to say that we want to save the sensitivity image of each subset/iteration, when in histogram mode." << endl;
234 cout <<
" -osub : Flag to say that we want to save the image after each subset." << endl;
236 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;
238 cout <<
" -sens-histo : If input file is a histogram, compute the global sensitivity from it (and still proceed to normal reconstruction after)" << endl;
240 cout <<
" -sens-only : For list-mode data, exit directly after computing and saving the sensitivity." << endl;
242 cout <<
" -help-out : Print out this help." << endl;
259 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
260 if (mpi_rank!=0)
return;
264 cout <<
"[Dimensions options]:" << endl;
266 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
268 cout <<
" -fov x,y,z : Give the size of the field-of-view in each dimension, in mm (default: those of the scanner)." << endl;
270 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;
272 cout <<
" -off x,y,z : Give the offset of the field-of-view in each dimension, in mm (default: 0.,0.,0.)." << endl;
273 cout <<
" (note this has no effect when using a pre-computed system matrix)" << endl;
275 cout <<
" -fov-out percent : Give the percentage of the eliptical transaxial FOV to be kept while saving the image (default: no making)" << endl;
277 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;
279 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;
281 cout <<
" -help-dim : Print out this help." << endl;
298 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
299 if (mpi_rank!=0)
return;
302 cout <<
"[Algorithm settings]:" << endl;
304 cout <<
" -opti param : Give the algorithm to be used, along with a configuration file (algo:file.conf) or the list of parameters" << endl;
305 cout <<
" associated to the algorithm (algo,param1,param2,...). If the algorithm only is specified, the default" << endl;
306 cout <<
" configuration file is used if any. By default, the MLEM algorithm is used. For specific help, use option -help-opti." << endl;
308 cout <<
" -opti-fom : Flag to say that we want to compute and print figures-of-merit (likelihood and RMSE) in the data-space." << endl;
310 cout <<
" -opti-stat : Flag to say that we want to compute and print basic statistics about the image update." << endl;
318 cout <<
" -help-opti : Print out specific help about algorithm settings." << endl;
339 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
340 if (mpi_rank!=0)
return;
343 cout <<
"[Projector settings]:" << endl;
345 cout <<
" -proj param : Give the projector to be used for both forward and backward projections, along with a configuration file (proj:file.conf)" << endl;
346 cout <<
" or the list of parameters associated to the projector (proj,param1,param2,...). If the projector only is specified, the" << endl;
347 cout <<
" default configuration file is used. By default, the Siddon projector is used. For specific help, use option -help-proj." << endl;
349 cout <<
" -projF param : Give the projector to be used for forward projections. See option -proj for details." << endl;
351 cout <<
" -projB param : Give the projector to be used for backward projections. See option -proj for details." << endl;
353 cout <<
" -proj-common : Give parameterization of different common projector-related options." << endl;
359 cout <<
" -ignore-TOF : Flag to say that we want to ignore any potential TOF information (default: use it if present in the datafile)." << endl;
361 cout <<
" -help-projm : Print out specific help about projector settings." << endl;
378 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
379 if (mpi_rank!=0)
return;
382 cout <<
"[Image processing settings]:" << endl;
384 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;
385 cout <<
" list of parameters associated to the convolver (conv,param1,param2,...::when). If the convolver only is specified, its default" << endl;
386 cout <<
" configuration file is used. By default, no convolver is applied. Multiple convolvers can be combined simply by repeating this" << endl;
387 cout <<
" this option. The mandatory 'when' parameter specifies when the convolver is applied (psf, sieve, forward, backward, post, intra)." << endl;
388 cout <<
" For more specific help, use option -help-conv." << endl;
390 cout <<
" -help-conv : Print out specific help about the image convolver settings." << endl;
392 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;
393 cout <<
" list of parameters associated to the module (proc,param1,param2,...;when). If the module only is specified, its default" << endl;
394 cout <<
" configuration file is used. By default, no image processing module is applied. Multiple modules can be combined simply by" << endl;
395 cout <<
" repeating this this option. The mandatory 'when' parameter specifies when the module is applied (forward, backward, post, intra)." << endl;
396 cout <<
" For more specific help, use option -help-proc." << endl;
398 cout <<
" -help-proc : Print out specific help about the image processing module settings." << endl;
415 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
416 if (mpi_rank!=0)
return;
420 cout <<
"[Dynamic settings]:" << endl;
422 cout <<
" -frm list : Give the framing for the reconstruction where 'list' is a list of all frames durations in seconds separated" << endl;
423 cout <<
" by commas. To specify a dead frame, add 'df' concatenated to the frame duration. Milliseconds maximum precision." << endl;
424 cout <<
" (default: 1 frame of the whole input file duration)" << endl;
426 cout <<
" -g path_to_file : Provide text file for dynamic data splitting associated to respiratory/cardiac gating or involuntary patient motion correction" << endl;
461 cout <<
" -help-dynamic : Print out this help." << endl;
478 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
479 if (mpi_rank!=0)
return;
483 cout <<
"[Computation settings]:" << endl;
486 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;
487 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;
491 cout <<
" -gpu : Flag to say that we want to use the GPU device (default: use the CPU only)." << endl;
494 cout <<
" -load size : Give a number between 0 and 100 to specify the number of events which will be loaded in the RAM." << endl;
495 cout <<
" It will be interpreted as a percent ratio (default: 100 means all data buffered. 0 means no data buffered.)" << endl;
497 cout <<
" -proj-comp : Give the strategy for projection line computation. Here are the three different strategies that can be used:" << endl;
498 cout <<
" 1 : Image-based system matrix elements storage: The voxels weights are added in a matrix representing the whole image, so" << endl;
499 cout <<
" the addition of a new line to the previous ones is straightforward only by adding the weights to the corresponding voxels." << endl;
500 cout <<
" As it is insanely long, it can possibly be used for example with extremely complex projectors that makes use of huge number" << endl;
501 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;
502 cout <<
" This strategy is not compatible with SPECT reconstruction including attenuation correction." << endl;
503 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;
504 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;
505 cout <<
" has a fixed size which is provided by the EstimateMaxNumberOfVoxelsPerLine() function from the vProjector class. There are no" << endl;
506 cout <<
" ckecks at all for possible buffer overflows. This is the fastest strategy and default one." << endl;
507 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;
508 cout <<
" upgraded if the current number of contributing voxels exceed the list's size. The first allocated size corresponds to the diagonal" << endl;
509 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;
510 cout <<
" is a bit slower than the fixed-list strategy during the first iteration, but is optimal with respect to RAM usage." << endl;
512 cout <<
" -rng-seed : Give a seed for the random number generator (should be >=0)" << endl;
514 cout <<
" -rng-extra : Give the number of additional random number generators, if needed (in addition to one rng per thread) " << endl;
516 cout <<
" -help-comp : Print out this help." << endl;
519 cout <<
" Compiled with MPI" << endl;
522 cout <<
" Compiled with OpenMP" << endl;
525 cout <<
" Compiled for GPU" << endl;
527 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU)
545 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
546 if (mpi_rank!=0)
return;
550 cout <<
"[Miscellaneous settings]:" << endl;
552 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
553 cout <<
" -vb-algo : Give the verbose level specific to the algorithm (default: same as general verbose level)." << endl;
554 cout <<
" -vb-opti : Give the verbose level specific to the optimizer (default: same as general verbose level)." << endl;
555 cout <<
" -vb-proj : Give the verbose level specific to the projector (default: same as general verbose level)." << endl;
556 cout <<
" -vb-conv : Give the verbose level specific to the image convolver (default: same as general verbose level)." << endl;
557 cout <<
" -vb-proc : Give the verbose level specific to the image processing (default: same as general verbose level)." << endl;
558 cout <<
" -vb-scan : Give the verbose level specific to the scanner (default: same as general verbose level)." << endl;
559 cout <<
" -vb-data : Give the verbose level specific to the data and image management (default: same as general verbose level)." << endl;
560 cout <<
" -vb-defo : Give the verbose level specific to the deformation (default: same as general verbose level)." << endl;
561 cout <<
" -vb-dyna : Give the verbose level specific to the dynamic model (default: same as general verbose level)." << endl;
562 cout <<
" -vb-sens : Give the verbose level specific to the sensitivity computation (default: same as general verbose level)." << endl;
564 cout <<
" -conf : Give the path to the CASToR config directory (default: located through the CASTOR_CONFIG environment variable)." << endl;
566 cout <<
" -help-misc : Print out this help." << endl;
583 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
584 if (mpi_rank!=0)
return;
588 cout <<
"[Correction settings]:" << endl;
590 cout <<
" -ignore-corr list : Give the list of corrections that should be ignored, separated by commas (default: all corrections applied if present)." << endl;
591 cout <<
" Here is a list of all corrections that can be ignored:" << endl;
592 cout <<
" - attn: to ignore the attenuation correction (emission only)" << endl;
593 cout <<
" - norm: to ignore the normalization correction (emission only)" << endl;
594 cout <<
" - rand: to ignore the random correction (PET only)" << endl;
595 cout <<
" - scat: to ignore the scatter correction" << endl;
596 cout <<
" - deca: to ignore the decay correction (emission only)" << endl;
597 cout <<
" - brat: to ignore the branching ratio correction (emission only)" << endl;
598 cout <<
" - fdur: to ignore the frame duration correction (emission only)" << endl;
599 cout <<
" - cali: to ignore the calibration correction (emission only)" << endl;
611 int main(
int argc,
char** argv)
619 MPI_Init(&argc, &argv);
620 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
621 MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
640 INTNB nb_voxX=-1, nb_voxY=-1, nb_voxZ=-1;
641 FLTNB fov_sizeX=-1., fov_sizeY=-1., fov_sizeZ=-1.;
642 FLTNB vox_sizeX=-1., vox_sizeY=-1., vox_sizeZ=-1.;
644 FLTNB offsetX = 0., offsetY = 0., offsetZ = 0.;
648 string flip_out =
"";
655 string frame_list =
"";
657 int nb_resp_gates = 1;
659 int nb_card_gates = 1;
661 string path_to_4D_data_splitting_file =
"";
663 string dynamic_model_options =
"";
665 string resp_motion_options =
"";
667 string card_motion_options =
"";
669 string double_motion_options =
"";
671 string ipat_motion_options =
"";
673 int nb_time_basis = 1;
674 string path_to_time_basis_coef =
"";
676 int nb_resp_basis = 1;
677 string path_to_resp_basis_coef =
"";
679 int nb_card_basis = 1;
680 string path_to_card_basis_coef =
"";
682 string path_to_dynamic_quantification_file=
"";
691 vector<string> path_to_data_filename;
693 bool invert_datafile_bed_order_flag =
false;
695 string path_to_initial_img =
"";
697 string path_to_sensitivity_img;
699 vector<string> path_to_normalization_filename;
701 string path_to_attenuation_img;
703 vector<string> path_to_multimodal_img;
705 string path_to_mask_img =
"";
707 int nb_atn_resp_imgs = 1;
708 int nb_atn_card_imgs = 1;
710 string ignored_corrections =
"";
717 string path_dout =
"";
719 string path_fout =
"";
721 string output_iterations =
"";
723 bool merge_dynamic_imgs_flag =
false;
725 bool save_LUT_flag =
false;
727 bool save_sens_histo =
false;
729 bool save_subset_image =
false;
733 bool exit_after_sensitivity =
false;
735 bool sensitivity_from_histogram =
false;
737 string onb_prec =
"s,0";
744 string options_projector =
"incrementalSiddon";
745 string options_projectorF =
"incrementalSiddon";
746 string options_projectorB =
"incrementalSiddon";
747 string options_projector_common =
"";
751 bool ignore_POI =
false;
752 bool ignore_TOF =
false;
759 string nb_iterations_subsets =
"";
761 string options_optimizer =
"MLEM";
763 bool optimizer_fom =
false;
765 bool optimizer_stat =
false;
767 string options_penalty =
"";
774 vector<string> options_image_convolver;
776 vector<string> options_image_processing;
783 bool gpu_flag =
false;
785 string nb_threads =
"1";
792 int verbose_general = 1;
794 int verbose_algo = -1;
795 int verbose_opti = -1;
796 int verbose_proj = -1;
797 int verbose_conv = -1;
798 int verbose_proc = -1;
799 int verbose_scan = -1;
800 int verbose_data = -1;
801 int verbose_defo = -1;
802 int verbose_dyna = -1;
803 int verbose_sens = -1;
805 string path_to_config_dir =
"";
807 int64_t random_generator_seed = -1;
808 int nb_extra_random_generators = 0;
817 for (
int i=1; i<argc; i++)
820 string option = (string)argv[i];
827 if (option==
"-h" || option==
"--help" || option==
"-help")
833 else if (option==
"-help-scan")
836 Cerr(
"***** castor-recon() -> An error occured when trying to output the available scanners from the scanner repository !'" << endl;);
840 else if (option==
"-help-opti")
846 else if (option==
"-help-pnlt")
852 else if (option==
"-help-projm")
861 else if (option==
"-help-conv")
870 else if (option==
"-help-proc")
879 else if (option==
"-help-dynm")
885 else if (option==
"-help-motion")
891 else if (option==
"-help-in")
897 else if (option==
"-help-out")
903 else if (option==
"-help-dim")
909 else if (option==
"-help-algo")
915 else if (option==
"-help-proj")
921 else if (option==
"-help-imgp")
927 else if (option==
"-help-comp")
933 else if (option==
"-help-misc")
939 else if (option==
"-help-dynamic")
945 else if (option==
"-help-corr")
951 else if (option==
"-vb")
955 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
960 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_general <<
" for option: " << option << endl);
966 else if (option==
"-vb-algo")
970 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
975 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_algo <<
" for option: " << option << endl);
981 else if (option==
"-vb-opti")
985 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
990 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_opti <<
" for option: " << option << endl);
996 else if (option==
"-vb-proj")
1000 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1005 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proj <<
" for option: " << option << endl);
1011 else if (option==
"-vb-conv")
1015 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1020 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_conv <<
" for option: " << option << endl);
1026 else if (option==
"-vb-proc")
1030 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1035 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proc <<
" for option: " << option << endl);
1041 else if (option==
"-vb-scan")
1045 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1050 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_scan <<
" for option: " << option << endl);
1056 else if (option==
"-vb-data")
1060 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1065 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_data <<
" for option: " << option << endl);
1071 else if (option==
"-vb-defo")
1075 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1080 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_defo <<
" for option: " << option << endl);
1086 else if (option==
"-vb-dyna")
1090 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1095 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_dyna <<
" for option: " << option << endl);
1101 else if (option==
"-vb-sens")
1105 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1110 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_sens <<
" for option: " << option << endl);
1116 else if (option==
"-rng-seed")
1120 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1125 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << random_generator_seed <<
" for option: " << option << endl);
1131 else if (option==
"-rng-extra")
1135 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1140 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << nb_extra_random_generators <<
" for option: " << option << endl);
1146 else if (option==
"-conf")
1150 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1153 path_to_config_dir = (string)argv[i+1];
1162 else if (option==
"-dim")
1166 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1172 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1181 else if (option==
"-fov")
1185 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1191 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1194 fov_sizeX = input[0];
1195 fov_sizeY = input[1];
1196 fov_sizeZ = input[2];
1200 else if (option==
"-vox")
1204 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1210 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1213 vox_sizeX = input[0];
1214 vox_sizeY = input[1];
1215 vox_sizeZ = input[2];
1219 else if (option==
"-off")
1223 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1229 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1238 else if (option==
"-fov-out")
1242 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1245 fov_out = atof(argv[i+1]);
1249 else if (option==
"-slice-out")
1253 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1256 slice_out = ((
INTNB)(atoi(argv[i+1])));
1260 else if (option==
"-flip-out")
1264 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1267 flip_out = (string)(argv[i+1]);
1276 else if (option==
"-frm")
1280 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1283 frame_list = (string)argv[i+1];
1287 else if (option==
"-g")
1291 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1295 path_to_4D_data_splitting_file = ((string)argv[i+1]);
1299 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);
1305 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);
1309 if (nb_resp_gates<1 || nb_card_gates <1)
1311 Cerr(
"***** castor-recon() -> Incorrect initialization of the number of gates for the option: " << option <<
". This number should be >= 1" << endl);
1317 else if (option==
"-time-basis")
1321 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1324 string input = argv[i+1];
1325 size_t column_pos = input.find_first_of(
":");
1326 if (column_pos==string::npos)
1328 Cerr(
"***** castor-recon() -> Incorrect argument after option " << option <<
", ':' sign is missing !" << endl);
1331 string str = input.substr(0, column_pos);
1332 nb_time_basis = atoi(str.c_str());
1333 path_to_time_basis_coef = input.substr(column_pos+1);
1337 else if (option==
"-resp-basis")
1341 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1344 string input = argv[i+1];
1345 size_t column_pos = input.find_first_of(
":");
1346 if (column_pos==string::npos)
1348 Cerr(
"***** castor-recon() -> Incorrect argument after option " << option <<
", ':' sign is missing !" << endl);
1351 string str = input.substr(0, column_pos);
1352 nb_resp_basis = atoi(str.c_str());
1353 path_to_resp_basis_coef = input.substr(column_pos+1);
1357 else if (option==
"-card-basis")
1361 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1364 string input = argv[i+1];
1365 size_t column_pos = input.find_first_of(
":");
1366 if (column_pos==string::npos)
1368 Cerr(
"***** castor-recon() -> Incorrect argument after option " << option <<
", ':' sign is missing !" << endl);
1371 string str = input.substr(0, column_pos);
1372 nb_card_basis = atoi(str.c_str());
1373 path_to_card_basis_coef = input.substr(column_pos+1);
1377 else if (option==
"-dynamic-model")
1381 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1384 dynamic_model_options = (string)argv[i+1];
1388 else if (option==
"-rm")
1392 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1395 resp_motion_options = (string)argv[i+1];
1399 else if (option==
"-cm")
1403 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1406 card_motion_options = (string)argv[i+1];
1410 else if (option==
"-rcm")
1414 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1417 double_motion_options = (string)argv[i+1];
1421 else if (option==
"-im")
1425 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1428 ipat_motion_options = (string)argv[i+1];
1432 else if (option==
"-qdyn")
1436 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1439 path_to_dynamic_quantification_file = (string)argv[i+1];
1448 else if (option==
"-df")
1452 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1455 string file_name = (string)argv[i+1];
1456 path_to_data_filename.push_back(file_name);
1461 else if (option==
"-df-inv")
1463 invert_datafile_bed_order_flag =
true;
1466 else if (option==
"-img")
1470 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1473 path_to_initial_img = argv[i+1];
1477 else if (option==
"-sens")
1481 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1485 path_to_sensitivity_img = argv[i+1];
1489 else if (option==
"-norm")
1493 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1496 string file_name = (string)argv[i+1];
1497 path_to_normalization_filename.push_back(file_name);
1502 else if (option==
"-atn")
1506 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1510 path_to_attenuation_img = (string)argv[i+1];
1512 if (path_to_attenuation_img !=
"")
1519 Cerr(
"***** castor-recon() -> An error occurred while trying to read the interfile header of attenuation file " << path_to_attenuation_img <<
" !" << endl);
1528 else if (option==
"-multimodal")
1532 Cerr(
"***** Argument missing for option: " << option << endl);
1535 string file_name = (string)argv[i+1];
1536 path_to_multimodal_img.push_back(file_name);
1540 else if (option==
"-mask")
1544 Cerr(
"***** Argument missing for option: " << option << endl);
1548 path_to_mask_img = argv[i+1];
1557 else if (option==
"-dout")
1561 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1564 path_dout = argv[i+1];
1568 else if (option==
"-fout")
1572 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1575 path_fout = argv[i+1];
1579 else if (option==
"-oit")
1583 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1586 output_iterations = (string)argv[i+1];
1590 else if (option==
"-onbp")
1594 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1597 onb_prec = argv[i+1];
1601 else if (option==
"-omd")
1603 merge_dynamic_imgs_flag =
true;
1606 else if (option==
"-olut")
1608 save_LUT_flag =
true;
1611 else if (option==
"-osens")
1613 save_sens_histo =
true;
1616 else if (option==
"-osub")
1618 save_subset_image =
true;
1621 else if (option==
"-otb")
1623 Cerr(
"!!!!! castor-recon() -> Warning: option -otb not yet implemented !" << endl);
1626 else if (option==
"-sens-only")
1628 exit_after_sensitivity =
true;
1631 else if (option==
"-sens-histo")
1633 sensitivity_from_histogram =
true;
1641 else if (option==
"-it")
1645 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1648 nb_iterations_subsets = (string)argv[i+1];
1652 else if (option==
"-opti")
1656 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1659 options_optimizer = (string)argv[i+1];
1663 else if (option==
"-opti-fom")
1665 optimizer_fom =
true;
1668 else if (option==
"-opti-stat")
1670 optimizer_stat =
true;
1673 else if (option==
"-penalty")
1677 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1680 options_penalty = (string)argv[i+1];
1684 else if (option==
"-conv")
1688 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1691 string convolver = (string)argv[i+1];
1692 options_image_convolver.push_back(convolver);
1696 else if (option==
"-proc")
1700 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1703 string module = (string)argv[i+1];
1704 options_image_processing.push_back(module);
1713 else if (option==
"-proj")
1717 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1720 options_projectorF = (string)argv[i+1];
1721 options_projectorB = (string)argv[i+1];
1725 else if (option==
"-projF")
1729 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1732 options_projectorF = (string)argv[i+1];
1736 else if (option==
"-projB")
1740 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1743 options_projectorB = (string)argv[i+1];
1747 else if (option==
"-proj-common")
1751 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1754 options_projector_common = (string)argv[i+1];
1758 else if (option==
"-ignore-TOF")
1763 else if (option==
"-ignore-POI")
1768 else if (option==
"-proj-comp")
1772 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1775 projector_computation_strategy = atoi(argv[i+1]);
1784 else if (option==
"-ignore-corr")
1788 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1791 ignored_corrections = (string)argv[i+1];
1801 else if (option==
"-gpu")
1808 else if (option==
"-th")
1812 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1815 nb_threads = (string)argv[i+1];
1819 else if (option==
"-th")
1823 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1826 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1827 Cerr(
"!!!!! castor-recon() -> Option -th is available only if the code is compiled using the CASTOR_OMP environment variable set to 1 !" << endl);
1828 Cerr(
"!!!!! The execution will continue BUT WITH ONLY ONE THREAD !" << endl);
1829 Cerr(
"!!!!! We strongly advice to compile CASToR with OpenMP !" << endl);
1830 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1841 Cerr(
"***** castor-recon() -> Unknown option '" << option <<
"' !" << endl);
1848 MPI_Barrier(MPI_COMM_WORLD);
1852 if (verbose_algo==-1) verbose_algo = verbose_general;
1853 if (verbose_opti==-1) verbose_opti = verbose_general;
1854 if (verbose_proj==-1) verbose_proj = verbose_general;
1855 if (verbose_conv==-1) verbose_conv = verbose_general;
1856 if (verbose_proc==-1) verbose_proc = verbose_general;
1857 if (verbose_scan==-1) verbose_scan = verbose_general;
1858 if (verbose_data==-1) verbose_data = verbose_general;
1859 if (verbose_defo==-1) verbose_defo = verbose_general;
1860 if (verbose_dyna==-1) verbose_dyna = verbose_general;
1861 if (verbose_sens==-1) verbose_sens = verbose_general;
1870 Cerr(
"***** castor-recon() -> Please provide at least one data filename !" << endl);
1874 if (path_fout.empty() && path_dout.empty())
1876 Cerr(
"***** castor-recon() -> Please provide an output option for output files (-fout or -dout) !" << endl);
1880 if (!path_fout.empty() && !path_dout.empty())
1882 Cerr(
"***** castor-recon() -> Please provide either output option -fout or -dout but not both !" << endl);
1888 if ( (nb_resp_gates>1 || nb_card_gates>1) && path_to_4D_data_splitting_file.empty() )
1890 Cerr(
"***** castor-recon() -> gating is enabled, but no file describing the splitting of the data has been provided (-gating option) !" << endl);
1898 if (verbose_general>=5)
Cout(
"----- Singletons initializations ... -----" << endl);
1908 p_outputManager->
SetVerbose(verbose_general);
1922 Cerr(
"***** castor-recon() -> A problem occured while checking for the config directory path !" << endl);
1928 Cerr(
"***** castor-recon() -> A problem occured while initializing output directory !" << endl);
1932 #ifdef CASTOR_VERSION
1933 Cout(
"castor-recon() -> Launch reconstruction from CASToR version " <<
CASTOR_VERSION <<
"." << endl);
1938 Cerr(
"***** castor-recon() -> A problem occured while logging command line arguments !" << endl);
1956 if (verbose_general>=5)
Cout(
"----- Geometry Initialization ... -----" << endl);
1961 string scanner_name =
"";
1964 Cerr(
"***** castor-recon() -> A problem occured while trying to find the system name in the datafile header !" << endl);
1969 Cerr(
"***** castor-recon() -> A problem occurred while searching for scanner system !" << endl);
1974 Cerr(
"***** castor-recon() -> A problem occurred during scanner object construction ! !" << endl);
1979 Cerr(
"***** castor-recon() -> A problem occurred while creating Scanner object !" << endl);
1984 Cerr(
"***** castor-recon() -> A problem occurred while retrieving scanner fields from the datafile header !" << endl);
1989 Cerr(
"***** castor-recon() -> A problem occurred while generating/reading the LUT !" << endl);
1995 Cerr(
"***** castor-recon() -> A problem occured while checking scanner manager parameters !" << endl);
2000 Cerr(
"***** castor-recon() -> A problem occured while initializing scanner !" << endl);
2005 if (nb_voxX<=0 || nb_voxY<=0 || nb_voxZ<=0)
2009 Cerr(
"***** castor-recon() -> A problem occured while reading for default number of transaxial voxels !" << endl);
2014 Cerr(
"***** castor-recon() -> A problem occured while reading for default number of transaxial voxels !" << endl);
2019 Cerr(
"***** castor-recon() -> A problem occured while reading for default number of axial voxels !" << endl);
2024 if ( (fov_sizeX<=0 || fov_sizeY<=0 || fov_sizeZ<=0) && (vox_sizeX<=0 || vox_sizeY<=0 || vox_sizeZ<=0) )
2028 Cerr(
"***** castor-recon() -> A problem occured while reading for default transaxial FOV size !" << endl);
2033 Cerr(
"***** castor-recon() -> A problem occured while reading for default transaxial FOV size !" << endl);
2038 Cerr(
"***** castor-recon() -> A problem occured while reading for default axial FOV size !" << endl);
2043 if (verbose_general>=5)
Cout(
"----- Geometry Initialization OK -----" << endl);
2049 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization ... -----" << endl);
2051 if (p_ImageDimensionsAndQuantification->
SetNbThreads(nb_threads))
2053 Cerr(
"***** castor-recon() -> A problem occured while setting the number of threads !" << endl);
2056 p_ImageDimensionsAndQuantification->
SetNbBeds(nb_beds);
2057 p_ImageDimensionsAndQuantification->
SetNbVoxX(nb_voxX);
2058 p_ImageDimensionsAndQuantification->
SetNbVoxY(nb_voxY);
2059 p_ImageDimensionsAndQuantification->
SetNbVoxZ(nb_voxZ);
2060 p_ImageDimensionsAndQuantification->
SetVoxSizeX(vox_sizeX);
2061 p_ImageDimensionsAndQuantification->
SetVoxSizeY(vox_sizeY);
2062 p_ImageDimensionsAndQuantification->
SetVoxSizeZ(vox_sizeZ);
2063 p_ImageDimensionsAndQuantification->
SetFOVSizeX(fov_sizeX);
2064 p_ImageDimensionsAndQuantification->
SetFOVSizeY(fov_sizeY);
2065 p_ImageDimensionsAndQuantification->
SetFOVSizeZ(fov_sizeZ);
2067 p_ImageDimensionsAndQuantification->
SetOffsetX(offsetX);
2068 p_ImageDimensionsAndQuantification->
SetOffsetY(offsetY);
2069 p_ImageDimensionsAndQuantification->
SetOffsetZ(offsetZ);
2071 p_ImageDimensionsAndQuantification->
SetVerbose(verbose_data);
2073 p_ImageDimensionsAndQuantification->
SetFrames(frame_list);
2077 if (p_ImageDimensionsAndQuantification->
SetFlipOut(flip_out))
2079 Cerr(
"***** castor-recon() -> A problem occured while setting the output flip option !" << endl);
2082 if (resp_motion_options==
"" && double_motion_options==
"")
2084 p_ImageDimensionsAndQuantification->
SetNbRespGates(nb_resp_gates);
2090 if (path_to_resp_basis_coef!=
"")
2092 Cerr(
"***** castor-recon() -> Cannot use both respiratory motion correction and respiratory basis functions, it has no sense !" << endl);
2098 if (card_motion_options==
"" && double_motion_options==
"")
2100 p_ImageDimensionsAndQuantification->
SetNbCardGates(nb_card_gates);
2106 if (path_to_card_basis_coef!=
"")
2108 Cerr(
"***** castor-recon() -> Cannot use both cardiac motion correction and cardiac basis functions, it has no sense !" << endl);
2116 Cerr(
"***** castor-recon() -> A problem occured while checking image dimensions parameters !" << endl);
2119 if (p_ImageDimensionsAndQuantification->
Initialize())
2121 Cerr(
"***** castor-recon() -> A problem occured while initializing image dimensions !" << endl);
2125 if (p_ImageDimensionsAndQuantification->
InitDynamicData(path_to_4D_data_splitting_file,
2126 !resp_motion_options.empty(),
2127 !card_motion_options.empty(),
2128 !double_motion_options.empty(),
2129 !ipat_motion_options.empty(),
2133 Cerr(
"***** castor-recon() -> A problem occured while initializing Dynamic data manager's class !" << endl);
2138 int64_t nb_events = 0;
2143 Cerr(
"***** castor-recon() -> A problem occured while checking Dynamic data manager's parameters !" << endl);
2149 Cerr(
"***** castor-recon() -> A problem occured while initializing specific dynamic quantification factors!" << endl);
2153 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization OK -----" << endl);
2167 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization ... -----" << endl);
2175 Cerr(
"***** castor-recon() -> A problem occured while checking parameters for the chrono manager !" << endl);
2180 Cerr(
"***** castor-recon() -> A problem occured while initializing the chrono manager !" << endl);
2184 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization OK -----" << endl);
2190 if (verbose_general>=5)
Cout(
"----- Random number generator initialization ... -----" << endl);
2193 p_RandomNumberGenerator->
SetVerbose(verbose_general);
2195 if (random_generator_seed>=0) p_RandomNumberGenerator->
Initialize(random_generator_seed, p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2196 else p_RandomNumberGenerator->
Initialize(p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2198 if (verbose_general >=5)
Cout(
"----- Random number generator initialization OK -----" << endl);
2204 if (verbose_general>=5)
Cout(
"----- DataFile initialization ... -----" << endl);
2211 for (
int i=0 ; i<nb_beds ; i++)
2214 (
dynamic_cast<iDataFilePET*
>(p_DataFile[i]))->SetIgnoreTOFFlag(ignore_TOF);
2220 for (
int i=0 ; i<nb_beds ; i++)
2228 for (
int i=0 ; i<nb_beds ; i++)
2236 Cerr(
"***** castor-recon() -> Unknown scanner type (" << p_ScannerManager->
GetScannerType() <<
") for datafile construction ! Abort." << endl);
2241 for (
int bed=0 ; bed<nb_beds ; bed++)
2244 if (invert_datafile_bed_order_flag) p_DataFile[bed]->
SetHeaderDataFileName(path_to_data_filename.at(nb_beds-1-bed));
2250 if (p_DataFile[bed]->ReadInfoInHeader())
2252 Cerr(
"***** castor-recon() -> A problem occurred during datafile header reading ! Abort." << endl);
2255 if (p_DataFile[bed]->CheckParameters())
2257 Cerr(
"***** castor-recon() -> A problem occurred while checking datafile parameters ! Abort." << endl);
2260 if (p_DataFile[bed]->ComputeSizeEvent())
2262 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2265 if (p_DataFile[bed]->InitializeMappedFile())
2267 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2270 if (p_DataFile[bed]->PrepareDataFile())
2272 Cerr(
"***** castor-recon() -> A problem occured in datafile preparation ! Abort." << endl);
2277 for (
int bed=1; bed<nb_beds; bed++)
2279 if (p_DataFile[0]->CheckConsistencyWithAnotherBedDataFile(p_DataFile[bed]))
2281 int bed_index_problem = bed + 1;
2282 if (invert_datafile_bed_order_flag) bed_index_problem = nb_beds - bed;
2283 Cerr(
"***** castor-recon() -> A problem occured while checking consistency between first bed and bed " << bed_index_problem <<
" !" << endl);
2290 Cerr(
"***** castor-recon() -> A problem occured while dealing with the bed positions !" << endl);
2294 if (verbose_general>=5)
Cout(
"----- DataFile initialization OK -----" << endl);
2301 if (verbose_general>=5)
Cout(
"----- Projector initialization ... -----" << endl);
2313 if (!path_to_mask_img.empty())
2317 Cerr(
"The option for using a mask image for projection is set, but the mask image is not provided or could not be loaded !" << endl);
2324 p_ProjectorManager->
SetVerbose(verbose_proj);
2328 Cerr(
"***** castor-recon() -> A problem occured while checking projector manager's parameters !" << endl);
2334 Cerr(
"***** castor-recon() -> A problem occured while initializing projector manager !" << endl);
2340 Cerr(
"***** castor-recon() -> A problem occured while checking projector's compatibility with SPECT and attenuation correction !" << endl);
2344 if (verbose_general>=5)
Cout(
"----- Projector initialization OK -----" << endl);
2351 if (verbose_general>=5)
Cout(
"----- Optimizer initialization ... -----" << endl);
2357 p_OptimizerManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2358 p_OptimizerManager->
SetDataType(p_DataFile[0]->GetDataType());
2359 p_OptimizerManager->
SetDataSpec(p_DataFile[0]->GetDataSpec());
2365 p_OptimizerManager->
SetVerbose(verbose_opti);
2369 Cerr(
"***** castor-recon() -> A problem occured while checking optimizer manager's parameters !" << endl);
2375 Cerr(
"***** castor-recon() -> A problem occured while initializing optimizer manager !" << endl);
2379 if (verbose_general>=5)
Cout(
"----- Optimizer initialization OK -----" << endl);
2386 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization (if any) ... -----" << endl);
2390 p_ImageConvolverManager->
SetVerbose(verbose_conv);
2392 p_ImageConvolverManager->
SetOptions(options_image_convolver);
2396 Cerr(
"***** castor-recon() -> A problem occured while checking image convolver manager's parameters !" << endl);
2402 Cerr(
"***** castor-recon() -> A problem occured while initializing image convolver manager !" << endl);
2406 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization OK -----" << endl);
2413 if (verbose_general>=5)
Cout(
"----- Image Processing initialization (if any) ... -----" << endl);
2417 p_ImageProcessingManager->
SetVerbose(verbose_proc);
2419 p_ImageProcessingManager->
SetOptions(options_image_processing);
2423 Cerr(
"***** castor-recon() -> A problem occured while checking image processing manager's parameters !" << endl);
2429 Cerr(
"***** castor-recon() -> A problem occured while initializing image processing manager !" << endl);
2433 if (verbose_general>=5)
Cout(
"----- Image Processing initialization OK -----" << endl);
2440 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization (if any) ... -----" << endl);
2445 p_DynamicModelManager->
SetOptions(dynamic_model_options);
2446 p_DynamicModelManager->
SetVerbose(verbose_dyna);
2450 Cerr(
"***** castor-recon() -> A problem occured while checking dynamic model manager's parameters !" << endl);
2456 Cerr(
"***** castor-recon() -> A problem occured while initializing dynamic model manager !" << endl);
2460 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization OK -----" << endl);
2467 if (verbose_general>=5)
Cout(
"----- Image deformation initialization (if any) ... -----" << endl);
2472 p_DeformationManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2474 if(resp_motion_options !=
"")
2476 p_DeformationManager->
SetOptions(resp_motion_options);
2480 else if (card_motion_options !=
"")
2482 p_DeformationManager->
SetOptions(card_motion_options);
2486 else if (double_motion_options !=
"")
2488 p_DeformationManager->
SetOptions(double_motion_options);
2492 else if (ipat_motion_options !=
"")
2494 p_DeformationManager->
SetOptions(ipat_motion_options);
2501 p_DeformationManager->
SetVerbose(verbose_defo);
2505 Cerr(
"***** castor-recon() -> A problem occured while checking image deformation manager's parameters !" << endl);
2511 Cerr(
"***** castor-recon() -> A problem occured while initializing image deformation manager !" << endl);
2515 if (verbose_general >=5)
Cout(
"----- Image deformation initialization OK -----" << endl);
2532 (p_DataFile[0]->GetDataMode()==
MODE_HISTOGRAM && sensitivity_from_histogram)
2536 if (verbose_general>=5)
Cout(
"----- Image Sensitivity generation initialization ... -----" << endl);
2557 Cerr(
"***** castor-recon() -> A problem occured while checking parameters of the sensitivity generator !" << endl);
2563 Cerr(
"***** castor-recon() -> A problem occured while initializing the sensitivity generator !" << endl);
2569 if (p_Sensitivity->
Launch())
2571 Cerr(
"***** castor-recon() -> A problem occured while computing the sensitivity !" << endl);
2578 else path_to_sensitivity_img =
"";
2580 delete p_Sensitivity;
2582 if (exit_after_sensitivity)
2584 if (verbose_general>=
VERBOSE_LIGHT)
Cout(
"castor-recon() -> Asked to exit after sensitivity computation." << endl);
2586 delete p_ImageSpace;
2587 delete p_DeformationManager;
2588 delete p_DynamicModelManager;
2589 delete p_ImageProcessingManager;
2590 delete p_ImageConvolverManager;
2591 delete p_OptimizerManager;
2592 delete p_ProjectorManager;
2593 for (
int i=0 ; i<nb_beds ; i++)
delete p_DataFile[i];
2594 delete[] p_DataFile;
2595 delete p_ImageDimensionsAndQuantification;
2609 if (verbose_general>=5)
Cout(
"----- Iterative reconstruction algorithm initialization ... -----" << endl);
2634 Cerr(
"***** castor-recon() -> Error while setting the numbers of iterations and subsets !" << endl);
2639 Cerr(
"***** castor-recon() -> Error while setting the selected output iterations !" << endl);
2644 Cerr(
"***** castor-recon() -> Error while performing the reconstruction" << endl);
2656 if (verbose_general>=5)
Cout(
"----- Deleting CASToR objects ... -----" << 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;
2668 if (verbose_general>=5)
Cout(
"----- CASToR objects successfully deleted -----" << endl);
2671 if (verbose_general>=1)
Cout(endl);
2675 return EXIT_SUCCESS;
void SetNbThreads(int a_nbThreadsForProjection, int a_nbThreadsForImageComputation)
Set the number of threads for both projection and image computations.
void ShowHelpProj()
Display command line options related to the Projector module for castor-recon.
void SetIgnorePOIFlag(bool a_ignorePOIFlag)
Set a boolean that that if we ignore POI information or not.
void SetRespBasisFunctionsFile(const string &a_respBasisFunctionsFile)
Set the file name containing the respiratory basis functions coefficients.
This class is designed to be a mother virtual class for DataFile.
This header file is mainly used to declare some macro definitions and all includes needed from the st...
static sScannerManager * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Set the member mp_ImageDimensionsAndQuantification to the provided value.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Set the Image Dimensions and Quantification Object.
static sRandomNumberGenerator * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
Declaration of class oImageDimensionsAndQuantification.
void SetPathToAttenuationImage(string a_pathToAttenuationImage)
This function is used to set the path to the attenuation image.
int InitDynamicData(string a_pathTo4DDataSplittingFile, int a_respMotionCorrectionFlag, int a_cardMotionCorrectionFlag, int a_doubleMotionCorrectionFlag, int a_invMotionCorrectionFlag, int a_nbRespGates, int a_nbCardGates)
Call the eponym function from the oDynamicDataManager object in order to initialize its data...
void SetNumberOfAtnGateImages(int a_nbAtnRespGateImages, int a_nbAtnCardGateImages)
int Iterate()
Just call either the IterateCPU or the IterateGPU function as asked for.
int SetNbIterationsAndSubsets(const string &a_nbIterationsSubsets)
Set the number of iterations and subsets.
void SetVerbose(int a_verbose)
set verbosity
void SetGPUflag(bool a_flagGPU)
Set the GPU flag.
void SetFOVSizeZ(FLTNB a_fovSizeZ)
Set the FOV's size along the Z axis, in mm.
static void ShowCommonHelp()
This function is used to print out some help about the use of options common to all projectors...
void SetPathToMultiModalImage(vector< string > a_pathToMultiModalImage)
Set path to multimodal images.
void SetIgnoredCorrections(const string &a_ignoredCorrectionsList)
Set the string specifying the corrections that will be ignored.
int InitMaskImage(const string &a_pathToImage)
Memory allocation and initialization for the mask image.
void SetOptimizerImageStatFlag(bool a_optimizerImageStatFlag)
Set the optimizer image stat flag that specifies if some basic statistics about image update is compu...
void ShowHelpDynamicModel()
Show help about all implemented dynamic models.
void ShowHelpDeformation()
Show help about all implemented deformations.
void ShowHelp()
Display main command line options for castor-recon.
void SetComputationStrategy(int a_computationStrategy)
Set the computation strategy for the system matrix elements storage.
void SetProjectorManager(oProjectorManager *ap_ProjectorManager)
Set the Projector Manager Object.
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...
void SetSaveSensitivityHistoFlag(bool a_saveSensitivityHistoFlag)
Set the flag that specifies if the sensitivity image in histogram mode has to be saved for each subse...
int Initialize()
A public function used to initialize the sensitivity generator.
void SetVerbose(int a_verboseLevel)
Set the member m_verboseLevel to the provided value.
void ShowHelpImgp()
Display command line options related to the Image Processing module for castor-recon.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Set the image dimensions in use.
int FindScannerSystem(string a_scannerName)
Look for a file matching with the scanner name in parameter inside the scanner repository.
void SetDeformationManager(oDeformationManager *ap_DeformationManager)
Set the Deformation Manager Object.
void SetFOVSizeY(FLTNB a_fovSizeY)
Set the FOV's size along the Y axis, in mm.
void SetNbVoxZ(INTNB a_nbVoxZ)
Set the number of voxels along the Z axis.
void SetNbTimeBasisFunctions(int a_nbTimeBasisFunctions)
Set the number of time basis functions.
void SetOptions(const string &a_options)
Set the respiratory motion options contained in the provided string.
int CheckParameters()
Check validity of all parameters.
void SetVerbose(int a_verboseLevel)
Set the verbose level.
int BuildScannerObject()
Instantiate the specific scanner object related to the modality, and set verbosity of scanner object...
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Set the image dimensions in use.
string GetPathToSensitivityImage()
This function return the path to the sensitivity image.
void SetNbRespGates(int a_nbRespGates)
Set the number of respiratory gates.
void ShowHelpComputation()
Display command line options related to the computation settings for castor-recon.
int CheckParameters()
A function used to check the parameters settings.
void SetPathToSensitivityImage(string a_pathToSensitivityImage)
Set path to the sensitivity image.
This class is designed to manage the optimization part of an iterative reconstruction.
void SetOffsetY(FLTNB a_offsetY)
Set the image offset along the Y axis, in mm.
void CheckNumberOfProjectionThreadsConsistencyWithDataFileSize(vDataFile **a2p_DataFile)
void SetFOVOutMasking(FLTNB a_fovOutPercent, INTNB a_nbSliceOutMask)
Set the output FOV masking settings: transaxial unmasked FOV percent and number of extrem slices to r...
void ShowHelpImageProcessingModule()
Show help about all implemented image processing modules.
void SetVerbose(int a_verboseLevel)
set verbosity
void ShowHelpMiscellaneous()
Display command line options related to miscellaneous settings for castor-recon.
int DealWithBedPositions(vDataFile **a2p_DataFile)
Deal with provided or default bed relative positions.
void SetDeformationManager(oDeformationManager *ap_DeformationManager)
This function is used to set the pointer to the oDeformationManager in use.
void SetOptionsForward(const string &a_optionsForward)
Set the forward projection options contained in the provided string.
void SetSensitivityModeOff()
Say that the projector will no longer be used to compute the global sensitivity.
int SetOutputIterations(const string &a_outputIterations)
Set the selected output iterations.
void SetVerbose(int a_verboseLevel)
Set Verbosity.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Set the member mp_ImageDimensionsAndQuantification to the provided value.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Set the image dimensions in use.
This is the main class for iterative reconstructions, that manages the iteration loops. This class manages an iterative reconstruction of any kind, using a vDataFile, and through the use of an oProjector, an oOptimizer, a oConvolver, a oImageSpace.
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.
void SetDataSpec(int a_dataSpec)
Set the specificity of the data: EMISSION or TRANSMISSION.
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 SetOffsetZ(FLTNB a_offsetZ)
Set the image offset along the Z axis, in mm.
Declaration of class iDataFileCT.
void SetVerbose(int a_verboseLevel)
void SetImageConvolverManager(oImageConvolverManager *ap_ImageConvolverManager)
This function is used to set the pointer to the oImageConvolverManager in use.
void SetSaveLUTFlag(bool a_flag)
Set to on the flag indicating a LUT generated by a geom file should be written on disk or not...
Declaration of class iDataFilePET.
void SetOptions(vector< string > a_options)
Set the member m_options to the provided value.
Declaration of class oIterativeAlgorithm.
void SetOptionsCommon(const string &a_optionsCommon)
Set the common projection options contained in the provided string.
void ShowHelpDynamic()
Display command line options related to the dynamic features for castor-recon.
int Initialize()
A function used to initialize the manager and the optimizer it manages.
int CheckParameters()
Check if all parameters have been correctly initialized, and call the CheckParameters function of the...
void SetNbVoxX(INTNB a_nbVoxX)
Set the number of voxels along the X axis.
int SetNbThreads(const string &a_nbThreads)
Set the number of threads.
Declaration of class iDataFileSPECT.
void SetOptionsBackward(const string &a_optionsBackward)
Set the backward projection options contained in the provided string.
void DeallocateMaskImage()
Free memory for the mask image.
Declaration of class iScannerPET.
int IntfReadHeader(const string &a_pathToHeaderFile, Intf_fields *ap_IntfFields, int vb)
Read an Interfile header.
void SetImageSpace(oImageSpace *ap_ImageSpace)
Set the image space in use.
int SetOutNbPrec(string a_format)
Set the output format and precision used for numeric display.
int InstantiateScanner()
Instantiate scanner using the related function in the scanner classes.
int LogCommandLine(int argc, char **argv)
Write log file header with the provided command line options and different informations.
void SetPathToNormalizationFileName(vector< string > ap_pathToNormalizationFileName, bool a_inverseDataFileOrderFlag)
This function is used to set the path to the normalization file names, and the flag saying if their o...
static sAddonManager * GetInstance()
void SetSaveSubsetImageFlag(bool a_saveImageAfterSubsets)
Set the flag that specifies if the image has to be saved for each subset.
void SetComputeFromHistogramFlag(bool a_computeFromHistogramFlag)
This function is used to set the m_computeFromHistogramFlag.
int ConvertFromString(const string &a_str, string *a_result)
Copy the 'a_str' string in the position pointed by 'a_result'.
#define FIXED_LIST_COMPUTATION_STRATEGY
void SetNbVoxY(INTNB a_nbVoxY)
Set the number of voxels along the Y axis.
void SetNbRespBasisFunctions(int a_nbRespBasisFunctions)
Set the number of respiratory basis functions.
int CheckConfigDir(const string &a_path)
Set the path to the CASTOR config directory from the given path if not empty or through the existence...
void SetVerbose(int a_verboseLevel)
Set the verbose level.
int CheckParameters()
A function used to check the parameters settings.
void SetNbCardGates(int a_nbCardGates)
Set the number of cardiac gates.
void SetDataMode(int a_dataMode)
Set the mode of the data (histogram, list-mode)
#define SCANNER_SPECT_CONVERGENT
int BuildLUT()
Call the eponym function of the scanner class.
void SetDataType(int a_dataType)
Set the type of the data (pet, spect, etc)
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 SetMPIRankAndSize(int a_mpiRank, int a_mpiSize)
Set the MPI rank of the MPI instance, and the MPI size (the number of instances)
void SetOptionsOptimizer(const string &a_optionsOptimizer)
Set the optimizer projection options contained in the provided string.
This class is designed to manage the use of dynamic model in the reconstruction.
void SetFrames(const string &a_frameList)
Set the frame list (a string that will be parsed by the InitializeFramingAndQuantification function) ...
void SetFOVSizeX(FLTNB a_fovSizeX)
Set the FOV's size along the X axis, in mm.
void SetNbBeds(int a_nbBeds)
Set number of beds (bed positions)
void ShowHelpOutput()
Display command line options related to output settings for castor-recon.
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...
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.
int Initialize(int a_nbThreads, int a_nbExtra)
Instantiate pseudo random number generators, one per thread by default, and additional extra ones if ...
void SetImageProcessingManager(oImageProcessingManager *ap_ImageProcessingManager)
Set the Image Processing Manager Object.
void SetOptions(vector< string > a_options)
Set the member m_options to the provided value.
void SetOptionsPenalty(const string &a_optionsPenalty)
Set the penalty projection options contained in the provided string.
int CheckParameters()
A function used to check the parameters settings.
Declaration of class sScannerManager.
void SetPathInitImage(string a_pathToInitialImage)
Set path to an initial image.
void SetVoxSizeY(FLTNB a_voxSizeY)
Set the voxel's size along the Y axis, in mm.
void SetPathToMaskImage(string a_pathToMaskImage)
Set path to a mask image.
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 SetOffsetX(FLTNB a_offsetX)
Set the image offset along the X axis, in mm.
void SetHeaderDataFileName(const string &a_headerFileName)
set the data header file name
vScanner * GetScannerObject()
void SetVoxSizeX(FLTNB a_voxSizeX)
Set the voxel's size along the X axis, in mm.
void IntfKeyInitFields(Intf_fields *ap_IF)
Init the file of an Interfile fields structure passed in parameter to their default values...
int CheckParameters()
A function used to check the parameters settings.
void SetSensitivityModeOn()
Say that the projector will be used to compute the global sensitivity.
void SetMergeDynImagesFlag(bool a_flag)
Set to on the flag indicating that a dynamic serie of 3D images should be written on disk in one file...
void SetPathToAttenuationImage(string a_pathToAttenuationImage)
This function is used to set the path to the attenuation image.
void SetMPIRank(int a_mpiRank)
Initialize the machine index for MPI.
void SetVerbose(int a_verboseLevel)
Set the verbose level.
void SetTimeBasisFunctionsFile(const string &a_timeBasisFunctionsFile)
Set the file name containing the time basis functions coefficients.
void SetDataFile(vDataFile **a2p_DataFile)
This function is used to set the pointer to the vDataFile array in use.
void SetDataFile(vDataFile *ap_DataFile)
Set a data file in use to later recover some information from it.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
set the pointer to the oImageDimensionsAndQuantification object
int main(int argc, char **argv)
void ShowHelpProjector()
Show help about all implemented projectors.
#define KEYWORD_MANDATORY
int CheckParameters()
A function used to check the parameters settings.
static void ShowCommonHelp()
This function does not take any parameter and is used to display some help about the syntax of the op...
void SetImageSpace(oImageSpace *ap_ImageSpace)
This function is used to set the pointer to the oImageSpace in use.
void SetPathToMaskImage(string a_pathToMaskImage)
Set path to a mask image.
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...
int ProcessAndSetMask(FLTNB *ap_maskImage)
Process and set the provided mask image for projector masking.
int Initialize()
Initialization : .
Declaration of class sRandomNumberGenerator.
void SetNbTOFBins(int a_nbTOFBins)
Set the number of TOF bins in use.
void SetNbMultiModalImages(int a_nbMultiModalImages)
Set the number of additional multimodal images.
void SetScanner(vScanner *ap_Scanner)
This function is used to set the pointer to the vScanner in use.
void SetVerbose(int a_verbose)
Set the member m_verboseLevel to the provided value.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ID)
Set the pointer to the image dimensions and quantification object.
int Initialize()
Initialize all thread-safe buffers for profiling.
void SetVoxSizeZ(FLTNB a_voxSizeZ)
Set the voxel's size along the Z axis, in mm.
int CheckDynamicParameters(int64_t a_nbEvents)
Call the eponym function from the oDynamicDataManager object in order to check its parameters...
void SetVerbose(int a_verboseLevel)
set verbosity
Declaration of class oSensitivityGenerator.
This class is designed to manage the different image processing modules and to apply them...
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)
set the bed index corresponding to this data file
Declaration of class sOutputManager.
This class holds all the matrices in the image domain that can be used in the algorithm: image...
void SetImageSpace(oImageSpace *ap_ImageSpace)
Set the Image Space Object.
void SetImageConvolverManager(oImageConvolverManager *ap_ImageConvolverManager)
Set the Image Convolver Manager Object.
int GetNbThreadsForImageComputation()
Get the number of threads used for image operations.
int InitOutputDirectory(const string &a_pathFout, const string &a_pathDout)
Create the output directory if any, extract the base name and create the log file.
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)...
This class is designed to manage all dimensions and quantification related stuff. ...
void ShowHelpInput()
Display command line options related to input settings for castor-recon.
int GetNbThreadsForProjection()
Get the number of threads used for projections.
void SetNbBeds(int a_nbBeds)
Set the number of bed positions and allocate the bed positions if not already done.
void SetNbCardBasisFunctions(int a_nbCardBasisFunctions)
Set the number of cardiac basis functions.
This file is used for all kind of different functions designed for options parsing and ASCII file rea...
Declaration of class sChronoManager.
void SetProjectorManager(oProjectorManager *ap_ProjectorManager)
This function is used to set the pointer to the oProjectorManager in use.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
This function is used to set the pointer to the oImageDimensionsAndQuantification in use...
void ShowHelpDimensions()
Display command line options related to image dimensions for castor-recon.
void SetGPUflag(bool a_flagGPU)
This function is used to set the GPU flag; do we use GPU or not.
void SetVerbose(int a_verboseLevel)
Set the member m_verboseLevel to the provided value.
void SetVerbose(int a_verboseLevel)
set verbosity
int CheckSPECTAttenuationCompatibility(const string &a_pathToAttenuationImage)
A function used to check specific compatibility with SPECT and attenuation correction.
This class is designed to manage some profiling of the code.
void SetDataFileName(vector< string > ap_dataFileName)
void SetCardBasisFunctionsFile(const string &a_cardBasisFunctionsFile)
Set the file name containing the cardiac basis functions coefficients.
void SetScanner(vScanner *ap_Scanner)
Set the scanner in use.
void ShowHelpAlgo()
Display command line options related to the Optimization algorithm module for castor-recon.
void ShowHelpOptimizer()
Show help about all implemented optimizers.
void SetOptimizerManager(oOptimizerManager *ap_OptimizerManager)
Set the Optimizer Manager Object.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
set the pointer to the oImageDimensionsAndQuantification object
Inherit from vDataFile. Class that manages the reading of a PET input file (header + data)...
int GetGeometricInfoFromDataFile(string a_pathToDataFilename)
Call the specialized function of the scanner object in order to get geometric informations from the d...
void SetVerbose(int a_verbose)
Set the verbose level.
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 SetDataFile(vDataFile **a2p_DataFile)
Set the list of DataFile.
static sChronoManager * GetInstance()
Instantiate the singleton if not already done, then return the pointer to its instance.
void SetDynamicModelManager(oDynamicModelManager *ap_DynamicModelManager)
Set the Dynamic Model Manager Object.
This class is designed to manage the computation of the sensitivity image.
Declaration of class sAddonManager.
void GetUserEndianness()
Check user/host computer endianness and write it to the global variable User_Endianness.
int SetFlipOut(const string &a_flipOut)
Set the output flip options, the parameter being a string potentially containing the letters x...
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)
Apply specific quantification factors manually provided as an option.
void ShowHelpCorrection()
Display command line options related to correction settings for castor-recon.
void ShowHelpImageConvolver()
Show help about all implemented image convolvers.
void Display()
Display the results of the duration buffers.
void SetOptimizerFOMFlag(bool a_optimizerFOMFlag)
Set the optimizer FOM flag that specifies if some figures-of-merit (FOM) will be computed in the data...