96 cout <<
"This projector is a simple line projector that computes the exact path length of a line through the voxels." << endl;
97 cout <<
"It is implemented from the following published paper:" << endl;
98 cout <<
"R. L. Siddon, \"Fast calculation of the exact radiological path for a three-dimensional CT array\", Med. Phys., vol. 12, pp. 252-5, 1985." << endl;
99 cout <<
"All voxels are correctly ordered in the line, so this projector can be used with SPECT attenuation correction." << endl;
123 if (
m_verbose>=2)
Cout(
"iProjectorClassicSiddon::InitializeSpecific() -> Use classic Siddon projector" << endl);
141 max_nb_voxels_in_dimension *= 4;
143 return max_nb_voxels_in_dimension;
156 Cerr(
"***** iProjectorClassicSiddon::ProjectWithoutTOF() -> Called while not initialized !" << endl);
161 #ifdef CASTOR_VERBOSE
164 string direction =
"";
165 if (a_direction==
FORWARD) direction =
"forward";
166 else direction =
"backward";
167 Cout(
"iProjectorClassicSiddon::Project without TOF -> Project line '" << ap_ProjectionLine <<
"' in " << direction <<
" direction" << endl);
175 FLTNB event1[3] = { event1_position[0], event1_position[1], event1_position[2] };
176 FLTNB event2[3] = { event2_position[0], event2_position[1], event2_position[2] };
186 FLTNB alphaFirst[] = { 0.0, 0.0, 0.0 };
187 FLTNB alphaLast[] = { 0.0, 0.0, 0.0 };
189 FLTNB alphaMin = 0.0, alphaMax = 1.0;
190 FLTNB delta_pos[] = {
191 event2[ 0 ] - event1[ 0 ],
192 event2[ 1 ] - event1[ 1 ],
193 event2[ 2 ] - event1[ 2 ]
197 for(
int i = 0; i < 3; ++i )
199 if( delta_pos[ i ] != 0.0 )
201 alphaFirst[i] = (-
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
202 alphaLast[i] = (
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
203 alphaMin = (std::max)(alphaMin,(std::min)(alphaFirst[i],alphaLast[i]));
204 alphaMax = (std::min)(alphaMax,(std::max)(alphaFirst[i],alphaLast[i]));
210 if( alphaMax <= alphaMin )
return 0;
214 int iMin = 0, iMax = 0;
215 int jMin = 0, jMax = 0;
216 int kMin = 0, kMax = 0;
219 if( delta_pos[ 0 ] > 0.0 )
222 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMax * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
224 else if( delta_pos[ 0 ] < 0.0 )
227 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMin * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
229 if( delta_pos[ 0 ] == 0. )
235 if( delta_pos[ 1 ] > 0. )
238 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMax * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
240 else if( delta_pos[ 1 ] < 0. )
243 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMin * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
245 else if( delta_pos[ 1 ] == 0. )
251 if( delta_pos[ 2 ] > 0. )
254 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMax * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
256 else if( delta_pos[ 2 ] < 0. )
259 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMin * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
261 else if( delta_pos[ 2 ] == 0. )
267 int n = ( iMax - iMin + 1 ) + ( jMax - jMin + 1 )
268 + ( kMax - kMin + 1 );
273 FLTNB *tmpAlpha =
new FLTNB[ mp_nbVox[ 0 ] + mp_nbVox[ 1 ] + mp_nbVox[ 2 ] + 3 ];
274 FLTNB *alphaX =
new FLTNB[ ( mp_nbVox[ 0 ] + 1 ) ];
275 FLTNB *alphaY =
new FLTNB[ ( mp_nbVox[ 1 ] + 1 ) ];
276 FLTNB *alphaZ =
new FLTNB[ ( mp_nbVox[ 2 ] + 1 ) ];
278 INTNB iElement = iMax - iMin + 1;
282 if( delta_pos[ 0 ] > 0. )
284 for(
int i = iMin; i <= iMax; ++i )
287 else if( delta_pos[ 0 ] < 0. )
289 for(
int i = iMax; i >= iMin; --i )
295 INTNB jElement = jMax - jMin + 1;
299 if( delta_pos[ 1 ] > 0. )
301 for(
int j = jMin; j <= jMax; ++j )
304 else if( delta_pos[ 1 ] < 0. )
306 for(
int j = jMax; j >= jMin; --j )
312 INTNB kElement = kMax - kMin + 1;
316 if( delta_pos[ 2 ] > 0. )
318 for(
int k = kMin; k <= kMax; ++k )
321 else if( delta_pos[ 2 ] < 0. )
323 for(
int k = kMax; k >= kMin; --k )
329 alphaX, alphaX + iElement,
333 ::memcpy( tmpAlpha, alpha, ( iElement ) *
sizeof(
FLTNB ) );
336 alphaY, alphaY + jElement,
337 tmpAlpha, tmpAlpha + iElement,
340 ::memcpy( tmpAlpha, alpha, ( iElement + jElement ) *
sizeof(
FLTNB ) );
343 alphaZ, alphaZ + kElement,
344 tmpAlpha, tmpAlpha + iElement + jElement,
356 FLTNB alphaMid = 0.0;
357 INTNB i = 0, j = 0, k = 0;
358 FLTNB *pAlpha = &alpha[ 1 ];
359 FLTNB *pAlphaPrevious = &alpha[ 0 ];
363 for(
int nP = 0; nP < n - 1; ++nP, ++pAlpha, ++pAlphaPrevious )
365 alphaMid = ( *pAlpha + *pAlphaPrevious ) * 0.5;
367 i = alphaMid * i2 + i1;
368 if( i < 1 || i > mp_nbVox[ 0 ] )
continue;
370 j = alphaMid * j2 + j1;
371 if( j < 1 || j > mp_nbVox[ 1 ] )
continue;
373 k = alphaMid * k2 + k1;
374 if( k < 1 || k > mp_nbVox[ 2 ] )
continue;
376 numVox = ( i - 1 ) + ( j - 1 ) * mp_nbVox[0] + ( k - 1 ) * mp_nbVox[0] * mp_nbVox[1];
381 coeff = length_LOR * ( *pAlpha - *pAlphaPrevious );
383 ap_ProjectionLine->
AddVoxel(a_direction, numVox, coeff);
392 #ifdef CASTOR_VERBOSE
395 Cout(
"iProjectorClassicSiddon::Project without TOF -> Exit function" << endl);
412 Cerr(
"***** iProjectorClassicSiddon::ProjectWithTOFPos() -> Called while not initialized !" << endl);
417 #ifdef CASTOR_VERBOSE
420 string direction =
"";
421 if (a_direction==
FORWARD) direction =
"forward";
422 else direction =
"backward";
423 Cout(
"iProjectorClassicSiddon::Project with TOF measurement -> Project line '" << ap_ProjectionLine <<
"' in " << direction <<
" direction" << endl);
431 FLTNB event1[3] = { event1_position[0], event1_position[1], event1_position[2] };
432 FLTNB event2[3] = { event2_position[0], event2_position[1], event2_position[2] };
442 FLTNB alphaFirst[] = { 0.0, 0.0, 0.0 };
443 FLTNB alphaLast[] = { 0.0, 0.0, 0.0 };
445 FLTNB alphaMin = 0.0, alphaMax = 1.0;
446 FLTNB delta_pos[] = {
447 event2[ 0 ] - event1[ 0 ],
448 event2[ 1 ] - event1[ 1 ],
449 event2[ 2 ] - event1[ 2 ]
458 HPFLTNB tof_sigma_sqrt2 = sqrt(2.)*tof_sigma;
465 HPFLTNB lor_tof_center = length_LOR * 0.5 + tof_delta;
468 HPFLTNB tof_edge_low[] = {0,0,0};
470 HPFLTNB tof_edge_high[] = {0,0,0};
475 for (
int ax=0;ax<3;ax++)
478 tof_center = event1[ax] + lor_tof_center * delta_pos[ax] / length_LOR;
481 tof_edge_low[ax] = tof_center - tof_half_span * fabs(delta_pos[ax]) / length_LOR;
484 if (tof_index>
mp_nbVox[ax]-1)
return 0;
488 tof_edge_high[ax] = tof_center + tof_half_span * fabs(delta_pos[ax]) / length_LOR;
491 if (tof_index<0)
return 0;
498 for(
int i = 0; i < 3; ++i )
500 if( delta_pos[ i ] != 0.0 )
502 alphaFirst[i] = (tof_edge_low[i] - event1[i]) / (delta_pos[ i ]);
503 alphaLast[i] = (tof_edge_high[i] - event1[i]) / (delta_pos[ i ]);
504 alphaMin = (std::max)(alphaMin,(std::min)(alphaFirst[i],alphaLast[i]));
505 alphaMax = (std::min)(alphaMax,(std::max)(alphaFirst[i],alphaLast[i]));
511 if( alphaMax <= alphaMin )
return 0;
515 int iMin = 0, iMax = 0;
516 int jMin = 0, jMax = 0;
517 int kMin = 0, kMax = 0;
520 if( delta_pos[ 0 ] > 0.0 )
523 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMax * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
525 else if( delta_pos[ 0 ] < 0.0 )
528 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMin * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
530 if( delta_pos[ 0 ] == 0. )
536 if( delta_pos[ 1 ] > 0. )
539 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMax * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
541 else if( delta_pos[ 1 ] < 0. )
544 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMin * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
546 else if( delta_pos[ 1 ] == 0. )
552 if( delta_pos[ 2 ] > 0. )
555 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMax * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
557 else if( delta_pos[ 2 ] < 0. )
560 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMin * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
562 else if( delta_pos[ 2 ] == 0. )
568 int n = ( iMax - iMin + 1 ) + ( jMax - jMin + 1 )
569 + ( kMax - kMin + 1 );
574 FLTNB *tmpAlpha =
new FLTNB[ mp_nbVox[ 0 ] + mp_nbVox[ 1 ] + mp_nbVox[ 2 ] + 3 ];
575 FLTNB *alphaX =
new FLTNB[ ( mp_nbVox[ 0 ] + 1 ) ];
576 FLTNB *alphaY =
new FLTNB[ ( mp_nbVox[ 1 ] + 1 ) ];
577 FLTNB *alphaZ =
new FLTNB[ ( mp_nbVox[ 2 ] + 1 ) ];
579 INTNB iElement = iMax - iMin + 1;
583 if( delta_pos[ 0 ] > 0. )
585 for(
int i = iMin; i <= iMax; ++i )
588 else if( delta_pos[ 0 ] < 0. )
590 for(
int i = iMax; i >= iMin; --i )
596 INTNB jElement = jMax - jMin + 1;
600 if( delta_pos[ 1 ] > 0. )
602 for(
int j = jMin; j <= jMax; ++j )
605 else if( delta_pos[ 1 ] < 0. )
607 for(
int j = jMax; j >= jMin; --j )
613 INTNB kElement = kMax - kMin + 1;
617 if( delta_pos[ 2 ] > 0. )
619 for(
int k = kMin; k <= kMax; ++k )
622 else if( delta_pos[ 2 ] < 0. )
624 for(
int k = kMax; k >= kMin; --k )
630 alphaX, alphaX + iElement,
634 ::memcpy( tmpAlpha, alpha, ( iElement ) *
sizeof(
FLTNB ) );
637 alphaY, alphaY + jElement,
638 tmpAlpha, tmpAlpha + iElement,
641 ::memcpy( tmpAlpha, alpha, ( iElement + jElement ) *
sizeof(
FLTNB ) );
644 alphaZ, alphaZ + kElement,
645 tmpAlpha, tmpAlpha + iElement + jElement,
657 FLTNB alphaMid = 0.0;
658 INTNB i = 0, j = 0, k = 0;
659 FLTNB *pAlpha = &alpha[ 1 ];
660 FLTNB *pAlphaPrevious = &alpha[ 0 ];
665 FLTNB previous_edge_erf = erf( (length_LOR * (*pAlphaPrevious) - lor_tof_center)/ tof_sigma_sqrt2 );
669 for(
int nP = 0; nP < n - 1; ++nP, ++pAlpha, ++pAlphaPrevious )
671 alphaMid = ( *pAlpha + *pAlphaPrevious ) * 0.5;
673 i = alphaMid * i2 + i1;
674 if( i < 1 || i > mp_nbVox[ 0 ] )
continue;
676 j = alphaMid * j2 + j1;
677 if( j < 1 || j > mp_nbVox[ 1 ] )
continue;
679 k = alphaMid * k2 + k1;
680 if( k < 1 || k > mp_nbVox[ 2 ] )
continue;
682 numVox = ( i - 1 ) + ( j - 1 ) * mp_nbVox[0] + ( k - 1 ) * mp_nbVox[0] * mp_nbVox[1];
685 next_edge_erf = erf( (length_LOR * (*pAlpha) - lor_tof_center) / tof_sigma_sqrt2 );
687 coeff = 0.5 * fabs(previous_edge_erf - next_edge_erf) ;
689 previous_edge_erf = next_edge_erf;
702 #ifdef CASTOR_VERBOSE
705 Cout(
"iProjectorClassicSiddon::Project with TOF measurement-> Exit function" << endl);
722 Cerr(
"***** iProjectorClassicSiddon::ProjectWithTOFBin() -> Called while not initialized !" << endl);
727 #ifdef CASTOR_VERBOSE
730 string direction =
"";
731 if (a_direction==
FORWARD) direction =
"forward";
732 else direction =
"backward";
733 Cout(
"iProjectorClassicSiddon::Project with TOF bins -> Project line '" << ap_ProjectionLine <<
"' in " << direction <<
" direction" << endl);
741 FLTNB event1[3] = { event1_position[0], event1_position[1], event1_position[2] };
742 FLTNB event2[3] = { event2_position[0], event2_position[1], event2_position[2] };
748 FLTNB length_LOR_half = length_LOR * 0.5;
753 FLTNB alphaFirst[] = { 0.0, 0.0, 0.0 };
754 FLTNB alphaLast[] = { 0.0, 0.0, 0.0 };
756 FLTNB alphaMin = 0.0, alphaMax = 1.0;
757 FLTNB delta_pos[] = {
758 event2[ 0 ] - event1[ 0 ],
759 event2[ 1 ] - event1[ 1 ],
760 event2[ 2 ] - event1[ 2 ]
769 INTNB tof_half_nb_bins = tof_nb_bins/2;
783 INTNB tof_bin_last = tof_half_nb_bins;
784 INTNB tof_bin_first = -tof_half_nb_bins;
800 for(
int i = 0; i < 3; ++i )
802 if( delta_pos[ i ] != 0.0 )
804 alphaFirst[i] = (-
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
805 alphaLast[i] = (
mp_halfFOV[i] - event1[i]) / (delta_pos[ i ]);
806 alphaMin = (std::max)(alphaMin,(std::min)(alphaFirst[i],alphaLast[i]));
807 alphaMax = (std::min)(alphaMax,(std::max)(alphaFirst[i],alphaLast[i]));
813 if( alphaMax <= alphaMin )
return 0;
817 int iMin = 0, iMax = 0;
818 int jMin = 0, jMax = 0;
819 int kMin = 0, kMax = 0;
822 if( delta_pos[ 0 ] > 0.0 )
825 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMax * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
827 else if( delta_pos[ 0 ] < 0.0 )
830 iMax = ::floor( 1 + ( event1[ 0 ] + alphaMin * delta_pos[ 0 ] - (-
mp_halfFOV[ 0 ]) ) /
mp_sizeVox[0] );
832 if( delta_pos[ 0 ] == 0. )
838 if( delta_pos[ 1 ] > 0. )
841 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMax * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
843 else if( delta_pos[ 1 ] < 0. )
846 jMax = ::floor( 1 + ( event1[ 1 ] + alphaMin * delta_pos[ 1 ] - (-
mp_halfFOV[ 1 ]) ) /
mp_sizeVox[1] );
848 else if( delta_pos[ 1 ] == 0. )
854 if( delta_pos[ 2 ] > 0. )
857 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMax * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
859 else if( delta_pos[ 2 ] < 0. )
862 kMax = ::floor( 1 + ( event1[ 2 ] + alphaMin * delta_pos[ 2 ] - (-
mp_halfFOV[ 2 ]) ) /
mp_sizeVox[2] );
864 else if( delta_pos[ 2 ] == 0. )
870 int n = ( iMax - iMin + 1 ) + ( jMax - jMin + 1 )
871 + ( kMax - kMin + 1 );
876 FLTNB *tmpAlpha =
new FLTNB[ mp_nbVox[ 0 ] + mp_nbVox[ 1 ] + mp_nbVox[ 2 ] + 3 ];
877 FLTNB *alphaX =
new FLTNB[ ( mp_nbVox[ 0 ] + 1 ) ];
878 FLTNB *alphaY =
new FLTNB[ ( mp_nbVox[ 1 ] + 1 ) ];
879 FLTNB *alphaZ =
new FLTNB[ ( mp_nbVox[ 2 ] + 1 ) ];
884 for (
INTNB tof_bin=0; tof_bin<tof_nb_bins; tof_bin++) tof_weights_temp[tof_bin] = 0.;
886 INTNB iElement = iMax - iMin + 1;
890 if( delta_pos[ 0 ] > 0. )
892 for(
int i = iMin; i <= iMax; ++i )
895 else if( delta_pos[ 0 ] < 0. )
897 for(
int i = iMax; i >= iMin; --i )
903 INTNB jElement = jMax - jMin + 1;
907 if( delta_pos[ 1 ] > 0. )
909 for(
int j = jMin; j <= jMax; ++j )
912 else if( delta_pos[ 1 ] < 0. )
914 for(
int j = jMax; j >= jMin; --j )
920 INTNB kElement = kMax - kMin + 1;
924 if( delta_pos[ 2 ] > 0. )
926 for(
int k = kMin; k <= kMax; ++k )
929 else if( delta_pos[ 2 ] < 0. )
931 for(
int k = kMax; k >= kMin; --k )
937 alphaX, alphaX + iElement,
941 ::memcpy( tmpAlpha, alpha, ( iElement ) *
sizeof(
FLTNB ) );
944 alphaY, alphaY + jElement,
945 tmpAlpha, tmpAlpha + iElement,
948 ::memcpy( tmpAlpha, alpha, ( iElement + jElement ) *
sizeof(
FLTNB ) );
951 alphaZ, alphaZ + kElement,
952 tmpAlpha, tmpAlpha + iElement + jElement,
964 FLTNB alphaMid = 0.0;
965 INTNB i = 0, j = 0, k = 0;
966 FLTNB *pAlpha = &alpha[ 1 ];
967 FLTNB *pAlphaPrevious = &alpha[ 0 ];
970 INTNB tof_bin_first_for_voxel = 0, tof_bin_last_for_voxel = 0;
973 for(
int nP = 0; nP < n - 1; ++nP, ++pAlpha, ++pAlphaPrevious )
975 alphaMid = ( *pAlpha + *pAlphaPrevious ) * 0.5;
977 i = alphaMid * i2 + i1;
978 if( i < 1 || i > mp_nbVox[ 0 ] )
continue;
980 j = alphaMid * j2 + j1;
981 if( j < 1 || j > mp_nbVox[ 1 ] )
continue;
983 k = alphaMid * k2 + k1;
984 if( k < 1 || k > mp_nbVox[ 2 ] )
continue;
986 numVox = ( i - 1 ) + ( j - 1 ) * mp_nbVox[0] + ( k - 1 ) * mp_nbVox[0] * mp_nbVox[1];
991 coeff = length_LOR * ( *pAlpha - *pAlphaPrevious );
994 tof_bin_first_for_voxel = max(tof_bin_first , (
INTNB)(trunc( ((*pAlphaPrevious) * length_LOR - tof_half_span - length_LOR_half ) / tof_bin_size )));
995 tof_bin_last_for_voxel = min(tof_bin_last , (
INTNB)(trunc( ((*pAlpha) * length_LOR + tof_half_span - length_LOR_half) / tof_bin_size )));
996 lor_tof_center = length_LOR_half + tof_bin_first_for_voxel * tof_bin_size;
999 if(tof_bin_first_for_voxel>tof_bin_last || tof_bin_last_for_voxel<tof_bin_first)
continue;
1002 tof_bin_first_for_voxel += tof_half_nb_bins;
1003 tof_bin_last_for_voxel += tof_half_nb_bins;
1007 for (
INTNB tof_bin=tof_bin_first_for_voxel; tof_bin<=tof_bin_last_for_voxel; tof_bin++)
1016 HPFLTNB temp = (alphaMid * length_LOR - lor_tof_center) / tof_sigma;
1017 tof_weight = exp(- 0.5 * temp * temp ) * gaussian_norm_coef * coeff;
1019 tof_norm_coef += tof_weight;
1021 tof_weights_temp[tof_bin] = tof_weight;
1023 lor_tof_center += tof_bin_size;
1027 if (tof_norm_coef>0.)
1030 for (
INTNB tof_bin=tof_bin_first_for_voxel; tof_bin<=tof_bin_last_for_voxel; tof_bin++)
1032 tof_weights_temp[tof_bin] /= tof_norm_coef;
1035 ap_ProjectionLine->
AddVoxelAllTOFBins(a_direction, numVox, coeff, tof_weights_temp, tof_bin_first_for_voxel, tof_bin_last_for_voxel);
1044 delete[] tof_weights_temp;
1046 #ifdef CASTOR_VERBOSE
1049 Cout(
"iProjectorClassicSiddon::Project with TOF bins -> Exit function" << endl);
void ShowHelpSpecific()
A function used to show help about the child projector.
bool m_compatibleWithSPECTAttenuationCorrection
void AddVoxelAllTOFBins(int a_direction, INTNB a_voxelIndex, FLTNB a_voxelWeight, HPFLTNB *a_tofWeights, INTNB a_tofBinFirst, INTNB a_tofBinLast)
Add a voxel contribution to the line for all relevant TOF bins.
#define TWO_SQRT_TWO_LN_2
oImageDimensionsAndQuantification * mp_ImageDimensionsAndQuantification
This class is designed to generically described any on-the-fly projector.
FLTNB GetTOFMeasurement()
This function is used to get the TOF measurement.
FLTNB GetLength()
This function is used to get the length of the line.
int ReadOptionsList(const string &a_optionsList)
A function used to read options from a list of options.
FLTNB GetTOFResolution()
This function is used to get the TOF resolution.
iProjectorClassicSiddon()
The constructor of iProjectorClassicSiddon.
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 ProjectWithTOFBin(int a_direction, oProjectionLine *ap_ProjectionLine)
A function to project with TOF binned information.
int ProjectWithTOFPos(int a_direction, oProjectionLine *ap_ProjectionLine)
A function to project with TOF continuous information.
~iProjectorClassicSiddon()
The destructor of iProjectorClassicSiddon.
Declaration of class iProjectorClassicSiddon.
int CheckSpecificParameters()
A private function used to check the parameters settings specific to the child projector.
This class is designed to manage and store system matrix elements associated to a vEvent...
INTNB EstimateMaxNumberOfVoxelsPerLine()
This function is used to compute and provide an estimate of the maximum number of voxels that could c...
int ReadConfigurationFile(const string &a_configurationFile)
A function used to read options from a configuration file.
Declaration of class sOutputManager.
int GetNbTOFBins()
This function is used to get the number of TOF bins in use.
FLTNB * GetPosition2()
This function is used to get the pointer to the mp_position2 (3-values tab).
INTNB GetNbVoxX()
Get the number of voxels along the X axis.
FLTNB GetTOFBinSize()
This function is used to get the size in ps of a TOF bin.
INTNB GetNbVoxZ()
Get the number of voxels along the Z axis.
int ProjectWithoutTOF(int a_direction, oProjectionLine *ap_ProjectionLine)
A function to project without TOF.
bool m_compatibleWithCompression
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 InitializeSpecific()
This function is used to initialize specific stuff to the child projector.
INTNB GetNbVoxY()
Get the number of voxels along the Y axis.