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);
229 if (!(fMC->TrackCharge())) {
233 int lay = vol->getVolumeId();
234 int volID = vol->getMCid();
238 if (fMC->IsTrackExiting() && (lay == 0 || lay == mRings.size() - 1)) {
243 stack->addTrackReference(tr);
245 bool startHit =
false, stopHit =
false;
246 unsigned char status = 0;
247 if (fMC->IsTrackEntering()) {
248 status |= Hit::kTrackEntering;
250 if (fMC->IsTrackInside()) {
251 status |= Hit::kTrackInside;
253 if (fMC->IsTrackExiting()) {
254 status |= Hit::kTrackExiting;
256 if (fMC->IsTrackOut()) {
257 status |= Hit::kTrackOut;
259 if (fMC->IsTrackStop()) {
260 status |= Hit::kTrackStopped;
262 if (fMC->IsTrackAlive()) {
263 status |= Hit::kTrackAlive;
267 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
269 }
else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
275 mTrackData.mEnergyLoss += fMC->Edep();
277 if (!(startHit | stopHit)) {
282 mTrackData.mEnergyLoss = 0.;
283 fMC->TrackMomentum(mTrackData.mMomentumStart);
284 fMC->TrackPosition(mTrackData.mPositionStart);
285 mTrackData.mTrkStatusStart = status;
286 mTrackData.mHitStarted =
true;
289 TLorentzVector positionStop;
290 fMC->TrackPosition(positionStop);
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);
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);
305 stack->addHit(GetDetId());
322 LOGP(info,
"Setting up {} layout for bRICH", richPars.oddGeom ?
"odd" :
"even");
324 bool isOdd = richPars.oddGeom;
326 mR0Tilt.resize(richPars.nRings);
327 mZ0Tilt.resize(richPars.nRings);
335 mVTile1.resize(richPars.nRings);
336 mVTile2.resize(richPars.nRings);
341 double mVal = TMath::Tan(0.0);
342 mThetaBi[richPars.nRings / 2] = TMath::ATan(mVal);
343 mR0Tilt[richPars.nRings / 2] = richPars.rMax;
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;
352 for (
int iRing{richPars.nRings / 2 + 1}; iRing < richPars.nRings; ++iRing) {
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)));
358 mThetaBi[iRing] = TMath::ATan(mVal);
359 mR0Tilt[iRing] = richPars.rMax - richPars.zBaseSize / 2.0 * sin(TMath::ATan(mVal));
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]);
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));
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));
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));
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));
392 mVTile1[iRing] = percentage * 2.0 * richPars.rMin * TMath::Sin(TMath::Pi() /
double(richPars.nTiles));
397 for (
size_t iRing{0}; iRing < richPars.nRings; ++iRing) {
403 if (richPars.enableFWDRich) {
404 LOGP(info,
"Setting up FWD RICH layout");
408 richPars.zAerogelMin,
409 richPars.zAerogelMax - richPars.zAerogelMin,
411 richPars.zArgonMax - richPars.zArgonMin,
412 richPars.zSiliconMin,
413 richPars.zSiliconMax - richPars.zSiliconMin);
415 if (richPars.enableBWDRich) {
416 LOGP(info,
"Setting up BWD RICH layout");
420 richPars.zAerogelMin,
421 richPars.zAerogelMax - richPars.zAerogelMin,
423 richPars.zArgonMax - richPars.zArgonMin,
424 richPars.zSiliconMin,
425 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)