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
14
20
21#include "DetectorsBase/Stack.h"
23
24// FairRoot includes
25#include "FairDetector.h" // for FairDetector
26#include <fairlogger/Logger.h> // for LOG, LOG_IF
27#include "FairModule.h" // for FairModule
28#include "FairRootManager.h" // for FairRootManager
29#include "FairRun.h" // for FairRun
30#include "FairRuntimeDb.h" // for FairRuntimeDb
31#include "FairVolume.h" // for FairVolume
32#include "FairRootManager.h"
33
34#include "TGeoManager.h" // for TGeoManager, gGeoManager
35#include "TGeoMedium.h" // for TGeoMedium
36#include "TGeoTube.h" // for TGeoTube
37#include "TGeoPcon.h" // for TGeoPcon
38#include "TGeoVolume.h" // for TGeoVolume, TGeoVolumeAssembly
39#include "TParticle.h" // for TParticle
40#include "TString.h" // for TString, operator+
41#include "TVirtualMC.h" // for gMC, TVirtualMC
42#include "TVirtualMCStack.h" // for TVirtualMCStack
43#include "TMath.h" // for Abs, ATan, Exp, Tan
44#include "TCanvas.h"
45#include "TDatime.h" // for GetDate, GetTime
46
47#include <cstdio> // for NULL, snprintf
48
49using namespace o2::fct;
50using o2::itsmft::Hit;
51
52//_________________________________________________________________________________________________
54 : o2::base::DetImpl<Detector>("FCT", kTRUE),
55 mTrackData(),
56 mHits(o2::utils::createSimVector<o2::itsmft::Hit>())
57{
58}
59
60//_________________________________________________________________________________________________
61void Detector::buildFCTFromFile(std::string configFileName)
62{
63 // Geometry description from file. One line per disk
64 // z_layer r_in r_out Layerx2X0
65 // This simple file reader is not failproof. Do not add empty lines!
66
67 /*
68 # Sample MFT configuration
69 # z_layer r_in r_out Layerx2X0 layerType (0 disks, 1 squares)
70 -45.3 2.5 9.26 0.0042 1
71 -46.7 2.5 9.26 0.0042 1
72 -48.6 2.5 9.8 0.0042 1
73 -50.0 2.5 9.8 0.0042 1
74 -52.4 2.5 10.43 0.0042 1
75 -53.8 2.5 10.43 0.0042 1
76 -67.7 3.82 13.01 0.0042 1
77 -69.1 3.82 13.01 0.0042 1
78 -76.1 3.92 14.35 0.0042 1
79 -77.5 3.92 14.35 0.0042 1
80 */
81
82 mLayerName.clear();
83 mLayers.clear();
84 mConverterLayers.clear();
85 mLayerID.clear();
86
87 LOG(info) << "Building FCT Detector: From file";
88 LOG(info) << " FCT detector configuration: " << configFileName;
89 std::ifstream ifs(configFileName.c_str());
90 if (!ifs.good()) {
91 LOG(fatal) << " Invalid FCTBase.configFile!";
92 }
93 std::string tempstr;
94 float z_layer, r_in, r_out_l_side, Layerx2X0;
95 int layerNumber = 0;
96 int layerNumberSquare = 0;
97 int layerNumberDisk = 0;
98 int pseumin = 3;
99 int pseumax = 5;
100 int layerType;
101 bool r_toggle = false;
102
103 while (std::getline(ifs, tempstr)) {
104 if (tempstr[0] == '#') {
105 LOG(info) << " Comment: " << tempstr;
106 int loc_r_toggle = tempstr.find("r_toggle");
107 if (loc_r_toggle != -1) {
108 r_toggle = true;
109 LOG(info) << " Comment: R toggle activated";
110 }
111 continue;
112 }
113 std::istringstream iss(tempstr);
114 iss >> layerType;
115 iss >> z_layer;
116 if (r_toggle) {
117 auto pseurap_to_ang = [](float eta) { return 2. * TMath::ATan(TMath::Exp(-eta)); };
118 r_in = TMath::Abs(z_layer) * TMath::Tan(pseurap_to_ang(pseumax));
119 r_out_l_side = TMath::Abs(z_layer) * TMath::Tan(pseurap_to_ang(pseumin));
120 } else {
121 iss >> r_in;
122 iss >> r_out_l_side;
123 }
124 iss >> Layerx2X0;
125
126 std::string layerName = GeometryTGeo::getFCTLayerPattern() + std::string("_") + std::to_string(layerNumber);
127 mLayerName.push_back(layerName);
128 if (layerType == 0) {
129 LOG(info) << "Adding Disk Layer " << layerName << " at z = " << z_layer << " ; r_in = " << r_in << " ; r_out = " << r_out_l_side << " x/X0 = " << Layerx2X0;
130 layerNumberDisk++;
131 } else if (layerType == 1) {
132 LOG(info) << "Adding Square Layer " << layerName << " at z = " << z_layer << " ; r_in = " << r_in << " ; l_side = " << r_out_l_side << " x/X0 = " << Layerx2X0;
133 layerNumberSquare++;
134 } else if (layerType == 2) {
135 LOG(info) << "Adding passive converter Layer " << layerName << " at z = " << z_layer << " ; r_in = " << r_in << " ; r_out = " << r_out_l_side << " x/X0 = " << Layerx2X0;
136 }
137
138 if (layerType == 0 || layerType == 1) {
139 mLayers.emplace_back(layerNumber, layerName, z_layer, r_in, r_out_l_side, Layerx2X0, layerType);
140 } else if (layerType == 2) {
141 mConverterLayers.emplace_back(layerNumber, layerName, z_layer, r_in, r_out_l_side, Layerx2X0, layerType);
142 }
143 layerNumber++;
144 }
145
146 mNumberOfLayers = layerNumber;
147 LOG(info) << " Loaded FCT Detector with " << mNumberOfLayers << " layers";
148 LOG(info) << " Of which " << layerNumberDisk << " are disks";
149 LOG(info) << " Of which " << layerNumberSquare << " are disks";
150}
151
152//_________________________________________________________________________________________________
154{
155 // Export FCT Layout description to file. One line per disk
156 // z_layer r_in r_out Layerx2X0
157 TString configFileName = "FCT_layout.cfg";
158
159 LOG(info) << "Exporting FCT Detector layout to " << configFileName;
160
161 std::ofstream fOut(configFileName, std::ios::out);
162 if (!fOut) {
163 printf("Cannot open file\n");
164 return;
165 }
166 fOut << "# z_layer r_in r_out_l_side Layerx2X0" << std::endl;
167 for (auto layer : mLayers) {
168 if (layer.getType() == 0) {
169 fOut << layer.getZ() << " " << layer.getInnerRadius() << " " << layer.getOuterRadius() << " " << layer.getx2X0() << std::endl;
170 } else if (layer.getType() == 1) {
171 fOut << layer.getZ() << " " << layer.getInnerRadius() << " " << layer.getSideLength() << " " << layer.getx2X0() << std::endl;
172 }
173 }
174}
175
176//_________________________________________________________________________________________________
178{
179 // Build a basic parametrized FCT detector with nLayers equally spaced between z_first and z_first+z_length
180 // Covering pseudo rapidity [etaIn,etaOut]. Silicon thinkness computed to match layer x/X0
181
182 LOG(info) << "Building FCT Detector: Conical Telescope";
183
184 auto z_first = param.z0;
185 auto z_length = param.zLength;
186 auto etaIn = param.etaIn;
187 auto etaOut = param.etaOut;
188 auto Layerx2X0 = param.Layerx2X0;
189 mNumberOfLayers = param.nLayers;
190 mLayerID.clear();
191
192 Int_t type = 0; // Disk
193
194 for (Int_t layerNumber = 0; layerNumber < mNumberOfLayers; layerNumber++) {
195 std::string layerName = GeometryTGeo::getFCTLayerPattern() + std::to_string(layerNumber); // + mNumberOfLayers * direction);
196 mLayerName.push_back(layerName);
197
198 // Adds evenly spaced layers
199 Float_t layerZ = z_first + (layerNumber * z_length / (mNumberOfLayers - 1)) * std::copysign(1, z_first);
200 Float_t rIn = std::abs(layerZ * std::tan(2.f * std::atan(std::exp(-etaIn))));
201 Float_t rOut = std::abs(layerZ * std::tan(2.f * std::atan(std::exp(-etaOut))));
202 mLayers.emplace_back(layerNumber, layerName, layerZ, rIn, rOut, Layerx2X0, type);
203 }
204}
205
206//_________________________________________________________________________________________________
208{
209 // Build FCT according to Scoping Document
210
211 LOG(info) << "Building FCT Detector: V1";
212
213 mNumberOfLayers = 11;
214 Float_t layersx2X0 = 1.e-2;
215
216 std::vector<std::array<Float_t, 4>> layersConfig{
217 {442.0, 5.0, 17.0, layersx2X0}, // {z_layer, r_in, r_out, Layerx2X0}
218 {444.0, 5.0, 17.0, layersx2X0},
219 {446.0, 5.0, 17.0, layersx2X0},
220 {448.0, 5.0, 17.0, layersx2X0},
221 {450.0, 5.0, 17.0, layersx2X0},
222 {452.0, 5.0, 17.0, layersx2X0},
223 {460.0, 5.0, 17.0, layersx2X0},
224 {470.0, 5.0, 18.0, layersx2X0},
225 {480.0, 5.0, 18.0, layersx2X0},
226 {490.0, 5.0, 19.0, layersx2X0},
227 {500.0, 5.0, 19.0, layersx2X0}};
228
229 mLayerID.clear();
230 mLayerName.clear();
231 mLayers.clear();
232
233 Int_t type = 0; // Disk
234
235 for (int layerNumber = 0; layerNumber < mNumberOfLayers; layerNumber++) {
236 std::string layerName = GeometryTGeo::getFCTLayerPattern() + std::to_string(layerNumber);
237 mLayerName.push_back(layerName);
238 Float_t z = layersConfig[layerNumber][0];
239
240 Float_t rIn = layersConfig[layerNumber][1];
241 Float_t rOut = layersConfig[layerNumber][2];
242 Float_t x0 = layersConfig[layerNumber][3];
243
244 LOG(info) << "Adding Layer " << layerName << " at z = " << z;
245 // Add layers
246 mLayers.emplace_back(layerNumber, layerName, z, rIn, rOut, x0, type);
247 }
248}
249
250//_________________________________________________________________________________________________
252 : o2::base::DetImpl<Detector>("FCT", active),
253 mTrackData(),
254 mHits(o2::utils::createSimVector<o2::itsmft::Hit>())
255{
256}
257
258//_________________________________________________________________________________________________
260 : o2::base::DetImpl<Detector>(rhs),
261 mTrackData(),
262
264 mHits(o2::utils::createSimVector<o2::itsmft::Hit>())
265{
266 mLayerID = rhs.mLayerID;
267 mLayerName = rhs.mLayerName;
268 mNumberOfLayers = rhs.mNumberOfLayers;
269}
270
271//_________________________________________________________________________________________________
273{
274
275 if (mHits) {
276 // delete mHits;
278 }
279}
280
281//_________________________________________________________________________________________________
282Detector& Detector::operator=(const Detector& rhs)
283{
284 // The standard = operator
285 // Inputs:
286 // Detector &h the sourse of this copy
287 // Outputs:
288 // none.
289 // Return:
290 // A copy of the sourse hit h
291
292 if (this == &rhs) {
293 return *this;
294 }
295
296 // base class assignment
298
299 mLayerID = rhs.mLayerID;
300 mLayerName = rhs.mLayerName;
301 mNumberOfLayers = rhs.mNumberOfLayers;
302 mLayers = rhs.mLayers;
303 mTrackData = rhs.mTrackData;
304
306 mHits = nullptr;
307
308 return *this;
309}
310
311//_________________________________________________________________________________________________
313{
314 // Define the list of sensitive volumes
315 LOG(info) << "Initialize FCT O2Detector";
316
318
319 defineSensitiveVolumes();
320}
321
322//_________________________________________________________________________________________________
323Bool_t Detector::ProcessHits(FairVolume* vol)
324{
325 // This method is called from the MC stepping
326 if (!(fMC->TrackCharge())) {
327 return kFALSE;
328 }
329
330 Int_t lay = 0, volID = vol->getMCid();
331 while ((lay <= mLayerID.size()) && (volID != mLayerID[lay])) {
332 ++lay;
333 }
334
335 auto stack = (o2::data::Stack*)fMC->GetStack();
336
337 bool startHit = false, stopHit = false;
338 unsigned char status = 0;
339 if (fMC->IsTrackEntering()) {
340 status |= Hit::kTrackEntering;
341 }
342 if (fMC->IsTrackInside()) {
343 status |= Hit::kTrackInside;
344 }
345 if (fMC->IsTrackExiting()) {
346 status |= Hit::kTrackExiting;
347 }
348 if (fMC->IsTrackOut()) {
349 status |= Hit::kTrackOut;
350 }
351 if (fMC->IsTrackStop()) {
352 status |= Hit::kTrackStopped;
353 }
354 if (fMC->IsTrackAlive()) {
355 status |= Hit::kTrackAlive;
356 }
357
358 // track is entering or created in the volume
359 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
360 startHit = true;
361 } else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
362 stopHit = true;
363 }
364
365 // increment energy loss at all steps except entrance
366 if (!startHit) {
367 mTrackData.mEnergyLoss += fMC->Edep();
368 }
369 if (!(startHit | stopHit)) {
370 return kFALSE; // do nothing
371 }
372 if (startHit) {
373 mTrackData.mEnergyLoss = 0.;
374 fMC->TrackMomentum(mTrackData.mMomentumStart);
375 fMC->TrackPosition(mTrackData.mPositionStart);
376 mTrackData.mTrkStatusStart = status;
377 mTrackData.mHitStarted = true;
378 }
379 if (stopHit) {
380 TLorentzVector positionStop;
381 fMC->TrackPosition(positionStop);
382 // Retrieve the indices with the volume path
383 int chipindex = lay;
384
385 Hit* p = addHit(stack->GetCurrentTrackNumber(), chipindex, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
386 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
387 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
388 // p->SetTotalEnergy(vmc->Etot());
389
390 // RS: not sure this is needed
391 // Increment number of Detector det points in TParticle
392 stack->addHit(GetDetId());
393 }
394
395 return kTRUE;
396}
397
398//_________________________________________________________________________________________________
399void Detector::createMaterials()
400{
401 Int_t ifield = 2;
402 Float_t fieldm = 10.0;
404
405 Float_t tmaxfdSi = 0.1; // .10000E+01; // Degree
406 Float_t stemaxSi = 0.0075; // .10000E+01; // cm
407 Float_t deemaxSi = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
408 Float_t epsilSi = 1.0E-4; // .10000E+01;
409 Float_t stminSi = 0.0; // cm "Default value used"
410
411 Float_t tmaxfdAir = 0.1; // .10000E+01; // Degree
412 Float_t stemaxAir = .10000E+01; // cm
413 Float_t deemaxAir = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
414 Float_t epsilAir = 1.0E-4; // .10000E+01;
415 Float_t stminAir = 0.0; // cm "Default value used"
416
417 Float_t tmaxfdPb = 10.; // .10000E+01; // Degree
418 Float_t stemaxPb = 0.01; // .10000E+01; // cm
419 Float_t deemaxPb = 0.1; // .10000E+01; // Fraction of particle's energy 0<deemax<=1
420 Float_t epsilPb = 0.1; // .10000E+01;
421 Float_t stminPb = 0.0; // cm "Default value used"
422
423 // AIR
424 Float_t aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
425 Float_t zAir[4] = {6., 7., 8., 18.};
426 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
427 Float_t dAir = 1.20479E-3;
428
429 o2::base::Detector::Mixture(1, "AIR$", aAir, zAir, dAir, 4, wAir);
430 o2::base::Detector::Medium(1, "AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
431
432 // Add Silicon
433 o2::base::Detector::Material(3, "SILICON$", 0.28086E+02, 0.14000E+02, 0.23300E+01, 0.93600E+01, 0.99900E+03);
434 o2::base::Detector::Medium(3, "SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
435
436 // Add Lead (copied from EMCAL)
437 o2::base::Detector::Material(2, "LEAD$", 207.2, 82, 11.35, 0.56, 18.5);
438 o2::base::Detector::Medium(2, "LEAD$", 2, 0, ifield, fieldm, tmaxfdPb, stemaxPb, deemaxPb, epsilPb, stminPb);
439}
440
441//_________________________________________________________________________________________________
443
444//_________________________________________________________________________________________________
446{
447 // This will create a branch in the output tree called Hit, setting the last
448 // parameter to kFALSE means that this collection will not be written to the file,
449 // it will exist only during the simulation
450
451 if (FairRootManager::Instance()) {
452 FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, kTRUE);
453 }
454}
455
456//_________________________________________________________________________________________________
458{
459 if (!o2::utils::ShmManager::Instance().isOperational()) {
460 mHits->clear();
461 }
462}
463
464//_________________________________________________________________________________________________
466{
467 // FCT Base configuration parameters
468 auto& fctBaseParam = FCTBaseParam::Instance();
469
470 // Set the parameters for the detector layout
471 if (fctBaseParam.configFile != "") {
472 LOG(info) << "FCT Geometry configuration file provided. Overriding FCTBase.geoModel configuration.";
473 buildFCTFromFile(fctBaseParam.configFile);
474 } else {
475 switch (fctBaseParam.geoModel) {
476 case Default:
477 buildFCTV1(); // FCTV1
478 break;
479 case Telescope:
480 buildBasicFCT(fctBaseParam); // BasicFCT = Parametrized telescopic detector (equidistant layers)
481 break;
482 default:
483 LOG(fatal) << "Invalid Geometry.\n";
484 break;
485 }
486 }
487
488 exportLayout();
489
490 // Create detector materials
491 createMaterials();
492
493 // Construct the detector geometry
494 createGeometry();
495}
496
497//_________________________________________________________________________________________________
498void Detector::createGeometry()
499{
500
502
503 TGeoVolume* volFCT = new TGeoVolumeAssembly(GeometryTGeo::getFCTVolPattern());
504 TGeoVolume* volIFCT = new TGeoVolumeAssembly(GeometryTGeo::getFCTInnerVolPattern());
505
506 LOG(info) << "GeometryBuilder::buildGeometry volume name = " << GeometryTGeo::getFCTVolPattern();
507
508 TGeoVolume* vALIC = gGeoManager->GetVolume("barrel");
509 if (!vALIC) {
510 LOG(fatal) << "Could not find the top volume";
511 }
512
513 TGeoVolume* A3IPvac = gGeoManager->GetVolume("OUT_PIPEVACUUM");
514 if (!A3IPvac) {
515 LOG(info) << "Running simulation with no beam pipe.";
516 }
517
518 LOG(debug) << "FCT createGeometry: "
519 << Form("gGeoManager name is %s title is %s", gGeoManager->GetName(), gGeoManager->GetTitle());
520
521 LOG(info) << "Creating FCT layers:";
522 if (A3IPvac) {
523 for (Int_t iLayer = 0; iLayer < mLayers.size(); iLayer++) {
524 if (std::abs(mLayers[iLayer].getZ()) < 25) {
525 mLayers[iLayer].createLayer(volIFCT);
526 } else {
527 mLayers[iLayer].createLayer(volFCT);
528 }
529 }
530 A3IPvac->AddNode(volIFCT, 2, new TGeoTranslation(0., 0., 0.));
531 vALIC->AddNode(volFCT, 2, new TGeoTranslation(0., 30., 0.));
532 } else {
533 for (Int_t iLayer = 0; iLayer < mLayers.size(); iLayer++) {
534 mLayers[iLayer].createLayer(volFCT);
535 }
536 for (Int_t iLayer = 0; iLayer < mConverterLayers.size(); iLayer++) {
537 mConverterLayers[iLayer].createLayer(volFCT);
538 }
539 vALIC->AddNode(volFCT, 2, new TGeoTranslation(0., 30., 0.));
540 }
541
542 LOG(info) << "Registering FCT SensitiveLayerIDs:";
543 for (int iLayer = 0; iLayer < mLayers.size(); iLayer++) {
544 auto layerID = gMC ? TVirtualMC::GetMC()->VolId(Form("%s_%d", GeometryTGeo::getFCTSensorPattern(), mLayers[iLayer].getLayerNumber())) : 0;
545 mLayerID.push_back(layerID);
546 LOG(info) << " mLayerID[" << mLayers[iLayer].getLayerNumber() << "] = " << layerID;
547 }
548}
549
550//_________________________________________________________________________________________________
551void Detector::defineSensitiveVolumes()
552{
553 TGeoManager* geoManager = gGeoManager;
554 TGeoVolume* v;
555
556 TString volumeName;
557 LOG(info) << "Adding FCT Sensitive Volumes";
558
559 // The names of the FCT sensitive volumes have the format: FCTSensor_(0,1)_(0...sNumberLayers-1)
560 for (Int_t iLayer = 0; iLayer < mLayers.size(); iLayer++) {
561 volumeName = o2::fct::GeometryTGeo::getFCTSensorPattern() + std::to_string(mLayers[iLayer].getLayerNumber());
562 v = geoManager->GetVolume(Form("%s_%d", GeometryTGeo::getFCTSensorPattern(), mLayers[iLayer].getLayerNumber()));
563 LOG(info) << "Adding FCT Sensitive Volume => " << v->GetName();
564 AddSensitiveVolume(v);
565 }
566}
567
568//_________________________________________________________________________________________________
569Hit* Detector::addHit(int trackID, int detID, const TVector3& startPos, const TVector3& endPos,
570 const TVector3& startMom, double startE, double endTime, double eLoss, unsigned char startStatus,
571 unsigned char endStatus)
572{
573 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
574 return &(mHits->back());
575}
576
Definition of the Stack class.
Definition of the ITSMFT Hit class.
Definition of the FCTLayer class.
ClassImp(IdPath)
uint32_t stack
Definition RawData.h:1
Definition of the GeometryTGeo class.
Definition of the Detector class.
std::ostringstream debug
Detector & operator=(const Detector &)
Definition Detector.cxx:46
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
std::string addNameTo(const char *ext) const
Definition Detector.h:150
~Detector() override
Default destructor.
Definition Detector.cxx:272
void InitializeO2Detector() override
Initialization of the detector is done here.
Definition Detector.cxx:312
void EndOfEvent() override
Definition Detector.cxx:442
o2::itsmft::Hit * addHit(int trackID, int detID, const TVector3 &startPos, const TVector3 &endPos, const TVector3 &startMom, double startE, double endTime, double eLoss, unsigned char startStatus, unsigned char endStatus)
This method is an example of how to add your own point of type Hit to the clones array.
Definition Detector.cxx:569
void buildBasicFCT(const FCTBaseParam &param)
Definition Detector.cxx:177
void Register() override
Registers the produced collections in FAIRRootManager.
Definition Detector.cxx:445
Bool_t ProcessHits(FairVolume *v=nullptr) override
This method is called for each step during simulation (see FairMCApplication::Stepping())
Definition Detector.cxx:323
void buildFCTFromFile(std::string)
Definition Detector.cxx:61
void ConstructGeometry() override
Base class to create the detector geometry.
Definition Detector.cxx:465
Detector()
Default constructor.
Definition Detector.cxx:53
GeometryTGeo * mGeometryTGeo
Definition Detector.h:118
void Reset() override
Has to be called after each event to reset the containers.
Definition Detector.cxx:457
void exportLayout()
access to geometry details
Definition Detector.cxx:153
static const char * getFCTVolPattern()
static const char * getFCTInnerVolPattern()
static GeometryTGeo * Instance()
static const char * getFCTLayerPattern()
static const char * getFCTSensorPattern()
static ShmManager & Instance()
Definition ShmManager.h:61
const GLdouble * v
Definition glcorearb.h:832
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLboolean * data
Definition glcorearb.h:298
GLuint GLfloat x0
Definition glcorearb.h:5034
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLenum GLfloat param
Definition glcorearb.h:271
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 ...
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
Common utility functions.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"