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), 19.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 (here: IRIS4 by default).
265 // You can wire this to a parameter in TRKBaseParam if desired.
266 // Alternatives: createIRIS5Geometry(vTRK); createIRIS4aGeometry(vTRK);
267
270
271 // Fill sensor names from registry right after geometry creation
272 const auto& regs = o2::trk::vdSensorRegistry();
273 mNumberOfVolumesVD = static_cast<int>(regs.size());
274 mNumberOfVolumes = mNumberOfVolumesVD + mLayers.size();
275 mSensorName.resize(mNumberOfVolumes);
276
277 // Fill VD sensor names from registry
278 int VDvolume = 0;
279 for (const auto& sensor : regs) {
280 mSensorName[VDvolume] = sensor.name;
281 VDvolume++;
282 }
283
284 // Add MLOT sensor names
285 for (int i = 0; i < mLayers.size(); i++) {
286 mSensorName[VDvolume++].Form("%s%d", GeometryTGeo::getTRKSensorPattern(), i);
287 }
288
289 for (auto vd : mSensorName) {
290 std::cout << "Volume name: " << vd << std::endl;
291 }
292
293 mServices.excavateFromVacuum("IRIS_CUTOUTsh");
294 mServices.registerVacuum(vTRK);
295}
296
297void Detector::InitializeO2Detector()
298{
299 LOG(info) << "Initialize TRK O2Detector";
300 mGeometryTGeo = GeometryTGeo::Instance();
301 defineSensitiveVolumes();
302
303 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
304 for (int i = 0; i < mNumberOfVolumes; i++) {
305 mSensorID[i] = gMC ? TVirtualMC::GetMC()->VolId(mSensorName[i]) : 0; // Volume ID from the Geant geometry
306 LOGP(info, "{}: mSensorID={}, mSensorName={}", i, mSensorID[i], mSensorName[i].Data());
307 }
308}
309
310void Detector::defineSensitiveVolumes()
311{
312 TGeoManager* geoManager = gGeoManager;
313 TGeoVolume* v;
314
315 TString volumeName;
316 LOGP(info, "Adding TRK Sensitive Volumes");
317
318 // Register VD sensors created by VDGeometryBuilder
319 for (const auto& s : o2::trk::vdSensorRegistry()) {
320 TGeoVolume* v = gGeoManager->GetVolume(s.name.c_str());
321 if (!v) {
322 LOGP(warning, "VD sensor volume '{}' not found", s.name);
323 continue;
324 }
325 LOGP(info, "Adding VD Sensitive Volume {}", v->GetName());
326 AddSensitiveVolume(v);
327 // Optionally track first/last layers for TR references:
328 if (s.region == o2::trk::VDSensorDesc::Region::Barrel && (s.idx == 0 /*innermost*/)) {
329 mFirstOrLastLayers.push_back(s.name);
330 }
331 }
332
333 // The names of the TRK sensitive volumes have the format: TRKLayer(0...mLayers.size()-1)
334 for (int j{0}; j < mLayers.size(); j++) {
335 volumeName = GeometryTGeo::getTRKSensorPattern() + TString::Itoa(j, 10);
336 if (j == mLayers.size() - 1) {
337 mFirstOrLastLayers.push_back(volumeName.Data());
338 }
339 LOGP(info, "Trying {}", volumeName.Data());
340 v = geoManager->GetVolume(volumeName.Data());
341 LOGP(info, "Adding TRK Sensitive Volume {}", v->GetName());
342 AddSensitiveVolume(v);
343 }
344}
345
346void Detector::EndOfEvent() { Reset(); }
347
348void Detector::Register()
349{
350 // This will create a branch in the output tree called Hit, setting the last
351 // parameter to kFALSE means that this collection will not be written to the file,
352 // it will exist only during the simulation
353
354 if (FairRootManager::Instance()) {
355 FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, true);
356 }
357}
358
359void Detector::Reset()
360{
361 if (!o2::utils::ShmManager::Instance().isOperational()) {
362 mHits->clear();
363 }
364}
365
366bool Detector::InsideFirstOrLastLayer(std::string layerName)
367{
368 bool inside = false;
369 for (auto& firstOrLastLayer : mFirstOrLastLayers) {
370 if (firstOrLastLayer == layerName) {
371 inside = true;
372 break;
373 }
374 }
375 return inside;
376}
377
378bool Detector::ProcessHits(FairVolume* vol)
379{
380 // This method is called from the MC stepping
381 if (!(fMC->TrackCharge())) {
382 return false;
383 }
384
385 int subDetID = -1;
386 int layer = -1;
387 int volume = 0;
388 int volID = vol->getMCid();
389
390 bool notSens = false;
391 while ((volume < mNumberOfVolumes) && (notSens = (volID != mSensorID[volume]))) {
392 ++volume;
393 }
394
395 if (notSens) {
396 return kFALSE; // RS: can this happen? This method must be called for sensors only?
397 }
398
399 if (volume < mNumberOfVolumesVD) {
400 subDetID = 0; // VD. For the moment each "chip" is a volume./// TODO: change this logic once the naming scheme is changed
401 } else {
402 subDetID = 1; // MLOT
403 layer = volume - mNumberOfVolumesVD;
404 }
405
406 // Is it needed to keep a track reference when the outer ITS volume is encountered?
407 auto stack = (o2::data::Stack*)fMC->GetStack();
408 // if (fMC->IsTrackExiting() && (lay == 0 || lay == mLayers.size() - 1)) {
409 if (fMC->IsTrackExiting() && InsideFirstOrLastLayer(vol->GetName())) {
410 // Keep the track refs for the innermost and outermost layers only
411 o2::TrackReference tr(*fMC, GetDetId());
412 tr.setTrackID(stack->GetCurrentTrackNumber());
413 tr.setUserId(volume);
414 stack->addTrackReference(tr);
415 }
416 bool startHit = false, stopHit = false;
417 unsigned char status = 0;
418 if (fMC->IsTrackEntering()) {
419 status |= Hit::kTrackEntering;
420 }
421 if (fMC->IsTrackInside()) {
422 status |= Hit::kTrackInside;
423 }
424 if (fMC->IsTrackExiting()) {
425 status |= Hit::kTrackExiting;
426 }
427 if (fMC->IsTrackOut()) {
428 status |= Hit::kTrackOut;
429 }
430 if (fMC->IsTrackStop()) {
431 status |= Hit::kTrackStopped;
432 }
433 if (fMC->IsTrackAlive()) {
434 status |= Hit::kTrackAlive;
435 }
436
437 // track is entering or created in the volume
438 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
439 startHit = true;
440 } else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
441 stopHit = true;
442 }
443
444 // increment energy loss at all steps except entrance
445 if (!startHit) {
446 mTrackData.mEnergyLoss += fMC->Edep();
447 }
448 if (!(startHit | stopHit)) {
449 return false; // do noting
450 }
451
452 if (startHit) {
453 mTrackData.mEnergyLoss = 0.;
454 fMC->TrackMomentum(mTrackData.mMomentumStart);
455 fMC->TrackPosition(mTrackData.mPositionStart);
456 mTrackData.mTrkStatusStart = status;
457 mTrackData.mHitStarted = true;
458 }
459 if (stopHit) {
460 TLorentzVector positionStop;
461 fMC->TrackPosition(positionStop);
462 // Retrieve the indices with the volume path
463 int stave(0), halfstave(0), mod(0), chip(0);
464 if (subDetID == 1) {
465 fMC->CurrentVolOffID(1, chip);
466 fMC->CurrentVolOffID(2, mod);
467 if (mGeometryTGeo->getNumberOfHalfStaves(layer) == 2) {
468 fMC->CurrentVolOffID(3, halfstave);
469 fMC->CurrentVolOffID(4, stave);
470 } else if (mGeometryTGeo->getNumberOfHalfStaves(layer) == 1) {
471 fMC->CurrentVolOffID(3, stave);
472 } else {
473 LOGP(fatal, "Wrong number of halfstaves for layer {}", layer);
474 }
475 }
476
477 unsigned short chipID = mGeometryTGeo->getChipIndex(subDetID, volume, layer, stave, halfstave, mod, chip);
478
479 Print(vol, volume, subDetID, layer, stave, halfstave, mod, chip, chipID);
480
481 mGeometryTGeo->Print();
482
483 Hit* p = addHit(stack->GetCurrentTrackNumber(), chipID, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
484 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
485 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
486 // p->SetTotalEnergy(vmc->Etot());
487
488 // RS: not sure this is needed
489 // Increment number of Detector det points in TParticle
490 stack->addHit(GetDetId());
491 }
492
493 return true;
494}
495
496o2::trk::Hit* Detector::addHit(int trackID, unsigned short detID, const TVector3& startPos, const TVector3& endPos,
497 const TVector3& startMom, double startE, double endTime, double eLoss, unsigned char startStatus,
498 unsigned char endStatus)
499{
500 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
501 return &(mHits->back());
502}
503
504void Detector::Print(FairVolume* vol, int volume, int subDetID, int layer, int stave, int halfstave, int mod, int chip, int chipID) const
505{
506 int currentVol(0);
507 LOG(info) << "Current volume name: " << fMC->CurrentVolName() << " and ID " << fMC->CurrentVolID(currentVol);
508 LOG(info) << "volume: " << volume << "/" << mNumberOfVolumes - 1;
509 LOG(info) << "off volume name 1 " << fMC->CurrentVolOffName(1) << " chip: " << chip;
510 LOG(info) << "off volume name 2 " << fMC->CurrentVolOffName(2) << " module: " << mod;
511 if (subDetID == 1 && mGeometryTGeo->getNumberOfHalfStaves(layer) == 2) { // staggered geometry
512 LOG(info) << "off volume name 3 " << fMC->CurrentVolOffName(3) << " halfstave: " << halfstave;
513 LOG(info) << "off volume name 4 " << fMC->CurrentVolOffName(4) << " stave: " << stave;
514 LOG(info) << "SubDetector ID: " << subDetID << " Layer: " << layer << " staveinLayer: " << stave << " Chip ID: " << chipID;
515 } else if (subDetID == 1 && mGeometryTGeo->getNumberOfHalfStaves(layer) == 1) { // turbo geometry
516 LOG(info) << "off volume name 3 " << fMC->CurrentVolOffName(3) << " stave: " << stave;
517 LOG(info) << "SubDetector ID: " << subDetID << " Layer: " << layer << " staveinLayer: " << stave << " Chip ID: " << chipID;
518 } else {
519 LOG(info) << "SubDetector ID: " << subDetID << " Chip ID: " << chipID;
520 }
521 LOG(info);
522}
523
524} // namespace trk
525} // namespace o2
526
528
529// Define Factory method for calling from the outside
530extern "C" {
535}
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:531
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 createIRIS4Geometry(TGeoVolume *motherVolume)
@ kDefaultRadii
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"