LDMX Software
ldmx::HcalGeometry Class Reference

Implementation of HCal strip readout. More...

#include <HcalGeometry.h>

Public Types

enum class  ScintillatorOrientation { horizontal = 0 , vertical = 1 , depth = 2 }
 Encodes the orientation of a bar. More...
 

Public Member Functions

 ~HcalGeometry ()=default
 Class destructor.
 
ScintillatorOrientation getScintillatorOrientation (const ldmx::HcalID id) const
 
ROOT::Math::XYZVector getStripCenterPosition (ldmx::HcalID id) const
 Get a strip center position from a combined hcal ID.
 
std::map< ldmx::HcalID, ROOT::Math::XYZVector > getStripPositionMap () const
 Get the strip position map.
 
bool backLayerIsHorizontal (const int layer) const
 Check whether a given layer corresponds to a horizontal (scintillator length along the x-axis) or vertical layer in the back HCal.
 
double getHalfTotalWidth (int isection, int layer=1) const
 Get the half total width of a layer for a given section(strip) for back(side) Hcal.
 
double getScintillatorLength (ldmx::HcalID id) const
 Get the length of a scintillator bar.
 
double getScintillatorWidth () const
 Get the scitillator width.
 
double getScintillatorThickness () const
 Get the scitillator thickness.
 
int getNumSections () const
 Get the number of sections.
 
int getNumLayers (int isection) const
 Get the number of layers for that section.
 
int getNumStrips (int isection, int layer=1) const
 Get the number of strips per layer for that section and layer.
 
int getZeroStrip (int isection, int layer=1) const
 Get the location of the zeroStrip in a given section and layer.
 
double getEcalDx () const
 Get the length of the Ecal in (x) for the side Hcal.
 
double getEcalDy () const
 Get the length of the Ecal in (y) for the side Hcal.
 
bool hasSide3DReadout () const
 Does the Side Hcal have 3D readout?
 
bool isPrototype () const
 
std::vector< double > rotateGlobalToLocalBarPosition (const std::vector< double > &globalPosition, const ldmx::HcalID &id) const
 Coordinates that are given by Geant4 are typically global.
 
- Public Member Functions inherited from framework::ConditionsObject
 ConditionsObject (const std::string &name)
 Class constructor.
 
virtual ~ConditionsObject ()
 Destructor.
 
std::string getName () const
 Get the name of this object.
 

Static Public Attributes

static constexpr const char * CONDITIONS_OBJECT_NAME {"HcalGeometry"}
 Conditions object: The name of the python configuration calling this class (Hcal/python/HcalGeometry.py) needs to match the CONDITIONS_OBJECT_NAME exactly.
 

Private Member Functions

 HcalGeometry (const framework::config::Parameters &ps)
 Class constructor, for use only by the provider.
 
void buildStripPositionMap ()
 Map builder of HcalID and position.
 
void printPositionMap (int section) const
 Debugging utility, prints out the HcalID and corresponding value of all entries in the strip_position_map_ for a given section.
 
void printPositionMap () const
 Debugging utility, prints out the HcalID and corresponding value of all entries in the strip_position_map_.
 

Private Attributes

int verbose_ {0}
 Parameters that apply to all types of geometries Verbosity, not configurable but helpful if developing.
 
double scint_thickness_
 Thickness of scintillator.
 
double scint_width_
 Width of Scintillator Strip [mm].
 
std::vector< double > zero_layer_
 Front of HCal relative to world geometry for each section [mm].
 
std::vector< double > layer_thickness_
 Thickness of the layers in each section [mm].
 
std::vector< int > num_layers_
 Number of layers in each section.
 
int num_sections_
 Number of sections.
 
double ecal_dx_
 Lenght of the Ecal (in x and y)
 
double ecal_dy_
 
double y_offset_
 
int back_horizontal_parity_ {}
 
int side_3d_readout_ {}
 
std::vector< std::vector< int > > num_strips_
 Number of strips per layer in each section and each layer.
 
std::vector< std::vector< double > > zero_strip_
 The plane of the zero'th strip of each section [mm].
 
std::vector< std::vector< double > > half_total_width_
 Half Total Width of Strips [mm].
 
std::vector< std::vector< double > > scint_length_
 Length of strips [mm].
 
bool is_prototype_ {}
 
