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