ATLAS Offline Software
Loading...
Searching...
No Matches
GPUClusterInfoAndMomentsCalculator Class Reference

Standard tool to calculate cluster info (energy, transverse energy, pseudo-rapidity and azimuthal angle). More...

#include <GPUClusterInfoAndMomentsCalculator.h>

Inheritance diagram for GPUClusterInfoAndMomentsCalculator:
Collaboration diagram for GPUClusterInfoAndMomentsCalculator:

Public Member Functions

 GPUClusterInfoAndMomentsCalculator (const std::string &type, const std::string &name, const IInterface *parent)
virtual StatusCode initialize () override
virtual StatusCode initialize_non_CUDA () override
 Initialization that does not invoke CUDA functions.
virtual StatusCode initialize_CUDA () override
 Initialization that invokes CUDA functions.
virtual StatusCode execute (const EventContext &ctx, const CaloRecGPU::ConstantDataHolder &constant_data, CaloRecGPU::EventDataHolder &event_data, void *temporary_buffer) const override
virtual StatusCode finalize () override
virtual ~GPUClusterInfoAndMomentsCalculator ()=default
void handle (const Incident &incident) override

Protected Member Functions

void record_times (const size_t event_num, const std::vector< size_t > &times) const
template<class ... Args>
void record_times (const size_t event_num, const size_t &value) const
template<class ... Args>
void record_times (const size_t event_num, const size_t &value, Args &&... args) const
void print_times (const std::string &header, const size_t time_size) const

Protected Attributes

std::shared_mutex m_timeMutex
 Mutex that is locked when recording times.
std::vector< size_t > m_times ATLAS_THREAD_SAFE
 Vector to hold execution times to be recorded if necessary.
std::vector< size_t > m_eventNumbers ATLAS_THREAD_SAFE
 Vector to hold the event numbers to be recorded if necessary.
Gaudi::Property< bool > m_measureTimes
 If true, times are recorded to the file given by m_timeFileName.
Gaudi::Property< std::string > m_timeFileName
 File to which times should be saved.

Private Member Functions

void record_times_helper (const size_t) const
template<class Arg>
void record_times_helper (const size_t index, Arg &&arg) const
template<class ... Args>
void record_times_helper (size_t index, Args &&... args) const

Private Attributes

Gaudi::Property< double > m_maxAxisAngle {this, "MaxAxisAngle", 20 * CLHEP::deg, "The maximal allowed deviation from the IP-to-ClusterCenter-axis"}
 the maximal allowed deviation from the IP-to-ClusterCenter-axis.
Gaudi::Property< double > m_minRLateral {this, "MinRLateral", 4 * CLHEP::cm, "The minimal r in the definition of the Lateral moment"}
 the minimal \(r\) in the definition of the Lateral moment
Gaudi::Property< double > m_minLLongitudinal {this, "MinLLongitudinal", 10 * CLHEP::cm, "The minimal lambda in the definition of the Longitudinal moment"}
 the minimal \(\lambda\) in the definition of the Longitudinal moment
Gaudi::Property< double > m_minBadLArQuality {this, "MinBadLArQuality", 4000, "The minimal cell quality in the LAr for declaring a cell bad"}
 the minimal cell quality in the LAr for declaring a cell bad
Gaudi::Property< bool > m_absOpt {this, "WeightingOfNegClusters", false, "If set to true use abs E value of cells to calculate cluster moments"}
 if set to true use abs E value of cells to calculate cluster moments
Gaudi::Property< double > m_etaInnerWheel {this, "EMECAbsEtaWheelTransition", 2.52, "Transition from outer to inner wheel in EME2"}
 Transition from outer to inner wheel in EME2.
Gaudi::Property< bool > m_twoGaussianNoise {this, "TwoGaussianNoise", false, "If set to true use 2-gaussian noise description for TileCal"}
 if set to true use 2-gaussian noise description for TileCal
Gaudi::Property< bool > m_skipInvalidClusters {this, "SkipInvalidClusters", true, "Check for and skip invalid clusters during moments calculation."}
 If false, do the moment calculation even for invalid clusters (which may waste computation).
ClusterMomentsCalculator::CMCOptionsHolder m_options
 Options for the algorithm, held in a GPU-friendly way.
ServiceHandle< IGPUKernelSizeOptimizerSvcm_kernelSizeOptimizer { this, "KernelSizeOptimizer", "GPUKernelSizeOptimizerSvc", "CUDA kernel size optimization service." }
 Handle to the CUDA kernel block and grid size optimization service.

Detailed Description

Standard tool to calculate cluster info (energy, transverse energy, pseudo-rapidity and azimuthal angle).

