Skip to content

Commit bdf04ac

Browse files
markus-jehlMarkus Jehl
and
Markus Jehl
authored
Reverting a change that broke the blocks on cylindrical geometry. (#1462)
* Reverting a change that broke the blocks on cylindrical geometry. * Fix for the blocks on cylindrical test by making the bin search more reliable. * Fixing the other test by simplifying and fixing the calculation of csi using the same logic than in plot_scanner_LORs.py --------- Co-authored-by: Markus Jehl <markus.jehl@positrigo.com>
1 parent 12bfa87 commit bdf04ac

File tree

4 files changed

+28
-41
lines changed

4 files changed

+28
-41
lines changed

documentation/release_6.2.htm

+6
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ <h3>Changed functionality</h3>
7373

7474
<h3>Bug fixes</h3>
7575
<ul>
76+
<li>
77+
There was a bug in the computation of the detector coordinates for <code>BlocksOnCylindrical</code>
78+
scanners that caused the buckets to not be symmetric. <br>
79+
<a href=https://github.com/UCL/STIR/pull/1462>PR #1462</a>
80+
</li>
81+
7682
</ul>
7783

7884
<h3>Build system</h3>

src/buildblock/GeometryBlocksOnCylindrical.cxx

+3-6
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,9 @@ GeometryBlocksOnCylindrical::build_crystal_maps(const Scanner& scanner)
9292
- ax_blocks_gap * (num_axial_blocks_per_bucket * num_axial_buckets - 1))
9393
/ 2;
9494
float start_y = -1 * scanner.get_effective_ring_radius();
95-
float start_x
96-
= -1 * r
97-
* sin(csi_minus_csiGaps); //(
98-
// ((num_transaxial_blocks_per_bucket-1)/2.)*transaxial_block_spacing
99-
// + ((num_transaxial_crystals_per_block-1)/2.)*transaxial_crystal_spacing
100-
// ); //the first crystal in the bucket
95+
float start_x = -1 // the first crystal in the bucket
96+
* (((num_transaxial_blocks_per_bucket - 1) / 2.) * transaxial_block_spacing
97+
+ ((num_transaxial_crystals_per_block - 1) / 2.) * transaxial_crystal_spacing);
10198

10299
stir::CartesianCoordinate3D<float> start_point(start_z, start_y, start_x);
103100

src/recon_test/test_blocks_on_cylindrical_projectors.cxx

