12#include <FairVolume.h>
14#include <TVirtualMC.h>
15#include <TVirtualMCStack.h>
16#include <TGeoVolume.h>
31 mHits(
o2::
utils::createSimVector<
o2::itsmft::Hit>())
38 mHits(
o2::
utils::createSimVector<
o2::itsmft::Hit>())
41 configLayers(iotofPars.enableInnerTOF, iotofPars.enableOuterTOF,
42 iotofPars.enableForwardTOF, iotofPars.enableBackwardTOF,
43 iotofPars.detectorPattern);
62 float radiusInnerTof = 19.f;
63 float radiusOuterTof = 85.f;
64 float lengthInnerTof = 124.f;
65 float lengthOuterTof = 680.f;
66 std::pair<float, float> radiusRangeDiskTof = {15.f, 100.f};
67 float zForwardTof = 370.f;
70 LOG(info) <<
"Configuring IOTOF layers with v3b pattern";
73 }
else if (
pattern ==
"v3b1a") {
74 lengthOuterTof = 500.f;
76 radiusRangeDiskTof = {30.f, 100.f};
77 }
else if (
pattern ==
"v3b1b") {
78 lengthOuterTof = 500.f;
80 radiusRangeDiskTof = {20.f, 68.f};
81 }
else if (
pattern ==
"v3b2a") {
82 lengthOuterTof = 440.f;
84 radiusRangeDiskTof = {30.f, 120.f};
85 }
else if (
pattern ==
"v3b2b") {
86 lengthOuterTof = 440.f;
88 radiusRangeDiskTof = {20.f, 68.f};
90 lengthOuterTof = 580.f;
92 radiusRangeDiskTof = {20.f, 68.f};
94 LOG(fatal) <<
"IOTOF layer pattern " <<
pattern <<
" not recognized, exiting";
120 float tmaxfdSi = 0.1;
121 float stemaxSi = 0.0075;
122 float deemaxSi = 0.1;
123 float epsilSi = 1.0E-4;
126 float tmaxfdAir = 0.1;
127 float stemaxAir = .10000E+01;
128 float deemaxAir = 0.1;
129 float epsilAir = 1.0E-4;
130 float stminAir = 0.0;
133 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
134 float zAir[4] = {6., 7., 8., 18.};
135 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
136 float dAir = 1.20479E-3;
139 o2::base::Detector::Medium(1,
"AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
142 o2::base::Detector::Medium(3,
"SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
147 TGeoManager* geoManager = gGeoManager;
148 TGeoVolume* vALIC = geoManager->GetVolume(
"barrel");
150 LOGP(fatal,
"Could not find barrel volume while constructing IOTOF geometry");
154 vALIC->AddNode(vIOTOF, 2,
new TGeoTranslation(0, 30., 0));
156 char vstrng[100] =
"IOTOFVol";
157 vIOTOF->SetTitle(vstrng);
160 if (iotofPars.enableInnerTOF) {
163 if (iotofPars.enableOuterTOF) {
166 if (iotofPars.enableForwardTOF) {
169 if (iotofPars.enableBackwardTOF) {
176 LOG(info) <<
"Initialize IOTOF O2Detector";
178 defineSensitiveVolumes();
181void Detector::defineSensitiveVolumes()
183 TGeoManager* geoManager = gGeoManager;
188 if (iotofPars.enableInnerTOF) {
190 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
191 AddSensitiveVolume(
v);
193 if (iotofPars.enableOuterTOF) {
195 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
196 AddSensitiveVolume(
v);
198 if (iotofPars.enableForwardTOF) {
200 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
201 AddSensitiveVolume(
v);
203 if (iotofPars.enableBackwardTOF) {
205 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
206 AddSensitiveVolume(
v);
218 if (FairRootManager::Instance()) {
219 FairRootManager::Instance()->RegisterAny(
addNameTo(
"Hit").
data(), mHits,
true);
233 if (!(fMC->TrackCharge())) {
237 int lay = vol->getVolumeId();
238 int volID = vol->getMCid();
242 if (fMC->IsTrackExiting() ) {
247 stack->addTrackReference(tr);
249 bool startHit =
false, stopHit =
false;
250 unsigned char status = 0;
251 if (fMC->IsTrackEntering()) {
254 if (fMC->IsTrackInside()) {
257 if (fMC->IsTrackExiting()) {
260 if (fMC->IsTrackOut()) {
263 if (fMC->IsTrackStop()) {
266 if (fMC->IsTrackAlive()) {
279 mTrackData.mEnergyLoss += fMC->Edep();
281 if (!(startHit | stopHit)) {
286 mTrackData.mEnergyLoss = 0.;
287 fMC->TrackMomentum(mTrackData.mMomentumStart);
288 fMC->TrackPosition(mTrackData.mPositionStart);
289 mTrackData.mTrkStatusStart = status;
290 mTrackData.mHitStarted =
true;
293 TLorentzVector positionStop;
294 fMC->TrackPosition(positionStop);
296 int stave(0), halfstave(0), chipinmodule(0),
module;
297 fMC->CurrentVolOffID(1, chipinmodule);
298 fMC->CurrentVolOffID(2, module);
299 fMC->CurrentVolOffID(3, halfstave);
300 fMC->CurrentVolOffID(4, stave);
303 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
304 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
308 stack->addHit(GetDetId());
315 const TVector3& startMom,
double startE,
double endTime,
double eLoss,
unsigned char startStatus,
316 unsigned char endStatus)
318 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
319 return &(mHits->back());
Definition of the Stack class.
Definition of the ITSMFT Hit class.
ClassImp(o2::hmpid::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)
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)
static void initFieldTrackingParams(int &mode, float &maxfield)
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)
std::string addNameTo(const char *ext) const
static const IOTOFBaseParam & Instance()
virtual void createLayer(TGeoVolume *motherVolume) override
bool ProcessHits(FairVolume *v=nullptr) override
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)
void ConstructGeometry() override
void InitializeO2Detector() override
void configLayers(bool itof=true, bool otof=true, bool ftof=true, bool btof=true, std::string pattern="")
void EndOfEvent() override
virtual void createLayer(TGeoVolume *motherVolume) override
static const char * getFTOFLayerPattern()
static const char * getIOTOFVolPattern()
static const char * getOTOFLayerPattern()
static const char * getFTOFSensorPattern()
static const char * getOTOFSensorPattern()
static const char * getITOFSensorPattern()
static const char * getBTOFLayerPattern()
static GeometryTGeo * Instance()
static const char * getITOFLayerPattern()
static const char * getBTOFSensorPattern()
virtual void createLayer(TGeoVolume *motherVolume) override
virtual void createLayer(TGeoVolume *motherVolume) override
static ShmManager & Instance()
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"
std::array< uint16_t, 5 > pattern