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
13
14#include "TRDBase/Geometry.h"
15#include "TRDSimulation/TRsim.h"
18#include "DataFormatsTRD/Hit.h"
19
21#include "DetectorsBase/Stack.h"
22#include "FairVolume.h"
23#include "FairRootManager.h"
24
25#include <TGeoManager.h>
26#include <TVirtualMC.h>
27
28#include <vector>
29#include <stdexcept>
30#include <string>
31
32using namespace o2::trd;
33using namespace o2::trd::constants;
34
36 : o2::base::DetImpl<Detector>("TRD", active)
37{
38 mHits = o2::utils::createSimVector<Hit>();
39 InitializeParams();
40}
41
43 : o2::base::DetImpl<Detector>(rhs),
44 mHits(o2::utils::createSimVector<Hit>()),
45 mFoilDensity(rhs.mFoilDensity),
46 mGasNobleFraction(rhs.mGasNobleFraction),
47 mGasDensity(rhs.mGasDensity),
48 mGeom(rhs.mGeom)
49{
50 InitializeParams();
51}
52
57
59{
60 // register the sensitive volumes with FairRoot
61 defineSensitiveVolumes();
62}
63
64void Detector::InitializeParams()
65{
67 mWion = 23.53; // Ionization energy XeCO2 (85/15)
69 mWion = 27.21; // Ionization energy ArCO2 (82/18)
70 } else {
71 LOG(fatal) << "Wrong gas mixture";
72 // add hard exit here!
73 }
74 // Switch on TR simulation as default
76 if (!mTRon) {
77 LOG(info) << "TR simulation off";
78 }
79 mTR = new TRsim();
80 mMaxMCStepDef = TRDSimParams::Instance().maxMCStepSize;
81}
82
83bool Detector::ProcessHits(FairVolume* v)
84{
85 // If not charged track or already stopped or disappeared, just return.
86 if ((!fMC->TrackCharge()) || fMC->IsTrackDisappeared()) {
87 return false;
88 }
89 fMC->SetMaxStep(mMaxMCStepDef); // Should we optimize this value?
90
91 // Inside sensitive volume ?
92 bool drRegion = false;
93 bool amRegion = false;
94 char idRegion;
95 int cIdChamber;
96 int r1 = std::sscanf(fMC->CurrentVolName(), "U%c%d", &idRegion, &cIdChamber);
97 if (r1 != 2) {
98 LOG(fatal) << "Something went wrong with the geometry volume name " << fMC->CurrentVolName();
99 }
100 if (idRegion == 'J') {
101 drRegion = true;
102 } else if (idRegion == 'K') {
103 amRegion = true;
104 } else {
105 return false;
106 }
107
108 const int idChamber = mGeom->getDetectorSec(cIdChamber);
109 if (idChamber < 0 || idChamber > 29) {
110 LOG(fatal) << "Chamber ID out of bounds";
111 }
112
113 int sector;
114 int r2 = std::sscanf(fMC->CurrentVolOffName(7), "BTRD%d", &sector);
115 if (r2 != 1) {
116 LOG(fatal) << "Something went wrong with the geometry volume name " << fMC->CurrentVolOffName(7);
117 }
118 if (sector < 0 || sector >= NSECTOR) {
119 LOG(fatal) << "Sector out of bounds";
120 }
121 // The detector number (0 - 539)
122 int det = mGeom->getDetector(mGeom->getLayer(idChamber), mGeom->getStack(idChamber), sector);
123 if (det < 0 || det >= MAXCHAMBER) {
124 LOG(fatal) << "Detector number out of bounds";
125 }
126
127 // 0: InFlight 1: Entering 2: Exiting
128 int trkStat = 0;
129
130 o2::data::Stack* stack = (o2::data::Stack*)fMC->GetStack();
131 float xp, yp, zp;
132 float px, py, pz, etot;
133 float trackLength = fMC->TrackLength(); // Return the length of the current track from its origin (in cm)
134 float tof = fMC->TrackTime(); // Return the current time of flight of the track being transported (in s).
135
136 // Special hits if track is entering
137 if (drRegion && fMC->IsTrackEntering()) {
138 // Create a track reference at the entrance of each
139 // chamber that contains the momentum components of the particle
140 fMC->TrackMomentum(px, py, pz, etot);
141 fMC->TrackPosition(xp, yp, zp);
142 stack->addTrackReference(o2::TrackReference(*fMC, GetDetId()));
143 // Update track status
144 trkStat = 1;
145 // Create the hits from TR photons if electron/positron is entering the drift volume
146 const bool ele = (std::fabs(fMC->TrackPid()) == 11); // electron PDG code.
147 if (mTRon && ele) {
148 createTRhit(det);
149 }
150 } else if (amRegion && fMC->IsTrackExiting()) {
151 // Create a track reference at the exit of each
152 // chamber that contains the momentum components of the particle
153 fMC->TrackMomentum(px, py, pz, etot);
154 fMC->TrackPosition(xp, yp, zp);
155 stack->addTrackReference(o2::TrackReference(*fMC, GetDetId()));
156 // Update track status
157 trkStat = 2;
158 }
159
160 // Calculate the charge according to GEANT Edep
161 // Create a new dEdx hit
162 const float enDep = std::max(fMC->Edep(), 0.0) * 1e9; // Energy in eV
163 const int totalChargeDep = (int)(enDep / mWion); // Total charge
164
165 // Store those hits with enDep bigger than the ionization potential of the gas mixture for in-flight tracks
166 // or store hits of tracks that are entering or exiting
167 if (totalChargeDep || trkStat) {
168 fMC->TrackPosition(xp, yp, zp);
169 tof = tof * 1e6; // The time of flight in micro-seconds
170 const int trackID = stack->GetCurrentTrackNumber();
171 double pos[3] = {xp, yp, zp};
172 double loc[3] = {-99, -99, -99};
173 gGeoManager->MasterToLocal(pos, loc); // Go to the local coordinate system (locR, locC, locT)
174 float locC = loc[0], locR = loc[1], locT = loc[2];
175 if (drRegion) {
176 locT = locT - 0.5 * (Geometry::drThick() + Geometry::amThick()); // Relative to middle of amplification region
177 }
178 addHit(xp, yp, zp, locC, locR, locT, tof, totalChargeDep, trackID, det, drRegion);
179 stack->addHit(GetDetId());
180 return true;
181 }
182 return false;
183}
184
185void Detector::createTRhit(int det)
186{
187 //
188 // Creates an electron cluster from a TR photon.
189 // The photon is assumed to be created a the end of the radiator. The
190 // distance after which it deposits its energy takes into account the
191 // absorbtion of the entrance window and of the gas mixture in drift
192 // volume.
193 //
194
195 // Maximum number of TR photons per track
196 constexpr int mMaxNumberOfTRPhotons = 50; // Make this a class member?
197
198 float px, py, pz, etot;
199 fMC->TrackMomentum(px, py, pz, etot);
200 float pTot = std::sqrt(px * px + py * py + pz * pz);
201 std::vector<float> photonEnergyContainer; // energy in keV
202 mTR->createPhotons(11, pTot, photonEnergyContainer); // Create TR photons
203 if (photonEnergyContainer.size() > mMaxNumberOfTRPhotons) {
204 LOG(error) << "Boundary error: nTR = " << photonEnergyContainer.size() << ", mMaxNumberOfTRPhotons = " << mMaxNumberOfTRPhotons;
205 }
206
207 // Loop through the TR photons
208 for (const float& photonEnergy : photonEnergyContainer) {
209 const double energyMeV = photonEnergy * 1e-3;
210 const double energyeV = photonEnergy * 1e3;
211 double absLength = 0.0;
212 double sigma = 0.0;
213 // Take the absorbtion in the entrance window into account
214 double muMy = mTR->getMuMy(energyMeV);
215 sigma = muMy * mFoilDensity;
216 if (sigma > 0.0) {
217 absLength = gRandom->Exp(1.0 / sigma);
218 if (absLength < Geometry::myThick()) {
219 continue;
220 }
221 } else {
222 continue;
223 }
224 // The absorbtion cross sections in the drift gas
225 // Gas-mixture (Xe/CO2)
226 double muNo = 0.0;
228 muNo = mTR->getMuXe(energyMeV);
230 muNo = mTR->getMuAr(energyMeV);
231 }
232 double muCO = mTR->getMuCO(energyMeV);
233 // double fGasNobleFraction = 1;
234 // double fGasDensity = 1;
235 sigma = (mGasNobleFraction * muNo + (1.0 - mGasNobleFraction) * muCO) * mGasDensity * mTR->getTemp();
236
237 // The distance after which the energy of the TR photon
238 // is deposited.
239 if (sigma > 0.0) {
240 absLength = gRandom->Exp(1.0 / sigma);
241 if (absLength > (Geometry::drThick() + Geometry::amThick())) {
242 continue;
243 }
244 } else {
245 continue;
246 }
247
248 // The position of the absorbtion
249 float xp, yp, zp;
250 fMC->TrackPosition(xp, yp, zp);
251 float invpTot = 1. / pTot;
252 float x = xp + px * invpTot * absLength;
253 float y = yp + py * invpTot * absLength;
254 float z = zp + pz * invpTot * absLength;
255
256 // Add the hit to the array. TR photon hits are marked by negative energy (and not by charge)
257 float tof = fMC->TrackTime() * 1e6; // The time of flight in micro-seconds
258 o2::data::Stack* stack = (o2::data::Stack*)fMC->GetStack();
259 const int trackID = stack->GetCurrentTrackNumber();
260 const int totalChargeDep = -1 * (int)(energyeV / mWion); // Negative charge for tagging TR photon hits
261 // prepare local coordinates
262 double pos[3] = {x, y, z};
263 double loc[3] = {-99, -99, -99};
264 gGeoManager->MasterToLocal(pos, loc); // Go to the local coordinate system (locR, locC, locT)
265 float locC = loc[0], locR = loc[1], locT = loc[2];
266 locT = locT - 0.5 * (Geometry::drThick() + Geometry::amThick()); // Relative to middle of amplification region
267 addHit(x, y, z, locC, locR, locT, tof, totalChargeDep, trackID, det, true); // All TR hits are in drift region
268 stack->addHit(GetDetId());
269 }
270}
271
273{
274 FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, true);
275}
276
278{
279 // Sort hit vector by detector number before the End of the Event
280 std::sort(mHits->begin(), mHits->end(),
281 [](const Hit& a, const Hit& b) {
282 return a.GetDetectorID() < b.GetDetectorID();
283 });
284}
285
286// this is very problematic; we should do round robin or the clear needs
287// to be done by the HitMerger
289{
290 if (!o2::utils::ShmManager::Instance().isOperational()) {
291 mHits->clear();
292 }
293}
294
296
297//_____________________________________________________________________________
299{
300 //
301 // Create the materials for the TRD
302 //
303 int isxfld = 2;
304 float sxmgmx = 10.;
306
308 // Define Materials
310
311 // Aluminum
312 Material(1, "Al", 26.98, 13.0, 2.7, 8.9, 37.2);
313 // Copper
314 Material(2, "Cu", 63.54, 29.0, 8.96, 1.43, 14.8);
315 // Carbon
316 Material(3, "C", 12.01, 6.0, 2.265, 18.8, 74.4);
317 // Carbon for fiber mats
318 Material(4, "C2", 12.01, 6.0, 1.75, 18.8, 74.4);
319 // Zinc
320 Material(5, "Sn", 118.71, 50.0, 7.31, 1.21, 14.8);
321 // Silicon
322 Material(6, "Si", 28.09, 14.0, 2.33, 9.36, 37.2);
323 // Iron
324 Material(7, "Fe", 55.85, 26.0, 7.87, 1.76, 14.8);
325
326 // Air
327 float aAir[4] = {12.011, 14.0, 15.9994, 36.0};
328 float zAir[4] = {6.0, 7.0, 8.0, 18.0};
329 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
330 float dAir = 1.20479e-03;
331 Mixture(51, "Air", aAir, zAir, dAir, 4, wAir);
332 // Polyethilene (CH2)
333 float ape[2] = {12.011, 1.0079};
334 float zpe[2] = {6.0, 1.0};
335 float wpe[2] = {1.0, 2.0};
336 float dpe = 0.95;
337 Mixture(52, "Polyethilene", ape, zpe, dpe, -2, wpe);
338 // Gas mixtures
339 // Xe/CO2-gas-mixture (85% / 15%)
340 float aXeCO2[3] = {131.29, 12.0107, 15.9994};
341 float zXeCO2[3] = {54.0, 6.0, 8.0};
342 float wXeCO2[3] = {8.5, 1.5, 3.0};
343 float fxc = 0.85;
344 float dxe = 0.00549; // at 20C
345 float dco = 0.00186; // at 20C
346 float dgmXe = fxc * dxe + (1.0 - fxc) * dco;
347 // Ar/CO2-gas-mixture
348 float aArCO2[3] = {39.948, 12.0107, 15.9994};
349 float zArCO2[3] = {18.0, 6.0, 8.0};
350 float wArCO2[3] = {8.2, 1.8, 3.6};
351 float fac = 0.82;
352 float dar = 0.00166; // at 20C
353 float dgmAr = fac * dar + (1.0 - fac) * dco;
355 Mixture(53, "XeCO2", aXeCO2, zXeCO2, dgmXe, -3, wXeCO2);
357 LOG(info) << "Gas mixture: Ar C02 (80/20)";
358 Mixture(53, "ArCO2", aArCO2, zArCO2, dgmAr, -3, wArCO2);
359 } else {
360 LOG(fatal) << "Wrong gas mixture";
361 exit(1);
362 }
363 // G10
364 float aG10[4] = {1.0079, 12.011, 15.9994, 28.086};
365 float zG10[4] = {1.0, 6.0, 8.0, 14.0};
366 float wG10[4] = {0.023, 0.194, 0.443, 0.340};
367 float dG10 = 2.0;
368 Mixture(54, "G10", aG10, zG10, dG10, 4, wG10);
369 // Water
370 float awa[2] = {1.0079, 15.9994};
371 float zwa[2] = {1.0, 8.0};
372 float wwa[2] = {2.0, 1.0};
373 float dwa = 1.0;
374 Mixture(55, "Water", awa, zwa, dwa, -2, wwa);
375 // Rohacell (C5H8O2), X0 = 535.005cm
376 float arh[3] = {12.011, 1.0079, 15.9994};
377 float zrh[3] = {6.0, 1.0, 8.0};
378 float wrh[3] = {5.0, 8.0, 2.0};
379 float drh = 0.075;
380 Mixture(56, "Rohacell", arh, zrh, drh, -3, wrh);
381 // Epoxy (C18H19O3)
382 float aEpoxy[3] = {15.9994, 1.0079, 12.011};
383 float zEpoxy[3] = {8.0, 1.0, 6.0};
384 float wEpoxy[3] = {3.0, 19.0, 18.0};
385 float dEpoxy = 1.8;
386 Mixture(57, "Epoxy", aEpoxy, zEpoxy, dEpoxy, -3, wEpoxy);
387 // Araldite, low density epoxy (C18H19O3)
388 float aAral[3] = {15.9994, 1.0079, 12.011};
389 float zAral[3] = {8.0, 1.0, 6.0};
390 float wAral[3] = {3.0, 19.0, 18.0};
391 float dAral = 1.12; // Hardener: 1.15, epoxy: 1.1, mixture: 1/2
392 Mixture(58, "Araldite", aAral, zAral, dAral, -3, wAral);
393 // Mylar
394 float aMy[3] = {12.011, 1.0, 15.9994};
395 float zMy[3] = {6.0, 1.0, 8.0};
396 float wMy[3] = {5.0, 4.0, 2.0};
397 float dMy = 1.39;
398 Mixture(59, "Mylar", aMy, zMy, dMy, -3, wMy);
399 // Polypropylene (C3H6) for radiator fibers
400 float app[2] = {12.011, 1.0079};
401 float zpp[2] = {6.0, 1.0};
402 float wpp[2] = {3.0, 6.0};
403 float dpp = 0.068;
404 Mixture(60, "Polypropylene", app, zpp, dpp, -2, wpp);
405 // Aramide for honeycomb
406 float aAra[4] = {1.0079, 12.011, 15.9994, 14.0067};
407 float zAra[4] = {1.0, 6.0, 8.0, 7.0};
408 float wAra[4] = {3.0, 1.0, 1.0, 1.0};
409 float dAra = 0.032;
410 Mixture(61, "Aramide", aAra, zAra, dAra, -4, wAra);
411 // GFK for Wacosit (Epoxy + Si)
412 float aGFK[4] = {1.0079, 12.011, 15.9994, 28.086};
413 float zGFK[4] = {1.0, 6.0, 8.0, 14.0};
414 float wGFK[4] = {0.0445, 0.5031, 0.1118, 0.340};
415 float dGFK = 2.0;
416 Mixture(62, "GFK", aGFK, zGFK, dGFK, 4, wGFK);
417
419 // Tracking Media Parameters
421
422 // General tracking parameter
423 float tmaxfd = -10.0;
424 float stemax = -1.0e10;
425 float deemax = -0.1;
426 float epsil = 1.0e-4;
427 float stmin = -0.001;
428
429 // Al Frame
430 Medium(1, "Al Frame", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
431 // Air
432 Medium(2, "Air", 51, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
433 // Wires
434 Medium(3, "Wires", 2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
435 // All other ROB materials (caps, etc.)
436 Medium(4, "ROB Other", 2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
437 // Cu pads
438 Medium(5, "Padplane", 2, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
439 // Fee + cables
440 Medium(6, "Readout", 2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
441 // C frame (Wacosit)
442 Medium(7, "Wacosit", 62, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
443 // INOX of cooling bus bars
444 Medium(8, "Cooling bus", 7, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
445 // Gas-mixture (Xe/CO2)
446 Medium(9, "Gas-mix", 53, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
447 // Honeycomb
448 Medium(10, "Honeycomb", 61, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
449 // Araldite glue
450 Medium(11, "Glue", 58, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
451 // G10-plates
452 Medium(13, "G10-plates", 54, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
453 // Cooling water
454 Medium(14, "Water", 55, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
455 // Rohacell for the radiator
456 Medium(15, "Rohacell", 56, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
457 // Al layer in MCMs
458 Medium(16, "MCM-Al", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
459 // Sn layer in MCMs
460 Medium(17, "MCM-Sn", 5, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
461 // Cu layer in MCMs
462 Medium(18, "MCM-Cu", 2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
463 // G10 layer in MCMs
464 Medium(19, "MCM-G10", 54, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
465 // Si in readout chips
466 Medium(20, "Chip-Si", 6, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
467 // Epoxy in readout chips
468 Medium(21, "Chip-Ep", 57, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
469 // PE in connectors
470 Medium(22, "Conn-PE", 52, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
471 // Cu in connectors
472 Medium(23, "Chip-Cu", 2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
473 // Al of cooling pipes
474 Medium(24, "Cooling", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
475 // Cu in services
476 Medium(25, "Serv-Cu", 2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
477 // Carbon fiber mat
478 Medium(26, "Carbon", 4, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
479 // Mylar foil
480 Medium(27, "Mylar", 59, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
481 // Polypropylene fibers
482 Medium(28, "Fiber", 60, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
483
484 // Save the density values for the TRD absorbtion
485 float dmy = 1.39;
486 mFoilDensity = dmy;
488 mGasDensity = dgmXe;
489 mGasNobleFraction = fxc;
491 mGasDensity = dgmAr;
492 mGasNobleFraction = fac;
493 }
494}
495
496// setting up the geometry
498{
500
501 std::vector<int> medmapping;
502 // now query the medium mapping and fill a vector to be passed along
503 // to the geometry creation
504 getMediumIDMappingAsVector(medmapping);
505
506 mGeom = Geometry::instance();
507 mGeom->createGeometry(medmapping);
508}
509
510void Detector::defineSensitiveVolumes()
511{
512 auto vols = mGeom->getSensitiveTRDVolumes();
513 for (auto& name : vols) {
514 auto tgeovol = gGeoManager->GetVolume(name.c_str());
515 if (tgeovol != nullptr) {
516 AddSensitiveVolume(tgeovol);
517 } else {
518 LOG(error) << "No TGeo volume for TRD vol name " << name << " found\n";
519 }
520 }
521}
522
524{
525 mGeom->addAlignableVolumes();
526}
527
Global TRD definitions and constants.
Definition of the Stack class.
ClassImp(IdPath)
uint16_t pos
Definition RawData.h:3
uint32_t stack
Definition RawData.h:1
void getMediumIDMappingAsVector(std::vector< int > &mapping)
Definition Detector.h:143
Detector()
Default Constructor.
Definition Detector.cxx:36
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
Int_t GetCurrentTrackNumber() const override
Definition Stack.h:133
void addTrackReference(const o2::TrackReference &p)
Definition Stack.h:332
~Detector() override
Definition Detector.cxx:53
void InitializeO2Detector() override
Definition Detector.cxx:58
void EndOfEvent() override
Definition Detector.cxx:295
void Register() override
Definition Detector.cxx:272
Detector(Bool_t active=true)
Definition Detector.cxx:35
void ConstructGeometry() override
Definition Detector.cxx:497
void addAlignableVolumes() const override
Add alignable top volumes.
Definition Detector.cxx:523
bool ProcessHits(FairVolume *v=nullptr) override
Definition Detector.cxx:83
void Reset() override
Definition Detector.cxx:288
void FinishEvent() override
Definition Detector.cxx:277
void addAlignableVolumes() const
static Geometry * instance()
Definition Geometry.h:33
void createGeometry(std::vector< int > const &idtmed)
Definition Geometry.cxx:258
std::vector< std::string > const & getSensitiveTRDVolumes() const
Definition Geometry.h:46
int createPhotons(int pdg, float p, std::vector< float > &ePhoton)
Definition TRsim.cxx:122
double getMuAr(double energyMeV)
Definition TRsim.cxx:418
double getMuXe(double energyMeV)
Definition TRsim.cxx:375
float getTemp() const
Definition TRsim.h:114
double getMuCO(double energyMeV)
Definition TRsim.cxx:340
double getMuMy(double energyMeV)
Definition TRsim.cxx:455
static ShmManager & Instance()
Definition ShmManager.h:61
GLint GLenum GLint x
Definition glcorearb.h:403
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLint y
Definition glcorearb.h:270
GLboolean * data
Definition glcorearb.h:298
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
constexpr int NSECTOR
the number of sectors
Definition Constants.h:25
constexpr int MAXCHAMBER
the maximum number of installed chambers
Definition Constants.h:30
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.
bool doTR
switch for transition radiation
SimParam::GasMixture gas
the gas mixture in the TRD
float maxMCStepSize
maximum size of MC steps
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"