Author
Nuno Fernandes nuno..nosp@m.dos..nosp@m.santo.nosp@m.s.fe.nosp@m.rnand.nosp@m.es@c.nosp@m.ern.c.nosp@m.h
Date
01 March 2023

Definition at line 33 of file GPUClusterInfoAndMomentsCalculator.h.

Constructor & Destructor Documentation

◆ GPUClusterInfoAndMomentsCalculator()

GPUClusterInfoAndMomentsCalculator::GPUClusterInfoAndMomentsCalculator ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 14 of file GPUClusterInfoAndMomentsCalculator.cxx.

14 :
15 base_class(type, name, parent),
16 CaloGPUTimed(this)
17{
18}
CaloGPUTimed(T *ptr)

◆ ~GPUClusterInfoAndMomentsCalculator()

virtual GPUClusterInfoAndMomentsCalculator::~GPUClusterInfoAndMomentsCalculator ( )
virtualdefault

Member Function Documentation

◆ execute()

StatusCode GPUClusterInfoAndMomentsCalculator::execute ( const EventContext & ctx,
const CaloRecGPU::ConstantDataHolder & constant_data,
CaloRecGPU::EventDataHolder & event_data,
void * temporary_buffer ) const
overridevirtual

Definition at line 47 of file GPUClusterInfoAndMomentsCalculator.cxx.

49{
51
52 calculateClusterPropertiesAndMoments(event_data, constant_data, m_options, *(m_kernelSizeOptimizer.get()), times, m_measureTimes);
53
55 {
56 record_times(ctx.evt(),
57 times[ 0],
58 times[ 1],
59 times[ 2],
60 times[ 3],
61 times[ 4],
62 times[ 5],
63 times[ 6],
64 times[ 7],
65 times[ 8],
66 times[ 9],
67 times[10]
68 );
69 }
70
71 return StatusCode::SUCCESS;
72}
Gaudi::Property< bool > m_measureTimes
If true, times are recorded to the file given by m_timeFileName.
void record_times(const size_t event_num, const std::vector< size_t > &times) const
ClusterMomentsCalculator::CMCOptionsHolder m_options
Options for the algorithm, held in a GPU-friendly way.
ServiceHandle< IGPUKernelSizeOptimizerSvc > m_kernelSizeOptimizer
Handle to the CUDA kernel block and grid size optimization service.
void calculateClusterPropertiesAndMoments(CaloRecGPU::EventDataHolder &holder, const CaloRecGPU::ConstantDataHolder &instance_data, const CMCOptionsHolder &options, const IGPUKernelSizeOptimizer &optimizer, size_t(&times)[num_time_measurements], const bool synchronize=false, CaloRecGPU::CUDA_Helpers::CUDAStreamPtrHolder stream={})

◆ finalize()

StatusCode GPUClusterInfoAndMomentsCalculator::finalize ( )
overridevirtual

Definition at line 74 of file GPUClusterInfoAndMomentsCalculator.cxx.

75{
77 {
78 print_times("Isolation_Clusters Isolation_Cells Zeroth_Clusters "
79 "First_Cells First_Clusters Second_Cells Shower_Axis Second_Clusters "
80 "Third_Cells Third_Clusters Finalize_Clusters", num_time_measurements);
81 }
82 return StatusCode::SUCCESS;
83}
void print_times(const std::string &header, const size_t time_size) const

◆ handle()

void CaloGPUCUDAInitialization::handle ( const Incident & incident)
inlineoverrideinherited

Definition at line 66 of file CaloGPUCUDAInitialization.h.

67 {
68 const bool is_multiprocess = (Gaudi::Concurrency::ConcurrencyFlags::numProcs() > 0);
69 if (is_multiprocess && incident.type() == AthenaInterprocess::UpdateAfterFork::type())
70 {
71 if (!this->initialize_CUDA().isSuccess())
72 {
73 throw GaudiException("Failed to perform the CUDA initialization!",
74 "CaloGPUCUDAInitialization::handle",
75 StatusCode::FAILURE);
76 }
77 }
78 }
static const std::string & type()
Incident type.
Definition Incidents.h:49
virtual StatusCode initialize_CUDA()
Initialization that invokes CUDA functions.

◆ initialize()

virtual StatusCode GPUClusterInfoAndMomentsCalculator::initialize ( )
inlineoverridevirtual

Reimplemented from CaloGPUCUDAInitialization.

Definition at line 40 of file GPUClusterInfoAndMomentsCalculator.h.

◆ initialize_CUDA()

StatusCode GPUClusterInfoAndMomentsCalculator::initialize_CUDA ( )
overridevirtual

