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 <FairVolume.h>
13
14#include <TVirtualMC.h>
15#include <TVirtualMCStack.h>
16#include <TGeoVolume.h>
17
18#include "DetectorsBase/Stack.h"
19#include "TRKSimulation/Hit.h"
24
25#include <string>
26#include <type_traits>
27
28using o2::trk::Hit;
29
30namespace o2
31{
32namespace trk
33{
34
35float getDetLengthFromEta(const float eta, const float radius)
36{
37 return 2. * (10. + radius * std::cos(2 * std::atan(std::exp(-eta))));
38}
39
41 : o2::base::DetImpl<Detector>("TRK", true),
42 mTrackData(),
43 mHits(o2::utils::createSimVector<o2::trk::Hit>())
44{
45}
46
47Detector::Detector(bool active)
48 : o2::base::DetImpl<Detector>("TRK", true),
49 mTrackData(),
50 mHits(o2::utils::createSimVector<o2::trk::Hit>())
51{
52 auto& trkPars = TRKBaseParam::Instance();
53
54 if (trkPars.configFile != "") {
55 configFromFile(trkPars.configFile);
56 } else {
57 buildTRKMiddleOuterLayers();
58 configToFile();
59 configServices();
60 }
61
62 LOGP(info, "Summary of TRK configuration:");
63 for (auto& layer : mLayers) {
64 LOGP(info, "Layer: {} name: {} r: {} cm | z: {} cm | thickness: {} cm", layer.getNumber(), layer.getName(), layer.getInnerRadius(), layer.getZ(), layer.getChipThickness());
65 }
66}
67
68Detector::~Detector()
69{
70 if (mHits) {
72 }
73}
74
75void Detector::ConstructGeometry()
76{
79}
80
81void Detector::configDefault()
82{
83
84 // Build TRK detector according to the scoping document
85
86 mLayers.clear();
87
88 LOGP(warning, "Loading Scoping Document configuration for ALICE3 TRK");
89 mLayers.emplace_back(0, GeometryTGeo::getTRKLayerPattern() + std::to_string(0), 3.78f, 10, 100.e-3);
90 mLayers.emplace_back(1, GeometryTGeo::getTRKLayerPattern() + std::to_string(1), 7.f, 10, 100.e-3);
91 mLayers.emplace_back(2, GeometryTGeo::getTRKLayerPattern() + std::to_string(2), 12.f, 10, 100.e-3);
92 mLayers.emplace_back(3, GeometryTGeo::getTRKLayerPattern() + std::to_string(3), 20.f, 10, 100.e-3);
93 mLayers.emplace_back(4, GeometryTGeo::getTRKLayerPattern() + std::to_string(4), 30.f, 10, 100.e-3);
94 mLayers.emplace_back(5, GeometryTGeo::getTRKLayerPattern() + std::to_string(5), 45.f, 20, 100.e-3);
95 mLayers.emplace_back(6, GeometryTGeo::getTRKLayerPattern() + std::to_string(6), 60.f, 20, 100.e-3);
96 mLayers.emplace_back(7, GeometryTGeo::getTRKLayerPattern() + std::to_string(7), 80.f, 20, 100.e-3);
97}
98
99void Detector::buildTRKMiddleOuterLayers()
100{
101 auto& trkPars = TRKBaseParam::Instance();
102
103 mLayers.clear();
104
105 switch (trkPars.overallGeom) {
106 case kDefaultRadii:
107 // Build the TRK detector according to changes proposed during
108 // https://indico.cern.ch/event/1407704/
109 // to adhere to the changes that were presented at the ALICE 3 Upgrade days in March 2024
110 // L3 -> 7 cm, L4 -> 9 cm, L5 -> 12 cm, L6 -> 20 cm
111
112 LOGP(warning, "Loading \"After Upgrade Days March 2024\" configuration for ALICE3 TRK");
113 LOGP(warning, "Building TRK with new vacuum vessel and L3 at 7 cm, L4 at 9 cm, L5 at 12 cm, L6 at 20 cm");
114 mLayers.emplace_back(0, GeometryTGeo::getTRKLayerPattern() + std::to_string(0), 7.f, 10, 100.e-3);
115 LOGP(info, "TRKLayer created. Name: {}", GeometryTGeo::getTRKLayerPattern() + std::to_string(0));
116 mLayers.emplace_back(1, GeometryTGeo::getTRKLayerPattern() + std::to_string(1), 9.f, 10, 100.e-3);
117 mLayers.emplace_back(2, GeometryTGeo::getTRKLayerPattern() + std::to_string(2), 12.f, 10, 100.e-3);
118 mLayers.emplace_back(3, GeometryTGeo::getTRKLayerPattern() + std::to_string(3), 20.f, 10, 100.e-3);
119 mLayers.emplace_back(4, GeometryTGeo::getTRKLayerPattern() + std::to_string(4), 30.f, 10, 100.e-3);
120 mLayers.emplace_back(5, GeometryTGeo::getTRKLayerPattern() + std::to_string(5), 45.f, 20, 100.e-3);
121 mLayers.emplace_back(6, GeometryTGeo::getTRKLayerPattern() + std::to_string(6), 60.f, 20, 100.e-3);
122 mLayers.emplace_back(7, GeometryTGeo::getTRKLayerPattern() + std::to_string(7), 80.f, 20, 100.e-3);
123 break;
124 case kModRadii:
125 LOGP(warning, "Loading \"Alternative\" configuration for ALICE3 TRK");
126 LOGP(warning, "Building TRK with new vacuum vessel and L3 at 7 cm, L4 at 11 cm, L5 at 15 cm, L6 at 19 cm");
127 mLayers.emplace_back(0, GeometryTGeo::getTRKLayerPattern() + std::to_string(0), 7.f, 10, 100.e-3);
128 LOGP(info, "TRKLayer created. Name: {}", GeometryTGeo::getTRKLayerPattern() + std::to_string(0));
129 mLayers.emplace_back(1, GeometryTGeo::getTRKLayerPattern() + std::to_string(1), 11.f, 10, 100.e-3);
130 mLayers.emplace_back(2, GeometryTGeo::getTRKLayerPattern() + std::to_string(2), 15.f, 10, 100.e-3);
131 mLayers.emplace_back(3, GeometryTGeo::getTRKLayerPattern() + std::to_string(3), 20.f, 10, 100.e-3);
132 mLayers.emplace_back(4, GeometryTGeo::getTRKLayerPattern() + std::to_string(4), 30.f, 10, 100.e-3);
133 mLayers.emplace_back(5, GeometryTGeo::getTRKLayerPattern() + std::to_string(5), 45.f, 20, 100.e-3);
134 mLayers.emplace_back(6, GeometryTGeo::getTRKLayerPattern() + std::to_string(6), 60.f, 20, 100.e-3);
135 mLayers.emplace_back(7, GeometryTGeo::getTRKLayerPattern() + std::to_string(7), 80.f, 20, 100.e-3);
136 break;
137 default:
138 LOGP(fatal, "Unknown option {} for buildTRKMiddleOuterLayers", static_cast<int>(trkPars.overallGeom));
139 break;
140 }
141
142 // Middle layers
143 mLayers[0].setLayout(trkPars.layoutML);
144 mLayers[1].setLayout(trkPars.layoutML);
145 mLayers[2].setLayout(trkPars.layoutML);
146 mLayers[3].setLayout(trkPars.layoutML);
147
148 // Outer tracker
149 mLayers[4].setLayout(trkPars.layoutOL);
150 mLayers[5].setLayout(trkPars.layoutOL);
151 mLayers[6].setLayout(trkPars.layoutOL);
152 mLayers[7].setLayout(trkPars.layoutOL);
153}
154
155void Detector::configFromFile(std::string fileName)
156{
157 // Override the default geometry if config file provided
158 std::ifstream confFile(fileName);
159 if (!confFile.good()) {
160 LOGP(fatal, "File {} not found, aborting.", fileName);
161 }
162
163 mLayers.clear();
164
165 LOGP(info, "Overriding geometry of ALICE3 TRK using {} file.", fileName);
166
167 std::string line;
168 std::vector<float> tmpBuff;
169 int layerCount{0};
170 while (std::getline(confFile, line)) {
171 if (line[0] == '/') {
172 continue;
173 }
174 tmpBuff.clear();
175 std::stringstream ss(line);
176 float val;
177 std::string substr;
178 while (getline(ss, substr, '\t')) {
179 tmpBuff.push_back(std::stof(substr));
180 }
181 mLayers.emplace_back(layerCount, GeometryTGeo::getTRKLayerPattern() + std::to_string(layerCount), tmpBuff[0], tmpBuff[1], tmpBuff[2]);
182 ++layerCount;
183 }
184}
185
186void Detector::configToFile(std::string fileName)
187{
188 LOGP(info, "Exporting TRK Detector layout to {}", fileName);
189 std::ofstream conFile(fileName.c_str(), std::ios::out);
190 conFile << "/// TRK configuration file: inn_radius z_length lay_thickness" << std::endl;
191 for (auto layer : mLayers) {
192 conFile << layer.getInnerRadius() << "\t" << layer.getZ() << "\t" << layer.getChipThickness() << std::endl;
193 }
194}
195
196void Detector::configServices()
197{
198 mServices = TRKServices();
199}
200
201void Detector::createMaterials()
202{
203 int ifield = 2; // ?
204 float fieldm = 10.0; // ?
206
207 float tmaxfdSi = 0.1; // .10000E+01; // Degree
208 float stemaxSi = 0.0075; // .10000E+01; // cm
209 float deemaxSi = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
210 float epsilSi = 1.0E-4; // .10000E+01;
211 float stminSi = 0.0; // cm "Default value used"
212
213 float tmaxfdAir = 0.1; // .10000E+01; // Degree
214 float stemaxAir = .10000E+01; // cm
215 float deemaxAir = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
216 float epsilAir = 1.0E-4; // .10000E+01;
217 float stminAir = 0.0; // cm "Default value used"
218
219 float tmaxfdCer = 0.1; // .10000E+01; // Degree
220 float stemaxCer = .10000E+01; // cm
221 float deemaxCer = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
222 float epsilCer = 1.0E-4; // .10000E+01;
223 float stminCer = 0.0; // cm "Default value used"
224
225 // AIR
226 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
227 float zAir[4] = {6., 7., 8., 18.};
228 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
229 float dAir = 1.20479E-3;
230
231 // Carbon fiber
232 float aCf[2] = {12.0107, 1.00794};
233 float zCf[2] = {6., 1.};
234
235 o2::base::Detector::Mixture(1, "AIR$", aAir, zAir, dAir, 4, wAir);
236 o2::base::Detector::Medium(1, "AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
237
238 o2::base::Detector::Material(3, "SILICON$", 0.28086E+02, 0.14000E+02, 0.23300E+01, 0.93600E+01, 0.99900E+03);
239 o2::base::Detector::Medium(3, "SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
240}
241
242void Detector::createGeometry()
243{
244 TGeoManager* geoManager = gGeoManager;
245 TGeoVolume* vALIC = geoManager->GetVolume("barrel");
246 if (!vALIC) {
247 LOGP(fatal, "Could not find barrel volume while constructing TRK geometry");
248 }
249 new TGeoVolumeAssembly(GeometryTGeo::getTRKVolPattern());
250 TGeoVolume* vTRK = geoManager->GetVolume(GeometryTGeo::getTRKVolPattern());
251 vALIC->AddNode(vTRK, 2, new TGeoTranslation(0, 30., 0));
252
253 char vstrng[100] = "TRKVol";
254 vTRK->SetTitle(vstrng);
255
256 for (auto& layer : mLayers) {
257 layer.createLayer(vTRK);
258 }
259
260 // Add service for inner tracker
261 mServices.createServices(vTRK);
262
263 // Build the VD using the petal builder
264 // Choose the VD design based on TRKBaseParam.layoutVD
265 auto& trkPars = TRKBaseParam::Instance();
266
268
269 switch (trkPars.layoutVD) {
270 case kIRIS4:
271 LOG(info) << "Building VD with IRIS4 layout";
273 break;
274 case kIRISFullCyl:
275 LOG(info) << "Building VD with IRIS fully cylindrical layout";
277 break;
278 case kIRIS5:
279 LOG(info) << "Building VD with IRIS5 layout";
281 break;
282 case kIRIS4a:
283 LOG(info) << "Building VD with IRIS4a layout";
285 break;
286 default:
287 LOG(fatal) << "Unknown VD layout option: " << static_cast<int>(trkPars.layoutVD);
288 break;
289 }
290
291 // Fill sensor names from registry right after geometry creation
292 const auto& regs = o2::trk::vdSensorRegistry();
293 mNumberOfVolumesVD = static_cast<int>(regs.size());
294 mNumberOfVolumes = mNumberOfVolumesVD + mLayers.size();
295 mSensorName.resize(mNumberOfVolumes);
296
297 // Fill VD sensor names from registry
298 int VDvolume = 0;
299 for (const auto& sensor : regs) {
300 mSensorName[VDvolume] = sensor.name;
301 VDvolume++;
302 }
303
304 // Add MLOT sensor names
305 for (int i = 0; i < mLayers.size(); i++) {
306 mSensorName[VDvolume++].Form("%s%d", GeometryTGeo::getTRKSensorPattern(), i);
307 }
308
309 for (auto vd : mSensorName) {
310 std::cout << "Volume name: " << vd << std::endl;
311 }
312
313 mServices.excavateFromVacuum("IRIS_CUTOUTsh");
314 mServices.registerVacuum(vTRK);
315}
316
317void Detector::InitializeO2Detector()
318{
319 LOG(info) << "Initialize TRK O2Detector";
320 mGeometryTGeo = GeometryTGeo::Instance();
321 defineSensitiveVolumes();
322
323 mSensorID.resize(mNumberOfVolumes); // hardcoded. TODO: change size when a different namingh scheme for VD is in place. Ideally could be 4 petals + 8 layers = 12
324 for (int i = 0; i < mNumberOfVolumes; i++) {
325 mSensorID[i] = gMC ? TVirtualMC::GetMC()->VolId(mSensorName[i]) : 0; // Volume ID from the Geant geometry
326 LOGP(info, "{}: mSensorID={}, mSensorName={}", i, mSensorID[i], mSensorName[i].Data());
327 }
328}
329
330void Detector::defineSensitiveVolumes()
331{
332 TGeoManager* geoManager = gGeoManager;
333 TGeoVolume* v;
334
335 TString volumeName;
336 LOGP(info, "Adding TRK Sensitive Volumes");
337
338 // Register VD sensors created by VDGeometryBuilder
339 for (const auto& s : o2::trk::vdSensorRegistry()) {
340 TGeoVolume* v = gGeoManager->GetVolume(s.name.c_str());
341 if (!v) {
342 LOGP(warning, "VD sensor volume '{}' not found", s.name);
343 continue;
344 }
345 LOGP(info, "Adding VD Sensitive Volume {}", v->GetName());
346 AddSensitiveVolume(v);
347 // Optionally track first/last layers for TR references:
348 if (s.region == o2::trk::VDSensorDesc::Region::Barrel && (s.idx == 0 /*innermost*/)) {
349 mFirstOrLastLayers.push_back(s.name);
350 }
351 }
352
353 // The names of the TRK sensitive volumes have the format: TRKLayer(0...mLayers.size()-1)
354 for (int j{0}; j < mLayers.size(); j++) {
355 volumeName = GeometryTGeo::getTRKSensorPattern() + TString::Itoa(j, 10);
356 if (j == mLayers.size() - 1) {
357 mFirstOrLastLayers.push_back(volumeName.Data());
358 }
359 LOGP(info, "Trying {}", volumeName.Data());
360 v = geoManager->GetVolume(volumeName.Data());
361 LOGP(info, "Adding TRK Sensitive Volume {}", v->GetName());
362 AddSensitiveVolume(v);
363 }
364}
365
366void Detector::EndOfEvent() { Reset(); }
367
368void Detector::Register()
369{
370 // This will create a branch in the output tree called Hit, setting the last
371 // parameter to kFALSE means that this collection will not be written to the file,
372 // it will exist only during the simulation
373
374 if (FairRootManager::Instance()) {
375 FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, true);
376 }
377}
378
379void Detector::Reset()
380{
381 if (!o2::utils::ShmManager::Instance().isOperational()) {
382 mHits->clear();
383 }
384}
385
386bool Detector::InsideFirstOrLastLayer(std::string layerName)
387{
388 bool inside = false;
389 for (auto& firstOrLastLayer : mFirstOrLastLayers) {
390 if (firstOrLastLayer == layerName) {
391 inside = true;
392 break;
393 }
394 }
395 return inside;
396}
397
398bool Detector::ProcessHits(FairVolume* vol)
399{
400 // This method is called from the MC stepping
401 if (!(fMC->TrackCharge())) {
402 return false;
403 }
404
405 int subDetID = -1;
406 int layer = -1;
407 int volume = 0;
408 int volID = vol->getMCid();
409
410 bool notSens = false;
411 while ((volume < mNumberOfVolumes) && (notSens = (volID != mSensorID[volume]))) {
412 ++volume;
413 }
414
415 if (notSens) {
416 return kFALSE; // RS: can this happen? This method must be called for sensors only?
417 }
418
419 if (volume < mNumberOfVolumesVD) {
420 subDetID = 0; // VD. For the moment each "chip" is a volume./// TODO: change this logic once the naming scheme is changed
421 } else {
422 subDetID = 1; // MLOT
423 layer = volume - mNumberOfVolumesVD;
424 }
425
426 // Is it needed to keep a track reference when the outer ITS volume is encountered?
427 auto stack = (o2::data::Stack*)fMC->GetStack();
428 // if (fMC->IsTrackExiting() && (lay == 0 || lay == mLayers.size() - 1)) {
429 if (fMC->IsTrackExiting() && InsideFirstOrLastLayer(vol->GetName())) {
430 // Keep the track refs for the innermost and outermost layers only
431 o2::TrackReference tr(*fMC, GetDetId());
432 tr.setTrackID(stack->GetCurrentTrackNumber());
433 tr.setUserId(volume);
434 stack->addTrackReference(tr);
435 }
436 bool startHit = false, stopHit = false;
437 unsigned char status = 0;
438 if (fMC->IsTrackEntering()) {
439 status |= Hit::kTrackEntering;
440 }
441 if (fMC->IsTrackInside()) {
442 status |= Hit::kTrackInside;
443 }
444 if (fMC->IsTrackExiting()) {
445 status |= Hit::kTrackExiting;
446 }
447 if (fMC->IsTrackOut()) {
448 status |= Hit::kTrackOut;
449 }
450 if (fMC->IsTrackStop()) {
451 status |= Hit::kTrackStopped;
452 }
453 if (fMC->IsTrackAlive()) {
454 status |= Hit::kTrackAlive;
455 }
456
457 // track is entering or created in the volume
458 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
459 startHit = true;
460 } else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
461 stopHit = true;
462 }
463
464 // increment energy loss at all steps except entrance
465 if (!startHit) {
466 mTrackData.mEnergyLoss += fMC->Edep();
467 }
468 if (!(startHit | stopHit)) {
469 return false; // do noting
470 }
471
472 if (startHit) {
473 mTrackData.mEnergyLoss = 0.;
474 fMC->TrackMomentum(mTrackData.mMomentumStart);
475 fMC->TrackPosition(mTrackData.mPositionStart);
476 mTrackData.mTrkStatusStart = status;
477 mTrackData.mHitStarted = true;
478 }
479 if (stopHit) {
480 TLorentzVector positionStop;
481 fMC->TrackPosition(positionStop);
482 // Retrieve the indices with the volume path
483 int stave(0), halfstave(0), mod(0), chip(0);
484 if (subDetID == 1) {
485 fMC->CurrentVolOffID(1, chip);
486 fMC->CurrentVolOffID(2, mod);
487 if (mGeometryTGeo->getNumberOfHalfStaves(layer) == 2) {
488 fMC->CurrentVolOffID(3, halfstave);
489 fMC->CurrentVolOffID(4, stave);
490 } else if (mGeometryTGeo->getNumberOfHalfStaves(layer) == 1) {
491 fMC->CurrentVolOffID(3, stave);
492 } else {
493 LOGP(fatal, "Wrong number of halfstaves for layer {}", layer);
494 }
495 }
496
497 unsigned short chipID = mGeometryTGeo->getChipIndex(subDetID, volume, layer, stave, halfstave, mod, chip);
498
499 // Print(vol, volume, subDetID, layer, stave, halfstave, mod, chip, chipID);
500
501 // mGeometryTGeo->Print();
502
503 Hit* p = addHit(stack->GetCurrentTrackNumber(), chipID, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
504 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
505 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
506 // p->SetTotalEnergy(vmc->Etot());
507
508 // RS: not sure this is needed
509 // Increment number of Detector det points in TParticle
510 stack->addHit(GetDetId());
511 }
512
513 return true;
514}
515
516o2::trk::Hit* Detector::addHit(int trackID, unsigned short detID, const TVector3& startPos, const TVector3& endPos,
517 const TVector3& startMom, double startE, double endTime, double eLoss, unsigned char startStatus,
518 unsigned char endStatus)
519{
520 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
521 return &(mHits->back());
522}
523
524void Detector::Print(FairVolume* vol, int volume, int subDetID, int layer, int stave, int halfstave, int mod, int chip, int chipID) const
525{
526 int currentVol(0);
527 LOG(info) << "Current volume name: " << fMC->CurrentVolName() << " and ID " << fMC->CurrentVolID(currentVol);
528 LOG(info) << "volume: " << volume << "/" << mNumberOfVolumes - 1;
529 LOG(info) << "off volume name 1 " << fMC->CurrentVolOffName(1) << " chip: " << chip;
530 LOG(info) << "off volume name 2 " << fMC->CurrentVolOffName(2) << " module: " << mod;
531 if (subDetID == 1 && mGeometryTGeo->getNumberOfHalfStaves(layer) == 2) { // staggered geometry
532 LOG(info) << "off volume name 3 " << fMC->CurrentVolOffName(3) << " halfstave: " << halfstave;
533 LOG(info) << "off volume name 4 " << fMC->CurrentVolOffName(4) << " stave: " << stave;
534 LOG(info) << "SubDetector ID: " << subDetID << " Layer: " << layer << " staveinLayer: " << stave << " Chip ID: " << chipID;
535 } else if (subDetID == 1 && mGeometryTGeo->getNumberOfHalfStaves(layer) == 1) { // turbo geometry
536 LOG(info) << "off volume name 3 " << fMC->CurrentVolOffName(3) << " stave: " << stave;
537 LOG(info) << "SubDetector ID: " << subDetID << " Layer: " << layer << " staveinLayer: " << stave << " Chip ID: " << chipID;
538 } else {
539 LOG(info) << "SubDetector ID: " << subDetID << " Chip ID: " << chipID;
540 }
541 LOG(info);
542}
543
544} // namespace trk
545} // namespace o2
546
548
549// Define Factory method for calling from the outside
550extern "C" {
555}
Definition of the Stack class.
Definition of the TRK Hit class.
int32_t i
uint32_t j
Definition RawData.h:0
uint32_t stack
Definition RawData.h:1
ClassImp(o2::trk::Detector)
o2::base::Detector * create_detector_trk(bool active)
Definition Detector.cxx:551
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
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
static o2::base::Detector * create(bool active)
Definition Detector.h:38
static ShmManager & Instance()
Definition ShmManager.h:61
const GLdouble * v
Definition glcorearb.h:832
GLboolean * data
Definition glcorearb.h:298
GLuint GLfloat * val
Definition glcorearb.h:1582
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
void createGeometry(TGeoManager &geom, TGeoVolume &topVolume)
Definition Geometry.cxx:74
void createMaterials()
Definition Materials.cxx:91
std::vector< VDSensorDesc > & vdSensorRegistry()
float getDetLengthFromEta(const float eta, const float radius)
Definition Detector.cxx:35
void createIRISGeometryFullCyl(TGeoVolume *motherVolume)
void createIRIS4aGeometry(TGeoVolume *motherVolume)
void createIRIS4Geometry(TGeoVolume *motherVolume)
@ kDefaultRadii
void createIRIS5Geometry(TGeoVolume *motherVolume)
void clearVDSensorRegistry()
void freeSimVector(std::vector< T > *ptr)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
Common utility functions.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"