12 #include "gVariables.hh" 13 #include "gOptions.hh" 14 #include "iRCPGSAlgorithm.hh" 15 #include "vAlgorithm.hh" 16 #include "iIterativeAlgorithm.hh" 17 #include "oSensitivityGenerator.hh" 18 #include "oImageDimensionsAndQuantification.hh" 19 #include "iDataFilePET.hh" 20 #include "iDataFileSPECT.hh" 21 #include "iDataFileCT.hh" 22 #include "sOutputManager.hh" 23 #include "sScannerManager.hh" 24 #include "sRandomNumberGenerator.hh" 25 #include "iScannerPET.hh" 26 #include "sAddonManager.hh" 27 #include "sChronoManager.hh" 47 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
48 if (mpi_rank!=0)
return;
52 cout <<
"Usage: castor-recon.exe -df file.cdh -(f/d)out output -it iter [settings]" << endl;
54 cout <<
"[Main options]:" << endl;
55 cout <<
" -df file.cdh : Give an input CASTOR datafile header (no default)." << endl;
57 cout <<
" -fout name : Give the root name for all output files (no default, alternative to -dout)" << endl;
58 cout <<
" -dout name : Give the name of the output directory where all output files will be written (no default, alternative to -fout)" << endl;
59 cout <<
" -it list : Give the sequence of iterations:subsets separated by commas (no default)." << endl;
60 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
61 cout <<
" -fov x,y,z : Give the size of the field-of-view in each dimension, in mm (default: those of the scanner, or calculated from" << endl;
62 cout <<
" the voxel sizes provided using '-vox')." << endl;
63 cout <<
" -vox x,y,z : Give the size of the voxels in each dimension, in mm (default: those of the scanner, or calculated from the fov" << endl;
64 cout <<
" if a fov value is provided using '-fov')." << endl;
65 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
67 cout <<
"[Specific help options]:" << endl;
68 cout <<
" -help-dim : Print out specific help about dimensions settings." << endl;
69 cout <<
" -help-in : Print out specific help about input settings." << endl;
70 cout <<
" -help-out : Print out specific help about output settings." << endl;
71 cout <<
" -help-algo : Print out specific help about reconstruction algorithms and their settings." << endl;
72 cout <<
" -help-proj : Print out specific help about projection operators." << endl;
73 cout <<
" -help-dynamic : Print out specific help about dynamic methodologies settings." << endl;
74 cout <<
" -help-imgp : Print out specific help about image processing modules." << endl;
75 cout <<
" -help-comp : Print out specific help about computing settings." << endl;
76 cout <<
" -help-corr : Print out specific help about all corrections that can be disabled." << endl;
77 cout <<
" -help-misc : Print out specific help about miscellaneous and verbose settings." << endl;
79 cout <<
"[Implemented Modules]:" << endl;
80 cout <<
" -help-scan : Show the list of all scanners from the configuration directory." << endl;
81 cout <<
" -help-projm : Show the list and description of all implemented projectors." << endl;
82 cout <<
" -help-opti : Show the list and description of all implemented optimizer algorithms." << endl;
83 cout <<
" -help-pnlt : Show the list and description of all implemented penalties for optimizers." << endl;
84 cout <<
" -help-motion-model : Show the list and description of all implemented image-based deformation models." << endl;
85 cout <<
" -help-dynamic-model : Show the list and description of all implemented dynamic models." << endl;
86 cout <<
" -help-conv : Show the list and description of all implemented image convolvers." << endl;
87 cout <<
" -help-proc : Show the list and description of all implemented image processing modules." << endl;
90 cout <<
" --help,-h,-help : Print out this help page." << endl;
93 cout <<
" Compiled with MPI" << endl;
96 cout <<
" Compiled with OpenMP" << endl;
99 cout <<
" Compiled for GPU" << endl;
101 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU) 105 cout <<
" Build date: " << BUILD_DATE << endl;
108 #ifdef CASTOR_VERSION 109 cout <<
" This program is part of the CASToR release version " <<
CASTOR_VERSION <<
"." << endl;
127 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
128 if (mpi_rank!=0)
return;
132 cout <<
"[Input settings]:" << endl;
137 cout <<
" -df file.cdf : Give an input CASTOR datafile header (no default)." << endl;
139 cout <<
" -img file.hdr : Give an input image as the initialization of the algorithm (default: uniform value)." << endl;
141 cout <<
" -sens file.hdr : Provide the sensitivity image (default: sensitivity image is computed before reconstruction)." << endl;
142 cout <<
" The image file should integrate all sensitivity images if more than one are required. If dual-gating is enabled and if it" << endl;
143 cout <<
" requires sensitivity images for each gate, the image should integrate nb_resp_gates * nb_card_gates sensitivity images" << endl;
144 cout <<
" (all cardiac-gated based sensitivity images for each one of the respiratory gates)." << endl;
146 cout <<
" -multimodal file.hdr : Provide additional images, from other modalities (anatomical, functional), or processed, for use in constrained reconstruction." << endl;
147 cout <<
" Multiple additional images can be provided by using the option multiple times. The additional images will be linearly interpolated" << endl;
148 cout <<
" to match the dimensions of the reconstructed images." << endl;
150 cout <<
" -additional-data file.hdr : Provide additional data, size being the number of events, for use in reconstruction." << endl;
151 cout <<
" Multiple additional data files can be provided by separating the file names using commas." << endl;
152 cout <<
" The option must be used multiple times in case of multiple bed positions." << endl;
154 cout <<
" -mask file.hdr : Provide a mask image for avoiding computations (projection, convolution, penalty) on irrelevant voxels (background)."<<endl;
155 cout <<
" The mask should contain zero values for the background and non zero values for relevant voxels." << endl;
157 cout <<
" -norm file.cdh : For list-mode data, provide a normalization data file for sensitivity computation (default: use the scanner LUT and" << endl;
158 cout <<
" assume all LORs with a weight of 1.). This restricts the computation of the sensitivity to the LORs provided in the" << endl;
159 cout <<
" normalization file and associated normalization factors and/or attenuation factors." << endl;
160 cout <<
" For dynamic reconstructions with multiple frames, as many normalization files as frames can be supplied, their names" << endl;
161 cout <<
" separated by commas. This is useful when dead-times correction is included in the normalization factors." << endl;
164 cout <<
" -atn file.hdr : Give an input attenuation image (unit has to be cm-1) for sensitivity image generation or SPECT attenuation correction." << endl;
166 cout <<
" -help-in : Print out this help." << endl;
184 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
185 if (mpi_rank!=0)
return;
189 cout <<
"[Output settings]:" << endl;
191 cout <<
" -fout name : Give the root name for all output files. All output files will be written as 'name_suffix.ext'." << endl;
192 cout <<
" So the provided name should not end with '.' or '/' character. (no default, alternative to -dout)" << endl;
193 cout <<
" -dout name : Give the name of the output directory where all output files will be written. All files will also" << endl;
194 cout <<
" be prefixed by the name of the directory. The provided name should not end with '.' or '/' character." << endl;
195 cout <<
" (no default, alternative to -fout)" << endl;
197 cout <<
" -oit list : Give the sequence of output iterations as a list of 'a:b' pairs separated by commas. This will output one" << endl;
198 cout <<
" iteration over 'a' until 'b' is reached, then it goes to the next pair of setting." << endl;
199 cout <<
" Set '-1' to save only the last iteration. (default: save all iterations)" << endl;
201 cout <<
" -fov-out percent : Give the percentage of the eliptical transaxial FOV to be kept while saving the image (default: no making)." << endl;
203 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;
205 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;
207 cout <<
" -onbp value : By default, numbers are displayed using scientific format. This option allows to customize the format and precision" << endl;
208 cout <<
" : The format is format,precision. f is the format (s=scientific, f=fixed), p is the precision" << endl;
209 cout <<
" eg: -onbp f,5 --> fixed with 5 digits precision, -onbp --> scientific with max precision." << endl;
211 cout <<
" -omd : (M)erge (D)ynamic images. Indicate if a dynamic serie of 3D images should be written on disk in one file" << endl;
212 cout <<
" instead of a serie of 3D images associated with an interfile metaheader." << endl;
214 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;
216 cout <<
" -osens : Flag to say that we want to save the sensitivity image of each subset/iteration, when in histogram mode." << endl;
218 cout <<
" -osub : Flag to say that we want to save the image after each subset." << endl;
220 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;
222 cout <<
" -sens-histo : If input file is a histogram, compute the global sensitivity from it (and still proceed to normal reconstruction after)." << endl;
224 cout <<
" -sens-only : For list-mode data, exit directly after computing and saving the sensitivity." << endl;
226 cout <<
" -help-out : Print out this help." << endl;
243 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
244 if (mpi_rank!=0)
return;
248 cout <<
"[Dimensions options]:" << endl;
250 cout <<
" -dim x,y,z : Give the number of voxels in each dimension (default: those of the scanner)." << endl;
252 cout <<
" -fov x,y,z : Give the size of the field-of-view in each dimension, in mm (default: those of the scanner)." << endl;
254 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;
256 cout <<
" -off x,y,z : Give the offset of the field-of-view in each dimension, in mm (default: 0.,0.,0.)." << endl;
257 cout <<
" (note this has no effect when using a pre-computed system matrix)" << endl;
259 cout <<
" -help-dim : Print out this help." << endl;
280 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
281 if (mpi_rank!=0)
return;
284 cout <<
"[Algorithm settings]:" << endl;
286 cout <<
" -skip it : Specify the number of first iterations not needed for the computation. This option can be used to pursue a previous" << endl;
287 cout <<
" computation with more iterations." << endl;
289 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;
290 cout <<
" associated to the algorithm (algo,param1,param2,...). If the algorithm only is specified, the default" << endl;
291 cout <<
" configuration file is used if any. By default, the MLEM algorithm is used. For specific help, use option -help-opti." << endl;
293 cout <<
" -opti-fom : Flag to say that we want to compute and print figures-of-merit (likelihood and RMSE) in the data-space." << endl;
295 cout <<
" -opti-stat : Flag to say that we want to compute and print basic statistics about the image update." << endl;
297 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;
298 cout <<
" or the list of parameters associated to the penalty (penalty,param1,param2,...). If only the penalty name is specified, the default" << endl;
299 cout <<
" configuration file is used if any. By default, no penalty is used. For specific help, use option -help-pnlt." << endl;
300 cout <<
" -pnlt-beta : Give the strength of the penalty defined by the '-pnlt' option." << endl;
301 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;
303 cout <<
" -help-opti : Print out specific help about optimizer settings." << endl;
305 cout <<
" -help-pnlt : Print out specific help about penalty settings." << endl;
306 cout <<
" -help-algo : Print out specific help about the available algorithms." << endl;
323 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
324 if (mpi_rank!=0)
return;
327 cout <<
"[Projector settings]:" << endl;
329 cout <<
" -proj param : Give the projector to be used for both forward and backward projections, along with a configuration file (proj:file.conf)" << endl;
330 cout <<
" or the list of parameters associated to the projector (proj,param1,param2,...). If the projector only is specified, the" << endl;
331 cout <<
" default configuration file is used. By default, the Siddon projector is used. For specific help, use option -help-proj." << endl;
333 cout <<
" -projF param : Give the projector to be used for forward projections. See option -proj for details." << endl;
335 cout <<
" -projB param : Give the projector to be used for backward projections. See option -proj for details." << endl;
337 cout <<
" -proj-common : Give common projector-related options, such as TOF implementation options, see -help-projm for more details." << endl;
343 cout <<
" -ignore-TOF : Flag to say that we want to ignore any potential TOF information (default: use it if present in the datafile)." << endl;
345 cout <<
" -help-projm : Print out specific help about projector settings." << endl;
362 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
363 if (mpi_rank!=0)
return;
366 cout <<
"[Image processing settings]:" << endl;
368 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;
369 cout <<
" list of parameters associated to the convolver (conv,param1,param2,...::when). If the convolver only is specified, its default" << endl;
370 cout <<
" configuration file is used. By default, no convolver is applied. Multiple convolvers can be combined simply by repeating this" << endl;
371 cout <<
" this option. The mandatory 'when' parameter specifies when the convolver is applied (psf, sieve, forward, backward, post, intra)." << endl;
372 cout <<
" For more specific help, use option -help-conv." << endl;
374 cout <<
" -help-conv : Print out specific help about the image convolver settings." << endl;
376 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;
377 cout <<
" list of parameters associated to the module (proc,param1,param2,...;when). If the module only is specified, its default" << endl;
378 cout <<
" configuration file is used. By default, no image processing module is applied. Multiple modules can be combined simply by" << endl;
379 cout <<
" repeating this this option. The mandatory 'when' parameter specifies when the module is applied (forward, backward, post, intra)." << endl;
380 cout <<
" For more specific help, use option -help-proc." << endl;
382 cout <<
" -help-proc : Print out specific help about the image processing module settings." << endl;
399 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
400 if (mpi_rank!=0)
return;
404 cout <<
"[Dynamic settings]:" << endl;
406 cout <<
" -frm list : Give the framing details for the reconstruction where 'list' is a list of frame start times, separated with commas. " << endl;
407 cout <<
" Duration for each frame can also be specified using a colon after the frame start time. "<< endl;
408 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;
409 cout <<
" It is mandatory to specify the duration of the last frame. For example '-frm start1:duration1,start2,start3:duration3'."<< endl;
410 cout <<
" Add 's' or 'm' to specify if values are seconds or minutes (seconds is the default if none provided). " << endl;
411 cout <<
" Maximum precision of frames is milliseconds. (default: 1 frame of the whole input file duration)." << endl;
413 cout <<
" -g path_to_file : Provide text file for dynamic data splitting associated to respiratory/cardiac gating or involuntary patient motion correction" << endl;
425 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;
426 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;
428 cout <<
" -rm param : Provide an image-based deformation model to be used for respiratory motion correction, along with a configuration file (deformation:file)" << endl;
429 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
431 cout <<
" -cm param : Provide an image-based deformation model to be used for cardiac motion correction, along with a configuration file (deformation:file)" << endl;
432 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
437 cout <<
" -im param : Provide an image-based deformation model to be used for involuntary motion correction, along with a configuration file (deformation:file)" << endl;
438 cout <<
" or the list of parameters associated to the projector (deformation,param1,param2,...)." << endl;
440 cout <<
" -qdyn file : Provide a text file containing quantitative factors specific to dynamic frames, respiratory or cardiac gates." << endl;
441 cout <<
" The file should provide factors with the keywords 'FRAME_QUANTIFICATION_FACTORS' and 'GATE_QUANTIFICATION_FACTORS' " << endl;
442 cout <<
" The number of factors must be consistent with the number of frames/gates " << endl;
443 cout <<
" If the data contains several frames and gates, the gate quantification factors should be entered on a separate line for each frame " << endl;
445 cout <<
" -help-dynamic-model : Print out specific help about dynamic model." << endl;
447 cout <<
" -help-motion-model : Print out specific help about deformation models." << endl;
449 cout <<
" -help-dynamic : Print out this help." << endl;
467 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
468 if (mpi_rank!=0)
return;
472 cout <<
"[Computation settings]:" << endl;
475 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;
476 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;
480 cout <<
" -gpu : Flag to say that we want to use the GPU device (default: use the CPU only)." << endl;
483 cout <<
" -proj-comp : Give the strategy for projection line computation. Here are the three different strategies that can be used:" << endl;
484 cout <<
" 1 : Image-based system matrix elements storage: The voxels weights are added in a matrix representing the whole image, so" << endl;
485 cout <<
" the addition of a new line to the previous ones is straightforward only by adding the weights to the corresponding voxels." << endl;
486 cout <<
" As it is insanely long, it can possibly be used for example with extremely complex projectors that makes use of huge number" << endl;
487 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;
488 cout <<
" This strategy is not compatible with SPECT reconstruction including attenuation correction." << endl;
489 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;
490 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;
491 cout <<
" has a fixed size which is provided by the EstimateMaxNumberOfVoxelsPerLine() function from the vProjector class. There are no" << endl;
492 cout <<
" ckecks at all for possible buffer overflows. This is the fastest strategy and default one." << endl;
493 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;
494 cout <<
" upgraded if the current number of contributing voxels exceed the list's size. The first allocated size corresponds to the diagonal" << endl;
495 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;
496 cout <<
" is a bit slower than the fixed-list strategy during the first iteration, but is optimal with respect to RAM usage." << endl;
498 cout <<
" -rng-seed : Give a seed for the random number generator (should be >=0)" << endl;
500 cout <<
" -rng-extra : Give the number of additional random number generators, if needed (in addition to one rng per thread) " << endl;
502 cout <<
" -help-comp : Print out this help." << endl;
505 cout <<
" Compiled with MPI" << endl;
508 cout <<
" Compiled with OpenMP" << endl;
511 cout <<
" Compiled for GPU" << endl;
513 #if defined(CASTOR_OMP) || defined(CASTOR_MPI) || defined(CASTOR_GPU) 531 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
532 if (mpi_rank!=0)
return;
536 cout <<
"[Miscellaneous settings]:" << endl;
538 cout <<
" -vb : Give the general verbosity level, from 0 (no verbose) to 5 and above (at the event level) (default: 1)." << endl;
539 cout <<
" -vb-algo : Give the verbose level specific to the algorithm (default: same as general verbose level)." << endl;
540 cout <<
" -vb-opti : Give the verbose level specific to the optimizer (default: same as general verbose level)." << endl;
541 cout <<
" -vb-proj : Give the verbose level specific to the projector (default: same as general verbose level)." << endl;
542 cout <<
" -vb-conv : Give the verbose level specific to the image convolver (default: same as general verbose level)." << endl;
543 cout <<
" -vb-proc : Give the verbose level specific to the image processing (default: same as general verbose level)." << endl;
544 cout <<
" -vb-scan : Give the verbose level specific to the scanner (default: same as general verbose level)." << endl;
545 cout <<
" -vb-data : Give the verbose level specific to the data and image management (default: same as general verbose level)." << endl;
546 cout <<
" -vb-defo : Give the verbose level specific to the deformation (default: same as general verbose level)." << endl;
547 cout <<
" -vb-dyna : Give the verbose level specific to the dynamic model (default: same as general verbose level)." << endl;
548 cout <<
" -vb-sens : Give the verbose level specific to the sensitivity computation (default: same as general verbose level)." << endl;
550 cout <<
" -conf : Give the path to the CASToR config directory (default: located through the CASTOR_CONFIG environment variable)." << endl;
552 cout <<
" -help-misc : Print out this help." << endl;
569 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
570 if (mpi_rank!=0)
return;
574 cout <<
"[Correction settings]:" << endl;
576 cout <<
" -ignore-corr list : Give the list of corrections that should be ignored, separated by commas (default: all corrections applied if present)." << endl;
577 cout <<
" Here is a list of all corrections that can be ignored:" << endl;
578 cout <<
" - attn: to ignore the attenuation correction (emission only)" << endl;
579 cout <<
" - norm: to ignore the normalization correction (emission only)" << endl;
580 cout <<
" - rand: to ignore the random correction (PET only)" << endl;
581 cout <<
" - scat: to ignore the scatter correction" << endl;
582 cout <<
" - deca: to ignore the decay correction (emission only)" << endl;
583 cout <<
" - brat: to ignore the branching ratio correction (emission only)" << endl;
584 cout <<
" - fdur: to ignore the frame duration correction (emission only)" << endl;
585 cout <<
" - cali: to ignore the calibration correction (emission only)" << endl;
597 int main(
int argc,
char** argv)
605 MPI_Init(&argc, &argv);
606 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
607 MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
626 INTNB nb_voxX=-1, nb_voxY=-1, nb_voxZ=-1;
627 FLTNB fov_sizeX=-1., fov_sizeY=-1., fov_sizeZ=-1.;
628 FLTNB vox_sizeX=-1., vox_sizeY=-1., vox_sizeZ=-1.;
630 FLTNB offsetX = 0., offsetY = 0., offsetZ = 0.;
634 string flip_out =
"";
641 string frame_list =
"";
643 int nb_resp_gates = 1;
645 int nb_card_gates = 1;
647 string path_to_4D_data_splitting_file =
"";
649 string dynamic_model_options =
"";
651 string resp_motion_options =
"";
653 string card_motion_options =
"";
655 string double_motion_options =
"";
657 string ipat_motion_options =
"";
659 int nb_resp_basis = 1;
660 string path_to_resp_basis_coef =
"";
662 int nb_card_basis = 1;
663 string path_to_card_basis_coef =
"";
665 string path_to_dynamic_quantification_file=
"";
675 vector<string> path_to_data_filename;
677 bool invert_datafile_bed_order_flag =
false;
679 string path_to_initial_img =
"";
681 string path_to_sensitivity_img =
"";
683 vector<string> path_to_normalization_filename;
685 string path_to_attenuation_img;
687 vector<string> path_to_multimodal_img;
689 vector<string> path_to_additional_data;
691 string path_to_mask_img =
"";
693 int nb_atn_resp_imgs = 1;
694 int nb_atn_card_imgs = 1;
696 string ignored_corrections =
"";
703 string path_dout =
"";
705 string path_fout =
"";
707 string output_iterations =
"";
709 bool merge_dynamic_imgs_flag =
false;
711 bool save_LUT_flag =
false;
713 bool save_sens_histo =
false;
715 bool save_subset_image =
false;
717 bool save_dynamic_basis_coefficients_flag =
false;
719 bool exit_after_sensitivity =
false;
721 bool sensitivity_from_histogram =
false;
723 string onb_prec =
"s,0";
730 string options_projector =
"incrementalSiddon";
731 string options_projectorF =
"incrementalSiddon";
732 string options_projectorB =
"incrementalSiddon";
733 string options_projector_common =
"3.,1,1";
737 bool ignore_POI =
false;
738 bool ignore_TOF =
false;
745 string nb_iterations_subsets =
"";
747 string nb_skipped_iterations =
"";
749 string options_optimizer =
"MLEM";
751 bool optimizer_fom =
false;
753 bool optimizer_stat =
false;
755 string options_penalty =
"";
757 string options_prob =
"";
759 FLTNB penalty_beta = -1.;
767 vector<string> options_image_convolver;
769 vector<string> options_image_processing;
776 bool gpu_flag =
false;
778 string nb_threads =
"1";
785 int verbose_general = 1;
787 int verbose_algo = -1;
788 int verbose_opti = -1;
789 int verbose_proj = -1;
790 int verbose_conv = -1;
791 int verbose_proc = -1;
792 int verbose_scan = -1;
793 int verbose_data = -1;
794 int verbose_defo = -1;
795 int verbose_dyna = -1;
796 int verbose_sens = -1;
798 string path_to_config_dir =
"";
800 int64_t random_generator_seed = -1;
801 int nb_extra_random_generators = 0;
810 for (
int i=1; i<argc; i++)
814 string option = (string)argv[i];
821 if (option==
"-h" || option==
"--help" || option==
"-help")
827 else if (option==
"-help-scan")
830 Cerr(
"***** castor-recon() -> An error occurred when trying to output the available scanners from the scanner repository !'" << endl;);
834 else if (option==
"-help-prob")
843 else if (option==
"-help-opti")
849 else if (option==
"-help-pnlt")
855 else if (option==
"-help-projm")
864 else if (option==
"-help-conv")
873 else if (option==
"-help-proc")
882 else if (option==
"-help-dynamic-model")
888 else if (option==
"-help-motion-model")
894 else if (option==
"-help-in")
900 else if (option==
"-help-out")
906 else if (option==
"-help-dim")
912 else if (option==
"-help-algo")
918 else if (option==
"-help-proj")
924 else if (option==
"-help-imgp")
930 else if (option==
"-help-comp")
936 else if (option==
"-help-misc")
942 else if (option==
"-help-dynamic")
948 else if (option==
"-help-corr")
954 else if (option==
"-vb")
958 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
963 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_general <<
" for option: " << option << endl);
969 else if (option==
"-vb-algo")
973 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
978 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_algo <<
" for option: " << option << endl);
984 else if (option==
"-vb-opti")
988 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
993 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_opti <<
" for option: " << option << endl);
999 else if (option==
"-vb-proj")
1003 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1008 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proj <<
" for option: " << option << endl);
1014 else if (option==
"-vb-conv")
1018 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1023 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_conv <<
" for option: " << option << endl);
1029 else if (option==
"-vb-proc")
1033 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1038 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_proc <<
" for option: " << option << endl);
1044 else if (option==
"-vb-scan")
1048 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1053 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_scan <<
" for option: " << option << endl);
1059 else if (option==
"-vb-data")
1063 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1068 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_data <<
" for option: " << option << endl);
1074 else if (option==
"-vb-defo")
1078 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1083 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_defo <<
" for option: " << option << endl);
1089 else if (option==
"-vb-dyna")
1093 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1098 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_dyna <<
" for option: " << option << endl);
1104 else if (option==
"-vb-sens")
1108 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1113 Cerr(
"***** castor-recon() -> Exception when trying to read provided verbosity level '" << verbose_sens <<
" for option: " << option << endl);
1119 else if (option==
"-rng-seed")
1123 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1128 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << random_generator_seed <<
" for option: " << option << endl);
1134 else if (option==
"-rng-extra")
1138 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1143 Cerr(
"***** castor-recon() -> Exception when trying to read provided number '" << nb_extra_random_generators <<
" for option: " << option << endl);
1149 else if (option==
"-conf")
1153 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1156 path_to_config_dir = (string)argv[i+1];
1165 else if (option==
"-dim")
1169 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1175 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1184 else if (option==
"-fov")
1188 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1194 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1197 fov_sizeX = input[0];
1198 fov_sizeY = input[1];
1199 fov_sizeZ = input[2];
1203 else if (option==
"-vox")
1207 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1213 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1216 vox_sizeX = input[0];
1217 vox_sizeY = input[1];
1218 vox_sizeZ = input[2];
1222 else if (option==
"-off")
1226 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1232 Cerr(
"***** castor-recon() -> Invalid argument " << argv[i+1] <<
" for option " << option <<
" !" << endl);
1241 else if (option==
"-fov-out")
1245 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1248 fov_out = atof(argv[i+1]);
1252 else if (option==
"-slice-out")
1256 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1259 slice_out = ((
INTNB)(atoi(argv[i+1])));
1263 else if (option==
"-flip-out")
1267 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1270 flip_out = (string)(argv[i+1]);
1279 else if (option==
"-frm")
1283 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1286 frame_list = (string)argv[i+1];
1290 else if (option==
"-g")
1294 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1298 path_to_4D_data_splitting_file = ((string)argv[i+1]);
1302 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);
1308 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);
1312 if (nb_resp_gates<1 || nb_card_gates <1)
1314 Cerr(
"***** castor-recon() -> Incorrect initialization of the number of gates for the option: " << option <<
". This number should be >= 1" << endl);
1381 else if (option==
"-dynamic-model")
1385 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1388 dynamic_model_options = (string)argv[i+1];
1392 else if (option==
"-rm")
1396 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1399 resp_motion_options = (string)argv[i+1];
1403 else if (option==
"-cm")
1407 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1410 card_motion_options = (string)argv[i+1];
1426 else if (option==
"-im")
1430 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1433 ipat_motion_options = (string)argv[i+1];
1437 else if (option==
"-qdyn")
1441 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1444 path_to_dynamic_quantification_file = (string)argv[i+1];
1453 else if (option==
"-df")
1457 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1460 string file_name = (string)argv[i+1];
1461 path_to_data_filename.push_back(file_name);
1466 else if (option==
"-df-inv")
1468 invert_datafile_bed_order_flag =
true;
1471 else if (option==
"-img")
1475 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1478 path_to_initial_img = argv[i+1];
1482 else if (option==
"-sens")
1486 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1490 path_to_sensitivity_img = argv[i+1];
1494 else if (option==
"-norm")
1498 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1501 string file_name = (string)argv[i+1];
1502 path_to_normalization_filename.push_back(file_name);
1507 else if (option==
"-atn")
1511 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1515 path_to_attenuation_img = (string)argv[i+1];
1517 if (path_to_attenuation_img !=
"")
1524 Cerr(
"***** castor-recon() -> An error occurred while trying to read the interfile header of attenuation file " << path_to_attenuation_img <<
" !" << endl);
1533 else if (option==
"-multimodal")
1537 Cerr(
"***** Argument missing for option: " << option << endl);
1540 string file_name = (string)argv[i+1];
1541 path_to_multimodal_img.push_back(file_name);
1545 else if (option==
"-additional-data")
1549 Cerr(
"***** Argument missing for option: " << option << endl);
1552 string file_name = (string)argv[i+1];
1553 path_to_additional_data.push_back(file_name);
1557 else if (option==
"-mask")
1561 Cerr(
"***** Argument missing for option: " << option << endl);
1565 path_to_mask_img = argv[i+1];
1574 else if (option==
"-dout")
1578 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1581 path_dout = argv[i+1];
1585 else if (option==
"-fout")
1589 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1592 path_fout = argv[i+1];
1596 else if (option==
"-oit")
1600 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1603 output_iterations = (string)argv[i+1];
1607 else if (option==
"-onbp")
1611 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1614 onb_prec = argv[i+1];
1618 else if (option==
"-omd")
1620 merge_dynamic_imgs_flag =
true;
1623 else if (option==
"-olut")
1625 save_LUT_flag =
true;
1628 else if (option==
"-osens")
1630 save_sens_histo =
true;
1633 else if (option==
"-osub")
1635 save_subset_image =
true;
1638 else if (option==
"-odyn")
1640 save_dynamic_basis_coefficients_flag =
true;
1643 else if (option==
"-sens-only")
1645 exit_after_sensitivity =
true;
1648 else if (option==
"-sens-histo")
1650 sensitivity_from_histogram =
true;
1658 else if (option==
"-it")
1662 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1665 nb_iterations_subsets = (string)argv[i+1];
1669 else if (option==
"-skip-it")
1673 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1676 nb_skipped_iterations = (string)argv[i+1];
1680 else if (option==
"-opti")
1684 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1687 options_optimizer = (string)argv[i+1];
1691 else if (option==
"-opti-fom")
1693 optimizer_fom =
true;
1696 else if (option==
"-opti-stat")
1698 optimizer_stat =
true;
1701 else if (option==
"-pnlt")
1705 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1708 options_penalty = (string)argv[i+1];
1713 else if (option==
"-prob")
1717 Cerr(
"***** Argument missing for option: " << option << endl);
1720 options_prob = (string)argv[i+1];
1724 else if (option==
"-pnlt-beta")
1728 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1731 penalty_beta = (
FLTNB)atof(argv[i+1]);
1735 else if (option==
"-conv")
1739 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1742 string convolver = (string)argv[i+1];
1743 options_image_convolver.push_back(convolver);
1747 else if (option==
"-proc")
1751 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1754 string module = (string)argv[i+1];
1755 options_image_processing.push_back(module);
1764 else if (option==
"-proj")
1768 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1771 options_projectorF = (string)argv[i+1];
1772 options_projectorB = (string)argv[i+1];
1776 else if (option==
"-projF")
1780 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1783 options_projectorF = (string)argv[i+1];
1787 else if (option==
"-projB")
1791 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1794 options_projectorB = (string)argv[i+1];
1798 else if (option==
"-proj-common")
1802 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1805 options_projector_common = (string)argv[i+1];
1809 else if (option==
"-ignore-TOF")
1814 else if (option==
"-ignore-POI")
1819 else if (option==
"-proj-comp")
1823 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1826 projector_computation_strategy = atoi(argv[i+1]);
1835 else if (option==
"-ignore-corr")
1839 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1842 ignored_corrections = (string)argv[i+1];
1852 else if (option==
"-gpu")
1859 else if (option==
"-th")
1863 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1866 nb_threads = (string)argv[i+1];
1870 else if (option==
"-th")
1874 Cerr(
"***** castor-recon() -> Argument missing for option: " << option << endl);
1877 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1878 Cerr(
"!!!!! castor-recon() -> Option -th is available only if the code is compiled using the CASTOR_OMP environment variable set to 1 !" << endl);
1879 Cerr(
"!!!!! The execution will continue BUT WITH ONLY ONE THREAD !" << endl);
1880 Cerr(
"!!!!! We strongly advice to compile CASToR with OpenMP !" << endl);
1881 Cerr(
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl);
1892 Cerr(
"***** castor-recon() -> Unknown option '" << option <<
"' !" << endl);
1899 MPI_Barrier(MPI_COMM_WORLD);
1903 if (verbose_algo==-1) verbose_algo = verbose_general;
1904 if (verbose_opti==-1) verbose_opti = verbose_general;
1905 if (verbose_proj==-1) verbose_proj = verbose_general;
1906 if (verbose_conv==-1) verbose_conv = verbose_general;
1907 if (verbose_proc==-1) verbose_proc = verbose_general;
1908 if (verbose_scan==-1) verbose_scan = verbose_general;
1909 if (verbose_data==-1) verbose_data = verbose_general;
1910 if (verbose_defo==-1) verbose_defo = verbose_general;
1911 if (verbose_dyna==-1) verbose_dyna = verbose_general;
1912 if (verbose_sens==-1) verbose_sens = verbose_general;
1921 Cerr(
"***** castor-recon() -> Please provide at least one data filename !" << endl);
1925 if (path_fout.empty() && path_dout.empty())
1927 Cerr(
"***** castor-recon() -> Please provide an output option for output files (-fout or -dout) !" << endl);
1931 if (!path_fout.empty() && !path_dout.empty())
1933 Cerr(
"***** castor-recon() -> Please provide either output option -fout or -dout but not both !" << endl);
1939 if ( (nb_resp_gates>1 || nb_card_gates>1) && path_to_4D_data_splitting_file.empty() )
1941 Cerr(
"***** castor-recon() -> gating is enabled, but no file describing the splitting of the data has been provided (-g option) !" << endl);
1946 if (!options_prob.empty())
1948 if (!options_image_convolver.empty())
1950 Cerr(
"***** castor-recon() -> Image convolution option is not compatible with the RCP-GS algorithm !" << endl);
1954 if (!frame_list.empty() || !path_to_4D_data_splitting_file.empty())
1956 Cerr(
"***** castor-recon() -> Dynamic reconstruction is not compatible with the RCP-GS algorithm !" << endl);
1959 if (nb_extra_random_generators!=2)
1961 Cerr(
"***** castor-recon() -> The number of random generators must be 2 for the RCP-GS algorithm!" << endl);
1964 if (!options_penalty.empty())
1966 Cerr(
"***** castor-recon() -> Penalties are not compatible with the RCP-GS algorithm !" << endl);
1975 if (verbose_general>=5)
Cout(
"----- Singletons initializations ... -----" << endl);
1985 p_outputManager->
SetVerbose(verbose_general);
1999 Cerr(
"***** castor-recon() -> A problem occurred while checking for the config directory path !" << endl);
2005 Cerr(
"***** castor-recon() -> A problem occurred while initializing output directory !" << endl);
2009 #ifdef CASTOR_VERSION 2010 Cout(
"castor-recon() -> Launch reconstruction from CASToR version " <<
CASTOR_VERSION <<
"." << endl);
2015 Cerr(
"***** castor-recon() -> A problem occurred while logging command line arguments !" << endl);
2028 if (p_ImageDimensionsAndQuantification->
SetNbThreads(nb_threads))
2030 Cerr(
"***** castor-recon() -> A problem occurred while setting the number of threads !" << endl);
2042 if (verbose_general>=5)
Cout(
"----- Geometry Initialization ... -----" << endl);
2047 string scanner_name =
"";
2050 Cerr(
"***** castor-recon() -> A problem occurred while trying to find the system name in the datafile header !" << endl);
2055 Cerr(
"***** castor-recon() -> A problem occurred while searching for scanner system !" << endl);
2060 Cerr(
"***** castor-recon() -> A problem occurred during scanner object construction ! !" << endl);
2065 Cerr(
"***** castor-recon() -> A problem occurred while creating Scanner object !" << endl);
2070 Cerr(
"***** castor-recon() -> A problem occurred while retrieving scanner fields from the datafile header !" << endl);
2075 Cerr(
"***** castor-recon() -> A problem occurred while generating/reading the LUT !" << endl);
2081 Cerr(
"***** castor-recon() -> A problem occurred while checking scanner manager parameters !" << endl);
2086 Cerr(
"***** castor-recon() -> A problem occurred while initializing scanner !" << endl);
2091 if (nb_voxX<=0 || nb_voxY<=0 || nb_voxZ<=0)
2095 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of transaxial voxels !" << endl);
2100 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of transaxial voxels !" << endl);
2105 Cerr(
"***** castor-recon() -> A problem occurred while reading for default number of axial voxels !" << endl);
2110 if ( (fov_sizeX<=0 || fov_sizeY<=0 || fov_sizeZ<=0) && (vox_sizeX<=0 || vox_sizeY<=0 || vox_sizeZ<=0) )
2114 Cerr(
"***** castor-recon() -> A problem occurred while reading for default transaxial FOV size !" << endl);
2119 Cerr(
"***** castor-recon() -> A problem occurred while reading for default transaxial FOV size !" << endl);
2124 Cerr(
"***** castor-recon() -> A problem occurred while reading for default axial FOV size !" << endl);
2129 if (verbose_general>=5)
Cout(
"----- Geometry Initialization OK -----" << endl);
2135 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization ... -----" << endl);
2137 p_ImageDimensionsAndQuantification->
SetNbBeds(nb_beds);
2138 p_ImageDimensionsAndQuantification->
SetNbVoxX(nb_voxX);
2139 p_ImageDimensionsAndQuantification->
SetNbVoxY(nb_voxY);
2140 p_ImageDimensionsAndQuantification->
SetNbVoxZ(nb_voxZ);
2141 p_ImageDimensionsAndQuantification->
SetVoxSizeX(vox_sizeX);
2142 p_ImageDimensionsAndQuantification->
SetVoxSizeY(vox_sizeY);
2143 p_ImageDimensionsAndQuantification->
SetVoxSizeZ(vox_sizeZ);
2144 p_ImageDimensionsAndQuantification->
SetFOVSizeX(fov_sizeX);
2145 p_ImageDimensionsAndQuantification->
SetFOVSizeY(fov_sizeY);
2146 p_ImageDimensionsAndQuantification->
SetFOVSizeZ(fov_sizeZ);
2148 p_ImageDimensionsAndQuantification->
SetOffsetX(offsetX);
2149 p_ImageDimensionsAndQuantification->
SetOffsetY(offsetY);
2150 p_ImageDimensionsAndQuantification->
SetOffsetZ(offsetZ);
2152 p_ImageDimensionsAndQuantification->
SetVerbose(verbose_data);
2154 p_ImageDimensionsAndQuantification->
SetFrames(frame_list);
2156 if (p_ImageDimensionsAndQuantification->
SetFlipOut(flip_out))
2158 Cerr(
"***** castor-recon() -> A problem occurred while setting the output flip option !" << endl);
2162 if (resp_motion_options==
"" && double_motion_options==
"")
2164 p_ImageDimensionsAndQuantification->
SetNbRespGates(nb_resp_gates);
2170 if (path_to_resp_basis_coef!=
"")
2172 Cerr(
"***** castor-recon() -> Cannot use both respiratory motion correction and respiratory basis functions, it has no sense !" << endl);
2178 if (card_motion_options==
"" && double_motion_options==
"")
2180 p_ImageDimensionsAndQuantification->
SetNbCardGates(nb_card_gates);
2186 if (path_to_card_basis_coef!=
"")
2188 Cerr(
"***** castor-recon() -> Cannot use both cardiac motion correction and cardiac basis functions, it has no sense !" << endl);
2196 Cerr(
"***** castor-recon() -> A problem occurred while checking image dimensions parameters !" << endl);
2199 if (p_ImageDimensionsAndQuantification->
Initialize())
2201 Cerr(
"***** castor-recon() -> A problem occurred while initializing image dimensions !" << endl);
2232 if (verbose_general>=5)
Cout(
"----- Image dimensions initialization OK -----" << endl);
2246 if (!path_to_mask_img.empty())
2250 Cerr(
"The option for using a mask image is set, but the mask image is not provided or could not be loaded !" << endl);
2262 if (verbose_general>=5)
Cout(
"----- Random number generator initialization ... -----" << endl);
2265 p_RandomNumberGenerator->
SetVerbose(verbose_general);
2267 if (random_generator_seed>=0) p_RandomNumberGenerator->
Initialize(random_generator_seed, p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2268 else p_RandomNumberGenerator->
Initialize(p_ImageDimensionsAndQuantification->
GetNbThreadsMax(), nb_extra_random_generators);
2270 if (verbose_general >=5)
Cout(
"----- Random number generator initialization OK -----" << endl);
2276 if (verbose_general>=5)
Cout(
"----- DataFile initialization ... -----" << endl);
2283 for (
int i=0 ; i<nb_beds ; i++)
2286 (
dynamic_cast<iDataFilePET*
>(p_DataFile[i]))->SetIgnoreTOFFlag(ignore_TOF);
2292 for (
int i=0 ; i<nb_beds ; i++)
2300 for (
int i=0 ; i<nb_beds ; i++)
2308 Cerr(
"***** castor-recon() -> Unknown scanner type (" << p_ScannerManager->
GetScannerType() <<
") for datafile construction ! Abort." << endl);
2313 if (path_to_additional_data.size()!=0 && path_to_additional_data.size()!=((size_t)nb_beds))
2315 Cerr(
"***** castor-recon() -> There must be as many supplied additional data options as number of bed positions !" << endl);
2320 for (
int bed=0 ; bed<nb_beds ; bed++)
2323 if (invert_datafile_bed_order_flag) p_DataFile[bed]->
SetHeaderDataFileName(path_to_data_filename.at(nb_beds-1-bed));
2329 if (p_DataFile[bed]->ReadInfoInHeader())
2331 Cerr(
"***** castor-recon() -> A problem occurred during datafile header reading ! Abort." << endl);
2334 if (p_DataFile[bed]->CheckParameters())
2336 Cerr(
"***** castor-recon() -> A problem occurred while checking datafile parameters ! Abort." << endl);
2339 if (p_DataFile[bed]->ComputeSizeEvent())
2341 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2344 if (p_DataFile[bed]->InitializeMappedFile())
2346 Cerr(
"***** castor-recon() -> A problem occurred in datafile initialization ! Abort." << endl);
2349 if (p_DataFile[bed]->PrepareDataFile())
2351 Cerr(
"***** castor-recon() -> A problem occurred in datafile preparation ! Abort." << endl);
2356 Cerr(
"***** castor-recon() -> A problem occured during additional data initialization !" << endl);
2361 for (
int bed=1; bed<nb_beds; bed++)
2363 if (p_DataFile[0]->CheckConsistencyWithAnotherBedDataFile(p_DataFile[bed]))
2365 int bed_index_problem = bed + 1;
2366 if (invert_datafile_bed_order_flag) bed_index_problem = nb_beds - bed;
2367 Cerr(
"***** castor-recon() -> A problem occurred while checking consistency between first bed and bed " << bed_index_problem <<
" !" << endl);
2374 Cerr(
"***** castor-recon() -> A problem occurred while dealing with the bed positions !" << endl);
2378 if (verbose_general>=5)
Cout(
"----- DataFile initialization OK -----" << endl);
2381 if (verbose_general>=5)
Cout(
"----- Dynamic Data Manager initialization ... -----" << endl);
2384 if (p_ImageDimensionsAndQuantification->
InitDynamicData(path_to_4D_data_splitting_file,
2385 !resp_motion_options.empty(),
2386 !card_motion_options.empty(),
2387 !ipat_motion_options.empty(),
2391 Cerr(
"***** castor-recon() -> A problem occurred while initializing Dynamic data manager's class !" << endl);
2396 int64_t nb_events = 0;
2401 Cerr(
"***** castor-recon() -> A problem occurred while checking Dynamic data manager's parameters !" << endl);
2407 Cerr(
"***** castor-recon() -> A problem occurred while initializing specific dynamic quantification factors!" << endl);
2411 if (verbose_general>=5)
Cout(
"----- Dynamic Data Manager initialization OK -----" << endl);
2418 if (verbose_general>=5)
Cout(
"----- Projector initialization ... -----" << endl);
2429 p_ProjectorManager->
SetVerbose(verbose_proj);
2433 Cerr(
"***** castor-recon() -> A problem occurred while checking projector manager's parameters !" << endl);
2439 Cerr(
"***** castor-recon() -> A problem occurred while initializing projector manager !" << endl);
2445 Cerr(
"***** castor-recon() -> A problem occurred while checking projector's compatibility with SPECT and attenuation correction !" << endl);
2449 if (verbose_general>=5)
Cout(
"----- Projector initialization OK -----" << endl);
2456 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization (if any) ... -----" << endl);
2461 p_DynamicModelManager->
SetOptions(dynamic_model_options);
2462 p_DynamicModelManager->
SetVerbose(verbose_dyna);
2467 Cerr(
"***** castor-recon() -> A problem occurred while checking dynamic model manager's parameters !" << endl);
2471 int DynamicModelinitialisation = p_DynamicModelManager->
Initialize();
2472 if (DynamicModelinitialisation ==1)
2474 Cerr(
"***** castor-recon() -> A problem occurred while initializing dynamic model manager !" << endl);
2478 else if (DynamicModelinitialisation ==2)
2480 Cout(
"----- Dynamic model: No parameters given - setting diagonal basis functions !" << endl);
2484 if (verbose_general>=5)
Cout(
"----- Dynamic model initialization OK -----" << endl);
2492 if (verbose_general>=5)
Cout(
"----- Optimizer initialization ... -----" << endl);
2498 p_OptimizerManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2499 p_OptimizerManager->
SetDataType(p_DataFile[0]->GetDataType());
2500 p_OptimizerManager->
SetDataSpec(p_DataFile[0]->GetDataSpec());
2507 p_OptimizerManager->
SetVerbose(verbose_opti);
2511 Cerr(
"***** castor-recon() -> A problem occurred while checking optimizer manager's parameters !" << endl);
2517 Cerr(
"***** castor-recon() -> A problem occurred while initializing optimizer manager !" << endl);
2521 if (verbose_general>=5)
Cout(
"----- Optimizer initialization OK -----" << endl);
2528 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization (if any) ... -----" << endl);
2532 p_ImageConvolverManager->
SetVerbose(verbose_conv);
2534 p_ImageConvolverManager->
SetOptions(options_image_convolver);
2538 Cerr(
"***** castor-recon() -> A problem occurred while checking image convolver manager's parameters !" << endl);
2544 Cerr(
"***** castor-recon() -> A problem occurred while initializing image convolver manager !" << endl);
2548 if (verbose_general>=5)
Cout(
"----- Image Convolver initialization OK -----" << endl);
2555 if (verbose_general>=5)
Cout(
"----- Image Processing initialization (if any) ... -----" << endl);
2559 p_ImageProcessingManager->
SetVerbose(verbose_proc);
2561 p_ImageProcessingManager->
SetOptions(options_image_processing);
2565 Cerr(
"***** castor-recon() -> A problem occurred while checking image processing manager's parameters !" << endl);
2571 Cerr(
"***** castor-recon() -> A problem occurred while initializing image processing manager !" << endl);
2575 if (verbose_general>=5)
Cout(
"----- Image Processing initialization OK -----" << endl);
2583 if (verbose_general>=5)
Cout(
"----- Image deformation initialization (if any) ... -----" << endl);
2588 p_DeformationManager->
SetDataMode(p_DataFile[0]->GetDataMode());
2590 if(resp_motion_options !=
"")
2592 p_DeformationManager->
SetOptions(resp_motion_options);
2596 else if (card_motion_options !=
"")
2598 p_DeformationManager->
SetOptions(card_motion_options);
2602 else if (double_motion_options !=
"")
2604 p_DeformationManager->
SetOptions(double_motion_options);
2608 else if (ipat_motion_options !=
"")
2610 p_DeformationManager->
SetOptions(ipat_motion_options);
2617 p_DeformationManager->
SetVerbose(verbose_defo);
2621 Cerr(
"***** castor-recon() -> A problem occurred while checking image deformation manager's parameters !" << endl);
2627 Cerr(
"***** castor-recon() -> A problem occurred while initializing image deformation manager !" << endl);
2631 if (verbose_general >=5)
Cout(
"----- Image deformation initialization OK -----" << endl);
2650 if ( path_to_sensitivity_img.empty() && (p_DataFile[0]->
GetDataMode()==
MODE_LIST || sensitivity_from_histogram) )
2653 if (verbose_general>=5)
Cout(
"----- Image Sensitivity generation initialization ... -----" << endl);
2673 Cerr(
"***** castor-recon() -> A problem occurred while checking parameters of the sensitivity generator !" << endl);
2679 Cerr(
"***** castor-recon() -> A problem occurred while initializing the sensitivity generator !" << endl);
2685 if (p_Sensitivity->
Launch())
2687 Cerr(
"***** castor-recon() -> A problem occurred while computing the sensitivity !" << endl);
2697 else path_to_sensitivity_img =
"";
2699 delete p_Sensitivity;
2701 if (exit_after_sensitivity)
2703 if (verbose_general>=
VERBOSE_LIGHT)
Cout(
"castor-recon() -> Asked to exit after sensitivity computation." << endl);
2705 delete p_ImageSpace;
2706 delete p_DeformationManager;
2707 delete p_DynamicModelManager;
2708 delete p_ImageProcessingManager;
2709 delete p_ImageConvolverManager;
2710 delete p_OptimizerManager;
2711 delete p_ProjectorManager;
2712 for (
int i=0 ; i<nb_beds ; i++)
delete p_DataFile[i];
2713 delete[] p_DataFile;
2714 delete p_ImageDimensionsAndQuantification;
2729 if (verbose_general>=5)
Cout(
"----- Iterative reconstruction algorithm initialization ... -----" << endl);
2733 string algorithm_options =
"";
2740 if (!options_prob.empty())
2742 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization ... -----" << endl);
2747 p_ChronoManager->
SetVerbose(verbose_general);
2750 Cerr(
"***** castor-recon() -> A problem occured while checking parameters for the chrono manager !" << endl);
2755 Cerr(
"***** castor-recon() -> A problem occured while initializing the chrono manager !" << endl);
2759 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization OK -----" << endl);
2763 algorithm_options = options_prob;
2765 else if (!options_optimizer.empty())
2771 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization ... -----" << endl);
2777 p_ChronoManager->
SetVerbose(verbose_general);
2780 Cerr(
"***** castor-recon() -> A problem occured while checking parameters for the chrono manager !" << endl);
2785 Cerr(
"***** castor-recon() -> A problem occured while initializing the chrono manager !" << endl);
2789 if (verbose_general>=5)
Cout(
"----- Profiling manager initialization OK -----" << endl);
2818 Cerr(
"***** castor-recon() -> Error while setting the numbers of iterations and subsets !" << endl);
2826 Cerr(
"***** castor-recon() -> Error while setting the selected output iterations !" << endl);
2831 Cerr(
"***** Error while setting specific options for this algorithm !" << endl);
2834 if (p_Algorithm->
Run())
2836 Cerr(
"***** castor-recon() -> Error while performing the reconstruction" << endl);
2848 if (verbose_general>=5)
Cout(
"----- Deleting CASToR objects ... -----" << endl);
2850 delete p_ImageSpace;
2851 delete p_DeformationManager;
2852 delete p_DynamicModelManager;
2853 delete p_ImageProcessingManager;
2854 delete p_ImageConvolverManager;
2855 delete p_OptimizerManager;
2856 delete p_ProjectorManager;
2857 for (
int i=0 ; i<nb_beds ; i++)
delete p_DataFile[i];
2858 delete[] p_DataFile;
2859 delete p_ImageDimensionsAndQuantification;
2860 if (verbose_general>=5)
Cout(
"----- CASToR objects successfully deleted -----" << endl);
2863 if (verbose_general>=1)
Cout(endl);
2867 return EXIT_SUCCESS;
void SetDataFile(vDataFile **a2p_DataFile)
void SetDataMode(int a_dataMode)
void SetIgnorePOIFlag(bool a_ignorePOIFlag)
void SetVerbose(int a_verboseLevel)
void SetOptionsPenalty(const string &a_optionsPenalty, FLTNB a_penaltyStrength)
This class is designed to be a mother virtual class for DataFile.
static sScannerManager * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
void SetDataSpec(int a_dataSpec)
void SetGPUflag(bool a_flagGPU)
static sRandomNumberGenerator * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
void SetNbCardGates(int a_nbCardGates)
void SetNumberOfAtnGateImages(int a_nbAtnRespGateImages, int a_nbAtnCardGateImages)
virtual int InitSpecificOptions(string a_specificOptions)
void SetVerbose(int a_verbose)
static void ShowCommonHelp()
This function is used to print out some help about the use of options common to all projectors...
void SetVerbose(int a_verboseLevel)
int ReadStringOption(const string &a_input, T *ap_return, int a_nbElts, const string &sep, const string &a_option)
Parse the 'a_input' string corresponding to the 'a_option' into 'a_nbElts' elements, using the 'sep' separator. The results are returned in the templated 'ap_return' dynamic templated array. Call "ConvertFromString()" to perform the correct conversion depending on the type of the data to convert.
void SetDynamicModelManager(oDynamicModelManager *ap_DynamicModelManager)
void SetSaveSubsetImageFlag(bool a_saveImageAfterSubsets)
int SetNbIterationsAndSubsets(const string &a_nbIterationsSubsets)
int InitMaskImage(const string &a_pathToImage)
void ShowHelpDynamicModel()
Show help about all implemented dynamic models.
void ShowHelpDeformation()
Show help about all implemented deformations.
void ShowHelp()
Display main command line options for castor-proj.
void SetOptionsCommon(const string &a_optionsCommon)
int Initialize()
A function used to initialize the manager and the projectors or system matrices it manages...
static void ShowCommonHelp()
This function does not take any parameter and is used to display some help about the syntax of the op...
int Initialize()
A public function used to initialize the sensitivity generator.
void SetImageConvolverManager(oImageConvolverManager *ap_ImageConvolverManager)
void SetScanner(vScanner *ap_Scanner)
void SetPathToAttenuationImage(string a_pathToAttenuationImage)
void ShowHelpImgp()
Display command line options related to the Image Processing module for castor-recon.
void SetVerbose(int a_verboseLevel)
int FindScannerSystem(string a_scannerName)
int CheckParameters()
Check validity of all parameters.
void SetFOVSizeX(FLTNB a_fovSizeX)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
void SetPathInitImage(string a_pathToInitialImage)
int BuildScannerObject()
Instantiate the specific scanner object related to the modality, and set verbosity of scanner object...
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
string GetPathToSensitivityImage()
This function return the path to the sensitivity image.
void SetVoxSizeY(FLTNB a_voxSizeY)
void SetOptionsForward(const string &a_optionsForward)
int CheckParameters()
A function used to check the parameters settings.
void SetOptimizerManager(oOptimizerManager *ap_OptimizerManager)
This class is designed to manage the optimization part of an iterative reconstruction.
void CheckNumberOfProjectionThreadsConsistencyWithDataFileSize(vDataFile **a2p_DataFile)
void SetOffsetZ(FLTNB a_offsetZ)
void ShowHelpImageProcessingModule()
Show help about all implemented image processing modules.
void SetProjectorManager(oProjectorManager *ap_ProjectorManager)
void SetVerbose(int a_verboseLevel)
int Run()
Just call either the RunCPU or the RunGPU function as asked for.
int DealWithBedPositions(vDataFile **a2p_DataFile)
void SetVoxSizeX(FLTNB a_voxSizeX)
void SetSensitivityModeOff()
Say that the projector will no longer be used to compute the global sensitivity.
void SetNbRespGates(int a_nbRespGates)
void SetNbVoxY(INTNB a_nbVoxY)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
int Launch()
A public function used to launch the sensitivity generator (compute the sensitivity image) ...
int Initialize()
A function used to initialize the manager and all image processing modules it manages.
string GetPathToScannerFile()
void SetVerbose(int a_verboseLevel)
Set verbosity level.
void ShowHelpPenalty()
Show help about all implemented penalties.
int Initialize()
Set the dynamic model flag and instanciate/initialize model objects through the ParseOptionsAndInitia...
static sOutputManager * GetInstance()
Instanciate the singleton object and Initialize member variables if not already done, return a pointer to this object otherwise.
void SetVerbose(int a_verboseLevel)
void SetDataType(int a_dataType)
void SetSaveLUTFlag(bool a_flag)
void SetNbCustomSteps(int a_nbCustomSteps)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
int Initialize()
A function used to initialize the manager and the optimizer it manages.
void SetNbRespBasisFunctions(int a_nbRespBasisFunctions)
int CheckParameters()
Check if all parameters have been correctly initialized, and call the CheckParameters function of the...
int SetNbThreads(const string &a_nbThreads)
void DeallocateMaskImage()
Free memory for the mask image.
void SetOptionsOptimizer(const string &a_optionsOptimizer)
int SetOutNbPrec(string a_format)
int InstantiateScanner()
Instantiate scanner using the related function in the scanner classes.
int LogCommandLine(int argc, char **argv)
void SetPathToAttenuationImage(string a_pathToAttenuationImage)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
static sAddonManager * GetInstance()
void SetFOVSizeY(FLTNB a_fovSizeY)
void SetOptimizerFOMFlag(bool a_optimizerFOMFlag)
void SetDeformationManager(oDeformationManager *ap_DeformationManager)
#define FIXED_LIST_COMPUTATION_STRATEGY
void SetNbVoxZ(INTNB a_nbVoxZ)
int CheckConfigDir(const string &a_path)
void SetOffsetY(FLTNB a_offsetY)
void SetGPUflag(bool a_flagGPU)
int CheckParameters()
A function used to check the parameters settings.
void SetNbBeds(int a_nbBeds)
#define SCANNER_SPECT_CONVERGENT
void SetImageConvolverManager(oImageConvolverManager *ap_ImageConvolverManager)
int BuildLUT()
Call the eponym function of the scanner class.
int GetNbIPatMotionSubsets()
call the eponym function from the oDynamicDataManager object
int Initialize()
A function used to initialize all that is needed.
Singleton class that manages output writing on disk (images, sinograms, etc). It also manages loggi...
void SetComputationStrategy(int a_computationStrategy)
void SetNbCardBasisFunctions(int a_nbCardBasisFunctions)
void SetNbThreads(int a_nbThreadsForProjection, int a_nbThreadsForImageComputation)
void SetProjectorManager(oProjectorManager *ap_ProjectorManager)
void SetOptionsBackward(const string &a_optionsBackward)
This class is designed to manage the use of dynamic model in the reconstruction.
void SetFOVSizeZ(FLTNB a_fovSizeZ)
RCP-GS : Random Clustering Prior - Gibbs Sampler.
void SetDataFile(vDataFile *ap_DataFile)
int GetNbThreadsMax()
Get the maximum between the number of threads used for projections and image operations.
Singleton class that Instantiate and initialize the scanner object.
void SetVerbose(int a_verboseLevel)
int Initialize(int a_nbThreads, int a_nbExtra)
Instantiate pseudo random number generators, one per thread by default, and additional extra ones if ...
void SetComputeFromHistogramFlag(bool a_computeFromHistogramFlag)
void SetSaveDynamicBasisCoefficientImages(bool a_saveDynamicBasisCoefficients)
int CheckParameters()
A function used to check the parameters settings.
void SetImageProcessingManager(oImageProcessingManager *ap_ImageProcessingManager)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Inherit from vDataFile. Class that manages the reading of a SPECT input file (header + data)...
This class is designed to manage the different image convolvers and to apply them.
void SetHeaderDataFileName(const string &a_headerFileName)
vScanner * GetScannerObject()
int CheckParameters()
A function used to check the parameters settings.
void SetUseModelInReconstruction(bool a_useModelInReconstruction)
void SetSensitivityModeOn()
Say that the projector will be used to compute the global sensitivity.
void SetMergeDynImagesFlag(bool a_flag)
void SetNbTOFBins(int a_nbTOFBins)
void SetMPIRank(int a_mpiRank)
int InitDynamicData(string a_pathTo4DDataSplittingFile, int a_respMotionCorrectionFlag, int a_cardMotionCorrectionFlag, int a_invMotionCorrectionFlag, int a_nbRespGates, int a_nbCardGates)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
void ShowHelpMiscellaneous()
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.
void SetImageSpace(oImageSpace *ap_ImageSpace)
static void ShowCommonHelp()
This function does not take any parameter and is used to display some help about the syntax of the op...
void ShowHelpComputation()
int CheckParameters()
This function is used to check parameters after the latter have been all set using Set functions...
Singleton class that generate a thread-safe random generator number for openMP As singleton...
void IntfKeyInitFields(Intf_fields *ap_IF)
Init the file of an Interfile fields structure passed in parameter to their default values...
void SetIgnoredCorrections(const string &a_ignoredCorrectionsList)
void SetFOVOutMasking(FLTNB a_fovOutPercent, INTNB a_nbSliceOutMask)
void SetSaveSensitivityHistoFlag(bool a_saveSensitivityHistoFlag)
int Initialize()
Initialization : .
void SetNbBeds(int a_nbBeds)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ID)
void SetVoxSizeZ(FLTNB a_voxSizeZ)
int ProcessAndSetMask(FLTNB *ap_maskImage)
int Initialize()
Initialize all thread-safe buffers for profiling.
int InitializeAdditionalData(const string &a_pathToAdditionalData)
Memory allocation and initialization for the additional data matrices.
void SetPathToNormalizationFileName(vector< string > ap_pathToNormalizationFileName, bool a_inverseDataFileOrderFlag)
int CheckDynamicParameters(int64_t a_nbEvents)
This class is designed to manage the different image processing modules and to apply them...
void SetPathToMultiModalImage(vector< string > a_pathToMultiModalImage)
This class is designed to manage the projection part of the reconstruction.
int GetNbTOFBins()
Get the number of TOF bins associated to the projector.
Interfile fields. This structure contains all the Interfile keys currently managed by CASToR Decl...
void SetBedIndex(int a_bedIndex)
This is the base class for reconstructions, containing a framework with iteration and data subset loo...
void SetOptions(vector< string > a_options)
void GetUserEndianness()
Check user/host computer endianness and write it to the global variable User_Endianness.
void SetCardBasisFunctionsFile(const string &a_cardBasisFunctionsFile)
This class holds all the matrices in the image domain that can be used in the algorithm: image...
void SetVerbose(int a_verbose)
int GetNbThreadsForImageComputation()
Get the number of threads used for image operations.
int SetOutputIterations(const string &a_outputIterations)
int InitOutputDirectory(const string &a_pathFout, const string &a_pathDout)
int ConvertFromString(const string &a_str, string *a_result)
Copy the 'a_str' string in the position pointed by 'a_result'.
void ShowHelpSpecific()
Show help for the child algorithm.
int CheckParameters()
A public function used to check the parameters settings.
Inherit from vDataFile. Class that manages the reading of a CT input file (header + data)...
void SetOptions(vector< string > a_options)
void SetNbVoxX(INTNB a_nbVoxX)
void SetScanner(vScanner *ap_Scanner)
void SetOffsetX(FLTNB a_offsetX)
This class is designed to manage all dimensions and quantification related stuff. ...
int GetNbThreadsForProjection()
Get the number of threads used for projections.
void SetDataFile(vDataFile **a2p_DataFile)
void SetOptions(const string &a_options)
void ShowHelpDimensions()
Display command line options related to image dimensions for castor-recon.
void SetImageSpace(oImageSpace *ap_ImageSpace)
void SetImageSpace(oImageSpace *ap_ImageSpace)
void SetVerbose(int a_verboseLevel)
void SetFrames(const string &a_frameList)
int CheckSPECTAttenuationCompatibility(const string &a_pathToAttenuationImage)
This class is designed to manage some profiling of the code.
void SetDataFileName(vector< string > ap_dataFileName)
void SetNbMultiModalImages(int a_nbMultiModalImages)
void SetNbSkippedIterations(const string &a_skippedIterations)
Set the number of first iterations to be skipped.
int IntfReadHeader(const string &a_pathToHeaderFile, Intf_fields *ap_IntfFields, int vb)
Read an Interfile header.
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 SetVerbose(int a_verbose)
void SetDeformationManager(oDeformationManager *ap_DeformationManager)
int ReadDataASCIIFile(const string &a_file, const string &a_keyword, T *ap_return, int a_nbElts, bool a_mandatoryFlag)
Look for "a_nbElts" elts in the "a_file" file matching the "a_keyword" string passed as parameter a...
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
void SetImageDimensionsAndQuantification(oImageDimensionsAndQuantification *ap_ImageDimensionsAndQuantification)
Inherit from vDataFile. Class that manages the reading of a PET input file (header + data)...
int GetGeometricInfoFromDataFile(string a_pathToDataFilename)
void SetDataFile(vDataFile *ap_DataFile)
Set the data file in use.
void SetMPIRankAndSize(int a_mpiRank, int a_mpiSize)
void SetRespBasisFunctionsFile(const string &a_respBasisFunctionsFile)
static sChronoManager * GetInstance()
Instantiate the singleton if not already done, then return the pointer to its instance.
void SetVerbose(int a_verboseLevel)
This class is designed to manage the computation of the sensitivity image.
void SetVerbose(int a_verboseLevel)
void SetVerbose(int a_verboseLevel)
void SetOptimizerImageStatFlag(bool a_optimizerImageStatFlag)
int SetFlipOut(const string &a_flipOut)
void SetPathToSensitivityImage(string a_pathToSensitivityImage)
int Initialize()
A function used to initialize the manager and all image convolvers it manages.
#define KEYWORD_OPTIONAL_ERROR
int SetDynamicSpecificQuantificationFactors(const string &a_quantificationFile)
void 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.