Initialization that invokes CUDA functions.

Reimplemented from CaloGPUCUDAInitialization.

Definition at line 39 of file GPUClusterInfoAndMomentsCalculator.cxx.

40{
41 m_options.sendToGPU();
43
44 return StatusCode::SUCCESS;
45}
void register_kernels(IGPUKernelSizeOptimizer &optimizer)

◆ initialize_non_CUDA()

StatusCode GPUClusterInfoAndMomentsCalculator::initialize_non_CUDA ( )
overridevirtual

Initialization that does not invoke CUDA functions.

Reimplemented from CaloGPUCUDAInitialization.

Definition at line 20 of file GPUClusterInfoAndMomentsCalculator.cxx.

21{
22 m_options.allocate();
23
24 m_options.m_options->use_abs_energy = m_absOpt;
25 m_options.m_options->use_two_gaussian_noise = m_twoGaussianNoise;
26 m_options.m_options->skip_invalid_clusters = m_skipInvalidClusters;
27 m_options.m_options->min_LAr_quality = m_minBadLArQuality;
28 m_options.m_options->max_axis_angle = m_maxAxisAngle;
29 m_options.m_options->eta_inner_wheel = m_etaInnerWheel;
30 m_options.m_options->min_l_longitudinal = m_minLLongitudinal;
31 m_options.m_options->min_r_lateral = m_minRLateral;
32
33
34 ATH_CHECK( m_kernelSizeOptimizer.retrieve() );
35
36 return StatusCode::SUCCESS;
37}
#define ATH_CHECK
Evaluate an expression and check for errors.
Gaudi::Property< double > m_etaInnerWheel
Transition from outer to inner wheel in EME2.
Gaudi::Property< double > m_minBadLArQuality
the minimal cell quality in the LAr for declaring a cell bad
Gaudi::Property< double > m_maxAxisAngle
the maximal allowed deviation from the IP-to-ClusterCenter-axis.
Gaudi::Property< double > m_minRLateral
the minimal in the definition of the Lateral moment
Gaudi::Property< double > m_minLLongitudinal
the minimal in the definition of the Longitudinal moment
Gaudi::Property< bool > m_absOpt
if set to true use abs E value of cells to calculate cluster moments
Gaudi::Property< bool > m_twoGaussianNoise
if set to true use 2-gaussian noise description for TileCal
Gaudi::Property< bool > m_skipInvalidClusters
If false, do the moment calculation even for invalid clusters (which may waste computation).

◆ print_times()

void CaloGPUTimed::print_times ( const std::string & header,
const size_t time_size ) const
inlineprotectedinherited

Definition at line 143 of file CaloGPUTimed.h.

144 {
145 std::shared_lock<std::shared_mutex> lock(m_timeMutex);
146
147 if (m_timeFileName.size() == 0)
148 {
149 return;
150 }
151
152 std::vector<size_t> indices(m_eventNumbers.size());
153
154 std::iota(indices.begin(), indices.end(), 0);
155 std::sort(indices.begin(), indices.end(), [&](size_t a, size_t b)
156 {
157 return m_eventNumbers[a] < m_eventNumbers[b];
158 }
159 );
160 std::ofstream out(m_timeFileName);
161
162 out << "Event_Number Total " << header << "\n";
163
164 for (const size_t idx : indices)
165 {
166 out << m_eventNumbers[idx] << " ";
167
168 size_t total = 0;
169
170 for (size_t i = 0; i < time_size; ++i)
171 {
172 total += m_times[idx * time_size + i];
173 }
174
175 out << total << " ";
176
177 for (size_t i = 0; i < time_size; ++i)
178 {
179 out << m_times[idx * time_size + i] << " ";
180 }
181 out << "\n";
182 }
183
184 out << std::endl;
185
186 out.close();
187 }
static Double_t a
Gaudi::Property< std::string > m_timeFileName
File to which times should be saved.
std::shared_mutex m_timeMutex
Mutex that is locked when recording times.
std::pair< long int, long int > indices
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.

◆ record_times() [1/3]

template<class ... Args>
void CaloGPUTimed::record_times ( const size_t event_num,
const size_t & value ) const
inlineprotectedinherited

Definition at line 105 of file CaloGPUTimed.h.

106 {
107 const size_t time_size = 1;
108
109 size_t old_size;
110
111 {
112 std::unique_lock<std::shared_mutex> lock(m_timeMutex);
113 old_size = m_times.size();
114 m_times.resize(old_size + time_size);
115 m_eventNumbers.push_back(event_num);
116 }
117 {
118 std::shared_lock<std::shared_mutex> lock(m_timeMutex);
119 record_times_helper(old_size, value);
120 }
121 }
void record_times_helper(const size_t) const

