Project
Loading...
Searching...
No Matches
Detector.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include "TGeoBBox.h"
13#include "TGeoCompositeShape.h"
14#include "TGeoManager.h" // for TGeoManager
15#include "TGeoMatrix.h"
16#include "TGeoVolume.h"
17#include "TMath.h"
18#include "TString.h"
19
20#include <fairlogger/Logger.h>
21#include "FairVolume.h"
22#include "FairRootManager.h"
23
24#include "TOFSimulation/Detector.h"
25
26#include <TVirtualMC.h> // for TVirtualMC, gMC
29#include "DetectorsBase/Stack.h"
30
31#include <algorithm>
32#include <array>
33#include <map>
34#include <utility>
35#include <vector>
36
37using namespace o2::tof;
38
40
42 : o2::base::DetImpl<Detector>("TOF", active), mEventNr(0), mTOFHoles(kTRUE), mHits(o2::utils::createSimVector<HitType>())
43{
44 for (Int_t i = 0; i < Geo::NSECTORS; i++) {
45 mTOFSectors[i] = 1;
46 }
47}
48
50 : o2::base::DetImpl<Detector>(rhs),
51 mEventNr(0),
52 mTOFHoles(rhs.mTOFHoles),
53 mHits(o2::utils::createSimVector<HitType>())
54{
55 for (Int_t i = 0; i < Geo::NSECTORS; i++) {
56 mTOFSectors[i] = rhs.mTOFSectors[i];
57 }
58}
59
64
66{
67 TGeoVolume* v = gGeoManager->GetVolume("FPAD");
68 if (v == nullptr) {
69 printf("Sensitive volume FSEN not found!!!!!!!!");
70 } else {
71 AddSensitiveVolume(v);
72 }
73}
74
75Bool_t Detector::ProcessHits(FairVolume* v)
76{
77 // This method is called from the MC stepping for the sensitive volume only
78 if (static_cast<int>(fMC->TrackCharge()) == 0) {
79 // set a very large step size for neutral particles
80 return kFALSE; // take only charged particles
81 }
82
83 float pos2x, pos2y, pos2z;
84 fMC->TrackPosition(pos2x, pos2y, pos2z);
85 Float_t radius = std::sqrt(pos2x * pos2x + pos2y * pos2y);
86 LOG(debug) << "Process hit in TOF volume ar R=" << radius << " - Z=" << pos2z;
87
88 Float_t enDep = fMC->Edep();
89 if (enDep < 1E-8) {
90 return kFALSE; // wo se need a threshold?
91 }
92
93 // ADD HIT
94 float posx, posy, posz;
95 fMC->TrackPosition(posx, posy, posz);
96 float time = fMC->TrackTime() * 1.0e09;
97 auto stack = static_cast<o2::data::Stack*>(fMC->GetStack());
98 int trackID = stack->GetCurrentTrackNumber();
99 int sensID = v->getMCid();
100 Int_t det[5];
101 Float_t pos[3] = {posx, posy, posz};
102 Float_t delta[3];
103 Geo::getPadDxDyDz(pos, det, delta);
104 auto channel = Geo::getIndex(det);
105 HitType newhit(posx, posy, posz, time, enDep, trackID, sensID);
106 // an invalid channel (getIndex returns -1 off a valid pad) never merges, and
107 // there is nothing to merge with before the first hit of the event
108 if (channel < 0 || mHits->empty() || channel != mLastChannelID || !isMergable(newhit, mHits->back())) {
109 mHits->push_back(newhit);
110 stack->addHit(GetDetId());
111 } else {
112 mHits->back().SetEnergyLoss(mHits->back().GetEnergyLoss() + newhit.GetEnergyLoss());
113 // LOG(info)<<"Merging hit "<<"\n";
114 // <<mHits->back().GetId()<<"with new hit "<<newhit.GetId()<<"\n";
115 }
116 mLastChannelID = channel;
117
118 return kTRUE;
119}
120
122{
123 FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, kTRUE);
124}
125
127{
128 // TODO: move this out of here
129 if (!o2::utils::ShmManager::Instance().isOperational()) {
130 mHits->clear();
131 }
132 mLastChannelID = -1;
133}
134
136{
137 Int_t isxfld = 2;
138 Float_t sxmgmx = 10.;
140
141 //--- Quartz (SiO2) ---
142 Float_t aq[2] = {28.0855, 15.9994};
143 Float_t zq[2] = {14., 8.};
144 Float_t wq[2] = {1., 2.};
145 Float_t dq = 2.7; // (+5.9%)
146 Int_t nq = -2;
147
148 // --- Nomex (C14H22O2N2) ---
149 Float_t anox[4] = {12.011, 1.00794, 15.9994, 14.00674};
150 Float_t znox[4] = {6., 1., 8., 7.};
151 Float_t wnox[4] = {14., 22., 2., 2.};
152 // Float_t dnox = 0.048; //old value
153 Float_t dnox = 0.22; // (x 4.6)
154 Int_t nnox = -4;
155
156 // --- G10 {Si, O, C, H, O} ---
157 Float_t we[7], na[7];
158
159 Float_t ag10[5] = {28.0855, 15.9994, 12.011, 1.00794, 15.9994};
160 Float_t zg10[5] = {14., 8., 6., 1., 8.};
161 Float_t wmatg10[5];
162 Int_t nlmatg10 = 5;
163 na[0] = 1., na[1] = 2., na[2] = 0., na[3] = 0., na[4] = 0.;
164 MaterialMixer(we, ag10, na, 5);
165 wmatg10[0] = we[0] * 0.6;
166 wmatg10[1] = we[1] * 0.6;
167 na[0] = 0., na[1] = 0., na[2] = 14., na[3] = 20., na[4] = 3.;
168 MaterialMixer(we, ag10, na, 5);
169 wmatg10[2] = we[2] * 0.4;
170 wmatg10[3] = we[3] * 0.4;
171 wmatg10[4] = we[4] * 0.4;
172 // Float_t densg10 = 1.7; //old value
173 Float_t densg10 = 2.0; // (+17.8%)
174
175 // --- Water ---
176 Float_t awa[2] = {1.00794, 15.9994};
177 Float_t zwa[2] = {1., 8.};
178 Float_t wwa[2] = {2., 1.};
179 Float_t dwa = 1.0;
180 Int_t nwa = -2;
181
182 // --- Air ---
183 Float_t aAir[4] = {12.011, 14.00674, 15.9994, 39.948};
184 Float_t zAir[4] = {6., 7., 8., 18.};
185 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
186 Float_t dAir = 1.20479E-3;
187
188 // --- Fibre Glass ---
189 Float_t afg[4] = {28.0855, 15.9994, 12.011, 1.00794};
190 Float_t zfg[4] = {14., 8., 6., 1.};
191 Float_t wfg[4] = {0.12906, 0.29405, 0.51502, 0.06187};
192 // Float_t dfg = 1.111;
193 Float_t dfg = 2.05; // (x1.845)
194 Int_t nfg = 4;
195
196 // --- Freon C2F4H2 + SF6 ---
197 Float_t afre[4] = {12.011, 1.00794, 18.9984032, 32.0065};
198 Float_t zfre[4] = {6., 1., 9., 16.};
199 Float_t wfre[4] = {0.21250, 0.01787, 0.74827, 0.021355};
200 Float_t densfre = 0.00375;
201 Int_t nfre = 4;
202
203 // --- Cables and tubes {Al, Cu} ---
204 Float_t acbt[2] = {26.981539, 63.546};
205 Float_t zcbt[2] = {13., 29.};
206 Float_t wcbt[2] = {0.407, 0.593};
207 Float_t decbt = 0.68;
208
209 // --- Cable {CH2, Al, Cu} ---
210 Float_t asc[4] = {12.011, 1.00794, 26.981539, 63.546};
211 Float_t zsc[4] = {6., 1., 13., 29.};
212 Float_t wsc[4];
213 for (Int_t ii = 0; ii < 4; ii++) {
214 wsc[ii] = 0.;
215 }
216
217 Float_t wDummy[4], nDummy[4];
218 for (Int_t ii = 0; ii < 4; ii++) {
219 wDummy[ii] = 0.;
220 }
221 for (Int_t ii = 0; ii < 4; ii++) {
222 nDummy[ii] = 0.;
223 }
224 nDummy[0] = 1.;
225 nDummy[1] = 2.;
226 MaterialMixer(wDummy, asc, nDummy, 2);
227 wsc[0] = 0.4375 * wDummy[0];
228 wsc[1] = 0.4375 * wDummy[1];
229 wsc[2] = 0.3244;
230 wsc[3] = 0.2381;
231 Float_t dsc = 1.223;
232
233 // --- Crates boxes {Al, Cu, Fe, Cr, Ni} ---
234 Float_t acra[5] = {26.981539, 63.546, 55.845, 51.9961, 58.6934};
235 Float_t zcra[5] = {13., 29., 26., 24., 28.};
236 Float_t wcra[5] = {0.7, 0.2, 0.07, 0.018, 0.012};
237 Float_t dcra = 0.77;
238
239 // --- Polietilene CH2 ---
240 Float_t aPlastic[2] = {12.011, 1.00794};
241 Float_t zPlastic[2] = {6., 1.};
242 Float_t wPlastic[2] = {1., 2.};
243 // Float_t dPlastic = 0.92; // PDB value
244 Float_t dPlastic = 0.93; // (~+1.1%)
245 Int_t nwPlastic = -2;
246
247 Mixture(0, "Air$", aAir, zAir, dAir, 4, wAir);
248 Mixture(1, "Nomex$", anox, znox, dnox, nnox, wnox);
249 Mixture(2, "G10$", ag10, zg10, densg10, nlmatg10, wmatg10);
250 Mixture(3, "fibre glass$", afg, zfg, dfg, nfg, wfg);
251 Material(4, "Al $", 26.981539, 13., 2.7, -8.9, 999.);
252 Float_t factor = 0.4 / 1.5 * 2. / 3.;
253 Material(5, "Al honeycomb$", 26.981539, 13., 2.7 * factor, -8.9 / factor, 999.);
254 Mixture(6, "Freon$", afre, zfre, densfre, nfre, wfre);
255 Mixture(7, "Glass$", aq, zq, dq, nq, wq);
256 Mixture(8, "Water$", awa, zwa, dwa, nwa, wwa);
257 Mixture(9, "cables+tubes$", acbt, zcbt, decbt, 2, wcbt);
258 Material(10, "Cu $", 63.546, 29., 8.96, -1.43, 999.);
259 Mixture(11, "cable$", asc, zsc, dsc, 4, wsc);
260 Mixture(12, "Al+Cu+steel$", acra, zcra, dcra, 5, wcra);
261 Mixture(13, "plastic$", aPlastic, zPlastic, dPlastic, nwPlastic, wPlastic);
262 Float_t factorHoles = 1. / 36.5;
263 Material(14, "Al honey for holes$", 26.981539, 13., 2.7 * factorHoles, -8.9 / factorHoles, 999.);
264
265 Float_t epsil, stmin, deemax, stemax;
266
267 // STD data
268 // EPSIL = 0.1 ! Tracking precision,
269 // STEMAX = 0.1 ! Maximum displacement for multiple scattering
270 // DEEMAX = 0.1 ! Maximum fractional energy loss, DLS
271 // STMIN = 0.1
272
273 // TOF data
274 epsil = .001; // Tracking precision,
275 stemax = -1.; // Maximum displacement for multiple scattering
276 deemax = -.3; // Maximum fractional energy loss, DLS
277 stmin = -.8;
278
279 Medium(kAir, "Air$", 0, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
280 Medium(kNomex, "Nomex$", 1, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
281 Medium(kG10, "G10$", 2, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
282 Medium(kFiberGlass, "fibre glass$", 3, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
283 Medium(kAlFrame, "Al Frame$", 4, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
284 Medium(kHoneycomb, "honeycomb$", 5, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
285 Medium(kFre, "Fre$", 6, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
286 Medium(kCuS, "Cu-S$", 10, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
287 Medium(kGlass, "Glass$", 7, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
288 Medium(kWater, "Water$", 8, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
289 Medium(kCable, "Cable$", 11, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
290 Medium(kCableTubes, "Cables+Tubes$", 9, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
291 Medium(kCopper, "Copper$", 10, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
292 Medium(kPlastic, "Plastic$", 13, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
293 Medium(kCrates, "Crates$", 12, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
294 Medium(kHoneyHoles, "honey_holes$", 14, 0, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
295}
296
297void Detector::MaterialMixer(Float_t* p, const Float_t* const a, const Float_t* const m, Int_t n) const
298{
299 // a[] atomic weights vector (in)
300 // (atoms present in more compound appear separately)
301 // m[] number of corresponding atoms in the compound (in)
302 Float_t t = 0.;
303 for (Int_t i = 0; i < n; ++i) {
304 p[i] = a[i] * m[i];
305 t += p[i];
306 }
307 for (Int_t i = 0; i < n; ++i) {
308 p[i] = p[i] / t;
309 }
310}
311
313{
315
316 /*
317 xTof = 124.5;//fTOFGeometry->StripLength()+2.*(0.3+0.03); // cm, x-dimension of FTOA volume
318 yTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin(); // cm, y-dimension of FTOA volume
319 Float_t zTof = fTOFGeometry->ZlenA(); // cm, z-dimension of FTOA volume
320 */
321
322 Float_t xTof = Geo::STRIPLENGTH + 2.5, yTof = Geo::RMAX - Geo::RMIN, zTof = Geo::ZLENA;
323 DefineGeometry(xTof, yTof, zTof);
324
325 LOG(info) << "Loaded TOF geometry";
326}
327
330{
331 //
332 // Definition of the Time Of Fligh Resistive Plate Chambers
333 //
334
335 Float_t xFLT, yFLT, zFLTA;
336 xFLT = xtof - 2. * Geo::MODULEWALLTHICKNESS;
337 yFLT = ytof * 0.5 - Geo::MODULEWALLTHICKNESS;
338 zFLTA = zlenA - 2. * Geo::MODULEWALLTHICKNESS;
339
340 createModules(xtof, ytof, zlenA, xFLT, yFLT, zFLTA);
341 makeStripsInModules(ytof, zlenA);
342
343 createModuleCovers(xtof, zlenA);
344
345 createBackZone(xtof, ytof, zlenA);
346 makeFrontEndElectronics(xtof);
347 makeFEACooling(xtof);
348 makeNinoMask(xtof);
349 makeSuperModuleCooling(xtof, ytof, zlenA);
350 makeSuperModuleServices(xtof, ytof, zlenA);
351 makeCentralFEAContainer(ytof);
352
353 makeModulesInBTOFvolumes(ytof, zlenA);
354 makeCoversInBTOFvolumes();
355 makeBackInBTOFvolumes(ytof);
356
357 makeReadoutCrates(ytof);
358}
359
360void Detector::createModules(Float_t xtof, Float_t ytof, Float_t zlenA, Float_t xFLT, Float_t yFLT, Float_t zFLTA) const
361{
362 //
363 // Create supermodule volume
364 // and wall volumes to separate 5 modules
365 //
366
367 Int_t idrotm[8];
368 for (Int_t ii = 0; ii < 8; ii++) {
369 idrotm[ii] = 0;
370 }
371
372 // Definition of the of fibre glass modules (FTOA, FTOB and FTOC)
373 Float_t par[3];
374 par[0] = xtof * 0.5;
375 par[1] = ytof * 0.25;
376 par[2] = zlenA * 0.5;
377 TVirtualMC::GetMC()->Gsvolu("FTOA", "BOX ", getMediumID(kFiberGlass), par, 3); // Fibre glass
378
379 if (mTOFHoles) {
380 par[0] = xtof * 0.5;
381 par[1] = ytof * 0.25;
382 par[2] = (zlenA * 0.5 - Geo::INTERCENTRMODBORDER1) * 0.5;
383 TVirtualMC::GetMC()->Gsvolu("FTOB", "BOX ", getMediumID(kFiberGlass), par, 3); // Fibre glass
384 TVirtualMC::GetMC()->Gsvolu("FTOC", "BOX ", getMediumID(kFiberGlass), par, 3); // Fibre glass
385 }
386
387 // Definition and positioning
388 // of the not sensitive volumes with Insensitive Freon (FLTA, FLTB and FLTC)
389 par[0] = xFLT * 0.5;
390 par[1] = yFLT * 0.5;
391 par[2] = zFLTA * 0.5;
392 TVirtualMC::GetMC()->Gsvolu("FLTA", "BOX ", getMediumID(kFre), par, 3); // Freon mix
393
394 Float_t xcoor, ycoor, zcoor;
395 xcoor = 0.;
396 ycoor = Geo::MODULEWALLTHICKNESS * 0.5;
397 zcoor = 0.;
398 TVirtualMC::GetMC()->Gspos("FLTA", 0, "FTOA", xcoor, ycoor, zcoor, 0, "ONLY");
399
400 if (mTOFHoles) {
401 par[2] = (zlenA * 0.5 - 2. * Geo::MODULEWALLTHICKNESS - Geo::INTERCENTRMODBORDER1) * 0.5;
402 TVirtualMC::GetMC()->Gsvolu("FLTB", "BOX ", getMediumID(kFre), par, 3); // Freon mix
403 TVirtualMC::GetMC()->Gsvolu("FLTC", "BOX ", getMediumID(kFre), par, 3); // Freon mix
404
405 // xcoor = 0.;
406 // ycoor = Geo::MODULEWALLTHICKNESS*0.5;
408 TVirtualMC::GetMC()->Gspos("FLTB", 0, "FTOB", xcoor, ycoor, zcoor, 0, "ONLY");
409 TVirtualMC::GetMC()->Gspos("FLTC", 0, "FTOC", xcoor, ycoor, -zcoor, 0, "ONLY");
410 }
411
412 // Definition and positioning
413 // of the fibre glass walls between central and intermediate modules (FWZ1 and FWZ2)
414 Float_t alpha, tgal, beta, tgbe, trpa[11];
415 // tgal = (yFLT - 2.*Geo::LENGTHINCEMODBORDER)/(Geo::INTERCENTRMODBORDER2 - Geo::INTERCENTRMODBORDER1);
418 alpha = TMath::ATan(tgal);
419 beta = (TMath::Pi() * 0.5 - alpha) * 0.5;
420 tgbe = TMath::Tan(beta);
421 trpa[0] = xFLT * 0.5;
422 trpa[1] = 0.;
423 trpa[2] = 0.;
424 trpa[3] = 2. * Geo::MODULEWALLTHICKNESS;
425 // trpa[4] = (Geo::LENGTHINCEMODBORDER - 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
426 // trpa[5] = (Geo::LENGTHINCEMODBORDER + 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
427 trpa[4] = (Geo::LENGTHINCEMODBORDERD - 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
428 trpa[5] = (Geo::LENGTHINCEMODBORDERD + 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
429 trpa[6] =
430 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
431 trpa[7] = 2. * Geo::MODULEWALLTHICKNESS;
432 trpa[8] = (Geo::LENGTHINCEMODBORDERD - 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
433 trpa[9] = (Geo::LENGTHINCEMODBORDERD + 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
434 // trpa[8] = (Geo::LENGTHINCEMODBORDER - 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
435 // trpa[9] = (Geo::LENGTHINCEMODBORDER + 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
436 trpa[10] =
437 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
438 TVirtualMC::GetMC()->Gsvolu("FWZ1D", "TRAP", getMediumID(kFiberGlass), trpa, 11); // Fibre glass
439
440 Matrix(idrotm[0], 90., 90., 180., 0., 90., 180.);
441 Matrix(idrotm[1], 90., 90., 0., 0., 90., 0.);
442
443 // xcoor = 0.;
444 // ycoor = -(yFLT - Geo::LENGTHINCEMODBORDER)*0.5;
445 ycoor = -(yFLT - Geo::LENGTHINCEMODBORDERD) * 0.5;
447 TVirtualMC::GetMC()->Gspos("FWZ1D", 1, "FLTA", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
448 TVirtualMC::GetMC()->Gspos("FWZ1D", 2, "FLTA", xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
449
450 Float_t y0B, ycoorB, zcoorB;
451
452 if (mTOFHoles) {
453 // y0B = Geo::LENGTHINCEMODBORDER - Geo::MODULEWALLTHICKNESS*tgbe;
455 trpa[0] = xFLT * 0.5;
456 trpa[1] = 0.;
457 trpa[2] = 0.;
458 trpa[3] = Geo::MODULEWALLTHICKNESS;
459 trpa[4] = (y0B - Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
460 trpa[5] = (y0B + Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
461 trpa[6] =
462 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
463 trpa[7] = Geo::MODULEWALLTHICKNESS;
464 trpa[8] = (y0B - Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
465 trpa[9] = (y0B + Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
466 trpa[10] =
467 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
468 // xcoor = 0.;
469 ycoorB = ycoor - Geo::MODULEWALLTHICKNESS * 0.5 * tgbe;
470 zcoorB =
472 TVirtualMC::GetMC()->Gsvolu("FWZAD", "TRAP", getMediumID(kFiberGlass), trpa, 11); // Fibre glass
473 TVirtualMC::GetMC()->Gspos("FWZAD", 1, "FLTB", xcoor, ycoorB, zcoorB, idrotm[1], "ONLY");
474 TVirtualMC::GetMC()->Gspos("FWZAD", 2, "FLTC", xcoor, ycoorB, -zcoorB, idrotm[0], "ONLY");
475 }
476
479 alpha = TMath::ATan(tgal);
480 beta = (TMath::Pi() * 0.5 - alpha) * 0.5;
481 tgbe = TMath::Tan(beta);
482 trpa[0] = xFLT * 0.5;
483 trpa[1] = 0.;
484 trpa[2] = 0.;
485 trpa[3] = 2. * Geo::MODULEWALLTHICKNESS;
486 // trpa[4] = (Geo::LENGTHINCEMODBORDER - 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
487 // trpa[5] = (Geo::LENGTHINCEMODBORDER + 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
488 trpa[4] = (Geo::LENGTHINCEMODBORDERU - 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
489 trpa[5] = (Geo::LENGTHINCEMODBORDERU + 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
490 trpa[6] =
491 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
492 trpa[7] = 2. * Geo::MODULEWALLTHICKNESS;
493 trpa[8] = (Geo::LENGTHINCEMODBORDERU - 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
494 trpa[9] = (Geo::LENGTHINCEMODBORDERU + 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
495 // trpa[8] = (Geo::LENGTHINCEMODBORDER - 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
496 // trpa[9] = (Geo::LENGTHINCEMODBORDER + 2.*Geo::MODULEWALLTHICKNESS*tgbe)*0.5;
497 trpa[10] =
498 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
499 TVirtualMC::GetMC()->Gsvolu("FWZ1U", "TRAP", getMediumID(kFiberGlass), trpa, 11); // Fibre glass
500
501 Matrix(idrotm[2], 90., 270., 0., 0., 90., 180.);
502 Matrix(idrotm[3], 90., 270., 180., 0., 90., 0.);
503
504 // xcoor = 0.;
505 // ycoor = (yFLT - Geo::LENGTHINCEMODBORDER)*0.5;
506 ycoor = (yFLT - Geo::LENGTHINCEMODBORDERU) * 0.5;
508 TVirtualMC::GetMC()->Gspos("FWZ1U", 1, "FLTA", xcoor, ycoor, zcoor, idrotm[2], "ONLY");
509 TVirtualMC::GetMC()->Gspos("FWZ1U", 2, "FLTA", xcoor, ycoor, -zcoor, idrotm[3], "ONLY");
510
511 if (mTOFHoles) {
512 // y0B = Geo::LENGTHINCEMODBORDER + Geo::MODULEWALLTHICKNESS*tgbe;
514 trpa[0] = xFLT * 0.5;
515 trpa[1] = 0.;
516 trpa[2] = 0.;
517 trpa[3] = Geo::MODULEWALLTHICKNESS;
518 trpa[4] = (y0B - Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
519 trpa[5] = (y0B + Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
520 trpa[6] =
521 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
522 trpa[7] = Geo::MODULEWALLTHICKNESS;
523 trpa[8] = (y0B - Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
524 trpa[9] = (y0B + Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
525 trpa[10] =
526 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
527 TVirtualMC::GetMC()->Gsvolu("FWZBU", "TRAP", getMediumID(kFiberGlass), trpa, 11); // Fibre glass
528 // xcoor = 0.;
529 ycoorB = ycoor - Geo::MODULEWALLTHICKNESS * 0.5 * tgbe;
530 zcoorB = (zlenA * 0.5 - 2. * Geo::MODULEWALLTHICKNESS - Geo::INTERCENTRMODBORDER1) * 0.5 -
532 TVirtualMC::GetMC()->Gspos("FWZBU", 1, "FLTB", xcoor, ycoorB, zcoorB, idrotm[3], "ONLY");
533 TVirtualMC::GetMC()->Gspos("FWZBU", 2, "FLTC", xcoor, ycoorB, -zcoorB, idrotm[2], "ONLY");
534 }
535
536 trpa[0] = 0.5 * (Geo::INTERCENTRMODBORDER2 - Geo::INTERCENTRMODBORDER1) / TMath::Cos(alpha);
537 trpa[1] = 2. * Geo::MODULEWALLTHICKNESS;
538 trpa[2] = xFLT * 0.5;
539 trpa[3] = -beta * TMath::RadToDeg();
540 trpa[4] = 0.;
541 trpa[5] = 0.;
542 TVirtualMC::GetMC()->Gsvolu("FWZ2", "PARA", getMediumID(kFiberGlass), trpa, 6); // Fibre glass
543
544 Matrix(idrotm[4], alpha * TMath::RadToDeg(), 90., 90. + alpha * TMath::RadToDeg(), 90., 90., 180.);
545 Matrix(idrotm[5], 180. - alpha * TMath::RadToDeg(), 90., 90. - alpha * TMath::RadToDeg(), 90., 90., 0.);
546
547 // xcoor = 0.;
548 // ycoor = 0.;
551 TVirtualMC::GetMC()->Gspos("FWZ2", 1, "FLTA", xcoor, ycoor, zcoor, idrotm[4], "ONLY");
552 TVirtualMC::GetMC()->Gspos("FWZ2", 2, "FLTA", xcoor, ycoor, -zcoor, idrotm[5], "ONLY");
553
554 if (mTOFHoles) {
555 trpa[0] = 0.5 * (Geo::INTERCENTRMODBORDER2 - Geo::INTERCENTRMODBORDER1) / TMath::Cos(alpha);
556 trpa[1] = Geo::MODULEWALLTHICKNESS;
557 trpa[2] = xFLT * 0.5;
558 trpa[3] = -beta * TMath::RadToDeg();
559 trpa[4] = 0.;
560 trpa[5] = 0.;
561 TVirtualMC::GetMC()->Gsvolu("FWZC", "PARA", getMediumID(kFiberGlass), trpa, 6); // Fibre glass
562 // xcoor = 0.;
563 ycoorB = ycoor - Geo::MODULEWALLTHICKNESS * tgbe;
564 zcoorB = (zlenA * 0.5 - 2. * Geo::MODULEWALLTHICKNESS - Geo::INTERCENTRMODBORDER1) * 0.5 -
566 TVirtualMC::GetMC()->Gspos("FWZC", 1, "FLTB", xcoor, ycoorB, zcoorB, idrotm[5], "ONLY");
567 TVirtualMC::GetMC()->Gspos("FWZC", 2, "FLTC", xcoor, ycoorB, -zcoorB, idrotm[4], "ONLY");
568 }
569
570 // Definition and positioning
571 // of the fibre glass walls between intermediate and lateral modules (FWZ3 and FWZ4)
573 alpha = TMath::ATan(tgal);
574 beta = (TMath::Pi() * 0.5 - alpha) * 0.5;
575 tgbe = TMath::Tan(beta);
576 trpa[0] = xFLT * 0.5;
577 trpa[1] = 0.;
578 trpa[2] = 0.;
579 trpa[3] = 2. * Geo::MODULEWALLTHICKNESS;
580 trpa[4] = (Geo::LENGTHEXINMODBORDER - 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
581 trpa[5] = (Geo::LENGTHEXINMODBORDER + 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
582 trpa[6] =
583 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
584 trpa[7] = 2. * Geo::MODULEWALLTHICKNESS;
585 trpa[8] = (Geo::LENGTHEXINMODBORDER - 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
586 trpa[9] = (Geo::LENGTHEXINMODBORDER + 2. * Geo::MODULEWALLTHICKNESS * tgbe) * 0.5;
587 trpa[10] =
588 TMath::ATan(tgbe * 0.5) * TMath::RadToDeg(); // TMath::ATan((trpa[5] - trpa[4])/(2.*trpa[3]))*TMath::RadToDeg();
589 TVirtualMC::GetMC()->Gsvolu("FWZ3", "TRAP", getMediumID(kFiberGlass), trpa, 11); // Fibre glass
590
591 // xcoor = 0.;
592 ycoor = (yFLT - Geo::LENGTHEXINMODBORDER) * 0.5;
594 TVirtualMC::GetMC()->Gspos("FWZ3", 1, "FLTA", xcoor, ycoor, zcoor, idrotm[3], "ONLY");
595 TVirtualMC::GetMC()->Gspos("FWZ3", 2, "FLTA", xcoor, ycoor, -zcoor, idrotm[2], "ONLY");
596
597 if (mTOFHoles) {
598 // xcoor = 0.;
599 // ycoor = (yFLT - Geo::LENGTHEXINMODBORDER)*0.5;
600 zcoor =
602 TVirtualMC::GetMC()->Gspos("FWZ3", 5, "FLTB", xcoor, ycoor, zcoor, idrotm[2], "ONLY");
603 TVirtualMC::GetMC()->Gspos("FWZ3", 6, "FLTC", xcoor, ycoor, -zcoor, idrotm[3], "ONLY");
604 }
605
606 // xcoor = 0.;
607 ycoor = -(yFLT - Geo::LENGTHEXINMODBORDER) * 0.5;
609 TVirtualMC::GetMC()->Gspos("FWZ3", 3, "FLTA", xcoor, ycoor, zcoor, idrotm[1], "ONLY");
610 TVirtualMC::GetMC()->Gspos("FWZ3", 4, "FLTA", xcoor, ycoor, -zcoor, idrotm[0], "ONLY");
611
612 if (mTOFHoles) {
613 // xcoor = 0.;
614 // ycoor = -(yFLT - Geo::LENGTHEXINMODBORDER)*0.5;
615 zcoor =
617 TVirtualMC::GetMC()->Gspos("FWZ3", 7, "FLTB", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
618 TVirtualMC::GetMC()->Gspos("FWZ3", 8, "FLTC", xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
619 }
620
621 trpa[0] = 0.5 * (Geo::EXTERINTERMODBORDER2 - Geo::EXTERINTERMODBORDER1) / TMath::Cos(alpha);
622 trpa[1] = 2. * Geo::MODULEWALLTHICKNESS;
623 trpa[2] = xFLT * 0.5;
624 trpa[3] = -beta * TMath::RadToDeg();
625 trpa[4] = 0.;
626 trpa[5] = 0.;
627 TVirtualMC::GetMC()->Gsvolu("FWZ4", "PARA", getMediumID(kFiberGlass), trpa, 6); // Fibre glass
628
629 Matrix(idrotm[6], alpha * TMath::RadToDeg(), 90., 90. + alpha * TMath::RadToDeg(), 90., 90., 180.);
630 Matrix(idrotm[7], 180. - alpha * TMath::RadToDeg(), 90., 90. - alpha * TMath::RadToDeg(), 90., 90., 0.);
631
632 // xcoor = 0.;
633 ycoor = 0.;
635 TVirtualMC::GetMC()->Gspos("FWZ4", 1, "FLTA", xcoor, ycoor, zcoor, idrotm[7], "ONLY");
636 TVirtualMC::GetMC()->Gspos("FWZ4", 2, "FLTA", xcoor, ycoor, -zcoor, idrotm[6], "ONLY");
637
638 if (mTOFHoles) {
639 // xcoor = 0.;
640 // ycoor = 0.;
642 (zlenA * 0.5 + Geo::INTERCENTRMODBORDER1 - 2. * Geo::MODULEWALLTHICKNESS) * 0.5;
643 TVirtualMC::GetMC()->Gspos("FWZ4", 3, "FLTB", xcoor, ycoor, zcoor, idrotm[6], "ONLY");
644 TVirtualMC::GetMC()->Gspos("FWZ4", 4, "FLTC", xcoor, ycoor, -zcoor, idrotm[7], "ONLY");
645 }
646}
647
648void Detector::makeStripsInModules(Float_t ytof, Float_t zlenA) const
649{
650 //
651 // Define MRPC strip volume, called FSTR
652 // Insert FSTR volume in FLTA/B/C volumes
653 //
654 Float_t yFLT = ytof * 0.5 - Geo::MODULEWALLTHICKNESS;
655
657
658 // new description for strip volume -double stack strip-
659 // -- all constants are expressed in cm
660 // height of different layers
661 constexpr Float_t HGLFY = Geo::HFILIY + 2. * Geo::HGLASSY; // height of GLASS Layer
662
663 constexpr Float_t LSENSMX = Geo::NPADX * Geo::XPAD; // length of Sensitive Layer
664 constexpr Float_t HSENSMY = Geo::HSENSMY; // height of Sensitive Layer
665 constexpr Float_t WSENSMZ = Geo::NPADZ * Geo::ZPAD; // width of Sensitive Layer
666
667 // height of the FSTR Volume (the strip volume)
668 constexpr Float_t HSTRIPY = 2. * Geo::HHONY + 2. * Geo::HPCBY + 4. * Geo::HRGLY + 2. * HGLFY + Geo::HCPCBY;
669
670 // width of the FSTR Volume (the strip volume)
671 constexpr Float_t WSTRIPZ = Geo::WCPCBZ;
672 // length of the FSTR Volume (the strip volume)
673 constexpr Float_t LSTRIPX = Geo::STRIPLENGTH;
674
675 // FSTR volume definition-filling this volume with non sensitive Gas Mixture
676 Float_t parfp[3] = {static_cast<Float_t>(LSTRIPX * 0.5), static_cast<Float_t>(HSTRIPY * 0.5),
677 static_cast<Float_t>(WSTRIPZ * 0.5)};
678 TVirtualMC::GetMC()->Gsvolu("FSTR", "BOX", getMediumID(kFre), parfp, 3); // Freon mix
679
680 Float_t posfp[3] = {0., 0., 0.};
681
682 // NOMEX (HONEYCOMB) Layer definition
683 // parfp[0] = LSTRIPX*0.5;
684 parfp[1] = Geo::HHONY * 0.5;
685 parfp[2] = Geo::WHONZ * 0.5;
686 TVirtualMC::GetMC()->Gsvolu("FHON", "BOX", getMediumID(kNomex), parfp, 3); // Nomex (Honeycomb)
687 // positioning 2 NOMEX Layers on FSTR volume
688 // posfp[0] = 0.;
689 posfp[1] = -HSTRIPY * 0.5 + parfp[1];
690 // posfp[2] = 0.;
691 TVirtualMC::GetMC()->Gspos("FHON", 1, "FSTR", 0., posfp[1], 0., 0, "ONLY");
692 TVirtualMC::GetMC()->Gspos("FHON", 2, "FSTR", 0., -posfp[1], 0., 0, "ONLY");
693
694 // Lower PCB Layer definition
695 // parfp[0] = LSTRIPX*0.5;
696 parfp[1] = Geo::HPCBY * 0.5;
697 parfp[2] = Geo::WPCBZ1 * 0.5;
698 TVirtualMC::GetMC()->Gsvolu("FPC1", "BOX", getMediumID(kG10), parfp, 3); // G10
699
700 // Upper PCB Layer definition
701 // parfp[0] = LSTRIPX*0.5;
702 // parfp[1] = Geo::HPCBY*0.5;
703 parfp[2] = Geo::WPCBZ2 * 0.5;
704 TVirtualMC::GetMC()->Gsvolu("FPC2", "BOX", getMediumID(kG10), parfp, 3); // G10
705
706 // positioning 2 external PCB Layers in FSTR volume
707 // posfp[0] = 0.;
708 posfp[1] = -HSTRIPY * 0.5 + Geo::HHONY + parfp[1];
709 // posfp[2] = 0.;
710 TVirtualMC::GetMC()->Gspos("FPC1", 1, "FSTR", 0., -posfp[1], 0., 0, "ONLY");
711 TVirtualMC::GetMC()->Gspos("FPC2", 1, "FSTR", 0., posfp[1], 0., 0, "ONLY");
712
713 // Central PCB layer definition
714 // parfp[0] = LSTRIPX*0.5;
715 parfp[1] = Geo::HCPCBY * 0.5;
716 parfp[2] = Geo::WCPCBZ * 0.5;
717 TVirtualMC::GetMC()->Gsvolu("FPCB", "BOX", getMediumID(kG10), parfp, 3); // G10
718 gGeoManager->GetVolume("FPCB")->VisibleDaughters(kFALSE);
719
720 // positioning the central PCB layer
721 TVirtualMC::GetMC()->Gspos("FPCB", 1, "FSTR", 0., 0., 0., 0, "ONLY");
722
723 // Sensitive volume definition
724 Float_t parfs[3] = {static_cast<Float_t>(LSENSMX * 0.5), static_cast<Float_t>(HSENSMY * 0.5),
725 static_cast<Float_t>(WSENSMZ * 0.5)};
726 TVirtualMC::GetMC()->Gsvolu("FSEN", "BOX", getMediumID(kCuS), parfs, 3); // Cu sensitive
727
728 // printf("check material\n");
729 // printf("ID used = %i\n",getMediumID(kCuS));
730 // printf("ID needed = %i\n",gGeoManager->GetMedium("TOF_Cu-S$")->GetId());
731 // getchar();
732
733 // dividing FSEN along z in Geo::NPADZ=2 and along x in Geo::NPADX=48
734 TVirtualMC::GetMC()->Gsdvn("FSEZ", "FSEN", Geo::NPADZ, 3);
735 TVirtualMC::GetMC()->Gsdvn("FPAD", "FSEZ", Geo::NPADX, 1);
736 // positioning sensitive layer inside FPCB
737 TVirtualMC::GetMC()->Gspos("FSEN", 1, "FPCB", 0., 0., 0., 0, "ONLY");
738
739 // RED GLASS Layer definition
740 // parfp[0] = LSTRIPX*0.5;
741 parfp[1] = Geo::HRGLY * 0.5;
742 parfp[2] = Geo::WRGLZ * 0.5;
743 TVirtualMC::GetMC()->Gsvolu("FRGL", "BOX", getMediumID(kGlass), parfp, 3); // red glass
744 // positioning 4 RED GLASS Layers in FSTR volume
745 // posfp[0] = 0.;
746 posfp[1] = -HSTRIPY * 0.5 + Geo::HHONY + Geo::HPCBY + parfp[1];
747 // posfp[2] = 0.;
748 TVirtualMC::GetMC()->Gspos("FRGL", 1, "FSTR", 0., posfp[1], 0., 0, "ONLY");
749 TVirtualMC::GetMC()->Gspos("FRGL", 4, "FSTR", 0., -posfp[1], 0., 0, "ONLY");
750 // posfp[0] = 0.;
751 posfp[1] = (Geo::HCPCBY + Geo::HRGLY) * 0.5;
752 // posfp[2] = 0.;
753 TVirtualMC::GetMC()->Gspos("FRGL", 2, "FSTR", 0., -posfp[1], 0., 0, "ONLY");
754 TVirtualMC::GetMC()->Gspos("FRGL", 3, "FSTR", 0., posfp[1], 0., 0, "ONLY");
755
756 // GLASS Layer definition
757 // parfp[0] = LSTRIPX*0.5;
758 parfp[1] = Geo::HGLASSY;
759 parfp[2] = Geo::WGLFZ * 0.5;
760 TVirtualMC::GetMC()->Gsvolu("FGLF", "BOX", getMediumID(kGlass), parfp, 3); // glass
761 // positioning 2 GLASS Layers in FSTR volume
762 // posfp[0] = 0.;
763 posfp[1] = (Geo::HCPCBY + HGLFY) * 0.5 + Geo::HRGLY;
764 // posfp[2] = 0.;
765 TVirtualMC::GetMC()->Gspos("FGLF", 1, "FSTR", 0., -posfp[1], 0., 0, "ONLY");
766 TVirtualMC::GetMC()->Gspos("FGLF", 2, "FSTR", 0., posfp[1], 0., 0, "ONLY");
767
768 // Positioning the Strips (FSTR volumes) in the FLT volumes
769 Int_t maxStripNumbers[5] = {Geo::NSTRIPC, Geo::NSTRIPB, Geo::NSTRIPA, Geo::NSTRIPB, Geo::NSTRIPC};
770
771 Int_t idrotm[Geo::NSTRIPXSECTOR];
772 for (Int_t ii = 0; ii < Geo::NSTRIPXSECTOR; ii++) {
773 idrotm[ii] = 0;
774 }
775
776 Int_t totalStrip = 0;
777 Float_t xpos, zpos, ypos, ang;
778 for (Int_t iplate = 0; iplate < Geo::NPLATES; iplate++) {
779 if (iplate > 0) {
780 totalStrip += maxStripNumbers[iplate - 1];
781 }
782 for (Int_t istrip = 0; istrip < maxStripNumbers[iplate]; istrip++) {
783 ang = Geo::getAngles(iplate, istrip);
784
785 if (ang > 0.) {
786 Matrix(idrotm[istrip + totalStrip], 90., 0., 90. + ang, 90., ang, 90.);
787 } else if (ang == 0.) {
788 Matrix(idrotm[istrip + totalStrip], 90., 0., 90., 90., 0., 0.);
789 } else if (ang < 0.) {
790 Matrix(idrotm[istrip + totalStrip], 90., 0., 90. + ang, 90., -ang, 270.);
791 }
792
793 xpos = 0.;
794 ypos = Geo::getHeights(iplate, istrip) + yFLT * 0.5;
795 zpos = Geo::getDistances(iplate, istrip);
796 TVirtualMC::GetMC()->Gspos("FSTR", istrip + totalStrip + 1, "FLTA", xpos, ypos, -zpos,
797 idrotm[istrip + totalStrip], "ONLY");
798
799 if (mTOFHoles) {
800 if (istrip + totalStrip + 1 > 53) {
801 TVirtualMC::GetMC()->Gspos(
802 "FSTR", istrip + totalStrip + 1, "FLTC", xpos, ypos,
803 -zpos - (zlenA * 0.5 - 2. * Geo::MODULEWALLTHICKNESS + Geo::INTERCENTRMODBORDER1) * 0.5,
804 idrotm[istrip + totalStrip], "ONLY");
805 }
806 if (istrip + totalStrip + 1 < 39) {
807 TVirtualMC::GetMC()->Gspos(
808 "FSTR", istrip + totalStrip + 1, "FLTB", xpos, ypos,
809 -zpos + (zlenA * 0.5 - 2. * Geo::MODULEWALLTHICKNESS + Geo::INTERCENTRMODBORDER1) * 0.5,
810 idrotm[istrip + totalStrip], "ONLY");
811 }
812 }
813 }
814 }
815}
816
817void Detector::createModuleCovers(Float_t xtof, Float_t zlenA) const
818{
819 //
820 // Create covers for module:
821 // per each module zone, defined according to
822 // fgkInterCentrModBorder2, fgkExterInterModBorder1 and zlenA+2 values,
823 // there is a frame of thickness 2cm in Al
824 // and the contained zones in honeycomb of Al.
825 // There is also an interface layer (1.6mm thichness)
826 // and plastic and Cu corresponding to the flat cables.
827 //
828
829 Float_t par[3];
830 par[0] = xtof * 0.5 + 2.;
832 par[2] = zlenA * 0.5 + 2.;
833 TVirtualMC::GetMC()->Gsvolu("FPEA", "BOX ", getMediumID(kAir), par, 3); // Air
834 if (mTOFHoles) {
835 TVirtualMC::GetMC()->Gsvolu("FPEB", "BOX ", getMediumID(kAir), par, 3); // Air
836 }
837
838 constexpr Float_t ALCOVERTHICKNESS = 1.5;
839 constexpr Float_t INTERFACECARDTHICKNESS = 0.16;
840 constexpr Float_t ALSKINTHICKNESS = 0.1;
841 constexpr Float_t PLASTICFLATCABLETHICKNESS = 0.25;
842 constexpr Float_t COPPERFLATCABLETHICKNESS = 0.01;
843
844 // par[0] = xtof*0.5 + 2.;
845 par[1] = ALCOVERTHICKNESS * 0.5;
846 // par[2] = zlenA*0.5 + 2.;
847 TVirtualMC::GetMC()->Gsvolu("FALT", "BOX ", getMediumID(kAlFrame), par, 3); // Al
848 if (mTOFHoles) {
849 TVirtualMC::GetMC()->Gsvolu("FALB", "BOX ", getMediumID(kAlFrame), par, 3); // Al
850 }
851 Float_t xcoor, ycoor, zcoor;
852 xcoor = 0.;
853 ycoor = 0.;
854 zcoor = 0.;
855 TVirtualMC::GetMC()->Gspos("FALT", 0, "FPEA", xcoor, ycoor, zcoor, 0, "ONLY");
856 if (mTOFHoles) {
857 TVirtualMC::GetMC()->Gspos("FALB", 0, "FPEB", xcoor, ycoor, zcoor, 0, "ONLY");
858 }
859
860 par[0] = xtof * 0.5;
861 // par[1] = ALCOVERTHICKNESS*0.5;
863 TVirtualMC::GetMC()->Gsvolu("FPE1", "BOX ", getMediumID(kHoneycomb), par, 3); // Al honeycomb
864 // xcoor = 0.;
865 // ycoor = 0.;
866 // zcoor = 0.;
867 TVirtualMC::GetMC()->Gspos("FPE1", 0, "FALT", xcoor, ycoor, zcoor, 0, "ONLY");
868
869 if (mTOFHoles) {
870 // par[0] = xtof*0.5;
871 par[1] = ALCOVERTHICKNESS * 0.5 - ALSKINTHICKNESS;
872 // par[2] = Geo::INTERCENTRMODBORDER2 - 2.;
873 TVirtualMC::GetMC()->Gsvolu("FPE4", "BOX ", getMediumID(kHoneyHoles), par, 3); // Al honeycomb for holes
874 // xcoor = 0.;
875 // ycoor = 0.;
876 // zcoor = 0.;
877 TVirtualMC::GetMC()->Gspos("FPE4", 0, "FALB", xcoor, ycoor, zcoor, 0, "ONLY");
878 }
879
880 // par[0] = xtof*0.5;
881 // par[1] = ALCOVERTHICKNESS*0.5;
883 TVirtualMC::GetMC()->Gsvolu("FPE2", "BOX ", getMediumID(kHoneycomb), par, 3); // Al honeycomb
884 // xcoor = 0.;
885 // ycoor = 0.;
887 TVirtualMC::GetMC()->Gspos("FPE2", 1, "FALT", xcoor, ycoor, zcoor, 0, "ONLY");
888 TVirtualMC::GetMC()->Gspos("FPE2", 2, "FALT", xcoor, ycoor, -zcoor, 0, "ONLY");
889
890 if (mTOFHoles) {
891 // xcoor = 0.;
892 // ycoor = 0.;
893 // zcoor = (Geo::EXTERINTERMODBORDER1 + Geo::INTERCENTRMODBORDER2)*0.5;
894 TVirtualMC::GetMC()->Gspos("FPE2", 1, "FALB", xcoor, ycoor, zcoor, 0, "ONLY");
895 TVirtualMC::GetMC()->Gspos("FPE2", 2, "FALB", xcoor, ycoor, -zcoor, 0, "ONLY");
896 }
897
898 // par[0] = xtof*0.5;
899 // par[1] = ALCOVERTHICKNESS*0.5;
900 par[2] = (zlenA * 0.5 + 2. - Geo::EXTERINTERMODBORDER1) * 0.5 - 2.;
901 TVirtualMC::GetMC()->Gsvolu("FPE3", "BOX ", getMediumID(kHoneycomb), par, 3); // Al honeycomb
902 // xcoor = 0.;
903 // ycoor = 0.;
904 zcoor = (zlenA * 0.5 + 2. + Geo::EXTERINTERMODBORDER1) * 0.5;
905 TVirtualMC::GetMC()->Gspos("FPE3", 1, "FALT", xcoor, ycoor, zcoor, 0, "ONLY");
906 TVirtualMC::GetMC()->Gspos("FPE3", 2, "FALT", xcoor, ycoor, -zcoor, 0, "ONLY");
907
908 if (mTOFHoles) {
909 // xcoor = 0.;
910 // ycoor = 0.;
911 zcoor = (zlenA * 0.5 + 2. + Geo::EXTERINTERMODBORDER1) * 0.5;
912 TVirtualMC::GetMC()->Gspos("FPE3", 1, "FALB", xcoor, ycoor, zcoor, 0, "ONLY");
913 TVirtualMC::GetMC()->Gspos("FPE3", 2, "FALB", xcoor, ycoor, -zcoor, 0, "ONLY");
914 }
915
916 // volumes for Interface cards
917 par[0] = xtof * 0.5;
918 par[1] = INTERFACECARDTHICKNESS * 0.5;
920 TVirtualMC::GetMC()->Gsvolu("FIF1", "BOX ", getMediumID(kG10), par, 3); // G10
921 // xcoor = 0.;
922 ycoor = ALCOVERTHICKNESS * 0.5 + INTERFACECARDTHICKNESS * 0.5;
923 zcoor = 0.;
924 TVirtualMC::GetMC()->Gspos("FIF1", 0, "FPEA", xcoor, ycoor, zcoor, 0, "ONLY");
925
926 // par[0] = xtof*0.5;
927 // par[1] = INTERFACECARDTHICKNESS*0.5;
929 TVirtualMC::GetMC()->Gsvolu("FIF2", "BOX ", getMediumID(kG10), par, 3); // G10
930 // xcoor = 0.;
931 // ycoor = ALCOVERTHICKNESS*0.5 + INTERFACECARDTHICKNESS*0.5;
933 TVirtualMC::GetMC()->Gspos("FIF2", 1, "FPEA", xcoor, ycoor, zcoor, 0, "ONLY");
934 TVirtualMC::GetMC()->Gspos("FIF2", 2, "FPEA", xcoor, ycoor, -zcoor, 0, "ONLY");
935 if (mTOFHoles) {
936 TVirtualMC::GetMC()->Gspos("FIF2", 1, "FPEB", xcoor, ycoor, zcoor, 0, "ONLY");
937 TVirtualMC::GetMC()->Gspos("FIF2", 2, "FPEB", xcoor, ycoor, -zcoor, 0, "ONLY");
938 }
939
940 // par[0] = xtof*0.5;
941 // par[1] = INTERFACECARDTHICKNESS*0.5;
942 par[2] = (zlenA * 0.5 + 2. - Geo::EXTERINTERMODBORDER1) * 0.5 - 2.;
943 TVirtualMC::GetMC()->Gsvolu("FIF3", "BOX ", getMediumID(kG10), par, 3); // G10
944 // xcoor = 0.;
945 // ycoor = ALCOVERTHICKNESS*0.5 + INTERFACECARDTHICKNESS*0.5;
946 zcoor = (zlenA * 0.5 + 2. + Geo::EXTERINTERMODBORDER1) * 0.5;
947 TVirtualMC::GetMC()->Gspos("FIF3", 1, "FPEA", xcoor, ycoor, zcoor, 0, "ONLY");
948 TVirtualMC::GetMC()->Gspos("FIF3", 2, "FPEA", xcoor, ycoor, -zcoor, 0, "ONLY");
949 if (mTOFHoles) {
950 TVirtualMC::GetMC()->Gspos("FIF3", 1, "FPEB", xcoor, ycoor, zcoor, 0, "ONLY");
951 TVirtualMC::GetMC()->Gspos("FIF3", 2, "FPEB", xcoor, ycoor, -zcoor, 0, "ONLY");
952 }
953
954 // volumes for flat cables
955 // plastic
956 par[0] = xtof * 0.5;
957 par[1] = PLASTICFLATCABLETHICKNESS * 0.5;
959 TVirtualMC::GetMC()->Gsvolu("FFC1", "BOX ", getMediumID(kPlastic), par, 3); // Plastic (CH2)
960 // xcoor = 0.;
961 ycoor = -ALCOVERTHICKNESS * 0.5 - PLASTICFLATCABLETHICKNESS * 0.5;
962 zcoor = 0.;
963 TVirtualMC::GetMC()->Gspos("FFC1", 0, "FPEA", xcoor, ycoor, zcoor, 0, "ONLY");
964
965 // par[0] = xtof*0.5;
966 // par[1] = PLASTICFLATCABLETHICKNESS*0.5;
968 TVirtualMC::GetMC()->Gsvolu("FFC2", "BOX ", getMediumID(kPlastic), par, 3); // Plastic (CH2)
969 // xcoor = 0.;
970 // ycoor = -ALCOVERTHICKNESS*0.5 - PLASTICFLATCABLETHICKNESS*0.5;
972 TVirtualMC::GetMC()->Gspos("FFC2", 1, "FPEA", xcoor, ycoor, zcoor, 0, "ONLY");
973 TVirtualMC::GetMC()->Gspos("FFC2", 2, "FPEA", xcoor, ycoor, -zcoor, 0, "ONLY");
974 if (mTOFHoles) {
975 TVirtualMC::GetMC()->Gspos("FFC2", 1, "FPEB", xcoor, ycoor, zcoor, 0, "ONLY");
976 TVirtualMC::GetMC()->Gspos("FFC2", 2, "FPEB", xcoor, ycoor, -zcoor, 0, "ONLY");
977 }
978
979 // par[0] = xtof*0.5;
980 // par[1] = PLASTICFLATCABLETHICKNESS*0.5;
981 par[2] = (zlenA * 0.5 + 2. - Geo::EXTERINTERMODBORDER1) * 0.5 - 2.;
982 TVirtualMC::GetMC()->Gsvolu("FFC3", "BOX ", getMediumID(kPlastic), par, 3); // Plastic (CH2)
983 // xcoor = 0.;
984 // ycoor = -ALCOVERTHICKNESS*0.5 - PLASTICFLATCABLETHICKNESS*0.5;
985 zcoor = (zlenA * 0.5 + 2. + Geo::EXTERINTERMODBORDER1) * 0.5;
986 TVirtualMC::GetMC()->Gspos("FFC3", 1, "FPEA", xcoor, ycoor, zcoor, 0, "ONLY");
987 TVirtualMC::GetMC()->Gspos("FFC3", 2, "FPEA", xcoor, ycoor, -zcoor, 0, "ONLY");
988 if (mTOFHoles) {
989 TVirtualMC::GetMC()->Gspos("FFC3", 1, "FPEB", xcoor, ycoor, zcoor, 0, "ONLY");
990 TVirtualMC::GetMC()->Gspos("FFC3", 2, "FPEB", xcoor, ycoor, -zcoor, 0, "ONLY");
991 }
992
993 // Cu
994 par[0] = xtof * 0.5;
995 par[1] = COPPERFLATCABLETHICKNESS * 0.5;
997 TVirtualMC::GetMC()->Gsvolu("FCC1", "BOX ", getMediumID(kCopper), par, 3); // Cu
998 TVirtualMC::GetMC()->Gspos("FCC1", 0, "FFC1", 0., 0., 0., 0, "ONLY");
999
1000 // par[0] = xtof*0.5;
1001 // par[1] = COPPERFLATCABLETHICKNESS*0.5;
1003 TVirtualMC::GetMC()->Gsvolu("FCC2", "BOX ", getMediumID(kCopper), par, 3); // Cu
1004 TVirtualMC::GetMC()->Gspos("FCC2", 0, "FFC2", 0., 0., 0., 0, "ONLY");
1005
1006 // par[0] = xtof*0.5;
1007 // par[1] = COPPERFLATCABLETHICKNESS*0.5;
1008 par[2] = (zlenA * 0.5 + 2. - Geo::EXTERINTERMODBORDER1) * 0.5 - 2.;
1009 TVirtualMC::GetMC()->Gsvolu("FCC3", "BOX ", getMediumID(kCopper), par, 3); // Cu
1010 TVirtualMC::GetMC()->Gspos("FCC3", 0, "FFC3", 0., 0., 0., 0, "ONLY");
1011}
1012
1013std::vector<Detector::FEAContainer> Detector::feaContainers(Float_t zlenA, Bool_t holes) const
1014{
1015 //
1016 // Returns the FEA card containers of one supermodule in placement order, each with the z it
1017 // sits at, its copy number and whether it is rotated. Creates and places nothing itself. The
1018 // modules with the PHOS hole (holes) carry four row blocks instead of five. The container at
1019 // the centre of the supermodule is not in the list: makeCentralFEAContainer builds that one.
1020 //
1021
1022 const Float_t rowstep = 6.66;
1023 const Float_t rowgap[5] = {13.5, 22.9, 16.94, 23.8, 20.4};
1024 const Int_t rowb[5] = {6, 7, 6, 19, 7};
1025 const Int_t nblocks = holes ? 4 : 5;
1026
1027 std::vector<FEAContainer> cont;
1028 Int_t row = 1;
1029 for (Int_t sg = -1; sg < 2; sg += 2) {
1030 Float_t zcoor = sg * zlenA * 0.5 - 0.8;
1031 for (Int_t nb = 0; nb < nblocks; ++nb) {
1032 zcoor = zcoor - sg * (rowgap[nb] - rowstep);
1033 const Int_t nrow = row + rowb[nb];
1034 for (; row < nrow; ++row) {
1035 zcoor -= sg * rowstep;
1036 cont.push_back({zcoor, row, sg == -1 && nb != 4});
1037 }
1038 }
1039 }
1040 return cont;
1041}
1042
1043void Detector::makeCentralFEAContainer(Float_t ytof) const
1044{
1045 //
1046 // Creates FCM1 and FCM2, the FEA card container at the centre of a supermodule, as assemblies
1047 // of the FCA1/FCA2 content, and places one in FAIA and one in FAIC. Here it is the container
1048 // that gives way to the cooling bars and not the other way round, and an assembly has no shape
1049 // of its own to overlap them. What was its air is now the FAIA/FAIC air around it, which is the
1050 // same medium.
1051 //
1052
1054 const Float_t ycoor = -(ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5 + carY;
1055
1056 const char* source[2] = {"FCA1", "FCA2"};
1057 const char* central[2] = {"FCM1", "FCM2"};
1058 const char* mother[2] = {"FAIA", "FAIC"};
1059 for (Int_t i = 0; i < 2; ++i) {
1060 TGeoVolume* from = gGeoManager->GetVolume(source[i]);
1061 auto* assembly = new TGeoVolumeAssembly(central[i]);
1062 for (Int_t k = 0; k < from->GetNdaughters(); ++k) {
1063 TGeoNode* nd = from->GetNode(k);
1064 assembly->AddNode(nd->GetVolume(), nd->GetNumber(), new TGeoHMatrix(*nd->GetMatrix()));
1065 }
1066 gGeoManager->GetVolume(mother[i])->AddNode(assembly, 91, new TGeoTranslation(0., ycoor, -0.8));
1067 }
1068}
1069
1070TGeoVolume* Detector::coolingBarPiece(Double_t dx, Double_t dy, Double_t dz) const
1071{
1072 //
1073 // Returns the volume for one piece of a segmented longitudinal cooling bar, creating it the
1074 // first time that size is asked for. The pieces come in a handful of sizes that repeat all
1075 // along a supermodule, so each size becomes one volume placed many times. The sizes compare
1076 // exactly because every caller derives them from the same arithmetic.
1077 //
1078
1079 const std::array<Double_t, 3> key{dx, dy, dz};
1080 auto it = mBarPieces.find(key);
1081 if (it != mBarPieces.end()) {
1082 return it->second;
1083 }
1084
1085 const TString name = TString::Format("FLOS%zu", mBarPieces.size() + 1);
1086 auto* vol = new TGeoVolume(name, new TGeoBBox(name + "box", dx, dy, dz),
1087 o2::base::MaterialManager::Instance().getTGeoMedium(GetName(), kAlFrame)); // Al
1088 mBarPieces[key] = vol;
1089 return vol;
1090}
1091
1092void Detector::placeCoolingBar(const char* mother, const std::vector<FEAContainer>& cont, Double_t crateDZ,
1093 Double_t crateY0, Double_t crateY1, Double_t xcoor, Double_t dx, Double_t ycoor,
1094 Double_t dy, Double_t zcoor, Double_t dz, Int_t& copy) const
1095{
1096 //
1097 // Places one longitudinal cooling bar in mother, as the pieces that survive between the FEA
1098 // card containers it crosses. A bar crosses about nineteen of them, and they are placed ONLY
1099 // and so take priority over it. Advances copy past the pieces it places.
1100 //
1101
1102 const Double_t barZ0 = zcoor - dz, barZ1 = zcoor + dz;
1103 const Double_t barY0 = ycoor - dy, barY1 = ycoor + dy;
1104
1105 // the container slabs that really cut this bar, along z
1106 std::vector<std::pair<Double_t, Double_t>> cut;
1107 if (crateY1 > barY0 && crateY0 < barY1) {
1108 for (auto const& c : cont) {
1109 const Double_t z0 = std::max(barZ0, c.z - crateDZ);
1110 const Double_t z1 = std::min(barZ1, c.z + crateDZ);
1111 if (z1 > z0) {
1112 cut.emplace_back(z0, z1);
1113 }
1114 }
1115 std::sort(cut.begin(), cut.end());
1116 }
1117
1118 // the bar at full height, in the gaps between containers
1119 Double_t z = barZ0;
1120 for (auto const& c : cut) {
1121 if (c.first > z) {
1122 TVirtualMC::GetMC()->Gspos(coolingBarPiece(dx, dy, 0.5 * (c.first - z))->GetName(), ++copy, mother,
1123 xcoor, ycoor, 0.5 * (z + c.first), 0, "ONLY");
1124 }
1125 z = std::max(z, c.second);
1126 }
1127 if (barZ1 > z) {
1128 TVirtualMC::GetMC()->Gspos(coolingBarPiece(dx, dy, 0.5 * (barZ1 - z))->GetName(), ++copy, mother,
1129 xcoor, ycoor, 0.5 * (z + barZ1), 0, "ONLY");
1130 }
1131
1132 // and, where the bar is taller than the container it crosses, the strip that stands proud of it
1133 const Double_t strip[2][2] = {{barY0, std::min(barY1, crateY0)}, {std::max(barY0, crateY1), barY1}};
1134 for (auto const& c : cut) {
1135 for (auto const& sy : strip) {
1136 if (sy[1] <= sy[0]) {
1137 continue;
1138 }
1139 TVirtualMC::GetMC()->Gspos(coolingBarPiece(dx, 0.5 * (sy[1] - sy[0]), 0.5 * (c.second - c.first))->GetName(),
1140 ++copy, mother, xcoor, 0.5 * (sy[0] + sy[1]), 0.5 * (c.first + c.second), 0, "ONLY");
1141 }
1142 }
1143}
1144
1145void Detector::createBackZone(Float_t xtof, Float_t ytof, Float_t zlenA) const
1146{
1147 //
1148 // Define:
1149 // - containers for FEA cards, cooling system
1150 // signal cables and supermodule support structure
1151 // (volumes called FAIA/B/C),
1152 // - containers for FEA cards and some cooling
1153 // elements for a FEA (volumes called FCA1/2).
1154 //
1155
1156 Int_t idrotm[1] = {0};
1157
1158 // Definition of the air card containers (FAIA, FAIC and FAIB)
1159
1160 Float_t par[3];
1161 par[0] = xtof * 0.5;
1162 par[1] = (ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5;
1163 par[2] = zlenA * 0.5;
1164 TVirtualMC::GetMC()->Gsvolu("FAIA", "BOX ", getMediumID(kAir), par, 3); // Air
1165 if (mTOFHoles) {
1166 TVirtualMC::GetMC()->Gsvolu("FAIB", "BOX ", getMediumID(kAir), par, 3); // Air
1167 }
1168 TVirtualMC::GetMC()->Gsvolu("FAIC", "BOX ", getMediumID(kAir), par, 3); // Air
1169
1173 // Float_t feaRoof2[3] = {Geo::ROOF2PARAMETERS[0], Geo::ROOF2PARAMETERS[1], Geo::ROOF2PARAMETERS[2]};
1174
1175 // FEA card mother-volume definition
1176 Float_t carpar[3] = {static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS),
1177 static_cast<Float_t>(feaParam[1] + feaRoof1[1] + Geo::ROOF2PARAMETERS[1] * 0.5),
1178 static_cast<Float_t>(feaRoof1[2] + Geo::BETWEENLANDMASK * 0.5 + al3[2])};
1179 TVirtualMC::GetMC()->Gsvolu("FCA1", "BOX ", getMediumID(kAir), carpar, 3); // Air
1180 TVirtualMC::GetMC()->Gsvolu("FCA2", "BOX ", getMediumID(kAir), carpar, 3); // Air
1181
1182 // rotation matrix
1183 Matrix(idrotm[0], 90., 180., 90., 90., 180., 0.);
1184
1185 // FEA card mother-volume positioning
1186 Float_t carpos[3] = {0., static_cast<Float_t>(-(ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5 + carpar[1]), -0.8};
1187
1188 for (auto const& c : feaContainers(zlenA, kFALSE)) {
1189 TVirtualMC::GetMC()->Gspos("FCA1", c.row, "FAIA", carpos[0], carpos[1], c.z, c.rotated ? idrotm[0] : 0, "ONLY");
1190 TVirtualMC::GetMC()->Gspos("FCA2", c.row, "FAIC", carpos[0], carpos[1], c.z, c.rotated ? idrotm[0] : 0, "ONLY");
1191 }
1192
1193 if (mTOFHoles) {
1194 for (auto const& c : feaContainers(zlenA, kTRUE)) {
1195 TVirtualMC::GetMC()->Gspos("FCA1", c.row, "FAIB", carpos[0], carpos[1], c.z, c.rotated ? idrotm[0] : 0, "ONLY");
1196 }
1197 }
1198}
1199
1200void Detector::makeFrontEndElectronics(Float_t xtof) const
1201{
1202 //
1203 // Fill FCA1/2 volumes with FEA cards (FFEA volumes).
1204 //
1205
1206 // FEA card volume definition
1208 TVirtualMC::GetMC()->Gsvolu("FFEA", "BOX ", getMediumID(kG10), feaParam, 3); // G10
1209
1213 // Float_t feaRoof2[3] = {Geo::ROOF2PARAMETERS[0], Geo::ROOF2PARAMETERS[1], Geo::ROOF2PARAMETERS[2]};
1214
1215 Float_t carpar[3] = {static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS),
1216 static_cast<Float_t>(feaParam[1] + feaRoof1[1] + Geo::ROOF2PARAMETERS[1] * 0.5),
1217 static_cast<Float_t>(feaRoof1[2] + Geo::BETWEENLANDMASK * 0.5 + al3[2])};
1218
1219 // FEA card volume positioning
1220 Float_t xCoor = xtof * 0.5 - 25.;
1221 Float_t yCoor = -carpar[1] + feaParam[1];
1222 Float_t zCoor = -carpar[2] + (2. * feaRoof1[2] - 2. * al1[2] - feaParam[2]);
1223 TVirtualMC::GetMC()->Gspos("FFEA", 1, "FCA1", -xCoor, yCoor, zCoor, 0, "ONLY");
1224 TVirtualMC::GetMC()->Gspos("FFEA", 4, "FCA1", xCoor, yCoor, zCoor, 0, "ONLY");
1225 TVirtualMC::GetMC()->Gspos("FFEA", 1, "FCA2", -xCoor, yCoor, zCoor, 0, "ONLY");
1226 TVirtualMC::GetMC()->Gspos("FFEA", 4, "FCA2", xCoor, yCoor, zCoor, 0, "ONLY");
1227 xCoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1228 TVirtualMC::GetMC()->Gspos("FFEA", 2, "FCA1", -xCoor, yCoor, zCoor, 0, "ONLY");
1229 TVirtualMC::GetMC()->Gspos("FFEA", 3, "FCA1", xCoor, yCoor, zCoor, 0, "ONLY");
1230 TVirtualMC::GetMC()->Gspos("FFEA", 2, "FCA2", -xCoor, yCoor, zCoor, 0, "ONLY");
1231 TVirtualMC::GetMC()->Gspos("FFEA", 3, "FCA2", xCoor, yCoor, zCoor, 0, "ONLY");
1232}
1233
1234void Detector::makeFEACooling(Float_t xtof) const
1235{
1236 //
1237 // Make cooling system attached to each FEA card
1238 // (FAL1, FRO1 and FBAR/1/2 volumes)
1239 // in FCA1/2 volume containers.
1240 //
1241
1242 // first FEA cooling element definition
1244 TVirtualMC::GetMC()->Gsvolu("FAL1", "BOX ", getMediumID(kAlFrame), al1, 3); // Al
1245
1246 // second FEA cooling element definition: an Al roof with the FRO2 Nino-mask groove cut out of
1247 // its shape. The groove is oversized by kGrooveEps where it leaves the box, so that the two
1248 // solids share no face.
1250 Float_t airHole[3] = {Geo::ROOF2PARAMETERS[0], static_cast<Float_t>(Geo::ROOF2PARAMETERS[1] * 0.5), feaRoof1[2]};
1251 const Double_t kGrooveEps = 1.e-3; // cm
1252 new TGeoBBox("FRO1box", feaRoof1[0], feaRoof1[1], feaRoof1[2]);
1253 new TGeoBBox("FRO1groove", airHole[0], airHole[1] + kGrooveEps, airHole[2] + kGrooveEps);
1254 auto* fro1GrooveTr = new TGeoTranslation("FRO1grooveTr", 0., feaRoof1[1] - airHole[1] + kGrooveEps, 0.);
1255 fro1GrooveTr->RegisterYourself();
1256 auto* fro1Shape = new TGeoCompositeShape("FRO1shape", "FRO1box-(FRO1groove:FRO1grooveTr)");
1257 new TGeoVolume("FRO1", fro1Shape, o2::base::MaterialManager::Instance().getTGeoMedium(GetName(), kAlFrame)); // Al
1258
1260 // Float_t feaRoof2[3] = {Geo::ROOF2PARAMETERS[0], Geo::ROOF2PARAMETERS[1], Geo::ROOF2PARAMETERS[2]};
1261
1262 // third FEA cooling element definition
1263 Float_t bar[3] = {Geo::BAR[0], Geo::BAR[1], Geo::BAR[2]};
1264 TVirtualMC::GetMC()->Gsvolu("FBAR", "BOX ", getMediumID(kAlFrame), bar, 3); // Al
1265
1267
1268 Float_t carpar[3] = {static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS),
1269 static_cast<Float_t>(feaParam[1] + feaRoof1[1] + Geo::ROOF2PARAMETERS[1] * 0.5),
1270 static_cast<Float_t>(feaRoof1[2] + Geo::BETWEENLANDMASK * 0.5 + al3[2])};
1271
1272 // fourth FEA cooling element definition
1273 Float_t bar1[3] = {Geo::BAR1[0], Geo::BAR1[1], Geo::BAR1[2]};
1274 TVirtualMC::GetMC()->Gsvolu("FBA1", "BOX ", getMediumID(kAlFrame), bar1, 3); // Al
1275
1276 // fifth FEA cooling element definition
1277 Float_t bar2[3] = {Geo::BAR2[0], Geo::BAR2[1], Geo::BAR2[2]};
1278 TVirtualMC::GetMC()->Gsvolu("FBA2", "BOX ", getMediumID(kAlFrame), bar2, 3); // Al
1279
1280 // first FEA cooling element positioning
1281 Float_t xcoor = xtof * 0.5 - 25.;
1282 Float_t ycoor = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - al1[1];
1283 Float_t zcoor = -carpar[2] + 2. * feaRoof1[2] - al1[2];
1284 TVirtualMC::GetMC()->Gspos("FAL1", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1285 TVirtualMC::GetMC()->Gspos("FAL1", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1286 TVirtualMC::GetMC()->Gspos("FAL1", 1, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1287 TVirtualMC::GetMC()->Gspos("FAL1", 4, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1288 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1289 TVirtualMC::GetMC()->Gspos("FAL1", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1290 TVirtualMC::GetMC()->Gspos("FAL1", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1291 TVirtualMC::GetMC()->Gspos("FAL1", 2, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1292 TVirtualMC::GetMC()->Gspos("FAL1", 3, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1293
1294 // second FEA cooling element positioning
1295 xcoor = xtof * 0.5 - 25.;
1296 ycoor = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - feaRoof1[1];
1297 zcoor = -carpar[2] + feaRoof1[2];
1298 TVirtualMC::GetMC()->Gspos("FRO1", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1299 TVirtualMC::GetMC()->Gspos("FRO1", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1300 TVirtualMC::GetMC()->Gspos("FRO1", 1, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1301 TVirtualMC::GetMC()->Gspos("FRO1", 4, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1302 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1303 TVirtualMC::GetMC()->Gspos("FRO1", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1304 TVirtualMC::GetMC()->Gspos("FRO1", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1305 TVirtualMC::GetMC()->Gspos("FRO1", 2, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1306 TVirtualMC::GetMC()->Gspos("FRO1", 3, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1307
1308 // third FEA cooling element positioning
1309 xcoor = xtof * 0.5 - 25.;
1310 ycoor = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - bar[1];
1311 zcoor = -carpar[2] + bar[2];
1312 TVirtualMC::GetMC()->Gspos("FBAR", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1313 TVirtualMC::GetMC()->Gspos("FBAR", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1314 TVirtualMC::GetMC()->Gspos("FBAR", 1, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1315 TVirtualMC::GetMC()->Gspos("FBAR", 4, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1316 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1317 TVirtualMC::GetMC()->Gspos("FBAR", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1318 TVirtualMC::GetMC()->Gspos("FBAR", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1319 TVirtualMC::GetMC()->Gspos("FBAR", 2, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1320 TVirtualMC::GetMC()->Gspos("FBAR", 3, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1321
1322 // fourth FEA cooling element positioning
1323 Float_t tubepar[3] = {0., 0.4, static_cast<Float_t>(xtof * 0.5 - Geo::CBLW)};
1324 xcoor = xtof * 0.5 - 25.;
1325 ycoor = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - bar[1];
1326 zcoor = -carpar[2] + 2. * bar[2] + 2. * tubepar[1] + bar1[2];
1327 TVirtualMC::GetMC()->Gspos("FBA1", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1328 TVirtualMC::GetMC()->Gspos("FBA1", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1329 TVirtualMC::GetMC()->Gspos("FBA1", 1, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1330 TVirtualMC::GetMC()->Gspos("FBA1", 4, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1331 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1332 TVirtualMC::GetMC()->Gspos("FBA1", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1333 TVirtualMC::GetMC()->Gspos("FBA1", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1334 TVirtualMC::GetMC()->Gspos("FBA1", 2, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1335 TVirtualMC::GetMC()->Gspos("FBA1", 3, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1336
1337 // fifth FEA cooling element positioning
1338 xcoor = xtof * 0.5 - 25.;
1339 ycoor = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - bar2[1];
1340 zcoor = -carpar[2] + 2. * bar[2] + bar2[2];
1341 TVirtualMC::GetMC()->Gspos("FBA2", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1342 TVirtualMC::GetMC()->Gspos("FBA2", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1343 TVirtualMC::GetMC()->Gspos("FBA2", 1, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1344 TVirtualMC::GetMC()->Gspos("FBA2", 4, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1345 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1346 TVirtualMC::GetMC()->Gspos("FBA2", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1347 TVirtualMC::GetMC()->Gspos("FBA2", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1348 TVirtualMC::GetMC()->Gspos("FBA2", 2, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1349 TVirtualMC::GetMC()->Gspos("FBA2", 3, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1350
1351 xcoor = xtof * 0.5 - 25.;
1352 ycoor = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - 2. * bar2[1] - 2. * tubepar[1] - bar2[1];
1353 zcoor = -carpar[2] + 2. * bar[2] + bar2[2];
1354 TVirtualMC::GetMC()->Gspos("FBA2", 5, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1355 TVirtualMC::GetMC()->Gspos("FBA2", 8, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1356 TVirtualMC::GetMC()->Gspos("FBA2", 5, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1357 TVirtualMC::GetMC()->Gspos("FBA2", 8, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1358 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1359 TVirtualMC::GetMC()->Gspos("FBA2", 6, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1360 TVirtualMC::GetMC()->Gspos("FBA2", 7, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1361 TVirtualMC::GetMC()->Gspos("FBA2", 6, "FCA2", -xcoor, ycoor, zcoor, 0, "ONLY");
1362 TVirtualMC::GetMC()->Gspos("FBA2", 7, "FCA2", xcoor, ycoor, zcoor, 0, "ONLY");
1363}
1364
1365void Detector::makeNinoMask(Float_t xtof) const
1366{
1367 //
1368 // Make cooling Nino mask
1369 // for each FEA card (FAL2/3 and FRO2 volumes)
1370 // in FCA1 volume container.
1371 //
1372
1373 // first Nino ASIC mask volume definition
1375 TVirtualMC::GetMC()->Gsvolu("FAL2", "BOX ", getMediumID(kAlFrame), al2, 3); // Al
1376
1377 // second Nino ASIC mask volume definition
1379 TVirtualMC::GetMC()->Gsvolu("FAL3", "BOX ", getMediumID(kAlFrame), al3, 3); // Al
1380
1381 // third Nino ASIC mask volume definition
1383 TVirtualMC::GetMC()->Gsvolu("FRO2", "BOX ", getMediumID(kAlFrame), feaRoof2, 3); // Al
1384
1387
1388 Float_t carpar[3] = {static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS),
1389 static_cast<Float_t>(feaParam[1] + feaRoof1[1] + Geo::ROOF2PARAMETERS[1] * 0.5),
1390 static_cast<Float_t>(feaRoof1[2] + Geo::BETWEENLANDMASK * 0.5 + al3[2])};
1391
1392 // first Nino ASIC mask volume positioning
1393 Float_t xcoor = xtof * 0.5 - 25.;
1394 Float_t ycoor = carpar[1] - 2. * al3[1];
1395 Float_t zcoor = carpar[2] - 2. * al3[2] - al2[2];
1396 TVirtualMC::GetMC()->Gspos("FAL2", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1397 TVirtualMC::GetMC()->Gspos("FAL2", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1398 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1399 TVirtualMC::GetMC()->Gspos("FAL2", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1400 TVirtualMC::GetMC()->Gspos("FAL2", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1401
1402 // second Nino ASIC mask volume positioning
1403 xcoor = xtof * 0.5 - 25.;
1404 ycoor = carpar[1] - al3[1];
1405 zcoor = carpar[2] - al3[2];
1406 TVirtualMC::GetMC()->Gspos("FAL3", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1407 TVirtualMC::GetMC()->Gspos("FAL3", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1408 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1409 TVirtualMC::GetMC()->Gspos("FAL3", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1410 TVirtualMC::GetMC()->Gspos("FAL3", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1411
1412 // third Nino ASIC mask volume positioning
1413 xcoor = xtof * 0.5 - 25.;
1414 ycoor = carpar[1] - Geo::ROOF2PARAMETERS[1];
1415 zcoor = carpar[2] - 2. * al3[2] - Geo::ROOF2PARAMETERS[2];
1416 TVirtualMC::GetMC()->Gspos("FRO2", 1, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1417 TVirtualMC::GetMC()->Gspos("FRO2", 4, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1418 xcoor = feaParam[0] + (Geo::FEAWIDTH2 * 0.5 - Geo::FEAWIDTH1);
1419 TVirtualMC::GetMC()->Gspos("FRO2", 2, "FCA1", -xcoor, ycoor, zcoor, 0, "ONLY");
1420 TVirtualMC::GetMC()->Gspos("FRO2", 3, "FCA1", xcoor, ycoor, zcoor, 0, "ONLY");
1421}
1422
1423void Detector::makeSuperModuleCooling(Float_t xtof, Float_t ytof, Float_t zlenA) const
1424{
1425 //
1426 // Make cooling tubes (FTUB volume)
1427 // and cooling bars (FTLN and FLO1/2/3 volumes)
1428 // in FAIA/B/C volume containers.
1429 //
1430
1431 Int_t idrotm[1] = {0};
1432
1433 // cooling tube volume definition
1434 Float_t tubepar[3] = {0., 0.4, static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS)};
1435 TVirtualMC::GetMC()->Gsvolu("FTUB", "TUBE", getMediumID(kCopper), tubepar, 3); // Cu
1436
1437 // water cooling tube volume definition
1438 Float_t tubeparW[3] = {0., 0.3, tubepar[2]};
1439 TVirtualMC::GetMC()->Gsvolu("FITU", "TUBE", getMediumID(kWater), tubeparW, 3); // H2O
1440
1441 // Positioning of the water tube into the steel one
1442 TVirtualMC::GetMC()->Gspos("FITU", 1, "FTUB", 0., 0., 0., 0, "ONLY");
1443
1444 // definition of transverse components of SM cooling system
1445 Float_t trapar[3] = {tubepar[2], 6.175 /*6.15*/, 0.7};
1446 TVirtualMC::GetMC()->Gsvolu("FTLN", "BOX ", getMediumID(kAlFrame), trapar, 3); // Al
1447
1448 // rotation matrix
1449 Matrix(idrotm[0], 180., 90., 90., 90., 90., 0.);
1450
1453 Float_t bar[3] = {Geo::BAR[0], Geo::BAR[1], Geo::BAR[2]};
1454 Float_t bar2[3] = {Geo::BAR2[0], Geo::BAR2[1], Geo::BAR2[2]};
1456 // Float_t feaRoof2[3] = {Geo::ROOF2PARAMETERS[0], Geo::ROOF2PARAMETERS[1], Geo::ROOF2PARAMETERS[2]};
1457
1458 Float_t carpar[3] = {static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS),
1459 static_cast<Float_t>(feaParam[1] + feaRoof1[1] + Geo::ROOF2PARAMETERS[1] * 0.5),
1460 static_cast<Float_t>(feaRoof1[2] + Geo::BETWEENLANDMASK * 0.5 + al3[2])};
1461
1462 Float_t ytub = -(ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5 + carpar[1] + carpar[1] -
1463 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - 2. * bar2[1] - tubepar[1];
1464
1465 // Positioning of tubes for the SM cooling system
1466 Float_t ycoor = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - 2. * bar2[1] - tubepar[1];
1467 Float_t zcoor = -carpar[2] + 2. * bar[2] + tubepar[1];
1468 TVirtualMC::GetMC()->Gspos("FTUB", 1, "FCA1", 0., ycoor, zcoor, idrotm[0], "ONLY");
1469 TVirtualMC::GetMC()->Gspos("FTUB", 1, "FCA2", 0., ycoor, zcoor, idrotm[0], "ONLY");
1470 gGeoManager->GetVolume("FTUB")->VisibleDaughters(kFALSE);
1471
1472 Float_t yFLTN = trapar[1] - (ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5;
1473 for (Int_t sg = -1; sg < 2; sg += 2) {
1474 // Positioning of transverse components for the SM cooling system
1475 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 4 * sg, "FAIA", 0., yFLTN, 369.9 * sg, 0, "ONLY");
1476 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 3 * sg, "FAIA", 0., yFLTN, 366.9 * sg, 0, "ONLY");
1477 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 2 * sg, "FAIA", 0., yFLTN, 198.8 * sg, 0, "ONLY");
1478 TVirtualMC::GetMC()->Gspos("FTLN", 5 + sg, "FAIA", 0., yFLTN, 56.82 * sg, 0, "ONLY");
1479 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 4 * sg, "FAIC", 0., yFLTN, 369.9 * sg, 0, "ONLY");
1480 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 3 * sg, "FAIC", 0., yFLTN, 366.9 * sg, 0, "ONLY");
1481 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 2 * sg, "FAIC", 0., yFLTN, 198.8 * sg, 0, "ONLY");
1482 TVirtualMC::GetMC()->Gspos("FTLN", 5 + sg, "FAIC", 0., yFLTN, 56.82 * sg, 0, "ONLY");
1483 }
1484
1485 // definition of longitudinal components of SM cooling system
1486 Float_t lonpar1[3] = {2., 0.5, static_cast<Float_t>(56.82 - trapar[2])};
1487 Float_t lonpar2[3] = {lonpar1[0], lonpar1[1], static_cast<Float_t>((198.8 - 56.82) * 0.5 - trapar[2])};
1488 Float_t lonpar3[3] = {lonpar1[0], lonpar1[1], static_cast<Float_t>((366.9 - 198.8) * 0.5 - trapar[2])};
1489 // Positioning of the longitudinal components of the SM cooling system, segmented between the
1490 // FEA card containers rather than declared overlapping.
1491 mBarPieces.clear();
1492 const std::vector<FEAContainer> contFull = feaContainers(zlenA, kFALSE);
1493 const std::vector<FEAContainer> contHoles = feaContainers(zlenA, kTRUE);
1494 const Double_t crateY = -(ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5 + carpar[1];
1495 const Double_t crateY0 = crateY - carpar[1], crateY1 = crateY + carpar[1];
1496 const Float_t zcoor2 = (198.8 + 56.82) * 0.5;
1497 const Float_t zcoor3 = (366.9 + 198.8) * 0.5;
1498 Int_t copyA = 0, copyB = 0, copyC = 0;
1499
1500 for (Int_t up = 0; up < 2; ++up) {
1501 ycoor = up ? ytub + (tubepar[1] + 2. * bar2[1] + lonpar1[1]) : ytub - (tubepar[1] + 2. * bar2[1] + lonpar1[1]);
1502 for (Int_t sx = -1; sx < 2; sx += 2) {
1503 placeCoolingBar("FAIA", contFull, carpar[2], crateY0, crateY1, sx * 24., lonpar1[0], ycoor, lonpar1[1], 0.,
1504 lonpar1[2], copyA);
1505 placeCoolingBar("FAIC", contFull, carpar[2], crateY0, crateY1, sx * 24., lonpar1[0], ycoor, lonpar1[1], 0.,
1506 lonpar1[2], copyC);
1507 for (Int_t sz = -1; sz < 2; sz += 2) {
1508 placeCoolingBar("FAIA", contFull, carpar[2], crateY0, crateY1, sx * 24., lonpar2[0], ycoor, lonpar2[1],
1509 sz * zcoor2, lonpar2[2], copyA);
1510 placeCoolingBar("FAIC", contFull, carpar[2], crateY0, crateY1, sx * 24., lonpar2[0], ycoor, lonpar2[1],
1511 sz * zcoor2, lonpar2[2], copyC);
1512 placeCoolingBar("FAIA", contFull, carpar[2], crateY0, crateY1, sx * 24., lonpar3[0], ycoor, lonpar3[1],
1513 sz * zcoor3, lonpar3[2], copyA);
1514 placeCoolingBar("FAIC", contFull, carpar[2], crateY0, crateY1, sx * 24., lonpar3[0], ycoor, lonpar3[1],
1515 sz * zcoor3, lonpar3[2], copyC);
1516 }
1517 }
1518 }
1519
1520 Float_t carpos[3] = {static_cast<Float_t>(25. - xtof * 0.5),
1521 static_cast<Float_t>((11.5 - (ytof * 0.5 - Geo::MODULECOVERTHICKNESS)) * 0.5), 0.};
1522 if (mTOFHoles) {
1523 for (Int_t sg = -1; sg < 2; sg += 2) {
1524 carpos[2] = sg * zlenA * 0.5;
1525 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 4 * sg, "FAIB", 0., yFLTN, 369.9 * sg, 0, "ONLY");
1526 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 3 * sg, "FAIB", 0., yFLTN, 366.9 * sg, 0, "ONLY");
1527 TVirtualMC::GetMC()->Gspos("FTLN", 5 + 2 * sg, "FAIB", 0., yFLTN, 198.8 * sg, 0, "ONLY");
1528 TVirtualMC::GetMC()->Gspos("FTLN", 5 + sg, "FAIB", 0., yFLTN, 56.82 * sg, 0, "ONLY");
1529 }
1530
1531 // the modules with the PHOS hole carry one x side per cooling layer, and no FLO1 bar
1532 for (Int_t up = 0; up < 2; ++up) {
1533 ycoor = up ? ytub + (tubepar[1] + 2. * bar2[1] + lonpar1[1]) : ytub - (tubepar[1] + 2. * bar2[1] + lonpar1[1]);
1534 const Double_t xcoor = up ? -24. : 24.;
1535 for (Int_t sz = -1; sz < 2; sz += 2) {
1536 placeCoolingBar("FAIB", contHoles, carpar[2], crateY0, crateY1, xcoor, lonpar2[0], ycoor, lonpar2[1],
1537 sz * zcoor2, lonpar2[2], copyB);
1538 placeCoolingBar("FAIB", contHoles, carpar[2], crateY0, crateY1, xcoor, lonpar3[0], ycoor, lonpar3[1],
1539 sz * zcoor3, lonpar3[2], copyB);
1540 }
1541 }
1542 }
1543
1544 Float_t barS[3] = {Geo::BARS[0], Geo::BARS[1], Geo::BARS[2]};
1545 TVirtualMC::GetMC()->Gsvolu("FBAS", "BOX ", getMediumID(kAlFrame), barS, 3); // Al
1546
1547 Float_t barS1[3] = {Geo::BARS1[0], Geo::BARS1[1], Geo::BARS1[2]};
1548 TVirtualMC::GetMC()->Gsvolu("FBS1", "BOX ", getMediumID(kAlFrame), barS1, 3); // Al
1549
1550 Float_t barS2[3] = {Geo::BARS2[0], Geo::BARS2[1], Geo::BARS2[2]};
1551 TVirtualMC::GetMC()->Gsvolu("FBS2", "BOX ", getMediumID(kAlFrame), barS2, 3); // Al
1552
1553 Float_t ytubBis = carpar[1] - 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - 2. * barS2[1] - tubepar[1];
1554 ycoor = ytubBis;
1555 zcoor = -carpar[2] + barS[2];
1556 TVirtualMC::GetMC()->Gspos("FBAS", 1, "FCA1", -24., ycoor, zcoor, 0, "ONLY");
1557 TVirtualMC::GetMC()->Gspos("FBAS", 2, "FCA1", 24., ycoor, zcoor, 0, "ONLY");
1558 TVirtualMC::GetMC()->Gspos("FBAS", 1, "FCA2", -24., ycoor, zcoor, 0, "ONLY");
1559 TVirtualMC::GetMC()->Gspos("FBAS", 2, "FCA2", 24., ycoor, zcoor, 0, "ONLY");
1560
1561 zcoor = -carpar[2] + 2. * barS[2] + 2. * tubepar[1] + barS1[2];
1562 TVirtualMC::GetMC()->Gspos("FBS1", 1, "FCA1", -24., ycoor, zcoor, 0, "ONLY");
1563 TVirtualMC::GetMC()->Gspos("FBS1", 2, "FCA1", 24., ycoor, zcoor, 0, "ONLY");
1564 TVirtualMC::GetMC()->Gspos("FBS1", 1, "FCA2", -24., ycoor, zcoor, 0, "ONLY");
1565 TVirtualMC::GetMC()->Gspos("FBS1", 2, "FCA2", 24., ycoor, zcoor, 0, "ONLY");
1566
1567 ycoor = ytubBis + (tubepar[1] + barS2[1]);
1568 zcoor = -carpar[2] + 2. * barS[2] + barS2[2];
1569 TVirtualMC::GetMC()->Gspos("FBS2", 1, "FCA1", -24., ycoor, zcoor, 0, "ONLY");
1570 TVirtualMC::GetMC()->Gspos("FBS2", 2, "FCA1", 24., ycoor, zcoor, 0, "ONLY");
1571 TVirtualMC::GetMC()->Gspos("FBS2", 1, "FCA2", -24., ycoor, zcoor, 0, "ONLY");
1572 TVirtualMC::GetMC()->Gspos("FBS2", 2, "FCA2", 24., ycoor, zcoor, 0, "ONLY");
1573
1574 ycoor = ytubBis - (tubepar[1] + barS2[1]);
1575 // zcoor =-carpar[2] + 2.*barS[2] + barS2[2];
1576 TVirtualMC::GetMC()->Gspos("FBS2", 3, "FCA1", -24., ycoor, zcoor, 0, "ONLY");
1577 TVirtualMC::GetMC()->Gspos("FBS2", 4, "FCA1", 24., ycoor, zcoor, 0, "ONLY");
1578 TVirtualMC::GetMC()->Gspos("FBS2", 3, "FCA2", -24., ycoor, zcoor, 0, "ONLY");
1579 TVirtualMC::GetMC()->Gspos("FBS2", 4, "FCA2", 24., ycoor, zcoor, 0, "ONLY");
1580}
1581
1582//_____________________________________________________________________________
1583void Detector::makeSuperModuleServices(Float_t xtof, Float_t ytof, Float_t zlenA) const
1584{
1585 //
1586 // Make signal cables (FCAB/L and FCBL/B volumes),
1587 // supemodule cover (FCOV volume) and wall (FSAW volume)
1588 // in FAIA/B/C volume containers.
1589 //
1590
1591 Int_t idrotm[3] = {0, 0, 0};
1592
1593 Float_t tubepar[3] = {0., 0.4, static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS)};
1597 // Float_t feaRoof2[3] = {Geo::ROOF2PARAMETERS[0], Geo::ROOF2PARAMETERS[1], Geo::ROOF2PARAMETERS[2]};
1599
1600 // FEA cables definition
1601 Float_t cbpar[3] = {0., 0.5,
1602 static_cast<Float_t>((tubepar[2] - (Geo::FEAWIDTH2 - Geo::FEAWIDTH1 / 6.) * 0.5) * 0.5)};
1603 TVirtualMC::GetMC()->Gsvolu("FCAB", "TUBE", getMediumID(kCable), cbpar, 3); // copper+alu
1604
1605 Float_t cbparS[3] = {cbpar[0], cbpar[1],
1606 static_cast<Float_t>(
1607 (tubepar[2] - (xtof * 0.5 - 25. + (Geo::FEAWIDTH1 - Geo::FEAWIDTH1 / 6.) * 0.5)) * 0.5)};
1608 TVirtualMC::GetMC()->Gsvolu("FCAL", "TUBE", getMediumID(kCable), cbparS, 3); // copper+alu
1609
1610 // rotation matrix
1611 Matrix(idrotm[0], 180., 90., 90., 90., 90., 0.);
1612
1613 Float_t carpar[3] = {static_cast<Float_t>(xtof * 0.5 - Geo::CBLW - Geo::SAWTHICKNESS),
1614 static_cast<Float_t>(feaParam[1] + feaRoof1[1] + Geo::ROOF2PARAMETERS[1] * 0.5),
1615 static_cast<Float_t>(feaRoof1[2] + Geo::BETWEENLANDMASK * 0.5 + al3[2])};
1616
1617 Float_t bar2[3] = {Geo::BAR2[0], Geo::BAR2[1], Geo::BAR2[2]};
1618 Float_t ytub = -(ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5 + carpar[1] + carpar[1] -
1619 2. * Geo::ROOF2PARAMETERS[1] * 0.5 - 2. * feaRoof1[1] - 2. * bar2[1] - tubepar[1];
1620
1621 // FEA cables positioning
1622 Float_t xcoor = (tubepar[2] + (Geo::FEAWIDTH2 - Geo::FEAWIDTH1 / 6.) * 0.5) * 0.5;
1623 Float_t ycoor = ytub - 3.;
1624 Float_t zcoor = -carpar[2] + (2. * feaRoof1[2] - 2. * al1[2] - 2. * feaParam[2] - cbpar[1]);
1625 TVirtualMC::GetMC()->Gspos("FCAB", 1, "FCA1", -xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1626 TVirtualMC::GetMC()->Gspos("FCAB", 2, "FCA1", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1627 TVirtualMC::GetMC()->Gspos("FCAB", 1, "FCA2", -xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1628 TVirtualMC::GetMC()->Gspos("FCAB", 2, "FCA2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1629 xcoor = (tubepar[2] + (xtof * 0.5 - 25. + (Geo::FEAWIDTH1 - Geo::FEAWIDTH1 / 6.) * 0.5)) * 0.5;
1630 ycoor -= 2. * cbpar[1];
1631 TVirtualMC::GetMC()->Gspos("FCAL", 1, "FCA1", -xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1632 TVirtualMC::GetMC()->Gspos("FCAL", 2, "FCA1", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1633 TVirtualMC::GetMC()->Gspos("FCAL", 1, "FCA2", -xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1634 TVirtualMC::GetMC()->Gspos("FCAL", 2, "FCA2", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1635
1636 // Cables and tubes on the side blocks
1637 // constants definition
1638 Float_t kCBLl = zlenA * 0.5; // length of block
1639 Float_t kCBLlh = zlenA * 0.5 - Geo::INTERCENTRMODBORDER2; // length of block in case of holes
1640 // constexpr Float_t Geo::CBLW = 13.5; // width of block
1641 // constexpr Float_t Geo::CBLH1 = 2.; // min. height of block
1642 // constexpr Float_t Geo::CBLH2 = 12.3; // max. height of block
1643 // constexpr Float_t Geo::SAWTHICKNESS = 1.; // Al wall thickness
1644
1645 // lateral cable and tube volume definition
1646 Float_t tgal = (Geo::CBLH2 - Geo::CBLH1) / (2. * kCBLl);
1647 Float_t cblpar[11];
1648 cblpar[0] = Geo::CBLW * 0.5;
1649 cblpar[1] = 0.;
1650 cblpar[2] = 0.;
1651 cblpar[3] = kCBLl * 0.5;
1652 cblpar[4] = Geo::CBLH1 * 0.5;
1653 cblpar[5] = Geo::CBLH2 * 0.5;
1654 cblpar[6] = TMath::ATan(tgal) * TMath::RadToDeg();
1655 cblpar[7] = kCBLl * 0.5;
1656 cblpar[8] = Geo::CBLH1 * 0.5;
1657 cblpar[9] = Geo::CBLH2 * 0.5;
1658 cblpar[10] = cblpar[6];
1659 TVirtualMC::GetMC()->Gsvolu("FCBL", "TRAP", getMediumID(kCableTubes), cblpar, 11); // cables and tubes mix
1660
1661 // Side Al Walls definition
1662 Float_t sawpar[3] = {static_cast<Float_t>(Geo::SAWTHICKNESS * 0.5), static_cast<Float_t>(Geo::CBLH2 * 0.5), kCBLl};
1663 TVirtualMC::GetMC()->Gsvolu("FSAW", "BOX ", getMediumID(kAlFrame), sawpar, 3); // Al
1664
1665 Matrix(idrotm[1], 90., 90., 180., 0., 90., 180.);
1666 Matrix(idrotm[2], 90., 90., 0., 0., 90., 0.);
1667
1668 // lateral cable and tube volume positioning
1669 xcoor = (xtof - Geo::CBLW) * 0.5 - 2. * sawpar[0];
1670 ycoor = (Geo::CBLH1 + Geo::CBLH2) * 0.25 - (ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5;
1671 zcoor = kCBLl * 0.5;
1672 TVirtualMC::GetMC()->Gspos("FCBL", 1, "FAIA", -xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
1673 TVirtualMC::GetMC()->Gspos("FCBL", 2, "FAIA", xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
1674 TVirtualMC::GetMC()->Gspos("FCBL", 3, "FAIA", -xcoor, ycoor, zcoor, idrotm[2], "ONLY");
1675 TVirtualMC::GetMC()->Gspos("FCBL", 4, "FAIA", xcoor, ycoor, zcoor, idrotm[2], "ONLY");
1676 TVirtualMC::GetMC()->Gspos("FCBL", 1, "FAIC", -xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
1677 TVirtualMC::GetMC()->Gspos("FCBL", 2, "FAIC", xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
1678 TVirtualMC::GetMC()->Gspos("FCBL", 3, "FAIC", -xcoor, ycoor, zcoor, idrotm[2], "ONLY");
1679 TVirtualMC::GetMC()->Gspos("FCBL", 4, "FAIC", xcoor, ycoor, zcoor, idrotm[2], "ONLY");
1680
1681 if (mTOFHoles) {
1682 cblpar[3] = kCBLlh * 0.5;
1683 cblpar[5] = Geo::CBLH1 * 0.5 + kCBLlh * tgal;
1684 cblpar[7] = kCBLlh * 0.5;
1685 cblpar[9] = cblpar[5];
1686 TVirtualMC::GetMC()->Gsvolu("FCBB", "TRAP", getMediumID(kCableTubes), cblpar, 11); // cables and tubes mix
1687
1688 xcoor = (xtof - Geo::CBLW) * 0.5 - 2. * sawpar[0];
1689 ycoor = (Geo::CBLH1 + 2. * cblpar[5]) * 0.25 - (ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5;
1690 zcoor = kCBLl - kCBLlh * 0.5;
1691 TVirtualMC::GetMC()->Gspos("FCBB", 1, "FAIB", -xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
1692 TVirtualMC::GetMC()->Gspos("FCBB", 2, "FAIB", xcoor, ycoor, -zcoor, idrotm[1], "ONLY");
1693 TVirtualMC::GetMC()->Gspos("FCBB", 3, "FAIB", -xcoor, ycoor, zcoor, idrotm[2], "ONLY");
1694 TVirtualMC::GetMC()->Gspos("FCBB", 4, "FAIB", xcoor, ycoor, zcoor, idrotm[2], "ONLY");
1695 }
1696
1697 // lateral cable and tube volume positioning
1698 xcoor = xtof * 0.5 - sawpar[0];
1699 ycoor = (Geo::CBLH2 - ytof * 0.5 + Geo::MODULECOVERTHICKNESS) * 0.5;
1700 zcoor = 0.;
1701 TVirtualMC::GetMC()->Gspos("FSAW", 1, "FAIA", -xcoor, ycoor, zcoor, 0, "ONLY");
1702 TVirtualMC::GetMC()->Gspos("FSAW", 2, "FAIA", xcoor, ycoor, zcoor, 0, "ONLY");
1703 TVirtualMC::GetMC()->Gspos("FSAW", 1, "FAIC", -xcoor, ycoor, zcoor, 0, "ONLY");
1704 TVirtualMC::GetMC()->Gspos("FSAW", 2, "FAIC", xcoor, ycoor, zcoor, 0, "ONLY");
1705
1706 if (mTOFHoles) {
1707 xcoor = xtof * 0.5 - sawpar[0];
1708 ycoor = (Geo::CBLH2 - ytof * 0.5 + Geo::MODULECOVERTHICKNESS) * 0.5;
1709 TVirtualMC::GetMC()->Gspos("FSAW", 1, "FAIB", -xcoor, ycoor, 0., 0, "ONLY");
1710 TVirtualMC::GetMC()->Gspos("FSAW", 2, "FAIB", xcoor, ycoor, 0., 0, "ONLY");
1711 }
1712
1713 // TOF Supermodule cover definition and positioning
1714 Float_t covpar[3] = {static_cast<Float_t>(xtof * 0.5), 0.075, static_cast<Float_t>(zlenA * 0.5)};
1715 TVirtualMC::GetMC()->Gsvolu("FCOV", "BOX ", getMediumID(kAlFrame), covpar, 3); // Al
1716 if (mTOFHoles) {
1717 covpar[2] = (zlenA * 0.5 - Geo::INTERCENTRMODBORDER2) * 0.5;
1718 TVirtualMC::GetMC()->Gsvolu("FCOB", "BOX ", getMediumID(kAlFrame), covpar, 3); // Al
1719 covpar[2] = Geo::INTERCENTRMODBORDER2;
1720 TVirtualMC::GetMC()->Gsvolu("FCOP", "BOX ", getMediumID(kPlastic), covpar, 3); // Plastic (CH2)
1721 }
1722
1723 xcoor = 0.;
1724 ycoor = (ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5 - covpar[1];
1725 zcoor = 0.;
1726 TVirtualMC::GetMC()->Gspos("FCOV", 0, "FAIA", xcoor, ycoor, zcoor, 0, "ONLY");
1727 TVirtualMC::GetMC()->Gspos("FCOV", 0, "FAIC", xcoor, ycoor, zcoor, 0, "ONLY");
1728 if (mTOFHoles) {
1729 zcoor = (zlenA * 0.5 + Geo::INTERCENTRMODBORDER2) * 0.5;
1730 TVirtualMC::GetMC()->Gspos("FCOB", 1, "FAIB", xcoor, ycoor, zcoor, 0, "ONLY");
1731 TVirtualMC::GetMC()->Gspos("FCOB", 2, "FAIB", xcoor, ycoor, -zcoor, 0, "ONLY");
1732 zcoor = 0.;
1733 TVirtualMC::GetMC()->Gspos("FCOP", 0, "FAIB", xcoor, ycoor, zcoor, 0, "ONLY");
1734 }
1735}
1736
1737//_____________________________________________________________________________
1738void Detector::makeReadoutCrates(Float_t ytof) const
1739{
1740 // Services Volumes
1741
1742 // Empty crate weight: 50 Kg, electronics cards + cables ~ 52 Kg.
1743 // Per each side (A and C) the total weight is: 2x102 ~ 204 Kg.
1744 // ... + weight of the connection pannel for the steel cooling system (Cr 18%, Ni 12%, Fe 70%)
1745 // + other remaining elements + various supports
1746
1747 // Each FEA card weight + all supports
1748 // (including all bolts and not including the cable connectors)
1749 // 353.1 g.
1750 // Per each strip there are 4 FEA cards, then
1751 // the total weight of the front-end electonics section is: 353.1 g x 4 = 1412.4 g.
1752
1753 // Services Volumes
1754
1755 // Empty crate weight: 50 Kg, electronics cards + cables ~ 52 Kg.
1756 // Per each side (A and C) the total weight is: 2x102 ~ 204 Kg.
1757 // ... + weight of the connection pannel for the steel cooling system (Cr 18%, Ni 12%, Fe 70%)
1758 // + other remaining elements + various supports
1759
1760 // Each FEA card weight + all supports
1761 // (including all bolts and not including the cable connectors)
1762 // 353.1 g.
1763 // Per each strip there are 4 FEA cards, then
1764 // the total weight of the front-end electonics section is: 353.1 g x 4 = 1412.4 g.
1765 //
1766
1767 Int_t idrotm[Geo::NSECTORS];
1768 for (Int_t ii = 0; ii < Geo::NSECTORS; ii++) {
1769 idrotm[ii] = 0;
1770 }
1771
1772 // volume definition
1773 Float_t serpar[3] = {29. * 0.5, 121. * 0.5, 90. * 0.5};
1774 TVirtualMC::GetMC()->Gsvolu("FTOS", "BOX ", getMediumID(kCrates), serpar, 3); // Al + Cu + steel
1775
1776 Float_t xcoor, ycoor, zcoor;
1777 zcoor = (118. - 90.) * 0.5;
1778 Float_t phi = -10., ra = Geo::RMIN + ytof * 0.5;
1779 for (Int_t i = 0; i < Geo::NSECTORS; i++) {
1780 phi += Geo::PHISEC;
1781 xcoor = ra * TMath::Cos(phi * TMath::DegToRad());
1782 ycoor = ra * TMath::Sin(phi * TMath::DegToRad());
1783 Matrix(idrotm[i], 90., phi, 90., phi + 270., 0., 0.);
1784 TVirtualMC::GetMC()->Gspos("FTOS", i, "BFMO", xcoor, ycoor, zcoor, idrotm[i], "ONLY");
1785 }
1786
1787 zcoor = (90. - 223.) * 0.5;
1788 TVirtualMC::GetMC()->Gspos("FTOS", 1, "BBCE", ra, -3., zcoor, 0, "ONLY");
1789}
1790
1791void Detector::makeModulesInBTOFvolumes(Float_t ytof, Float_t zlenA) const
1792{
1793 //
1794 // Fill BTOF_%i (for i=0,...17) volumes
1795 // with volumes FTOA (MRPC strip container),
1796 // In case of TOF holes, three sectors (i.e. 13th, 14th and 15th)
1797 // are filled with volumes: FTOB and FTOC (MRPC containers),
1798 //
1799
1800 constexpr Int_t SIZESTR = 16;
1801
1802 Int_t idrotm[1] = {0};
1803
1804 // Matrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
1805 Matrix(idrotm[0], 90., 0., 0., 0., 90., 270.);
1806
1807 Float_t xcoor, ycoor, zcoor;
1808 xcoor = 0.;
1809
1810 // Positioning of fibre glass modules (FTOA, FTOB and FTOC)
1811 for (Int_t isec = 0; isec < Geo::NSECTORS; isec++) {
1812 if (mTOFSectors[isec] == -1) {
1813 continue;
1814 }
1815
1816 char name[SIZESTR];
1817 snprintf(name, SIZESTR, "BTOF%d", isec);
1818 if (mTOFHoles && (isec == 13 || isec == 14 || isec == 15)) {
1819 // xcoor = 0.;
1820 ycoor = (zlenA * 0.5 + Geo::INTERCENTRMODBORDER1) * 0.5;
1821 zcoor = -ytof * 0.25;
1822 TVirtualMC::GetMC()->Gspos("FTOB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1823 TVirtualMC::GetMC()->Gspos("FTOC", 0, name, xcoor, -ycoor, zcoor, idrotm[0], "ONLY");
1824 } else {
1825 // xcoor = 0.;
1826 ycoor = 0.;
1827 zcoor = -ytof * 0.25;
1828 TVirtualMC::GetMC()->Gspos("FTOA", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1829 }
1830 }
1831
1832 // float par[3] = {100,500,10};
1833 // TVirtualMC::GetMC()->Gsvolu("FTEM", "BOX ", getMediumID(kAlFrame), par, 3); // Fibre glass
1834 // ycoor = 0.;
1835 // zcoor = 350;
1836 // TVirtualMC::GetMC()->Gspos("FTEM", 0, "cave", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1837
1838 // TVirtualMC::GetMC()->Gspos("FTOA", 0, "cave", xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1839}
1840
1841void Detector::makeCoversInBTOFvolumes() const
1842{
1843 //
1844 // Fill BTOF_%i (for i=0,...17) volumes
1845 // with volumes FPEA (to separate strips from FEA cards)
1846 // In case of TOF holes, three sectors (i.e. 13th, 14th and 15th)
1847 // are filled with FPEB volumes
1848 // (to separate MRPC strips from FEA cards)
1849 //
1850
1851 constexpr Int_t SIZESTR = 16;
1852
1853 Int_t idrotm[1] = {0};
1854
1855 // Matrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
1856 Matrix(idrotm[0], 90., 0., 0., 0., 90., 270.);
1857
1858 Float_t xcoor, ycoor, zcoor;
1859 xcoor = 0.;
1860 ycoor = 0.;
1861 zcoor = Geo::MODULECOVERTHICKNESS * 0.5;
1862
1863 char name[SIZESTR];
1864
1865 // Positioning of module covers (FPEA, FPEB)
1866 for (Int_t isec = 0; isec < Geo::NSECTORS; isec++) {
1867 if (mTOFSectors[isec] == -1) {
1868 continue;
1869 }
1870 snprintf(name, SIZESTR, "BTOF%d", isec);
1871 if (mTOFHoles && (isec == 13 || isec == 14 || isec == 15)) {
1872 TVirtualMC::GetMC()->Gspos("FPEB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1873 } else {
1874 TVirtualMC::GetMC()->Gspos("FPEA", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1875 }
1876 }
1877}
1878
1879//_____________________________________________________________________________
1880void Detector::makeBackInBTOFvolumes(Float_t ytof) const
1881{
1882 //
1883 // Fill BTOF_%i (for i=0,...17) volumes with volumes called FAIA and
1884 // FAIC (FEA cards and services container).
1885 // In case of TOF holes, three sectors (i.e. 13th, 14th and 15th) are
1886 // filled with volumes FAIB (FEA cards and services container).
1887 //
1888
1889 constexpr Int_t SIZESTR = 16;
1890
1891 Int_t idrotm[1] = {0};
1892
1893 // Matrix(idrotm[0], 90., 0., 0., 0., 90.,-90.);
1894 Matrix(idrotm[0], 90., 0., 0., 0., 90., 270.);
1895
1896 Float_t xcoor, ycoor, zcoor;
1897 xcoor = 0.;
1898 ycoor = 0.;
1899 zcoor = Geo::MODULECOVERTHICKNESS + (ytof * 0.5 - Geo::MODULECOVERTHICKNESS) * 0.5;
1900
1901 char name[SIZESTR];
1902
1903 // Positioning of FEA cards and services containers (FAIA, FAIC and FAIB)
1904 for (Int_t isec = 0; isec < Geo::NSECTORS; isec++) {
1905 if (mTOFSectors[isec] == -1) {
1906 continue;
1907 }
1908 snprintf(name, SIZESTR, "BTOF%d", isec);
1909 if (Geo::FEAWITHMASKS[isec]) {
1910 TVirtualMC::GetMC()->Gspos("FAIA", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1911 } else {
1912 if (mTOFHoles && (isec == 13 || isec == 14 || isec == 15)) {
1913 TVirtualMC::GetMC()->Gspos("FAIB", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1914 } else {
1915 TVirtualMC::GetMC()->Gspos("FAIC", 0, name, xcoor, ycoor, zcoor, idrotm[0], "ONLY");
1916 }
1917 }
1918 }
1919}
1920
1922{
1923 //
1924 // Create entries for alignable volumes associating the symbolic volume
1925 // name with the corresponding volume path. Needs to be syncronized with
1926 // eventual changes in the geometry.
1927 //
1928
1930 Int_t modUID, modnum = 0;
1931
1932 TString volPath;
1933 TString symName;
1934
1935 TString vpL0 = "cave/barrel_1/B077_1/BSEGMO";
1936 TString vpL1 = "_1/BTOF";
1937 TString vpL2 = "_1";
1938 TString vpL3 = "/FTOA_0";
1939 TString vpL4 = "/FLTA_0/FSTR_";
1940
1941 TString snSM = "TOF/sm";
1942 TString snSTRIP = "/strip";
1943
1944 //
1945 // The TOF MRPC Strips
1946 // The symbolic names are: TOF/sm00/strip01
1947 // ...
1948 // TOF/sm17/strip91
1949
1950 Int_t imod = 0;
1951
1952 for (Int_t isect = 0; isect < Geo::NSECTORS; isect++) {
1953 for (Int_t istr = 1; istr <= Geo::NSTRIPXSECTOR; istr++) {
1954 modUID = o2::base::GeometryManager::getSensID(idTOF, modnum++);
1955 LOG(debug) << "modUID: " << modUID;
1956
1957 if (mTOFSectors[isect] == -1) {
1958 continue;
1959 }
1960
1961 if (mTOFHoles && (isect == 13 || isect == 14 || isect == 15)) {
1962 if (istr < 39) {
1963 vpL3 = "/FTOB_0";
1964 vpL4 = "/FLTB_0/FSTR_";
1965 } else if (istr > 53) {
1966 vpL3 = "/FTOC_0";
1967 vpL4 = "/FLTC_0/FSTR_";
1968 } else {
1969 continue;
1970 }
1971 } else {
1972 vpL3 = "/FTOA_0";
1973 vpL4 = "/FLTA_0/FSTR_";
1974 }
1975
1976 volPath = vpL0;
1977 volPath += isect;
1978 volPath += vpL1;
1979 volPath += isect;
1980 volPath += vpL2;
1981 volPath += vpL3;
1982 volPath += vpL4;
1983 volPath += istr;
1984
1985 symName = snSM;
1986 symName += Form("%02d", isect);
1987 symName += snSTRIP;
1988 symName += Form("%02d", istr);
1989
1990 LOG(debug) << "--------------------------------------------"
1991 << "\n";
1992 LOG(debug) << "Alignable object" << imod << "\n";
1993 LOG(debug) << "volPath=" << volPath << "\n";
1994 LOG(debug) << "symName=" << symName << "\n";
1995 LOG(debug) << "--------------------------------------------"
1996 << "\n";
1997
1998 LOG(debug) << "Check for alignable entry: " << symName;
1999
2000 if (!gGeoManager->SetAlignableEntry(symName.Data(), volPath.Data(), modUID)) {
2001 LOG(error) << "Alignable entry " << symName << " NOT set";
2002 }
2003 LOG(debug) << "Alignable entry " << symName << " set";
2004
2005 // T2L matrices for alignment
2006 TGeoPNEntry* e = gGeoManager->GetAlignableEntryByUID(modUID);
2007 LOG(debug) << "Got TGeoPNEntry " << e;
2008
2009 if (e) {
2010 TGeoHMatrix* globMatrix = e->GetGlobalOrig();
2011 Double_t phi = Geo::PHISEC * (isect % Geo::NSECTORS) + Geo::PHISEC * 0.5;
2012 TGeoHMatrix* t2l = new TGeoHMatrix();
2013 t2l->RotateZ(phi);
2014 const TGeoHMatrix& globMatrixi = globMatrix->Inverse();
2015 t2l->MultiplyLeft(&globMatrixi);
2016 e->SetMatrix(t2l);
2017 } else {
2018 // AliError(Form("Alignable entry %s is not valid!",symName.Data()));
2019 }
2020 imod++;
2021 }
2022 }
2023
2024 //
2025 // The TOF supermodules
2026 // The symbolic names are: TOF/sm00
2027 // ...
2028 // TOF/sm17
2029 //
2030 for (Int_t isect = 0; isect < Geo::NSECTORS; isect++) {
2031 volPath = vpL0;
2032 volPath += isect;
2033 volPath += vpL1;
2034 volPath += isect;
2035 volPath += vpL2;
2036
2037 symName = snSM;
2038 symName += Form("%02d", isect);
2039
2040 // AliDebug(2,"--------------------------------------------");
2041 // AliDebug(2,Form("Alignable object %d", isect+imod));
2042 // AliDebug(2,Form("volPath=%s\n",volPath.Data()));
2043 // AliDebug(2,Form("symName=%s\n",symName.Data()));
2044 // AliDebug(2,"--------------------------------------------");
2045
2046 gGeoManager->SetAlignableEntry(symName.Data(), volPath.Data());
2047 }
2048}
Definition of the GeometryManager class.
Definition of the Stack class.
std::ostringstream debug
int16_t time
Definition RawEventData.h:4
int32_t i
uint16_t pos
Definition RawData.h:3
uint32_t c
Definition RawData.h:2
uint32_t stack
Definition RawData.h:1
ClassImp(Detector)
StringRef key
V GetEnergyLoss() const
Definition BaseHits.h:103
void Matrix(Int_t &nmat, Float_t theta1, Float_t phi1, Float_t theta2, Float_t phi2, Float_t theta3, Float_t phi3) const
Definition Detector.cxx:104
void Mixture(Int_t imat, const char *name, Float_t *a, Float_t *z, Float_t dens, Int_t nlmat, Float_t *wmat)
Definition Detector.cxx:66
void Medium(Int_t numed, const char *name, Int_t nmat, Int_t isvol, Int_t ifield, Float_t fieldm, Float_t tmaxfd, Float_t stemax, Float_t deemax, Float_t epsil, Float_t stmin, Float_t *ubuf=nullptr, Int_t nbuf=0)
Definition Detector.cxx:72
int getMediumID(int imed) const
Definition Detector.h:135
static void initFieldTrackingParams(int &mode, float &maxfield)
Definition Detector.cxx:143
void Material(Int_t imat, const char *name, Float_t a, Float_t z, Float_t dens, Float_t radl, Float_t absl, Float_t *buf=nullptr, Int_t nwbuf=0)
Definition Detector.cxx:59
std::string addNameTo(const char *ext) const
Definition Detector.h:150
static int getSensID(o2::detectors::DetID detid, int sensid)
static MaterialManager & Instance()
Int_t GetCurrentTrackNumber() const override
Definition Stack.h:133
static constexpr ID TOF
Definition DetID.h:66
~Detector() override
Definition Detector.cxx:60
virtual void MaterialMixer(Float_t *p, const Float_t *const a, const Float_t *const m, Int_t n) const final
Definition Detector.cxx:297
void ConstructGeometry() final
Definition Detector.cxx:312
void Register() override
Definition Detector.cxx:121
void InitializeO2Detector() final
Definition Detector.cxx:65
void addAlignableVolumes() const override
declare alignable volumes of detector
Bool_t ProcessHits(FairVolume *v=nullptr) final
Definition Detector.cxx:75
void EndOfEvent() final
Definition Detector.cxx:328
Detector()=default
virtual void DefineGeometry(Float_t xtof, Float_t ytof, Float_t zlenA) final
Definition Detector.cxx:329
void Reset() final
Definition Detector.cxx:126
static constexpr Float_t RMAX
Definition Geo.h:136
static constexpr Float_t ZPAD
Definition Geo.h:143
static constexpr Float_t HFILIY
Definition Geo.h:330
static constexpr Float_t MODULECOVERTHICKNESS
Definition Geo.h:296
static constexpr Float_t ROOF2PARAMETERS[3]
Definition Geo.h:318
static constexpr Float_t XPAD
Definition Geo.h:141
static constexpr Float_t LENGTHEXINMODBORDER
Definition Geo.h:291
static constexpr Int_t NSECTORS
Definition Geo.h:122
static constexpr Float_t HCPCBY
Definition Geo.h:332
static constexpr Float_t BARS[3]
Definition Geo.h:323
static constexpr Float_t HGLASSY
Definition Geo.h:331
static Float_t getAngles(Int_t iplate, Int_t istrip)
Definition Geo.h:81
static constexpr Int_t NPADZ
Definition Geo.h:111
static constexpr Float_t HHONY
Definition Geo.h:327
static constexpr Float_t WGLFZ
Definition Geo.h:338
static constexpr Float_t HPCBY
Definition Geo.h:328
static constexpr Float_t CBLH2
Definition Geo.h:309
static constexpr Float_t WRGLZ
Definition Geo.h:337
static constexpr Float_t HRGLY
Definition Geo.h:329
static constexpr Int_t NSTRIPXSECTOR
Definition Geo.h:118
static constexpr Float_t ROOF1PARAMETERS[3]
Definition Geo.h:317
static constexpr Float_t HSENSMY
Definition Geo.h:339
static constexpr Float_t INTERCENTRMODBORDER1
Definition Geo.h:255
static constexpr Float_t BAR2[3]
Definition Geo.h:322
static Float_t getHeights(Int_t iplate, Int_t istrip)
Definition Geo.h:82
static constexpr Int_t NSTRIPB
Definition Geo.h:115
static constexpr Int_t NSTRIPC
Definition Geo.h:116
static constexpr Float_t AL1PARAMETERS[3]
Definition Geo.h:314
static constexpr Float_t FEAPARAMETERS[3]
Definition Geo.h:319
static constexpr Int_t NSTRIPA
Definition Geo.h:114
static constexpr Float_t CBLH1
Definition Geo.h:307
static constexpr Float_t ZLENA
Definition Geo.h:130
static constexpr Float_t BAR1[3]
Definition Geo.h:321
static constexpr Float_t BETWEENLANDMASK
Definition Geo.h:311
static constexpr Float_t AL2PARAMETERS[3]
Definition Geo.h:315
static constexpr Float_t WPCBZ1
Definition Geo.h:334
static constexpr Float_t LENGTHINCEMODBORDERD
Definition Geo.h:287
static constexpr Float_t INTERCENTRMODBORDER2
Definition Geo.h:262
static constexpr Float_t MODULEWALLTHICKNESS
Definition Geo.h:254
static constexpr Float_t FEAWIDTH1
Definition Geo.h:298
static constexpr Float_t RMIN
Definition Geo.h:135
static constexpr Float_t BARS2[3]
Definition Geo.h:325
static constexpr Float_t SAWTHICKNESS
Definition Geo.h:304
static Int_t getIndex(const Int_t *detId)
Definition Geo.cxx:563
static constexpr Int_t NPLATES
Definition Geo.h:124
static constexpr Float_t WPCBZ2
Definition Geo.h:335
static Float_t getDistances(Int_t iplate, Int_t istrip)
Definition Geo.h:83
static constexpr Float_t BARS1[3]
Definition Geo.h:324
static void getPadDxDyDz(const Float_t *pos, Int_t *det, Float_t *DeltaPos, int sector=-1)
Definition Geo.cxx:835
static constexpr Float_t WHONZ
Definition Geo.h:333
static constexpr Float_t EXTERINTERMODBORDER1
Definition Geo.h:269
static constexpr Int_t NPADX
Definition Geo.h:109
static constexpr Float_t FEAWIDTH2
Definition Geo.h:301
static constexpr Float_t STRIPLENGTH
Definition Geo.h:144
static constexpr Float_t BAR[3]
Definition Geo.h:320
static constexpr Float_t LENGTHINCEMODBORDERU
Definition Geo.h:283
static constexpr Float_t EXTERINTERMODBORDER2
Definition Geo.h:276
static constexpr Float_t WCPCBZ
Definition Geo.h:336
static constexpr Float_t PHISEC
Definition Geo.h:149
static constexpr Float_t CBLW
Definition Geo.h:306
static constexpr Float_t AL3PARAMETERS[3]
Definition Geo.h:316
static constexpr Bool_t FEAWITHMASKS[NSECTORS]
Definition Geo.h:248
static ShmManager & Instance()
Definition ShmManager.h:61
GLdouble n
Definition glcorearb.h:1982
GLfloat GLfloat GLfloat alpha
Definition glcorearb.h:279
const GLfloat * m
Definition glcorearb.h:4066
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLsizei GLsizei GLchar * source
Definition glcorearb.h:798
GLboolean * data
Definition glcorearb.h:298
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
Node par(int index)
Parameters.
float float float float z1
Definition MathUtils.h:82
void freeSimVector(std::vector< T > *ptr)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Common utility functions.
void empty(int)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< int > row