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
 
bool hasExplicitLayout () const
 Are the strip positions given layer by layer (e.g.
 
bool isDoubleEnded (int isection) const
 Are the bars of this section read out at both ends?
 
double getDistanceAlongBar (ldmx::HcalID id, double x, double y, double z) const
 Signed distance along the bar from the strip center [mm].
 
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 {"hcal_geometry"}
 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::vector< std::vector< double > > layer_z_
 Explicit layout: world z of each layer center [mm].
 
std::vector< std::vector< int > > layer_long_axis_
 Explicit layout: 0 = bar long along x, 1 = along y.
 
std::vector< std::vector< double > > layer_bar_center_
 Explicit layout: world along-bar coordinate of the bar centers [mm].
 
std::vector< std::vector< double > > layer_strip_zero_
 Explicit layout: world transverse coordinate of strip 0 [mm].
 
std::vector< int > double_ended_
 Explicit layout: section read out at both ends.
 
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 33 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 49 of file HcalGeometry.h.

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

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 12 of file HcalGeometry.cxx.

14 scint_thickness_ = ps.get<double>("scint_thickness");
15 scint_width_ = ps.get<double>("scint_width");
16 zero_layer_ = ps.get<std::vector<double>>("zero_layer");
17 layer_thickness_ = ps.get<std::vector<double>>("layer_thickness");
18 num_layers_ = ps.get<std::vector<int>>("num_layers");
19 num_sections_ = ps.get<int>("num_sections");
20 ecal_dx_ = ps.get<double>("ecal_dx");
21 ecal_dy_ = ps.get<double>("ecal_dy");
22 verbose_ = ps.get<int>("verbose");
23 back_horizontal_parity_ = ps.get<int>("back_horizontal_parity");
24 side_3d_readout_ = ps.get<int>("side_3d_readout");
25 y_offset_ = ps.get<double>("y_offset");
26
27 auto detectors_valid = ps.get<std::vector<std::string>>("detectors_valid");
28 // If one of the strings in detectors_valid is "ldmx-hcal-prototype", we
29 // will use prototype geometry initialization
30 is_prototype_ = std::find_if(detectors_valid.cbegin(), detectors_valid.cend(),
31 [](const auto detector) {
32 return detector.find("ldmx-hcal-prototype") !=
33 std::string::npos;
34 }) != detectors_valid.cend();
35
36 num_strips_ = ps.get<std::vector<std::vector<int>>>("num_strips");
38 ps.get<std::vector<std::vector<double>>>("half_total_width");
39 zero_strip_ = ps.get<std::vector<std::vector<double>>>("zero_strip");
40 scint_length_ = ps.get<std::vector<std::vector<double>>>("scint_length");
41
42 // optional explicit layout, empty for the LDMX and prototype geometries
43 layer_z_ = ps.get<std::vector<std::vector<double>>>("layer_z", {});
45 ps.get<std::vector<std::vector<int>>>("layer_long_axis", {});
47 ps.get<std::vector<std::vector<double>>>("layer_bar_center", {});
49 ps.get<std::vector<std::vector<double>>>("layer_strip_zero", {});
50 double_ended_ = ps.get<std::vector<int>>("double_ended", {});
51 if (hasExplicitLayout()) {
52 for (int section = 0; section < num_sections_; ++section) {
53 const auto n{static_cast<std::size_t>(num_layers_.at(section))};
54 if (layer_z_.at(section).size() != n ||
55 layer_long_axis_.at(section).size() != n ||
56 layer_bar_center_.at(section).size() != n ||
57 layer_strip_zero_.at(section).size() != n ||
58 double_ended_.size() != static_cast<std::size_t>(num_sections_)) {
59 EXCEPTION_RAISE(
60 "HcalGeometry",
61 "Explicit layout does not match num_layers in section " +
62 std::to_string(section));
63 }
64 }
65 }
66
68
69 if (verbose_ > 0) {
71 }
72}
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:75
std::vector< double > layer_thickness_
Thickness of the layers in each section [mm].
std::vector< int > double_ended_
Explicit layout: section read out at both ends.
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].
bool hasExplicitLayout() const
Are the strip positions given layer by layer (e.g.
static constexpr const char * CONDITIONS_OBJECT_NAME
Conditions object: The name of the python configuration calling this class (Hcal/python/HcalGeometry....
std::vector< std::vector< double > > layer_bar_center_
Explicit layout: world along-bar coordinate of the bar centers [mm].
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].
std::vector< std::vector< double > > layer_z_
Explicit layout: world z of each layer center [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< double > > layer_strip_zero_
Explicit layout: world transverse coordinate of strip 0 [mm].
std::vector< std::vector< int > > num_strips_
Number of strips per layer in each section and each layer.
std::vector< std::vector< int > > layer_long_axis_
Explicit layout: 0 = bar long along x, 1 = along y.
int num_sections_
Number of sections.

References buildStripPositionMap(), double_ended_, ecal_dx_, framework::config::Parameters::get(), half_total_width_, hasExplicitLayout(), layer_bar_center_, layer_long_axis_, layer_strip_zero_, layer_thickness_, layer_z_, 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 89 of file HcalGeometry.h.

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

◆ 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 218 of file HcalGeometry.cxx.

218 {
219 // We hard-code the number of sections as seen in HcalID
220 for (unsigned int section = 0; section < num_sections_; section++) {
221 for (unsigned int layer = 1; layer <= num_layers_[section]; layer++) {
222 for (unsigned int strip = 0; strip < getNumStrips(section, layer);
223 strip++) {
224 // initialize values
225 double x{-99999}, y{-99999}, z{-99999};
226
227 // get hcal section
228 ldmx::HcalID::HcalSection hcalsection =
230
231 const ldmx::HcalID id{section, layer, strip};
232 const auto orientation{getScintillatorOrientation(id)};
233 // the center of a layer: (layer-1) * (layer_thickness) +
234 // scint_thickness/2
235 double layercenter =
236 (layer - 1) * layer_thickness_.at(section) + 0.5 * scint_thickness_;
237
238 // the center of a strip: (strip + 0.5) * (strip_dx)
239 double stripcenter = (strip + 0.5) * scint_width_;
240
241 if (hasExplicitLayout()) {
242 const auto i_layer{layer - 1};
243 const double along{layer_bar_center_.at(section).at(i_layer)};
244 const double across{layer_strip_zero_.at(section).at(i_layer) +
245 strip * scint_width_};
246 if (orientation == ScintillatorOrientation::horizontal) {
247 x = along;
248 y = across;
249 } else {
250 x = across;
251 y = along;
252 }
253 z = layer_z_.at(section).at(i_layer);
254 } else if (hcalsection == ldmx::HcalID::HcalSection::BACK) {
262 // z position: zero-layer(z) + layer_z + scint_thickness / 2
263 z = zero_layer_.at(section) + layercenter;
264
273 if (orientation == ScintillatorOrientation::horizontal) {
274 y = stripcenter - getZeroStrip(section, layer);
275 x = 0;
276 } else {
277 x = stripcenter - getZeroStrip(section, layer);
278 y = 0;
279 }
280 } else {
281 if (side_3d_readout_) {
282 /*
283 *
284 * For 3D readout:
285 * - odd layers have strips in z
286 * - even layers have strips in x(y) for top-bottom (left-right)
287 * sections
288 * - odd layers have strips occupying width of scintillator in x(y)
289 * - even layers have strips occupying width of scintillator in z
290 *
291 */
292 switch (hcalsection) {
293 case ldmx::HcalID::HcalSection::BACK:
294 // Handled earlier in the code!
295 case ldmx::HcalID::HcalSection::LEFT:
296 case ldmx::HcalID::HcalSection::RIGHT:
297 if (orientation == ScintillatorOrientation::vertical) {
298 x = zero_layer_[section] + 0.5 * scint_thickness_ +
299 (layer - 1) * layer_thickness_[section];
300 y = ecal_dy_ -
301 (getScintillatorLength({id.section(), 2, id.strip()}) -
303 2;
304 z = getZeroStrip(section, layer) +
305 (strip + 0.5) * getScintillatorWidth();
306 } else if (orientation == ScintillatorOrientation::depth) {
307 x = zero_layer_[section] + 0.5 * scint_thickness_ +
308 layer_thickness_[section] * (layer - 1);
309 y = -ecal_dy_ / 2 + (strip + 0.5) * getScintillatorWidth();
310 z = getZeroStrip(section, layer + 1) +
311 getScintillatorLength(id) / 2;
312 }
313 if (section == ldmx::HcalID::HcalSection::LEFT) {
314 y *= -1;
315 x *= -1;
316 }
317 break;
318
319 case ldmx::HcalID::HcalSection::BOTTOM:
320 case ldmx::HcalID::HcalSection::TOP:
321 if (orientation == ScintillatorOrientation::horizontal) {
322 //
323 // Second half of the expression is the difference between the
324 // longest strips (first module) and the current module.
325 //
326 // 22 mm extra for space for 1 absorber and one air box
327 x = -ecal_dx_ / 2 - 2 - 20 +
328 (getScintillatorLength({id.section(), 2, id.strip()}) -
330 2;
331 y = zero_layer_[section] + 0.5 * scint_thickness_ +
332 (layer - 1) * layer_thickness_[section];
333 z = getZeroStrip(section, layer) +
334 (strip + 0.5) * getScintillatorWidth();
335 }
336 if (orientation == ScintillatorOrientation::depth) {
337 x = (ecal_dx_ / 2) - (strip + 0.5) * getScintillatorWidth();
338 y = zero_layer_[section] + 0.5 * scint_thickness_ +
339 layer_thickness_[section] * (layer - 1);
340 z = getZeroStrip(section, layer + 1) +
341 getScintillatorLength(id) / 2;
342 }
343 if (section == ldmx::HcalID::HcalSection::BOTTOM) {
344 y *= -1;
345 x *= -1;
346 }
347 break;
348 }
349
350 } else {
360 // z position: zero-strip(z) + strip_center(z)
361 z = getZeroStrip(section, layer) + stripcenter;
362 if (hcalsection == ldmx::HcalID::HcalSection::TOP or
363 hcalsection == ldmx::HcalID::HcalSection::BOTTOM) {
364 y = zero_layer_.at(section) + layercenter;
365 x = getHalfTotalWidth(section, layer);
366 if (hcalsection == ldmx::HcalID::HcalSection::BOTTOM) {
367 y *= -1;
368 x *= -1;
369 }
370
371 } else {
372 x = zero_layer_.at(section) + layercenter;
373 y = getHalfTotalWidth(section, layer);
374 if (hcalsection == ldmx::HcalID::HcalSection::RIGHT) {
375 x *= -1;
376 y *= -1;
377 }
378 }
379 }
380 }
381
382 y += y_offset_;
383 ROOT::Math::XYZVector pos;
384 pos.SetXYZ(x, y, z);
385 strip_position_map_[ldmx::HcalID(section, layer, strip)] = pos;
386 } // loop over strips
387 } // loop over layers
388 } // loop over sections
389} // 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(), hasExplicitLayout(), layer_bar_center_, layer_strip_zero_, layer_thickness_, layer_z_, num_layers_, num_sections_, scint_thickness_, scint_width_, strip_position_map_, and zero_layer_.

Referenced by HcalGeometry().

◆ getDistanceAlongBar()

double ldmx::HcalGeometry::getDistanceAlongBar ( ldmx::HcalID id,
double x,
double y,
double z ) const

Signed distance along the bar from the strip center [mm].

Parameters
idThe HcalID of the bar
x,y,zGlobal position

Definition at line 73 of file HcalGeometry.cxx.

74 {
75 const auto center{getStripCenterPosition(id)};
76 switch (getScintillatorOrientation(id)) {
77 case ScintillatorOrientation::horizontal:
78 return x - center.X();
79 case ScintillatorOrientation::vertical:
80 return y - center.Y();
81 default:
82 return z - center.Z();
83 }
84}
ROOT::Math::XYZVector getStripCenterPosition(ldmx::HcalID id) const
Get a strip center position from a combined hcal ID.

References getStripCenterPosition().

◆ getEcalDx()

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

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

Definition at line 152 of file HcalGeometry.h.

152{ 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 157 of file HcalGeometry.h.

157{ 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 99 of file HcalGeometry.h.

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

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 131 of file HcalGeometry.h.

131{ return num_layers_.at(isection); }

References num_layers_.

◆ getNumSections()

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

Get the number of sections.

Definition at line 126 of file HcalGeometry.h.

126{ 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 136 of file HcalGeometry.h.

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

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 110 of file HcalGeometry.h.

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

References scint_length_.

Referenced by buildStripPositionMap().

◆ getScintillatorOrientation()

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

Definition at line 142 of file HcalGeometry.cxx.

143 {
144 if (hasExplicitLayout()) {
145 return layer_long_axis_.at(id.section()).at(id.layer() - 1) == 0
146 ? ScintillatorOrientation::horizontal
147 : ScintillatorOrientation::vertical;
148 }
149 if (hasSide3DReadout()) {
150 // v14 or later detector
151 switch (id.section()) {
152 case ldmx::HcalID::HcalSection::TOP:
153 case ldmx::HcalID::HcalSection::BOTTOM:
154 // Odd layers are in z/depth direction, even are in the x/horizontal
155 // direction
156 return id.layer() % 2 == 0 ? ScintillatorOrientation::horizontal
157 : ScintillatorOrientation::depth;
158
159 case ldmx::HcalID::HcalSection::LEFT:
160 case ldmx::HcalID::HcalSection::RIGHT:
161 // Odd layers are in the z/depth direction, even are in the y/vertical
162 // direction
163 return id.layer() % 2 == 0 ? ScintillatorOrientation::vertical
164 : ScintillatorOrientation::depth;
165 case ldmx::HcalID::HcalSection::BACK:
166 // Configurable
167 return id.layer() % 2 == back_horizontal_parity_
168 ? ScintillatorOrientation::horizontal
169 : ScintillatorOrientation::vertical;
170 } // V14 or later detector
171 }
172 if (isPrototype()) {
173 // The prototype only has the back section. However, the orientation
174 // depends on the configuration so we delegate to the
175 // back_horizontal_parity parameter
176 return id.layer() % 2 == back_horizontal_parity_
177 ? ScintillatorOrientation::horizontal
178 : ScintillatorOrientation::vertical;
179 } // Prototype detector
180 // v13/v12
181 switch (id.section()) {
182 // For the v13 side hcal, the bars in each section have the same
183 // orientation
184 case ldmx::HcalID::HcalSection::TOP:
185 case ldmx::HcalID::HcalSection::BOTTOM:
186 return ScintillatorOrientation::horizontal;
187 case ldmx::HcalID::HcalSection::LEFT:
188 case ldmx::HcalID::HcalSection::RIGHT:
189 return ScintillatorOrientation::vertical;
190 case ldmx::HcalID::HcalSection::BACK:
191 // Configurable
192 return id.layer() % 2 == back_horizontal_parity_
193 ? ScintillatorOrientation::horizontal
194 : ScintillatorOrientation::vertical;
195 } // v13/v12 detector
196 // Can only reach this part if we somehow didn't match any of the options
197 // above. This could happen if someone introduces a new geometry but doesn't
198 // patch this part.
199 EXCEPTION_RAISE("InvalidRotation",
200 "Attempted to rotate into an invalid "
201 "orientation for a scintillator bar!");
202}
bool hasSide3DReadout() const
Does the Side Hcal have 3D readout?

◆ getScintillatorThickness()

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

Get the scitillator thickness.

Definition at line 121 of file HcalGeometry.h.

121{ return scint_thickness_; }

References scint_thickness_.

◆ getScintillatorWidth()

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

Get the scitillator width.

Definition at line 116 of file HcalGeometry.h.

116{ 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 74 of file HcalGeometry.h.

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

References strip_position_map_.

Referenced by getDistanceAlongBar(), printPositionMap(), and hcal::HcalClusterProducer::produce().

◆ getStripPositionMap()

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

Get the strip position map.

Definition at line 81 of file HcalGeometry.h.

81 {
83 }

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 144 of file HcalGeometry.h.

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

References zero_strip_.

Referenced by buildStripPositionMap().

◆ hasExplicitLayout()

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

Are the strip positions given layer by layer (e.g.

cosmic stand)?

Definition at line 176 of file HcalGeometry.h.

176{ return !layer_z_.empty(); }

References layer_z_.

Referenced by buildStripPositionMap(), HcalGeometry(), isDoubleEnded(), and rotateGlobalToLocalBarPosition().

◆ 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 165 of file HcalGeometry.h.

165{ return side_3d_readout_; }

◆ isDoubleEnded()

bool ldmx::HcalGeometry::isDoubleEnded ( int isection) const
inline

Are the bars of this section read out at both ends?

Definition at line 181 of file HcalGeometry.h.

181 {
182 if (hasExplicitLayout()) return double_ended_.at(isection) != 0;
183 return isection == ldmx::HcalID::HcalSection::BACK;
184 }

References double_ended_, and hasExplicitLayout().

◆ isPrototype()

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

Definition at line 171 of file HcalGeometry.h.

171{ 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 253 of file HcalGeometry.h.

253 {
254 for (int section = 0; section < num_sections_; ++section) {
255 printPositionMap(section);
256 }
257 }

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 203 of file HcalGeometry.cxx.

203 {
204 // Note that layer numbering starts at 1 rather than 0
205 for (int layer = 1; layer <= num_layers_[section]; ++layer) {
206 for (int strip = 0; strip < getNumStrips(section, layer); ++strip) {
207 HcalID id(section, layer, strip);
208 auto center_position = getStripCenterPosition(id);
209 auto x = center_position.X();
210 auto y = center_position.Y();
211 auto z = center_position.Z();
212 std::cout << id << ": Center position: (" << x << ", " << y << ", " << z
213 << ")\n";
214 }
215 }
216}

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 86 of file HcalGeometry.cxx.

87 {
88 const auto orientation{getScintillatorOrientation(id)};
89 // explicit layout bars lie flat in z like the back HCal
90 const unsigned int section{
92 ? static_cast<unsigned int>(ldmx::HcalID::HcalSection::BACK)
93 : id.section()};
94 switch (section) {
95 case ldmx::HcalID::HcalSection::BACK:
96 switch (orientation) {
97 case ScintillatorOrientation::horizontal:
98 return {globalPosition[2], globalPosition[1], globalPosition[0]};
99 case ScintillatorOrientation::vertical:
100 return {globalPosition[2], globalPosition[0], globalPosition[1]};
101 default: // Should not be possible with current geometries
102 EXCEPTION_RAISE("InvalidRotation",
103 "Attempted to rotate into an invalid "
104 "orientation for a scintillator bar!");
105 }
106 case ldmx::HcalID::HcalSection::TOP:
107 [[fallthrough]];
108 case ldmx::HcalID::HcalSection::BOTTOM:
109 switch (orientation) {
110 case ScintillatorOrientation::horizontal:
111 return {globalPosition[1], globalPosition[2], globalPosition[0]};
112 case ScintillatorOrientation::depth:
113 return {globalPosition[1], globalPosition[0], globalPosition[2]};
114 default: // Should not be possible with current geometries
115 EXCEPTION_RAISE("InvalidRotation",
116 "Attempted to rotate into an invalid "
117 "orientation for a scintillator bar!");
118 }
119 case ldmx::HcalID::HcalSection::LEFT:
120 [[fallthrough]];
121 case ldmx::HcalID::HcalSection::RIGHT:
122 switch (orientation) {
123 case ScintillatorOrientation::vertical:
124 return {globalPosition[0], globalPosition[2], globalPosition[1]};
125 case ScintillatorOrientation::depth:
126 return globalPosition;
127 default: // Should not be possible with current geometries
128 EXCEPTION_RAISE("InvalidRotation",
129 "Attempted to rotate into an invalid "
130 "orientation for a scintillator bar!");
131 }
132 default:
133 // Can only reach this part if we somehow didn't match any of the options
134 // above. This could happen if someone introduces a new geometry but
135 // doesn't patch this part.
136 EXCEPTION_RAISE("InvalidRotation",
137 "Attempted to rotate into an invalid "
138 "orientation for a scintillator bar!");
139 }
140}

References hasExplicitLayout().

Friends And Related Symbol Documentation

◆ hcal::HcalGeometryProvider

friend class hcal::HcalGeometryProvider
friend

Definition at line 227 of file HcalGeometry.h.

Member Data Documentation

◆ back_horizontal_parity_

int ldmx::HcalGeometry::back_horizontal_parity_ {}
private

Definition at line 292 of file HcalGeometry.h.

292{};

◆ CONDITIONS_OBJECT_NAME

const char* ldmx::HcalGeometry::CONDITIONS_OBJECT_NAME {"hcal_geometry"}
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 41 of file HcalGeometry.h.

41{"hcal_geometry"};

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().

◆ double_ended_

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

Explicit layout: section read out at both ends.

Definition at line 317 of file HcalGeometry.h.

Referenced by HcalGeometry(), and isDoubleEnded().

◆ ecal_dx_

double ldmx::HcalGeometry::ecal_dx_
private

Lenght of the Ecal (in x and y)

Definition at line 283 of file HcalGeometry.h.

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

◆ ecal_dy_

double ldmx::HcalGeometry::ecal_dy_
private

Definition at line 284 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 302 of file HcalGeometry.h.

Referenced by getHalfTotalWidth(), and HcalGeometry().

◆ is_prototype_

bool ldmx::HcalGeometry::is_prototype_ {}
private

Definition at line 306 of file HcalGeometry.h.

306{};

◆ layer_bar_center_

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

Explicit layout: world along-bar coordinate of the bar centers [mm].

Definition at line 313 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), and HcalGeometry().

◆ layer_long_axis_

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

Explicit layout: 0 = bar long along x, 1 = along y.

Definition at line 311 of file HcalGeometry.h.

Referenced by HcalGeometry().

◆ layer_strip_zero_

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

Explicit layout: world transverse coordinate of strip 0 [mm].

Definition at line 315 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), and HcalGeometry().

◆ layer_thickness_

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

Thickness of the layers in each section [mm].

Definition at line 274 of file HcalGeometry.h.

Referenced by buildStripPositionMap(), and HcalGeometry().

◆ layer_z_

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

Explicit layout: world z of each layer center [mm].

Definition at line 309 of file HcalGeometry.h.

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

◆ num_layers_

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

Number of layers in each section.

Definition at line 277 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 280 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 298 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 304 of file HcalGeometry.h.

Referenced by getScintillatorLength(), and HcalGeometry().

◆ scint_thickness_

double ldmx::HcalGeometry::scint_thickness_
private

Thickness of scintillator.

Definition at line 265 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 268 of file HcalGeometry.h.

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

◆ side_3d_readout_

int ldmx::HcalGeometry::side_3d_readout_ {}
private

Definition at line 295 of file HcalGeometry.h.

295{};

◆ 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 323 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 262 of file HcalGeometry.h.

262{0};

Referenced by HcalGeometry().

◆ y_offset_

double ldmx::HcalGeometry::y_offset_
private

Definition at line 287 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 271 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 300 of file HcalGeometry.h.

Referenced by getZeroStrip(), and HcalGeometry().


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