Function to actually create the geometry, has to be overridden by derived classes.
66 G4double density, fractionmass;
67 G4int ncomponents, natoms;
69 G4Element* H =
new G4Element(
"Hydrogen", symbol =
"H" , z = 1., a = 1.00794 * CLHEP::g / CLHEP::mole);
70 G4Element* He =
new G4Element(
"Helium", symbol =
"He" , z = 2., a = 4.002602 * CLHEP::g / CLHEP::mole);
71 G4Element* C =
new G4Element(
"Carbon", symbol =
"C" , z = 6., a = 12.01 * CLHEP::g / CLHEP::mole);
72 G4Element* O =
new G4Element(
"Oxygen", symbol =
"O", z = 8., a = 16.00 * CLHEP::g / CLHEP::mole);
73 G4Element* Si =
new G4Element(
"Silicon", symbol =
"Si" , z = 14., a = 28.09 * CLHEP::g / CLHEP::mole);
74 G4Element* Cl =
new G4Element(
"Chlore", symbol =
"Cl" , z = 17., a = 35.453 * CLHEP::g / CLHEP::mole);
75 G4Element* Cu =
new G4Element(
"Copper", symbol =
"Cu" , z = 29., a = 63.546 * CLHEP::g / CLHEP::mole);
76 G4Element* Zn =
new G4Element(
"Zinc", symbol =
"Zn" , z = 30., a = 65.38 * CLHEP::g / CLHEP::mole);
79 G4Material* gas_4He =
new G4Material(
"gas_4He", density = 0.0001664 * CLHEP::g / CLHEP::cm3, ncomponents = 1, kStateGas,
80 293.15 * CLHEP::kelvin, 1.*CLHEP::atmosphere);
81 gas_4He->AddElement(He, natoms = 1);
83 G4Material* gas_CO2 =
new G4Material(
"gas_CO2", density = 0.001842 * CLHEP::g / CLHEP::cm3, ncomponents = 2, kStateGas,
84 293.15 * CLHEP::kelvin, 1.*CLHEP::atmosphere);
85 gas_CO2->AddElement(C, natoms = 1);
86 gas_CO2->AddElement(O, natoms = 2);
89 G4Material* gasmix_4HeCO2 =
new G4Material(
"gasmix_4HeCO2", density = 0.00066908 * CLHEP::g / CLHEP::cm3, ncomponents = 2,
90 kStateGas, 293.15 * CLHEP::kelvin, 1.*CLHEP::atmosphere);
91 gasmix_4HeCO2->AddMaterial(gas_4He, fractionmass = 17.409 * CLHEP::perCent);
92 gasmix_4HeCO2->AddMaterial(gas_CO2, fractionmass = 82.591 * CLHEP::perCent);
95 G4Material* TPC_ParylenC =
new G4Material(
"TPC_ParylenC", density = 1.298 * CLHEP::g / CLHEP::cm3, ncomponents = 3);
96 TPC_ParylenC->AddElement(H, fractionmass = 0.050908 * CLHEP::perCent);
97 TPC_ParylenC->AddElement(C, fractionmass = 0.693276 * CLHEP::perCent);
98 TPC_ParylenC->AddElement(Cl, fractionmass = 0.255816 * CLHEP::perCent);
101 G4Material* TPC_G10 =
new G4Material(
"TPC_G10", density = 1.700 * CLHEP::g / CLHEP::cm3, ncomponents = 4);
102 TPC_G10->AddElement(Si, natoms = 1);
103 TPC_G10->AddElement(O , natoms = 2);
104 TPC_G10->AddElement(C , natoms = 3);
105 TPC_G10->AddElement(H , natoms = 3);
108 G4Material* metalCu =
new G4Material(
"MetalCopper", density = 8.960 * CLHEP::g / CLHEP::cm3, ncomponents = 1);
109 metalCu->AddElement(Cu, 1);
112 G4Material* TPC_metaCuScreen =
new G4Material(
"TPC_metaCuScreen", density = 8.95 * CLHEP::g / CLHEP::cm3, ncomponents = 2);
113 TPC_metaCuScreen->AddElement(Cu, fractionmass = 90.*CLHEP::perCent);
114 TPC_metaCuScreen->AddElement(Zn, fractionmass = 10.*CLHEP::perCent);
118 double stepSize = content.getLength(
"stepSize", 5 * CLHEP::um);
122 vector<double> bar = content.getArray(
"bar");
123 B2INFO(
"Contents of bar: ");
124 BOOST_FOREACH(
double value, bar) {
125 B2INFO(
"value: " << value);
129 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
131 G4double inch = 2.54 * CLHEP::cm;
134 G4double dx_Vessel = activeParams.getLength(
"dx_Vessel") * CLHEP::cm / 2.;
135 G4double dy_Vessel = activeParams.getLength(
"dy_Vessel") * CLHEP::cm / 2.;
136 G4double dz_VesselEndCap = 1. / 8. / 2.*inch;
137 G4double dz_Vessel = activeParams.getLength(
"dz_Vessel") * CLHEP::cm / 2. + dz_VesselEndCap;
138 G4VSolid* s_Vessel =
new G4Box(
"s_Vessel_tmp", dx_Vessel, dy_Vessel, dz_Vessel);
140 G4double width = 1. / 8.*inch;
141 G4double dx_iGasTPC = (dx_Vessel - width);
142 G4double dy_iGasTPC = (dy_Vessel - width);
143 G4double dz_iGasTPC = (dz_Vessel);
146 G4VSolid* s_iGasTPC =
new G4Box(
"s_iGasTPC", dx_iGasTPC, dy_iGasTPC, dz_iGasTPC);
149 s_Vessel =
new G4SubtractionSolid(
"s_Vessel", s_Vessel, s_iGasTPC, 0, G4ThreeVector(0, 0, 0));
152 G4LogicalVolume* l_iGasTPC =
new G4LogicalVolume(s_iGasTPC, gasmix_4HeCO2,
"l_iGasTPC");
154 G4RotationMatrix* rotXx =
new G4RotationMatrix();
155 G4double AngleX = activeParams.getAngle(
"AngleX");
156 G4double AngleZ = activeParams.getAngle(
"AngleZ");
157 rotXx->rotateX(AngleX);
158 rotXx->rotateZ(AngleZ);
159 G4ThreeVector TPCpos = G4ThreeVector(
160 activeParams.getLength(
"TPCpos_x") * CLHEP::cm,
161 activeParams.getLength(
"TPCpos_y") * CLHEP::cm,
162 activeParams.getLength(
"TPCpos_z") * CLHEP::cm
165 new G4PVPlacement(rotXx, TPCpos, l_Vessel,
"p_Vessel", &topVolume,
false, 1);
166 new G4PVPlacement(rotXx, TPCpos, l_iGasTPC,
"p_iGasTPC", &topVolume,
false, 1);
168 B2INFO(
"Micro-TPC-" << detID <<
" placed at: " << TPCpos <<
" mm");
193 G4VisAttributes* orange =
new G4VisAttributes(G4Colour(1, 2, 0));
194 orange->SetForceAuxEdgeVisible(
true);
196 l_Vessel->SetVisAttributes(orange);
198 G4double dx_parC1 = dx_iGasTPC;
199 G4double dy_parC1 = dy_iGasTPC;
200 G4double dz_parC1 = dz_iGasTPC;
201 G4double cwidth = 0.001 / 2. * inch;
202 G4double dx_parC2 = dx_parC1 - cwidth;
203 G4double dy_parC2 = dy_parC1 - cwidth;
204 G4double dz_parC2 = dz_parC1 - cwidth;
205 G4Box* s_parC1 =
new G4Box(
"s_parC1", dx_parC1, dy_parC1, dz_parC1);
206 G4Box* s_parC2 =
new G4Box(
"s_parC2", dx_parC2, dy_parC2, dz_parC2);
207 G4VSolid* s_parylenC =
new G4SubtractionSolid(
"s_parylenC", s_parC1, s_parC2, 0, G4ThreeVector(0, 0, 0));
208 G4LogicalVolume* l_parylenC =
new G4LogicalVolume(s_parylenC, TPC_ParylenC,
"l_parylenC");
209 new G4PVPlacement(0, G4ThreeVector(0 * CLHEP::cm, 0 * CLHEP::cm, 0 * CLHEP::cm), l_parylenC,
"p_parylenC", l_iGasTPC,
false, 1);
211 G4double dx_kap1 = dx_parC2;
212 G4double dy_kap1 = dy_parC2;
213 G4double dz_kap1 = dz_parC2;
214 G4double kwidth = 0.05 / 2. * CLHEP::cm;
215 G4double dx_kap2 = dx_kap1 - kwidth;
216 G4double dy_kap2 = dy_kap1 - kwidth;
217 G4double dz_kap2 = dz_kap1 - kwidth;
218 G4Box* s_kap1 =
new G4Box(
"s_kap1", dx_kap1, dy_kap1, dz_kap1);
219 G4Box* s_kap2 =
new G4Box(
"s_kap2", dx_kap2, dy_kap2, dz_kap2);
220 G4VSolid* s_kapton =
new G4SubtractionSolid(
"s_kapton", s_kap1, s_kap2, 0, G4ThreeVector(0, 0, 0));
222 new G4PVPlacement(0, G4ThreeVector(0 * CLHEP::cm, 0 * CLHEP::cm, 0 * CLHEP::cm), l_kapton,
"p_kapton", l_iGasTPC,
false, 1);
225 G4double w = 1.4 * CLHEP::cm;
226 G4double rodx = 9.476 * CLHEP::cm;
227 G4double rody = 6.976 * CLHEP::cm;
228 G4double ridx = rodx - w;
229 G4double ridy = rody - w;
231 G4double xrodh = ridx / 2. + w / 8.;
232 G4double yrodh = ridy / 2. + w / 8.;
235 G4double iR_Rod = 0.*CLHEP::mm;
236 G4double oR_Rod = 5. / 2.*CLHEP::mm;
237 G4double h_Rod = 20. / 2. * CLHEP::cm;
238 G4double sA_Rod = 0.*CLHEP::deg;
239 G4double spA_Rod = 360.*CLHEP::deg;
247 G4double x_Rod[4] = {xrodh, xrodh, -xrodh, -xrodh};
248 G4double y_Rod[4] = {yrodh, -yrodh, yrodh, -yrodh};
250 G4double z_Rod = 0. * CLHEP::cm;
252 G4Tubs* s_Rod =
new G4Tubs(
"s_Rod", iR_Rod, oR_Rod, h_Rod, sA_Rod, spA_Rod);
255 new G4PVPlacement(0, G4ThreeVector(x_Rod[0], y_Rod[0], z_Rod), l_Rod,
"p_Rod_0", l_iGasTPC,
false, 1);
256 new G4PVPlacement(0, G4ThreeVector(x_Rod[1], y_Rod[1], z_Rod), l_Rod,
"p_Rod_1", l_iGasTPC,
false, 1);
257 new G4PVPlacement(0, G4ThreeVector(x_Rod[2], y_Rod[2], z_Rod), l_Rod,
"p_Rod_2", l_iGasTPC,
false, 1);
258 new G4PVPlacement(0, G4ThreeVector(x_Rod[3], y_Rod[3], z_Rod), l_Rod,
"p_Rod_3", l_iGasTPC,
false, 1);
263 G4double dx_Ring = rodx / 2.;
264 G4double dy_Ring = rody / 2.;
265 G4double dz_Ring = 0.127 / 2.*CLHEP::cm;
267 G4VSolid* s_Ring =
new G4Box(
"s_RingFilled", dx_Ring, dy_Ring, dz_Ring);
270 G4double dx_RingHole = xrodh / 2.;
271 G4double dy_RingHole = yrodh / 2.;
272 G4double dz_RingHole = dz_Ring;
273 G4VSolid* s_RingHole =
new G4Box(
"s_RingHole", dx_RingHole, dy_RingHole, dz_RingHole);
274 s_Ring =
new G4SubtractionSolid(
"s_Ring", s_Ring, s_RingHole, 0, G4ThreeVector(0, 0, 0));
276 G4double iR_RingHoles = 0.*CLHEP::mm;
277 G4double oR_RingHoles = oR_Rod;
278 G4double h_RingHoles = dz_Ring;
279 G4double sA_RingHoles = 0.*CLHEP::deg;
280 G4double spA_RingHoles = 360.*CLHEP::deg;
281 G4VSolid* s_RingHoles =
new G4Tubs(
"s_RingHoles", iR_RingHoles, oR_RingHoles, h_RingHoles, sA_RingHoles, spA_RingHoles);
283 for (G4int i = 0; i < 4; i++) {
284 sprintf(Name,
"s_Ring_%d", i);
285 s_Ring =
new G4SubtractionSolid(Name, s_Ring, s_RingHoles, 0, G4ThreeVector(x_Rod[i], y_Rod[i], 0));
290 G4double hspacer = 1.*CLHEP::cm;
291 G4double offset = dz_iGasTPC - 5.*CLHEP::cm;
296 for (G4int i = 0; i < RingNb; i++) {
299 z_Ring[i] = -dz_iGasTPC + offset + (hspacer + 2. * dz_Ring) * i;
301 sprintf(Name,
"p_Ring_%d", i);
302 new G4PVPlacement(0, G4ThreeVector(x_Ring[i], y_Ring[i], z_Ring[i]), l_Ring, Name, l_iGasTPC,
false, 1);
306 G4VSolid* s_Anode =
new G4Box(
"s_Anode", dx_Ring, dy_Ring, dz_Ring);
307 for (G4int i = 0; i < 4; i++) {
308 sprintf(Name,
"s_Anode_%d", i);
309 s_Anode =
new G4SubtractionSolid(Name, s_Anode, s_RingHoles, 0, G4ThreeVector(x_Rod[i], y_Rod[i], 0));
314 z_Ring[10] = -dz_iGasTPC + offset + (hspacer + 2.*dz_Ring) * RingNb;
315 new G4PVPlacement(0, G4ThreeVector(x_Ring[RingNb], y_Ring[RingNb], z_Ring[RingNb]), l_Anode,
"p_Anode", l_iGasTPC,
false, 1);
318 G4double iR_RSpacer = oR_Rod;
319 G4double oR_RSpacer = oR_Rod + 2.*CLHEP::mm;
320 G4double h_RSpacer = (z_Ring[1] - dz_Ring - (z_Ring[0] + dz_Ring)) / 2.;
321 G4double sA_RSpacer = 0.*CLHEP::deg;
322 G4double spA_RSpacer = 360.*CLHEP::deg;
323 G4Tubs* s_RSpacer =
new G4Tubs(
"s_RSpacer1", iR_RSpacer, oR_RSpacer, h_RSpacer, sA_RSpacer, spA_RSpacer);
324 G4LogicalVolume* l_RSpacer =
new G4LogicalVolume(s_RSpacer,
geometry::Materials::get(
"G4_POLYVINYL_ACETATE"),
"l_RSpacer");
326 G4double x_RSpacer[40];
327 G4double y_RSpacer[40];
328 G4double z_RSpacer[40];
329 for (G4int i = 0; i < 10; i++) {
330 for (G4int k = 0; k < 4; k++) {
331 x_RSpacer[i] = x_Rod[k];
332 y_RSpacer[i] = y_Rod[k];
333 z_RSpacer[i] = z_Ring[i] + dz_Ring + h_RSpacer;
334 sprintf(Name,
"p_RSpacer_%d_%d", i, k);
335 new G4PVPlacement(0, G4ThreeVector(x_RSpacer[i], y_RSpacer[i], z_RSpacer[i]), l_RSpacer, Name, l_iGasTPC,
false, 1);
340 G4double dx_GEM = 50. / 2.*CLHEP::mm;
341 G4double dy_GEM = 50. / 2.*CLHEP::mm;
342 G4double dz_GEM = 1.6 / 2.*CLHEP::mm;
344 G4double x_GEM = 0.*CLHEP::cm;
345 G4double y_GEM = 0.*CLHEP::cm;
347 G4double z_GEM[] = { z_Ring[0] - dz_Ring - dz_GEM, z_Ring[0] - dz_Ring - 2. * dz_GEM - 0.28 * CLHEP::cm};
351 G4VSolid* s_GEM =
new G4Box(
"s_GEM", dx_GEM, dy_GEM, dz_GEM);
353 for (G4int i = 0; i < 2; i++) {
354 sprintf(Name,
"p_GEM_%d", i);
355 new G4PVPlacement(0, G4ThreeVector(x_GEM, y_GEM, z_GEM[i]), l_GEM, Name, l_iGasTPC,
false, 1);
359 G4double dx_GEMSupport = dx_Ring;
360 G4double dy_GEMSupport = dy_Ring;
361 G4double dz_GEMSupport = dz_GEM;
362 G4VSolid* s_GEMSupport =
new G4Box(
"s_GEMSupport1", dx_GEMSupport, dy_GEMSupport, dz_GEMSupport);
364 G4double iR_GEMSupportHoles = 0.*CLHEP::mm;
365 G4double oR_GEMSupportHoles = oR_Rod;
366 G4double h_GEMSupportHoles = dz_GEMSupport;
367 G4double sA_GEMSupportHoles = 0.*CLHEP::deg;
368 G4double spA_GEMSupportHoles = 360.*CLHEP::deg;
369 G4VSolid* s_GEMSupportHoles =
new G4Tubs(
"s_GEMSupportHoles", iR_GEMSupportHoles, oR_GEMSupportHoles, h_GEMSupportHoles,
370 sA_GEMSupportHoles, spA_GEMSupportHoles);
371 s_GEMSupport =
new G4SubtractionSolid(
"s_GEMSupport2", s_GEMSupport, s_GEM, 0, G4ThreeVector(0, 0, 0));
372 for (G4int i = 0; i < 4; i++) {
373 sprintf(Name,
"s_GEMSupport_%d", i);
374 s_GEMSupport =
new G4SubtractionSolid(Name, s_GEMSupport, s_GEMSupportHoles, 0, G4ThreeVector(x_Rod[i], y_Rod[i], 0));
377 G4LogicalVolume* l_GEMSupport =
new G4LogicalVolume(s_GEMSupport, TPC_G10,
"l_GEMSupport");
378 for (G4int i = 0; i < 2; i++) {
379 sprintf(Name,
"p_GEMSupport_%d", i);
380 new G4PVPlacement(0, G4ThreeVector(x_GEM, y_GEM, z_GEM[i]), l_GEMSupport, Name, l_iGasTPC,
false, 1);
384 G4double dx_GasTPC = 2.95 / 2. * CLHEP::cm;
385 G4double dy_GasTPC = 2.95 / 2. * CLHEP::cm;
386 G4double dz_GasTPC = (z_Ring[10] - dz_Ring - z_GEM[0] - dz_GEM) / 2.;
387 cout <<
" dz_GasTPC " << dz_GasTPC / CLHEP::cm << endl;
388 G4Box* s_GasTPC =
new G4Box(
"s_GasTPC", dx_GasTPC, dy_GasTPC, dz_GasTPC);
389 G4LogicalVolume* l_GasTPC =
new G4LogicalVolume(s_GasTPC, gasmix_4HeCO2,
"l_GasTPC", 0,
m_sensitive);
392 l_GasTPC->SetUserLimits(
new G4UserLimits(stepSize));
394 G4double x_GasTPC = 0;
395 G4double y_GasTPC = 0;
396 G4double z_GasTPC = z_GEM[0] + dz_GEM + dz_GasTPC;
398 new G4PVPlacement(0, G4ThreeVector(x_GasTPC, y_GasTPC, z_GasTPC), l_GasTPC,
"p_GasTPC", l_iGasTPC,
false, detID);
400 B2INFO(
"Micro-TPC-Sensitive-Volume-" << detID <<
" placed at: (" << TPCpos.getX() + x_GasTPC <<
"," << TPCpos.getY() + y_GasTPC <<
401 "," << TPCpos.getZ() + z_GasTPC <<
") mm");
404 G4double dx_PixelChip = dx_GasTPC;
405 G4double dy_PixelChip = dy_GasTPC;
406 G4double dz_PixelChip = 1. / 2.*CLHEP::mm;
408 G4double x_PixelChip = 0.*CLHEP::mm;
409 G4double y_PixelChip = 0.*CLHEP::mm;
410 G4double z_PixelChip = z_GEM[1] - 0.3 * CLHEP::cm;
412 G4Box* s_PixelChip =
new G4Box(
"s_PixelChip", dx_PixelChip, dy_PixelChip, dz_PixelChip);
413 G4LogicalVolume* l_PixelChip =
new G4LogicalVolume(s_PixelChip,
geometry::Materials::get(
"G4_PLASTIC_SC_VINYLTOLUENE"),
415 new G4PVPlacement(0, G4ThreeVector(x_PixelChip, y_PixelChip, z_PixelChip), l_PixelChip,
"p_PixelChip", l_iGasTPC,
false, 1);
418 G4double dx_CuPlate = dx_Ring;
419 G4double dy_CuPlate = dy_Ring;
420 G4double dz_CuPlate = dz_PixelChip;
422 G4VSolid* s_CuPlate =
new G4Box(
"s_CuPlate", dx_CuPlate, dy_CuPlate, dz_CuPlate);
423 G4VSolid* s_HolesInCuPlate =
new G4Tubs(
"HolesInCuPlate", iR_RingHoles, oR_RingHoles, dz_PixelChip, sA_RingHoles, spA_RingHoles);
424 for (G4int i = 0; i < 4; i++) {
425 sprintf(Name,
"s_CuPlate_%d", i);
426 s_CuPlate =
new G4SubtractionSolid(Name, s_CuPlate, s_HolesInCuPlate, 0, G4ThreeVector(x_Rod[i], y_Rod[i], 0));
428 s_CuPlate =
new G4SubtractionSolid(
"s_CuPlate", s_CuPlate, s_PixelChip, 0, G4ThreeVector(0, 0, 0));
431 G4LogicalVolume* l_CuPlate =
new G4LogicalVolume(s_CuPlate, TPC_metaCuScreen,
"l_CuPlate");
432 new G4PVPlacement(0, G4ThreeVector(x_PixelChip, y_PixelChip, z_PixelChip), l_CuPlate,
"p_CuPlate", l_iGasTPC,
false, 1);
435 G4double dx_PixelBoard = dx_Ring;
436 G4double dy_PixelBoard = dy_Ring;
437 G4double dz_PixelBoard = 2.*CLHEP::mm;
439 G4VSolid* s_PixelBoard =
new G4Box(
"s_PixelBoard1", dx_PixelBoard, dy_PixelBoard, dz_PixelBoard);
440 G4VSolid* s_PixelBoardHoles =
new G4Tubs(
"s_PixelBoardHoles", iR_RingHoles, oR_RingHoles, dz_PixelBoard, sA_RingHoles,
442 for (G4int i = 0; i < 4; i++) {
443 sprintf(Name,
"s_PixelBoard_%d", i);
444 s_PixelBoard =
new G4SubtractionSolid(Name, s_PixelBoard, s_PixelBoardHoles, 0, G4ThreeVector(x_Rod[i], y_Rod[i], 0));
447 G4double x_PixelBoard = 0.*CLHEP::mm;
448 G4double y_PixelBoard = 0.*CLHEP::mm;
449 G4double z_PixelBoard = z_PixelChip - dz_PixelBoard - dz_PixelChip;
451 G4LogicalVolume* l_PixelBoard =
new G4LogicalVolume(s_PixelBoard, TPC_G10,
"l_PixelBoard");
453 new G4PVPlacement(0, G4ThreeVector(x_PixelBoard, y_PixelBoard, z_PixelBoard), l_PixelBoard,
"p_PixelBoard", l_iGasTPC,
false, 1);