|
GGEMS
1.1
GPU GEant4-based Monte Carlo Simulations
|
Go to the documentation of this file.
41 : dosimetry_output_filename_(
"dosi"),
43 is_photon_tracking_(false),
45 is_hit_tracking_(false),
46 is_edep_squared_(false),
47 is_uncertainty_(false),
49 is_water_reference_(
FALSE),
50 minimum_density_(0.0f),
51 kernel_compute_dose_(nullptr)
53 GGcout(
"GGEMSDosimetryCalculator",
"GGEMSDosimetryCalculator", 3) <<
"GGEMSDosimetryCalculator creating..." <<
GGendl;
64 #ifdef DOSIMETRY_DOUBLE_PRECISION
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;
86 GGcout(
"GGEMSDosimetryCalculator",
"GGEMSDosimetryCalculator", 3) <<
"GGEMSDosimetryCalculator created!!!" <<
GGendl;
95 GGcout(
"GGEMSDosimetryCalculator",
"~GGEMSDosimetryCalculator", 3) <<
"GGEMSSourceManager erasing..." <<
GGendl;
168 GGcout(
"GGEMSDosimetryCalculator",
"~GGEMSDosimetryCalculator", 3) <<
"GGEMSSourceManager erased!!!" <<
GGendl;
284 std::ostringstream oss(std::ostringstream::out);
285 oss <<
"A navigator has to be associated to GGEMSDosimetryCalculator!!!";
296 GGcout(
"GGEMSDosimetryCalculator",
"InitializeKernel", 3) <<
"Initializing kernel for dose computation..." <<
GGendl;
302 std::string openCL_kernel_path = OPENCL_KERNEL_PATH;
303 std::string compute_dose_filename = openCL_kernel_path +
"/ComputeDoseGGEMSVoxelizedSolid.cl";
320 cl::CommandQueue* queue = opencl_manager.
GetCommandQueue(thread_index);
321 cl::Event*
event = opencl_manager.
GetEvent(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;
342 cl::NDRange global_wi(number_of_work_items);
343 cl::NDRange local_wi(work_group_size);
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");
376 GGcout(
"GGEMSDosimetryCalculator",
"Initialize", 3) <<
"Initializing dosimetry calculator..." <<
GGendl;
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!!!";
423 for (
GGsize i = 0; i < 3; ++i) {
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);
495 GGint* photon_tracking =
new GGint[total_number_of_dosels];
496 std::memset(photon_tracking, 0, total_number_of_dosels*
sizeof(
GGint));
516 for (
GGsize i = 0; i < total_number_of_dosels; ++i) photon_tracking[i] += photon_tracking_device[i];
522 delete[] photon_tracking;
538 GGint* hit_tracking =
new GGint[total_number_of_dosels];
539 std::memset(hit_tracking, 0, total_number_of_dosels*
sizeof(
GGint));
559 for (
GGsize i = 0; i < total_number_of_dosels; ++i) hit_tracking[i] = hit_device[i];
566 delete[] hit_tracking;
583 std::memset(edep_tracking, 0, total_number_of_dosels*
sizeof(
GGDosiType));
604 for (
GGsize i = 0; i < total_number_of_dosels; ++i) edep_tracking[i] = edep_device[i];
611 delete[] edep_tracking;
628 std::memset(edep_squared_tracking, 0, total_number_of_dosels*
sizeof(
GGDosiType));
649 for (
GGsize i = 0; i < total_number_of_dosels; ++i) edep_squared_tracking[i] = edep_squared_device[i];
656 delete[] edep_squared_tracking;
673 std::memset(dose, 0, total_number_of_dosels*
sizeof(
GGfloat));
693 for (
GGsize i = 0; i < total_number_of_dosels; ++i) dose[i] += dose_device[i];
717 std::memset(uncertainty, 0, total_number_of_dosels*
sizeof(
GGfloat));
737 for (
GGsize i = 0; i < total_number_of_dosels; ++i) uncertainty[i] = uncertainty_device[i];
744 delete[] uncertainty;
762 if (dose_calculator) {
763 delete dose_calculator;
764 dose_calculator =
nullptr;
783 dose_calculator->
SetDoselSizes(dose_x, dose_y, dose_z, unit);
810 dose_calculator->
SetEdep(is_activated);
void dose_hit_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about hit tracking
I/O class handling MHD file.
GGEMSDosimetryCalculator(void)
GGEMSDosimetryCalculator constructor.
void attach_to_navigator_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, char const *navigator)
attach dosimetry module to a navigator
GGEMSMaterials * GetMaterials(void) const
get the pointer on materials
GGEMSDoseRecording dose_recording_
bool IsDoublePrecisionAtomicAddition(GGsize const &device_index) const
checking double precision atomic addition on OpenCL device
Structure storing 3 GGsize values.
GGsize GetNumberOfActivatedDevice(void) const
get the number of activated devices
void scale_factor_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, GGfloat const scale_factor)
set the scale factor applied to dose value
cl::Buffer ** photon_tracking_
void SetDataType(std::string const &data_type)
set the type of data
cl::Buffer * GetMaterialTables(GGsize const &thread_index) const
get the pointer on material tables on OpenCL device
static GGEMSProfilerManager & GetInstance(void)
Create at first time the Singleton.
void SavePhotonTracking(void) const
save photon tracking
Class providing tools storing and computing dose in phantom.
void InitializeKernel(void)
Initialize kernel for dose computation.
Class providing tools storing and computing dose in phantom.
std::string dosimetry_output_filename_
cl::Buffer * GetSolidData(GGsize const &thread_index) const
get the informations about the solid geometry
cl::Buffer ** edep_squared_
void set_dose_output_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, char const *dose_output_filename)
set output filename storing dosimetry
void SetScaleFactor(GGfloat const &scale_factor)
set the scale factor applied to dose value
void CheckOpenCLError(GGint const &error, std::string const &class_name, std::string const &method_name) const
check the OpenCL error
GGsize total_number_of_dosels_
GGfloat3 GetVoxelSizes(GGsize const &thread_index) const
get the size of voxels in voxelized solid
void SetElementSizes(GGfloat3 const &element_sizes)
set the size of the elements
GGsize number_activated_devices_
void SetDosimetryCalculator(GGEMSDosimetryCalculator *dosimetry_calculator)
give adress of dosimetry calculator to navigator
T DensityUnit(T const &value, std::string const &unit)
Choose best density unit.
Structure storing dosimetry infos.
GGsize GetBestWorkItem(GGsize const &number_of_elements) const
get the best number of work item
cl::Event * GetEvent(GGsize const &thread_index) const
return an event to activated context
void Deallocate(cl::Buffer *buffer, GGsize size, GGsize const &thread_index, std::string const &class_name="Undefined")
Deallocation of OpenCL memory.
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...
void SaveResults(void) const
save results (dose images)
void delete_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator)
Delete instance of GGEMSDosimetryCalculator.
void SetOutputDosimetryBasename(std::string const &output_filename)
set output basename storing dosimetry
~GGEMSDosimetryCalculator(void)
GGEMSDosimetryCalculator destructor.
GGEMS class for voxelized solid.
static GGEMSNavigatorManager & GetInstance(void)
Create at first time the Singleton.
void dose_edep_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about energy deposit
void Write(cl::Buffer *image, GGsize const &thread_index) const
Write mhd header/raw file.
void SaveUncertainty(void) const
save uncertainty values
void SaveDose(void) const
save dose
void SetOutputFileName(std::string const &basename)
set the output filename (*.mhd)
void CleanBuffer(cl::Buffer *buffer, GGsize const &size, GGsize const &thread_index)
Cleaning buffer on OpenCL device.
void SetPhotonTracking(bool const &is_activated)
activating photon tracking during dosimetry mode
GGEMS class managing profiler data.
GGEMS class handling the navigators (detector + phantom) in GGEMS.
GGsize GetWorkGroupSize(void) const
Get the work group size defined in GGEMS on activated OpenCL context.
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.
void SaveEdepSquared(void) const
save energy squared deposit
cl::Buffer * GetLabelData(GGsize const &thread_index) const
get buffer to label buffer
void SetWaterReference(bool const &is_activated)
activating water reference during dose computation
GGEMSDosimetryCalculator * create_ggems_dosimetry_calculator(void)
Get the GGEMSDosimetryCalculator pointer for python user.
void SetUncertainty(bool const &is_activated)
activating uncertainty registration during dosimetry mode
void minimum_density_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, GGfloat const minimum_density, char const *unit)
set minimum of density for dose computation
cl::Buffer ** uncertainty_dose_
void water_reference_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
set water reference mode
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.
struct GGEMSDoseParams_t GGEMSDoseParams
void Initialize(void)
Initialize dosimetry calculator class.
cl::Kernel ** kernel_compute_dose_
cl::Buffer ** dose_params_
void SetDimensions(GGsize3 const &dimensions)
set the dimensions of the image
GGEMSNavigator * GetNavigator(std::string const &navigator_name) const
get the navigator by the name
void SetMinimumDensity(GGfloat const &minimum_density, std::string const &unit="g/cm3")
set minimum of density for dose computation
Structure storing OBB (Oriented Bounding Box) geometry.
void dose_uncertainty_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about uncertainty
Structure storing dosimetry infos.
GGchar is_water_reference_
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!...
GGEMS class for voxelized solid.
#define GGendl
overload C++ std::endl
Singleton class storing all informations about OpenCL and managing GPU/CPU devices,...
GGEMSNavigator * navigator_
void SetEdepSquared(bool const &is_activated)
activating energy squared deposit registration during dosimetry mode
void SetDoselSizes(GGfloat const &dosel_x, GGfloat const &dosel_y, GGfloat const &dosel_z, std::string const &unit="mm")
set size of dosels
GGint total_number_of_dosels_
void SaveEdep(void) const
save energy deposit
GGEMSSolid * GetSolids(GGsize const &solid_index) const
get the list of solids
void dose_edep_squared_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about energy squared deposit
std::string GetDeviceName(GGsize const &device_index) const
Get the name of the activated device.
GGfloat3 inv_size_of_dosels_
GGEMS class managing profiler data.
void SetHitTracking(bool const &is_activated)
activating hit tracking during dosimetry mode
void HandleEvent(cl::Event event, std::string const &profile_name)
handle an OpenCL event in profile_name type
GGsize GetIndexOfActivatedDevice(GGsize const &thread_index) const
get the index of activated device
void SetEdep(bool const &is_activated)
activating energy deposit registration during dosimetry mode
void SaveHit(void) const
save hits in dose map
GGint slice_number_of_dosels_
void CheckParameters(void) const
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
I/O class handling MHD image file.
cl::CommandQueue * GetCommandQueue(GGsize const &thread_index) const
Return the command queue to activated context.
void AttachToNavigator(std::string const &navigator_name)
attach a navigator to dosimetry module
void ThrowException(std::string const &class_name, std::string const &method_name, std::string const &message)
Throw a C++ exception.
void ComputeDose(GGsize const &thread_index)
computing dose
T DistanceUnit(T const &value, std::string const &unit)
Choose best distance unit.
static GGEMSOpenCLManager & GetInstance(void)
Create at first time the Singleton.
void dose_photon_tracking_dosimetry_calculator(GGEMSDosimetryCalculator *dose_calculator, bool const is_activated)
storing results about photon tracking