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,
44 iotofPars.segmentedInnerTOF, iotofPars.segmentedOuterTOF, iotofPars.x2x0);
64 const float radiusInnerTof = 19.f;
65 const float radiusOuterTof = 85.f;
66 const float lengthInnerTof = 124.f;
67 float lengthOuterTof = 680.f;
68 std::pair<float, float> radiusRangeDiskTof = {15.f, 100.f};
69 float zForwardTof = 370.f;
70 LOG(info) <<
"Configuring IOTOF layers with '" <<
pattern <<
"' pattern";
72 LOG(info) <<
"Default pattern";
76 }
else if (
pattern ==
"v3b1a") {
77 lengthOuterTof = 500.f;
79 radiusRangeDiskTof = {30.f, 100.f};
80 }
else if (
pattern ==
"v3b1b") {
81 lengthOuterTof = 500.f;
83 radiusRangeDiskTof = {20.f, 68.f};
84 }
else if (
pattern ==
"v3b2a") {
85 lengthOuterTof = 440.f;
87 radiusRangeDiskTof = {30.f, 120.f};
88 }
else if (
pattern ==
"v3b2b") {
89 lengthOuterTof = 440.f;
91 radiusRangeDiskTof = {20.f, 68.f};
93 lengthOuterTof = 580.f;
95 radiusRangeDiskTof = {20.f, 68.f};
97 LOG(fatal) <<
"IOTOF layer pattern " <<
pattern <<
" not recognized, exiting";
115 radiusRangeDiskTof.first, radiusRangeDiskTof.second, 0.f, zForwardTof, x2x0,
FTOFLayer::kDisk);
119 radiusRangeDiskTof.first, radiusRangeDiskTof.second, 0.f, -zForwardTof, x2x0,
BTOFLayer::kDisk);
133 float tmaxfdSi = 0.1;
134 float stemaxSi = 0.0075;
135 float deemaxSi = 0.1;
136 float epsilSi = 1.0E-4;
139 float tmaxfdAir = 0.1;
140 float stemaxAir = .10000E+01;
141 float deemaxAir = 0.1;
142 float epsilAir = 1.0E-4;
143 float stminAir = 0.0;
146 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
147 float zAir[4] = {6., 7., 8., 18.};
148 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
149 float dAir = 1.20479E-3;
152 o2::base::Detector::Medium(1,
"AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
155 o2::base::Detector::Medium(3,
"SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
160 TGeoManager* geoManager = gGeoManager;
161 TGeoVolume* vALIC = geoManager->GetVolume(
"barrel");
163 LOGP(fatal,
"Could not find barrel volume while constructing IOTOF geometry");
167 vALIC->AddNode(vIOTOF, 2,
new TGeoTranslation(0, 30., 0));
169 char vstrng[100] =
"IOTOFVol";
170 vIOTOF->SetTitle(vstrng);
173 if (iotofPars.enableInnerTOF) {
176 if (iotofPars.enableOuterTOF) {
179 if (iotofPars.enableForwardTOF) {
182 if (iotofPars.enableBackwardTOF) {
189 LOG(info) <<
"Initialize IOTOF O2Detector";
191 defineSensitiveVolumes();
194void Detector::defineSensitiveVolumes()
196 TGeoManager* geoManager = gGeoManager;
201 if (iotofPars.enableInnerTOF) {
202 for (
const std::string& itofSensor :
ITOFLayer::mRegister) {
203 v = geoManager->GetVolume(itofSensor.c_str());
204 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
205 AddSensitiveVolume(
v);
208 if (iotofPars.enableOuterTOF) {
209 for (
const std::string& otofSensor : OTOFLayer::mRegister) {
210 v = geoManager->GetVolume(otofSensor.c_str());
211 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
212 AddSensitiveVolume(
v);
215 if (iotofPars.enableForwardTOF) {
217 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
218 AddSensitiveVolume(
v);
220 if (iotofPars.enableBackwardTOF) {
222 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
223 AddSensitiveVolume(
v);
235 if (FairRootManager::Instance()) {
236 FairRootManager::Instance()->RegisterAny(
addNameTo(
"Hit").
data(), mHits,
true);
250 if (!(fMC->TrackCharge())) {
254 int lay = vol->getVolumeId();
255 int volID = vol->getMCid();
259 if (fMC->IsTrackExiting() ) {
264 stack->addTrackReference(tr);
266 bool startHit =
false, stopHit =
false;
267 unsigned char status = 0;
268 if (fMC->IsTrackEntering()) {
271 if (fMC->IsTrackInside()) {
274 if (fMC->IsTrackExiting()) {
277 if (fMC->IsTrackOut()) {
280 if (fMC->IsTrackStop()) {
283 if (fMC->IsTrackAlive()) {
296 mTrackData.mEnergyLoss += fMC->Edep();
298 if (!(startHit | stopHit)) {
303 mTrackData.mEnergyLoss = 0.;
304 fMC->TrackMomentum(mTrackData.mMomentumStart);
305 fMC->TrackPosition(mTrackData.mPositionStart);
306 mTrackData.mTrkStatusStart = status;
307 mTrackData.mHitStarted =
true;
310 TLorentzVector positionStop;
311 fMC->TrackPosition(positionStop);
313 int stave(0), halfstave(0), chipinmodule(0),
module;
314 fMC->CurrentVolOffID(1, chipinmodule);
315 fMC->CurrentVolOffID(2, module);
316 fMC->CurrentVolOffID(3, halfstave);
317 fMC->CurrentVolOffID(4, stave);
320 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
321 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
325 stack->addHit(GetDetId());
332 const TVector3& startMom,
double startE,
double endTime,
double eLoss,
unsigned char startStatus,
333 unsigned char endStatus)
335 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
336 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 configLayers(bool itof=true, bool otof=true, bool ftof=true, bool btof=true, std::string pattern="", bool itofSegmented=false, bool otofSegmented=false, const float x2x0=0.02f)
void InitializeO2Detector() override
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 * getBTOFLayerPattern()
static GeometryTGeo * Instance()
static const char * getITOFLayerPattern()
static const char * getBTOFSensorPattern()
virtual void createLayer(TGeoVolume *motherVolume) override
static constexpr int kBarrelSegmented
static constexpr int kDisk
static constexpr int kBarrel
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