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 <algorithm>
13#include <iomanip>
14#include <map>
15
16#include "TGeoManager.h"
17#include "TGeoVolume.h"
18#include "TVirtualMC.h"
19#include "TGeoPhysicalNode.h"
20
21#include "FairGeoNode.h"
22#include "FairRootManager.h"
23#include "FairVolume.h"
24
25#include "PHOSBase/Geometry.h"
26#include "PHOSBase/Hit.h"
30
32#include "DetectorsBase/Stack.h"
33
34#include <boost/algorithm/string/predicate.hpp>
35#include <boost/range/irange.hpp>
36
37using namespace o2::phos;
38
40
42 : o2::base::DetImpl<Detector>("PHS", active),
43 mHits(o2::utils::createSimVector<o2::phos::Hit>()),
44 mCurrentTrackID(-1),
45 mCurrentCellID(-1),
46 mCurentSuperParent(-1),
47 mCurrentHit(nullptr)
48{
49}
50
52 : o2::base::DetImpl<Detector>(rhs),
53 mHits(o2::utils::createSimVector<o2::phos::Hit>()),
54 mCurrentTrackID(-1),
55 mCurrentCellID(-1),
56 mCurentSuperParent(-1),
57 mCurrentHit(nullptr)
58{
59}
60
65
67{
68 Reset();
69
70 // Define sensitive volumes
71 defineSensitiveVolumes();
72}
73
75{
76 Reset();
77}
79{
80 // Sort Hits
81 // Add duplicates if any and remove them
82 if (!mHits || mHits->size() == 0) {
83 return;
84 }
85
86 auto first = mHits->begin();
87 auto last = mHits->end();
88
89 std::sort(first, last);
90
91 first = mHits->begin();
92 last = mHits->end();
93
94 // this is copy of std::unique() method with addition: adding identical Hits
95 auto itr = first;
96 while (++first != last) {
97 if (*itr == *first) {
98 *itr += *first;
99 } else {
100 *(++itr) = *first;
101 }
102 }
103 ++itr;
104
105 mHits->erase(itr, mHits->end());
106
107 // Apply Poisson smearing of light production
108 first = mHits->begin();
109 last = mHits->end();
110 while (first != last) {
111 float light = gRandom->Poisson(first->GetEnergyLoss() * o2::phos::PHOSSimParams::Instance().mLightYieldPerGeV);
113 first++;
114 }
115}
117{
118 mSuperParents.clear();
119 if (!o2::utils::ShmManager::Instance().isOperational()) {
120 mHits->clear();
121 }
122 mCurrentTrackID = -1;
123 mCurrentCellID = -1;
124 mCurentSuperParent = -1;
125 mCurrentHit = nullptr;
126}
127
128void Detector::Register() { FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, kTRUE); }
129
130Bool_t Detector::ProcessHits(FairVolume* v)
131{
132
133 // 1. Remember all particles first entered PHOS (active medium)
134 // 2. Collect all energy depositions in Cell by all secondaries from particle first entered PHOS
135
136 // Check if this is first entered PHOS particle ("SuperParent")
137 o2::data::Stack* stack = static_cast<o2::data::Stack*>(fMC->GetStack());
138 const Int_t partID = stack->GetCurrentTrackNumber();
139 Int_t superParent = -1;
140 Bool_t isNewPartile = false; // Create Hit even if zero energy deposition
141 if (partID != mCurrentTrackID) { // not same track as before, check: same SuperParent or new one?
142 auto itTr = mSuperParents.find(partID);
143 if (itTr == mSuperParents.end()) {
144 // Search parent
145 Int_t parentID = stack->GetCurrentTrack()->GetMother(0);
146 itTr = mSuperParents.find(parentID);
147 if (itTr == mSuperParents.end()) { // Neither track or its parent found: new SuperParent
148 mSuperParents[partID] = partID;
149 superParent = partID;
150 isNewPartile = true;
151 } else { // parent found, this track - not
152 superParent = itTr->second;
153 mSuperParents[partID] = superParent;
154 mCurrentTrackID = partID;
155 }
156 } else {
157 superParent = itTr->second;
158 mCurrentTrackID = partID;
159 }
160 } else {
161 superParent = mCurentSuperParent;
162 }
163
164 if (isNewPartile) { // mark track to be kept by stack
165 stack->addHit(GetDetId());
166 }
167
168 Double_t lostenergy = fMC->Edep();
169 if (lostenergy < DBL_EPSILON && !isNewPartile) {
170 return false; // do not create hits with zero energy deposition
171 }
172
173 Int_t moduleNumber;
174 fMC->CurrentVolOffID(
175 11, moduleNumber); // 11: number of geom. levels between PXTL and PHOS module: get the PHOS module number ;
176 Int_t strip;
177 fMC->CurrentVolOffID(3, strip); // 3: number of geom levels between PXTL and strip: get strip number in PHOS module
178 Int_t cell;
179 fMC->CurrentVolOffID(2, cell); // 2: number of geom levels between PXTL and cell: get sell in strip number.
180 Int_t detID = Geometry::relToAbsId(moduleNumber, strip, cell);
181 if (superParent == mCurentSuperParent && detID == mCurrentCellID && mCurrentHit) {
182 // continue with current hit
183 mCurrentHit->addEnergyLoss(lostenergy);
184 return true;
185 }
186
187 // try to find existing Hit
188 if (!isNewPartile) {
189 for (Int_t itr = mHits->size() - 1; itr >= 0; itr--) {
190 Hit* h = &(mHits->at(itr));
191 if (h->GetTrackID() != superParent) { // switched to another SuperParent, do not search further
192 break;
193 }
194 if (h->GetDetectorID() == detID) { // found correct hit
195 h->addEnergyLoss(lostenergy);
196 mCurentSuperParent = superParent;
197 mCurrentTrackID = partID;
198 mCurrentCellID = detID;
199 mCurrentHit = h;
200 return true;
201 }
202 }
203 }
204 // Create new Hit
205 Float_t posX = 0., posY = 0., posZ = 0., momX = 0, momY = 0., momZ = 0., energy = 0.;
206 fMC->TrackPosition(posX, posY, posZ);
207 fMC->TrackMomentum(momX, momY, momZ, energy);
208 Double_t estart = fMC->Etot();
209 Double_t time = fMC->TrackTime(); // time in s
210
211 mCurrentHit = addHit(superParent, detID, math_utils::Point3D<float>(posX, posY, posZ), math_utils::Vector3D<float>(momX, momY, momZ), estart,
212 time, lostenergy);
213 mCurentSuperParent = superParent;
214 mCurrentTrackID = partID;
215 mCurrentCellID = detID;
216
217 return true;
218}
219
220Hit* Detector::addHit(Int_t trackID, Int_t detID, const math_utils::Point3D<float>& pos, const math_utils::Vector3D<float>& mom, Double_t totE,
221 Double_t time, Double_t eLoss)
222{
223 LOG(debug4) << "Adding hit for track " << trackID << " with position (" << pos.X() << ", " << pos.Y() << ", "
224 << pos.Z() << ") and momentum (" << mom.X() << ", " << mom.Y() << ", " << mom.Z() << ") with energy "
225 << totE << " loosing " << eLoss << std::endl;
226 mHits->emplace_back(trackID, detID, pos, mom, totE, time, eLoss);
227 return &(mHits->back());
228}
229
231{
232 // Create geometry description of PHOS depector for Geant simulations.
233
234 using boost::algorithm::contains;
235 LOG(debug) << "Creating PHOS geometry\n";
236
238 Geometry::GetInstance("Run2");
239
240 if (!geom) {
241 LOG(error) << "ConstructGeometry: PHOS Geometry class has not been set up.\n";
242 }
243
244 if (!fMC) {
245 fMC = TVirtualMC::GetMC();
246 }
247
248 // Configure geometry So far we have only one: Run2
249 {
250 mCreateHalfMod = kTRUE;
251 mActiveModule[0] = kFALSE;
252 mActiveModule[1] = kTRUE;
253 mActiveModule[2] = kTRUE;
254 mActiveModule[3] = kTRUE;
255 mActiveModule[4] = kTRUE;
256 mActiveModule[5] = kFALSE;
257 }
258
259 // First create necessary materials
261
262 // Create a PHOS modules-containers which will be filled with the stuff later.
263 // Depending on configuration we should prepare containers for normal PHOS module "PHOS"
264 // and half-module "PHOH"
265 // This is still air tight box around PHOS
266
267 fMC->Gsvolu("PHOS", "TRD1", getMediumID(ID_FE), geom->getPHOSParams(), 4);
268 if (mCreateHalfMod) {
269 fMC->Gsvolu("PHOH", "TRD1", getMediumID(ID_FE), geom->getPHOSParams(), 4);
270 }
271
272 // Fill prepared containers PHOS,PHOH,PHOC
274
276
277 // --- Position PHOS modules in ALICE setup ---
278 Int_t idrotm[5];
279 for (Int_t iModule = 1; iModule < 5; iModule++) {
280 if (!mActiveModule[iModule]) {
281 continue;
282 }
283 Float_t angle[3][2] = {0};
284 geom->getModuleAngle(iModule, angle);
285 Matrix(idrotm[iModule], angle[0][0], angle[0][1], angle[1][0], angle[1][1], angle[2][0], angle[2][1]);
286 Float_t pos[3] = {0};
287 geom->getModuleCenter(iModule, pos);
288
289 if (iModule == 1) { // special 1/2 module
290 fMC->Gspos("PHOH", iModule, "barrel", pos[0], pos[1] + 30., pos[2], idrotm[iModule], "ONLY");
291 } else {
292 fMC->Gspos("PHOS", iModule, "barrel", pos[0], pos[1] + 30., pos[2], idrotm[iModule], "ONLY");
293 }
294 }
295
296 gGeoManager->CheckGeometry();
297}
298//-----------------------------------------
300{
301 // Definitions of materials to build PHOS and associated tracking media.
302
303 // --- The PbWO4 crystals ---
304 Float_t aX[3] = {207.19, 183.85, 16.0};
305 Float_t zX[3] = {82.0, 74.0, 8.0};
306 Float_t wX[3] = {1.0, 1.0, 4.0};
307 Float_t dX = 8.28;
308
309 Mixture(ID_PWO, "PbWO4", aX, zX, dX, -3, wX);
310
311 // --- Aluminium ---
312 Material(ID_AL, "Al", 26.98, 13., 2.7, 8.9, 999., nullptr, 0);
313 // --- Absorption length is ignored ^
314
315 // --- Tyvek (CnH2n) ---
316 Float_t aT[2] = {12.011, 1.00794};
317 Float_t zT[2] = {6.0, 1.0};
318 Float_t wT[2] = {1.0, 2.0};
319 Float_t dT = 0.331;
320
321 Mixture(ID_TYVEK, "Tyvek", aT, zT, dT, -2, wT);
322
323 // --- Polystyrene foam ---
324 Float_t aF[2] = {12.011, 1.00794};
325 Float_t zF[2] = {6.0, 1.0};
326 Float_t wF[2] = {1.0, 1.0};
327 Float_t dF = 0.12;
328
329 Mixture(ID_POLYFOAM, "Foam", aF, zF, dF, -2, wF);
330
331 // --- Silicon ---
332 Material(ID_APD, "Si", 28.0855, 14., 2.33, 9.36, 42.3, nullptr, 0);
333
334 // --- Foam thermo insulation ---
335 Float_t aTI[2] = {12.011, 1.00794};
336 Float_t zTI[2] = {6.0, 1.0};
337 Float_t wTI[2] = {1.0, 1.0};
338 Float_t dTI = 0.04;
339
340 Mixture(ID_THERMOINS, "Thermo Insul.", aTI, zTI, dTI, -2, wTI);
341
342 // --- Textolith ---
343 Float_t aTX[4] = {16.0, 28.09, 12.011, 1.00794};
344 Float_t zTX[4] = {8.0, 14.0, 6.0, 1.0};
345 Float_t wTX[4] = {292.0, 68.0, 462.0, 736.0};
346 Float_t dTX = 1.75;
347
348 Mixture(ID_TEXTOLIT, "Textolit", aTX, zTX, dTX, -4, wTX);
349
350 // --- G10 : Printed Circuit Materiall ---
351 Float_t aG10[4] = {12., 1., 16., 28.};
352 Float_t zG10[4] = {6., 1., 8., 14.};
353 Float_t wG10[4] = {.259, .288, .248, .205};
354 Float_t dG10 = 1.7;
355
356 Mixture(ID_PRINTCIRC, "G10", aG10, zG10, dG10, -4, wG10);
357
358 // --- Stainless steel (let it be pure iron) ---
359 Material(ID_FE, "Steel", 55.845, 26, 7.87, 1.76, 0., nullptr, 0);
360
361 // --- Fiberglass ---
362 Float_t aFG[4] = {16.0, 28.09, 12.011, 1.00794};
363 Float_t zFG[4] = {8.0, 14.0, 6.0, 1.0};
364 Float_t wFG[4] = {292.0, 68.0, 462.0, 736.0};
365 Float_t dFG = 1.9;
366
367 Mixture(ID_FIBERGLASS, "Fiberglas", aFG, zFG, dFG, -4, wFG);
368
369 // --- Cables in Air box ---
370 // SERVICES
371
372 Float_t aCA[4] = {1., 12., 55.8, 63.5};
373 Float_t zCA[4] = {1., 6., 26., 29.};
374 Float_t wCA[4] = {.014, .086, .42, .48};
375 Float_t dCA = 0.8; // this density is raw estimation, if you know better - correct
376
377 Mixture(ID_CABLES, "Cables", aCA, zCA, dCA, -4, wCA);
378
379 // --- Air ---
380 Float_t aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
381 Float_t zAir[4] = {6., 7., 8., 18.};
382 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
383 Float_t dAir = 1.20479E-3;
384
385 Mixture(ID_AIR, "Air", aAir, zAir, dAir, 4, wAir);
386
387 // DEFINITION OF THE TRACKING MEDIA
388
389 // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100]
390 // Int_t isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ() ;
391 // Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max() ;
392 Int_t isxfld = 2;
393 Float_t sxmgmx = 10.0;
395
396 // The scintillator of the calorimeter made of PBW04 -> idtmed[699]
397 if (fActive) {
398 Medium(ID_PWO, "Crystal", ID_PWO, 1, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, nullptr, 0);
399 } else {
400 Medium(ID_PWO, "Crystal", ID_PWO, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, nullptr, 0);
401 }
402
403 // Various Aluminium parts made of Al -> idtmed[701]
404 Medium(ID_AL, "Alparts", ID_AL, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, nullptr, 0);
405
406 // The Tywek which wraps the calorimeter crystals -> idtmed[702]
407 Medium(ID_TYVEK, "Tyvek", ID_TYVEK, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, nullptr, 0);
408
409 // The Polystyrene foam around the calorimeter module -> idtmed[703]
410 Medium(ID_POLYFOAM, "Polyst.foam", ID_POLYFOAM, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, nullptr, 0);
411
412 // The Silicon of the APD diode to read out the calorimeter crystal -> idtmed[705]
413 Medium(ID_APD, "SiAPD", ID_APD, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.01, 0.01, nullptr, 0);
414
415 // The thermo insulating material of the box which contains the calorimeter module -> getMediumID(ID_THERMOINS)
416 Medium(ID_THERMOINS, "ThermoInsul.", ID_THERMOINS, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, nullptr, 0);
417
418 // The Textolit which makes up the box which contains the calorimeter module -> idtmed[707]
419 Medium(ID_TEXTOLIT, "Textolit", ID_TEXTOLIT, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, nullptr, 0);
420
421 // G10: Printed Circuit material -> idtmed[711]
422 Medium(ID_PRINTCIRC, "G10", ID_PRINTCIRC, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, nullptr, 0);
423
424 // Stainless steel -> idtmed[716]
425 Medium(ID_FE, "Steel", ID_FE, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, nullptr, 0);
426
427 // Fibergalss -> getMediumID(ID_FIBERGLASS)
428 Medium(ID_FIBERGLASS, "Fiberglass", ID_FIBERGLASS, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, nullptr, 0);
429
430 // Cables in air -> idtmed[718]
431 Medium(ID_CABLES, "Cables", ID_CABLES, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, nullptr, 0);
432
433 // Air -> idtmed[798]
434 Medium(ID_AIR, "Air", ID_AIR, 0, isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, nullptr, 0);
435}
436//-----------------------------------------
438{
439 // Create the PHOS-EMC geometry for GEANT
440 // Author: Dmitri Peressounko August 2001
441 // Adopted for O2 project 2017
442 // The used coordinate system:
443 // 1. in Module: X along longer side, Y out of beam, Z along shorter side (along beam)
444 // 2. In Strip the same: X along longer side, Y out of beam, Z along shorter side (along beam)
445
447
448 Float_t par[4] = {0};
449 Int_t ipar;
450
451 // ======= Define the strip ===============
452 for (ipar = 0; ipar < 3; ipar++) {
453 par[ipar] = *(geom->getStripHalfSize() + ipar);
454 }
455 // --- define steel volume (cell of the strip unit)
456 fMC->Gsvolu("PSTR", "BOX ", getMediumID(ID_FE), par, 3); // Made of steel
457
458 // --- define air cell in the steel strip
459 for (ipar = 0; ipar < 3; ipar++) {
460 par[ipar] = *(geom->getAirCellHalfSize() + ipar);
461 }
462 fMC->Gsvolu("PCEL", "BOX ", getMediumID(ID_AIR), par, 3);
463
464 // --- define wrapped crystal and put it into steel cell
465 for (ipar = 0; ipar < 3; ipar++) {
466 par[ipar] = *(geom->getWrappedHalfSize() + ipar);
467 }
468 fMC->Gsvolu("PWRA", "BOX ", getMediumID(ID_TYVEK), par, 3);
469 const Float_t* pin = geom->getAPDHalfSize();
470 const Float_t* preamp = geom->getPreampHalfSize();
471 Float_t y = (geom->getAirGapLed() - 2 * pin[1] - 2 * preamp[1]) / 2;
472 fMC->Gspos("PWRA", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY");
473
474 // --- Define crystal and put it into wrapped crystall ---
475 for (ipar = 0; ipar < 3; ipar++) {
476 par[ipar] = *(geom->getCrystalHalfSize() + ipar);
477 }
478
479 fMC->Gsvolu("PXTL", "BOX ", getMediumID(ID_PWO), par, 3);
480 // fMC->Gsvolu("PXTL", "BOX ", 1, par, 3) ;
481 fMC->Gspos("PXTL", 1, "PWRA", 0.0, 0.0, 0.0, 0, "ONLY");
482
483 // --- define APD/PIN preamp and put it into AirCell
484 for (ipar = 0; ipar < 3; ipar++) {
485 par[ipar] = *(geom->getAPDHalfSize() + ipar);
486 }
487 fMC->Gsvolu("PPIN", "BOX ", getMediumID(ID_APD), par, 3);
488 const Float_t* crystal = geom->getCrystalHalfSize();
489 y = crystal[1] + geom->getAirGapLed() / 2 - preamp[1];
490 fMC->Gspos("PPIN", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY");
491 for (ipar = 0; ipar < 3; ipar++) {
492 par[ipar] = *(geom->getPreampHalfSize() + ipar);
493 }
494 fMC->Gsvolu("PREA", "BOX ", getMediumID(ID_PRINTCIRC), par, 3); // Here I assumed preamp as a printed Circuit
495 y = crystal[1] + geom->getAirGapLed() / 2 + pin[1]; // May it should be changed
496 fMC->Gspos("PREA", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY"); // to ceramics?
497
498 // --- Fill strip with wrapped cristals in cells
499
500 const Float_t* splate = geom->getSupportPlateHalfSize();
501 y = -splate[1];
502 const Float_t* acel = geom->getAirCellHalfSize();
503
504 for (Int_t lev = 2, icel = 1; icel <= geom->getNCellsXInStrip() * geom->getNCellsZInStrip(); icel += 2, lev += 2) {
505 Float_t x = (2 * (lev / 2) - 1 - geom->getNCellsXInStrip()) * acel[0];
506 Float_t z = acel[2];
507
508 fMC->Gspos("PCEL", icel, "PSTR", x, y, +z, 0, "ONLY");
509 fMC->Gspos("PCEL", icel + 1, "PSTR", x, y, -z, 0, "ONLY");
510 }
511
512 // --- define the support plate, hole in it and position it in strip ----
513 for (ipar = 0; ipar < 3; ipar++) {
514 par[ipar] = *(geom->getSupportPlateHalfSize() + ipar);
515 }
516 fMC->Gsvolu("PSUP", "BOX ", getMediumID(ID_AL), par, 3);
517
518 for (ipar = 0; ipar < 3; ipar++) {
519 par[ipar] = *(geom->getSupportPlateInHalfSize() + ipar);
520 }
521 fMC->Gsvolu("PSHO", "BOX ", getMediumID(ID_AIR), par, 3);
522 Float_t z = geom->getSupportPlateThickness() / 2;
523 fMC->Gspos("PSHO", 1, "PSUP", 0.0, 0.0, z, 0, "ONLY");
524
525 y = acel[1];
526 fMC->Gspos("PSUP", 1, "PSTR", 0.0, y, 0.0, 0, "ONLY");
527
528 // ========== Fill module with strips and put them into inner thermoinsulation=============
529 for (ipar = 0; ipar < 3; ipar++) {
530 par[ipar] = *(geom->getInnerThermoHalfSize() + ipar);
531 }
532 fMC->Gsvolu("PTII", "BOX ", getMediumID(ID_THERMOINS), par, 3);
533
534 if (mCreateHalfMod) {
535 fMC->Gsvolu("PTIH", "BOX ", getMediumID(ID_THERMOINS), par, 3);
536 }
537
538 const Float_t* inthermo = geom->getInnerThermoHalfSize();
539 const Float_t* strip = geom->getStripHalfSize();
540 y = inthermo[1] - strip[1];
541 Int_t irow;
542 Int_t nr = 1;
543 Int_t icol;
544
545 for (irow = 0; irow < geom->getNStripX(); irow++) {
546 Float_t x = (2 * irow + 1 - geom->getNStripX()) * strip[0];
547 for (icol = 0; icol < geom->getNStripZ(); icol++) {
548 z = (2 * icol + 1 - geom->getNStripZ()) * strip[2];
549 fMC->Gspos("PSTR", nr, "PTII", x, y, z, 0, "ONLY");
550 nr++;
551 }
552 }
553 if (mCreateHalfMod) {
554 nr = 1;
555 for (irow = 0; irow < geom->getNStripX(); irow++) {
556 Float_t x = (2 * irow + 1 - geom->getNStripX()) * strip[0];
557 for (icol = 0; icol < geom->getNStripZ(); icol++) {
558 z = (2 * icol + 1 - geom->getNStripZ()) * strip[2];
559 if (irow >= geom->getNStripX() / 2) {
560 fMC->Gspos("PSTR", nr, "PTIH", x, y, z, 0, "ONLY");
561 }
562 nr++;
563 }
564 }
565 }
566
567 // ------- define the air gap between thermoinsulation and cooler
568 for (ipar = 0; ipar < 3; ipar++) {
569 par[ipar] = *(geom->getAirGapHalfSize() + ipar);
570 }
571 fMC->Gsvolu("PAGA", "BOX ", getMediumID(ID_AIR), par, 3);
572 if (mCreateHalfMod) {
573 fMC->Gsvolu("PAGH", "BOX ", getMediumID(ID_AIR), par, 3);
574 }
575 const Float_t* agap = geom->getAirGapHalfSize();
576 y = agap[1] - inthermo[1];
577
578 fMC->Gspos("PTII", 1, "PAGA", 0.0, y, 0.0, 0, "ONLY");
579 if (mCreateHalfMod) {
580 fMC->Gspos("PTIH", 1, "PAGH", 0.0, y, 0.0, 0, "ONLY");
581 }
582
583 // ------- define the Al passive cooler
584 for (ipar = 0; ipar < 3; ipar++) {
585 par[ipar] = *(geom->getCoolerHalfSize() + ipar);
586 }
587 fMC->Gsvolu("PCOR", "BOX ", getMediumID(ID_AL), par, 3);
588 if (mCreateHalfMod) {
589 fMC->Gsvolu("PCOH", "BOX ", getMediumID(ID_AL), par, 3);
590 }
591
592 const Float_t* cooler = geom->getCoolerHalfSize();
593 y = cooler[1] - agap[1];
594
595 fMC->Gspos("PAGA", 1, "PCOR", 0.0, y, 0.0, 0, "ONLY");
596 if (mCreateHalfMod) {
597 fMC->Gspos("PAGH", 1, "PCOH", 0.0, y, 0.0, 0, "ONLY");
598 }
599
600 // ------- define the outer thermoinsulating cover
601 for (ipar = 0; ipar < 4; ipar++) {
602 par[ipar] = *(geom->getOuterThermoParams() + ipar);
603 }
604 fMC->Gsvolu("PTIO", "TRD1", getMediumID(ID_THERMOINS), par, 4);
605 if (mCreateHalfMod) {
606 fMC->Gsvolu("PIOH", "TRD1", getMediumID(ID_THERMOINS), par, 4);
607 }
608 const Float_t* outparams = geom->getOuterThermoParams();
609
610 Int_t idrotm = -1;
611 Matrix(idrotm, 90.0, 0.0, 0.0, 0.0, 90.0, 270.0);
612 // Frame in outer thermoinsulation and so on: z out of beam, y along beam, x across beam
613
614 z = outparams[3] - cooler[1];
615 fMC->Gspos("PCOR", 1, "PTIO", 0., 0.0, z, idrotm, "ONLY");
616 if (mCreateHalfMod) {
617 fMC->Gspos("PCOH", 1, "PIOH", 0., 0.0, z, idrotm, "ONLY");
618 }
619
620 // -------- Define the outer Aluminium cover -----
621 for (ipar = 0; ipar < 4; ipar++) {
622 par[ipar] = *(geom->getAlCoverParams() + ipar);
623 }
624 fMC->Gsvolu("PCOL", "TRD1", getMediumID(ID_AL), par, 4);
625 if (mCreateHalfMod) {
626 fMC->Gsvolu("PCLH", "TRD1", getMediumID(ID_AL), par, 4);
627 }
628
629 const Float_t* covparams = geom->getAlCoverParams();
630 z = covparams[3] - outparams[3];
631 fMC->Gspos("PTIO", 1, "PCOL", 0., 0.0, z, 0, "ONLY");
632 if (mCreateHalfMod) {
633 fMC->Gspos("PIOH", 1, "PCLH", 0., 0.0, z, 0, "ONLY");
634 }
635
636 // --------- Define front fiberglass cover -----------
637 for (ipar = 0; ipar < 3; ipar++) {
638 par[ipar] = *(geom->getFiberGlassHalfSize() + ipar);
639 }
640 fMC->Gsvolu("PFGC", "BOX ", getMediumID(ID_FIBERGLASS), par, 3);
641 z = -outparams[3];
642 fMC->Gspos("PFGC", 1, "PCOL", 0., 0.0, z, 0, "ONLY");
643 if (mCreateHalfMod) {
644 fMC->Gspos("PFGC", 1, "PCLH", 0., 0.0, z, 0, "ONLY");
645 }
646
647 //=============This is all with cold section==============
648
649 //------ Warm Section --------------
650 for (ipar = 0; ipar < 3; ipar++) {
651 par[ipar] = *(geom->getWarmAlCoverHalfSize() + ipar);
652 }
653 fMC->Gsvolu("PWAR", "BOX ", getMediumID(ID_AL), par, 3);
654 const Float_t* warmcov = geom->getWarmAlCoverHalfSize();
655
656 // --- Define the outer thermoinsulation ---
657 for (ipar = 0; ipar < 3; ipar++) {
658 par[ipar] = *(geom->getWarmThermoHalfSize() + ipar);
659 }
660 fMC->Gsvolu("PWTI", "BOX ", getMediumID(ID_THERMOINS), par, 3);
661 const Float_t* warmthermo = geom->getWarmThermoHalfSize();
662 z = -warmcov[2] + warmthermo[2];
663
664 fMC->Gspos("PWTI", 1, "PWAR", 0., 0.0, z, 0, "ONLY");
665
666 // --- Define cables area and put in it T-supports ----
667 for (ipar = 0; ipar < 3; ipar++) {
668 par[ipar] = *(geom->getTCables1HalfSize() + ipar);
669 }
670 fMC->Gsvolu("PCA1", "BOX ", getMediumID(ID_CABLES), par, 3);
671 const Float_t* cbox = geom->getTCables1HalfSize();
672
673 for (ipar = 0; ipar < 3; ipar++) {
674 par[ipar] = *(geom->getTSupport1HalfSize() + ipar);
675 }
676 fMC->Gsvolu("PBE1", "BOX ", getMediumID(ID_AL), par, 3);
677 const Float_t* beams = geom->getTSupport1HalfSize();
678 Int_t isup;
679 for (isup = 0; isup < geom->getNTSuppots(); isup++) {
680 Float_t x = -cbox[0] + beams[0] + (2 * beams[0] + geom->getTSupportDist()) * isup;
681 fMC->Gspos("PBE1", isup, "PCA1", x, 0.0, 0.0, 0, "ONLY");
682 }
683
684 z = -warmthermo[2] + cbox[2];
685 fMC->Gspos("PCA1", 1, "PWTI", 0.0, 0.0, z, 0, "ONLY");
686
687 for (ipar = 0; ipar < 3; ipar++) {
688 par[ipar] = *(geom->getTCables2HalfSize() + ipar);
689 }
690 fMC->Gsvolu("PCA2", "BOX ", getMediumID(ID_CABLES), par, 3);
691 const Float_t* cbox2 = geom->getTCables2HalfSize();
692
693 for (ipar = 0; ipar < 3; ipar++) {
694 par[ipar] = *(geom->getTSupport2HalfSize() + ipar);
695 }
696 fMC->Gsvolu("PBE2", "BOX ", getMediumID(ID_AL), par, 3);
697 for (isup = 0; isup < geom->getNTSuppots(); isup++) {
698 Float_t x = -cbox[0] + beams[0] + (2 * beams[0] + geom->getTSupportDist()) * isup;
699 fMC->Gspos("PBE2", isup, "PCA2", x, 0.0, 0.0, 0, "ONLY");
700 }
701
702 z = -warmthermo[2] + 2 * cbox[2] + cbox2[2];
703 fMC->Gspos("PCA2", 1, "PWTI", 0.0, 0.0, z, 0, "ONLY");
704
705 // --- Define frame ---
706 for (ipar = 0; ipar < 3; ipar++) {
707 par[ipar] = *(geom->getFrameXHalfSize() + ipar);
708 }
709 fMC->Gsvolu("PFRX", "BOX ", getMediumID(ID_FE), par, 3);
710 const Float_t* posit1 = geom->getFrameXPosition();
711 fMC->Gspos("PFRX", 1, "PWTI", posit1[0], posit1[1], posit1[2], 0, "ONLY");
712 fMC->Gspos("PFRX", 2, "PWTI", posit1[0], -posit1[1], posit1[2], 0, "ONLY");
713
714 for (ipar = 0; ipar < 3; ipar++) {
715 par[ipar] = *(geom->getFrameZHalfSize() + ipar);
716 }
717 fMC->Gsvolu("PFRZ", "BOX ", getMediumID(ID_FE), par, 3);
718 const Float_t* posit2 = geom->getFrameZPosition();
719 fMC->Gspos("PFRZ", 1, "PWTI", posit2[0], posit2[1], posit2[2], 0, "ONLY");
720 fMC->Gspos("PFRZ", 2, "PWTI", -posit2[0], posit2[1], posit2[2], 0, "ONLY");
721
722 // --- Define Fiber Glass support ---
723 for (ipar = 0; ipar < 3; ipar++) {
724 par[ipar] = *(geom->getFGupXHalfSize() + ipar);
725 }
726 fMC->Gsvolu("PFG1", "BOX ", getMediumID(ID_FIBERGLASS), par, 3);
727 const Float_t* posit3 = geom->getFGupXPosition();
728 fMC->Gspos("PFG1", 1, "PWTI", posit3[0], posit3[1], posit3[2], 0, "ONLY");
729 fMC->Gspos("PFG1", 2, "PWTI", posit3[0], -posit3[1], posit3[2], 0, "ONLY");
730
731 for (ipar = 0; ipar < 3; ipar++) {
732 par[ipar] = *(geom->getFGupZHalfSize() + ipar);
733 }
734 fMC->Gsvolu("PFG2", "BOX ", getMediumID(ID_FIBERGLASS), par, 3);
735 const Float_t* posit4 = geom->getFGupZPosition();
736 fMC->Gspos("PFG2", 1, "PWTI", posit4[0], posit4[1], posit4[2], 0, "ONLY");
737 fMC->Gspos("PFG2", 2, "PWTI", -posit4[0], posit4[1], posit4[2], 0, "ONLY");
738 for (ipar = 0; ipar < 3; ipar++) {
739 par[ipar] = *(geom->getFGlowXHalfSize() + ipar);
740 }
741 fMC->Gsvolu("PFG3", "BOX ", getMediumID(ID_FIBERGLASS), par, 3);
742 const Float_t* posit5 = geom->getFGlowXPosition();
743 fMC->Gspos("PFG3", 1, "PWTI", posit5[0], posit5[1], posit5[2], 0, "ONLY");
744 fMC->Gspos("PFG3", 2, "PWTI", posit5[0], -posit5[1], posit5[2], 0, "ONLY");
745
746 for (ipar = 0; ipar < 3; ipar++) {
747 par[ipar] = *(geom->getFGlowZHalfSize() + ipar);
748 }
749 fMC->Gsvolu("PFG4", "BOX ", getMediumID(ID_FIBERGLASS), par, 3);
750 const Float_t* posit6 = geom->getFGlowZPosition();
751 fMC->Gspos("PFG4", 1, "PWTI", posit6[0], posit6[1], posit6[2], 0, "ONLY");
752 fMC->Gspos("PFG4", 2, "PWTI", -posit6[0], posit6[1], posit6[2], 0, "ONLY");
753
754 // --- Define Air Gap for FEE electronics -----
755 for (ipar = 0; ipar < 3; ipar++) {
756 par[ipar] = *(geom->getFEEAirHalfSize() + ipar);
757 }
758 fMC->Gsvolu("PAFE", "BOX ", getMediumID(ID_AIR), par, 3);
759 const Float_t* posit7 = geom->getFEEAirPosition();
760 fMC->Gspos("PAFE", 1, "PWTI", posit7[0], posit7[1], posit7[2], 0, "ONLY");
761
762 // Define the EMC module volume and combine Cool and Warm sections
763 for (ipar = 0; ipar < 4; ipar++) {
764 par[ipar] = *(geom->getEMCParams() + ipar);
765 }
766 fMC->Gsvolu("PEMC", "TRD1", getMediumID(ID_AIR), par, 4);
767 if (mCreateHalfMod) {
768 fMC->Gsvolu("PEMH", "TRD1", getMediumID(ID_AIR), par, 4);
769 }
770 z = -warmcov[2];
771 fMC->Gspos("PCOL", 1, "PEMC", 0., 0., z, 0, "ONLY");
772 if (mCreateHalfMod) {
773 fMC->Gspos("PCLH", 1, "PEMH", 0., 0., z, 0, "ONLY");
774 }
775 z = covparams[3];
776 fMC->Gspos("PWAR", 1, "PEMC", 0., 0., z, 0, "ONLY");
777 if (mCreateHalfMod) {
778 fMC->Gspos("PWAR", 1, "PEMH", 0., 0., z, 0, "ONLY");
779 }
780
781 // Put created EMC geometry into PHOS volume
782
783 z = geom->getDistATBtoModule() - geom->getPHOSATBParams()[3] + geom->getEMCParams()[3];
784
785 // PHOS AirTightBox
786 fMC->Gsvolu("PATB", "TRD1", getMediumID(ID_AIR), geom->getPHOSATBParams(), 4);
787 if (mCreateHalfMod) { // half of PHOS module
788 fMC->Gsvolu("PATH", "TRD1", getMediumID(ID_AIR), geom->getPHOSATBParams(), 4);
789 }
790
791 fMC->Gspos("PEMC", 1, "PATB", 0., 0., z, 0, "ONLY");
792 if (mCreateHalfMod) { // half of PHOS module
793 fMC->Gspos("PEMH", 1, "PATH", 0., 0., z, 0, "ONLY");
794 }
795
796 fMC->Gspos("PATB", 1, "PHOS", 0., 0., 0., 0, "ONLY");
797 if (mCreateHalfMod) { // half of PHOS module
798 fMC->Gspos("PATH", 1, "PHOH", 0., 0., 0., 0, "ONLY");
799 }
800}
801
802//-----------------------------------------
804{
805 // Create the PHOS support geometry for GEANT
807
808 Float_t par[5] = {0}, x0 = 0., y0 = 0., z0 = 0.;
809 Int_t i, j, copy;
810
811 // --- Dummy box containing two rails on which PHOS support moves
812 // --- Put these rails to the bottom of the L3 magnet
813
814 par[0] = geom->getRailRoadSize(0) / 2.0;
815 par[1] = geom->getRailRoadSize(1) / 2.0;
816 par[2] = geom->getRailRoadSize(2) / 2.0;
817 fMC->Gsvolu("PRRD", "BOX ", getMediumID(ID_AIR), par, 3);
818
819 y0 = -(geom->getRailsDistanceFromIP() - geom->getRailRoadSize(1) / 2.0);
820 fMC->Gspos("PRRD", 1, "barrel", 0.0, y0 + 30. - 6.15, 0.0, 0, "ONLY");
821
822 // --- Dummy box containing one rail
823
824 par[0] = geom->getRailOuterSize(0) / 2.0;
825 par[1] = geom->getRailOuterSize(1) / 2.0;
826 par[2] = geom->getRailOuterSize(2) / 2.0;
827 fMC->Gsvolu("PRAI", "BOX ", getMediumID(ID_AIR), par, 3);
828
829 for (i = 0; i < 2; i++) {
830 x0 = (2 * i - 1) * geom->getDistanceBetwRails() / 2.0;
831 fMC->Gspos("PRAI", i, "PRRD", x0, 0.0, 0.0, 0, "ONLY");
832 }
833
834 // --- Upper and bottom steel parts of the rail
835
836 par[0] = geom->getRailPart1(0) / 2.0;
837 par[1] = geom->getRailPart1(1) / 2.0;
838 par[2] = geom->getRailPart1(2) / 2.0;
839 fMC->Gsvolu("PRP1", "BOX ", getMediumID(ID_FE), par, 3);
840
841 y0 = -(geom->getRailOuterSize(1) - geom->getRailPart1(1)) / 2.0;
842 fMC->Gspos("PRP1", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY");
843 y0 = (geom->getRailOuterSize(1) - geom->getRailPart1(1)) / 2.0 - geom->getRailPart3(1);
844 fMC->Gspos("PRP1", 2, "PRAI", 0.0, y0, 0.0, 0, "ONLY");
845
846 // --- The middle vertical steel parts of the rail
847
848 par[0] = geom->getRailPart2(0) / 2.0;
849 par[1] = geom->getRailPart2(1) / 2.0;
850 par[2] = geom->getRailPart2(2) / 2.0;
851 fMC->Gsvolu("PRP2", "BOX ", getMediumID(ID_FE), par, 3);
852
853 y0 = -geom->getRailPart3(1) / 2.0;
854 fMC->Gspos("PRP2", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY");
855
856 // --- The most upper steel parts of the rail
857
858 par[0] = geom->getRailPart3(0) / 2.0;
859 par[1] = geom->getRailPart3(1) / 2.0;
860 par[2] = geom->getRailPart3(2) / 2.0;
861 fMC->Gsvolu("PRP3", "BOX ", getMediumID(ID_FE), par, 3);
862
863 y0 = (geom->getRailOuterSize(1) - geom->getRailPart3(1)) / 2.0;
864 fMC->Gspos("PRP3", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY");
865
866 // --- The wall of the cradle
867 // --- The wall is empty: steel thin walls and air inside
868
869 par[1] = TMath::Sqrt(TMath::Power((geom->getIPtoOuterCoverDistance() + geom->getOuterBoxSize(3)), 2) +
870 TMath::Power((geom->getOuterBoxSize(1) / 2), 2)) +
871 10.;
872 par[0] = par[1] - geom->getCradleWall(1);
873 par[2] = geom->getCradleWall(2) / 2.0;
874 par[3] = geom->getCradleWall(3);
875 par[4] = geom->getCradleWall(4);
876 fMC->Gsvolu("PCRA", "TUBS", getMediumID(ID_FE), par, 5);
877
878 par[0] += geom->getCradleWallThickness();
879 par[1] -= geom->getCradleWallThickness();
880 par[2] -= geom->getCradleWallThickness();
881 fMC->Gsvolu("PCRE", "TUBS", getMediumID(ID_FE), par, 5);
882 fMC->Gspos("PCRE", 1, "PCRA", 0.0, 0.0, 0.0, 0, "ONLY");
883
884 for (i = 0; i < 2; i++) {
885 z0 = (2 * i - 1) * (geom->getOuterBoxSize(2) + geom->getCradleWall(2) + 2. * geom->getModuleCraddleGap()) / 2.0;
886 fMC->Gspos("PCRA", i, "barrel", 0.0, 30.0, z0, 0, "ONLY");
887 }
888
889 // --- The "wheels" of the cradle
890
891 par[0] = geom->getCradleWheel(0) / 2;
892 par[1] = geom->getCradleWheel(1) / 2;
893 par[2] = geom->getCradleWheel(2) / 2;
894 fMC->Gsvolu("PWHE", "BOX ", getMediumID(ID_FE), par, 3);
895
896 y0 = -(geom->getRailsDistanceFromIP() - geom->getRailRoadSize(1) - geom->getCradleWheel(1) / 2);
897 for (i = 0; i < 2; i++) {
898 z0 = (2 * i - 1) * ((geom->getOuterBoxSize(2) + geom->getCradleWheel(2) + 2. * geom->getModuleCraddleGap()) / 2.0 + geom->getCradleWall(2));
899 for (j = 0; j < 2; j++) {
900 copy = 2 * i + j;
901 x0 = (2 * j - 1) * geom->getDistanceBetwRails() / 2.0;
902 fMC->Gspos("PWHE", copy, "barrel", x0, y0 + 30., z0, 0, "ONLY");
903 }
904 }
905}
906
907//-----------------------------------------
908void Detector::defineSensitiveVolumes()
909{
910 if (fActive) {
911 TGeoVolume* vsense = gGeoManager->GetVolume("PXTL");
912 if (vsense) {
913 AddSensitiveVolume(vsense);
914 } else {
915 LOG(error) << "PHOS Sensitive volume PXTL not found ... No hit creation!\n";
916 }
917 }
918}
919
920//-----------------------------------------
922{
923
924 // Create entries for alignable volumes associating the symbolic volume
925 // name with the corresponding volume path.
926
928
929 // Alignable modules
930 // Volume path /cave_1/PHOS_<i> => symbolic name /PHOS/Module<i>, <i>=1,2,3,4,5
931
933
934 TString physModulePath = "/cave_1/barrel_1/PHOS_";
935 TString physModulePath2 = "/cave_1/barrel_1/PHOH_";
936
937 TString symbModuleName = "PHOS/Module";
938
939 for (Int_t iModule = 1; iModule <= geom->getNModules(); iModule++) {
940 if (!mActiveModule[iModule]) {
941 continue;
942 }
943
944 TString volPath(iModule == 1 ? physModulePath2 : physModulePath);
945 volPath += iModule;
946
947 TString symName(symbModuleName);
948 symName += iModule;
949
950 int modUID = o2::base::GeometryManager::getSensID(idPHOS, iModule);
951
952 LOG(debug) << "--------------------------------------------"
953 << "\n";
954 LOG(debug) << "Alignable object" << iModule << "\n";
955 LOG(debug) << "volPath=" << volPath << "\n";
956 LOG(debug) << "symName=" << symName << "\n";
957 LOG(debug) << "--------------------------------------------"
958 << "\n";
959 LOG(debug) << "Check for alignable entry: " << symName;
960
961 if (!gGeoManager->SetAlignableEntry(symName.Data(), volPath.Data(), modUID)) {
962 LOG(error) << "Alignable entry " << symName << " NOT set";
963 }
964 LOG(debug) << "Alignable entry " << symName << " set";
965
966 // Create the Tracking to Local transformation matrix for PHOS modules
967 TGeoPNEntry* alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID);
968 LOG(debug) << "Got TGeoPNEntry " << alignableEntry;
969 if (alignableEntry) {
970 alignableEntry->SetMatrix(Geometry::GetInstance()->getAlignmentMatrix(iModule));
971 }
972 }
973}
Definition of the GeometryManager class.
Definition of the Stack class.
int16_t time
Definition RawEventData.h:4
int32_t i
ClassImp(Detector)
uint16_t pos
Definition RawData.h:3
uint32_t j
Definition RawData.h:0
uint32_t stack
Definition RawData.h:1
std::ostringstream debug
Class for time synchronization of RawReader instances.
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)
Int_t GetCurrentTrackNumber() const override
Definition Stack.h:133
static constexpr ID PHS
Definition DetID.h:67
Detector class for the PHOS detector.
Definition Detector.h:42
~Detector() override
Definition Detector.cxx:61
void ConstructSupportGeometry()
Creating PHOS/support description for Geant.
Definition Detector.cxx:803
Hit * addHit(Int_t trackID, Int_t detID, const math_utils::Point3D< float > &pos, const math_utils::Vector3D< float > &mom, Double_t totE, Double_t time, Double_t eLoss)
Definition Detector.cxx:220
void Register() override
Definition Detector.cxx:128
void ConstructGeometry() override
Definition Detector.cxx:230
void InitializeO2Detector() final
Definition Detector.cxx:66
void ConstructEMCGeometry()
Creating calo for Geant.
Definition Detector.cxx:437
void addAlignableVolumes() const override
Definition Detector.cxx:921
Bool_t ProcessHits(FairVolume *v=nullptr) final
Definition Detector.cxx:130
void EndOfEvent() final
Definition Detector.cxx:74
void FinishEvent() final
Sort final hist.
Definition Detector.cxx:78
void Reset() final
Definition Detector.cxx:116
const float * getFGupZPosition() const
void getModuleCenter(int module, float *pos) const
float getSupportPlateThickness() const
const float * getWarmAlCoverHalfSize() const
const float * getFrameXHalfSize() const
const float * getAPDHalfSize() const
const float * getInnerThermoHalfSize() const
float getRailPart3(int index) const
const float * getOuterThermoParams() const
float getRailOuterSize(int index) const
const float * getFrameZHalfSize() const
const float * getSupportPlateInHalfSize() const
const float * getStripHalfSize() const
const float * getFGupXPosition() const
float getDistanceBetwRails() const
const float * getFGlowZHalfSize() const
const float * getFEEAirHalfSize() const
void getModuleAngle(int module, float angle[3][2]) const
const float * getCoolerHalfSize() const
const float * getSupportPlateHalfSize() const
const float * getWarmThermoHalfSize() const
float getRailRoadSize(int index) const
const float * getFGlowXHalfSize() const
const float * getTCables1HalfSize() const
const float * getPreampHalfSize() const
const float * getFEEAirPosition() const
const float * getCrystalHalfSize() const
float getRailPart1(int index) const
const float * getFGupXHalfSize() const
const float * getFrameZPosition() const
const float * getFGlowZPosition() const
const float * getEMCParams() const
const float * getAirCellHalfSize() const
float getIPtoOuterCoverDistance() const
float getCradleWheel(int index) const
const float * getAirGapHalfSize() const
float getModuleCraddleGap() const
const float * getTCables2HalfSize() const
const float * getFGlowXPosition() const
const float * getTSupport2HalfSize() const
const float * getFiberGlassHalfSize() const
float getDistATBtoModule() const
float getRailsDistanceFromIP() const
const float * getWrappedHalfSize() const
const float * getFrameXPosition() const
static GeometryParams * GetInstance(const std::string_view name="Run2")
get singleton (create if necessary)
const float * getFGupZHalfSize() const
float getCradleWallThickness() const
float getOuterBoxSize(int index) const
const float * getTSupport1HalfSize() const
float getCradleWall(int index) const
float getRailPart2(int index) const
const float * getAlCoverParams() const
static short relToAbsId(char moduleNumber, int strip, int cell)
Definition Geometry.cxx:49
static Geometry * GetInstance()
Definition Geometry.h:63
PHOS simulation hit information.
Definition Hit.h:25
void addEnergyLoss(Double_t eloss)
Definition Hit.h:77
static ShmManager & Instance()
Definition ShmManager.h:61
GLint GLenum GLint x
Definition glcorearb.h:403
const GLdouble * v
Definition glcorearb.h:832
GLint first
Definition glcorearb.h:399
GLboolean * data
Definition glcorearb.h:298
GLuint GLfloat x0
Definition glcorearb.h:5034
GLfloat angle
Definition glcorearb.h:4071
GLuint GLfloat GLfloat y0
Definition glcorearb.h:5034
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
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.
float mLightYieldPerGeV
Average number of photoelectrons per GeV: 1.983 gamma/MeV * 0.2655 PDE eff of APD.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"