52 {
53 ldmx_log(trace) << "Building layout for the " << pvol->GetName()
54 << " tracker";
55 getAllDaughters(pvol);
56
57
58 Acts::Transform3 tracker_transform = getTransform(*pvol);
59
60 G4LogicalVolume* l_vol = pvol->GetLogicalVolume();
61 for (G4int i = 0; i < l_vol->GetNoDaughters(); i++) {
62 std::string sln = l_vol->GetDaughter(i)->GetName();
63 if (sln.find(surfacename) != std::string::npos) {
64 G4VPhysicalVolume* component0_volume{nullptr};
65 G4VPhysicalVolume* active_sensor{nullptr};
66 Acts::Transform3 ref1_transform = getTransform(*(l_vol->GetDaughter(i)));
67 int sensor_copy_nr = -999;
68
69
70
71 if (sln.find("axial") != std::string::npos ||
72 sln.find("stereo") != std::string::npos) {
73 component0_volume =
74 findDaughterByName(l_vol->GetDaughter(i),
75 "LDMXRecoilL14ModuleVolume_component0_physvol");
76 if (!component0_volume)
77 throw std::runtime_error(
78 "Could not find component0 volume for L14 Recoil");
79 active_sensor = findDaughterByName(
80 component0_volume,
81 "LDMXRecoilL14ModuleVolume_component0Sensor0_physvol");
82
83 }
84
85
86
87 else if (sln.find("l5_sensor") != std::string::npos ||
88 sln.find("l6_sensor") != std::string::npos) {
89 component0_volume =
90 findDaughterByName(l_vol->GetDaughter(i),
91 "LDMXRecoilL56ModuleVolume_component0_physvol");
92 if (!component0_volume)
93 throw std::runtime_error(
94 "Could not find component0 volume for L56 Recoil");
95 active_sensor = findDaughterByName(
96 component0_volume,
97 "LDMXRecoilL56ModuleVolume_component0Sensor0_physvol");
98 }
99
100
101
102 else if (sln.find("sensor_vol")) {
103 active_sensor =
104 findDaughterByName(l_vol->GetDaughter(i), "active_sensor");
105 sensor_copy_nr = l_vol->GetDaughter(i)->GetCopyNo();
106 }
107
108 else
109 throw std::runtime_error("Could not build recoil layout");
110
111 if (!active_sensor)
112 throw std::runtime_error(
113 "Could not find ActiveSensor for recoil volume");
114
115 Acts::Transform3 ref2_transform = Acts::Transform3::Identity();
116
117 if (component0_volume)
118 ref2_transform = getTransform(*(component0_volume));
119
120 std::shared_ptr<Acts::PlaneSurface> sensor_surface = getSurfacePtr(
121 active_sensor, tracker_transform * ref1_transform * ref2_transform);
122
123
124 if (sln == "recoil_l1_axial" || sln == "recoil_l1_stereo" ||
125 sensor_copy_nr == 10 || sensor_copy_nr == 20)
126 recoil_layout_["recoil_tracker_L1"].push_back(sensor_surface);
127
128 if (sln == "recoil_l2_axial" || sln == "recoil_l2_stereo" ||
129 sensor_copy_nr == 30 || sensor_copy_nr == 40)
130 recoil_layout_["recoil_tracker_L2"].push_back(sensor_surface);
131
132 if (sln == "recoil_l3_axial" || sln == "recoil_l3_stereo" ||
133 sensor_copy_nr == 50 || sensor_copy_nr == 60)
134 recoil_layout_["recoil_tracker_L3"].push_back(sensor_surface);
135
136 if (sln == "recoil_l4_axial" || sln == "recoil_l4_stereo" ||
137 sensor_copy_nr == 70 || sensor_copy_nr == 80)
138 recoil_layout_["recoil_tracker_L4"].push_back(sensor_surface);
139
140 if (sln == "recoil_l5_sensor1" || sln == "recoil_l5_sensor2" ||
141 sln == "recoil_l5_sensor3" || sln == "recoil_l5_sensor4" ||
142 sln == "recoil_l5_sensor5" || sln == "recoil_l5_sensor6" ||
143 sln == "recoil_l5_sensor7" || sln == "recoil_l5_sensor8" ||
144 sln == "recoil_l5_sensor9" || sln == "recoil_l5_sensor10" ||
145 (sensor_copy_nr >= 90 && sensor_copy_nr <= 99))
146
147 recoil_layout_["recoil_tracker_L5"].push_back(sensor_surface);
148
149 if (sln == "recoil_l6_sensor1" || sln == "recoil_l6_sensor2" ||
150 sln == "recoil_l6_sensor3" || sln == "recoil_l6_sensor4" ||
151 sln == "recoil_l6_sensor5" || sln == "recoil_l6_sensor6" ||
152 sln == "recoil_l6_sensor7" || sln == "recoil_l6_sensor8" ||
153 sln == "recoil_l6_sensor9" || sln == "recoil_l6_sensor10" ||
154 (sensor_copy_nr >= 100 && sensor_copy_nr <= 109))
155 recoil_layout_["recoil_tracker_L6"].push_back(sensor_surface);
156
157 }
158 }
159}