GGEMS  1.1
GPU GEant4-based Monte Carlo Simulations
GGEMSCTSystem.cc
Go to the documentation of this file.
1 // ************************************************************************
2 // * This file is part of GGEMS. *
3 // * *
4 // * GGEMS is free software: you can redistribute it and/or modify *
5 // * it under the terms of the GNU General Public License as published by *
6 // * the Free Software Foundation, either version 3 of the License, or *
7 // * (at your option) any later version. *
8 // * *
9 // * GGEMS is distributed in the hope that it will be useful, *
10 // * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 // * GNU General Public License for more details. *
13 // * *
14 // * You should have received a copy of the GNU General Public License *
15 // * along with GGEMS. If not, see <https://www.gnu.org/licenses/>. *
16 // * *
17 // ************************************************************************
18 
33 
37 
38 GGEMSCTSystem::GGEMSCTSystem(std::string const& ct_system_name)
39 : GGEMSSystem(ct_system_name),
40  ct_system_type_(""),
41  source_isocenter_distance_(0.0f),
42  source_detector_distance_(0.0f)
43 {
44  GGcout("GGEMSCTSystem", "GGEMSCTSystem", 3) << "GGEMSCTSystem creating..." << GGendl;
45 
46  GGcout("GGEMSCTSystem", "GGEMSCTSystem", 3) << "GGEMSCTSystem created!!!" << GGendl;
47 }
48 
52 
54 {
55  GGcout("GGEMSCTSystem", "~GGEMSCTSystem", 3) << "GGEMSCTSystem erasing..." << GGendl;
56 
57  GGcout("GGEMSCTSystem", "~GGEMSCTSystem", 3) << "GGEMSCTSystem erased!!!" << GGendl;
58 }
59 
63 
64 void GGEMSCTSystem::SetCTSystemType(std::string const& ct_system_type)
65 {
66  ct_system_type_ = ct_system_type;
67 
68  // Transform string to low letter
69  std::transform(ct_system_type_.begin(), ct_system_type_.end(), ct_system_type_.begin(), ::tolower);
70 
71  // Checking the CT type
72  if (ct_system_type_ != "curved" && ct_system_type_ != "flat") {
73  std::ostringstream oss(std::ostringstream::out);
74  oss << "Available CT system types: 'curved' or 'flat'";
75  GGEMSMisc::ThrowException("GGEMSCTSystem", "SetCTSystemType", oss.str());
76  }
77 }
78 
82 
83 void GGEMSCTSystem::SetSourceIsocenterDistance(GGfloat const& source_isocenter_distance, std::string const& unit)
84 {
85  source_isocenter_distance_ = DistanceUnit(source_isocenter_distance, unit);
86 }
87 
91 
92 void GGEMSCTSystem::SetSourceDetectorDistance(GGfloat const& source_detector_distance, std::string const& unit)
93 {
94  source_detector_distance_ = DistanceUnit(source_detector_distance, unit);
95 }
96 
100 
102 {
103  GGcout("GGEMSCTSystem", "CheckParameters", 3) << "Checking the mandatory parameters..." << GGendl;
104 
105  if (ct_system_type_ != "curved" && ct_system_type_ != "flat") {
106  std::ostringstream oss(std::ostringstream::out);
107  oss << "Available CT system types: 'curved' or 'flat'";
108  GGEMSMisc::ThrowException("GGEMSCTSystem", "CheckParameters", oss.str());
109  }
110 
111  if (source_isocenter_distance_ == 0.0f) {
112  std::ostringstream oss(std::ostringstream::out);
113  oss << "For CT system, source isocenter distance (SID) has to be > 0.0 mm!!!";
114  GGEMSMisc::ThrowException("GGEMSCTSystem", "CheckParameters", oss.str());
115  }
116 
117  if (source_detector_distance_ == 0.0f) {
118  std::ostringstream oss(std::ostringstream::out);
119  oss << "For CT system, source detector distance (SDD) has to be > 0.0 mm!!!";
120  GGEMSMisc::ThrowException("GGEMSCTSystem", "CheckParameters", oss.str());
121  }
122 
123  // Call parent parameters
125 }
126 
130 
132 {
133  // Computing the angle 'alpha' between x-ray source and Y borders of a module
134  // Using Pythagore algorithm in a regular polygone
135  // rho = Hypotenuse
136  // h = Apothem or source detector distance in our case
137  // c = Half-distance of module in Y
140  GGfloat alpha = 2.0f*std::asin(c/rho);
141 
142  // Center of rotation O (ox, oy) is the source
144  GGfloat oy = 0.0f;
145 
146  // Center of module P (px, py) is source detector distance minus source isocenter distance plus half size of module in Z (module referential)
148  GGfloat py = 0.0f;
149 
150  // Loop over each module in X and Y, and compute angle of each module in around Z
151  for (GGsize j = 0; j < number_of_modules_xy_.y_; ++j) { // for Y modules
152  GGfloat step_angle = alpha * (static_cast<GGfloat>(j) + 0.5f*(1.0f-static_cast<GGfloat>(number_of_modules_xy_.y_)));
153 
154  // Computing the X and Y positions in global position (isocenter)
155  GGfloat global_position_x = (px-ox)*std::cos(step_angle) - (py-oy)*std::sin(step_angle) + ox;
156  GGfloat global_position_y = (px-ox)*std::sin(step_angle) + (py-oy)*std::cos(step_angle) + oy;
157 
158  for (GGsize i = 0; i < number_of_modules_xy_.x_; ++i) { // for X modules
159  // Computing the Z position in global position (isocenter)
160  GGfloat global_position_z = static_cast<GGfloat>(number_of_detection_elements_inside_module_xyz_.x_)*size_of_detection_elements_xyz_.x*(static_cast<GGfloat>(i)+0.5f*(1.0f-static_cast<GGfloat>(number_of_modules_xy_.x_)));
161 
162  GGsize global_index = i+j*number_of_modules_xy_.x_;
163 
164  GGfloat3 rotation;
165  rotation.x = 0.0f; rotation.y = 0.0f; rotation.z = step_angle;
166  solids_[global_index]->SetRotation(rotation);
167 
168  GGfloat3 position;
169  position.x = global_position_x; position.y = global_position_y; position.z = global_position_z;
170  solids_[global_index]->SetPosition(position);
171  }
172  }
173 }
174 
178 
180 {
181  // Computing the X, Y and Z positions in global position (isocenter)
183  GGfloat global_position_y = 0.0f;
184  GGfloat global_position_z = 0.0f;
185 
186  // Consider flat geometry for CBCT configuration
187  for (GGsize j = 0; j < number_of_modules_xy_.y_; ++j) { // Y modules
188  global_position_y = static_cast<GGfloat>(number_of_detection_elements_inside_module_xyz_.y_)*size_of_detection_elements_xyz_.y*(static_cast<GGfloat>(j)+0.5f*(1.0f-static_cast<GGfloat>(number_of_modules_xy_.y_)));
189  for (GGsize i = 0; i < number_of_modules_xy_.x_; ++i) { // X modules
190  global_position_z = static_cast<GGfloat>(number_of_detection_elements_inside_module_xyz_.x_)*size_of_detection_elements_xyz_.x*(static_cast<GGfloat>(i)+0.5f*(1.0f-static_cast<GGfloat>(number_of_modules_xy_.x_)));
191 
192  GGsize global_index = i+j*number_of_modules_xy_.x_;
193 
194  // No rotation of module
195  GGfloat3 rotation;
196  rotation.x = 0.0f; rotation.y = 0.0f; rotation.z = 0.0f;
197  solids_[global_index]->SetRotation(rotation);
198 
199  GGfloat3 position;
200  position.x = global_position_x; position.y = global_position_y; position.z = global_position_z;
201  solids_[global_index]->SetPosition(position);
202  }
203  }
204 }
205 
209 
211 {
212  GGcout("GGEMSCTSystem", "Initialize", 3) << "Initializing a GGEMS CT system..." << GGendl;
213 
214  // Checking the parameters
215  CheckParameters();
216 
217  // Build CT system depending on input parameters
218  // Getting the current number of registered solid
220  GGsize number_of_registered_solids = navigator_manager.GetNumberOfRegisteredSolids();
221 
222  // Creating all solids, solid box for CT
224 
225  // Allocation of memory for solid
227 
228  for (GGsize i = 0; i < number_of_solids_; ++i) { // In CT system only "HISTOGRAM"
229  solids_[i] = new GGEMSSolidBox(
236  "HISTOGRAM"
237  );
238 
239  // Enabling scatter if necessary
240  if (is_scatter_) solids_[i]->EnableScatter();
241 
242  // Enabling tracking if necessary
244 
245  // // Initialize kernels
246  solids_[i]->Initialize(nullptr);
247  }
248 
249  // Initialize of the geometry depending on type of CT system
250  if (ct_system_type_ == "curved") {
252  }
253  else if (ct_system_type_ == "flat") {
255  }
256 
257  // Performing a global rotation when source and system rotate
258  if (is_update_rot_) {
259  for (GGsize i = 0; i < number_of_solids_; ++i) {
261  }
262  }
263 
264  // Get the final transformation matrix
265  for (GGsize j = 0; j < number_activated_devices_; ++j) {
266  for (GGsize i = 0; i < number_of_solids_; ++i) {
267  // Set solid id
268  solids_[i]->SetSolidID<GGEMSSolidBoxData>(number_of_registered_solids+i, j);
270  }
271  }
272 
273  // Initialize parent class
275 }
276 
280 
281 GGEMSCTSystem* create_ggems_ct_system(char const* ct_system_name)
282 {
283  return new(std::nothrow) GGEMSCTSystem(ct_system_name);
284 }
285 
289 
290 void set_number_of_modules_ggems_ct_system(GGEMSCTSystem* ct_system, GGsize const module_x, GGsize const module_y)
291 {
292  ct_system->SetNumberOfModules(module_x, module_y);
293 }
294 
298 
299 void set_ct_system_type_ggems_ct_system(GGEMSCTSystem* ct_system, char const* ct_system_type)
300 {
301  ct_system->SetCTSystemType(ct_system_type);
302 }
303 
307 
308 void set_number_of_detection_elements_ggems_ct_system(GGEMSCTSystem* ct_system, GGsize const n_detection_element_x, GGsize const n_detection_element_y, GGsize const n_detection_element_z)
309 {
310  ct_system->SetNumberOfDetectionElementsInsideModule(n_detection_element_x, n_detection_element_y, n_detection_element_z);
311 }
312 
316 
317 void set_size_of_detection_elements_ggems_ct_system(GGEMSCTSystem* ct_system, GGfloat const size_of_detection_element_x, GGfloat const size_of_detection_element_y, GGfloat const size_of_detection_element_z, char const* unit)
318 {
319  ct_system->SetSizeOfDetectionElements(size_of_detection_element_x, size_of_detection_element_y, size_of_detection_element_z, unit);
320 }
321 
325 
326 void set_material_name_ggems_ct_system(GGEMSCTSystem* ct_system, char const* material_name)
327 {
328  ct_system->SetMaterialName(material_name);
329 }
330 
334 
335 void set_source_isocenter_distance_ggems_ct_system(GGEMSCTSystem* ct_system, GGfloat const source_isocenter_distance, char const* unit)
336 {
337  ct_system->SetSourceIsocenterDistance(source_isocenter_distance, unit);
338 }
339 
343 
344 void set_source_detector_distance_ggems_ct_system(GGEMSCTSystem* ct_system, GGfloat const source_detector_distance, char const* unit)
345 {
346  ct_system->SetSourceDetectorDistance(source_detector_distance, unit);
347 }
348 
352 
353 void set_rotation_ggems_ct_system(GGEMSCTSystem* ct_system, GGfloat const rx, GGfloat const ry, GGfloat const rz, char const* unit)
354 {
355  ct_system->SetRotation(rx, ry, rz, unit);
356 }
357 
361 
362 void set_save_ggems_ct_system(GGEMSCTSystem* ct_system, char const* basename)
363 {
364  ct_system->StoreOutput(basename);
365 }
366 
370 
371 void set_threshold_ggems_ct_system(GGEMSCTSystem* ct_system, GGfloat const threshold, char const* unit)
372 {
373  ct_system->SetThreshold(threshold, unit);
374 }
375 
379 
380 void store_scatter_ggems_ct_system(GGEMSCTSystem* ct_system, bool const is_scatter)
381 {
382  ct_system->StoreScatter(is_scatter);
383 }
GGEMSNavigatorManager::GetNumberOfRegisteredSolids
GGsize GetNumberOfRegisteredSolids(void) const
get the number of current registered solid
Definition: GGEMSNavigatorManager.hh:158
GGEMSNavigator::Initialize
virtual void Initialize(void)
Definition: GGEMSNavigator.cc:198
GGEMSCTSystem.hh
Child GGEMS class managing CT/CBCT detector in GGEMS.
set_rotation_ggems_ct_system
void set_rotation_ggems_ct_system(GGEMSCTSystem *ct_system, GGfloat const rx, GGfloat const ry, GGfloat const rz, char const *unit)
Set the rotation of the voxelized phantom around local axis.
Definition: GGEMSCTSystem.cc:353
GGEMSCTSystem::SetCTSystemType
void SetCTSystemType(std::string const &ct_system_type)
type of CT system: flat or curved
Definition: GGEMSCTSystem.cc:64
GGEMSNavigator::solids_
GGEMSSolid ** solids_
Definition: GGEMSNavigator.hh:255
GGEMSSystem::SetNumberOfModules
void SetNumberOfModules(GGsize const &n_module_x, GGsize const &n_module_y)
set the number of module in X, Y of local axis of detector
Definition: GGEMSSystem.cc:74
GGEMSSystem::is_scatter_
bool is_scatter_
Definition: GGEMSSystem.hh:153
GGEMSCTSystem::CheckParameters
void CheckParameters(void) const override
Definition: GGEMSCTSystem.cc:101
GGEMSSolid::EnableScatter
virtual void EnableScatter(void)=0
Activate scatter registration.
GGsize2_t::x_
GGsize x_
Definition: GGEMSTypes.hh:259
set_threshold_ggems_ct_system
void set_threshold_ggems_ct_system(GGEMSCTSystem *ct_system, GGfloat const threshold, char const *unit)
Set the threshold applyied to navigator.
Definition: GGEMSCTSystem.cc:371
GGEMSSystem::StoreScatter
void StoreScatter(bool const &is_scatter)
set to true to activate scatter registration
Definition: GGEMSSystem.cc:115
GGsize2_t::y_
GGsize y_
Definition: GGEMSTypes.hh:260
set_source_isocenter_distance_ggems_ct_system
void set_source_isocenter_distance_ggems_ct_system(GGEMSCTSystem *ct_system, GGfloat const source_isocenter_distance, char const *unit)
set source isocenter distance (SID)
Definition: GGEMSCTSystem.cc:335
store_scatter_ggems_ct_system
void store_scatter_ggems_ct_system(GGEMSCTSystem *ct_system, bool const is_scatter)
Set scatter registration flag.
Definition: GGEMSCTSystem.cc:380
GGEMSSystem
Child GGEMS class managing detector system in GGEMS.
Definition: GGEMSSystem.hh:44
GGEMSSolid
GGEMS class for solid informations.
Definition: GGEMSSolid.hh:48
GGEMSSystem::number_of_detection_elements_inside_module_xyz_
GGsize3 number_of_detection_elements_inside_module_xyz_
Definition: GGEMSSystem.hh:151
GGEMSCTSystem::InitializeCurvedGeometry
void InitializeCurvedGeometry(void)
Initialize the curved CT geometry.
Definition: GGEMSCTSystem.cc:131
GGEMSSolidBox.hh
GGEMS class for solid box.
GGEMSCTSystem::ct_system_type_
std::string ct_system_type_
Definition: GGEMSCTSystem.hh:130
set_number_of_detection_elements_ggems_ct_system
void set_number_of_detection_elements_ggems_ct_system(GGEMSCTSystem *ct_system, GGsize const n_detection_element_x, GGsize const n_detection_element_y, GGsize const n_detection_element_z)
set the number of detection element inside a module
Definition: GGEMSCTSystem.cc:308
GGEMSSystem::SetNumberOfDetectionElementsInsideModule
void SetNumberOfDetectionElementsInsideModule(GGsize const &n_detection_element_x, GGsize const &n_detection_element_y, GGsize const &n_detection_element_z)
set the number of detection elements in X and Y and Z
Definition: GGEMSSystem.cc:84
GGEMSNavigator::SetThreshold
void SetThreshold(GGfloat const &threshold, std::string const &unit="keV")
Set the energy threshold to navigator.
Definition: GGEMSNavigator.cc:148
GGEMSNavigatorManager::GetInstance
static GGEMSNavigatorManager & GetInstance(void)
Create at first time the Singleton.
Definition: GGEMSNavigatorManager.hh:60
GGsize
#define GGsize
Definition: GGEMSTypes.hh:252
GGEMSSystem::CheckParameters
virtual void CheckParameters(void) const
Definition: GGEMSSystem.cc:124
set_number_of_modules_ggems_ct_system
void set_number_of_modules_ggems_ct_system(GGEMSCTSystem *ct_system, GGsize const module_x, GGsize const module_y)
set the number of module in X, Y of local axis of detector
Definition: GGEMSCTSystem.cc:290
GGEMSSolid::EnableTracking
void EnableTracking(void)
Enabling tracking infos during simulation.
Definition: GGEMSSolid.cc:125
GGEMSSolidBoxData_t
Structure storing the stack of data for solid box.
Definition: GGEMSSolidBoxData.hh:41
GGsize3_t::z_
GGsize z_
Definition: GGEMSTypes.hh:270
GGEMSNavigatorManager
GGEMS class handling the navigators (detector + phantom) in GGEMS.
Definition: GGEMSNavigatorManager.hh:42
GGEMSNavigator::number_activated_devices_
GGsize number_activated_devices_
Definition: GGEMSNavigator.hh:264
set_save_ggems_ct_system
void set_save_ggems_ct_system(GGEMSCTSystem *ct_system, char const *basename)
Set the output file and format.
Definition: GGEMSCTSystem.cc:362
GGEMSSolid::SetSolidID
void SetSolidID(GGsize const &solid_id, GGsize const &thread_index)
set the global solid index
Definition: GGEMSSolid.hh:239
GGEMSCTSystem::SetSourceDetectorDistance
void SetSourceDetectorDistance(GGfloat const &source_detector_distance, std::string const &unit="mm")
set the source detector distance
Definition: GGEMSCTSystem.cc:92
GGfloat3
#define GGfloat3
Definition: GGEMSTypes.hh:275
GGEMSCTSystem::Initialize
void Initialize(void) override
Initialize CT system.
Definition: GGEMSCTSystem.cc:210
GGEMSSolidBox
GGEMS class for solid box.
Definition: GGEMSSolidBox.hh:41
GGEMSNavigator::number_of_solids_
GGsize number_of_solids_
Definition: GGEMSNavigator.hh:256
GGEMSSolid::SetPosition
void SetPosition(GGfloat3 const &position_xyz)
set a position for solid
Definition: GGEMSSolid.cc:143
GGcout
GGEMSStream GGcout
Definition: GGEMSPrint.cc:34
GGEMSSolid::UpdateTransformationMatrix
virtual void UpdateTransformationMatrix(GGsize const &thread_index)=0
Update transformation matrix for solid object.
create_ggems_ct_system
GGEMSCTSystem * create_ggems_ct_system(char const *ct_system_name)
Get the GGEMSCTSystem pointer for python user.
Definition: GGEMSCTSystem.cc:281
GGEMSNavigator::is_tracking_
bool is_tracking_
Definition: GGEMSNavigator.hh:250
GGEMSSystem::SetMaterialName
void SetMaterialName(std::string const &material_name)
set the name of the material
Definition: GGEMSSystem.cc:106
GGEMSSystem::SetSizeOfDetectionElements
void SetSizeOfDetectionElements(GGfloat const &size_of_detection_element_x, GGfloat const &size_of_detection_element_y, GGfloat const &size_of_detection_element_z, std::string const &unit="mm")
set the detection elements in each direction
Definition: GGEMSSystem.cc:95
GGEMSCTSystem::SetSourceIsocenterDistance
void SetSourceIsocenterDistance(GGfloat const &source_isocenter_distance, std::string const &unit="mm")
set the source isocenter distance
Definition: GGEMSCTSystem.cc:83
GGEMSSolid::Initialize
virtual void Initialize(GGEMSMaterials *materials)=0
Initialize solid for geometric navigation.
GGEMSNavigator::SetRotation
void SetRotation(GGfloat const &rx, GGfloat const &ry, GGfloat const &rz, std::string const &unit="deg")
Set the rotation of the global navigator around global axis.
Definition: GGEMSNavigator.cc:136
GGEMSCTSystem::GGEMSCTSystem
GGEMSCTSystem(std::string const &ct_system_name)
GGEMSCTSystem constructor.
Definition: GGEMSCTSystem.cc:38
GGEMSCTSystem::~GGEMSCTSystem
~GGEMSCTSystem(void)
GGEMSCTSystem destructor.
Definition: GGEMSCTSystem.cc:53
GGsize3_t::x_
GGsize x_
Definition: GGEMSTypes.hh:268
GGendl
#define GGendl
overload C++ std::endl
Definition: GGEMSPrint.hh:60
GGEMSSolidBoxData.hh
Structure storing the data for solid box.
GGEMSNavigator::is_update_rot_
bool is_update_rot_
Definition: GGEMSNavigator.hh:248
GGEMSSystem::size_of_detection_elements_xyz_
GGfloat3 size_of_detection_elements_xyz_
Definition: GGEMSSystem.hh:152
set_ct_system_type_ggems_ct_system
void set_ct_system_type_ggems_ct_system(GGEMSCTSystem *ct_system, char const *ct_system_type)
set the type of CT system
Definition: GGEMSCTSystem.cc:299
GGEMSCTSystem::InitializeFlatGeometry
void InitializeFlatGeometry(void)
Initialize the flat CT geometry.
Definition: GGEMSCTSystem.cc:179
GGEMSCTSystem
Child GGEMS class managing CT/CBCT detector in GGEMS.
Definition: GGEMSCTSystem.hh:40
GGEMSCTSystem::source_detector_distance_
GGfloat source_detector_distance_
Definition: GGEMSCTSystem.hh:132
set_source_detector_distance_ggems_ct_system
void set_source_detector_distance_ggems_ct_system(GGEMSCTSystem *ct_system, GGfloat const source_detector_distance, char const *unit)
set source detector distance (SDD)
Definition: GGEMSCTSystem.cc:344
GGEMSNavigator::rotation_xyz_
GGfloat3 rotation_xyz_
Definition: GGEMSNavigator.hh:245
GGEMSSolid::SetRotation
void SetRotation(GGfloat3 const &rotation_xyz)
set a rotation for solid
Definition: GGEMSSolid.hh:108
set_material_name_ggems_ct_system
void set_material_name_ggems_ct_system(GGEMSCTSystem *ct_system, char const *material_name)
set the material name for detection element
Definition: GGEMSCTSystem.cc:326
GGEMSNavigator::StoreOutput
void StoreOutput(std::string basename)
Storing the basename and format of the output file.
Definition: GGEMSNavigator.cc:216
GGEMSMisc::ThrowException
void ThrowException(std::string const &class_name, std::string const &method_name, std::string const &message)
Throw a C++ exception.
Definition: GGEMSTools.cc:61
GGEMSSystem::number_of_modules_xy_
GGsize2 number_of_modules_xy_
Definition: GGEMSSystem.hh:150
DistanceUnit
T DistanceUnit(T const &value, std::string const &unit)
Choose best distance unit.
Definition: GGEMSSystemOfUnits.hh:243
GGfloat
#define GGfloat
Definition: GGEMSTypes.hh:273
GGsize3_t::y_
GGsize y_
Definition: GGEMSTypes.hh:269
GGEMSCTSystem::source_isocenter_distance_
GGfloat source_isocenter_distance_
Definition: GGEMSCTSystem.hh:131
set_size_of_detection_elements_ggems_ct_system
void set_size_of_detection_elements_ggems_ct_system(GGEMSCTSystem *ct_system, GGfloat const size_of_detection_element_x, GGfloat const size_of_detection_element_y, GGfloat const size_of_detection_element_z, char const *unit)
set the size of detection element in X, Y, Z
Definition: GGEMSCTSystem.cc:317