65 float tmaxfdPolys = 0.1;
66 float stemaxPolys = .10000E+01;
67 float deemaxPolys = 0.1;
68 float epsilPolys = 1.0E-4;
69 float stminPolys = 0.0;
73 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
74 float zAir[4] = {6., 7., 8., 18.};
75 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
76 float dAir = 1.20479E-3;
77 float dAir1 = 1.20479E-10;
80 o2::base::Detector::Medium(0,
"AIR", 0, 0, ifield, fieldm, tmaxfdPolys, stemaxPolys, deemaxPolys, epsilPolys, stminPolys);
83 float aPolys[2] = {1.0080, 12.0107};
84 float zPolys[2] = {1.f, 6};
85 float wPolys[2] = {0.077418, 0.922582};
89 o2::base::Detector::Medium(1,
"POLYSTYRENE", 1, 0, ifield, fieldm, tmaxfdPolys, stemaxPolys, deemaxPolys, epsilPolys, stminPolys);
126 LOGP(info,
"Creating MID geometry");
128 TGeoManager* geoManager = gGeoManager;
129 TGeoVolume* vALIC = geoManager->GetVolume(
"barrel");
131 LOGP(fatal,
"Could not find barrel volume while constructing MID geometry");
135 vALIC->AddNode(vMID, 2,
new TGeoTranslation(0, 30., 0));
137 char vstrng[100] =
"MIDVol";
138 vMID->SetTitle(vstrng);
144 if (standardRadius) {
155 constexpr float kAbsGap = 11.f;
156 constexpr float kPitch = 10.f;
157 constexpr float kRCen0 = 290.f + kAbsGap;
158 constexpr float kRCen1 = kRCen0 + kPitch;
159 constexpr float kRExt0 = 265.f + kAbsGap;
160 constexpr float kRExt1 = kRExt0 + kPitch;
163 mLayers[0] =
MIDLayer(0,
"MIDLayer0_central", kRCen0, 299.4f, 16, 0.f, 6);
164 mLayers[1] =
MIDLayer(1,
"MIDLayer1_central", kRCen1, 312.f, 16, 0.f, 6);
165 mLayers[2] =
MIDLayer(2,
"MIDLayer0_forward", kRExt0, 99.8f, 16, +400.f, 2, -1.f, 21);
166 mLayers[3] =
MIDLayer(3,
"MIDLayer1_forward", kRExt1, 104.f, 16, +405.f, 2);
167 mLayers[4] =
MIDLayer(4,
"MIDLayer0_backward", kRExt0, 99.8f, 16, -400.f, 2, -1.f, 21);
168 mLayers[5] =
MIDLayer(5,
"MIDLayer1_backward", kRExt1, 104.f, 16, -405.f, 2);
176 layer.createLayer(vMID);
191 if (!(fMC->TrackCharge())) {
195 int lay = vol->getVolumeId();
196 int volID = vol->getMCid();
204 const char* volName = fMC->CurrentVolName();
205 sscanf(volName,
"MIDSensor_L%d", &physLay);
207 physLay = physLay % 2;
209 bool startHit =
false, stopHit =
false;
210 unsigned char status = 0;
211 if (fMC->IsTrackEntering()) {
212 status |= Hit::kTrackEntering;
214 if (fMC->IsTrackInside()) {
215 status |= Hit::kTrackInside;
217 if (fMC->IsTrackExiting()) {
218 status |= Hit::kTrackExiting;
220 if (fMC->IsTrackOut()) {
221 status |= Hit::kTrackOut;
223 if (fMC->IsTrackStop()) {
224 status |= Hit::kTrackStopped;
226 if (fMC->IsTrackAlive()) {
227 status |= Hit::kTrackAlive;
231 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
233 }
else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
239 mTrackData.mEnergyLoss += fMC->Edep();
241 if (!(startHit | stopHit)) {
246 mTrackData.mEnergyLoss = 0.;
247 fMC->TrackMomentum(mTrackData.mMomentumStart);
248 fMC->TrackPosition(mTrackData.mPositionStart);
249 mTrackData.mTrkStatusStart = status;
250 mTrackData.mHitStarted =
true;
253 TLorentzVector positionStop;
254 fMC->TrackPosition(positionStop);
262 LOGP(warn,
"MID sensor name {} did not match expected pattern, cannot extract physical layer index", volName);
265 Hit* p =
addHit(
stack->GetCurrentTrackNumber(), physLay, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
266 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
267 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
272 stack->addHit(GetDetId());
279 const TVector3& startMom,
double startE,
double endTime,
double eLoss,
unsigned char startStatus,
280 unsigned char endStatus)
282 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
283 return &(mHits->back());
void Mixture(Int_t imat, const char *name, Float_t *a, Float_t *z, Float_t dens, Int_t nlmat, Float_t *wmat)
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)
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)