38 const TGeoManager* mgr)
59 Double_t xchip, zchip;
68 LOG(warning) <<
"Sensor half thickness (" << ysens
69 <<
") greater than chip half thickness (" << ychip
70 <<
"), setting equal";
85 TGeoMedium* medSi = mgr->GetMedium(
"ALPIDE_SI$");
91 medSi = mgr->GetMedium(
"ALPIDE_SI$");
93 TGeoMedium* medAir = mgr->GetMedium(
"ALPIDE_AIR$");
94 TGeoMedium* medMetal = mgr->GetMedium(
"ALPIDE_METALSTACK$");
104 TGeoVolume* chipVol =
new TGeoVolume(chipName, chip, medChip);
105 chipVol->SetVisibility(kTRUE);
106 chipVol->SetLineColor(1);
107 chipVol->SetFillColor(chipVol->GetLineColor());
108 chipVol->SetFillStyle(4000);
110 TGeoVolume* sensVol =
new TGeoVolume(sensName, sensor, medChip);
111 sensVol->SetVisibility(kTRUE);
112 sensVol->SetLineColor(8);
113 sensVol->SetLineWidth(1);
114 sensVol->SetFillColor(sensVol->GetLineColor());
115 sensVol->SetFillStyle(4000);
120 static TGeoManager* metalCacheOwner =
nullptr;
121 static TGeoVolume* metalVol =
nullptr;
122 if (metalCacheOwner != gGeoManager) {
124 metalCacheOwner = gGeoManager;
130 metalVol =
new TGeoVolume(
"MetalStack", metallay, medMetal);
131 metalVol->SetVisibility(kTRUE);
132 metalVol->SetLineColor(1);
133 metalVol->SetLineWidth(1);
134 metalVol->SetFillColor(metalVol->GetLineColor());
135 metalVol->SetFillStyle(4000);
139 if (metallay->GetDX() != xchip || metallay->GetDY() != ylen || metallay->GetDZ() != zchip) {
140 LOG(fatal) <<
"AlpideChip::createChip: the cached MetalStack was built with half lengths "
141 << metallay->GetDX() <<
"," << metallay->GetDY() <<
"," << metallay->GetDZ()
142 <<
" but this call asks for " << xchip <<
"," << ylen <<
"," << zchip
143 <<
" - the single-volume cache assumes the same metal stack in every chip";
147 ypos = chip->GetDY() - metallay->GetDY();
148 chipVol->AddNode(metalVol, 1,
new TGeoTranslation(0., ypos, 0.));
150 ypos -= (metallay->GetDY() + sensor->GetDY());
151 chipVol->AddNode(sensVol, 1,
new TGeoTranslation(0., ypos, 0.));
183 Float_t aBEOL[3] = {26.982, 28.086, 15.999};
184 Float_t zBEOL[3] = {13, 14, 8};
185 Float_t wBEOL[3] = {0.170, 0.388, 0.442};
189 Float_t aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
190 Float_t zAir[4] = {6., 7., 8., 18.};
191 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
194 if (mgr.getMediumID(
"ALPIDE",
id) < 0) {
195 mgr.Mixture(
"ALPIDE",
id,
"METALSTACK$", aBEOL, zBEOL, dBEOL, 3, wBEOL);
196 mgr.Medium(
"ALPIDE",
id,
"METALSTACK$",
id, 0, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin);
200 if (mgr.getMediumID(
"ALPIDE",
id) < 0) {
201 mgr.Mixture(
"ALPIDE",
id,
"AIR$", aAir, zAir, dAir, 4, wAir);
202 mgr.Medium(
"ALPIDE",
id,
"AIR$",
id, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
206 if (mgr.getMediumID(
"ALPIDE",
id) < 0) {
207 mgr.Material(
"ALPIDE",
id,
"SI$", 0.28086E+02, 0.14000E+02, 0.23300E+01, 0.93600E+01, 0.99900E+03);
208 mgr.Medium(
"ALPIDE",
id,
"SI$",
id, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
static TGeoVolume * createChip(Double_t yc, Double_t ys, char const *chipName="AlpideChip", char const *sensName="AlpideSensor", Bool_t dummy=kFALSE, const TGeoManager *mgr=gGeoManager)