69 float stemaxSi = 0.0075;
71 float epsilSi = 1.0E-4;
74 float tmaxfdAir = 0.1;
75 float stemaxAir = .10000E+01;
76 float deemaxAir = 0.1;
77 float epsilAir = 1.0E-4;
80 float tmaxfdCer = 0.1;
81 float stemaxCer = .10000E+01;
82 float deemaxCer = 0.1;
83 float epsilCer = 1.0E-4;
86 float tmaxfdAerogel = 0.1;
87 float stemaxAerogel = .10000E+01;
88 float deemaxAerogel = 0.1;
89 float epsilAerogel = 1.0E-4;
90 float stminAerogel = 0.0;
92 float tmaxfdArgon = 0.1;
93 float stemaxArgon = .10000E+01;
94 float deemaxArgon = 0.1;
95 float epsilArgon = 1.0E-4;
96 float stminArgon = 0.0;
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;
105 float aCf[2] = {12.0107, 1.00794};
106 float zCf[2] = {6., 1.};
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;
115 float aArgon = 39.948;
118 float dArgon = 1.782E-3;
121 o2::base::Detector::Medium(1,
"AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
124 o2::base::Detector::Medium(3,
"SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
127 o2::base::Detector::Medium(2,
"AEROGEL$", 2, 0, ifield, fieldm, tmaxfdAerogel, stemaxAerogel, deemaxAerogel, epsilAerogel, stminAerogel);
130 o2::base::Detector::Medium(4,
"ARGON$", 4, 0, ifield, fieldm, tmaxfdArgon, stemaxArgon, deemaxArgon, epsilArgon, stminArgon);
236 if (!(fMC->TrackCharge())) {
240 int lay = vol->getVolumeId();
241 int volID = vol->getMCid();
245 if (fMC->IsTrackExiting() && (lay == 0 || lay == mRings.size() - 1)) {
250 stack->addTrackReference(tr);
252 bool startHit =
false, stopHit =
false;
253 unsigned char status = 0;
254 if (fMC->IsTrackEntering()) {
255 status |= Hit::kTrackEntering;
257 if (fMC->IsTrackInside()) {
258 status |= Hit::kTrackInside;
260 if (fMC->IsTrackExiting()) {
261 status |= Hit::kTrackExiting;
263 if (fMC->IsTrackOut()) {
264 status |= Hit::kTrackOut;
266 if (fMC->IsTrackStop()) {
267 status |= Hit::kTrackStopped;
269 if (fMC->IsTrackAlive()) {
270 status |= Hit::kTrackAlive;
274 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
276 }
else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
282 mTrackData.mEnergyLoss += fMC->Edep();
284 if (!(startHit | stopHit)) {
289 mTrackData.mEnergyLoss = 0.;
290 fMC->TrackMomentum(mTrackData.mMomentumStart);
291 fMC->TrackPosition(mTrackData.mPositionStart);
292 mTrackData.mTrkStatusStart = status;
293 mTrackData.mHitStarted =
true;
296 TLorentzVector positionStop;
297 fMC->TrackPosition(positionStop);
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);
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);
312 stack->addHit(GetDetId());
329 LOGP(info,
"Setting up {} layout for bRICH", richPars.oddGeom ?
"odd" :
"even");
331 bool isOdd = richPars.oddGeom;
333 mR0Tilt.resize(richPars.nRings);
334 mZ0Tilt.resize(richPars.nRings);
342 mVTile1.resize(richPars.nRings);
343 mVTile2.resize(richPars.nRings);
348 double mVal = TMath::Tan(0.0);
349 mThetaBi[richPars.nRings / 2] = TMath::ATan(mVal);
350 mR0Tilt[richPars.nRings / 2] = richPars.rMax;
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;
359 for (
int iRing{richPars.nRings / 2 + 1}; iRing < richPars.nRings; ++iRing) {
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)));
365 mThetaBi[iRing] = TMath::ATan(mVal);
366 mR0Tilt[iRing] = richPars.rMax - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
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]);
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));
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));
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));
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));
399 mVTile1[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() /
double(richPars.nTiles));
404 for (
size_t iRing{0}; iRing < richPars.nRings; ++iRing) {
410 if (richPars.enableFWDRich) {
411 LOGP(info,
"Setting up FWD RICH layout");
415 richPars.zAerogelMin,
416 richPars.zAerogelMax - richPars.zAerogelMin,
418 richPars.zArgonMax - richPars.zArgonMin,
419 richPars.zSiliconMin,
420 richPars.zSiliconMax - richPars.zSiliconMin);
422 if (richPars.enableBWDRich) {
423 LOGP(info,
"Setting up BWD RICH layout");
427 richPars.zAerogelMin,
428 richPars.zAerogelMax - richPars.zAerogelMin,
430 richPars.zArgonMax - richPars.zArgonMin,
431 richPars.zSiliconMin,
432 richPars.zSiliconMax - richPars.zSiliconMin);
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)