std::map< ldmx::HcalID, ROOT::Math::XYZVector > strip_position_map_
 Map of the HcalID position of strip centers relative to world geometry.
 

Friends

class hcal::HcalGeometryProvider
 

Detailed Description

Implementation of HCal strip readout.

Definition at line 34 of file HcalGeometry.h.

Member Enumeration Documentation

◆ ScintillatorOrientation

Encodes the orientation of a bar.

horizontal : The length of the bar is along the x-axis vertical : The length of the bar is along the y-axis depth : The length of the bar is along the z-axis

Definition at line 50 of file HcalGeometry.h.

50 {
51 horizontal = 0,
52 vertical = 1,
53 depth = 2
54 };

Constructor & Destructor Documentation

◆ ~HcalGeometry()

ldmx::HcalGeometry::~HcalGeometry ( )
default

Class destructor.

Does nothing because the stl containers clean up automatically.

◆ HcalGeometry()

ldmx::HcalGeometry::HcalGeometry ( const framework::config::Parameters & ps)
private

Class constructor, for use only by the provider.

Parameters
psParameters to configure the HcalGeometry

Definition at line 11 of file HcalGeometry.cxx.

13 scint_thickness_ = ps.get<double>("scint_thickness");
14 scint_width_ = ps.get<double>("scint_width");
15 zero_layer_ = ps.get<std::vector<double>>("zero_layer");
16 layer_thickness_ = ps.get<std::vector<double>>("layer_thickness");
17 num_layers_ = ps.get<std::vector<int>>("num_layers");
18 num_sections_ = ps.get<int>("num_sections");
19 ecal_dx_ = ps.get<double>("ecal_dx");
20 ecal_dy_ = ps.get<double>("ecal_dy");
21 verbose_ = ps.get<int>("verbose");
22 back_horizontal_parity_ = ps.get<int>("back_horizontal_parity");
23 side_3d_readout_ = ps.get<int>("side_3d_readout");
24 y_offset_ = ps.get<double>("y_offset");
25
26 auto detectors_valid = ps.get<std::vector<std::string>>("detectors_valid");
27 // If one of the strings in detectors_valid is "ldmx-hcal-prototype", we
28 // will use prototype geometry initialization
29 is_prototype_ = std::find_if(detectors_valid.cbegin(), detectors_valid.cend(),
30 [](const auto detector) {
31 return detector.find("ldmx-hcal-prototype") !=
32 std::string::npos;
33 }) != detectors_valid.cend();
34
35 num_strips_ = ps.get<std::vector<std::vector<int>>>("num_strips");
37 ps.get<std::vector<std::vector<double>>>("half_total_width");
38 zero_strip_ = ps.get<std::vector<std::vector<double>>>("zero_strip");
39 scint_length_ = ps.get<std::vector<std::vector<double>>>("scint_length");
40
42
43 if (verbose_ > 0) {
45 }
46}
Base class for all conditions objects, very simple.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
std::vector< double > layer_thickness_
Thickness of the layers in each section [mm].
std::vector< double > zero_layer_
Front of HCal relative to world geometry for each section [mm].
double ecal_dx_
Lenght of the Ecal (in x and y)
void buildStripPositionMap()
Map builder of HcalID and position.
std::vector< std::vector< double > > zero_strip_
The plane of the zero'th strip of each section [mm].
static constexpr const char * CONDITIONS_OBJECT_NAME
Conditions object: The name of the python configuration calling this class (Hcal/python/HcalGeometry....
void printPositionMap() const
Debugging utility, prints out the HcalID and corresponding value of all entries in the strip_position...
std::vector< std::vector< double > > scint_length_
Length of strips [mm].
int verbose_
Parameters that apply to all types of geometries Verbosity, not configurable but helpful if developin...
std::vector< std::vector< double > > half_total_width_
Half Total Width of Strips [mm].
double scint_width_
Width of Scintillator Strip [mm].
double scint_thickness_
Thickness of scintillator.
std::vector< int > num_layers_
Number of layers in each section.
std::vector< std::vector< int > > num_strips_
Number of strips per layer in each section and each layer.
int num_sections_
Number of sections.

References buildStripPositionMap(), ecal_dx_, framework::config::Parameters::get(), half_total_width_, layer_thickness_, num_layers_, num_sections_, num_strips_, printPositionMap(), scint_length_, scint_thickness_, scint_width_, verbose_, zero_layer_, and zero_strip_.

Member Function Documentation

◆ backLayerIsHorizontal()

bool ldmx::HcalGeometry::backLayerIsHorizontal ( const int layer) const
inline

Check whether a given layer corresponds to a horizontal (scintillator length along the x-axis) or vertical layer in the back HCal.

See the back_horizontal_parity_ member for details.

Definition at line 90 of file HcalGeometry.h.

90 {
91 return layer % 2 == back_horizontal_parity_;
92 }

◆ buildStripPositionMap()

void ldmx::HcalGeometry::buildStripPositionMap ( )
private

Map builder of HcalID and position.

To build the map we loop over the number of Hcal sections, layers and strips. The Hcal sections range from 0 to 4. (We hard-code the number of sections as seen in HcalID) The Hcal layers range from 1 to NumLayers_[section]. The Hcal strips range from 0 to NumStrips_[section].

Odd layers have horizontal strips. Even layers have vertical strips.

For back Hcal:

  • layers in z
  • strips occupy thickness of scintillator in z (e.g. 20mm)
  • strips orientation is in x(y) depending on back_horizontal parity

Now compute, y(x) position for horizontal(vertical) layers, relative to the center of detector. Strips enumeration starts from -y(-x) stripcenter will be large for +y(+x) and the half width of the strip needs to be subtracted The halfwidth of the scintillator is given by half_total_width_. The x(y) position is set to the center of the strip (0).

For side Hcal before 3D readout

  • layers in y(x)
  • all layers have strips in x(y) for top-bottom (left-right) sections
  • all layers have strips occupying width of scintillator in z (e.g. 50mm)

Definition at line 169 of file HcalGeometry.cxx.

169 {
170 // We hard-code the number of sections as seen in HcalID
171 for (unsigned int section = 0; section < num_sections_; section++) {
172 for (unsigned int layer = 1; layer <= num_layers_[section]; layer++) {
173 for (unsigned int strip = 0; strip < getNumStrips(section, layer);
174 strip++) {
175 // initialize values
176 double x{-99999}, y{-99999}, z{-99999};
177
178 // get hcal section
179 ldmx::HcalID::HcalSection hcalsection =
181
182 const ldmx::HcalID id{section, layer, strip};
183 const auto orientation{getScintillatorOrientation(id)};
184 // the center of a layer: (layer-1) * (layer_thickness) +
185 // scint_thickness/2
186 double layercenter =
187 (layer - 1) * layer_thickness_.at(section) + 0.5 * scint_thickness_;
188
189 // the center of a strip: (strip + 0.5) * (strip_dx)
190 double stripcenter = (strip + 0.5) * scint_width_;
191
192 if (hcalsection == ldmx::HcalID::HcalSection::BACK) {
200 // z position: zero-layer(z) + layer_z + scint_thickness / 2
201 z = zero_layer_.at(section) + layercenter;
202
211 if (orientation == ScintillatorOrientation::horizontal) {
212 y = stripcenter - getZeroStrip(section, layer);
213 x = 0;
214 } else {
215 x = stripcenter - getZeroStrip(section, layer);
216 y = 0;
217 }
218 } else {
219 if (side_3d_readout_) {
220 /*
221 *
222 * For 3D readout:
223 * - odd layers have strips in z
224 * - even layers have strips in x(y) for top-bottom (left-right)
225 * sections
226 * - odd layers have strips occupying width of scintillator in x(y)
227 * - even layers have strips occupying width of scintillator in z
228 *
229 */
230 switch (hcalsection) {
231 case ldmx::HcalID::HcalSection::BACK:
232 // Handled earlier in the code!
233 case ldmx::HcalID::HcalSection::LEFT:
234 case ldmx::HcalID::HcalSection::RIGHT:
235 if (orientation == ScintillatorOrientation::vertical) {
236 x = zero_layer_[section] + 0.5 * scint_thickness_ +
237 (layer - 1) * layer_thickness_[section];
238 y = ecal_dy_ -
239 (getScintillatorLength({id.section(), 2, id.strip()}) -
241 2;
242 z = getZeroStrip(section, layer) +
243 (strip + 0.5) * getScintillatorWidth();
244 } else if (orientation == ScintillatorOrientation::depth) {
245 x = zero_layer_[section] + 0.5 * scint_thickness_ +
246 layer_thickness_[section] * (layer - 1);
247 y = -ecal_dy_ / 2 + (strip + 0.5) * getScintillatorWidth();
248 z = getZeroStrip(section, layer + 1) +
249 getScintillatorLength(id) / 2;
250 }
251 if (section == ldmx::HcalID::HcalSection::LEFT) {
252 y *= -1;
253 x *= -1;
254 }
255 break;
256
257 case ldmx::HcalID::HcalSection::BOTTOM:
258 case ldmx::HcalID::HcalSection::TOP:
259 if (orientation == ScintillatorOrientation::horizontal) {
260 //
261 // Second half of the expression is the difference between the
262 // longest strips (first module) and the current module.
263 //
264 // 22 mm extra for space for 1 absorber and one air box
265 x = -ecal_dx_ / 2 - 2 - 20 +
266 (getScintillatorLength({id.section(), 2, id.strip()}) -
268 2;
269 y = zero_layer_[section] + 0.5 * scint_thickness_ +
270 (layer - 1) * layer_thickness_[section];
271 z = getZeroStrip(section, layer) +
272 (strip + 0.5) * getScintillatorWidth();
273 }
274 if (orientation == ScintillatorOrientation::depth) {
275 x = (ecal_dx_ / 2) - (strip + 0.5) * getScintillatorWidth();
276 y = zero_layer_[section] + 0.5 * scint_thickness_ +
277 layer_thickness_[section] * (layer - 1);
278 z = getZeroStrip(section, layer + 1) +
279 getScintillatorLength(id) / 2;
280 }
281 if (section == ldmx::HcalID::HcalSection::BOTTOM) {
282 y *= -1;
283 x *= -1;
284 }
285 break;
286 }
287
288 } else {
298 // z position: zero-strip(z) + strip_center(z)
299 z = getZeroStrip(section, layer) + stripcenter;
300 if (hcalsection == ldmx::HcalID::HcalSection::TOP or
301 hcalsection == ldmx::HcalID::HcalSection::BOTTOM) {
302 y = zero_layer_.at(section) + layercenter;
303 x = getHalfTotalWidth(section, layer);
304 if (hcalsection == ldmx::HcalID::HcalSection::BOTTOM) {
305 y *= -1;
306 x *= -1;
307 }
308
309 } else {
310 x = zero_layer_.at(section) + layercenter;
311 y = getHalfTotalWidth(section, layer);
312 if (hcalsection == ldmx::HcalID::HcalSection::RIGHT) {
313 x *= -1;
314 y *= -1;
315 }
316 }
317 }
318 }
319
320 y += y_offset_;
321 ROOT::Math::XYZVector pos;
322 pos.SetXYZ(x, y, z);
323 strip_position_map_[ldmx::HcalID(section, layer, strip)] = pos;
324 } // loop over strips
325 } // loop over layers
326 } // loop over sections
327} // strip position map
std::map< ldmx::HcalID, ROOT::Math::XYZVector > strip_position_map_
Map of the HcalID position of strip centers relative to world geometry.
int getZeroStrip(int isection, int layer=1) const
Get the location of the zeroStrip in a given section and layer.
double getScintillatorLength(ldmx::HcalID id) const
Get the length of a scintillator bar.
double getScintillatorWidth() const
Get the scitillator width.
int getNumStrips(int isection, int layer=1) const
Get the number of strips per layer for that section and layer.
double getHalfTotalWidth(int isection, int layer=1) const
Get the half total width of a layer for a given section(strip) for back(side) Hcal.
Implements detector ids for HCal subdetector.
Definition HcalID.h:19
HcalSection
Encodes the section of the HCal based on the 'section' field value.
Definition HcalID.h:24

References ecal_dx_, getHalfTotalWidth(), getNumStrips(), getScintillatorLength(), getScintillatorWidth(), getZeroStrip(), layer_thickness_, num_layers_, num_sections_, scint_thickness_, scint_width_, strip_position_map_, and zero_layer_.

Referenced by HcalGeometry().

◆ getEcalDx()

double ldmx::HcalGeometry::getEcalDx ( ) const
inline

Get the length of the Ecal in (x) for the side Hcal.

Definition at line 153 of file HcalGeometry.h.

153{ return ecal_dx_; }

References ecal_dx_.

◆ getEcalDy()

double ldmx::HcalGeometry::getEcalDy ( ) const
inline

Get the length of the Ecal in (y) for the side Hcal.

Definition at line 158 of file HcalGeometry.h.

158{ return ecal_dy_; }

◆ getHalfTotalWidth()

double ldmx::HcalGeometry::getHalfTotalWidth ( int isection,
int layer = 1 ) const
inline

Get the half total width of a layer for a given section(strip) for back(side) Hcal.

Parameters
section
layer
Returns
half total width [mm]

Definition at line 100 of file HcalGeometry.h.

100 {
101 // Layer numbering starts at 1, but a vector is zero-indexed
102 auto layer_index = layer - 1;
103 return half_total_width_.at(isection).at(layer_index);
104 }

References half_total_width_.

Referenced by buildStripPositionMap().

◆ getNumLayers()

int ldmx::HcalGeometry::getNumLayers ( int isection) const
inline

Get the number of layers for that section.

Definition at line 132 of file HcalGeometry.h.

132{ return num_layers_.at(isection); }

References num_layers_.

◆ getNumSections()

int ldmx::HcalGeometry::getNumSections ( ) const
inline

Get the number of sections.

Definition at line 127 of file HcalGeometry.h.

127{ return num_sections_; }

References num_sections_.

◆ getNumStrips()

int ldmx::HcalGeometry::getNumStrips ( int isection,
int layer = 1 ) const
inline

Get the number of strips per layer for that section and layer.

Definition at line 137 of file HcalGeometry.h.

137 {
138 auto layer_index = layer - 1;
139 return num_strips_.at(isection).at(layer_index);
140 }

References num_strips_.

Referenced by buildStripPositionMap(), and printPositionMap().

◆ getScintillatorLength()

double ldmx::HcalGeometry::getScintillatorLength ( ldmx::HcalID id) const
inline

Get the length of a scintillator bar.

Parameters
idThe HcalID of the bar
Returns
The length of the bar with ID id [mm]

Definition at line 111 of file HcalGeometry.h.

111 {
112 return scint_length_.at(id.section()).at(id.layer() - 1);
113 }

References scint_length_.

Referenced by buildStripPositionMap().

◆ getScintillatorOrientation()

HcalGeometry::ScintillatorOrientation ldmx::HcalGeometry::getScintillatorOrientation ( const ldmx::HcalID id) const

Definition at line 98 of file HcalGeometry.cxx.

99 {
100 if (hasSide3DReadout()) {
101 // v14 or later detector
102 switch (id.section()) {
103 case ldmx::HcalID::HcalSection::TOP:
104 case ldmx::HcalID::HcalSection::BOTTOM:
105 // Odd layers are in z/depth direction, even are in the x/horizontal
106 // direction
107 return id.layer() % 2 == 0 ? ScintillatorOrientation::horizontal
108 : ScintillatorOrientation::depth;
109
110 case ldmx::HcalID::HcalSection::LEFT:
111 case ldmx::HcalID::HcalSection::RIGHT:
112 // Odd layers are in the z/depth direction, even are in the y/vertical
113 // direction
114 return id.layer() % 2 == 0 ? ScintillatorOrientation::vertical
115 : ScintillatorOrientation::depth;
116 case ldmx::HcalID::HcalSection::BACK:
117 // Configurable
118 return id.layer() % 2 == back_horizontal_parity_
119 ? ScintillatorOrientation::horizontal
120 : ScintillatorOrientation::vertical;
121 } // V14 or later detector
122 }
123 if (isPrototype()) {
124 // The prototype only has the back section. However, the orientation
125 // depends on the configuration so we delegate to the
126 // back_horizontal_parity parameter
127 return id.layer() % 2 == back_horizontal_parity_
128 ? ScintillatorOrientation::horizontal
129 : ScintillatorOrientation::vertical;
130 } // Prototype detector
131 // v13/v12
132 switch (id.section()) {
133 // For the v13 side hcal, the bars in each section have the same
134 // orientation
135 case ldmx::HcalID::HcalSection::TOP:
136 case ldmx::HcalID::HcalSection::BOTTOM:
137 return ScintillatorOrientation::horizontal;
138 case ldmx::HcalID::HcalSection::LEFT:
139 case ldmx::HcalID::HcalSection::RIGHT:
140 return ScintillatorOrientation::vertical;
141 case ldmx::HcalID::HcalSection::BACK:
142 // Configurable
143 return id.layer() % 2 == back_horizontal_parity_
144 ? ScintillatorOrientation::horizontal
145 : ScintillatorOrientation::vertical;
146 } // v13/v12 detector
147 // Can only reach this part if we somehow didn't match any of the options
148 // above. This could happen if someone introduces a new geometry but doesn't
149 // patch this part.
150 EXCEPTION_RAISE("InvalidRotation",
151 "Attempted to rotate into an invalid "
152 "orientation for a scintillator bar!");
153}
bool hasSide3DReadout() const
Does the Side Hcal have 3D readout?

◆ getScintillatorThickness()

double ldmx::HcalGeometry::getScintillatorThickness ( ) const
inline

Get the scitillator thickness.

Definition at line 122 of file HcalGeometry.h.

122{ return scint_thickness_; }

References scint_thickness_.

◆ getScintillatorWidth()

double ldmx::HcalGeometry::getScintillatorWidth ( ) const
inline

Get the scitillator width.

Definition at line 117 of file HcalGeometry.h.

117{ return scint_width_; }

References scint_width_.

Referenced by buildStripPositionMap().

◆ getStripCenterPosition()

ROOT::Math::XYZVector ldmx::HcalGeometry::getStripCenterPosition ( ldmx::HcalID id) const
inline

Get a strip center position from a combined hcal ID.

Exceptions
std::out_of_rangeif HcalID is not on map.
Parameters
HcalID
Returns
A ROOT::Math::XYZVector with the X, Y and Z position of the center of the bar.

Definition at line 75 of file HcalGeometry.h.

75 {
76 return strip_position_map_.at(id);
77 }

References strip_position_map_.

Referenced by printPositionMap().

◆ getStripPositionMap()

std::map< ldmx::HcalID, ROOT::Math::XYZVector > ldmx::HcalGeometry::getStripPositionMap ( ) const
inline

Get the strip position map.

Definition at line 82 of file HcalGeometry.h.

82 {
84 }

References strip_position_map_.

◆ getZeroStrip()

int ldmx::HcalGeometry::getZeroStrip ( int isection,
int layer = 1 ) const
inline

Get the location of the zeroStrip in a given section and layer.

Definition at line 145 of file HcalGeometry.h.

145 {
146 auto layer_index = layer - 1;
147 return zero_strip_.at(isection).at(layer_index);
148 }

References zero_strip_.

Referenced by buildStripPositionMap().

◆ hasSide3DReadout()

bool ldmx::HcalGeometry::hasSide3DReadout ( ) const
inline

Does the Side Hcal have 3D readout?

In other words, does the side hcal layers alter in scintillator direction (z vs x/y).

Definition at line 166 of file HcalGeometry.h.

166{ return side_3d_readout_; }

◆ isPrototype()

bool ldmx::HcalGeometry::isPrototype ( ) const
inline

Definition at line 172 of file HcalGeometry.h.

172{ return is_prototype_; }

◆ printPositionMap() [1/2]

void ldmx::HcalGeometry::printPositionMap ( ) const
inlineprivate

Debugging utility, prints out the HcalID and corresponding value of all entries in the strip_position_map_.

For printing only one of the sections, see the overloaded version of this function taking a section parameter.

Definition at line 232 of file HcalGeometry.h.

232 {
233 for (int section = 0; section < num_sections_; ++section) {
234 printPositionMap(section);
235 }
236 }

References num_sections_, and printPositionMap().

Referenced by HcalGeometry(), and printPositionMap().

◆ printPositionMap() [2/2]

void ldmx::HcalGeometry::printPositionMap ( int section) const
private

Debugging utility, prints out the HcalID and corresponding value of all entries in the strip_position_map_ for a given section.

Parameters
sectionThe section number to print, see HcalID for details.

Definition at line 154 of file HcalGeometry.cxx.

154 {
155 // Note that layer numbering starts at 1 rather than 0
156 for (int layer = 1; layer <= num_layers_[section]; ++layer) {
157 for (int strip = 0; strip < getNumStrips(section, layer); ++strip) {
158 HcalID id(section, layer, strip);
159 auto center_position = getStripCenterPosition(id);
160 auto x = center_position.X();
161 auto y = center_position.Y();
162 auto z = center_position.Z();
163 std::cout << id << ": Center position: (" << x << ", " << y << ", " << z
164 << ")\n";
165 }
166 }
167}
ROOT::Math::XYZVector getStripCenterPosition(ldmx::HcalID id) const
Get a strip center position from a combined hcal ID.

References getNumStrips(), getStripCenterPosition(), and num_layers_.

◆ rotateGlobalToLocalBarPosition()

std::vector< double > ldmx::HcalGeometry::rotateGlobalToLocalBarPosition ( const std::vector< double > & globalPosition,
const ldmx::HcalID & id ) const

Coordinates that are given by Geant4 are typically global.

These can be transformed into corresponding local coordinates of a volume with a TopTransform. However, a TopTransform translates to the local bar but does not do the rotation (this is because we don't do a rotation when placing the bars in the GDML). This is used primarily for recording pre and post step positions in local coordinates of the volume in HcalSD.

the logic below does the rotation to the local coordiates where x : short transverse side of bar y : long transverse side of bar z : along length of bar

Note
This logic only applies to the v14 and prototype detector; however, support for v12 is not broken because no studies using these pre/post step positions have been (or should be) done with the v12 detector. /
: The native position type in Geant4 is typically a G4ThreeVector, which is a typedef for a CLHEP::Hep3Vector. However, DetDescr currently does not have a dependency on Geant4/CLHEP so we are taking the position as a vector of floats (which is what is used by SimCalorimeterHit)

Definition at line 47 of file HcalGeometry.cxx.

48 {
49 const auto orientation{getScintillatorOrientation(id)};
50 switch (id.section()) {
51 case ldmx::HcalID::HcalSection::BACK:
52 switch (orientation) {
53 case ScintillatorOrientation::horizontal:
54 return {globalPosition[2], globalPosition[1], globalPosition[0]};
55 case ScintillatorOrientation::vertical:
56 return {globalPosition[2], globalPosition[0], globalPosition[1]};
57 default: // Should not be possible with current geometries
58 EXCEPTION_RAISE("InvalidRotation",
59 "Attempted to rotate into an invalid "
60 "orientation for a scintillator bar!");
61 }
62 case ldmx::HcalID::HcalSection::TOP:
63 [[fallthrough]];
64 case ldmx::HcalID::HcalSection::BOTTOM:
65 switch (orientation) {
66 case ScintillatorOrientation::horizontal:
67 return {globalPosition[1], globalPosition[2], globalPosition[0]};
68 case ScintillatorOrientation::depth:
69 return {globalPosition[1], globalPosition[0], globalPosition[2]};
70 default: // Should not be possible with current geometries
71 EXCEPTION_RAISE("InvalidRotation",
72 "Attempted to rotate into an invalid "
73 "orientation for a scintillator bar!");
74 }
75 case ldmx::HcalID::HcalSection::LEFT:
76 [[fallthrough]];
77 case ldmx::HcalID::HcalSection::RIGHT:
78 switch (orientation) {
79 case ScintillatorOrientation::vertical:
80 return {globalPosition[0], globalPosition[2], globalPosition[1]};
81 case ScintillatorOrientation::depth:
82 return globalPosition;
83 default: // Should not be possible with current geometries
84 EXCEPTION_RAISE("InvalidRotation",
85 "Attempted to rotate into an invalid "
86 "orientation for a scintillator bar!");
87 }
88 default:
89 // Can only reach this part if we somehow didn't match any of the options
90 // above. This could happen if someone introduces a new geometry but
91 // doesn't patch this part.
92 EXCEPTION_RAISE("InvalidRotation",
93 "Attempted to rotate into an invalid "
94 "orientation for a scintillator bar!");
95 }
96}

Friends And Related Symbol Documentation

◆ hcal::HcalGeometryProvider

friend class hcal::HcalGeometryProvider
friend

Definition at line 206 of file HcalGeometry.h.

Member Data Documentation

◆ back_horizontal_parity_

int ldmx::HcalGeometry::back_horizontal_parity_ {}
private

Definition at line 271 of file HcalGeometry.h.

271{};

◆ CONDITIONS_OBJECT_NAME

const char* ldmx::HcalGeometry::CONDITIONS_OBJECT_NAME {"HcalGeometry"}
staticconstexpr

Conditions object: The name of the python configuration calling this class (Hcal/python/HcalGeometry.py) needs to match the CONDITIONS_OBJECT_NAME exactly.

Definition at line 42 of file HcalGeometry.h.

42{"HcalGeometry"};

Referenced by simcore::HcalSD::decodeCopyNumber(), hcal::HcalTriggerGeometryProvider::getCondition(), simcore::HcalSD::ProcessHits(), hcal::HcalClusterProducer::produce(), hcal::HcalDigiProducer::produce(), hcal::HcalDoubleEndRecProducer::produce(), hcal::HcalRecProducer::produce(), hcal::HcalSimpleDigiAndRecProducer::produce(), and hcal::HcalSingleEndRecProducer::produce().

◆ ecal_dx_

double ldmx::HcalGeometry::ecal_dx_
private

Lenght of the Ecal (in x and y)

Definition at line 262 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), getEcalDx(), and HcalGeometry().

◆ ecal_dy_

double ldmx::HcalGeometry::ecal_dy_
private

Definition at line 263 of file HcalGeometry.h.

◆ half_total_width_

std::vector<std::vector<double> > ldmx::HcalGeometry::half_total_width_
private

Half Total Width of Strips [mm].

Definition at line 281 of file HcalGeometry.h.

Referenced by getHalfTotalWidth(), and HcalGeometry().

◆ is_prototype_

bool ldmx::HcalGeometry::is_prototype_ {}
private

Definition at line 285 of file HcalGeometry.h.

285{};

◆ layer_thickness_

std::vector<double> ldmx::HcalGeometry::layer_thickness_
private

Thickness of the layers in each section [mm].

Definition at line 253 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), and HcalGeometry().

◆ num_layers_

std::vector<int> ldmx::HcalGeometry::num_layers_
private

Number of layers in each section.

Definition at line 256 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), getNumLayers(), HcalGeometry(), and printPositionMap().

◆ num_sections_

int ldmx::HcalGeometry::num_sections_
private

Number of sections.

Definition at line 259 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), getNumSections(), HcalGeometry(), and printPositionMap().

