GGEMS  1.1
GPU GEant4-based Monte Carlo Simulations
GGEMSDosimetryCalculator.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 
35 
39 
41 : dosimetry_output_filename_("dosi"),
42  navigator_(nullptr),
43  is_photon_tracking_(false),
44  is_edep_(false),
45  is_hit_tracking_(false),
46  is_edep_squared_(false),
47  is_uncertainty_(false),
48  scale_factor_(1.0f),
49  is_water_reference_(FALSE),
50  minimum_density_(0.0f),
51  kernel_compute_dose_(nullptr)
52 {
53  GGcout("GGEMSDosimetryCalculator", "GGEMSDosimetryCalculator", 3) << "GGEMSDosimetryCalculator creating..." << GGendl;
54 
55  dosel_sizes_.x = -1.0f;
56  dosel_sizes_.y = -1.0f;
57  dosel_sizes_.z = -1.0f;
58 
60  // Get the number of activated device
62 
63  // Checking double precision computation
64  #ifdef DOSIMETRY_DOUBLE_PRECISION
65  // Get device index
66  for (GGsize i = 0; i < number_activated_devices_; ++i) {
67  GGsize device_index = opencl_manager.GetIndexOfActivatedDevice(i);
68  if (!opencl_manager.IsDoublePrecisionAtomicAddition(device_index)) {
69  std::ostringstream oss(std::ostringstream::out);
70  oss << "Your OpenCL device: " << opencl_manager.GetDeviceName(device_index) << ", does not support double precision for atomic operation!!!" << std::endl;
71  oss << "Please, recompile with DOSIMETRY_DOUBLE_PRECISION to OFF. Precision will be lost only for dosimetry application" << std::endl;
72  GGEMSMisc::ThrowException("GGEMSDosimetryCalculator", "GGEMSDosimetryCalculator", oss.str());
73  }
74  }
75  #endif
76 
77  // Allocating buffer on each OpenCL device for dose params
78  dose_params_ = new cl::Buffer*[number_activated_devices_];
85 
86  GGcout("GGEMSDosimetryCalculator", "GGEMSDosimetryCalculator", 3) << "GGEMSDosimetryCalculator created!!!" << GGendl;
87 }
88 
92 
94 {
95  GGcout("GGEMSDosimetryCalculator", "~GGEMSDosimetryCalculator", 3) << "GGEMSSourceManager erasing..." << GGendl;
96 
98 
99  if (dose_params_) {
100  for (GGsize i = 0; i < number_activated_devices_; ++i) {
101  opencl_manager.Deallocate(dose_params_[i], sizeof(GGEMSDoseParams ), i);
102  }
103  delete[] dose_params_;
104  dose_params_ = nullptr;
105  }
106 
107  if (dose_recording_.edep_) {
108  for (GGsize i = 0; i < number_activated_devices_; ++i) {
109  opencl_manager.Deallocate(dose_recording_.edep_[i], total_number_of_dosels_*sizeof(GGDosiType), i);
110  }
111  delete[] dose_recording_.edep_;
112  dose_recording_.edep_ = nullptr;
113  }
114 
115  if (dose_recording_.dose_) {
116  for (GGsize i = 0; i < number_activated_devices_; ++i) {
117  opencl_manager.Deallocate(dose_recording_.dose_[i], total_number_of_dosels_*sizeof(GGfloat), i);
118  }
119  delete[] dose_recording_.dose_;
120  dose_recording_.dose_ = nullptr;
121  }
122 
124  if (is_uncertainty_) {
125  for (GGsize i = 0; i < number_activated_devices_; ++i) {
127  }
128  }
131  }
132 
135  for (GGsize i = 0; i < number_activated_devices_; ++i) {
137  }
138  }
140  dose_recording_.edep_squared_ = nullptr;
141  }
142 
143  if (dose_recording_.hit_) {
145  for (GGsize i = 0; i < number_activated_devices_; ++i) {
146  opencl_manager.Deallocate(dose_recording_.hit_[i], total_number_of_dosels_*sizeof(GGint), i);
147  }
148  }
149  delete[] dose_recording_.hit_;
150  dose_recording_.hit_ = nullptr;
151  }
152 
154  if (is_photon_tracking_) {
155  for (GGsize i = 0; i < number_activated_devices_; ++i) {
157  }
158  }
161  }
162 
163  if (kernel_compute_dose_) {
164  delete[] kernel_compute_dose_;
165  kernel_compute_dose_ = nullptr;
166  }
167 
168  GGcout("GGEMSDosimetryCalculator", "~GGEMSDosimetryCalculator", 3) << "GGEMSSourceManager erased!!!" << GGendl;
169 }
170 
174 
175 void GGEMSDosimetryCalculator::AttachToNavigator(std::string const& navigator_name)
176 {
178  navigator_ = navigator_manager.GetNavigator(navigator_name);
179 
180  // Activate dosimetry mode in navigator
182 }
183 
187 
188 void GGEMSDosimetryCalculator::SetDoselSizes(GGfloat const& dosel_x, GGfloat const& dosel_y, GGfloat const& dosel_z, std::string const& unit)
189 {
190  dosel_sizes_.x = DistanceUnit(dosel_x, unit);
191  dosel_sizes_.y = DistanceUnit(dosel_y, unit);
192  dosel_sizes_.z = DistanceUnit(dosel_z, unit);
193 }
194 
198 
199 void GGEMSDosimetryCalculator::SetOutputDosimetryBasename(std::string const& output_filename)
200 {
201  dosimetry_output_filename_ = output_filename;
202 }
203 
207 
209 {
210  scale_factor_ = scale_factor;
211 }
212 
216 
217 void GGEMSDosimetryCalculator::SetPhotonTracking(bool const& is_activated)
218 {
219  is_photon_tracking_ = is_activated;
220 }
221 
225 
226 void GGEMSDosimetryCalculator::SetEdep(bool const& is_activated)
227 {
228  is_edep_ = is_activated;
229 }
230 
234 
235 void GGEMSDosimetryCalculator::SetHitTracking(bool const& is_activated)
236 {
237  is_hit_tracking_ = is_activated;
238 }
239 
243 
244 void GGEMSDosimetryCalculator::SetEdepSquared(bool const& is_activated)
245 {
246  is_edep_squared_ = is_activated;
247 }
248 
252 
253 void GGEMSDosimetryCalculator::SetUncertainty(bool const& is_activated)
254 {
255  is_uncertainty_ = is_activated;
256 }
257 
261 
262 void GGEMSDosimetryCalculator::SetWaterReference(bool const& is_activated)
263 {
264  if (is_activated) is_water_reference_ = TRUE;
265  else is_water_reference_ = FALSE;
266 }
267 
271 
272 void GGEMSDosimetryCalculator::SetMinimumDensity(float const& minimum_density, std::string const& unit)
273 {
274  minimum_density_ = DensityUnit(minimum_density, unit);
275 }
276 
280 
282 {
283  if (!navigator_) {
284  std::ostringstream oss(std::ostringstream::out);
285  oss << "A navigator has to be associated to GGEMSDosimetryCalculator!!!";
286  GGEMSMisc::ThrowException("GGEMSDosimetryCalculator", "CheckParameters", oss.str());
287  }
288 }
289 
293 
295 {
296  GGcout("GGEMSDosimetryCalculator", "InitializeKernel", 3) << "Initializing kernel for dose computation..." << GGendl;
297 
298  // Getting OpenCL manager
300 
301  // Getting the path to kernel
302  std::string openCL_kernel_path = OPENCL_KERNEL_PATH;
303  std::string compute_dose_filename = openCL_kernel_path + "/ComputeDoseGGEMSVoxelizedSolid.cl";
304 
305  // Storing a kernel for each device
307 
308  // Compiling the kernels
309  opencl_manager.CompileKernel(compute_dose_filename, "compute_dose_ggems_voxelized_solid", kernel_compute_dose_, nullptr, nullptr);
310 }
311 
315 
317 {
318  // Getting the OpenCL manager and infos for work-item launching
320  cl::CommandQueue* queue = opencl_manager.GetCommandQueue(thread_index);
321  cl::Event* event = opencl_manager.GetEvent(thread_index);
322 
323  // Get Device name and storing methode name + device
324  GGsize device_index = opencl_manager.GetIndexOfActivatedDevice(thread_index);
325  std::string device_name = opencl_manager.GetDeviceName(device_index);
326  std::ostringstream oss(std::ostringstream::out);
327  oss << "GGEMSDosimetryCalculator::ComputeDose in " << device_name << ", index " << device_index;
328 
329  // Get pointer on OpenCL device for dose parameters
330  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[thread_index], sizeof(GGEMSDoseParams), thread_index);
331 
332  GGsize number_of_dosels = static_cast<GGsize>(dose_params_device->total_number_of_dosels_);
333 
334  // Release the pointer
335  opencl_manager.ReleaseDeviceBuffer(dose_params_[thread_index], dose_params_device, thread_index);
336 
337  // Getting work group size, and work-item number
338  GGsize work_group_size = opencl_manager.GetWorkGroupSize();
339  GGsize number_of_work_items = opencl_manager.GetBestWorkItem(number_of_dosels);
340 
341  // Parameters for work-item in kernel
342  cl::NDRange global_wi(number_of_work_items);
343  cl::NDRange local_wi(work_group_size);
344 
345  // Getting kernel, and setting parameters
346  kernel_compute_dose_[thread_index]->setArg(0, number_of_dosels);
347  kernel_compute_dose_[thread_index]->setArg(1, *dose_params_[thread_index]);
348  kernel_compute_dose_[thread_index]->setArg(2, *dose_recording_.edep_[thread_index]);
349  kernel_compute_dose_[thread_index]->setArg(3, *dose_recording_.hit_[thread_index]);
350  kernel_compute_dose_[thread_index]->setArg(4, *dose_recording_.edep_squared_[thread_index]);
351  kernel_compute_dose_[thread_index]->setArg(5, *navigator_->GetSolids(0)->GetSolidData(thread_index)); // 1 solid in voxelized phantom
352  kernel_compute_dose_[thread_index]->setArg(6, *navigator_->GetSolids(0)->GetLabelData(thread_index));
353  kernel_compute_dose_[thread_index]->setArg(7, *navigator_->GetMaterials()->GetMaterialTables(thread_index));
354  kernel_compute_dose_[thread_index]->setArg(8, *dose_recording_.dose_[thread_index]);
355  kernel_compute_dose_[thread_index]->setArg(9, *dose_recording_.uncertainty_dose_[thread_index]);
356  kernel_compute_dose_[thread_index]->setArg(10, scale_factor_);
357  kernel_compute_dose_[thread_index]->setArg(11, is_water_reference_);
358  kernel_compute_dose_[thread_index]->setArg(12, minimum_density_);
359 
360  // Launching kernel
361  GGint kernel_status = queue->enqueueNDRangeKernel(*kernel_compute_dose_[thread_index], 0, global_wi, local_wi, nullptr, event);
362  opencl_manager.CheckOpenCLError(kernel_status, "GGEMSDosimetryCalculator", "ComputeDose");
363  queue->finish();
364 
365  // GGEMS Profiling
367  profiler_manager.HandleEvent(*event, oss.str());
368 }
369 
373 
375 {
376  GGcout("GGEMSDosimetryCalculator", "Initialize", 3) << "Initializing dosimetry calculator..." << GGendl;
377 
378  CheckParameters();
379 
380  // Get the OpenCL manager
382 
383  // Allocating dosimetry parameters on each device
384  for (GGsize j = 0; j < number_activated_devices_; ++j) {
385  // Allocate dosemetry params on OpenCL device
386  dose_params_[j] = opencl_manager.Allocate(nullptr, sizeof(GGEMSDoseParams), j, CL_MEM_READ_WRITE, "GGEMSDosimetryCalculator");
387 
388  // Get pointer on OpenCL device for dose parameters
389  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[j], sizeof(GGEMSDoseParams), j);
390 
391  // Get the voxels size
392  GGfloat3 voxel_sizes = dosel_sizes_;
393  if (dosel_sizes_.x < 0.0f && dosel_sizes_.y < 0.0f && dosel_sizes_.z < 0.0f) { // Custom dosel size
394  voxel_sizes = dynamic_cast<GGEMSVoxelizedSolid*>(navigator_->GetSolids(0))->GetVoxelSizes(j);
395  }
396 
397  // If photon tracking activated, voxel sizes of phantom and dosels size should be the same, otherwise artefacts!!!
398  if (is_photon_tracking_) {
399  if (voxel_sizes.x != dynamic_cast<GGEMSVoxelizedSolid*>(navigator_->GetSolids(0))->GetVoxelSizes(j).x ||
400  voxel_sizes.y != dynamic_cast<GGEMSVoxelizedSolid*>(navigator_->GetSolids(0))->GetVoxelSizes(j).y ||
401  voxel_sizes.z != dynamic_cast<GGEMSVoxelizedSolid*>(navigator_->GetSolids(0))->GetVoxelSizes(j).z) {
402  std::ostringstream oss(std::ostringstream::out);
403  oss << "Dosel size and voxel size in voxelized phantom have to be the same when photon tracking is activated!!!";
404  GGEMSMisc::ThrowException("GGEMSDosimetryCalculator", "Initialize", oss.str());
405  }
406  }
407 
408  // Storing voxel size
409  dose_params_device->size_of_dosels_ = voxel_sizes;
410 
411  // Take inverse of size
412  dose_params_device->inv_size_of_dosels_.x = 1.0f / voxel_sizes.x;
413  dose_params_device->inv_size_of_dosels_.y = 1.0f / voxel_sizes.y;
414  dose_params_device->inv_size_of_dosels_.z = 1.0f / voxel_sizes.z;
415 
416  // Get border of volumes from phantom
417  GGEMSOBB obb_geometry = dynamic_cast<GGEMSVoxelizedSolid*>(navigator_->GetSolids(0))->GetOBBGeometry(j);
418  dose_params_device->border_min_xyz_ = obb_geometry.border_min_xyz_;
419  dose_params_device->border_max_xyz_ = obb_geometry.border_max_xyz_;
420 
421  // Get the size of the dose map
422  GGfloat3 dosemap_size;
423  for (GGsize i = 0; i < 3; ++i) {
424  dosemap_size.s[i] = obb_geometry.border_max_xyz_.s[i] - obb_geometry.border_min_xyz_.s[i];
425  }
426 
427  // Get the number of voxels
428  GGsize3 number_of_dosels;
429  number_of_dosels.x_ = static_cast<GGsize>(dosemap_size.x / voxel_sizes.x);
430  number_of_dosels.y_ = static_cast<GGsize>(dosemap_size.y / voxel_sizes.y);
431  number_of_dosels.z_ = static_cast<GGsize>(dosemap_size.z / voxel_sizes.z);
432 
433  dose_params_device->number_of_dosels_.x = static_cast<GGint>(number_of_dosels.x_);
434  dose_params_device->number_of_dosels_.y = static_cast<GGint>(number_of_dosels.y_);
435  dose_params_device->number_of_dosels_.z = static_cast<GGint>(number_of_dosels.z_);
436 
437  dose_params_device->slice_number_of_dosels_ = static_cast<GGint>(number_of_dosels.x_ * number_of_dosels.y_);
438  total_number_of_dosels_ = number_of_dosels.x_ * number_of_dosels.y_ * number_of_dosels.z_;
439  dose_params_device->total_number_of_dosels_ = static_cast<GGint>(total_number_of_dosels_);
440 
441  // Release the pointer
442  opencl_manager.ReleaseDeviceBuffer(dose_params_[j], dose_params_device, j);
443 
444  // Allocated buffers storing dose on OpenCL device
445  dose_recording_.edep_[j] = opencl_manager.Allocate(nullptr, total_number_of_dosels_*sizeof(GGDosiType), j, CL_MEM_READ_WRITE, "GGEMSDosimetryCalculator");
446  dose_recording_.dose_[j] = opencl_manager.Allocate(nullptr, total_number_of_dosels_*sizeof(GGfloat), j, CL_MEM_READ_WRITE, "GGEMSDosimetryCalculator");
447 
448  dose_recording_.uncertainty_dose_[j] = is_uncertainty_ ? opencl_manager.Allocate(nullptr, total_number_of_dosels_*sizeof(GGfloat), j, CL_MEM_READ_WRITE, "GGEMSDosimetryCalculator") : nullptr;
449  dose_recording_.edep_squared_[j] = (is_edep_squared_||is_uncertainty_) ? opencl_manager.Allocate(nullptr, total_number_of_dosels_*sizeof(GGDosiType), j, CL_MEM_READ_WRITE, "GGEMSDosimetryCalculator") : nullptr;
450  dose_recording_.hit_[j] = (is_hit_tracking_||is_uncertainty_) ? opencl_manager.Allocate(nullptr, total_number_of_dosels_*sizeof(GGint), j, CL_MEM_READ_WRITE, "GGEMSDosimetryCalculator") : nullptr;
451 
452  dose_recording_.photon_tracking_[j] = is_photon_tracking_ ? opencl_manager.Allocate(nullptr, total_number_of_dosels_*sizeof(GGint), j, CL_MEM_READ_WRITE, "GGEMSDosimetryCalculator") : nullptr;
453 
454  // Set buffer to zero
455  opencl_manager.CleanBuffer(dose_recording_.edep_[j], total_number_of_dosels_*sizeof(GGDosiType), j);
456  opencl_manager.CleanBuffer(dose_recording_.dose_[j], total_number_of_dosels_*sizeof(GGfloat), j);
457 
461 
463  }
464 
466 }
467 
471 
473 {
474  SaveDose();
476  if (is_edep_) SaveEdep();
477  if (is_hit_tracking_) SaveHit();
480 }
481 
485 
487 {
488  // Get the OpenCL manager
490 
491  // Get pointer on OpenCL device for dose parameters, take data from first device only
492  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[0], sizeof(GGEMSDoseParams), 0);
493 
494  GGsize total_number_of_dosels = static_cast<GGsize>(dose_params_device->total_number_of_dosels_);
495  GGint* photon_tracking = new GGint[total_number_of_dosels];
496  std::memset(photon_tracking, 0, total_number_of_dosels*sizeof(GGint));
497 
498  GGsize3 dimensions;
499  dimensions.x_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.x);
500  dimensions.y_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.y);
501  dimensions.z_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.z);
502 
503  GGEMSMHDImage mhdImage;
504  mhdImage.SetOutputFileName(dosimetry_output_filename_ + "_photon_tracking.mhd");
505  mhdImage.SetDataType("MET_INT");
506  mhdImage.SetDimensions(dimensions);
507  mhdImage.SetElementSizes(dose_params_device->size_of_dosels_);
508 
509  // Release the pointer
510  opencl_manager.ReleaseDeviceBuffer(dose_params_[0], dose_params_device, 0);
511 
512  // Loop over all activated device
513  for (GGsize j = 0; j < number_activated_devices_; ++j) {
514  GGint* photon_tracking_device = opencl_manager.GetDeviceBuffer<GGint>(dose_recording_.photon_tracking_[j], total_number_of_dosels*sizeof(GGint), j);
515 
516  for (GGsize i = 0; i < total_number_of_dosels; ++i) photon_tracking[i] += photon_tracking_device[i];
517  opencl_manager.ReleaseDeviceBuffer(dose_recording_.photon_tracking_[j], photon_tracking_device, j);
518  }
519 
520  // Writing data
521  mhdImage.Write<GGint>(photon_tracking);
522  delete[] photon_tracking;
523 }
524 
528 
530 {
531  // Get the OpenCL manager
533 
534  // Get pointer on OpenCL device for dose parameters, take data from first device only
535  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[0], sizeof(GGEMSDoseParams), 0);
536 
537  GGsize total_number_of_dosels = static_cast<GGsize>(dose_params_device->total_number_of_dosels_);
538  GGint* hit_tracking = new GGint[total_number_of_dosels];
539  std::memset(hit_tracking, 0, total_number_of_dosels*sizeof(GGint));
540 
541  GGsize3 dimensions;
542  dimensions.x_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.x);
543  dimensions.y_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.y);
544  dimensions.z_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.z);
545 
546  GGEMSMHDImage mhdImage;
547  mhdImage.SetOutputFileName(dosimetry_output_filename_ + "_hit.mhd");
548  mhdImage.SetDataType("MET_INT");
549  mhdImage.SetDimensions(dimensions);
550  mhdImage.SetElementSizes(dose_params_device->size_of_dosels_);
551 
552  // Release the pointer
553  opencl_manager.ReleaseDeviceBuffer(dose_params_[0], dose_params_device, 0);
554 
555  // Loop over all activated device
556  for (GGsize j = 0; j < number_activated_devices_; ++j) {
557  GGint* hit_device = opencl_manager.GetDeviceBuffer<GGint>(dose_recording_.hit_[j], total_number_of_dosels*sizeof(GGint), j);
558 
559  for (GGsize i = 0; i < total_number_of_dosels; ++i) hit_tracking[i] = hit_device[i];
560 
561  opencl_manager.ReleaseDeviceBuffer(dose_recording_.hit_[j], hit_device, j);
562  }
563 
564  // Writing data
565  mhdImage.Write<GGint>(hit_tracking);
566  delete[] hit_tracking;
567 }
568 
572 
574 {
575  // Get the OpenCL manager
577 
578  // Get pointer on OpenCL device for dose parameters, take data from first device only
579  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[0], sizeof(GGEMSDoseParams), 0);
580 
581  GGsize total_number_of_dosels = static_cast<GGsize>(dose_params_device->total_number_of_dosels_);
582  GGDosiType* edep_tracking = new GGDosiType[total_number_of_dosels];
583  std::memset(edep_tracking, 0, total_number_of_dosels*sizeof(GGDosiType));
584 
585  GGsize3 dimensions;
586  dimensions.x_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.x);
587  dimensions.y_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.y);
588  dimensions.z_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.z);
589 
590  GGEMSMHDImage mhdImage;
591  mhdImage.SetOutputFileName(dosimetry_output_filename_ + "_edep.mhd");
592  if (sizeof(GGDosiType) == 4) mhdImage.SetDataType("MET_FLOAT");
593  else if (sizeof(GGDosiType) == 8) mhdImage.SetDataType("MET_DOUBLE");
594  mhdImage.SetDimensions(dimensions);
595  mhdImage.SetElementSizes(dose_params_device->size_of_dosels_);
596 
597  // Release the pointer
598  opencl_manager.ReleaseDeviceBuffer(dose_params_[0], dose_params_device, 0);
599 
600  // Loop over all activated device
601  for (GGsize j = 0; j < number_activated_devices_; ++j) {
602  GGDosiType* edep_device = opencl_manager.GetDeviceBuffer<GGDosiType>(dose_recording_.edep_[j], total_number_of_dosels*sizeof(GGDosiType), j);
603 
604  for (GGsize i = 0; i < total_number_of_dosels; ++i) edep_tracking[i] = edep_device[i];
605 
606  opencl_manager.ReleaseDeviceBuffer(dose_recording_.edep_[j], edep_device, j);
607  }
608 
609  // Writing data
610  mhdImage.Write<GGDosiType>(edep_tracking);
611  delete[] edep_tracking;
612 }
613 
617 
619 {
620  // Get the OpenCL manager
622 
623  // Get pointer on OpenCL device for dose parameters, take data from first device only
624  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[0], sizeof(GGEMSDoseParams), 0);
625 
626  GGsize total_number_of_dosels = static_cast<GGsize>(dose_params_device->total_number_of_dosels_);
627  GGDosiType* edep_squared_tracking = new GGDosiType[total_number_of_dosels];
628  std::memset(edep_squared_tracking, 0, total_number_of_dosels*sizeof(GGDosiType));
629 
630  GGsize3 dimensions;
631  dimensions.x_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.x);
632  dimensions.y_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.y);
633  dimensions.z_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.z);
634 
635  GGEMSMHDImage mhdImage;
636  mhdImage.SetOutputFileName(dosimetry_output_filename_ + "_edep_squared.mhd");
637  if (sizeof(GGDosiType) == 4) mhdImage.SetDataType("MET_FLOAT");
638  else if (sizeof(GGDosiType) == 8) mhdImage.SetDataType("MET_DOUBLE");
639  mhdImage.SetDimensions(dimensions);
640  mhdImage.SetElementSizes(dose_params_device->size_of_dosels_);
641 
642  // Release the pointer
643  opencl_manager.ReleaseDeviceBuffer(dose_params_[0], dose_params_device, 0);
644 
645  // Loop over all activated device
646  for (GGsize j = 0; j < number_activated_devices_; ++j) {
647  GGDosiType* edep_squared_device = opencl_manager.GetDeviceBuffer<GGDosiType>(dose_recording_.edep_squared_[j], total_number_of_dosels*sizeof(GGDosiType), j);
648 
649  for (GGsize i = 0; i < total_number_of_dosels; ++i) edep_squared_tracking[i] = edep_squared_device[i];
650 
651  opencl_manager.ReleaseDeviceBuffer(dose_recording_.edep_squared_[j], edep_squared_device, j);
652  }
653 
654  // Writing data
655  mhdImage.Write<GGDosiType>(edep_squared_tracking);
656  delete[] edep_squared_tracking;
657 }
658 
662 
664 {
665  // Get the OpenCL manager
667 
668  // Get pointer on OpenCL device for dose parameters, take data from first device only
669  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[0], sizeof(GGEMSDoseParams), 0);
670 
671  GGsize total_number_of_dosels = static_cast<GGsize>(dose_params_device->total_number_of_dosels_);
672  GGfloat* dose = new GGfloat[total_number_of_dosels];
673  std::memset(dose, 0, total_number_of_dosels*sizeof(GGfloat));
674 
675  GGsize3 dimensions;
676  dimensions.x_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.x);
677  dimensions.y_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.y);
678  dimensions.z_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.z);
679 
680  GGEMSMHDImage mhdImage;
681  mhdImage.SetOutputFileName(dosimetry_output_filename_ + "_dose.mhd");
682  mhdImage.SetDataType("MET_FLOAT");
683  mhdImage.SetDimensions(dimensions);
684  mhdImage.SetElementSizes(dose_params_device->size_of_dosels_);
685 
686  // Release the pointer
687  opencl_manager.ReleaseDeviceBuffer(dose_params_[0], dose_params_device, 0);
688 
689  // Loop over all activated device
690  for (GGsize j = 0; j < number_activated_devices_; ++j) {
691  GGfloat* dose_device = opencl_manager.GetDeviceBuffer<GGfloat>(dose_recording_.dose_[j], total_number_of_dosels*sizeof(GGfloat), j);
692 
693  for (GGsize i = 0; i < total_number_of_dosels; ++i) dose[i] += dose_device[i];
694 
695  opencl_manager.ReleaseDeviceBuffer(dose_recording_.dose_[j], dose_device, j);
696  }
697 
698  // Writing data
699  mhdImage.Write<GGfloat>(dose);
700  delete[] dose;
701 }
702 
706 
708 {
709  // Get the OpenCL manager
711 
712  // Get pointer on OpenCL device for dose parameters, take data from first device only
713  GGEMSDoseParams* dose_params_device = opencl_manager.GetDeviceBuffer<GGEMSDoseParams>(dose_params_[0], sizeof(GGEMSDoseParams), 0);
714 
715  GGsize total_number_of_dosels = static_cast<GGsize>(dose_params_device->total_number_of_dosels_);
716  GGfloat* uncertainty = new GGfloat[total_number_of_dosels];
717  std::memset(uncertainty, 0, total_number_of_dosels*sizeof(GGfloat));
718 
719  GGsize3 dimensions;
720  dimensions.x_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.x);
721  dimensions.y_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.y);
722  dimensions.z_ = static_cast<GGsize>(dose_params_device->number_of_dosels_.z);
723 
724  GGEMSMHDImage mhdImage;
725  mhdImage.SetOutputFileName(dosimetry_output_filename_ + "_uncertainty.mhd");
726  mhdImage.SetDataType("MET_FLOAT");
727  mhdImage.SetDimensions(dimensions);
728  mhdImage.SetElementSizes(dose_params_device->size_of_dosels_);
729 
730  // Release the pointer
731  opencl_manager.ReleaseDeviceBuffer(dose_params_[0], dose_params_device, 0);
732 
733  // Loop over all activated device
734  for (GGsize j = 0; j < number_activated_devices_; ++j) {
735  GGfloat* uncertainty_device = opencl_manager.GetDeviceBuffer<GGfloat>(dose_recording_.uncertainty_dose_[j], total_number_of_dosels*sizeof(GGfloat), j);
736 
737  for (GGsize i = 0; i < total_number_of_dosels; ++i) uncertainty[i] = uncertainty_device[i];
738 
739  opencl_manager.ReleaseDeviceBuffer(dose_recording_.uncertainty_dose_[j], uncertainty_device, j);
740  }
741 
742  // Writing data
743  mhdImage.Write<GGfloat>(uncertainty);
744  delete[] uncertainty;
745 }
746 
750 
752 {
753  return new(std::nothrow) GGEMSDosimetryCalculator();
754 }
755 
759 
761 {
762  if (dose_calculator) {
763  delete dose_calculator;
764  dose_calculator = nullptr;
765  }
766 }
767 
771 
772 void scale_factor_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, GGfloat const scale_factor)
773 {
774  dose_calculator->SetScaleFactor(scale_factor);
775 }
776 
780 
781 void set_dosel_size_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, GGfloat const dose_x, GGfloat const dose_y, GGfloat const dose_z, char const* unit)
782 {
783  dose_calculator->SetDoselSizes(dose_x, dose_y, dose_z, unit);
784 }
785 
789 
790 void set_dose_output_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, char const* dose_output_filename)
791 {
792  dose_calculator->SetOutputDosimetryBasename(dose_output_filename);
793 }
794 
798 
799 void dose_photon_tracking_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, bool const is_activated)
800 {
801  dose_calculator->SetPhotonTracking(is_activated);
802 }
803 
807 
808 void dose_edep_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, bool const is_activated)
809 {
810  dose_calculator->SetEdep(is_activated);
811 }
812 
816 
817 void dose_hit_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, bool const is_activated)
818 {
819  dose_calculator->SetHitTracking(is_activated);
820 }
821 
825 
826 void dose_edep_squared_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, bool const is_activated)
827 {
828  dose_calculator->SetEdepSquared(is_activated);
829 }
830 
834 
835 void dose_uncertainty_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, bool const is_activated)
836 {
837  dose_calculator->SetUncertainty(is_activated);
838 }
839 
843 
844 void water_reference_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, bool const is_activated)
845 {
846  dose_calculator->SetWaterReference(is_activated);
847 }
848 
852 
853 void minimum_density_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, GGfloat const minimum_density, char const* unit)
854 {
855  dose_calculator->SetMinimumDensity(minimum_density, unit);
856 }
857 
861 
862 void attach_to_navigator_dosimetry_calculator(GGEMSDosimetryCalculator* dose_calculator, char const* navigator)
863 {
864  dose_calculator->AttachToNavigator(navigator);
865 }
dose_hit_dosimetry_calculator
void dose_hit_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about hit tracking
Definition: GGEMSDosimetryCalculator.cc:817
GGEMSMHDImage
I/O class handling MHD file.
Definition: GGEMSMHDImage.hh:47
GGEMSDosimetryCalculator::GGEMSDosimetryCalculator
GGEMSDosimetryCalculator(void)
GGEMSDosimetryCalculator constructor.
Definition: GGEMSDosimetryCalculator.cc:40
GGEMSDoseRecording_t::hit_
cl::Buffer ** hit_
Definition: GGEMSDoseRecording.hh:46
attach_to_navigator_dosimetry_calculator
void attach_to_navigator_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, char const *navigator)
attach dosimetry module to a navigator
Definition: GGEMSDosimetryCalculator.cc:862
GGEMSNavigator::GetMaterials
GGEMSMaterials * GetMaterials(void) const
get the pointer on materials
Definition: GGEMSNavigator.hh:158
GGDosiType
#define GGDosiType
Definition: GGEMSTypes.hh:290
GGEMSDosimetryCalculator::dose_recording_
GGEMSDoseRecording dose_recording_
Definition: GGEMSDosimetryCalculator.hh:285
FALSE
#define FALSE
Definition: GGEMSTypes.hh:34
GGEMSOpenCLManager::IsDoublePrecisionAtomicAddition
bool IsDoublePrecisionAtomicAddition(GGsize const &device_index) const
checking double precision atomic addition on OpenCL device
Definition: GGEMSOpenCLManager.cc:1020
GGsize3_t
Structure storing 3 GGsize values.
Definition: GGEMSTypes.hh:267
GGEMSOpenCLManager::GetNumberOfActivatedDevice
GGsize GetNumberOfActivatedDevice(void) const
get the number of activated devices
Definition: GGEMSOpenCLManager.hh:167
scale_factor_dosimetry_calculator
void scale_factor_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, GGfloat const scale_factor)
set the scale factor applied to dose value
Definition: GGEMSDosimetryCalculator.cc:772
GGEMSDoseRecording_t::photon_tracking_
cl::Buffer ** photon_tracking_
Definition: GGEMSDoseRecording.hh:47
GGEMSMHDImage::SetDataType
void SetDataType(std::string const &data_type)
set the type of data
Definition: GGEMSMHDImage.cc:111
GGEMSMaterials::GetMaterialTables
cl::Buffer * GetMaterialTables(GGsize const &thread_index) const
get the pointer on material tables on OpenCL device
Definition: GGEMSMaterials.hh:164
GGEMSDoseRecording_t::dose_
cl::Buffer ** dose_
Definition: GGEMSDoseRecording.hh:48
GGEMSProfilerManager::GetInstance
static GGEMSProfilerManager & GetInstance(void)
Create at first time the Singleton.
Definition: GGEMSProfilerManager.hh:66
GGEMSDosimetryCalculator::SavePhotonTracking
void SavePhotonTracking(void) const
save photon tracking
Definition: GGEMSDosimetryCalculator.cc:486
GGEMSDosimetryCalculator.hh
Class providing tools storing and computing dose in phantom.
GGEMSDoseParams_t::border_min_xyz_
GGfloat3 border_min_xyz_
Definition: GGEMSDoseParams.hh:44
GGEMSDosimetryCalculator::InitializeKernel
void InitializeKernel(void)
Initialize kernel for dose computation.
Definition: GGEMSDosimetryCalculator.cc:294
GGEMSDosimetryCalculator
Class providing tools storing and computing dose in phantom.
Definition: GGEMSDosimetryCalculator.hh:48
GGEMSDosimetryCalculator::dosimetry_output_filename_
std::string dosimetry_output_filename_
Definition: GGEMSDosimetryCalculator.hh:280
GGEMSSolid::GetSolidData
cl::Buffer * GetSolidData(GGsize const &thread_index) const
get the informations about the solid geometry
Definition: GGEMSSolid.hh:100
GGEMSDoseRecording_t::edep_squared_
cl::Buffer ** edep_squared_
Definition: GGEMSDoseRecording.hh:45
set_dose_output_dosimetry_calculator
void set_dose_output_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, char const *dose_output_filename)
set output filename storing dosimetry
Definition: GGEMSDosimetryCalculator.cc:790
GGEMSDosimetryCalculator::SetScaleFactor
void SetScaleFactor(GGfloat const &scale_factor)
set the scale factor applied to dose value
Definition: GGEMSDosimetryCalculator.cc:208
GGEMSOpenCLManager::CheckOpenCLError
void CheckOpenCLError(GGint const &error, std::string const &class_name, std::string const &method_name) const
check the OpenCL error
Definition: GGEMSOpenCLManager.cc:1048
GGEMSDosimetryCalculator::total_number_of_dosels_
GGsize total_number_of_dosels_
Definition: GGEMSDosimetryCalculator.hh:279
GGEMSVoxelizedSolid::GetVoxelSizes
GGfloat3 GetVoxelSizes(GGsize const &thread_index) const
get the size of voxels in voxelized solid
Definition: GGEMSVoxelizedSolid.cc:159
GGEMSMHDImage::SetElementSizes
void SetElementSizes(GGfloat3 const &element_sizes)
set the size of the elements
Definition: GGEMSMHDImage.cc:102
GGEMSDosimetryCalculator::number_activated_devices_
GGsize number_activated_devices_
Definition: GGEMSDosimetryCalculator.hh:296
GGEMSNavigator::SetDosimetryCalculator
void SetDosimetryCalculator(GGEMSDosimetryCalculator *dosimetry_calculator)
give adress of dosimetry calculator to navigator
Definition: GGEMSNavigator.cc:114
DensityUnit
T DensityUnit(T const &value, std::string const &unit)
Choose best density unit.
Definition: GGEMSSystemOfUnits.hh:396
GGEMSDoseParams_t
Structure storing dosimetry infos.
Definition: GGEMSDoseParams.hh:41
GGEMSOpenCLManager::GetBestWorkItem
GGsize GetBestWorkItem(GGsize const &number_of_elements) const
get the best number of work item
Definition: GGEMSOpenCLManager.cc:1030
GGEMSOpenCLManager::GetEvent
cl::Event * GetEvent(GGsize const &thread_index) const
return an event to activated context
Definition: GGEMSOpenCLManager.hh:230
GGEMSOpenCLManager::Deallocate
void Deallocate(cl::Buffer *buffer, GGsize size, GGsize const &thread_index, std::string const &class_name="Undefined")
Deallocation of OpenCL memory.
Definition: GGEMSOpenCLManager.cc:981
GGEMSDoseParams_t::size_of_dosels_
GGfloat3 size_of_dosels_
Definition: GGEMSDoseParams.hh:42
GGEMSOpenCLManager::ReleaseDeviceBuffer
void ReleaseDeviceBuffer(cl::Buffer *const device_ptr, T *host_ptr, GGsize const &thread_index)
Get the device pointer on host to write on it. Mandatory after a GetDeviceBufferWrite ou GetDeviceBuf...
Definition: GGEMSOpenCLManager.hh:495
GGEMSDosimetryCalculator::SaveResults
void SaveResults(void) const
save results (dose images)
Definition: GGEMSDosimetryCalculator.cc:472
delete_dosimetry_calculator
void delete_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator)
Delete instance of GGEMSDosimetryCalculator.
Definition: GGEMSDosimetryCalculator.cc:760
GGEMSDosimetryCalculator::SetOutputDosimetryBasename
void SetOutputDosimetryBasename(std::string const &output_filename)
set output basename storing dosimetry
Definition: GGEMSDosimetryCalculator.cc:199
GGEMSDosimetryCalculator::~GGEMSDosimetryCalculator
~GGEMSDosimetryCalculator(void)
GGEMSDosimetryCalculator destructor.
Definition: GGEMSDosimetryCalculator.cc:93
GGEMSVoxelizedSolid
GGEMS class for voxelized solid.
Definition: GGEMSVoxelizedSolid.hh:42
GGEMSNavigatorManager::GetInstance
static GGEMSNavigatorManager & GetInstance(void)
Create at first time the Singleton.
Definition: GGEMSNavigatorManager.hh:60
dose_edep_dosimetry_calculator
void dose_edep_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about energy deposit
Definition: GGEMSDosimetryCalculator.cc:808
GGsize
#define GGsize
Definition: GGEMSTypes.hh:252
GGEMSMHDImage::Write
void Write(cl::Buffer *image, GGsize const &thread_index) const
Write mhd header/raw file.
Definition: GGEMSMHDImage.cc:223
GGint
#define GGint
Definition: GGEMSTypes.hh:224
GGEMSDosimetryCalculator::SaveUncertainty
void SaveUncertainty(void) const
save uncertainty values
Definition: GGEMSDosimetryCalculator.cc:707
GGEMSDosimetryCalculator::SaveDose
void SaveDose(void) const
save dose
Definition: GGEMSDosimetryCalculator.cc:663
GGEMSMHDImage::SetOutputFileName
void SetOutputFileName(std::string const &basename)
set the output filename (*.mhd)
Definition: GGEMSMHDImage.cc:77
TRUE
#define TRUE
Definition: GGEMSTypes.hh:35
GGEMSOpenCLManager::CleanBuffer
void CleanBuffer(cl::Buffer *buffer, GGsize const &size, GGsize const &thread_index)
Cleaning buffer on OpenCL device.
Definition: GGEMSOpenCLManager.cc:998
GGEMSDoseRecording_t::edep_
cl::Buffer ** edep_
Definition: GGEMSDoseRecording.hh:44
GGEMSDosimetryCalculator::is_photon_tracking_
bool is_photon_tracking_
Definition: GGEMSDosimetryCalculator.hh:286
GGEMSDosimetryCalculator::SetPhotonTracking
void SetPhotonTracking(bool const &is_activated)
activating photon tracking during dosimetry mode
Definition: GGEMSDosimetryCalculator.cc:217
GGEMSProfilerManager
GGEMS class managing profiler data.
Definition: GGEMSProfilerManager.hh:48
GGsize3_t::z_
GGsize z_
Definition: GGEMSTypes.hh:270
GGEMSNavigatorManager
GGEMS class handling the navigators (detector + phantom) in GGEMS.
Definition: GGEMSNavigatorManager.hh:42
GGEMSOpenCLManager::GetWorkGroupSize
GGsize GetWorkGroupSize(void) const
Get the work group size defined in GGEMS on activated OpenCL context.
Definition: GGEMSOpenCLManager.hh:198
GGEMSOpenCLManager::Allocate
cl::Buffer * Allocate(void *host_ptr, GGsize const &size, GGsize const &thread_index, cl_mem_flags flags, std::string const &class_name="Undefined")
Allocation of OpenCL memory.
Definition: GGEMSOpenCLManager.cc:945
GGEMSDosimetryCalculator::SaveEdepSquared
void SaveEdepSquared(void) const
save energy squared deposit
Definition: GGEMSDosimetryCalculator.cc:618
GGEMSSolid::GetLabelData
cl::Buffer * GetLabelData(GGsize const &thread_index) const
get buffer to label buffer
Definition: GGEMSSolid.hh:108
GGEMSDosimetryCalculator::SetWaterReference
void SetWaterReference(bool const &is_activated)
activating water reference during dose computation
Definition: GGEMSDosimetryCalculator.cc:262
create_ggems_dosimetry_calculator
GGEMSDosimetryCalculator * create_ggems_dosimetry_calculator(void)
Get the GGEMSDosimetryCalculator pointer for python user.
Definition: GGEMSDosimetryCalculator.cc:751
GGEMSDosimetryCalculator::SetUncertainty
void SetUncertainty(bool const &is_activated)
activating uncertainty registration during dosimetry mode
Definition: GGEMSDosimetryCalculator.cc:253
GGfloat3
#define GGfloat3
Definition: GGEMSTypes.hh:275
minimum_density_dosimetry_calculator
void minimum_density_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, GGfloat const minimum_density, char const *unit)
set minimum of density for dose computation
Definition: GGEMSDosimetryCalculator.cc:853
GGEMSDoseRecording_t::uncertainty_dose_
cl::Buffer ** uncertainty_dose_
Definition: GGEMSDoseRecording.hh:49
water_reference_dosimetry_calculator
void water_reference_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
set water reference mode
Definition: GGEMSDosimetryCalculator.cc:844
GGEMSOpenCLManager::CompileKernel
void CompileKernel(std::string const &kernel_filename, std::string const &kernel_name, cl::Kernel **kernel_list, char *const custom_options=nullptr, char *const additional_options=nullptr)
Compile the OpenCL kernel on the activated device.
Definition: GGEMSOpenCLManager.cc:849
GGEMSDoseParams
struct GGEMSDoseParams_t GGEMSDoseParams
GGEMSDosimetryCalculator::Initialize
void Initialize(void)
Initialize dosimetry calculator class.
Definition: GGEMSDosimetryCalculator.cc:374
GGEMSDosimetryCalculator::kernel_compute_dose_
cl::Kernel ** kernel_compute_dose_
Definition: GGEMSDosimetryCalculator.hh:295
GGEMSDoseParams_t::number_of_dosels_
GGint3 number_of_dosels_
Definition: GGEMSDoseParams.hh:46
GGcout
GGEMSStream GGcout
Definition: GGEMSPrint.cc:34
GGEMSDosimetryCalculator::dose_params_
cl::Buffer ** dose_params_
Definition: GGEMSDosimetryCalculator.hh:284
GGEMSOBB_t::border_max_xyz_
GGfloat3 border_max_xyz_
Definition: GGEMSPrimitiveGeometries.hh:44
GGEMSMHDImage::SetDimensions
void SetDimensions(GGsize3 const &dimensions)
set the dimensions of the image
Definition: GGEMSMHDImage.cc:120
GGEMSNavigatorManager::GetNavigator
GGEMSNavigator * GetNavigator(std::string const &navigator_name) const
get the navigator by the name
Definition: GGEMSNavigatorManager.hh:141
GGEMSDosimetryCalculator::SetMinimumDensity
void SetMinimumDensity(GGfloat const &minimum_density, std::string const &unit="g/cm3")
set minimum of density for dose computation
Definition: GGEMSDosimetryCalculator.cc:272
GGEMSOBB_t
Structure storing OBB (Oriented Bounding Box) geometry.
Definition: GGEMSPrimitiveGeometries.hh:41
GGEMSDosimetryCalculator::is_uncertainty_
bool is_uncertainty_
Definition: GGEMSDosimetryCalculator.hh:290
dose_uncertainty_dosimetry_calculator
void dose_uncertainty_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about uncertainty
Definition: GGEMSDosimetryCalculator.cc:835
GGEMSDoseParams.hh
Structure storing dosimetry infos.
GGsize3_t::x_
GGsize x_
Definition: GGEMSTypes.hh:268
GGEMSDosimetryCalculator::is_water_reference_
GGchar is_water_reference_
Definition: GGEMSDosimetryCalculator.hh:292
GGEMSOpenCLManager::GetDeviceBuffer
T * GetDeviceBuffer(cl::Buffer *device_ptr, GGsize const &size, GGsize const &thread_index)
Get the device pointer on host to write on it. ReleaseDeviceBuffer must be used after this method!...
Definition: GGEMSOpenCLManager.hh:480
GGEMSVoxelizedSolid.hh
GGEMS class for voxelized solid.
GGendl
#define GGendl
overload C++ std::endl
Definition: GGEMSPrint.hh:60
GGEMSDosimetryCalculator::dosel_sizes_
GGfloat3 dosel_sizes_
Definition: GGEMSDosimetryCalculator.hh:278
GGEMSDosimetryCalculator::is_edep_
bool is_edep_
Definition: GGEMSDosimetryCalculator.hh:287
GGEMSOpenCLManager
Singleton class storing all informations about OpenCL and managing GPU/CPU devices,...
Definition: GGEMSOpenCLManager.hh:54
GGEMSDosimetryCalculator::navigator_
GGEMSNavigator * navigator_
Definition: GGEMSDosimetryCalculator.hh:281
GGEMSDosimetryCalculator::SetEdepSquared
void SetEdepSquared(bool const &is_activated)
activating energy squared deposit registration during dosimetry mode
Definition: GGEMSDosimetryCalculator.cc:244
GGEMSDosimetryCalculator::SetDoselSizes
void SetDoselSizes(GGfloat const &dosel_x, GGfloat const &dosel_y, GGfloat const &dosel_z, std::string const &unit="mm")
set size of dosels
Definition: GGEMSDosimetryCalculator.cc:188
GGEMSDosimetryCalculator::is_edep_squared_
bool is_edep_squared_
Definition: GGEMSDosimetryCalculator.hh:289
GGEMSDoseParams_t::total_number_of_dosels_
GGint total_number_of_dosels_
Definition: GGEMSDoseParams.hh:47
GGEMSDosimetryCalculator::SaveEdep
void SaveEdep(void) const
save energy deposit
Definition: GGEMSDosimetryCalculator.cc:573
GGEMSDosimetryCalculator::scale_factor_
GGfloat scale_factor_
Definition: GGEMSDosimetryCalculator.hh:291
GGEMSNavigator::GetSolids
GGEMSSolid * GetSolids(GGsize const &solid_index) const
get the list of solids
Definition: GGEMSNavigator.hh:151
dose_edep_squared_dosimetry_calculator
void dose_edep_squared_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about energy squared deposit
Definition: GGEMSDosimetryCalculator.cc:826
GGEMSDosimetryCalculator::is_hit_tracking_
bool is_hit_tracking_
Definition: GGEMSDosimetryCalculator.hh:288
GGEMSOpenCLManager::GetDeviceName
std::string GetDeviceName(GGsize const &device_index) const
Get the name of the activated device.
Definition: GGEMSOpenCLManager.hh:145
GGEMSDoseParams_t::inv_size_of_dosels_
GGfloat3 inv_size_of_dosels_
Definition: GGEMSDoseParams.hh:43
GGEMSProfilerManager.hh
GGEMS class managing profiler data.
GGEMSOBB_t::border_min_xyz_
GGfloat3 border_min_xyz_
Definition: GGEMSPrimitiveGeometries.hh:43
GGEMSDosimetryCalculator::SetHitTracking
void SetHitTracking(bool const &is_activated)
activating hit tracking during dosimetry mode
Definition: GGEMSDosimetryCalculator.cc:235
GGEMSProfilerManager::HandleEvent
void HandleEvent(cl::Event event, std::string const &profile_name)
handle an OpenCL event in profile_name type
Definition: GGEMSProfilerManager.cc:75
GGEMSOpenCLManager::GetIndexOfActivatedDevice
GGsize GetIndexOfActivatedDevice(GGsize const &thread_index) const
get the index of activated device
Definition: GGEMSOpenCLManager.hh:175
GGEMSDosimetryCalculator::SetEdep
void SetEdep(bool const &is_activated)
activating energy deposit registration during dosimetry mode
Definition: GGEMSDosimetryCalculator.cc:226
GGEMSDosimetryCalculator::SaveHit
void SaveHit(void) const
save hits in dose map
Definition: GGEMSDosimetryCalculator.cc:529
GGEMSDoseParams_t::slice_number_of_dosels_
GGint slice_number_of_dosels_
Definition: GGEMSDoseParams.hh:48
GGEMSDosimetryCalculator::CheckParameters
void CheckParameters(void) const
Definition: GGEMSDosimetryCalculator.cc:281
set_dosel_size_dosimetry_calculator
void set_dosel_size_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, GGfloat const dose_x, GGfloat const dose_y, GGfloat const dose_z, char const *unit)
set size of dosels
Definition: GGEMSDosimetryCalculator.cc:781
GGEMSDoseParams_t::border_max_xyz_
GGfloat3 border_max_xyz_
Definition: GGEMSDoseParams.hh:45
GGEMSMHDImage.hh
I/O class handling MHD image file.
GGEMSOpenCLManager::GetCommandQueue
cl::CommandQueue * GetCommandQueue(GGsize const &thread_index) const
Return the command queue to activated context.
Definition: GGEMSOpenCLManager.hh:222
GGEMSDosimetryCalculator::minimum_density_
GGfloat minimum_density_
Definition: GGEMSDosimetryCalculator.hh:293
GGEMSDosimetryCalculator::AttachToNavigator
void AttachToNavigator(std::string const &navigator_name)
attach a navigator to dosimetry module
Definition: GGEMSDosimetryCalculator.cc:175
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
GGEMSDosimetryCalculator::ComputeDose
void ComputeDose(GGsize const &thread_index)
computing dose
Definition: GGEMSDosimetryCalculator.cc:316
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
GGEMSOpenCLManager::GetInstance
static GGEMSOpenCLManager & GetInstance(void)
Create at first time the Singleton.
Definition: GGEMSOpenCLManager.hh:72
GGsize3_t::y_
GGsize y_
Definition: GGEMSTypes.hh:269
dose_photon_tracking_dosimetry_calculator
void dose_photon_tracking_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about photon tracking
Definition: GGEMSDosimetryCalculator.cc:799