@@ -22,6 +22,7 @@ using petsird::binary::PETSIRDReader;
2222#include < iostream>
2323#include < variant>
2424#include < cstdlib>
25+ #include < vector>
2526
2627void
2728print_usage_and_exit (char const * prog_name)
@@ -107,53 +108,59 @@ main(int argc, char const* argv[])
107108 std::cout << " Subject ID: " << header.exam ->subject .id << std::endl;
108109 const auto num_module_types = scanner.scanner_geometry .replicated_modules .size ();
109110 std::cout << " Types of modules: " << num_module_types << std::endl;
110- // TODO more than 1 type of module
111- const petsird::TypeOfModule type_of_module{ 0 };
112- std::cout << " Number of modules of first type: "
113- << scanner.scanner_geometry .replicated_modules [type_of_module].transforms .size () << std::endl;
114- std::cout << " Number of elements in modules of first type: "
115- << scanner.scanner_geometry .replicated_modules [type_of_module].object .detecting_elements .transforms .size ()
116- << std::endl;
117- std::cout << " Total number of 'crystals' in modules of first type : "
118- << petsird_helpers::get_num_det_els (scanner, type_of_module) << std::endl;
119-
120- const auto & tof_bin_edges = scanner.tof_bin_edges [type_of_module][type_of_module];
121- const auto num_tof_bins = tof_bin_edges.NumberOfBins ();
122- std::cout << " Number of TOF bins: " << num_tof_bins << std::endl;
123- std::cout << " TOF bin edges: " << tof_bin_edges.edges << std::endl;
124- const auto & event_energy_bin_edges = scanner.event_energy_bin_edges [type_of_module];
125- const auto num_event_energy_bins = event_energy_bin_edges.NumberOfBins ();
126- std::cout << " Number of energy bins: " << num_event_energy_bins << std::endl;
127- std::cout << " Event energy bin edges: " << event_energy_bin_edges.edges << std::endl;
128- const auto energy_mid_points = (xt::view (event_energy_bin_edges.edges , xt::range (0 , event_energy_bin_edges.edges .size () - 1 ))
129- + xt::view (event_energy_bin_edges.edges , xt::range (1 , event_energy_bin_edges.edges .size ())))
130- / 2 ;
131- std::cout << " Event energy mid points: " << energy_mid_points << std::endl;
132-
133- std::cout << " Singles Histogram Level: " ;
134- switch (scanner.singles_histogram_level )
111+ std::vector<yardl::NDArray<float , 1 >> all_energy_mid_points;
112+ for (petsird::TypeOfModule type_of_module = 0 ; type_of_module < num_module_types; ++type_of_module)
135113 {
136- case petsird::SinglesHistogramLevelType::kNone :
137- std::cout << " none\n " ;
138- break ;
139- case petsird::SinglesHistogramLevelType::kModule :
140- std::cout << " module\n " ;
141- break ;
142- case petsird::SinglesHistogramLevelType::kAll :
143- std::cout << " all\n " ;
144- break ;
145- }
146- if (scanner.singles_histogram_level != petsird::SinglesHistogramLevelType::kNone )
147- {
148- const auto & singles_histogram_energy_bin_edges = scanner.singles_histogram_energy_bin_edges [type_of_module];
149- std::cout << " Singles Histogram Energy Bin Edges: " << singles_histogram_energy_bin_edges.edges << std::endl;
150- std::cout << " Number of Singles Histogram Energy Windows: " << singles_histogram_energy_bin_edges.NumberOfBins ()
114+ std::cout << " ------ Module type " << type_of_module << std::endl;
115+ std::cout << " Number of modules of this type: "
116+ << scanner.scanner_geometry .replicated_modules [type_of_module].transforms .size () << std::endl;
117+ std::cout << " Number of elements in modules of this type: "
118+ << scanner.scanner_geometry .replicated_modules [type_of_module].object .detecting_elements .transforms .size ()
151119 << std::endl;
152- }
120+ std::cout << " Total number of 'crystals' in modules of this type : "
121+ << petsird_helpers::get_num_det_els (scanner, type_of_module) << std::endl;
153122
154- petsird::TimeBlock time_block;
123+ const auto & tof_bin_edges = scanner.tof_bin_edges [type_of_module][type_of_module];
124+ const auto num_tof_bins = tof_bin_edges.NumberOfBins ();
125+ std::cout << " Number of TOF bins: " << num_tof_bins << std::endl;
126+ std::cout << " TOF bin edges: " << tof_bin_edges.edges << std::endl;
127+ const auto & event_energy_bin_edges = scanner.event_energy_bin_edges [type_of_module];
128+ const auto num_event_energy_bins = event_energy_bin_edges.NumberOfBins ();
129+ std::cout << " Number of energy bins: " << num_event_energy_bins << std::endl;
130+ std::cout << " Event energy bin edges: " << event_energy_bin_edges.edges << std::endl;
131+ const auto energy_mid_points
132+ = (xt::view (event_energy_bin_edges.edges , xt::range (0 , event_energy_bin_edges.edges .size () - 1 ))
133+ + xt::view (event_energy_bin_edges.edges , xt::range (1 , event_energy_bin_edges.edges .size ())))
134+ / 2 ;
135+ std::cout << " Event energy mid points: " << energy_mid_points << std::endl;
136+ all_energy_mid_points.push_back (energy_mid_points);
137+
138+ std::cout << " Singles Histogram Level: " ;
139+ switch (scanner.singles_histogram_level )
140+ {
141+ case petsird::SinglesHistogramLevelType::kNone :
142+ std::cout << " none\n " ;
143+ break ;
144+ case petsird::SinglesHistogramLevelType::kModule :
145+ std::cout << " module\n " ;
146+ break ;
147+ case petsird::SinglesHistogramLevelType::kAll :
148+ std::cout << " all\n " ;
149+ break ;
150+ }
151+ if (scanner.singles_histogram_level != petsird::SinglesHistogramLevelType::kNone )
152+ {
153+ const auto & singles_histogram_energy_bin_edges = scanner.singles_histogram_energy_bin_edges [type_of_module];
154+ std::cout << " Singles Histogram Energy Bin Edges: " << singles_histogram_energy_bin_edges.edges << std::endl;
155+ std::cout << " Number of Singles Histogram Energy Windows: " << singles_histogram_energy_bin_edges.NumberOfBins ()
156+ << std::endl;
157+ }
158+ } // loop over type_of_module
159+
160+ std::cout << " ------------------------- " << std::endl;
155161
156- // Process events in batches of up to 100
162+ // Now read events and print some things
163+ petsird::TimeBlock time_block;
157164 float energy_1 = 0 , energy_2 = 0 ;
158165 std::size_t num_prompts = 0 ;
159166 std::size_t num_delayeds = 0 ;
@@ -170,9 +177,11 @@ main(int argc, char const* argv[])
170177
171178 for (unsigned mtype0 = 0 ; mtype0 < num_module_types; ++mtype0)
172179 {
180+ const auto & energy_mid_points0 = all_energy_mid_points[mtype0];
173181 for (unsigned mtype1 = 0 ; mtype1 < num_module_types; ++mtype1)
174182 {
175183 const petsird::TypeOfModulePair mtype_pair{ mtype0, mtype1 };
184+ const auto & energy_mid_points1 = all_energy_mid_points[mtype1];
176185
177186 // This code would need work to be able to handle a list-mode file without prompts
178187 const auto & prompt_events = event_time_block.prompt_events [mtype0][mtype1];
@@ -198,8 +207,8 @@ main(int argc, char const* argv[])
198207 = petsird_helpers::expand_detection_bin (scanner, mtype1, event.detection_bins [1 ]);
199208
200209 // accumulate energies to print average below
201- energy_1 += energy_mid_points [expanded_det_bin0.energy_index ];
202- energy_2 += energy_mid_points [expanded_det_bin1.energy_index ];
210+ energy_1 += energy_mid_points0 [expanded_det_bin0.energy_index ];
211+ energy_2 += energy_mid_points1 [expanded_det_bin1.energy_index ];
203212
204213 if (print_events)
205214 {
0 commit comments