110 {
111 ldmx_log(trace) << "Building layout for the " << pvol->GetName()
112 << " tracker";
113 getAllDaughters(pvol);
114
115
116 Acts::Transform3 tracker_transform = getTransform(*pvol);
117
118 G4LogicalVolume* l_vol = pvol->GetLogicalVolume();
119 for (G4int i = 0; i < l_vol->GetNoDaughters(); i++) {
120 std::string sln = l_vol->GetDaughter(i)->GetName();
121 if (sln.find(surfacename) != std::string::npos) {
122 G4VPhysicalVolume* component0_volume{nullptr};
123 G4VPhysicalVolume* active_sensor{nullptr};
124 Acts::Transform3 ref1_transform = getTransform(*(l_vol->GetDaughter(i)));
125 int sensor_copy_nr = -999;
126
127
128
129 if (sln.find("axial") != std::string::npos ||
130 sln.find("stereo") != std::string::npos) {
131 component0_volume =
132 findDaughterByName(l_vol->GetDaughter(i),
133 "LDMXRecoilL14ModuleVolume_component0_physvol");
134 if (!component0_volume)
135 EXCEPTION_RAISE("BadGeometry",
136 "Could not find component0 volume for L14 Recoil");
137 active_sensor = findDaughterByName(
138 component0_volume,
139 "LDMXRecoilL14ModuleVolume_component0Sensor0_physvol");
140
141 }
142
143
144
145 else if (sln.find("l5_sensor") != std::string::npos ||
146 sln.find("l6_sensor") != std::string::npos) {
147 component0_volume =
148 findDaughterByName(l_vol->GetDaughter(i),
149 "LDMXRecoilL56ModuleVolume_component0_physvol");
150 if (!component0_volume)
151 EXCEPTION_RAISE("BadGeometry",
152 "Could not find component0 volume for L56 Recoil");
153 active_sensor = findDaughterByName(
154 component0_volume,
155 "LDMXRecoilL56ModuleVolume_component0Sensor0_physvol");
156 }
157
158
159
160 else if (sln.find("sensor_vol")) {
161 active_sensor =
162 findDaughterByName(l_vol->GetDaughter(i), "active_sensor");
163 sensor_copy_nr = l_vol->GetDaughter(i)->GetCopyNo();
164 }
165
166 else
167 EXCEPTION_RAISE("BadGeometry", "Could not build recoil layout");
168
169 if (!active_sensor)
170 EXCEPTION_RAISE("BadGeometry",
171 "Could not find ActiveSensor for recoil volume");
172
173 Acts::Transform3 ref2_transform = Acts::Transform3::Identity();
174
175 if (component0_volume)
176 ref2_transform = getTransform(*(component0_volume));
177
178 std::shared_ptr<Acts::PlaneSurface> sensor_surface = getSurfacePtr(
179 active_sensor, tracker_transform * ref1_transform * ref2_transform);
180
181
182 if (sln == "recoil_l1_axial" || sln == "recoil_l1_stereo" ||
183 sensor_copy_nr == 10 || sensor_copy_nr == 20)
184 recoil_layout_["recoil_tracker_L1"].push_back(sensor_surface);
185
186 if (sln == "recoil_l2_axial" || sln == "recoil_l2_stereo" ||
187 sensor_copy_nr == 30 || sensor_copy_nr == 40)
188 recoil_layout_["recoil_tracker_L2"].push_back(sensor_surface);
189
190 if (sln == "recoil_l3_axial" || sln == "recoil_l3_stereo" ||
191 sensor_copy_nr == 50 || sensor_copy_nr == 60)
192 recoil_layout_["recoil_tracker_L3"].push_back(sensor_surface);
193
194 if (sln == "recoil_l4_axial" || sln == "recoil_l4_stereo" ||
195 sensor_copy_nr == 70 || sensor_copy_nr == 80)
196 recoil_layout_["recoil_tracker_L4"].push_back(sensor_surface);
197
198 if (sln == "recoil_l5_sensor1" || sln == "recoil_l5_sensor2" ||
199 sln == "recoil_l5_sensor3" || sln == "recoil_l5_sensor4" ||
200 sln == "recoil_l5_sensor5" || sln == "recoil_l5_sensor6" ||
201 sln == "recoil_l5_sensor7" || sln == "recoil_l5_sensor8" ||
202 sln == "recoil_l5_sensor9" || sln == "recoil_l5_sensor10" ||
203 (sensor_copy_nr >= 90 && sensor_copy_nr <= 99))
204
205 recoil_layout_["recoil_tracker_L5"].push_back(sensor_surface);
206
207 if (sln == "recoil_l6_sensor1" || sln == "recoil_l6_sensor2" ||
208 sln == "recoil_l6_sensor3" || sln == "recoil_l6_sensor4" ||
209 sln == "recoil_l6_sensor5" || sln == "recoil_l6_sensor6" ||
210 sln == "recoil_l6_sensor7" || sln == "recoil_l6_sensor8" ||
211 sln == "recoil_l6_sensor9" || sln == "recoil_l6_sensor10" ||
212 (sensor_copy_nr >= 100 && sensor_copy_nr <= 109))
213 recoil_layout_["recoil_tracker_L6"].push_back(sensor_surface);
214
215 }
216 }
217}