◆ num_strips_

std::vector<std::vector<int> > ldmx::HcalGeometry::num_strips_
private

Number of strips per layer in each section and each layer.

Definition at line 277 of file HcalGeometry.h.

Referenced by getNumStrips(), and HcalGeometry().

◆ scint_length_

std::vector<std::vector<double> > ldmx::HcalGeometry::scint_length_
private

Length of strips [mm].

Definition at line 283 of file HcalGeometry.h.

Referenced by getScintillatorLength(), and HcalGeometry().

◆ scint_thickness_

double ldmx::HcalGeometry::scint_thickness_
private

Thickness of scintillator.

Definition at line 244 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), getScintillatorThickness(), and HcalGeometry().

◆ scint_width_

double ldmx::HcalGeometry::scint_width_
private

Width of Scintillator Strip [mm].

Definition at line 247 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), getScintillatorWidth(), and HcalGeometry().

◆ side_3d_readout_

int ldmx::HcalGeometry::side_3d_readout_ {}
private

Definition at line 274 of file HcalGeometry.h.

274{};

◆ strip_position_map_

std::map<ldmx::HcalID, ROOT::Math::XYZVector> ldmx::HcalGeometry::strip_position_map_
private

Map of the HcalID position of strip centers relative to world geometry.

The map is not configurable and is calculated by buildStripPositionMap().

Definition at line 291 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), getStripCenterPosition(), and getStripPositionMap().

◆ verbose_

int ldmx::HcalGeometry::verbose_ {0}
private

Parameters that apply to all types of geometries Verbosity, not configurable but helpful if developing.

Definition at line 241 of file HcalGeometry.h.

241{0};

Referenced by HcalGeometry().

◆ y_offset_

double ldmx::HcalGeometry::y_offset_
private

Definition at line 266 of file HcalGeometry.h.

◆ zero_layer_

std::vector<double> ldmx::HcalGeometry::zero_layer_
private

Front of HCal relative to world geometry for each section [mm].

Definition at line 250 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), and HcalGeometry().

◆ zero_strip_

std::vector<std::vector<double> > ldmx::HcalGeometry::zero_strip_
private

The plane of the zero'th strip of each section [mm].

Definition at line 279 of file HcalGeometry.h.

Referenced by getZeroStrip(), and HcalGeometry().


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