◆ record_times() [2/3]

template<class ... Args>
void CaloGPUTimed::record_times ( const size_t event_num,
const size_t & value,
Args &&... args ) const
inlineprotectedinherited

Definition at line 124 of file CaloGPUTimed.h.

125 {
126 const size_t time_size = sizeof...(args) + 1;
127
128 size_t old_size;
129
130 {
131 std::unique_lock<std::shared_mutex> lock(m_timeMutex);
132 old_size = m_times.size();
133 m_times.resize(old_size + time_size);
134 m_eventNumbers.push_back(event_num);
135 }
136 {
137 std::shared_lock<std::shared_mutex> lock(m_timeMutex);
138 record_times_helper(old_size, value, std::forward<Args>(args)...);
139 }
140
141 }

◆ record_times() [3/3]

void CaloGPUTimed::record_times ( const size_t event_num,
const std::vector< size_t > & times ) const
inlineprotectedinherited

Definition at line 86 of file CaloGPUTimed.h.

87 {
88 size_t old_size;
89 {
90 std::unique_lock<std::shared_mutex> lock(m_timeMutex);
91 old_size = m_times.size();
92 m_times.resize(old_size + times.size());
93 m_eventNumbers.push_back(event_num);
94 }
95 {
96 std::shared_lock<std::shared_mutex> lock(m_timeMutex);
97 for (size_t i = 0; i < times.size(); ++i)
98 {
99 m_times[old_size + i] = times[i];
100 }
101 }
102 }

◆ record_times_helper() [1/3]

template<class Arg>
void CaloGPUTimed::record_times_helper ( const size_t index,
Arg && arg ) const
inlineprivateinherited

Definition at line 70 of file CaloGPUTimed.h.

71 {
72 // coverity[missing_lock]
73 m_times[index] = std::forward<Arg>(arg);
74
75 //This is called within a function that holds the lock itself.
76 }
str index
Definition DeMoScan.py:362

◆ record_times_helper() [2/3]

void CaloGPUTimed::record_times_helper ( const size_t ) const
inlineprivateinherited

Definition at line 64 of file CaloGPUTimed.h.

65 {
66 //Do nothing
67 }

◆ record_times_helper() [3/3]

template<class ... Args>
void CaloGPUTimed::record_times_helper ( size_t index,
Args &&... args ) const
inlineprivateinherited

Definition at line 79 of file CaloGPUTimed.h.

80 {
81 (record_times_helper(index++, std::forward<Args>(args)), ...);
82 }

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

std::vector<size_t> m_times CaloGPUTimed::ATLAS_THREAD_SAFE
mutableprotectedinherited

Vector to hold execution times to be recorded if necessary.

Definition at line 35 of file CaloGPUTimed.h.

◆ ATLAS_THREAD_SAFE [2/2]

std::vector<size_t> m_eventNumbers CaloGPUTimed::ATLAS_THREAD_SAFE
mutableprotectedinherited

Vector to hold the event numbers to be recorded if necessary.

Definition at line 40 of file CaloGPUTimed.h.

◆ m_absOpt

Gaudi::Property<bool> GPUClusterInfoAndMomentsCalculator::m_absOpt {this, "WeightingOfNegClusters", false, "If set to true use abs E value of cells to calculate cluster moments"}
private

if set to true use abs E value of cells to calculate cluster moments

Definition at line 94 of file GPUClusterInfoAndMomentsCalculator.h.

94{this, "WeightingOfNegClusters", false, "If set to true use abs E value of cells to calculate cluster moments"};

◆ m_etaInnerWheel

Gaudi::Property<double> GPUClusterInfoAndMomentsCalculator::m_etaInnerWheel {this, "EMECAbsEtaWheelTransition", 2.52, "Transition from outer to inner wheel in EME2"}
private

Transition from outer to inner wheel in EME2.

Definition at line 98 of file GPUClusterInfoAndMomentsCalculator.h.

98{this, "EMECAbsEtaWheelTransition", 2.52, "Transition from outer to inner wheel in EME2"};

◆ m_kernelSizeOptimizer

ServiceHandle<IGPUKernelSizeOptimizerSvc> GPUClusterInfoAndMomentsCalculator::m_kernelSizeOptimizer { this, "KernelSizeOptimizer", "GPUKernelSizeOptimizerSvc", "CUDA kernel size optimization service." }
private

Handle to the CUDA kernel block and grid size optimization service.

Definition at line 115 of file GPUClusterInfoAndMomentsCalculator.h.

