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;
79 cout <<
" -fout name : Give the root name for all output files (no default, alternative to -dout)" << endl;
80 cout <<
" -dout name : Give the name of the output directory where all output files will be written (no default, alternative to -fout)" << endl;
81 cout <<
" -it list : Give the sequence of iterations:subsets separated by commas (no default)." << endl;
82 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
83 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;
84 cout <<
" the voxel sizes provided using '-vox')." << endl;
85 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;
86 cout <<
" if a fov value is provided using '-fov')." << endl;
87 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
89 cout <<
"[Specific help options]:" << endl;
90 cout <<
" -help-dim : Print out specific help about dimensions settings." << endl;
91 cout <<
" -help-in : Print out specific help about input settings." << endl;
92 cout <<
" -help-out : Print out specific help about output settings." << endl;
93 cout <<
" -help-algo : Print out specific help about reconstruction algorithms and their settings." << endl;
94 cout <<
" -help-proj : Print out specific help about projection operators." << endl;
96 cout <<
" -help-imgp : Print out specific help about image processing modules." << endl;
97 cout <<
" -help-comp : Print out specific help about computing settings." << endl;
98 cout <<
" -help-corr : Print out specific help about all corrections that can be disabled." << endl;
99 cout <<
" -help-misc : Print out specific help about miscellaneous and verbose settings." << endl;
101 cout <<
"[Implemented Modules]:" << endl;
102 cout <<
" -help-scan : Show the list of all scanners from the configuration directory." << endl;
103 cout <<
" -help-projm : Show the list and description of all implemented projectors." << endl;
104 cout <<
" -help-opti : Show the list and description of all implemented optimizer algorithms." << endl;
105 cout <<
" -help-penalty : Show the list and description of all implemented penalties for optimizers." << endl;
106 cout <<
" -help-motion-model : Show the list and description of all implemented image-based deformation models." << endl;
107 cout <<
" -help-dynamic-model : Show the list and description of all implemented dynamic models." << endl;
108 cout <<
" -help-conv : Show the list and description of all implemented image convolvers." << endl;
109 cout <<
" -help-proc : Show the list and description of all implemented image processing modules." << endl;
112 cout <<
" --help,-h,-help : Print out this help page." << endl;
115 cout <<
" Compiled with MPI" << endl;
118 cout <<
" Compiled with OpenMP" << endl;
121 cout <<
" Compiled for GPU" << endl;
123 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU) 127 cout <<
" Build date: " << BUILD_DATE << endl;
130 #ifdef CASTOR_VERSION 131 cout <<
" This program is part of the CASToR release version " <<
CASTOR_VERSION <<
"." << endl;
149 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
150 if (mpi_rank!=0)
return;
154 cout <<
"[Input settings]:" << endl;
159 cout <<
" -df file.cdf : Give an input CASTOR datafile header (no default)." << endl;
161 cout <<
" -img file.hdr : Give an input image as the initialization of the algorithm (default: uniform value)." << endl;
163 cout <<
" -sens file.hdr : Provide the sensitivity image (default: sensitivity image is computed before reconstruction)." << endl;
164 cout <<
" The image file should integrate all sensitivity images if more than one are required. If dual-gating is enabled and if it" << endl;
165 cout <<
" requires sensitivity images for each gate, the image should integrate nb_resp_gates * nb_card_gates sensitivity images" << endl;
166 cout <<
" (all cardiac-gated based sensitivity images for each one of the respiratory gates)." << endl;
168 cout <<
" -multimodal file.hdr : Provide additional images, from other modalities (anatomical, functional), or processed, for use in constrained reconstruction." << endl;
169 cout <<
" Multiple additional images can be provided by using the option multiple times. The additional images will be linearly interpolated" << endl;
170 cout <<
" to match the dimensions of the reconstructed images." << endl;
172 cout <<
" -mask file.hdr : Provide a mask image. The mask image is currently used for projection : it is applied to the projectors and to the sensitivity,"<<endl;
173 cout <<
" where zero values specify the background ( voxels not taken into account during projection )" << endl;
175 cout <<
" -norm file.cdh : For list-mode data, provide a normalization data file for sensitivity computation (default: use the scanner LUT and" << endl;
176 cout <<
" assume all LORs with a weight of 1.). This restricts the computation of the sensitivity to the LORs provided in the" << endl;
177 cout <<
" normalization file and associated normalization factors and/or attenuation factors." << endl;
178 cout <<
" For dynamic reconstructions with multiple frames, as many normalization files as frames can be supplied, their names" << endl;
179 cout <<
" separated by commas. This is useful when dead-times correction is included in the normalization factors." << endl;
182 cout <<
" -atn file.hdr : Give an input attenuation image (unit has to be cm-1) for sensitivity image generation or SPECT attenuation correction." << endl;
184 cout <<
" -help-in : Print out this help." << endl;
202 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
203 if (mpi_rank!=0)
return;
207 cout <<
"[Output settings]:" << endl;
209 cout <<
" -fout name : Give the root name for all output files. All output files will be written as 'name_suffix.ext'." << endl;
210 cout <<
" So the provided name should not end with '.' or '/' character. (no default, alternative to -dout)" << endl;
211 cout <<
" -dout name : Give the name of the output directory where all output files will be written. All files will also" << endl;
212 cout <<
" be prefixed by the name of the directory. The provided name should not end with '.' or '/' character." << endl;
213 cout <<
" (no default, alternative to -fout)" << endl;
215 cout <<
" -oit list : Give the sequence of output iterations as a list of 'a:b' pairs separated by commas. This will output one" << endl;
216 cout <<
" iteration over 'a' until 'b' is reached, then it goes to the next pair of setting." << endl;
217 cout <<
" Set '-1' to save only the last iteration. (default: save all iterations)" << endl;
219 cout <<
" -fov-out percent : Give the percentage of the eliptical transaxial FOV to be kept while saving the image (default: no making)." << endl;
221 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;
223 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;
225 cout <<
" -onbp value : By default, numbers are displayed using scientific format. This option allows to customize the format and precision" << endl;
226 cout <<
" : The format is format,precision. f is the format (s=scientific, f=fixed), p is the precision" << endl;
227 cout <<
" eg: -onbp f,5 --> fixed with 5 digits precision, -onbp --> scientific with max precision." << endl;
229 cout <<
" -omd : (M)erge (D)ynamic images. Indicate if a dynamic serie of 3D images should be written on disk in one file" << endl;
230 cout <<
" instead of a serie of 3D images associated with an interfile metaheader." << endl;
232 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;
234 cout <<
" -osens : Flag to say that we want to save the sensitivity image of each subset/iteration, when in histogram mode." << endl;
236 cout <<
" -osub : Flag to say that we want to save the image after each subset." << endl;
238 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;
240 cout <<
" -sens-histo : If input file is a histogram, compute the global sensitivity from it (and still proceed to normal reconstruction after)." << endl;
242 cout <<
" -sens-only : For list-mode data, exit directly after computing and saving the sensitivity." << endl;
244 cout <<
" -help-out : Print out this help." << endl;
261 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
262 if (mpi_rank!=0)
return;
266 cout <<
"[Dimensions options]:" << endl;
268 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
270 cout <<
" -fov x,y,z : Give the size of the field-of-view in each dimension, in mm (default: those of the scanner)." << endl;
272 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;
274 cout <<
" -off x,y,z : Give the offset of the field-of-view in each dimension, in mm (default: 0.,0.,0.)." << endl;
275 cout <<
" (note this has no effect when using a pre-computed system matrix)" << endl;
277 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 : Specify the iterative optimization 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;
312 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;
313 cout <<
" or the list of parameters associated to the penalty (penalty,param1,param2,...). If only the penalty name is specified, the default" << endl;
314 cout <<
" configuration file is used if any. By default, no penalty is used. For specific help, use option -help-penalty." << endl;
315 cout <<
" -pnlt-beta : Give the strength of the penalty defined by the '-pnlt' option." << endl;
316 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;
318 cout <<
" -help-opti : Print out specific help about optimizer settings." << endl;
320 cout <<
" -help-pnlt : Print out specific help about penalty settings." << endl;
321 cout <<
" -help-algo : Print out specific help about the available algorithms." << endl;
338 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
339 if (mpi_rank!=0)
return;
342 cout <<
"[Projector settings]:" << endl;
344 cout <<
" -proj param : Give the projector to be used for both forward and backward projections, along with a configuration file (proj:file.conf)" << endl;
345 cout <<
" or the list of parameters associated to the projector (proj,param1,param2,...). If the projector only is specified, the" << endl;
346 cout <<
" default configuration file is used. By default, the Siddon projector is used. For specific help, use option -help-proj." << endl;
348 cout <<
" -projF param : Give the projector to be used for forward projections. See option -proj for details." << endl;
350 cout <<
" -projB param : Give the projector to be used for backward projections. See option -proj for details." << endl;
352 cout <<
" -proj-common : Give common projector-related options, such as TOF implementation options, see -help-projm for more details." << endl;
358 cout <<
" -ignore-TOF : Flag to say that we want to ignore any potential TOF information (default: use it if present in the datafile)." << endl;
360 cout <<
" -help-projm : Print out specific help about projector settings." << endl;
377 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
378 if (mpi_rank!=0)
return;
381 cout <<
"[Image processing settings]:" << endl;
383 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;
384 cout <<
" list of parameters associated to the convolver (conv,param1,param2,...::when). If the convolver only is specified, its default" << endl;
385 cout <<
" configuration file is used. By default, no convolver is applied. Multiple convolvers can be combined simply by repeating this" << endl;
386 cout <<
" this option. The mandatory 'when' parameter specifies when the convolver is applied (psf, sieve, forward, backward, post, intra)." << endl;
387 cout <<
" For more specific help, use option -help-conv." << endl;
389 cout <<
" -help-conv : Print out specific help about the image convolver settings." << endl;
391 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;
392 cout <<
" list of parameters associated to the module (proc,param1,param2,...;when). If the module only is specified, its default" << endl;
393 cout <<
" configuration file is used. By default, no image processing module is applied. Multiple modules can be combined simply by" << endl;
394 cout <<
" repeating this this option. The mandatory 'when' parameter specifies when the module is applied (forward, backward, post, intra)." << endl;
395 cout <<
" For more specific help, use option -help-proc." << endl;
397 cout <<
" -help-proc : Print out specific help about the image processing module settings." << endl;
414 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
415 if (mpi_rank!=0)
return;
419 cout <<
"[Dynamic settings]:" << endl;
421 cout <<
" -frm list : Give the framing details for the reconstruction where 'list' is a list of frame start times, separated with commas. " << endl;
422 cout <<
" Duration for each frame can also be specified using a colon after the frame start time. "<< endl;
423 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;
424 cout <<
" It is mandatory to specify the duration of the last frame. For example '-frm start1:duration1,start2,start3:duration3'."<< endl;
425 cout <<
" Add 's' or 'm' to specify if values are seconds or minutes (seconds is the default if none provided). " << endl;
426 cout <<
" Maximum precision of frames is milliseconds. (default: 1 frame of the whole input file duration)." << endl;
428 cout <<
" -g path_to_file : Provide text file for dynamic data splitting associated to respiratory/cardiac gating or involuntary patient motion correction" << endl;
440 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;
441 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;
443 cout <<
" -rm param : Provide an image-based deformation model to be used for respiratory motion correction, along with a configuration file (deformation:file)" << endl;
444 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
446 cout <<
" -cm param : Provide an image-based deformation model to be used for cardiac motion correction, along with a configuration file (deformation:file)" << endl;
447 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
452 cout <<
" -im param : Provide an image-based deformation model to be used for involuntary motion correction, along with a configuration file (deformation:file)" << endl;
453 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
455 cout <<
" -qdyn file : Provide a text file containing quantitative factors specific to dynamic frames, respiratory or cardiac gates." << endl;
456 cout <<
" The file should provide factors with the keywords 'FRAME_QUANTIFICATION_FACTORS' and 'GATE_QUANTIFICATION_FACTORS' " << endl;
457 cout <<
" The number of factors must be consistent with the number of frames/gates " << endl;
458 cout <<
" If the data contains several frames and gates, the gate quantification factors should be entered on a separate line for each frame " << endl;
460 cout <<
" -help-dynamic-model : Print out specific help about dynamic model." << endl;
462 cout <<
" -help-motion-model : Print out specific help about deformation models." << endl;
464 cout <<
" -help-dynamic : Print out this help." << endl;
482 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
483 if (mpi_rank!=0)
return;
487 cout <<
"[Computation settings]:" << endl;
490 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;
491 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;
495 cout <<
" -gpu : Flag to say that we want to use the GPU device (default: use the CPU only)." << endl;
498 cout <<
" -proj-comp : Give the strategy for projection line computation. Here are the three different strategies that can be used:" << endl;
499 cout <<
" 1 : Image-based system matrix elements storage: The voxels weights are added in a matrix representing the whole image, so" << endl;
500 cout <<
" the addition of a new line to the previous ones is straightforward only by adding the weights to the corresponding voxels." << endl;
501 cout <<
" As it is insanely long, it can possibly be used for example with extremely complex projectors that makes use of huge number" << endl;
502 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;
503 cout <<
" This strategy is not compatible with SPECT reconstruction including attenuation correction." << endl;
504 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;
505 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;
506 cout <<
" has a fixed size which is provided by the EstimateMaxNumberOfVoxelsPerLine() function from the vProjector class. There are no" << endl;
507 cout <<
" ckecks at all for possible buffer overflows. This is the fastest strategy and default one." << endl;
508 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;
509 cout <<
" upgraded if the current number of contributing voxels exceed the list's size. The first allocated size corresponds to the diagonal" << endl;
510 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;
511 cout <<
" is a bit slower than the fixed-list strategy during the first iteration, but is optimal with respect to RAM usage." << endl;
513 cout <<
" -rng-seed : Give a seed for the random number generator (should be >=0)" << endl;
515 cout <<
" -rng-extra : Give the number of additional random number generators, if needed (in addition to one rng per thread) " << endl;
517 cout <<
" -help-comp : Print out this help." << endl;
520 cout <<
" Compiled with MPI" << endl;
523 cout <<
" Compiled with OpenMP" << endl;
526 cout <<
" Compiled for GPU" << endl;
528 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU) 546 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
547 if (mpi_rank!=0)
return;
551 cout <<
"[Miscellaneous settings]:" << endl;
553 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
554 cout <<
" -vb-algo : Give the verbose level specific to the algorithm (default: same as general verbose level)." << endl;
555 cout <<
" -vb-opti : Give the verbose level specific to the optimizer (default: same as general verbose level)." << endl;
556 cout <<
" -vb-proj : Give the verbose level specific to the projector (default: same as general verbose level)." << endl;
557 cout <<
" -vb-conv : Give the verbose level specific to the image convolver (default: same as general verbose level)." << endl;
558 cout <<
" -vb-proc : Give the verbose level specific to the image processing (default: same as general verbose level)." << endl;
559 cout <<
" -vb-scan : Give the verbose level specific to the scanner (default: same as general verbose level)." << endl;
560 cout <<
" -vb-data : Give the verbose level specific to the data and image management (default: same as general verbose level)." << endl;
561 cout <<
" -vb-defo : Give the verbose level specific to the deformation (default: same as general verbose level)." << endl;
562 cout <<
" -vb-dyna : Give the verbose level specific to the dynamic model (default: same as general verbose level)." << endl;
563 cout <<
" -vb-sens : Give the verbose level specific to the sensitivity computation (default: same as general verbose level)." << endl;
565 cout <<
" -conf : Give the path to the CASToR config directory (default: located through the CASTOR_CONFIG environment variable)." << endl;
567 cout <<
" -help-misc : Print out this help." << endl;
584 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
585 if (mpi_rank!=0)
return;
589 cout <<
"[Correction settings]:" << endl;
591 cout <<
" -ignore-corr list : Give the list of corrections that should be ignored, separated by commas (default: all corrections applied if present)." << endl;
592 cout <<
" Here is a list of all corrections that can be ignored:" << endl;
593 cout <<
" - attn: to ignore the attenuation correction (emission only)" << endl;
594 cout <<
" - norm: to ignore the normalization correction (emission only)" << endl;
595 cout <<
" - rand: to ignore the random correction (PET only)" << endl;
596 cout <<
" - scat: to ignore the scatter correction" << endl;
597 cout <<
" - deca: to ignore the decay correction (emission only)" << endl;
598 cout <<
" - brat: to ignore the branching ratio correction (emission only)" << endl;
599 cout <<
" - fdur: to ignore the frame duration correction (emission only)" << endl;
600 cout <<
" - cali: to ignore the calibration correction (emission only)" << endl;
612 int main(
int argc,
char** argv)
620 MPI_Init(&argc, &argv);
621 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
622 MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
641 INTNB nb_voxX=-1, nb_voxY=-1, nb_voxZ=-1;
642 FLTNB fov_sizeX=-1., fov_sizeY=-1., fov_sizeZ=-1.;
643 FLTNB vox_sizeX=-1., vox_sizeY=-1., vox_sizeZ=-1.;
645 FLTNB offsetX = 0., offsetY = 0., offsetZ = 0.;
649 string flip_out =
"";
656 string frame_list =
"";
658 int nb_resp_gates = 1;
660 int nb_card_gates = 1;
662 string path_to_4D_data_splitting_file =
"";
664 string dynamic_model_options =
"";
666 string resp_motion_options =
"";
668 string card_motion_options =
"";
670 string double_motion_options =
"";
672 string ipat_motion_options =
"";
674 int nb_resp_basis = 1;
675 string path_to_resp_basis_coef =
"";
677 int nb_card_basis = 1;
678 string path_to_card_basis_coef =
"";
680 string path_to_dynamic_quantification_file=
"";
690 vector<string> path_to_data_filename;
692 bool invert_datafile_bed_order_flag =
false;
694 string path_to_initial_img =
"";
696 string path_to_sensitivity_img =
"";
698 vector<string> path_to_normalization_filename;
700 string path_to_attenuation_img;
702 vector<string> path_to_multimodal_img;
704 string path_to_mask_img =
"";
706 int nb_atn_resp_imgs = 1;
707 int nb_atn_card_imgs = 1;
709 string ignored_corrections =
"";
716 string path_dout =
"";
718 string path_fout =
"";
720 string output_iterations =
"";
722 bool merge_dynamic_imgs_flag =
false;
724 bool save_LUT_flag =
false;
726 bool save_sens_histo =
false;
728 bool save_subset_image =
false;
730 bool save_dynamic_basis_coefficients_flag =
false;
732 bool exit_after_sensitivity =
false;
734 bool sensitivity_from_histogram =
false;
736 string onb_prec =
"s,0";
743 string options_projector =
"incrementalSiddon";
744 string options_projectorF =
"incrementalSiddon";
745 string options_projectorB =
"incrementalSiddon";
746 string options_projector_common =
"3.,1,1";
750 bool ignore_POI =
false;
751 bool ignore_TOF =
false;
758 string nb_iterations_subsets =
"";
760 string options_optimizer =
"MLEM";
762 bool optimizer_fom =
false;
764 bool optimizer_stat =
false;
766 string options_penalty =
"";
768 string options_prob =
"";
770 FLTNB penalty_beta = -1.;
778 vector<string> options_image_convolver;
780 vector<string> options_image_processing;
787 bool gpu_flag =
false;
789 string nb_threads =
"1";
796 int verbose_general = 1;
798 int verbose_algo = -1;
799 int verbose_opti = -1;
800 int verbose_proj = -1;
801 int verbose_conv = -1;
802 int verbose_proc = -1;
803 int verbose_scan = -1;
804 int verbose_data = -1;
805 int verbose_defo = -1;
806 int verbose_dyna = -1;
807 int verbose_sens = -1;
809 string path_to_config_dir =
"";
811 int64_t random_generator_seed = -1;
812 int nb_extra_random_generators = 0;
821 for (
int i=1; i<argc; i++)
825 string option = (string)argv[i];
832 if (option==
"-h" || option==
"--help" || option==
"-help")
838 else if (option==
"-help-scan")
841 Cerr(
"***** castor-recon() -> An error occurred when trying to output the available scanners from the scanner repository !'" << endl;);
845 else if (option==
"-help-prob")
854 else if (option==
"-help-opti")
860 else if (option==
"-help-pnlt")
866 else if (option==
"-help-projm")
875 else if (option==
"-help-conv")
884 else if (option==
"-help-proc")
893 else if (option==
"-help-dynamic-model")
899 else if (option==
"-help-motion-model")
905 else if (option==
"-help-in")
911 else if (option==
"-help-out")
917 else if (option==
"-help-dim")
923 else if (option==
"-help-algo")
929 else if (option==
"-help-proj")
935 else if (option==
"-help-imgp")
941 else if (option==
"-help-comp")
947 else if (option==
"-help-misc")
953 else if (option==
"-help-dynamic")
959 else if (option==
"-help-corr")
965 else if (option==
"-vb")
969 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
974 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_general <<
" for option: " << option << endl);
980 else if (option==
"-vb-algo")
984 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
989 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_algo <<
" for option: " << option << endl);
995 else if (option==
"-vb-opti")
999 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1004 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_opti <<
" for option: " << option << endl);
1010 else if (option==
"-vb-proj")
1014 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1019 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proj <<
" for option: " << option << endl);
1025 else if (option==
"-vb-conv")
1029 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1034 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_conv <<
" for option: " << option << endl);
1040 else if (option==
"-vb-proc")
1044 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1049 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proc <<
" for option: " << option << endl);
1055 else if (option==
"-vb-scan")
1059 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1064 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_scan <<
" for option: " << option << endl);
1070 else if (option==
"-vb-data")
1074 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1079 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_data <<
" for option: " << option << endl);
1085 else if (option==
"-vb-defo")
1089 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1094 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_defo <<
" for option: " << option << endl);
1100 else if (option==
"-vb-dyna")
1104 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1109 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_dyna <<
" for option: " << option << endl);
1115 else if (option==
"-vb-sens")
1119 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1124 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_sens <<
" for option: " << option << endl);
1130 else if (option==
"-rng-seed")
1134 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1139 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << random_generator_seed <<
" for option: " << option << endl);
1145 else if (option==
"-rng-extra")
1149 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1154 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << nb_extra_random_generators <<
" for option: " << option << endl);
1160 else if (option==
"-conf")
1164 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1167 path_to_config_dir = (string)argv[i+1];
1176 else if (option==
"-dim")
1180 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1186 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1195 else if (option==
"-fov")
1199 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1205 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1208 fov_sizeX = input[0];
1209 fov_sizeY = input[1];
1210 fov_sizeZ = input[2];
1214 else if (option==
"-vox")
1218 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1224 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1227 vox_sizeX = input[0];
1228 vox_sizeY = input[1];
1229 vox_sizeZ = input[2];
1233 else if (option==
"-off")
1237 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1243 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1252 else if (option==
"-fov-out")
1256 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1259 fov_out = atof(argv[i+1]);
1263 else if (option==
"-slice-out")
1267 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1270 slice_out = ((
INTNB)(atoi(argv[i+1])));
1274 else if (option==
"-flip-out")
1278 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1281 flip_out = (string)(argv[i+1]);
1290 else if (option==
"-frm")
1294 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1297 frame_list = (string)argv[i+1];
1301 else if (option==
"-g")
1305 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1309 path_to_4D_data_splitting_file = ((string)argv[i+1]);
1313 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);
1319 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);
1323 if (nb_resp_gates<1 || nb_card_gates <1)
1325 Cerr(
"***** castor-recon() -> Incorrect initialization of the number of gates for the option: " << option <<
". This number should be >= 1" << endl);
1392 else if (option==
"-dynamic-model")
1396 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1399 dynamic_model_options = (string)argv[i+1];
1403 else if (option==
"-rm")
1407 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1410 resp_motion_options = (string)argv[i+1];
1414 else if (option==
"-cm")
1418 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1421 card_motion_options = (string)argv[i+1];
1437 else if (option==
"-im")
1441 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1444 ipat_motion_options = (string)argv[i+1];
1448 else if (option==
"-qdyn")
1452 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1455 path_to_dynamic_quantification_file = (string)argv[i+1];
1464 else if (option==
"-df")
1468 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1471 string file_name = (string)argv[i+1];
1472 path_to_data_filename.push_back(file_name);
1477 else if (option==
"-df-inv")
1479 invert_datafile_bed_order_flag =
true;
1482 else if (option==
"-img")
1486 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1489 path_to_initial_img = argv[i+1];
1493 else if (option==
"-sens")
1497 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1501 path_to_sensitivity_img = argv[i+1];
1505 else if (option==
"-norm")
1509 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1512 string file_name = (string)argv[i+1];
1513 path_to_normalization_filename.push_back(file_name);
1518 else if (option==
"-atn")
1522 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1526 path_to_attenuation_img = (string)argv[i+1];
1528 if (path_to_attenuation_img !=
"")
1535 Cerr(
"***** castor-recon() -> An error occurred while trying to read the interfile header of attenuation file " << path_to_attenuation_img <<
" !" << endl);
1544 else if (option==
"-multimodal")
1548 Cerr(
"***** Argument missing for option: " << option << endl);
1551 string file_name = (string)argv[i+1];
1552 path_to_multimodal_img.push_back(file_name);
1556 else if (option==
"-mask")
1560 Cerr(
"***** Argument missing for option: " << option << endl);
1564 path_to_mask_img = argv[i+1];
1573 else if (option==
"-dout")
1577 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1580 path_dout = argv[i+1];
1584 else if (option==
"-fout")
1588 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1591 path_fout = argv[i+1];
1595 else if (option==
"-oit")
1599 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1602 output_iterations = (string)argv[i+1];
1606 else if (option==
"-onbp")
1610 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1613 onb_prec = argv[i+1];
1617 else if (option==
"-omd")
1619 merge_dynamic_imgs_flag =
true;
1622 else if (option==
"-olut")
1624 save_LUT_flag =
true;
1627 else if (option==
"-osens")
1629 save_sens_histo =
true;
1632 else if (option==
"-osub")
1634 save_subset_image =
true;
1637 else if (option==
"-odyn")
1639 save_dynamic_basis_coefficients_flag =
true;
1642 else if (option==
"-sens-only")
1644 exit_after_sensitivity =
true;
1647 else if (option==
"-sens-histo")
1649 sensitivity_from_histogram =
true;
1657 else if (option==
"-it")
1661 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1664 nb_iterations_subsets = (string)argv[i+1];
1668 else if (option==
"-opti")
1672 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1675 options_optimizer = (string)argv[i+1];
1679 else if (option==
"-opti-fom")
1681 optimizer_fom =
true;
1684 else if (option==
"-opti-stat")
1686 optimizer_stat =
true;
1689 else if (option==
"-pnlt")
1693 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1696 options_penalty = (string)argv[i+1];
1701 else if (option==
"-prob")
1705 Cerr(
"***** Argument missing for option: " << option << endl);
1708 options_prob = (string)argv[i+1];
1712 else if (option==
"-pnlt-beta")
1716 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1719 penalty_beta = (
FLTNB)atof(argv[i+1]);
1723 else if (option==
"-conv")
1727 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1730 string convolver = (string)argv[i+1];
1731 options_image_convolver.push_back(convolver);
1735 else if (option==
"-proc")
1739 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1742 string module = (string)argv[i+1];
1743 options_image_processing.push_back(module);
1752 else if (option==
"-proj")
1756 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1759 options_projectorF = (string)argv[i+1];
1760 options_projectorB = (string)argv[i+1];
1764 else if (option==
"-projF")
1768 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1771 options_projectorF = (string)argv[i+1];
1775 else if (option==
"-projB")
1779 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1782 options_projectorB = (string)argv[i+1];
1786 else if (option==
"-proj-common")
1790 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1793 options_projector_common = (string)argv[i+1];
1797 else if (option==
"-ignore-TOF")
1802 else if (option==
"-ignore-POI")
1807 else if (option==
"-proj-comp")
1811 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1814 projector_computation_strategy = atoi(argv[i+1]);
1823 else if (option==
"-ignore-corr")
1827 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1830 ignored_corrections = (string)argv[i+1];
1840 else if (option==
"-gpu")
1847 else if (option==
"-th")
1851 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1854 nb_threads = (string)argv[i+1];
1858 else if (option==
"-th")
1862 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1865 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1866 Cerr(
"!!!!! castor-recon() -> Option -th is available only if the code is compiled using the CASTOR_OMP environment variable set to 1 !" << endl);
1867 Cerr(
"!!!!! The execution will continue BUT WITH ONLY ONE THREAD !" << endl);
1868 Cerr(
"!!!!! We strongly advice to compile CASToR with OpenMP !" << endl);
1869 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1880 Cerr(
"***** castor-recon() -> Unknown option '" << option <<
"' !" << endl);
1887 MPI_Barrier(MPI_COMM_WORLD);
1891 if (verbose_algo==-1) verbose_algo = verbose_general;
1892 if (verbose_opti==-1) verbose_opti = verbose_general;
1893 if (verbose_proj==-1) verbose_proj = verbose_general;
1894 if (verbose_conv==-1) verbose_conv = verbose_general;
1895 if (verbose_proc==-1) verbose_proc = verbose_general;
1896 if (verbose_scan==-1) verbose_scan = verbose_general;
1897 if (verbose_data==-1) verbose_data = verbose_general;
1898 if (verbose_defo==-1) verbose_defo = verbose_general;
1899 if (verbose_dyna==-1) verbose_dyna = verbose_general;
1900 if (verbose_sens==-1) verbose_sens = verbose_general;
1909 Cerr(
"***** castor-recon() -> Please provide at least one data filename !" << endl);
1913 if (path_fout.empty() && path_dout.empty())
1915 Cerr(
"***** castor-recon() -> Please provide an output option for output files (-fout or -dout) !" << endl);
1919 if (!path_fout.empty() && !path_dout.empty())
1921 Cerr(
"***** castor-recon() -> Please provide either output option -fout or -dout but not both !" << endl);
1927 if ( (nb_resp_gates>1 || nb_card_gates>1) && path_to_4D_data_splitting_file.empty() )
1929 Cerr(
"***** castor-recon() -> gating is enabled, but no file describing the splitting of the data has been provided (-g option) !" << endl);
1934 if (!options_prob.empty())
1936 if (!options_image_convolver.empty())
1938 Cerr(
"***** castor-recon() -> Image convolution option is not compatible with the RCP-GS algorithm !" << endl);
1942 if (!frame_list.empty() || !path_to_4D_data_splitting_file.empty())
1944 Cerr(
"***** castor-recon() -> Dynamic reconstruction is not compatible with the RCP-GS algorithm !" << endl);
1947 if (nb_extra_random_generators!=2)
1949 Cerr(
"***** castor-recon() -> The number of random generators must be 2 for the RCP-GS algorithm!" << endl);
1952 if (!options_penalty.empty())
1954 Cerr(
"***** castor-recon() -> Penalties are not compatible with the RCP-GS algorithm !" << endl);
1963 if (verbose_general>=5)
Cout(
"----- Singletons initializations ... -----" << endl);
1973 p_outputManager->
SetVerbose(verbose_general);
1987 Cerr(
"***** castor-recon() -> A problem occurred while checking for the config directory path !" << endl);
1993 Cerr(
"***** castor-recon() -> A problem occurred while initializing output directory !" << endl);
1997 #ifdef CASTOR_VERSION 1998 Cout(
"castor-recon() -> Launch reconstruction from CASToR version " <<
CASTOR_VERSION <<
"." << endl);
2003 Cerr(
"***** castor-recon() -> A problem occurred while logging command line arguments !" << endl);
2016 if (p_ImageDimensionsAndQuantification->
SetNbThreads(nb_threads))
2018 Cerr(
"***** castor-recon() -> A problem occurred while setting the number of threads !" << endl);
2030 if (verbose_general>=5)
Cout(
"----- Geometry Initialization ... -----" << endl);
2035 string scanner_name =
"";
2038 Cerr(
"***** castor-recon() -> A problem occurred while trying to find the system name in the datafile header !" << endl);
2043 Cerr(
"***** castor-recon() -> A problem occurred while searching for scanner system !" << endl);
2048 Cerr(
"***** castor-recon() -> A problem occurred during scanner object construction ! !" << endl);
2053 Cerr(
"***** castor-recon() -> A problem occurred while creating Scanner object !" << endl);
2058 Cerr(
"***** castor-recon() -> A problem occurred while retrieving scanner fields from the datafile header !" << endl);
2063 Cerr(
"***** castor-recon() -> A problem occurred while generating/reading the LUT !" << endl);
2069 Cerr(
"***** castor-recon() -> A problem occurred while checking scanner manager parameters !" << endl);
2074 Cerr(
"***** castor-recon() -> A problem occurred while initializing scanner !" << endl);
2079 if (nb_voxX<=0 || nb_voxY<=0 || nb_voxZ<=0)
2083 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of transaxial voxels !" << endl);
2088 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of transaxial voxels !" << endl);
2093 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of axial voxels !" << endl);
2098 if ( (fov_sizeX<=0 || fov_sizeY<=0 || fov_sizeZ<=0) && (vox_sizeX<=0 || vox_sizeY<=0 || vox_sizeZ<=0) )
2102 Cerr(
"***** castor-recon() -> A problem occurred while reading for default transaxial FOV size !" << endl);
2107 Cerr(
"***** castor-recon() -> A problem occurred while reading for default transaxial FOV size !" << endl);
2112 Cerr(
"***** castor-recon() -> A problem occurred while reading for default axial FOV size !" << endl);
2117 if (verbose_general>=5)
Cout(
"----- Geometry Initialization OK -----" << endl);
2123 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization ... -----" << endl);
2125 p_ImageDimensionsAndQuantification->
SetNbBeds(nb_beds);
2126 p_ImageDimensionsAndQuantification->
SetNbVoxX(nb_voxX);
2127 p_ImageDimensionsAndQuantification->
SetNbVoxY(nb_voxY);
2128 p_ImageDimensionsAndQuantification->
SetNbVoxZ(nb_voxZ);
2129 p_ImageDimensionsAndQuantification->
SetVoxSizeX(vox_sizeX);
2130 p_ImageDimensionsAndQuantification->
SetVoxSizeY(vox_sizeY);
2131 p_ImageDimensionsAndQuantification->
SetVoxSizeZ(vox_sizeZ);
2132 p_ImageDimensionsAndQuantification->
SetFOVSizeX(fov_sizeX);
2133 p_ImageDimensionsAndQuantification->
SetFOVSizeY(fov_sizeY);
2134 p_ImageDimensionsAndQuantification->
SetFOVSizeZ(fov_sizeZ);
2136 p_ImageDimensionsAndQuantification->
SetOffsetX(offsetX);
2137 p_ImageDimensionsAndQuantification->
SetOffsetY(offsetY);
2138 p_ImageDimensionsAndQuantification->
SetOffsetZ(offsetZ);
2140 p_ImageDimensionsAndQuantification->
SetVerbose(verbose_data);
2142 p_ImageDimensionsAndQuantification->
SetFrames(frame_list);
2144 if (p_ImageDimensionsAndQuantification->
SetFlipOut(flip_out))
2146 Cerr(
"***** castor-recon() -> A problem occurred while setting the output flip option !" << endl);
2150 if (resp_motion_options==
"" && double_motion_options==
"")
2152 p_ImageDimensionsAndQuantification->
SetNbRespGates(nb_resp_gates);
2158 if (path_to_resp_basis_coef!=
"")
2160 Cerr(
"***** castor-recon() -> Cannot use both respiratory motion correction and respiratory basis functions, it has no sense !" << endl);
2166 if (card_motion_options==
"" && double_motion_options==
"")
2168 p_ImageDimensionsAndQuantification->
SetNbCardGates(nb_card_gates);
2174 if (path_to_card_basis_coef!=
"")
2176 Cerr(
"***** castor-recon() -> Cannot use both cardiac motion correction and cardiac basis functions, it has no sense !" << endl);
2184 Cerr(
"***** castor-recon() -> A problem occurred while checking image dimensions parameters !" << endl);
2187 if (p_ImageDimensionsAndQuantification->
Initialize())
2189 Cerr(
"***** castor-recon() -> A problem occurred while initializing image dimensions !" << endl);
2193 if (p_ImageDimensionsAndQuantification->
InitDynamicData(path_to_4D_data_splitting_file,
2194 !resp_motion_options.empty(),
2195 !card_motion_options.empty(),
2196 !ipat_motion_options.empty(),
2200 Cerr(
"***** castor-recon() -> A problem occurred while initializing Dynamic data manager's class !" << endl);
2205 int64_t nb_events = 0;
2210 Cerr(
"***** castor-recon() -> A problem occurred while checking Dynamic data manager's parameters !" << endl);
2216 Cerr(
"***** castor-recon() -> A problem occurred while initializing specific dynamic quantification factors!" << endl);
2220 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization OK -----" << endl);
2234 if (verbose_general>=5)
Cout(
"----- Random number generator initialization ... -----" << endl);
2237 p_RandomNumberGenerator->
SetVerbose(verbose_general);
2239 if (random_generator_seed>=0) p_RandomNumberGenerator->
Initialize(random_generator_seed, p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2240 else p_RandomNumberGenerator->
Initialize(p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2242 if (verbose_general >=5)
Cout(
"----- Random number generator initialization OK -----" << endl);
2248 if (verbose_general>=5)
Cout(
"----- DataFile initialization ... -----" << endl);
2255 for (
int i=0 ; i<nb_beds ; i++)
2258 (
dynamic_cast<iDataFilePET*
>(p_DataFile[i]))->SetIgnoreTOFFlag(ignore_TOF);
2264 for (
int i=0 ; i<nb_beds ; i++)
2272 for (
int i=0 ; i<nb_beds ; i++)
2280 Cerr(
"***** castor-recon() -> Unknown scanner type (" << p_ScannerManager->
GetScannerType() <<
") for datafile construction ! Abort." << endl);
2285 for (
int bed=0 ; bed<nb_beds ; bed++)
2288 if (invert_datafile_bed_order_flag) p_DataFile[bed]->
SetHeaderDataFileName(path_to_data_filename.at(nb_beds-1-bed));
2294 if (p_DataFile[bed]->ReadInfoInHeader())
2296 Cerr(
"***** castor-recon() -> A problem occurred during datafile header reading ! Abort." << endl);
2299 if (p_DataFile[bed]->CheckParameters())
2301 Cerr(
"***** castor-recon() -> A problem occurred while checking datafile parameters ! Abort." << endl);
2304 if (p_DataFile[bed]->ComputeSizeEvent())
2306 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2309 if (p_DataFile[bed]->InitializeMappedFile())
2311 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2314 if (p_DataFile[bed]->PrepareDataFile())
2316 Cerr(
"***** castor-recon() -> A problem occurred in datafile preparation ! Abort." << endl);
2321 for (
int bed=1; bed<nb_beds; bed++)
2323 if (p_DataFile[0]->CheckConsistencyWithAnotherBedDataFile(p_DataFile[bed]))
2325 int bed_index_problem = bed + 1;
2326 if (invert_datafile_bed_order_flag) bed_index_problem = nb_beds - bed;
2327 Cerr(
"***** castor-recon() -> A problem occurred while checking consistency between first bed and bed " << bed_index_problem <<
" !" << endl);
2334 Cerr(
"***** castor-recon() -> A problem occurred while dealing with the bed positions !" << endl);
2338 if (verbose_general>=5)
Cout(
"----- DataFile initialization OK -----" << endl);
2345 if (verbose_general>=5)
Cout(
"----- Projector initialization ... -----" << endl);
2357 if (!path_to_mask_img.empty())
2361 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);
2368 p_ProjectorManager->
SetVerbose(verbose_proj);
2372 Cerr(
"***** castor-recon() -> A problem occurred while checking projector manager's parameters !" << endl);
2378 Cerr(
"***** castor-recon() -> A problem occurred while initializing projector manager !" << endl);
2384 Cerr(
"***** castor-recon() -> A problem occurred while checking projector's compatibility with SPECT and attenuation correction !" << endl);
2388 if (verbose_general>=5)
Cout(
"----- Projector initialization OK -----" << endl);
2395 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization (if any) ... -----" << endl);
2400 p_DynamicModelManager->
SetOptions(dynamic_model_options);
2401 p_DynamicModelManager->
SetVerbose(verbose_dyna);
2405 Cerr(
"***** castor-recon() -> A problem occurred while checking dynamic model manager's parameters !" << endl);
2409 int DynamicModelinitialisation = p_DynamicModelManager->
Initialize();
2410 if (DynamicModelinitialisation ==1)
2412 Cerr(
"***** castor-recon() -> A problem occurred while initializing dynamic model manager !" << endl);
2416 else if (DynamicModelinitialisation ==2)
2418 Cout(
"----- Dynamic model: No parameters given - setting diagonal basis functions !" << endl);
2422 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization OK -----" << endl);
2430 if (verbose_general>=5)
Cout(
"----- Optimizer initialization ... -----" << endl);
2436 p_OptimizerManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2437 p_OptimizerManager->
SetDataType(p_DataFile[0]->GetDataType());
2438 p_OptimizerManager->
SetDataSpec(p_DataFile[0]->GetDataSpec());
2444 p_OptimizerManager->
SetVerbose(verbose_opti);
2448 Cerr(
"***** castor-recon() -> A problem occurred while checking optimizer manager's parameters !" << endl);
2454 Cerr(
"***** castor-recon() -> A problem occurred while initializing optimizer manager !" << endl);
2458 if (verbose_general>=5)
Cout(
"----- Optimizer initialization OK -----" << endl);
2465 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization (if any) ... -----" << endl);
2469 p_ImageConvolverManager->
SetVerbose(verbose_conv);
2471 p_ImageConvolverManager->
SetOptions(options_image_convolver);
2475 Cerr(
"***** castor-recon() -> A problem occurred while checking image convolver manager's parameters !" << endl);
2481 Cerr(
"***** castor-recon() -> A problem occurred while initializing image convolver manager !" << endl);
2485 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization OK -----" << endl);
2492 if (verbose_general>=5)
Cout(
"----- Image Processing initialization (if any) ... -----" << endl);
2496 p_ImageProcessingManager->
SetVerbose(verbose_proc);
2498 p_ImageProcessingManager->
SetOptions(options_image_processing);
2502 Cerr(
"***** castor-recon() -> A problem occurred while checking image processing manager's parameters !" << endl);
2508 Cerr(
"***** castor-recon() -> A problem occurred while initializing image processing manager !" << endl);
2512 if (verbose_general>=5)
Cout(
"----- Image Processing initialization OK -----" << endl);
2520 if (verbose_general>=5)
Cout(
"----- Image deformation initialization (if any) ... -----" << endl);
2525 p_DeformationManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2527 if(resp_motion_options !=
"")
2529 p_DeformationManager->
SetOptions(resp_motion_options);
2533 else if (card_motion_options !=
"")
2535 p_DeformationManager->
SetOptions(card_motion_options);
2539 else if (double_motion_options !=
"")
2541 p_DeformationManager->
SetOptions(double_motion_options);
2545 else if (ipat_motion_options !=
"")
2547 p_DeformationManager->
SetOptions(ipat_motion_options);
2554 p_DeformationManager->
SetVerbose(verbose_defo);
2558 Cerr(
"***** castor-recon() -> A problem occurred while checking image deformation manager's parameters !" << endl);
2564 Cerr(
"***** castor-recon() -> A problem occurred while initializing image deformation manager !" << endl);
2568 if (verbose_general >=5)
Cout(
"----- Image deformation initialization OK -----" << endl);
2587 if ( path_to_sensitivity_img.empty() && (p_DataFile[0]->
GetDataMode()==
MODE_LIST || sensitivity_from_histogram) )
2590 if (verbose_general>=5)
Cout(
"----- Image Sensitivity generation initialization ... -----" << endl);
2611 Cerr(
"***** castor-recon() -> A problem occurred while checking parameters of the sensitivity generator !" << endl);
2617 Cerr(
"***** castor-recon() -> A problem occurred while initializing the sensitivity generator !" << endl);
2623 if (p_Sensitivity->
Launch())
2625 Cerr(
"***** castor-recon() -> A problem occurred while computing the sensitivity !" << endl);
2635 else path_to_sensitivity_img =
"";
2637 delete p_Sensitivity;
2639 if (exit_after_sensitivity)
2641 if (verbose_general>=
VERBOSE_LIGHT)
Cout(
"castor-recon() -> Asked to exit after sensitivity computation." << endl);
2643 delete p_ImageSpace;
2644 delete p_DeformationManager;
2645 delete p_DynamicModelManager;
2646 delete p_ImageProcessingManager;
2647 delete p_ImageConvolverManager;
2648 delete p_OptimizerManager;
2649 delete p_ProjectorManager;
2650 for (
int i=0 ; i<nb_beds ; i++)
delete p_DataFile[i];
2651 delete[] p_DataFile;
2652 delete p_ImageDimensionsAndQuantification;
2667 if (verbose_general>=5)
Cout(
"----- Iterative reconstruction algorithm initialization ... -----" << endl);
2671 string algorithm_options =
"";
2678 if (!options_prob.empty())
2680 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization ... -----" << endl);
2685 p_ChronoManager->
SetVerbose(verbose_general);
2688 Cerr(
"***** castor-recon() -> A problem occured while checking parameters for the chrono manager !" << endl);
2693 Cerr(
"***** castor-recon() -> A problem occured while initializing the chrono manager !" << endl);
2697 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization OK -----" << endl);
2701 algorithm_options = options_prob;
2703 else if (!options_optimizer.empty())
2709 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization ... -----" << endl);
2715 p_ChronoManager->
SetVerbose(verbose_general);
2718 Cerr(
"***** castor-recon() -> A problem occured while checking parameters for the chrono manager !" << endl);
2723 Cerr(
"***** castor-recon() -> A problem occured while initializing the chrono manager !" << endl);
2727 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization OK -----" << endl);
2757 Cerr(
"***** castor-recon() -> Error while setting the numbers of iterations and subsets !" << endl);
2762 Cerr(
"***** castor-recon() -> Error while setting the selected output iterations !" << endl);
2767 Cerr(
"***** Error while setting specific options for this algorithm !" << endl);
2770 if (p_Algorithm->
Run())
2772 Cerr(
"***** castor-recon() -> Error while performing the reconstruction" << endl);
2784 if (verbose_general>=5)
Cout(
"----- Deleting CASToR objects ... -----" << endl);
2786 delete p_ImageSpace;
2787 delete p_DeformationManager;
2788 delete p_DynamicModelManager;
2789 delete p_ImageProcessingManager;
2790 delete p_ImageConvolverManager;
2791 delete p_OptimizerManager;
2792 delete p_ProjectorManager;
2793 for (
int i=0 ; i<nb_beds ; i++)
delete p_DataFile[i];
2794 delete[] p_DataFile;
2795 delete p_ImageDimensionsAndQuantification;
2796 if (verbose_general>=5)
Cout(
"----- CASToR objects successfully deleted -----" << endl);
2799 if (verbose_general>=1)
Cout(endl);
2803 return EXIT_SUCCESS;
void SetNbThreads(int a_nbThreadsForProjection, int a_nbThreadsForImageComputation)
Set the number of threads for both projection and image computations.
void SetImageConvolverManager(oImageConvolverManager *ap_ImageConvolverManager)
Set the Image Convolver Manager Object.
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.
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.
Declaration of class vAlgorithm.
void SetNumberOfAtnGateImages(int a_nbAtnRespGateImages, int a_nbAtnCardGateImages)
virtual int InitSpecificOptions(string a_specificOptions)
void SetVerbose(int a_verbose)
set verbosity
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 SetPathToAttenuationImage(string a_pathToAttenuationImage)
This function is used to set the path to the attenuation image.
void SetIgnoredCorrections(const string &a_ignoredCorrectionsList)
Set the string specifying the corrections that will be ignored.
int SetNbIterationsAndSubsets(const string &a_nbIterationsSubsets)
Set the number of iterations and subsets.
void SetNbCustomSteps(int a_nbCustomSteps)
Set the number of custom steps for profiling.
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 SetImageSpace(oImageSpace *ap_ImageSpace)
Set the Image Space Object.
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.
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 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 SetOptions(const string &a_options)
Set the respiratory motion options contained in the provided string.
int CheckParameters()
Check validity of all parameters.
void SetOptimizerManager(oOptimizerManager *ap_OptimizerManager)
Set the Optimizer Manager Object.
void SetSaveDynamicBasisCoefficientImages(bool a_saveDynamicBasisCoefficients)
Set the flag that specifies if the dynamic basis functions coefficients images have to be saved...
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...
Declaration of class oIterativeAlgorithm.
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.
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 Run()
Just call either the RunCPU or the RunGPU function as asked for.
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.
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.
void SetOptionsPenalty(const string &a_optionsPenalty, FLTNB a_penaltyStrength)
Set the penalty projection options contained in the provided string.
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.
void SetPathToMaskImage(string a_pathToMaskImage)
Set path to a mask image.
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.
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...
void SetDynamicModelManager(oDynamicModelManager *ap_DynamicModelManager)
Set the Dynamic Model Manager Object.
static sAddonManager * GetInstance()
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 SetPathToMultiModalImage(vector< string > a_pathToMultiModalImage)
Set path to multimodal images.
void SetDataMode(int a_dataMode)
Set the mode of the data (histogram, list-mode)
void SetPathInitImage(string a_pathToInitialImage)
Set path to an initial image.
#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)
void SetGPUflag(bool a_flagGPU)
Set the GPU flag.
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)
RCP-GS : Random Clustering Prior - Gibbs Sampler.
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 SetOptions(vector< string > a_options)
Set the member m_options to the provided value.
int CheckParameters()
A function used to check the parameters settings.
Declaration of class sScannerManager.
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 SetMPIRank(int a_mpiRank)
Initialize the machine index for MPI.
void SetVerbose(int a_verboseLevel)
Set the verbose level.
int InitDynamicData(string a_pathTo4DDataSplittingFile, int a_respMotionCorrectionFlag, int a_cardMotionCorrectionFlag, int a_invMotionCorrectionFlag, int a_nbRespGates, int a_nbCardGates)
Call the eponym function from the oDynamicDataManager object in order to initialize its data...
void SetDataFile(vDataFile **a2p_DataFile)
This function is used to set the pointer to the vDataFile array in use.
void SetSaveSubsetImageFlag(bool a_saveImageAfterSubsets)
Set the flag that specifies if the image has to be saved for each subset.
void SetDataFile(vDataFile *ap_DataFile)
Set a data file in use to later recover some information from it.
void SetDataFile(vDataFile **a2p_DataFile)
Set the list of DataFile.
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
bool GetNeedGlobalSensitivity()
Get the boolean saying if the sensitivity has to be computed globally.
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.
int CheckParameters()
This function is used to check parameters after the latter have been all set using Set functions...
void SetImageProcessingManager(oImageProcessingManager *ap_ImageProcessingManager)
Set the Image Processing Manager Object.
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 SetPathToSensitivityImage(string a_pathToSensitivityImage)
Set path to the sensitivity image.
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 SetProjectorManager(oProjectorManager *ap_ProjectorManager)
Set the Projector Manager Object.
void SetBedIndex(int a_bedIndex)
set the bed index corresponding to this data file
This is the base class for reconstructions, containing a framework with iteration and data subset loo...
Declaration of class sOutputManager.
This class holds all the matrices in the image domain that can be used in the algorithm: image...
void SetVerbose(int a_verboseLevel)
Set Verbosity.
int GetNbThreadsForImageComputation()
Get the number of threads used for image operations.
int SetOutputIterations(const string &a_outputIterations)
Set the selected output iterations.
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.
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)...
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 SetDeformationManager(oDeformationManager *ap_DeformationManager)
Set the Deformation Manager Object.
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 cardiac basis functions coefficients.
void SetScanner(vScanner *ap_Scanner)
Set the scanner in use.
void ShowHelpAlgo()
Display command line options related to the available algorithms. For iterative algorithms based on o...
void ShowHelpOptimizer()
Show help about all implemented optimizers.
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.
static sChronoManager * GetInstance()
Instantiate the singleton if not already done, then return the pointer to its instance.
This class is designed to manage the computation of the sensitivity image.
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Set the Image Dimensions and Quantification Object.
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...