79 cout <<
"This projector is a simple line projector that computes the exact path length of a line through the voxels." << endl;
80 cout <<
"It is basically an incremental version of the original algorithm proposed by R. L. Siddon (see the classicSiddon projector)." << endl;
81 cout <<
"It is implemented from the following published paper:" << endl;
82 cout <<
"F. Jacobs et al, \"A fast algorithm to calculate the exact radiological path through a pixel or voxel space\", J. Comput. Inf. Technol., vol. 6, pp. 89-94, 1998." << endl;
106 if (
m_verbose>=2)
Cout(
"iProjectorIncrementalSiddon::InitializeSpecific() -> Use incremental Siddon projector" << endl);
124 max_nb_voxels_in_dimension *= 4;
126 return max_nb_voxels_in_dimension;
139 Cerr(
"***** iProjectorIncrementalSiddon::ProjectWithoutTOF() -> Called while not initialized !" << endl);
144 #ifdef CASTOR_VERBOSE
147 string direction =
"";
148 if (a_direction==
FORWARD) direction =
"forward";
149 else direction =
"backward";
150 Cout(
"iProjectorIncrementalSiddon::Project without TOF -> Project line '" << ap_ProjectionLine <<
"' in " << direction <<
" direction" << endl);
157 double event1[3] = { event1Float[0], event1Float[1], event1Float[2] };
158 double event2[3] = { event2Float[0], event2Float[1], event2Float[2] };
163 double length_LOR = ap_ProjectionLine->
GetLength();
168 double alphaFirst[] = { 0.0, 0.0, 0.0 };
169 double alphaLast[] = { 0.0, 0.0, 0.0 };
171 double alphaMin = 0.0f, alphaMax = 1.0f;
172 double delta_pos[] = {
173 event2[ 0 ] - event1[ 0 ],
174 event2[ 1 ] - event1[ 1 ],
175 event2[ 2 ] - event1[ 2 ]
179 for(
int i = 0; i < 3; ++i )
181 if( delta_pos[ i ] != 0.0 )
183 alphaFirst[i] = (-
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
184 alphaLast[i] = (
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
185 alphaMin = (std::max)(alphaMin,(std::min)(alphaFirst[i],alphaLast[i]));
186 alphaMax = (std::min)(alphaMax,(std::max)(alphaFirst[i],alphaLast[i]));
192 if( alphaMax <= alphaMin )
return 0;
196 int iMin = 0, iMax = 0;
197 int jMin = 0, jMax = 0;
198 int kMin = 0, kMax = 0;
201 if( delta_pos[ 0 ] > 0.0f )
204 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMax * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
206 else if( delta_pos[ 0 ] < 0.0f )
209 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMin * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
211 if( delta_pos[ 0 ] == 0 )
217 if( delta_pos[ 1 ] > 0 )
220 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMax * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
222 else if( delta_pos[ 1 ] < 0 )
225 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMin * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
227 else if( delta_pos[ 1 ] == 0 )
233 if( delta_pos[ 2 ] > 0 )
236 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMax * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
238 else if( delta_pos[ 2 ] < 0 )
241 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMin * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
243 else if( delta_pos[ 2 ] == 0 )
249 INTNB n = ( iMax - iMin + 1 ) + ( jMax - jMin + 1 )
250 + ( kMax - kMin + 1 );
253 double alpha_XYZ[ 3 ] = { 1.0f, 1.0f, 1.0f };
256 if( delta_pos[ 0 ] > 0 )
257 alpha_XYZ[ 0 ] = ( ( (-
mp_halfFOV[ 0 ]) + ( iMin - 1 ) *
mp_sizeVox[0] ) - event1[ 0 ] ) / delta_pos[ 0 ];
258 else if( delta_pos[ 0 ] < 0 )
259 alpha_XYZ[ 0 ] = ( ( (-
mp_halfFOV[ 0 ]) + ( iMax - 1 ) *
mp_sizeVox[0] ) - event1[ 0 ] ) / delta_pos[ 0 ];
262 if( delta_pos[ 1 ] > 0 )
263 alpha_XYZ[ 1 ] = ( ( (-
mp_halfFOV[ 1 ]) + ( jMin - 1 ) *
mp_sizeVox[1] ) - event1[ 1 ] ) / delta_pos[ 1 ];
264 else if( delta_pos[ 1 ] < 0 )
265 alpha_XYZ[ 1 ] = ( ( (-
mp_halfFOV[ 1 ]) + ( jMax - 1 ) *
mp_sizeVox[1] ) - event1[ 1 ] ) / delta_pos[ 1 ];
268 if( delta_pos[ 2 ] > 0 )
269 alpha_XYZ[ 2 ] = ( ( (-
mp_halfFOV[ 2 ]) + ( kMin - 1 ) *
mp_sizeVox[2] ) - event1[ 2 ] ) / delta_pos[ 2 ];
270 else if( delta_pos[ 2 ] < 0 )
271 alpha_XYZ[ 2 ] = ( ( (-
mp_halfFOV[ 2 ]) + ( kMax - 1 ) *
mp_sizeVox[2] ) - event1[ 2 ] ) / delta_pos[ 2 ];
274 double alpha_u[ 3 ] = {
281 INTNB index_u[ 3 ] = {
282 (delta_pos[ 0 ] < 0) ? -1 : 1,
283 (delta_pos[ 1 ] < 0) ? -1 : 1,
284 (delta_pos[ 2 ] < 0) ? -1 : 1
288 if( alpha_XYZ[ 0 ] == alphaMin ) alpha_XYZ[ 0 ] += alpha_u[ 0 ];
289 if( alpha_XYZ[ 1 ] == alphaMin ) alpha_XYZ[ 1 ] += alpha_u[ 1 ];
290 if( alpha_XYZ[ 2 ] == alphaMin ) alpha_XYZ[ 2 ] += alpha_u[ 2 ];
293 double const min_alpha_XYZ = (std::min)( alpha_XYZ[ 0 ],
294 (std::min)( alpha_XYZ[ 1 ], alpha_XYZ[ 2 ] ) );
297 double const alphaMid = ( min_alpha_XYZ + alphaMin ) / 2.0f;
298 INTNB index_ijk[ 3 ] = {
308 double alpha_c = alphaMin;
311 for(
int nP = 0; nP < n - 1; ++nP )
313 if( ( alpha_XYZ[ 0 ] <= alpha_XYZ[ 1 ] )
314 && ( alpha_XYZ[ 0 ] <= alpha_XYZ[ 2 ] ) )
317 if( ( alpha_XYZ[ 0 ] >= alphaMin )
318 && ( index_ijk[ 0 ] - 1 >= 0 )
319 && ( index_ijk[ 0 ] - 1 <= mp_nbVox[ 0 ] - 1 )
320 && ( index_ijk[ 1 ] - 1 >= 0 )
321 && ( index_ijk[ 1 ] - 1 <= mp_nbVox[ 1 ] - 1 )
322 && ( index_ijk[ 2 ] - 1 >= 0 )
323 && ( index_ijk[ 2 ] - 1 <= mp_nbVox[ 2 ] - 1 ) )
325 coeff = ( alpha_XYZ[ 0 ] - alpha_c ) * length_LOR;
326 numVox = ( index_ijk[ 0 ] - 1 ) + ( ( index_ijk[ 1 ] - 1 ) ) * w + ( ( index_ijk[ 2 ] - 1 ) ) * wh;
327 ap_ProjectionLine->
AddVoxel(a_direction, numVox, coeff);
331 alpha_c = alpha_XYZ[ 0 ];
332 alpha_XYZ[ 0 ] += alpha_u[ 0 ];
333 index_ijk[ 0 ] += index_u[ 0 ];
335 else if( ( alpha_XYZ[ 1 ] < alpha_XYZ[ 0 ] )
336 && ( alpha_XYZ[ 1 ] <= alpha_XYZ[ 2 ] ) )
339 if( ( alpha_XYZ[ 1 ] >= alphaMin )
340 && ( index_ijk[ 0 ] - 1 >= 0 )
341 && ( index_ijk[ 0 ] - 1 <= mp_nbVox[ 0 ] - 1 )
342 && ( index_ijk[ 1 ] - 1 >= 0 )
343 && ( index_ijk[ 1 ] - 1 <= mp_nbVox[ 1 ] - 1 )
344 && ( index_ijk[ 2 ] - 1 >= 0 )
345 && ( index_ijk[ 2 ] - 1 <= mp_nbVox[ 2 ] - 1 ) )
347 coeff = ( alpha_XYZ[ 1 ] - alpha_c ) * length_LOR;
348 numVox = ( index_ijk[ 0 ] - 1 ) + ( ( index_ijk[ 1 ] - 1 ) ) * w + ( ( index_ijk[ 2 ] - 1 ) ) * wh;
349 ap_ProjectionLine->
AddVoxel(a_direction, numVox, coeff);
353 alpha_c = alpha_XYZ[ 1 ];
354 alpha_XYZ[ 1 ] += alpha_u[ 1 ];
355 index_ijk[ 1 ] += index_u[ 1 ];
357 else if( ( alpha_XYZ[ 2 ] < alpha_XYZ[ 0 ] )
358 && ( alpha_XYZ[ 2 ] < alpha_XYZ[ 1 ] ) )
361 if( ( alpha_XYZ[ 2 ] >= alphaMin )
362 && ( index_ijk[ 0 ] - 1 >= 0 )
363 && ( index_ijk[ 0 ] - 1 <= mp_nbVox[ 0 ] - 1 )
364 && ( index_ijk[ 1 ] - 1 >= 0 )
365 && ( index_ijk[ 1 ] - 1 <= mp_nbVox[ 1 ] - 1 )
366 && ( index_ijk[ 2 ] - 1 >= 0 )
367 && ( index_ijk[ 2 ] - 1 <= mp_nbVox[ 2 ] - 1 ) )
369 coeff = ( alpha_XYZ[ 2 ] - alpha_c ) * length_LOR;
370 numVox = ( index_ijk[ 0 ] - 1 ) + ( ( index_ijk[ 1 ] - 1 ) ) * w + ( ( index_ijk[ 2 ] - 1 ) ) * wh;
371 ap_ProjectionLine->
AddVoxel(a_direction, numVox, coeff);
375 alpha_c = alpha_XYZ[ 2 ];
376 alpha_XYZ[ 2 ] += alpha_u[ 2 ];
377 index_ijk[ 2 ] += index_u[ 2 ];
394 Cerr(
"***** iProjectorIncrementalSiddon::ProjectWithTOFPos() -> Called while not initialized !" << endl);
399 #ifdef CASTOR_VERBOSE
402 string direction =
"";
403 if (a_direction==
FORWARD) direction =
"forward";
404 else direction =
"backward";
405 Cout(
"iProjectorIncrementalSiddon::Project with TOF position -> Project line '" << ap_ProjectionLine <<
"' in " << direction <<
" direction" << endl);
412 double event1[3] = { event1Float[0], event1Float[1], event1Float[2] };
413 double event2[3] = { event2Float[0], event2Float[1], event2Float[2] };
418 double length_LOR = ap_ProjectionLine->
GetLength();
423 double alphaFirst[] = { 0.0, 0.0, 0.0 };
424 double alphaLast[] = { 0.0, 0.0, 0.0 };
426 double alphaMin = 0.0f, alphaMax = 1.0f;
427 double delta_pos[] = {
428 event2[ 0 ] - event1[ 0 ],
429 event2[ 1 ] - event1[ 1 ],
430 event2[ 2 ] - event1[ 2 ]
446 if ( fabs(tof_deltaL) > length_LOR * 0.5)
452 double lor_tof_center = length_LOR * 0.5 + tof_deltaL;
455 double tof_norm_coef = tof_sigma * sqrt(2*M_PI);
458 double tof_edge_low[] = {0,0,0};
460 double tof_edge_high[] = {0,0,0};
465 for (
int ax=0;ax<3;ax++)
468 tof_center = event1[ax] + lor_tof_center * delta_pos[ax] / length_LOR;
471 tof_edge_low[ax] = tof_center - tof_half_span * fabs(delta_pos[ax]) / length_LOR;
474 if (tof_index>
mp_nbVox[ax]-1)
return 0;
478 tof_edge_high[ax] = tof_center + tof_half_span * fabs(delta_pos[ax]) / length_LOR;
481 if (tof_index<0)
return 0;
486 for(
int i = 0; i < 3; ++i )
488 if( delta_pos[ i ] != 0.0 )
490 alphaFirst[i] = (-
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
491 alphaLast[i] = (
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
492 alphaMin = (std::max)(alphaMin,(std::min)(alphaFirst[i],alphaLast[i]));
493 alphaMax = (std::min)(alphaMax,(std::max)(alphaFirst[i],alphaLast[i]));
499 if( alphaMax <= alphaMin )
return 0;
503 int iMin = 0, iMax = 0;
504 int jMin = 0, jMax = 0;
505 int kMin = 0, kMax = 0;
508 if( delta_pos[ 0 ] > 0.0f )
511 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMax * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
513 else if( delta_pos[ 0 ] < 0.0f )
516 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMin * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
518 if( delta_pos[ 0 ] == 0 )
524 if( delta_pos[ 1 ] > 0 )
527 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMax * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
529 else if( delta_pos[ 1 ] < 0 )
532 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMin * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
534 else if( delta_pos[ 1 ] == 0 )
540 if( delta_pos[ 2 ] > 0 )
543 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMax * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
545 else if( delta_pos[ 2 ] < 0 )
548 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMin * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
550 else if( delta_pos[ 2 ] == 0 )
556 INTNB n = ( iMax - iMin + 1 ) + ( jMax - jMin + 1 )
557 + ( kMax - kMin + 1 );
560 double alpha_XYZ[ 3 ] = { 1.0f, 1.0f, 1.0f };
563 if( delta_pos[ 0 ] > 0 )
564 alpha_XYZ[ 0 ] = ( ( (-
mp_halfFOV[ 0 ]) + ( iMin - 1 ) *
mp_sizeVox[0] ) - event1[ 0 ] ) / delta_pos[ 0 ];
565 else if( delta_pos[ 0 ] < 0 )
566 alpha_XYZ[ 0 ] = ( ( (-
mp_halfFOV[ 0 ]) + ( iMax - 1 ) *
mp_sizeVox[0] ) - event1[ 0 ] ) / delta_pos[ 0 ];
569 if( delta_pos[ 1 ] > 0 )
570 alpha_XYZ[ 1 ] = ( ( (-
mp_halfFOV[ 1 ]) + ( jMin - 1 ) *
mp_sizeVox[1] ) - event1[ 1 ] ) / delta_pos[ 1 ];
571 else if( delta_pos[ 1 ] < 0 )
572 alpha_XYZ[ 1 ] = ( ( (-
mp_halfFOV[ 1 ]) + ( jMax - 1 ) *
mp_sizeVox[1] ) - event1[ 1 ] ) / delta_pos[ 1 ];
575 if( delta_pos[ 2 ] > 0 )
576 alpha_XYZ[ 2 ] = ( ( (-
mp_halfFOV[ 2 ]) + ( kMin - 1 ) *
mp_sizeVox[2] ) - event1[ 2 ] ) / delta_pos[ 2 ];
577 else if( delta_pos[ 2 ] < 0 )
578 alpha_XYZ[ 2 ] = ( ( (-
mp_halfFOV[ 2 ]) + ( kMax - 1 ) *
mp_sizeVox[2] ) - event1[ 2 ] ) / delta_pos[ 2 ];
581 double alpha_u[ 3 ] = {
588 INTNB index_u[ 3 ] = {
589 (delta_pos[ 0 ] < 0) ? -1 : 1,
590 (delta_pos[ 1 ] < 0) ? -1 : 1,
591 (delta_pos[ 2 ] < 0) ? -1 : 1
595 if( alpha_XYZ[ 0 ] == alphaMin ) alpha_XYZ[ 0 ] += alpha_u[ 0 ];
596 if( alpha_XYZ[ 1 ] == alphaMin ) alpha_XYZ[ 1 ] += alpha_u[ 1 ];
597 if( alpha_XYZ[ 2 ] == alphaMin ) alpha_XYZ[ 2 ] += alpha_u[ 2 ];
600 double const min_alpha_XYZ = (std::min)( alpha_XYZ[ 0 ], (std::min)( alpha_XYZ[ 1 ], alpha_XYZ[ 2 ] ) );
603 double const alphaMid = ( min_alpha_XYZ + alphaMin ) / 2.0f;
604 INTNB index_ijk[ 3 ] = {
614 double previous_edge_erf = erf( (length_LOR * alphaMin - lor_tof_center)/ (sqrt(2.)*tof_sigma) );
615 double next_edge_erf;
620 for(
int nP = 0; nP < n - 1; ++nP )
622 if( ( alpha_XYZ[ 0 ] <= alpha_XYZ[ 1 ] )
623 && ( alpha_XYZ[ 0 ] <= alpha_XYZ[ 2 ] ) )
626 if( ( alpha_XYZ[ 0 ] >= alphaMin )
627 && ( index_ijk[ 0 ] - 1 >= 0 )
628 && ( index_ijk[ 0 ] - 1 <= mp_nbVox[ 0 ] - 1 )
629 && ( index_ijk[ 1 ] - 1 >= 0 )
630 && ( index_ijk[ 1 ] - 1 <= mp_nbVox[ 1 ] - 1 )
631 && ( index_ijk[ 2 ] - 1 >= 0 )
632 && ( index_ijk[ 2 ] - 1 <= mp_nbVox[ 2 ] - 1 ) )
635 next_edge_erf = erf( (length_LOR * alpha_XYZ[ 0 ] - lor_tof_center) / (sqrt(2.)*tof_sigma) );
637 coeff = 0.5 * std::fabs(previous_edge_erf - next_edge_erf) * tof_norm_coef ;
639 previous_edge_erf = next_edge_erf;
641 numVox = ( index_ijk[ 0 ] - 1 ) + ( ( index_ijk[ 1 ] - 1 ) ) * w + ( ( index_ijk[ 2 ] - 1 ) ) * wh;
646 alpha_XYZ[ 0 ] += alpha_u[ 0 ];
647 index_ijk[ 0 ] += index_u[ 0 ];
649 else if( ( alpha_XYZ[ 1 ] < alpha_XYZ[ 0 ] )
650 && ( alpha_XYZ[ 1 ] <= alpha_XYZ[ 2 ] ) )
653 if( ( alpha_XYZ[ 1 ] >= alphaMin )
654 && ( index_ijk[ 0 ] - 1 >= 0 )
655 && ( index_ijk[ 0 ] - 1 <= mp_nbVox[ 0 ] - 1 )
656 && ( index_ijk[ 1 ] - 1 >= 0 )
657 && ( index_ijk[ 1 ] - 1 <= mp_nbVox[ 1 ] - 1 )
658 && ( index_ijk[ 2 ] - 1 >= 0 )
659 && ( index_ijk[ 2 ] - 1 <= mp_nbVox[ 2 ] - 1 ) )
662 next_edge_erf = erf( (length_LOR * alpha_XYZ[ 1 ] - lor_tof_center) / (sqrt(2.)*tof_sigma) );
664 coeff = 0.5 * std::fabs(previous_edge_erf - next_edge_erf) * tof_norm_coef ;
666 previous_edge_erf = next_edge_erf;
668 numVox = ( index_ijk[ 0 ] - 1 ) + ( ( index_ijk[ 1 ] - 1 ) ) * w + ( ( index_ijk[ 2 ] - 1 ) ) * wh;
673 alpha_XYZ[ 1 ] += alpha_u[ 1 ];
674 index_ijk[ 1 ] += index_u[ 1 ];
676 else if( ( alpha_XYZ[ 2 ] < alpha_XYZ[ 0 ] )
677 && ( alpha_XYZ[ 2 ] < alpha_XYZ[ 1 ] ) )
680 if( ( alpha_XYZ[ 2 ] >= alphaMin )
681 && ( index_ijk[ 0 ] - 1 >= 0 )
682 && ( index_ijk[ 0 ] - 1 <= mp_nbVox[ 0 ] - 1 )
683 && ( index_ijk[ 1 ] - 1 >= 0 )
684 && ( index_ijk[ 1 ] - 1 <= mp_nbVox[ 1 ] - 1 )
685 && ( index_ijk[ 2 ] - 1 >= 0 )
686 && ( index_ijk[ 2 ] - 1 <= mp_nbVox[ 2 ] - 1 ) )
689 next_edge_erf = erf( (length_LOR * alpha_XYZ[ 2 ] - lor_tof_center) / (sqrt(2.)*tof_sigma) );
691 coeff = 0.5 * std::fabs(previous_edge_erf - next_edge_erf) * tof_norm_coef ;
693 previous_edge_erf = next_edge_erf;
695 numVox = ( index_ijk[ 0 ] - 1 ) + ( ( index_ijk[ 1 ] - 1 ) ) * w + ( ( index_ijk[ 2 ] - 1 ) ) * wh;
700 alpha_XYZ[ 2 ] += alpha_u[ 2 ];
701 index_ijk[ 2 ] += index_u[ 2 ];
715 Cerr(
"***** iProjectorIncrementalSiddon::ProjectWithTOFBin() -> Not yet implemented !" << endl);
bool m_compatibleWithSPECTAttenuationCorrection
~iProjectorIncrementalSiddon()
The destructor of iProjectorIncrementalSiddon.
#define TWO_SQRT_TWO_LN_2
oImageDimensionsAndQuantification * mp_ImageDimensionsAndQuantification
void ShowHelpSpecific()
A function used to show help about the child module.
This class is designed to generically described any on-the-fly projector.
FLTNB GetTOFMeasurement()
This function is used to get the TOF measurement.
Declaration of class iProjectorIncrementalSiddon.
FLTNB GetLength()
This function is used to get the length of the line.
FLTNB GetTOFResolution()
This function is used to get the TOF resolution.
FLTNB * GetPosition1()
This function is used to get the pointer to the mp_position1 (3-values tab).
void AddVoxel(int a_direction, INTNB a_voxelIndice, FLTNB a_voxelWeight)
This function is used to add a voxel contribution to the line, assuming TOF bin 0 (i...
int ReadConfigurationFile(const string &a_configurationFile)
A function used to read options from a configuration file.
int ProjectWithTOFPos(int a_direction, oProjectionLine *ap_ProjectionLine)
A function to project with TOF continuous information.
iProjectorIncrementalSiddon()
The constructor of iProjectorIncrementalSiddon.
INTNB EstimateMaxNumberOfVoxelsPerLine()
This function is used to compute and provide an estimate of the maximum number of voxels that could c...
int InitializeSpecific()
This function is used to initialize specific stuff to the child projector.
This class is designed to manage and store system matrix elements associated to a vEvent...
int ProjectWithoutTOF(int a_direction, oProjectionLine *ap_ProjectionLine)
A function to project without TOF.
Declaration of class sOutputManager.
int ProjectWithTOFBin(int a_direction, oProjectionLine *ap_ProjectionLine)
A function to project with TOF binned information.
FLTNB * GetPosition2()
This function is used to get the pointer to the mp_position2 (3-values tab).
int ReadOptionsList(const string &a_optionsList)
A function used to read options from a list of options.
INTNB GetNbVoxX()
Get the number of voxels along the X axis.
INTNB GetNbVoxZ()
Get the number of voxels along the Z axis.
void AddVoxelInTOFBin(int a_direction, int a_TOFBin, INTNB a_voxelIndice, FLTNB a_voxelWeight)
This function is used to add a voxel contribution to the line and provided TOF bin.
int CheckSpecificParameters()
A private function used to check the parameters settings specific to the child projector.
INTNB GetNbVoxY()
Get the number of voxels along the Y axis.