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#include <TGeoTube.h>
18
19#include "DetectorsBase/Stack.h"
23
24using o2::itsmft::Hit;
25
26namespace o2
27{
28namespace rich
29{
30
32 : o2::base::DetImpl<Detector>("RCH", true),
33 mTrackData(),
34 mHits(o2::utils::createSimVector<o2::itsmft::Hit>())
35{
36}
37
39 : o2::base::DetImpl<Detector>("RCH", true),
40 mTrackData(),
41 mHits(o2::utils::createSimVector<o2::itsmft::Hit>())
42{
43 auto& richPars = RICHBaseParam::Instance();
44 mRings.resize(richPars.nRings);
45 mNTiles = richPars.nTiles;
46 LOGP(info, "Summary of RICH configuration:\n\tNumber of rings: {}\n\tNumber of tiles per ring: {}", mRings.size(), mNTiles);
47}
48
50{
51 if (mHits) {
53 }
54}
55
61
63{
64 int ifield = 2; // ?
65 float fieldm = 10.0; // ?
67
68 float tmaxfdSi = 0.1; // .10000E+01; // Degree
69 float stemaxSi = 0.0075; // .10000E+01; // cm
70 float deemaxSi = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
71 float epsilSi = 1.0E-4; // .10000E+01;
72 float stminSi = 0.0; // cm "Default value used"
73
74 float tmaxfdAir = 0.1; // .10000E+01; // Degree
75 float stemaxAir = .10000E+01; // cm
76 float deemaxAir = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
77 float epsilAir = 1.0E-4; // .10000E+01;
78 float stminAir = 0.0; // cm "Default value used"
79
80 float tmaxfdCer = 0.1; // .10000E+01; // Degree
81 float stemaxCer = .10000E+01; // cm
82 float deemaxCer = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
83 float epsilCer = 1.0E-4; // .10000E+01;
84 float stminCer = 0.0; // cm "Default value used"
85
86 float tmaxfdAerogel = 0.1; // .10000E+01; // Degree
87 float stemaxAerogel = .10000E+01; // cm
88 float deemaxAerogel = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
89 float epsilAerogel = 1.0E-4; // .10000E+01;
90 float stminAerogel = 0.0; // cm "Default value used"
91
92 float tmaxfdArgon = 0.1; // .10000E+01; // Degree
93 float stemaxArgon = .10000E+01; // cm
94 float deemaxArgon = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
95 float epsilArgon = 1.0E-4; // .10000E+01;
96 float stminArgon = 0.0; // cm "Default value used"
97
98 // AIR
99 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
100 float zAir[4] = {6., 7., 8., 18.};
101 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
102 float dAir = 1.20479E-3;
103
104 // Carbon fiber
105 float aCf[2] = {12.0107, 1.00794};
106 float zCf[2] = {6., 1.};
107
108 // Silica aerogel https://pdg.lbl.gov/2023/AtomicNuclearProperties/HTML/silica_aerogel.html
109 float aAerogel[3] = {15.9990, 28.0855, 1.00794};
110 float zAerogel[3] = {8., 14., 1.};
111 float wAerogel[3] = {0.543192, 0.453451, 0.003357};
112 float dAerogel = 0.200; // g/cm3
113
114 // Argon
115 float aArgon = 39.948;
116 float zArgon = 18.;
117 float wArgon = 1.;
118 float dArgon = 1.782E-3; // g/cm3
119
120 o2::base::Detector::Mixture(1, "AIR$", aAir, zAir, dAir, 4, wAir);
121 o2::base::Detector::Medium(1, "AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
122
123 o2::base::Detector::Material(3, "SILICON$", 0.28086E+02, 0.14000E+02, 0.23300E+01, 0.93600E+01, 0.99900E+03);
124 o2::base::Detector::Medium(3, "SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
125
126 o2::base::Detector::Mixture(2, "AEROGEL$", aAerogel, zAerogel, dAerogel, 3, wAerogel);
127 o2::base::Detector::Medium(2, "AEROGEL$", 2, 0, ifield, fieldm, tmaxfdAerogel, stemaxAerogel, deemaxAerogel, epsilAerogel, stminAerogel);
128
129 o2::base::Detector::Material(4, "ARGON$", aArgon, zArgon, dArgon, 1, wArgon);
130 o2::base::Detector::Medium(4, "ARGON$", 4, 0, ifield, fieldm, tmaxfdArgon, stemaxArgon, deemaxArgon, epsilArgon, stminArgon);
131}
132
134{
135 TGeoManager* geoManager = gGeoManager;
136 TGeoVolume* vALIC = geoManager->GetVolume("barrel");
137 if (!vALIC) {
138 LOGP(fatal, "Could not find barrel volume while constructing RICH geometry");
139 }
140 new TGeoVolumeAssembly(GeometryTGeo::getRICHVolPattern());
141 TGeoVolume* vRICH = geoManager->GetVolume(GeometryTGeo::getRICHVolPattern());
142 vALIC->AddNode(vRICH, 2, new TGeoTranslation(0, 30., 0));
143
144 char vstrng[100] = "RICHV";
145 vRICH->SetTitle(vstrng);
146 auto& richPars = RICHBaseParam::Instance();
147
148 prepareLayout(); // Preparing the positions of the rings and tiles
149
150 for (int iRing{0}; iRing < richPars.nRings; ++iRing) {
151 if (!richPars.oddGeom && iRing == (richPars.nRings / 2)) {
152 continue;
153 }
154 mRings[iRing] = o2::rich::Ring{iRing,
155 richPars.nTiles,
156 richPars.rMin,
157 richPars.rMax,
158 richPars.radiatorThickness,
159 (float)mVTile1[iRing],
160 (float)mVTile2[iRing],
161 (float)mLAerogelZ[iRing],
162 richPars.detectorThickness,
163 (float)mVMirror1[iRing],
164 (float)mVMirror2[iRing],
165 richPars.zBaseSize,
166 (float)mR0Radiator[iRing],
167 (float)mR0PhotoDet[iRing],
168 (float)mTRplusG[iRing],
169 (float)mThetaBi[iRing],
171 }
172
173 if (richPars.enableFWDRich) {
174 mFWDRich.createFWDRich(vRICH);
175 }
176 if (richPars.enableBWDRich) {
177 mBWDRich.createBWDRich(vRICH);
178 }
179}
180
182{
183 LOG(info) << "Initialize RICH O2Detector";
184 mGeometryTGeo = GeometryTGeo::Instance();
185 defineSensitiveVolumes();
186}
187
188void Detector::defineSensitiveVolumes()
189{
190 TGeoManager* geoManager = gGeoManager;
191 TGeoVolume* v;
192
193 TString volumeName;
194 LOGP(info, "Adding RICH Sensitive Volumes");
195
196 // The names of the RICH sensitive volumes have the format: Ring(0...mRings.size()-1)
197 for (auto ring : mRings) {
198 for (int j = 0; j < ring.getNTiles(); j++) {
199 volumeName = Form("%s_%d_%d", GeometryTGeo::getRICHSensorPattern(), ring.getPosId(), j);
200 LOGP(info, "Trying {}", volumeName.Data());
201 v = geoManager->GetVolume(volumeName.Data());
202 if (!v) {
203 LOG(error) << "Geometry does not contain volume " << volumeName.Data();
204 geoManager->GetListOfVolumes()->Print();
205 LOG(fatal) << "Could not find volume " << volumeName.Data() << " in the geometry";
206 }
207 LOGP(info, "Adding RICH Sensitive Volume {}", v->GetName());
208 AddSensitiveVolume(v);
209 }
210 }
211}
212
214
216{
217 // This will create a branch in the output tree called Hit, setting the last
218 // parameter to kFALSE means that this collection will not be written to the file,
219 // it will exist only during the simulation
220
221 if (FairRootManager::Instance()) {
222 FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, true);
223 }
224}
225
227{
228 if (!o2::utils::ShmManager::Instance().isOperational()) {
229 mHits->clear();
230 }
231}
232
233bool Detector::ProcessHits(FairVolume* vol)
234{
235 // This method is called from the MC stepping
236 if (!(fMC->TrackCharge())) {
237 return false;
238 }
239
240 int lay = vol->getVolumeId();
241 int volID = vol->getMCid();
242
243 // Is it needed to keep a track reference when the outer ITS volume is encountered?
244 auto stack = (o2::data::Stack*)fMC->GetStack();
245 if (fMC->IsTrackExiting() && (lay == 0 || lay == mRings.size() - 1)) {
246 // Keep the track refs for the innermost and outermost rings only
247 o2::TrackReference tr(*fMC, GetDetId());
248 tr.setTrackID(stack->GetCurrentTrackNumber());
249 tr.setUserId(lay);
250 stack->addTrackReference(tr);
251 }
252 bool startHit = false, stopHit = false;
253 unsigned char status = 0;
254 if (fMC->IsTrackEntering()) {
255 status |= Hit::kTrackEntering;
256 }
257 if (fMC->IsTrackInside()) {
258 status |= Hit::kTrackInside;
259 }
260 if (fMC->IsTrackExiting()) {
261 status |= Hit::kTrackExiting;
262 }
263 if (fMC->IsTrackOut()) {
264 status |= Hit::kTrackOut;
265 }
266 if (fMC->IsTrackStop()) {
267 status |= Hit::kTrackStopped;
268 }
269 if (fMC->IsTrackAlive()) {
270 status |= Hit::kTrackAlive;
271 }
272
273 // track is entering or created in the volume
274 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
275 startHit = true;
276 } else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
277 stopHit = true;
278 }
279
280 // increment energy loss at all steps except entrance
281 if (!startHit) {
282 mTrackData.mEnergyLoss += fMC->Edep();
283 }
284 if (!(startHit | stopHit)) {
285 return false; // do noting
286 }
287
288 if (startHit) {
289 mTrackData.mEnergyLoss = 0.;
290 fMC->TrackMomentum(mTrackData.mMomentumStart);
291 fMC->TrackPosition(mTrackData.mPositionStart);
292 mTrackData.mTrkStatusStart = status;
293 mTrackData.mHitStarted = true;
294 }
295 if (stopHit) {
296 TLorentzVector positionStop;
297 fMC->TrackPosition(positionStop);
298 // Retrieve the indices with the volume path
299 int stave(0), halfstave(0), chipinmodule(0), module;
300 fMC->CurrentVolOffID(1, chipinmodule);
301 fMC->CurrentVolOffID(2, module);
302 fMC->CurrentVolOffID(3, halfstave);
303 fMC->CurrentVolOffID(4, stave);
304
305 Hit* p = addHit(stack->GetCurrentTrackNumber(), lay, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
306 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
307 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
308 // p->SetTotalEnergy(vmc->Etot());
309
310 // RS: not sure this is needed
311 // Increment number of Detector det points in TParticle
312 stack->addHit(GetDetId());
313 }
314
315 return true;
316}
317
318o2::itsmft::Hit* Detector::addHit(int trackID, int detID, const TVector3& startPos, const TVector3& endPos,
319 const TVector3& startMom, double startE, double endTime, double eLoss, unsigned char startStatus,
320 unsigned char endStatus)
321{
322 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
323 return &(mHits->back());
324}
325
327{ // Mere translation of Nicola's code
328 auto& richPars = RICHBaseParam::Instance();
329 LOGP(info, "Setting up {} layout for bRICH", richPars.oddGeom ? "odd" : "even");
330
331 bool isOdd = richPars.oddGeom;
332 mThetaBi.resize(richPars.nRings);
333 mR0Tilt.resize(richPars.nRings);
334 mZ0Tilt.resize(richPars.nRings);
335 mLAerogelZ.resize(richPars.nRings);
336 mTRplusG.resize(richPars.nRings);
337 mMinRadialMirror.resize(richPars.nRings);
338 mMaxRadialMirror.resize(richPars.nRings);
339 mMaxRadialRadiator.resize(richPars.nRings);
340 mVMirror1.resize(richPars.nRings);
341 mVMirror2.resize(richPars.nRings);
342 mVTile1.resize(richPars.nRings);
343 mVTile2.resize(richPars.nRings);
344 mR0Radiator.resize(richPars.nRings);
345 mR0PhotoDet.resize(richPars.nRings);
346
347 // Start from middle one
348 double mVal = TMath::Tan(0.0);
349 mThetaBi[richPars.nRings / 2] = TMath::ATan(mVal);
350 mR0Tilt[richPars.nRings / 2] = richPars.rMax;
351 mZ0Tilt[richPars.nRings / 2] = mR0Tilt[richPars.nRings / 2] * TMath::Tan(mThetaBi[richPars.nRings / 2]);
352 mLAerogelZ[richPars.nRings / 2] = isOdd ? TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMin * richPars.zBaseSize / (TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMax - mVal * richPars.zBaseSize) : 0.f;
353 mTRplusG[richPars.nRings / 2] = richPars.rMax - richPars.rMin;
354 double t = isOdd ? TMath::Tan(TMath::ATan(mVal) + TMath::ATan(richPars.zBaseSize / (2.0 * richPars.rMax * TMath::Sqrt(1.0 + mVal * mVal) - richPars.zBaseSize * mVal))) : 0.f;
355 mMinRadialMirror[richPars.nRings / 2] = richPars.rMax;
356 mMaxRadialRadiator[richPars.nRings / 2] = richPars.rMin;
357
358 // Configure rest of the rings
359 for (int iRing{richPars.nRings / 2 + 1}; iRing < richPars.nRings; ++iRing) {
360 double parA = t;
361 double parB = 2.0 * richPars.rMax / richPars.zBaseSize;
362 mVal = (TMath::Sqrt(parA * parA * parB * parB + parB * parB - 1.0) + parA * parB * parB) / (parB * parB - 1.0);
363 t = TMath::Tan(TMath::ATan(mVal) + TMath::ATan(richPars.zBaseSize / (2.0 * richPars.rMax * TMath::Sqrt(1.0 + mVal * mVal) - richPars.zBaseSize * mVal)));
364 // forward rings
365 mThetaBi[iRing] = TMath::ATan(mVal);
366 mR0Tilt[iRing] = richPars.rMax - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
367 mZ0Tilt[iRing] = mR0Tilt[iRing] * TMath::Tan(mThetaBi[iRing]);
368 mLAerogelZ[iRing] = TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMin * richPars.zBaseSize / (TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMax - mVal * richPars.zBaseSize);
369 mTRplusG[iRing] = TMath::Sqrt(1.0 + mVal * mVal) * (richPars.rMax - richPars.rMin) - mVal / 2.0 * (richPars.zBaseSize + mLAerogelZ[iRing]);
370 mMinRadialMirror[iRing] = mR0Tilt[iRing] - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
371 mMaxRadialRadiator[iRing] = richPars.rMin + 2.0 * mLAerogelZ[iRing] / 2.0 * sin(TMath::ATan(mVal));
372 // backward rings
373 mThetaBi[2 * (richPars.nRings / 2) - iRing] = -TMath::ATan(mVal);
374 mR0Tilt[2 * (richPars.nRings / 2) - iRing] = richPars.rMax - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
375 mZ0Tilt[2 * (richPars.nRings / 2) - iRing] = -mR0Tilt[iRing] * TMath::Tan(mThetaBi[iRing]);
376 mLAerogelZ[2 * (richPars.nRings / 2) - iRing] = TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMin * richPars.zBaseSize / (TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMax - mVal * richPars.zBaseSize);
377 mTRplusG[2 * (richPars.nRings / 2) - iRing] = TMath::Sqrt(1.0 + mVal * mVal) * (richPars.rMax - richPars.rMin) - mVal / 2.0 * (richPars.zBaseSize + mLAerogelZ[iRing]);
378 mMinRadialMirror[2 * (richPars.nRings / 2) - iRing] = mR0Tilt[iRing] - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
379 mMaxRadialRadiator[2 * (richPars.nRings / 2) - iRing] = richPars.rMin + 2.0 * mLAerogelZ[iRing] / 2.0 * sin(TMath::ATan(mVal));
380 }
381
382 // Dimensioning tiles
383 double percentage = 0.999;
384 for (int iRing = 0; iRing < richPars.nRings; iRing++) {
385 if (iRing == richPars.nRings / 2) {
386 mVMirror1[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
387 mVMirror2[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
388 mVTile1[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
389 mVTile2[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
390 } else if (iRing > richPars.nRings / 2) {
391 mVMirror1[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
392 mVMirror2[iRing] = percentage * 2.0 * mMinRadialMirror[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
393 mVTile1[iRing] = percentage * 2.0 * mMaxRadialRadiator[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
394 mVTile2[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
395 } else if (iRing < richPars.nRings / 2) {
396 mVMirror2[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
397 mVMirror1[iRing] = percentage * 2.0 * mMinRadialMirror[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
398 mVTile2[iRing] = percentage * 2.0 * mMaxRadialRadiator[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
399 mVTile1[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
400 }
401 }
402
403 // Translation parameters
404 for (size_t iRing{0}; iRing < richPars.nRings; ++iRing) {
405 mR0Radiator[iRing] = mR0Tilt[iRing] - (mTRplusG[iRing] - richPars.radiatorThickness / 2) * TMath::Cos(mThetaBi[iRing]);
406 mR0PhotoDet[iRing] = mR0Tilt[iRing] - (richPars.detectorThickness / 2) * TMath::Cos(mThetaBi[iRing]);
407 }
408
409 // FWD and BWD RICH
410 if (richPars.enableFWDRich) {
411 LOGP(info, "Setting up FWD RICH layout");
413 richPars.rFWDMin,
414 richPars.rFWDMax,
415 richPars.zAerogelMin,
416 richPars.zAerogelMax - richPars.zAerogelMin,
417 richPars.zArgonMin,
418 richPars.zArgonMax - richPars.zArgonMin,
419 richPars.zSiliconMin,
420 richPars.zSiliconMax - richPars.zSiliconMin);
421 }
422 if (richPars.enableBWDRich) {
423 LOGP(info, "Setting up BWD RICH layout");
425 richPars.rFWDMin,
426 richPars.rFWDMax,
427 richPars.zAerogelMin,
428 richPars.zAerogelMax - richPars.zAerogelMin,
429 richPars.zArgonMin,
430 richPars.zArgonMax - richPars.zArgonMin,
431 richPars.zSiliconMin,
432 richPars.zSiliconMax - richPars.zSiliconMin);
433 }
434}
435} // namespace rich
436} // namespace o2
437
Definition of the Stack class.
Definition of the ITSMFT Hit class.
uint32_t j
Definition RawData.h:0
uint32_t stack
Definition RawData.h:1
ClassImp(o2::rich::Detector)
void setUserId(Int_t userId)
void setTrackID(Int_t track)
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
void createBWDRich(TGeoVolume *motherVolume)
Definition RICHRing.cxx:237
void InitializeO2Detector() override
Definition Detector.cxx:181
std::vector< double > mZ0Tilt
Definition Detector.h:94
std::vector< double > mLAerogelZ
Definition Detector.h:95
std::vector< double > mR0PhotoDet
Definition Detector.h:105
std::vector< double > mVTile2
Definition Detector.h:103
std::vector< double > mR0Radiator
Definition Detector.h:104
std::vector< double > mThetaBi
Definition Detector.h:92
bool ProcessHits(FairVolume *v=nullptr) override
Definition Detector.cxx:233
void Register() override
Definition Detector.cxx:215
std::vector< double > mR0Tilt
Definition Detector.h:93
std::vector< double > mMaxRadialMirror
Definition Detector.h:98
std::vector< double > mVMirror2
Definition Detector.h:101
std::vector< double > mMaxRadialRadiator
Definition Detector.h:99
std::vector< double > mTRplusG
Definition Detector.h:96
std::vector< double > mMinRadialMirror
Definition Detector.h:97
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)
Definition Detector.cxx:318
std::vector< double > mVTile1
Definition Detector.h:102
void ConstructGeometry() override
Definition Detector.cxx:56
void EndOfEvent() override
Definition Detector.cxx:213
void Reset() override
Definition Detector.cxx:226
std::vector< double > mVMirror1
Definition Detector.h:100
void createFWDRich(TGeoVolume *motherVolume)
Definition RICHRing.cxx:197
static const char * getRICHSensorBWDPattern()
static const char * getRICHSensorPattern()
static GeometryTGeo * Instance()
static const char * getRICHVolPattern()
static const char * getRICHSensorFWDPattern()
static ShmManager & Instance()
Definition ShmManager.h:61
const GLdouble * v
Definition glcorearb.h:832
GLboolean * data
Definition glcorearb.h:298
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.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"