27#include <TGeoElement.h>
28#include <TGeoManager.h>
29#include <TGeoMaterial.h>
30#include <TGeoMatrix.h>
33#include <TVirtualMC.h>
37#include "Ex03DetectorConstruction.h"
54 fAbsorberThickness(0.),
56 fDefaultMaterial(
"Galactic"),
57 fAbsorberMaterial(
"Lead"),
58 fGapMaterial(
"liquidArgon"),
59 fUseReflection(kFALSE),
60 fRequireReflectedHits(kFALSE)
65 fAbsorberThickness = 1.;
70 ComputeCalorParameters();
109 new TGeoManager(
"E03_geometry",
"E03 VMC example geometry");
122 new TGeoMaterial(
"Aluminium", a = 26.98, z = 13., density = 2.700);
124 new TGeoMaterial(
"liquidArgon", a = 39.95, z = 18., density = 1.390);
126 new TGeoMaterial(
"Lead", a = 207.19, z = 82., density = 11.35);
134 TGeoElement* elH =
new TGeoElement(
"Hydrogen",
"H", z = 1, a = 1.01);
135 TGeoElement* elC =
new TGeoElement(
"Carbon",
"C", z = 6., a = 12.01);
136 TGeoElement* elN =
new TGeoElement(
"Nitrogen",
"N", z = 7., a = 14.01);
137 TGeoElement* elO =
new TGeoElement(
"Oxygen",
"O", z = 8., a = 16.00);
138 TGeoElement* elSi =
new TGeoElement(
"Silicon",
"Si", z = 14., a = 28.09);
152 TGeoMixture* matH2O =
new TGeoMixture(
"Water", 2, density = 1.000);
153 matH2O->AddElement(elH, 2);
154 matH2O->AddElement(elO, 1);
159 TGeoMixture* matSci =
new TGeoMixture(
"Scintillator", 2, density = 1.032);
160 matSci->AddElement(elC, 9);
161 matSci->AddElement(elH, 10);
163 TGeoMixture* matMyl =
new TGeoMixture(
"Mylar", 3, density = 1.397);
164 matMyl->AddElement(elC, 10);
165 matMyl->AddElement(elH, 8);
166 matMyl->AddElement(elO, 4);
168 TGeoMixture* matSiO2 =
new TGeoMixture(
"quartz", 2, density = 2.200);
169 matSiO2->AddElement(elSi, 1);
170 matSiO2->AddElement(elO, 2);
176 TGeoMixture* matAir =
new TGeoMixture(
"Air", 2, density = 1.29e-03);
177 matAir->AddElement(elN, 0.7);
178 matAir->AddElement(elO, 0.3);
185 TGeoMixture* matAerog =
new TGeoMixture(
"Aerogel", 3, density = 0.200);
186 matAerog->AddElement(matSiO2, 0.625);
187 matAerog->AddElement(matH2O, 0.374);
188 matAerog->AddElement(elC, 0.001);
194 TGeoMixture* matCO2 =
new TGeoMixture(
"CarbonicGas", 2, density = 1.842e-03);
195 matCO2->AddElement(elC, 1);
196 matCO2->AddElement(elO, 2);
198 Double_t atmosphere = 6.32421e+08;
199 Double_t pressure = 50. * atmosphere;
200 Double_t temperature = 325.;
201 matCO2->SetPressure(pressure);
202 matCO2->SetTemperature(temperature);
203 matCO2->SetState(TGeoMaterial::kMatStateGas);
205 TGeoMixture* matSteam =
new TGeoMixture(
"WaterSteam", 1, density = 0.3e-03);
206 matSteam->AddElement(matH2O, 1.0);
208 pressure = 2. * atmosphere;
210 matSteam->SetPressure(pressure);
211 matSteam->SetTemperature(temperature);
212 matSteam->SetState(TGeoMaterial::kMatStateGas);
218 new TGeoMaterial(
"Galactic", a = 1.e-16, z = 1.e-16, density = 1.e-16);
220 TGeoMixture* matBeam =
new TGeoMixture(
"Beam", 1, density = 1.e-5);
221 matBeam->AddElement(matAir, 1.0);
223 pressure = 2. * atmosphere;
224 temperature = STP_temperature;
225 matBeam->SetPressure(pressure);
226 matBeam->SetTemperature(temperature);
227 matBeam->SetState(TGeoMaterial::kMatStateGas);
243 for (Int_t i = 8; i < 20; ++i) param[i] = 0.;
246 TList* materials = gGeoManager->GetListOfMaterials();
247 TIter next(materials);
248 while (TObject* obj = next()) {
249 TGeoMaterial* material = (TGeoMaterial*)obj;
250 new TGeoMedium(material->GetName(), ++mediumId, material, param);
265 Int_t defaultMediumId =
267 Int_t absorberMediumId =
269 Int_t gapMediumId = gGeoManager->GetMedium(
fGapMaterial.Data())->GetId();
280 gGeoManager->Volume(
"WRLD",
"BOX", defaultMediumId, world, 3);
281 gGeoManager->SetTopVolume(top);
292 gGeoManager->Volume(
"CALO",
"BOX", defaultMediumId, calo, 3);
297 gGeoManager->Node(
"CALO", 1,
"WRLD", posX, posY, posZ, 0, kTRUE, ubuf);
301 Double_t start = -calo[0];
303 gGeoManager->Division(
"CELL",
"CALO", 1,
fNbOfLayers, start, width);
312 gGeoManager->Volume(
"LAYE",
"BOX", defaultMediumId, layer, 3);
317 gGeoManager->Node(
"LAYE", 1,
"CELL", posX, posY, posZ, 0, kTRUE, ubuf);
330 gGeoManager->Volume(
"ABSO",
"BOX", absorberMediumId, abso, 3);
338 auto volume = gGeoManager->GetVolume(
"ABSO");
339 auto mother = gGeoManager->GetVolume(
"LAYE");
340 mother->AddNode(volume, 1,
new TGeoTranslation(posX + abso[0], 0., 0.));
341 auto reflection =
new TGeoHMatrix();
342 reflection->ReflectX(kTRUE);
343 reflection->SetDx(posX - abso[0]);
344 mother->AddNode(volume, 2, reflection);
347 gGeoManager->Node(
"ABSO", 1,
"LAYE", posX, posY, posZ, 0, kTRUE, ubuf);
361 gGeoManager->Volume(
"GAPX",
"BOX", gapMediumId, gap, 3);
369 auto volume = gGeoManager->GetVolume(
"GAPX");
370 auto mother = gGeoManager->GetVolume(
"LAYE");
371 mother->AddNode(volume, 1,
new TGeoTranslation(posX + gap[0], 0., 0.));
372 auto reflection =
new TGeoHMatrix();
373 reflection->ReflectX(kTRUE);
374 reflection->SetDx(posX - gap[0]);
375 mother->AddNode(volume, 2, reflection);
378 gGeoManager->Node(
"GAPX", 1,
"LAYE", posX, posY, posZ, 0, kTRUE, ubuf);
394 gGeoManager->CloseGeometry();
397 gMC->SetRootGeometry();
408 std::set<TString> createdMaterials;
415 std::vector<MaterialCuts> materialCutsVector = {
416 MaterialCuts(
"Aluminium", 10.e-06, 10.e-06, 597.e-06, 597.e-06),
417 MaterialCuts(
"liquidArgon", 10.e-06, 10.e-06, 342.9e-06, 342.9e-06),
418 MaterialCuts(
"Lead", 100.5e-06, 100.5e-06, 1.378e-03, 1.378e-03),
419 MaterialCuts(
"Water", 10.e-06, 10.e-06, 347.2e-06, 347.2e-06),
420 MaterialCuts(
"Scintillator", 10.e-06, 10.e-06, 355.8e-06, 355.8e-06),
421 MaterialCuts(
"Mylar", 10.e-06, 10.e-06, 417.5e-06, 417.5e-06),
422 MaterialCuts(
"quartz", 10.e-06, 10.e-06, 534.1e-06, 534.1e-06),
423 MaterialCuts(
"Air", 10.e-06, 10.e-06, 10.e-06, 10.e-06),
424 MaterialCuts(
"Aerogel", 10.e-06, 10.e-06, 119.0e-06, 119.0e-06),
425 MaterialCuts(
"CarbonicGas", 10.e-09, 10.e-06, 10.e-06, 10.e-06),
426 MaterialCuts(
"WaterSteam", 10.e-06, 10.e-06, 10.e-06, 10.e-06),
427 MaterialCuts(
"Galactic", 10.e-06, 10.e-06, 10.e-06, 10.e-06),
428 MaterialCuts(
"Beam", 10.e-06, 10.e-06, 10.e-06, 10.e-06)
432 for (
auto materialCuts : materialCutsVector) {
434 if (createdMaterials.find(materialCuts.fName) == createdMaterials.end())
437 Int_t mediumId = gMC->MediumId(materialCuts.fName);
446 Double_t cut = 100.e-06;
447 gMC->Gstpar(mediumId,
"CUTGAM", cut);
448 gMC->Gstpar(mediumId,
"BCUTE", cut);
449 gMC->Gstpar(mediumId,
"CUTELE", cut);
450 gMC->Gstpar(mediumId,
"DCUTE", cut);
464 Int_t mediumId = gMC->MediumId(
"Lead");
466 gMC->Gstpar(mediumId,
"COMP", 0);
467 gMC->Gstpar(mediumId,
"PAIR", 0);
468 gMC->Gstpar(mediumId,
"PHOT", 0);
477 cout <<
"\n------------------------------------------------------------"
478 <<
"\n---> The calorimeter is " <<
fNbOfLayers <<
" layers of: [ "
481 <<
"\n------------------------------------------------------------\n";
The detector construction (via TGeo ).
virtual ~Ex03DetectorConstruction()
Double_t fWorldSizeYZ
The world size y,z component.
Int_t fNbOfLayers
The number of calorimeter layers.
Ex03DetectorConstruction()
Bool_t fUseReflection
Enable reflected sensitive placements.
void SetNbOfLayers(Int_t value)
Double_t fGapThickness
The gap thickness.
TString fDefaultMaterial
The default material name.
void SetGapThickness(Double_t value)
void PrintCalorParameters()
void SetAbsorberThickness(Double_t value)
TString fAbsorberMaterial
The absorber material name.
Double_t fLayerThickness
The calorimeter layer thickness.
TString fGapMaterial
The gap material name.
Double_t fAbsorberThickness
The absorber thickness.
void SetAbsorberMaterial(const TString &materialName)
void SetDefaultMaterial(const TString &materialName)
Double_t fCalorThickness
The calorimeter thickness.
void ConstructMaterials()
void ComputeCalorParameters()
void SetCalorSizeYZ(Double_t value)
Double_t fWorldSizeX
The world size x component.
void SetGapMaterial(const TString &materialName)
Double_t fCalorSizeYZ
The calorimeter size y,z component.