@@ -489,7 +489,7 @@ ProjDataInfoTests::run_Blocks_DOI_test()
489
489
int Bring1, Bring2, Bdet1,Bdet2, BDring1, BDring2, BDdet1, BDdet2;
490
490
CartesianCoordinate3D< float > b1,b2,bd1,bd2;
491
491
float doi=scannerBlocksDOI_ptr->get_average_depth_of_interaction ();
492
- // timer.reset(); timer.start();
492
+ timer.reset (); timer.start ();
493
493
494
494
for (int seg =proj_data_info_blocks_doi0_ptr->get_min_segment_num (); seg <=proj_data_info_blocks_doi0_ptr->get_max_segment_num (); ++ seg)
495
495
for (int ax =proj_data_info_blocks_doi0_ptr->get_min_axial_pos_num (seg); ax <=proj_data_info_blocks_doi0_ptr->get_max_axial_pos_num (seg); ++ax)
@@ -545,15 +545,30 @@ ProjDataInfoTests::run_coordinate_test()
545
545
scannerBlocks_ptr->set_num_axial_crystals_per_block (1 );
546
546
scannerBlocks_ptr->set_axial_block_spacing (scannerBlocks_ptr->get_axial_crystal_spacing ()*
547
547
scannerBlocks_ptr->get_num_axial_crystals_per_block ());
548
- scannerBlocks_ptr->set_transaxial_block_spacing (scannerBlocks_ptr->get_transaxial_crystal_spacing ()*
549
- scannerBlocks_ptr->get_num_transaxial_crystals_per_block ());
550
548
scannerBlocks_ptr->set_num_transaxial_crystals_per_block (1 );
551
549
scannerBlocks_ptr->set_num_axial_blocks_per_bucket (1 );
552
550
scannerBlocks_ptr->set_num_transaxial_blocks_per_bucket (1 );
551
+ scannerBlocks_ptr->set_transaxial_block_spacing (scannerBlocks_ptr->get_transaxial_crystal_spacing ()*
552
+ scannerBlocks_ptr->get_num_transaxial_crystals_per_block ());
553
553
scannerBlocks_ptr->set_num_rings (1 );
554
554
555
555
scannerBlocks_ptr->set_scanner_geometry (" BlocksOnCylindrical" );
556
556
557
+ int num_transaxial_blocks_per_bucket = scannerBlocks_ptr->get_num_transaxial_blocks_per_bucket ();
558
+ int num_transaxial_crystals_per_block = scannerBlocks_ptr->get_num_transaxial_crystals_per_block ();
559
+ int num_transaxial_buckets = scannerBlocks_ptr->get_num_transaxial_blocks ()/num_transaxial_blocks_per_bucket;
560
+ float transaxial_block_spacing = scannerBlocks_ptr->get_transaxial_block_spacing ();
561
+ float transaxial_crystal_spacing = scannerBlocks_ptr->get_transaxial_crystal_spacing ();
562
+ // estimate the angle covered by a bucket, alpha
563
+
564
+ float csi=_PI/num_transaxial_buckets;
565
+ float trans_blocks_gap=transaxial_block_spacing-num_transaxial_crystals_per_block*transaxial_crystal_spacing;
566
+ float csi_minus_csiGaps=csi-(csi/transaxial_block_spacing/2 )*
567
+ (transaxial_crystal_spacing/2 +trans_blocks_gap);
568
+
569
+ float dx=scannerBlocks_ptr->get_effective_ring_radius ()*sin (csi_minus_csiGaps);
570
+ float dy=scannerBlocks_ptr->get_effective_ring_radius ()-scannerBlocks_ptr->get_effective_ring_radius ()*cos (csi_minus_csiGaps);
571
+
557
572
shared_ptr<Scanner> scannerCyl_ptr;
558
573
scannerCyl_ptr.reset (new Scanner (Scanner::SAFIRDualRingPrototype));
559
574
scannerCyl_ptr->set_num_axial_crystals_per_block (1 );
@@ -604,7 +619,7 @@ ProjDataInfoTests::run_coordinate_test()
604
619
int Bring1, Bring2, Bdet1,Bdet2, Cring1, Cring2, Cdet1, Cdet2;
605
620
int RTring1, RTring2, RTdet1,RTdet2;
606
621
CartesianCoordinate3D< float > b1,b2,c1,c2,roundt1, roundt2;
607
- // timer.reset(); timer.start();
622
+ timer.reset (); timer.start ();
608
623
LORInAxialAndNoArcCorrSinogramCoordinates<float > lorB;
609
624
LORInAxialAndNoArcCorrSinogramCoordinates<float > lorC;
610
625
@@ -796,7 +811,14 @@ ProjDataInfoTests::run_coordinate_test_for_realistic_scanner()
796
811
797
812
int Bring1, Bring2, Bdet1,Bdet2, Cring1, Cring2, Cdet1, Cdet2;
798
813
CartesianCoordinate3D< float > b1,b2,c1,c2;
799
- // timer.reset(); timer.start();
814
+
815
+ // estimate the angle covered by half bucket, csi
816
+ float csi=_PI/scannerBlocks_ptr->get_num_transaxial_buckets ();
817
+ // distance between the center of the scannner and the first crystal in the bucket, r=Reffective/cos(csi)
818
+ float r=scannerBlocks_ptr->get_effective_ring_radius ()/cos (csi);
819
+ float max_tolerance=abs (scannerBlocks_ptr->get_effective_ring_radius ()-r);
820
+
821
+ timer.reset (); timer.start ();
800
822
LORInAxialAndNoArcCorrSinogramCoordinates<float > lorB;
801
823
LORInAxialAndNoArcCorrSinogramCoordinates<float > lorC;
802
824
@@ -842,14 +864,15 @@ ProjDataInfoTests::run_coordinate_test_for_realistic_scanner()
842
864
proj_data_info_blocks_ptr->find_cartesian_coordinates_of_detection (b1,b2,bin);
843
865
844
866
// we expect to be differences of the order of the mm in x and y due to the difference in geometry
845
- set_tolerance (10E-1 );
846
867
847
- check_if_equal (b1.z (),c1.z (), " " );
848
- check_if_equal (b2.z (),c2.z (), " " );
849
- check_if_equal (b1.y (),c1.y (), " " );
850
- check_if_equal (b2.y (),c2.y (), " " );
851
- check_if_equal (b1.x (),c1.x (), " " );
852
- check_if_equal (b2.x (),c2.x (), " " );
868
+ set_tolerance (max_tolerance);
869
+
870
+ check_if_equal (b1.z (),c1.z (), " checking cartesian coordinate z1" );
871
+ check_if_equal (b2.z (),c2.z (), " checking cartesian coordinate z2" );
872
+ check_if_equal (b1.y (),c1.y (), " checking cartesian coordinate y1" );
873
+ check_if_equal (b2.y (),c2.y (), " checking cartesian coordinate y2" );
874
+ check_if_equal (b1.x (),c1.x (), " checking cartesian coordinate x1" );
875
+ check_if_equal (b2.x (),c2.x (), " checking cartesian coordinate x2" );
853
876
854
877
}
855
878
timer.stop (); std::cerr<< " -- CPU Time " << timer.value () << ' \n ' ;
@@ -948,31 +971,30 @@ run_lor_get_s_test(){
948
971
// num_det_per_ring:2PI=det_id_diff:PI/2
949
972
int det_id_diff=scannerBlocks_ptr->get_num_detectors_per_ring ()*(_PI/2 )/(2 *_PI);
950
973
int Ctb=scannerCyl_ptr->get_num_transaxial_crystals_per_block ();
951
- float crystal_trans_spacing =scannerBlocks_ptr->get_transaxial_crystal_spacing ();
974
+ float transaxial_crystal_spacing =scannerBlocks_ptr->get_transaxial_crystal_spacing ();
952
975
float block_trans_spacing=scannerBlocks_ptr->get_transaxial_block_spacing ();
953
976
float prev_s=0 ;
954
977
float prev_phi=0 ;
955
978
for (int i=0 ; i<scannerCyl_ptr->get_num_transaxial_crystals_per_block ();i++){
956
979
957
- Cring1=0 ;Cdet1=i+2 *Ctb-Ctb/ 2 ;
958
- Cring2=0 ;Cdet2=2 *Ctb-Ctb/ 2 +det_id_diff+Ctb-1 -i;
980
+ Cring1=0 ;Cdet1=i+2 *Ctb;
981
+ Cring2=0 ;Cdet2=2 *Ctb+det_id_diff+Ctb-1 -i;
959
982
960
983
proj_data_info_blocks_ptr->get_bin_for_det_pair (bin, Cdet1,Cring1,Cdet2,Cring1);
961
984
proj_data_info_blocks_ptr->get_LOR (lorB,bin);
962
985
float R=block_trans_spacing*(sin (_PI*5 /12 )+sin (_PI/4 )+sin (_PI/12 ));
963
986
float s=R*cos (_PI/3 )+
964
- crystal_trans_spacing /2 *sin (_PI/4 )+
965
- (i)*crystal_trans_spacing *sin (_PI/4 );
987
+ transaxial_crystal_spacing /2 *sin (_PI/4 )+
988
+ (i)*transaxial_crystal_spacing *sin (_PI/4 );
966
989
967
- float s_step=crystal_trans_spacing *sin (_PI/4 );
990
+ float s_step=transaxial_crystal_spacing *sin (_PI/4 );
968
991
969
992
// the following fails at the moment
970
993
// check_if_equal(s, lorB.s(),std::to_string(i)+ " Blocks get_s() is different");
971
994
// the first value we expect to be different
995
+ set_tolerance (10E-3 );
972
996
if (i>0 ){
973
- check_if_equal (s_step, lorB.s ()-prev_s,std::to_string (i)+ " Blocks get_s() the step is different" );// +
974
- // std::to_string(crystal_trans_spacing*sin(_PI/4)) + " lorB.s() the step is "+std::to_string(lorB.s()-prev_s)+
975
- // + "phi step is "+std::to_string(lorB.phi()-prev_phi));
997
+ check_if_equal (s_step, lorB.s ()-prev_s,std::to_string (i)+ " Blocks get_s() the step is different" );
976
998
check_if_equal (0 .F , lorB.phi ()-prev_phi, " Blocks get_phi() should be always the same as we are considering parallel LORs" );
977
999
}
978
1000
prev_s=lorB.s ();
0 commit comments