+12-8
Original file line numberDiff line numberDiff line change
@@ -364,27 +364,29 @@ BlocksTests::run_plane_symmetry_test(ForwardProjectorByBin& forw_projector1, For
364364
forw_projector2.forward_project(*projdata2, *image2_sptr);
365365

366366
int view1_num = 0, view2_num = 0;
367+
float min_diff = std::numeric_limits<float>::max();
367368
LORInAxialAndNoArcCorrSinogramCoordinates<float> lorB1;
368369
for (int i = 0; i < projdata->get_max_view_num(); i++)
369370
{
370371
Bin bin(0, i, 0, 0);
371372
proj_data_info_blocks_sptr->get_LOR(lorB1, bin);
372-
if (std::abs(lorB1.phi() - phi1) / phi1 <= 1E-2)
373+
if (std::abs(lorB1.phi() - phi1) < min_diff)
373374
{
375+
min_diff = std::abs(lorB1.phi() - phi1);
374376
view1_num = i;
375-
break;
376377
}
377378
}
378379

379380
LORInAxialAndNoArcCorrSinogramCoordinates<float> lorB2;
381+
min_diff = std::numeric_limits<float>::max();
380382
for (int i = 0; i < projdata2->get_max_view_num(); i++)
381383
{
382384
Bin bin(0, i, 0, 0);
383385
proj_data_info_blocks_sptr->get_LOR(lorB2, bin);
384-
if (std::abs(lorB2.phi() - phi2) / phi2 <= 1E-2)
386+
if (std::abs(lorB2.phi() - phi2) < min_diff)
385387
{
388+
min_diff = std::abs(lorB2.phi() - phi2);
386389
view2_num = i;
387-
break;
388390
}
389391
}
390392

@@ -393,23 +395,25 @@ BlocksTests::run_plane_symmetry_test(ForwardProjectorByBin& forw_projector1, For
393395

394396
// find the tang position with the max value
395397
int tang1_num = 0, tang2_num = 0;
398+
min_diff = std::numeric_limits<float>::max();
396399
for (int tang = projdata->get_min_tangential_pos_num(); tang < projdata->get_max_tangential_pos_num(); tang++)
397400
{
398401

399-
if ((max1 - projdata->get_sinogram(0, 0).at(view1_num).at(tang)) / max1 < 1E-3)
402+
if ((max1 - projdata->get_sinogram(0, 0).at(view1_num).at(tang)) < min_diff)
400403
{
404+
min_diff = (max1 - projdata->get_sinogram(0, 0).at(view1_num).at(tang));
401405
tang1_num = tang;
402-
break;
403406
}
404407
}
405408

409+
min_diff = std::numeric_limits<float>::max();
406410
for (int tang = projdata2->get_min_tangential_pos_num(); tang < projdata2->get_max_tangential_pos_num(); tang++)
407411
{
408412

409-
if ((max2 - projdata2->get_sinogram(0, 0).at(view2_num).at(tang)) / max2 < 1E-3)
413+
if ((max2 - projdata2->get_sinogram(0, 0).at(view2_num).at(tang)) < min_diff)
410414
{
415+
min_diff = (max1 - projdata->get_sinogram(0, 0).at(view1_num).at(tang));
411416
tang2_num = tang;
412-
break;
413417
}
414418
}
415419

src/test/test_DetectorCoordinateMap.cxx

+7-27
Original file line numberDiff line numberDiff line change
@@ -67,33 +67,13 @@ float
6767
DetectionPosMapTests::calculate_angle_within_half_bucket(
6868
const shared_ptr<Scanner> scanner_ptr, const shared_ptr<ProjDataInfoBlocksOnCylindricalNoArcCorr> proj_data_info_ptr)
6969
{
70-
Bin bin;
71-
LORInAxialAndNoArcCorrSinogramCoordinates<float> lorB;
72-
float csi;
73-
float C_spacing = scanner_ptr->get_transaxial_crystal_spacing();
74-
float csi_crystal = std::atan((C_spacing) / scanner_ptr->get_effective_ring_radius());
75-
// float bucket_spacing=scanner_ptr->get_transaxial_block_spacing()*C_spacing;
76-
// float blocks_gap=scanner_ptr->get_transaxial_block_spacing()
77-
// -scanner_ptr->get_num_transaxial_crystals_per_block()*C_spacing;
78-
// float csi_gap=std::atan((blocks_gap)/scanner_ptr->get_effective_ring_radius());
79-
80-
// get angle within half bucket
81-
for (int view = 0; view <= scanner_ptr->get_max_num_views(); view++)
82-
{
83-
int bucket_num
84-
= view / (scanner_ptr->get_num_transaxial_crystals_per_block() * scanner_ptr->get_num_transaxial_blocks_per_bucket());
85-
if (bucket_num > 0)
86-
break;
87-
88-
bin.segment_num() = 0;
89-
bin.axial_pos_num() = 0;
90-
bin.view_num() = view;
91-
bin.tangential_pos_num() = 0;
92-
93-
proj_data_info_ptr->get_LOR(lorB, bin);
94-
csi = lorB.phi();
95-
}
96-
return (csi + csi_crystal) / 2;
70+
auto csi = _PI / (scanner_ptr->get_num_transaxial_blocks() / scanner_ptr->get_num_transaxial_blocks_per_bucket());
71+
auto tBl_gap = scanner_ptr->get_transaxial_block_spacing()
72+
- scanner_ptr->get_num_transaxial_crystals_per_block() * scanner_ptr->get_transaxial_crystal_spacing();
73+
auto csi_minus_csiGaps
74+
= csi
75+
- (csi / scanner_ptr->get_transaxial_block_spacing() * 2) * (scanner_ptr->get_transaxial_crystal_spacing() / 2 + tBl_gap);
76+
return csi_minus_csiGaps;
9777
}
9878

9979
/*!

0 commit comments

Comments
 (0)