Function to actually create the geometry, has to be overridden by derived classes.
69 G4VisAttributes* FoamVisAtt =
new G4VisAttributes(G4Colour::Blue());
70 G4VisAttributes* KaptonVisAtt =
new G4VisAttributes(G4Colour::Red());
71 G4VisAttributes* GlueVisAtt =
new G4VisAttributes(G4Colour::White());
72 G4VisAttributes* MetalVisAtt =
new G4VisAttributes(G4Colour::Gray());
73 G4VisAttributes* SubstrateVisAtt =
new G4VisAttributes(G4Colour::Green());
74 G4VisAttributes* MetalizedVisAtt =
new G4VisAttributes(G4Colour::Cyan());
75 G4VisAttributes* EpitaxialVisAtt =
new G4VisAttributes(G4Colour(1.0, 1.0, 0.0));
78 double stepSize = content.getLength(
"stepSize", 5 * CLHEP::um);
82 GearDir activeParams(content,
"Ladder");
83 G4double SensorLengthX = (activeParams.getInt(
"nPixelsX") * activeParams.getLength(
"pitchX")) * CLHEP::cm;
84 G4double SensorLengthY = (activeParams.getInt(
"nPixelsY") * activeParams.getLength(
"pitchY")) * CLHEP::cm;
86 G4double AirGap = activeParams.getLength(
"AirGap") * CLHEP::cm;
88 G4double SubstrateThickness = activeParams.getLength(
"SubstrateThickness") * CLHEP::cm;
89 G4double EpitaxialThickness = activeParams.getLength(
"EpitaxialThickness") * CLHEP::cm;
90 G4double MetalThickness = activeParams.getLength(
"MetalThickness") * CLHEP::cm;
91 G4double GlueThickness = activeParams.getLength(
"GlueThickness") * CLHEP::cm;
92 G4double KaptonThickness = activeParams.getLength(
"KaptonThickness") * CLHEP::cm;
93 G4double AluminiumThickness = activeParams.getLength(
"AluminiumThickness") * CLHEP::cm;
94 G4double foamlen = activeParams.getLength(
"Foam/length") * CLHEP::cm;
95 G4double foamwid = activeParams.getLength(
"Foam/width") * CLHEP::cm;
96 G4double foamthick = activeParams.getLength(
"Foam/thickness") * CLHEP::cm;
97 G4double foamZ = activeParams.getLength(
"Foam/zPosition") * CLHEP::cm;
98 G4double foamY = activeParams.getLength(
"Foam/yShift") * CLHEP::cm;
99 G4double flexlen = activeParams.getLength(
"Flex/length") * CLHEP::cm;
100 G4double flexwid = activeParams.getLength(
"Flex/width") * CLHEP::cm;
101 G4double flexZ = activeParams.getLength(
"Flex/zPosition") * CLHEP::cm;
102 G4double allen1 = activeParams.getLength(
"AlBat/length1") * CLHEP::cm;
103 G4double allen2 = activeParams.getLength(
"AlBat/length2") * CLHEP::cm;
104 G4double allen3 = activeParams.getLength(
"AlBat/length3") * CLHEP::cm;
105 G4double alwid = activeParams.getLength(
"AlBat/width") * CLHEP::cm;
106 G4double althick1 = activeParams.getLength(
"AlBat/thickness1") * CLHEP::cm;
107 G4double althick2 = activeParams.getLength(
"AlBat/thickness2") * CLHEP::cm;
108 G4double althick3 = activeParams.getLength(
"AlBat/thickness3") * CLHEP::cm;
130 G4double dz_ladder = foamthick / 2. + KaptonThickness + GlueThickness +
131 AluminiumThickness + 3. * AirGap;
132 G4double dz_sensor = (SubstrateThickness + EpitaxialThickness +
133 MetalThickness + 2. * AirGap) / 2.;
135 G4double fullLength = allen1 + allen2 + allen3 - (foamZ - foamlen / 2.);
136 double zshift = fullLength / 2. - (allen1 + allen2 + allen3);
139 G4AssemblyVolume* support =
new G4AssemblyVolume();
140 G4Transform3D transl;;
143 G4Box* s_foam =
new G4Box(
"s_foam", foamlen / 2., foamwid / 2., foamthick / 2.);
145 transl = G4Translate3D(foamZ + zshift, foamY, 0);
146 support->AddPlacedVolume(l_foam, transl);
149 G4Box* s_glue =
new G4Box(
"s_glue", flexlen / 2., foamwid / 2. , GlueThickness / 2.);
151 G4double r_glue = foamthick / 2. + AirGap + GlueThickness / 2.;
152 transl = G4Translate3D(flexZ + zshift, foamY, -r_glue);
153 support->AddPlacedVolume(l_glue, transl);
154 transl = G4Translate3D(flexZ + zshift, foamY, r_glue);
155 support->AddPlacedVolume(l_glue, transl);
158 G4Box* s_kapton =
new G4Box(
"s_kapton", flexlen / 2., flexwid / 2., KaptonThickness / 2.);
160 G4double r_Kapton = r_glue + AirGap + (GlueThickness + KaptonThickness) / 2.;
161 transl = G4Translate3D(flexZ + zshift, 0, -r_Kapton);
162 support->AddPlacedVolume(l_kapton, transl);
163 transl = G4Translate3D(flexZ + zshift, 0, r_Kapton);
164 support->AddPlacedVolume(l_kapton, transl);
167 G4Box* s_metal =
new G4Box(
"s_metal", flexlen / 2., flexwid / 2., AluminiumThickness / 2.);
169 G4double r_metal = r_Kapton + AirGap + (KaptonThickness + AluminiumThickness) / 2.;
170 transl = G4Translate3D(flexZ + zshift, 0, -r_metal);
171 support->AddPlacedVolume(l_metal, transl);
172 transl = G4Translate3D(flexZ + zshift, 0, r_metal);
173 support->AddPlacedVolume(l_metal, transl);
176 G4Box* s_bat1p =
new G4Box(
"s_bat1p", allen1 / 2., alwid / 2., althick1 / 2.);
177 double incut = foamZ + foamlen / 2.;
178 G4Box* s_bat1t =
new G4Box(
"s_bat1t", incut, foamwid / 2., althick1 + 0.2 / 2.);
180 G4Transform3D tt = G4Translate3D(-allen1 / 2., foamY, 0);
181 G4SubtractionSolid* s_bat1 =
new G4SubtractionSolid(
"s_bat1", s_bat1p, s_bat1t, tt);
182 G4Box* s_bat2 =
new G4Box(
"s_bat2", allen2 / 2., alwid / 2., althick2 / 2.);
183 G4Box* s_bat3 =
new G4Box(
"s_bat3", allen3 / 2., alwid / 2., althick3 / 2.);
187 transl = G4Translate3D(allen1 / 2. + zshift, 0, 0);
188 support->AddPlacedVolume(l_bat1, transl);
189 transl = G4Translate3D(allen1 + allen2 / 2. + zshift, 0, 0);
190 support->AddPlacedVolume(l_bat2, transl);
191 transl = G4Translate3D(allen1 + allen2 + allen3 / 2. + zshift, 0, 0);
192 support->AddPlacedVolume(l_bat3, transl);
194 l_foam->SetVisAttributes(FoamVisAtt);
195 l_kapton->SetVisAttributes(KaptonVisAtt);
196 l_glue->SetVisAttributes(GlueVisAtt);
197 l_metal->SetVisAttributes(MetalVisAtt);
200 G4String symbol, name;
204 G4double fractionmass;
205 a = 1.01 * CLHEP::g / CLHEP::mole;
206 G4Element* elH =
new G4Element(name =
"Hydrogen", symbol =
"H" , zz = 1., a);
207 a = 12.01 * CLHEP::g / CLHEP::mole;
208 G4Element* elC =
new G4Element(name =
"Carbon" , symbol =
"C" , zz = 6., a);
209 a = 16.00 * CLHEP::g / CLHEP::mole;
210 G4Element* elO =
new G4Element(name =
"Oxygen" , symbol =
"O" , zz = 8., a);
211 density = 1.31 * CLHEP::g / CLHEP::cm3;
212 G4Material* peekMat =
new G4Material(name =
"plumePeek" , density, ncomponents = 3);
213 peekMat->AddElement(elC, fractionmass = 0.76);
214 peekMat->AddElement(elH, fractionmass = 0.08);
215 peekMat->AddElement(elO, fractionmass = 0.16);
216 density = 1.5 * CLHEP::g / CLHEP::cm3;
217 G4Material* carbMat =
new G4Material(name =
"plumeCarb" , density, ncomponents = 1);
218 carbMat->AddElement(elC, fractionmass = 1.0);
220 G4Box* s_sensor =
new G4Box(
"s_sensor", SensorLengthX / 2., SensorLengthY / 2., dz_sensor);
224 G4Box* s_substrate =
new G4Box(
"s_substrate", SensorLengthX / 2. , SensorLengthY / 2. , SubstrateThickness / 2.);
225 G4LogicalVolume* l_substrate =
new G4LogicalVolume(s_substrate,
geometry::Materials::get(
"Silicon"),
"PLUME.l_substrate");
226 new G4PVPlacement(0, G4ThreeVector(0, 0, -dz_sensor + SubstrateThickness / 2.), l_substrate,
"p_substrate", l_sensor,
false, 1);
229 G4Box* s_epitaxial =
new G4Box(
"s_epitaxial", SensorLengthX / 2. , SensorLengthY / 2., EpitaxialThickness / 2.);
230 G4LogicalVolume* l_epitaxial =
new G4LogicalVolume(s_epitaxial,
geometry::Materials::get(
"Silicon"),
"PLUME.l_epitaxial", 0,
232 new G4PVPlacement(0, G4ThreeVector(0, 0, -dz_sensor + AirGap + SubstrateThickness + EpitaxialThickness / 2.), l_epitaxial,
233 "p_epitaxial", l_sensor,
false, 1);
235 G4Box* s_metalized =
new G4Box(
"s_metalized", SensorLengthX / 2. , SensorLengthY / 2. , MetalThickness / 2.);
236 G4LogicalVolume* l_metalized =
new G4LogicalVolume(s_metalized,
geometry::Materials::get(
"SiO2Al"),
"PLUME.l_metalized");
237 new G4PVPlacement(0, G4ThreeVector(0, 0, -dz_sensor + 2 * AirGap + SubstrateThickness + EpitaxialThickness + MetalThickness / 2.),
238 l_metalized,
"p_metalized", l_sensor,
false, 1);
250 l_epitaxial->SetUserLimits(
new G4UserLimits(stepSize));
251 l_substrate->SetVisAttributes(SubstrateVisAtt);
252 l_epitaxial->SetVisAttributes(EpitaxialVisAtt);
253 l_metalized->SetVisAttributes(MetalizedVisAtt);
256 double zSens = dz_ladder + dz_sensor + AirGap;
258 G4ThreeVector Ta(0, 0, 0);
259 G4Transform3D tra(ra, Ta);
262 GearDir pipeParams(content,
"CoolingPipes");
263 double pipeLen = pipeParams.getLength(
"length") * CLHEP::cm;
264 double pipeInR = pipeParams.getLength(
"rIn") * CLHEP::cm;
265 double pipeOutR = pipeParams.getLength(
"rOut") * CLHEP::cm;
266 G4Tubs* pipe_s =
new G4Tubs(
"pipe_s", pipeInR, pipeOutR, pipeLen / 2., 0, 2 * M_PI);
268 G4LogicalVolume* pipe_l =
new G4LogicalVolume(pipe_s, carbMat,
"PLUME.l_pipe");
269 double pipeX = pipeParams.getLength(
"x") * CLHEP::cm;
270 double pipeY = pipeParams.getLength(
"y") * CLHEP::cm;
271 double pipeZ = pipeParams.getLength(
"z") * CLHEP::cm;
272 G4double alphaPipe = pipeParams.getAngle(
"alpha");
275 G4Box* s_sensors =
new G4Box(
"s_sensors", flexlen / 2., flexwid / 2., dz_sensor + AirGap);
277 for (
auto ladder : content.getNodes(
"Placements/Ladder")) {
279 std::string
id = ladder.getString(
"@id");
281 G4AssemblyVolume* assemblyLadder =
new G4AssemblyVolume();
282 assemblyLadder->AddPlacedAssembly(support, tra);
284 for (
auto pars : content.getNodes(
"SensorAlignment/ladder")) {
285 if (pars.getString(
"@id") ==
id) alignPars = pars;
288 for (
auto sidePars : alignPars.getNodes(
"side")) {
291 G4Transform3D transformSens;
292 if (sidePars.getString(
"@id") ==
"mirror") mirror = 1;
296 for (
auto sensorPars : sidePars.getNodes(
"sensor")) {
297 double x = sensorPars.getLength(
"x") * CLHEP::cm + zshift;
298 double y = sensorPars.getLength(
"y") * CLHEP::cm;
299 int ids = sensorPars.getInt(
"id");
302 double alpha1 = sensorPars.getAngle(
"alpha") * CLHEP::rad;
303 if (mirror) transformSens = G4Translate3D(x, y,
304 0) * G4RotateZ3D(alpha1) * G4RotateX3D(M_PI);
305 else transformSens = G4Translate3D(x, y, 0) * G4RotateZ3D(-alpha1);
307 new G4PVPlacement(transformSens, l_sensor,
"p_sensor", l_sensors,
true,
308 (ids + mirror * 6 + LadderID * 12));
310 transformSens = G4Translate3D(0, 0, mirror ? -zSens : zSens);
311 assemblyLadder->AddPlacedVolume(l_sensors, transformSens);
314 G4double thetaZ = ladder.getAngle(
"ThetaZ");
315 G4double r = ladder.getLength(
"r_plume") * CLHEP::cm - zshift * sin(thetaZ);
316 G4double z = ladder.getLength(
"z_plume") * CLHEP::cm - zshift * cos(thetaZ);
317 G4double phi = ladder.getAngle(
"Phi");
318 G4double alpha = ladder.getAngle(
"Alpha");
322 G4Transform3D transformPipe = G4Translate3D(pipeZ + zshift, pipeY, pipeX) * G4RotateZ3D(alphaPipe) * G4RotateY3D(+ M_PI / 2.);
323 assemblyLadder->AddPlacedVolume(pipe_l, transformPipe);
324 transformPipe = G4Translate3D(pipeZ + zshift
325 , pipeY, -pipeX) * G4RotateZ3D(alphaPipe) * G4RotateY3D(+ M_PI / 2.);
326 assemblyLadder->AddPlacedVolume(pipe_l, transformPipe);
329 G4Transform3D transform1;
331 G4AssemblyVolume* sup1 = buildSupport1();
332 G4AssemblyVolume* sup2 = buildSupport2();
333 transform1 = G4Translate3D(-fullLength / 2. - 18.7, 0., 1.2) * G4RotateY3D(thetaZ) * G4RotateX3D(M_PI / 2.) * G4RotateY3D(M_PI);
334 assemblyLadder->AddPlacedAssembly(sup1, transform1);
335 transform1 = G4Translate3D(fullLength / 2. + 19.5, 0, -2.6) * G4RotateY3D(thetaZ) * G4RotateX3D(M_PI / 2.);
336 assemblyLadder->AddPlacedAssembly(sup2, transform1);
340 G4AssemblyVolume* sup1 = buildSupport3();
341 G4AssemblyVolume* sup2 = buildSupport4();
342 transform1 = G4Translate3D(fullLength / 2. + 5, 0,
343 7.8) * G4RotateY3D(-thetaZ) * G4RotateZ3D(M_PI / 2.) * G4RotateX3D(M_PI / 2.) * G4RotateY3D(M_PI / 2.);
344 assemblyLadder->AddPlacedAssembly(sup1, transform1);
345 transform1 = G4Translate3D(-fullLength / 2. - 31, 0.,
346 -21.7) * G4RotateY3D(-thetaZ) * G4RotateZ3D(M_PI / 2.) * G4RotateX3D(-M_PI / 2.) * G4RotateY3D(M_PI);
347 assemblyLadder->AddPlacedAssembly(sup2, transform1);
350 G4Transform3D transform = G4RotateZ3D(phi) * G4Translate3D(r, 0,
351 z) * G4RotateY3D(thetaZ) * G4RotateZ3D(alpha + M_PI) * G4RotateY3D(- M_PI / 2.0);
353 assemblyLadder->MakeImprint(&topVolume, transform);