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
149
150 for (int iRing{0}; iRing < richPars.nRings; ++iRing) {
151 if (!richPars.oddGeom && iRing == (richPars.nRings / 2)) {
152 continue;
153 }
154 mRings[iRing] = 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 (int j{0}; j < mRings.size(); j++) {
198 volumeName = GeometryTGeo::getRICHSensorPattern() + TString::Itoa(j, 10);
199 LOGP(info, "Trying {}", volumeName.Data());
200 v = geoManager->GetVolume(volumeName.Data());
201 LOGP(info, "Adding RICH Sensitive Volume {}", v->GetName());
202 AddSensitiveVolume(v);
203 }
204}
205
207
209{
210 // This will create a branch in the output tree called Hit, setting the last
211 // parameter to kFALSE means that this collection will not be written to the file,
212 // it will exist only during the simulation
213
214 if (FairRootManager::Instance()) {
215 FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, true);
216 }
217}
218
220{
221 if (!o2::utils::ShmManager::Instance().isOperational()) {
222 mHits->clear();
223 }
224}
225
226bool Detector::ProcessHits(FairVolume* vol)
227{
228 // This method is called from the MC stepping
229 if (!(fMC->TrackCharge())) {
230 return false;
231 }
232
233 int lay = vol->getVolumeId();
234 int volID = vol->getMCid();
235
236 // Is it needed to keep a track reference when the outer ITS volume is encountered?
237 auto stack = (o2::data::Stack*)fMC->GetStack();
238 if (fMC->IsTrackExiting() && (lay == 0 || lay == mRings.size() - 1)) {
239 // Keep the track refs for the innermost and outermost rings only
240 o2::TrackReference tr(*fMC, GetDetId());
241 tr.setTrackID(stack->GetCurrentTrackNumber());
242 tr.setUserId(lay);
243 stack->addTrackReference(tr);
244 }
245 bool startHit = false, stopHit = false;
246 unsigned char status = 0;
247 if (fMC->IsTrackEntering()) {
248 status |= Hit::kTrackEntering;
249 }
250 if (fMC->IsTrackInside()) {
251 status |= Hit::kTrackInside;
252 }
253 if (fMC->IsTrackExiting()) {
254 status |= Hit::kTrackExiting;
255 }
256 if (fMC->IsTrackOut()) {
257 status |= Hit::kTrackOut;
258 }
259 if (fMC->IsTrackStop()) {
260 status |= Hit::kTrackStopped;
261 }
262 if (fMC->IsTrackAlive()) {
263 status |= Hit::kTrackAlive;
264 }
265
266 // track is entering or created in the volume
267 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
268 startHit = true;
269 } else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
270 stopHit = true;
271 }
272
273 // increment energy loss at all steps except entrance
274 if (!startHit) {
275 mTrackData.mEnergyLoss += fMC->Edep();
276 }
277 if (!(startHit | stopHit)) {
278 return false; // do noting
279 }
280
281 if (startHit) {
282 mTrackData.mEnergyLoss = 0.;
283 fMC->TrackMomentum(mTrackData.mMomentumStart);
284 fMC->TrackPosition(mTrackData.mPositionStart);
285 mTrackData.mTrkStatusStart = status;
286 mTrackData.mHitStarted = true;
287 }
288 if (stopHit) {
289 TLorentzVector positionStop;
290 fMC->TrackPosition(positionStop);
291 // Retrieve the indices with the volume path
292 int stave(0), halfstave(0), chipinmodule(0), module;
293 fMC->CurrentVolOffID(1, chipinmodule);
294 fMC->CurrentVolOffID(2, module);
295 fMC->CurrentVolOffID(3, halfstave);
296 fMC->CurrentVolOffID(4, stave);
297
298 Hit* p = addHit(stack->GetCurrentTrackNumber(), lay, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
299 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
300 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
301 // p->SetTotalEnergy(vmc->Etot());
302
303 // RS: not sure this is needed
304 // Increment number of Detector det points in TParticle
305 stack->addHit(GetDetId());
306 }
307
308 return true;
309}
310
311o2::itsmft::Hit* Detector::addHit(int trackID, int detID, const TVector3& startPos, const TVector3& endPos,
312 const TVector3& startMom, double startE, double endTime, double eLoss, unsigned char startStatus,
313 unsigned char endStatus)
314{
315 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
316 return &(mHits->back());
317}
318
320{ // Mere translation of Nicola's code
321 auto& richPars = RICHBaseParam::Instance();
322 LOGP(info, "Setting up {} layout for bRICH", richPars.oddGeom ? "odd" : "even");
323
324 bool isOdd = richPars.oddGeom;
325 mThetaBi.resize(richPars.nRings);
326 mR0Tilt.resize(richPars.nRings);
327 mZ0Tilt.resize(richPars.nRings);
328 mLAerogelZ.resize(richPars.nRings);
329 mTRplusG.resize(richPars.nRings);
330 mMinRadialMirror.resize(richPars.nRings);
331 mMaxRadialMirror.resize(richPars.nRings);
332 mMaxRadialRadiator.resize(richPars.nRings);
333 mVMirror1.resize(richPars.nRings);
334 mVMirror2.resize(richPars.nRings);
335 mVTile1.resize(richPars.nRings);
336 mVTile2.resize(richPars.nRings);
337 mR0Radiator.resize(richPars.nRings);
338 mR0PhotoDet.resize(richPars.nRings);
339
340 // Start from middle one
341 double mVal = TMath::Tan(0.0);
342 mThetaBi[richPars.nRings / 2] = TMath::ATan(mVal);
343 mR0Tilt[richPars.nRings / 2] = richPars.rMax;
344 mZ0Tilt[richPars.nRings / 2] = mR0Tilt[richPars.nRings / 2] * TMath::Tan(mThetaBi[richPars.nRings / 2]);
345 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;
346 mTRplusG[richPars.nRings / 2] = richPars.rMax - richPars.rMin;
347 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;
348 mMinRadialMirror[richPars.nRings / 2] = richPars.rMax;
349 mMaxRadialRadiator[richPars.nRings / 2] = richPars.rMin;
350
351 // Configure rest of the rings
352 for (int iRing{richPars.nRings / 2 + 1}; iRing < richPars.nRings; ++iRing) {
353 double parA = t;
354 double parB = 2.0 * richPars.rMax / richPars.zBaseSize;
355 mVal = (TMath::Sqrt(parA * parA * parB * parB + parB * parB - 1.0) + parA * parB * parB) / (parB * parB - 1.0);
356 t = TMath::Tan(TMath::ATan(mVal) + TMath::ATan(richPars.zBaseSize / (2.0 * richPars.rMax * TMath::Sqrt(1.0 + mVal * mVal) - richPars.zBaseSize * mVal)));
357 // forward rings
358 mThetaBi[iRing] = TMath::ATan(mVal);
359 mR0Tilt[iRing] = richPars.rMax - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
360 mZ0Tilt[iRing] = mR0Tilt[iRing] * TMath::Tan(mThetaBi[iRing]);
361 mLAerogelZ[iRing] = TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMin * richPars.zBaseSize / (TMath::Sqrt(1.0 + mVal * mVal) * richPars.rMax - mVal * richPars.zBaseSize);
362 mTRplusG[iRing] = TMath::Sqrt(1.0 + mVal * mVal) * (richPars.rMax - richPars.rMin) - mVal / 2.0 * (richPars.zBaseSize + mLAerogelZ[iRing]);
363 mMinRadialMirror[iRing] = mR0Tilt[iRing] - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
364 mMaxRadialRadiator[iRing] = richPars.rMin + 2.0 * mLAerogelZ[iRing] / 2.0 * sin(TMath::ATan(mVal));
365 // backward rings
366 mThetaBi[2 * (richPars.nRings / 2) - iRing] = -TMath::ATan(mVal);
367 mR0Tilt[2 * (richPars.nRings / 2) - iRing] = richPars.rMax - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
368 mZ0Tilt[2 * (richPars.nRings / 2) - iRing] = -mR0Tilt[iRing] * TMath::Tan(mThetaBi[iRing]);
369 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);
370 mTRplusG[2 * (richPars.nRings / 2) - iRing] = TMath::Sqrt(1.0 + mVal * mVal) * (richPars.rMax - richPars.rMin) - mVal / 2.0 * (richPars.zBaseSize + mLAerogelZ[iRing]);
371 mMinRadialMirror[2 * (richPars.nRings / 2) - iRing] = mR0Tilt[iRing] - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
372 mMaxRadialRadiator[2 * (richPars.nRings / 2) - iRing] = richPars.rMin + 2.0 * mLAerogelZ[iRing] / 2.0 * sin(TMath::ATan(mVal));
373 }
374
375 // Dimensioning tiles
376 double percentage = 0.999;
377 for (int iRing = 0; iRing < richPars.nRings; iRing++) {
378 if (iRing == richPars.nRings / 2) {
379 mVMirror1[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
380 mVMirror2[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
381 mVTile1[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
382 mVTile2[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
383 } else if (iRing > richPars.nRings / 2) {
384 mVMirror1[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
385 mVMirror2[iRing] = percentage * 2.0 * mMinRadialMirror[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
386 mVTile1[iRing] = percentage * 2.0 * mMaxRadialRadiator[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
387 mVTile2[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
388 } else if (iRing < richPars.nRings / 2) {
389 mVMirror2[iRing] = percentage * 2.0 * richPars.rMax * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
390 mVMirror1[iRing] = percentage * 2.0 * mMinRadialMirror[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
391 mVTile2[iRing] = percentage * 2.0 * mMaxRadialRadiator[iRing] * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
392 mVTile1[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() / double(richPars.nTiles));
393 }
394 }
395
396 // Translation parameters
397 for (size_t iRing{0}; iRing < richPars.nRings; ++iRing) {
398 mR0Radiator[iRing] = mR0Tilt[iRing] - (mTRplusG[iRing] - richPars.radiatorThickness / 2) * TMath::Cos(mThetaBi[iRing]);
399 mR0PhotoDet[iRing] = mR0Tilt[iRing] - (richPars.detectorThickness / 2) * TMath::Cos(mThetaBi[iRing]);
400 }
401
402 // FWD and BWD RICH
403 if (richPars.enableFWDRich) {
404 LOGP(info, "Setting up FWD RICH layout");
406 richPars.rFWDMin,
407 richPars.rFWDMax,
408 richPars.zAerogelMin,
409 richPars.zAerogelMax - richPars.zAerogelMin,
410 richPars.zArgonMin,
411 richPars.zArgonMax - richPars.zArgonMin,
412 richPars.zSiliconMin,
413 richPars.zSiliconMax - richPars.zSiliconMin);
414 }
415 if (richPars.enableBWDRich) {
416 LOGP(info, "Setting up BWD RICH layout");
418 richPars.rFWDMin,
419 richPars.rFWDMax,
420 richPars.zAerogelMin,
421 richPars.zAerogelMax - richPars.zAerogelMin,
422 richPars.zArgonMin,
423 richPars.zArgonMax - richPars.zArgonMin,
424 richPars.zSiliconMin,
425 richPars.zSiliconMax - richPars.zSiliconMin);
426 }
427}
428} // namespace rich
429} // namespace o2
430
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:226
void Register() override
Definition Detector.cxx:208
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:311
std::vector< double > mVTile1
Definition Detector.h:102
void ConstructGeometry() override
Definition Detector.cxx:56
void EndOfEvent() override
Definition Detector.cxx:206
void Reset() override
Definition Detector.cxx:219
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"