115{ this, "KernelSizeOptimizer", "GPUKernelSizeOptimizerSvc", "CUDA kernel size optimization service." };

◆ m_maxAxisAngle

Gaudi::Property<double> GPUClusterInfoAndMomentsCalculator::m_maxAxisAngle {this, "MaxAxisAngle", 20 * CLHEP::deg, "The maximal allowed deviation from the IP-to-ClusterCenter-axis"}
private

the maximal allowed deviation from the IP-to-ClusterCenter-axis.

Definition at line 63 of file GPUClusterInfoAndMomentsCalculator.h.

63{this, "MaxAxisAngle", 20 * CLHEP::deg, "The maximal allowed deviation from the IP-to-ClusterCenter-axis"};

◆ m_measureTimes

Gaudi::Property<bool> CaloGPUTimed::m_measureTimes
protectedinherited

If true, times are recorded to the file given by m_timeFileName.

Defaults to false.

Definition at line 46 of file CaloGPUTimed.h.

◆ m_minBadLArQuality

Gaudi::Property<double> GPUClusterInfoAndMomentsCalculator::m_minBadLArQuality {this, "MinBadLArQuality", 4000, "The minimal cell quality in the LAr for declaring a cell bad"}
private

the minimal cell quality in the LAr for declaring a cell bad

This defines the minimal quality (large values mean worse shape) a cell needs to exceed in order to be considered as not compatible with a normal ionization signal.

Definition at line 89 of file GPUClusterInfoAndMomentsCalculator.h.

89{this, "MinBadLArQuality", 4000, "The minimal cell quality in the LAr for declaring a cell bad"};

◆ m_minLLongitudinal

Gaudi::Property<double> GPUClusterInfoAndMomentsCalculator::m_minLLongitudinal {this, "MinLLongitudinal", 10 * CLHEP::cm, "The minimal lambda in the definition of the Longitudinal moment"}
private

the minimal \(\lambda\) in the definition of the Longitudinal moment

This defines the minimal distance along the shower axis from the cluster center the two leading cells might have before this value is used instead of their real distance in the normalization of the LONGITUDINAL moment.

Definition at line 81 of file GPUClusterInfoAndMomentsCalculator.h.

81{this, "MinLLongitudinal", 10 * CLHEP::cm, "The minimal lambda in the definition of the Longitudinal moment"};

◆ m_minRLateral

Gaudi::Property<double> GPUClusterInfoAndMomentsCalculator::m_minRLateral {this, "MinRLateral", 4 * CLHEP::cm, "The minimal r in the definition of the Lateral moment"}
private

the minimal \(r\) in the definition of the Lateral moment

This defines the minimal distance the two leading cells might have before this value is used instead of their real distance in the normalization of the LATERAL moment.

Definition at line 71 of file GPUClusterInfoAndMomentsCalculator.h.

71{this, "MinRLateral", 4 * CLHEP::cm, "The minimal r in the definition of the Lateral moment"};

◆ m_options

ClusterMomentsCalculator::CMCOptionsHolder GPUClusterInfoAndMomentsCalculator::m_options
private

Options for the algorithm, held in a GPU-friendly way.

Definition at line 112 of file GPUClusterInfoAndMomentsCalculator.h.

◆ m_skipInvalidClusters

Gaudi::Property<bool> GPUClusterInfoAndMomentsCalculator::m_skipInvalidClusters {this, "SkipInvalidClusters", true, "Check for and skip invalid clusters during moments calculation."}
private

If false, do the moment calculation even for invalid clusters (which may waste computation).

Defaults to true.

Definition at line 108 of file GPUClusterInfoAndMomentsCalculator.h.

108{this, "SkipInvalidClusters", true, "Check for and skip invalid clusters during moments calculation."};

◆ m_timeFileName

Gaudi::Property<std::string> CaloGPUTimed::m_timeFileName
protectedinherited

File to which times should be saved.

Definition at line 50 of file CaloGPUTimed.h.

◆ m_timeMutex

std::shared_mutex CaloGPUTimed::m_timeMutex
mutableprotectedinherited

Mutex that is locked when recording times.

Definition at line 32 of file CaloGPUTimed.h.

◆ m_twoGaussianNoise

Gaudi::Property<bool> GPUClusterInfoAndMomentsCalculator::m_twoGaussianNoise {this, "TwoGaussianNoise", false, "If set to true use 2-gaussian noise description for TileCal"}
private

if set to true use 2-gaussian noise description for TileCal

Definition at line 103 of file GPUClusterInfoAndMomentsCalculator.h.

103{this, "TwoGaussianNoise", false, "If set to true use 2-gaussian noise description for TileCal"};

The documentation for this class was generated from the following files: