20 ecal_dy_ = ps.
get<
double>(
"ecal_dy");
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");
26 auto detectors_valid = ps.
get<std::vector<std::string>>(
"detectors_valid");
29 is_prototype_ = std::find_if(detectors_valid.cbegin(), detectors_valid.cend(),
30 [](
const auto detector) {
31 return detector.find(
"ldmx-hcal-prototype") !=
33 }) != detectors_valid.cend();
37 ps.
get<std::vector<std::vector<double>>>(
"half_total_width");
38 zero_strip_ = ps.
get<std::vector<std::vector<double>>>(
"zero_strip");
48 const std::vector<double> &globalPosition,
const ldmx::HcalID &
id)
const {
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]};
58 EXCEPTION_RAISE(
"InvalidRotation",
59 "Attempted to rotate into an invalid "
60 "orientation for a scintillator bar!");
62 case ldmx::HcalID::HcalSection::TOP:
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]};
71 EXCEPTION_RAISE(
"InvalidRotation",
72 "Attempted to rotate into an invalid "
73 "orientation for a scintillator bar!");
75 case ldmx::HcalID::HcalSection::LEFT:
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;
84 EXCEPTION_RAISE(
"InvalidRotation",
85 "Attempted to rotate into an invalid "
86 "orientation for a scintillator bar!");
92 EXCEPTION_RAISE(
"InvalidRotation",
93 "Attempted to rotate into an invalid "
94 "orientation for a scintillator bar!");
102 switch (
id.section()) {
103 case ldmx::HcalID::HcalSection::TOP:
104 case ldmx::HcalID::HcalSection::BOTTOM:
107 return id.layer() % 2 == 0 ? ScintillatorOrientation::horizontal
108 : ScintillatorOrientation::depth;
110 case ldmx::HcalID::HcalSection::LEFT:
111 case ldmx::HcalID::HcalSection::RIGHT:
114 return id.layer() % 2 == 0 ? ScintillatorOrientation::vertical
115 : ScintillatorOrientation::depth;
116 case ldmx::HcalID::HcalSection::BACK:
118 return id.layer() % 2 == back_horizontal_parity_
119 ? ScintillatorOrientation::horizontal
120 : ScintillatorOrientation::vertical;
127 return id.layer() % 2 == back_horizontal_parity_
128 ? ScintillatorOrientation::horizontal
129 : ScintillatorOrientation::vertical;
132 switch (
id.section()) {
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:
143 return id.layer() % 2 == back_horizontal_parity_
144 ? ScintillatorOrientation::horizontal
145 : ScintillatorOrientation::vertical;
150 EXCEPTION_RAISE(
"InvalidRotation",
151 "Attempted to rotate into an invalid "
152 "orientation for a scintillator bar!");
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);
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
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);
176 double x{-99999}, y{-99999}, z{-99999};
183 const auto orientation{getScintillatorOrientation(
id)};
192 if (hcalsection == ldmx::HcalID::HcalSection::BACK) {
211 if (orientation == ScintillatorOrientation::horizontal) {
219 if (side_3d_readout_) {
230 switch (hcalsection) {
231 case ldmx::HcalID::HcalSection::BACK:
233 case ldmx::HcalID::HcalSection::LEFT:
234 case ldmx::HcalID::HcalSection::RIGHT:
235 if (orientation == ScintillatorOrientation::vertical) {
244 }
else if (orientation == ScintillatorOrientation::depth) {
251 if (section == ldmx::HcalID::HcalSection::LEFT) {
257 case ldmx::HcalID::HcalSection::BOTTOM:
258 case ldmx::HcalID::HcalSection::TOP:
259 if (orientation == ScintillatorOrientation::horizontal) {
274 if (orientation == ScintillatorOrientation::depth) {
281 if (section == ldmx::HcalID::HcalSection::BOTTOM) {
300 if (hcalsection == ldmx::HcalID::HcalSection::TOP or
301 hcalsection == ldmx::HcalID::HcalSection::BOTTOM) {
304 if (hcalsection == ldmx::HcalID::HcalSection::BOTTOM) {
312 if (hcalsection == ldmx::HcalID::HcalSection::RIGHT) {
321 ROOT::Math::XYZVector pos;
Class that translates HCal ID into positions of strip hits.
Class encapsulating parameters for configuring a processor.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Implementation of HCal strip readout.
std::vector< double > layer_thickness_
Thickness of the layers in each section [mm].
bool hasSide3DReadout() const
Does the Side Hcal have 3D readout?
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].
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 > 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.
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].
HcalGeometry(const framework::config::Parameters &ps)
Class constructor, for use only by the provider.
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].
std::vector< double > rotateGlobalToLocalBarPosition(const std::vector< double > &globalPosition, const ldmx::HcalID &id) const
Coordinates that are given by Geant4 are typically global.
double getScintillatorWidth() const
Get the scitillator width.
double scint_thickness_
Thickness of scintillator.
std::vector< int > num_layers_
Number of layers in each section.
ScintillatorOrientation
Encodes the orientation of a bar.
int getNumStrips(int isection, int layer=1) const
Get the number of strips per layer for that section and layer.
std::vector< std::vector< int > > num_strips_
Number of strips per layer in each section and each 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.
int num_sections_
Number of sections.
Implements detector ids for HCal subdetector.
HcalSection
Encodes the section of the HCal based on the 'section' field value.
All classes in the ldmx-sw project use this namespace.