59 {
60
62
63
64 G4VisAttributes* FoamVisAtt = new G4VisAttributes(G4Colour::Blue());
65 G4VisAttributes* KaptonVisAtt = new G4VisAttributes(G4Colour::Red());
66 G4VisAttributes* GlueVisAtt = new G4VisAttributes(G4Colour::White());
67 G4VisAttributes* MetalVisAtt = new G4VisAttributes(G4Colour::Gray());
68 G4VisAttributes* SubstrateVisAtt = new G4VisAttributes(G4Colour::Green());
69 G4VisAttributes* MetalizedVisAtt = new G4VisAttributes(G4Colour::Cyan());
70 G4VisAttributes* EpitaxialVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 0.0));
71
72
73 double stepSize = content.getLength("stepSize", 5 * CLHEP::um);
74
75 int LadderID = 0;
76
77 GearDir activeParams(content, "Ladder");
78 G4double SensorLengthX = (activeParams.getInt("nPixelsX") * activeParams.getLength("pitchX")) * CLHEP::cm;
79 G4double SensorLengthY = (activeParams.getInt("nPixelsY") * activeParams.getLength("pitchY")) * CLHEP::cm;
80
81 G4double AirGap = activeParams.getLength("AirGap") * CLHEP::cm;
82
83 G4double SubstrateThickness = activeParams.getLength("SubstrateThickness") * CLHEP::cm;
84 G4double EpitaxialThickness = activeParams.getLength("EpitaxialThickness") * CLHEP::cm;
85 G4double MetalThickness = activeParams.getLength("MetalThickness") * CLHEP::cm;
86 G4double GlueThickness = activeParams.getLength("GlueThickness") * CLHEP::cm;
87 G4double KaptonThickness = activeParams.getLength("KaptonThickness") * CLHEP::cm;
88 G4double AluminiumThickness = activeParams.getLength("AluminiumThickness") * CLHEP::cm;
89 G4double foamlen = activeParams.getLength("Foam/length") * CLHEP::cm;
90 G4double foamwid = activeParams.getLength("Foam/width") * CLHEP::cm;
91 G4double foamthick = activeParams.getLength("Foam/thickness") * CLHEP::cm;
92 G4double foamZ = activeParams.getLength("Foam/zPosition") * CLHEP::cm;
93 G4double foamY = activeParams.getLength("Foam/yShift") * CLHEP::cm;
94 G4double flexlen = activeParams.getLength("Flex/length") * CLHEP::cm;
95 G4double flexwid = activeParams.getLength("Flex/width") * CLHEP::cm;
96 G4double flexZ = activeParams.getLength("Flex/zPosition") * CLHEP::cm;
97 G4double allen1 = activeParams.getLength("AlBat/length1") * CLHEP::cm;
98 G4double allen2 = activeParams.getLength("AlBat/length2") * CLHEP::cm;
99 G4double allen3 = activeParams.getLength("AlBat/length3") * CLHEP::cm;
100 G4double alwid = activeParams.getLength("AlBat/width") * CLHEP::cm;
101 G4double althick1 = activeParams.getLength("AlBat/thickness1") * CLHEP::cm;
102 G4double althick2 = activeParams.getLength("AlBat/thickness2") * CLHEP::cm;
103 G4double althick3 = activeParams.getLength("AlBat/thickness3") * CLHEP::cm;
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 G4double dz_ladder = foamthick / 2. + KaptonThickness + GlueThickness +
126 AluminiumThickness + 3. * AirGap;
127 G4double dz_sensor = (SubstrateThickness + EpitaxialThickness +
128 MetalThickness + 2. * AirGap) / 2.;
129
130 G4double fullLength = allen1 + allen2 + allen3 - (foamZ - foamlen / 2.);
131 double zshift = fullLength / 2. - (allen1 + allen2 + allen3);
132
133
134 G4AssemblyVolume* support = new G4AssemblyVolume();
135 G4Transform3D transl;;
136
137
138 G4Box* s_foam = new G4Box("s_foam", foamlen / 2., foamwid / 2., foamthick / 2.);
140 transl = G4Translate3D(foamZ + zshift, foamY, 0);
141 support->AddPlacedVolume(l_foam, transl);
142
143
144 G4Box* s_glue = new G4Box("s_glue", flexlen / 2., foamwid / 2., GlueThickness / 2.);
146 G4double r_glue = foamthick / 2. + AirGap + GlueThickness / 2.;
147 transl = G4Translate3D(flexZ + zshift, foamY, -r_glue);
148 support->AddPlacedVolume(l_glue, transl);
149 transl = G4Translate3D(flexZ + zshift, foamY, r_glue);
150 support->AddPlacedVolume(l_glue, transl);
151
152
153 G4Box* s_kapton = new G4Box("s_kapton", flexlen / 2., flexwid / 2., KaptonThickness / 2.);
155 G4double r_Kapton = r_glue + AirGap + (GlueThickness + KaptonThickness) / 2.;
156 transl = G4Translate3D(flexZ + zshift, 0, -r_Kapton);
157 support->AddPlacedVolume(l_kapton, transl);
158 transl = G4Translate3D(flexZ + zshift, 0, r_Kapton);
159 support->AddPlacedVolume(l_kapton, transl);
160
161
162 G4Box* s_metal = new G4Box("s_metal", flexlen / 2., flexwid / 2., AluminiumThickness / 2.);
164 G4double r_metal = r_Kapton + AirGap + (KaptonThickness + AluminiumThickness) / 2.;
165 transl = G4Translate3D(flexZ + zshift, 0, -r_metal);
166 support->AddPlacedVolume(l_metal, transl);
167 transl = G4Translate3D(flexZ + zshift, 0, r_metal);
168 support->AddPlacedVolume(l_metal, transl);
169
170
171 G4Box* s_bat1p = new G4Box("s_bat1p", allen1 / 2., alwid / 2., althick1 / 2.);
172 double incut = foamZ + foamlen / 2.;
173 G4Box* s_bat1t = new G4Box("s_bat1t", incut, foamwid / 2., althick1 + 0.2 / 2.);
174
175 G4Transform3D tt = G4Translate3D(-allen1 / 2., foamY, 0);
176 G4SubtractionSolid* s_bat1 = new G4SubtractionSolid("s_bat1", s_bat1p, s_bat1t, tt);
177 G4Box* s_bat2 = new G4Box("s_bat2", allen2 / 2., alwid / 2., althick2 / 2.);
178 G4Box* s_bat3 = new G4Box("s_bat3", allen3 / 2., alwid / 2., althick3 / 2.);
182 transl = G4Translate3D(allen1 / 2. + zshift, 0, 0);
183 support->AddPlacedVolume(l_bat1, transl);
184 transl = G4Translate3D(allen1 + allen2 / 2. + zshift, 0, 0);
185 support->AddPlacedVolume(l_bat2, transl);
186 transl = G4Translate3D(allen1 + allen2 + allen3 / 2. + zshift, 0, 0);
187 support->AddPlacedVolume(l_bat3, transl);
188
189 l_foam->SetVisAttributes(FoamVisAtt);
190 l_kapton->SetVisAttributes(KaptonVisAtt);
191 l_glue->SetVisAttributes(GlueVisAtt);
192 l_metal->SetVisAttributes(MetalVisAtt);
193
194
195 G4String symbol, name;
196 G4double a;
197 G4double density;
198 a = 1.01 * CLHEP::g / CLHEP::mole;
199 G4Element* elH = new G4Element("Hydrogen", "H", 1., a);
200 a = 12.01 * CLHEP::g / CLHEP::mole;
201 G4Element* elC = new G4Element("Carbon", "C", 6., a);
202 a = 16.00 * CLHEP::g / CLHEP::mole;
203 G4Element* elO = new G4Element("Oxygen", "O", 8., a);
204 density = 1.31 * CLHEP::g / CLHEP::cm3;
205 G4Material* peekMat = new G4Material("plumePeek", density, 3);
206 peekMat->AddElementByMassFraction(elC, 0.76);
207 peekMat->AddElementByMassFraction(elH, 0.08);
208 peekMat->AddElementByMassFraction(elO, 0.16);
209 density = 1.5 * CLHEP::g / CLHEP::cm3;
210 G4Material* carbMat = new G4Material("plumeCarb", density, 1);
211 carbMat->AddElementByMassFraction(elC, 1.0);
212
213 G4Box* s_sensor = new G4Box("s_sensor", SensorLengthX / 2., SensorLengthY / 2., dz_sensor);
215
216
217 G4Box* s_substrate = new G4Box("s_substrate", SensorLengthX / 2., SensorLengthY / 2., SubstrateThickness / 2.);
218 G4LogicalVolume* l_substrate =
new G4LogicalVolume(s_substrate,
geometry::Materials::get(
"Silicon"),
"PLUME.l_substrate");
219 new G4PVPlacement(0, G4ThreeVector(0, 0, -dz_sensor + SubstrateThickness / 2.), l_substrate, "p_substrate", l_sensor, false, 1);
220
221
222 G4Box* s_epitaxial = new G4Box("s_epitaxial", SensorLengthX / 2., SensorLengthY / 2., EpitaxialThickness / 2.);
223 G4LogicalVolume* l_epitaxial =
new G4LogicalVolume(s_epitaxial,
geometry::Materials::get(
"Silicon"),
"PLUME.l_epitaxial", 0,
225 new G4PVPlacement(0, G4ThreeVector(0, 0, -dz_sensor + AirGap + SubstrateThickness + EpitaxialThickness / 2.), l_epitaxial,
226 "p_epitaxial", l_sensor, false, 1);
227
228 G4Box* s_metalized = new G4Box("s_metalized", SensorLengthX / 2., SensorLengthY / 2., MetalThickness / 2.);
229 G4LogicalVolume* l_metalized =
new G4LogicalVolume(s_metalized,
geometry::Materials::get(
"SiO2Al"),
"PLUME.l_metalized");
230 new G4PVPlacement(0, G4ThreeVector(0, 0, -dz_sensor + 2 * AirGap + SubstrateThickness + EpitaxialThickness + MetalThickness / 2.),
231 l_metalized, "p_metalized", l_sensor, false, 1);
232
233
234
235
236
237
238
239
240
241
242
243 l_epitaxial->SetUserLimits(new G4UserLimits(stepSize));
244 l_substrate->SetVisAttributes(SubstrateVisAtt);
245 l_epitaxial->SetVisAttributes(EpitaxialVisAtt);
246 l_metalized->SetVisAttributes(MetalizedVisAtt);
247
248
249 double zSens = dz_ladder + dz_sensor + AirGap;
250 G4RotationMatrix ra;
251 G4ThreeVector Ta(0, 0, 0);
252 G4Transform3D tra(ra, Ta);
253
254
255 GearDir pipeParams(content, "CoolingPipes");
256 double pipeLen = pipeParams.getLength("length") * CLHEP::cm;
257 double pipeInR = pipeParams.getLength("rIn") * CLHEP::cm;
258 double pipeOutR = pipeParams.getLength("rOut") * CLHEP::cm;
259 G4Tubs* pipe_s = new G4Tubs("pipe_s", pipeInR, pipeOutR, pipeLen / 2., 0, 2 * M_PI);
260
261 G4LogicalVolume* pipe_l = new G4LogicalVolume(pipe_s, carbMat, "PLUME.l_pipe");
262 double pipeX = pipeParams.getLength("x") * CLHEP::cm;
263 double pipeY = pipeParams.getLength("y") * CLHEP::cm;
264 double pipeZ = pipeParams.getLength("z") * CLHEP::cm;
265 G4double alphaPipe = pipeParams.getAngle("alpha");
266
267
268 G4Box* s_sensors = new G4Box("s_sensors", flexlen / 2., flexwid / 2., dz_sensor + AirGap);
269
270 for (auto ladder : content.getNodes("Placements/Ladder")) {
271
272 std::string id = ladder.getString("@id");
273
274 G4AssemblyVolume* assemblyLadder = new G4AssemblyVolume();
275 assemblyLadder->AddPlacedAssembly(support, tra);
276
277 for (auto pars : content.getNodes("SensorAlignment/ladder")) {
278 if (pars.getString("@id") == id) {
279 GearDir alignPars(pars);
280
281 for (auto sidePars : alignPars.getNodes("side")) {
282 unsigned mirror = 0;
283
284 G4Transform3D transformSens;
285 if (sidePars.getString("@id") == "mirror") mirror = 1;
286
288
289 for (auto sensorPars : sidePars.getNodes("sensor")) {
290 double x = sensorPars.getLength("x") * CLHEP::cm + zshift;
291 double y = sensorPars.getLength("y") * CLHEP::cm;
292 int ids = sensorPars.getInt("id");
293 y = mirror ? -y : y;
294 y -= alwid / 2.;
295 double alpha1 = sensorPars.getAngle("alpha") * CLHEP::rad;
296 if (mirror) transformSens = G4Translate3D(x, y,
297 0) * G4RotateZ3D(alpha1) * G4RotateX3D(M_PI);
298 else transformSens = G4Translate3D(x, y, 0) * G4RotateZ3D(-alpha1);
299
300 new G4PVPlacement(transformSens, l_sensor, "p_sensor", l_sensors, true,
301 (ids + mirror * 6 + LadderID * 12));
302 }
303 transformSens = G4Translate3D(0, 0, mirror ? -zSens : zSens);
304 assemblyLadder->AddPlacedVolume(l_sensors, transformSens);
305 }
306 }
307 }
308
309
310
311 G4double thetaZ = ladder.getAngle("ThetaZ");
312 G4double r = ladder.getLength("r_plume") * CLHEP::cm - zshift * sin(thetaZ);
313 G4double z = ladder.getLength("z_plume") * CLHEP::cm - zshift * cos(thetaZ);
314 G4double phi = ladder.getAngle("Phi");
315 G4double alpha = ladder.getAngle("Alpha");
316
317
318
319 G4Transform3D transformPipe = G4Translate3D(pipeZ + zshift, pipeY, pipeX) * G4RotateZ3D(alphaPipe) * G4RotateY3D(+ M_PI / 2.);
320 assemblyLadder->AddPlacedVolume(pipe_l, transformPipe);
321 transformPipe = G4Translate3D(pipeZ + zshift
322 , pipeY, -pipeX) * G4RotateZ3D(alphaPipe) * G4RotateY3D(+ M_PI / 2.);
323 assemblyLadder->AddPlacedVolume(pipe_l, transformPipe);
324
325
326 G4Transform3D transform1;
327 if (LadderID == 1) {
330 transform1 = G4Translate3D(-fullLength / 2. - 18.7, 0., 1.2) * G4RotateY3D(thetaZ) * G4RotateX3D(M_PI / 2.) * G4RotateY3D(M_PI);
331 assemblyLadder->AddPlacedAssembly(sup1, transform1);
332 transform1 = G4Translate3D(fullLength / 2. + 19.5, 0, -2.6) * G4RotateY3D(thetaZ) * G4RotateX3D(M_PI / 2.);
333 assemblyLadder->AddPlacedAssembly(sup2, transform1);
334 }
335
336 if (LadderID == 0) {
339 transform1 = G4Translate3D(fullLength / 2. + 5, 0,
340 7.8) * G4RotateY3D(-thetaZ) * G4RotateZ3D(M_PI / 2.) * G4RotateX3D(M_PI / 2.) * G4RotateY3D(M_PI / 2.);
341 assemblyLadder->AddPlacedAssembly(sup1, transform1);
342 transform1 = G4Translate3D(-fullLength / 2. - 31, 0.,
343 -21.7) * G4RotateY3D(-thetaZ) * G4RotateZ3D(M_PI / 2.) * G4RotateX3D(-M_PI / 2.) * G4RotateY3D(M_PI);
344 assemblyLadder->AddPlacedAssembly(sup2, transform1);
345 }
346
347 G4Transform3D transform = G4RotateZ3D(phi) * G4Translate3D(r, 0,
348 z) * G4RotateY3D(thetaZ) * G4RotateZ3D(alpha + M_PI) * G4RotateY3D(- M_PI / 2.0);
349
350 assemblyLadder->MakeImprint(&topVolume, transform);
351
352 LadderID += 1;
353
354 }
355
356 }
G4AssemblyVolume * buildSupport1()
Volume of support1.
G4AssemblyVolume * buildSupport2()
Volume of support2.
G4AssemblyVolume * buildSupport4()
Volume of support4.
G4AssemblyVolume * buildSupport3()
Volume of support3.
VXD::SensitiveDetector< PXDSimHit, PXDTrueHit > SensitiveDetector
The PXD Sensitive Detector class.