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);
61 const float x2x0,
const float sensorThickness)
64 const std::pair<float, float> dInnerTof = {21.f, 129.f};
65 std::pair<float, float> dOuterTof = {92.f, 680.f};
66 std::pair<float, float> radiusRangeDiskTof = {15.f, 100.f};
67 float zForwardTof = 370.f;
68 LOG(info) <<
"Configuring IOTOF layers with '" <<
pattern <<
"' pattern";
70 LOG(info) <<
"Default pattern";
74 }
else if (
pattern ==
"v3b1a") {
75 dOuterTof.second = 500.f;
77 radiusRangeDiskTof = {30.f, 100.f};
78 }
else if (
pattern ==
"v3b1b") {
79 dOuterTof.second = 500.f;
81 radiusRangeDiskTof = {20.f, 68.f};
82 }
else if (
pattern ==
"v3b2a") {
83 dOuterTof.second = 440.f;
85 radiusRangeDiskTof = {30.f, 120.f};
86 }
else if (
pattern ==
"v3b2b") {
87 dOuterTof.second = 440.f;
89 radiusRangeDiskTof = {20.f, 68.f};
91 dOuterTof.second = 580.f;
93 radiusRangeDiskTof = {20.f, 68.f};
95 LOG(fatal) <<
"IOTOF layer pattern " <<
pattern <<
" not recognized, exiting";
99 const int nStaves = itofSegmented ? 24 : 0;
100 const double staveWidth = itofSegmented ? 5.42 : 0.0;
101 const double staveTiltAngle = itofSegmented ? 3.0 : 0.0;
102 const int modulesPerStave = itofSegmented ? 10 : 0;
105 nStaves, staveWidth, staveTiltAngle, modulesPerStave, itofSegmented ? sensorThickness : 0.0f);
109 const int nStaves = otofSegmented ? 62 : 0;
110 const double staveWidth = otofSegmented ? 9.74 : 0.0;
111 const double staveTiltAngle = otofSegmented ? 5.0 : 0.0;
112 const int modulesPerStave = otofSegmented ? 54 : 0;
115 nStaves, staveWidth, staveTiltAngle, modulesPerStave, otofSegmented ? sensorThickness : 0.0f);
137 float tmaxfdSi = 0.1;
138 float stemaxSi = 0.0075;
139 float deemaxSi = 0.1;
140 float epsilSi = 1.0E-4;
143 float tmaxfdAir = 0.1;
144 float stemaxAir = .10000E+01;
145 float deemaxAir = 0.1;
146 float epsilAir = 1.0E-4;
147 float stminAir = 0.0;
150 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
151 float zAir[4] = {6., 7., 8., 18.};
152 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
153 float dAir = 1.20479E-3;
156 o2::base::Detector::Medium(1,
"AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
159 o2::base::Detector::Medium(3,
"SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
164 TGeoManager* geoManager = gGeoManager;
165 TGeoVolume* vALIC = geoManager->GetVolume(
"barrel");
167 LOGP(fatal,
"Could not find barrel volume while constructing IOTOF geometry");
171 vALIC->AddNode(vIOTOF, 2,
new TGeoTranslation(0, 30., 0));
173 char vstrng[100] =
"IOTOFVol";
174 vIOTOF->SetTitle(vstrng);
177 if (iotofPars.enableInnerTOF) {
180 if (iotofPars.enableOuterTOF) {
183 if (iotofPars.enableForwardTOF) {
186 if (iotofPars.enableBackwardTOF) {
193 LOG(info) <<
"Initialize IOTOF O2Detector";
195 defineSensitiveVolumes();
198void Detector::defineSensitiveVolumes()
200 TGeoManager* geoManager = gGeoManager;
205 if (iotofPars.enableInnerTOF) {
206 for (
const std::string& itofSensor :
ITOFLayer::mRegister) {
207 v = geoManager->GetVolume(itofSensor.c_str());
208 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
209 AddSensitiveVolume(
v);
212 if (iotofPars.enableOuterTOF) {
213 for (
const std::string& otofSensor : OTOFLayer::mRegister) {
214 v = geoManager->GetVolume(otofSensor.c_str());
215 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
216 AddSensitiveVolume(
v);
219 if (iotofPars.enableForwardTOF) {
221 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
222 AddSensitiveVolume(
v);
224 if (iotofPars.enableBackwardTOF) {
226 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
227 AddSensitiveVolume(
v);
239 if (FairRootManager::Instance()) {
240 FairRootManager::Instance()->RegisterAny(
addNameTo(
"Hit").
data(), mHits,
true);
254 if (!(fMC->TrackCharge())) {
258 int lay = vol->getVolumeId();
259 int volID = vol->getMCid();
263 if (fMC->IsTrackExiting() ) {
268 stack->addTrackReference(tr);
270 bool startHit =
false, stopHit =
false;
271 unsigned char status = 0;
272 if (fMC->IsTrackEntering()) {
275 if (fMC->IsTrackInside()) {
278 if (fMC->IsTrackExiting()) {
281 if (fMC->IsTrackOut()) {
284 if (fMC->IsTrackStop()) {
287 if (fMC->IsTrackAlive()) {
300 mTrackData.mEnergyLoss += fMC->Edep();
302 if (!(startHit | stopHit)) {
307 mTrackData.mEnergyLoss = 0.;
308 fMC->TrackMomentum(mTrackData.mMomentumStart);
309 fMC->TrackPosition(mTrackData.mPositionStart);
310 mTrackData.mTrkStatusStart = status;
311 mTrackData.mHitStarted =
true;
314 TLorentzVector positionStop;
315 fMC->TrackPosition(positionStop);
317 int stave(0), halfstave(0), chipinmodule(0),
module;
318 fMC->CurrentVolOffID(1, chipinmodule);
319 fMC->CurrentVolOffID(2, module);
320 fMC->CurrentVolOffID(3, halfstave);
321 fMC->CurrentVolOffID(4, stave);
324 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
325 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
329 stack->addHit(GetDetId());
336 const TVector3& startMom,
double startE,
double endTime,
double eLoss,
unsigned char startStatus,
337 unsigned char endStatus)
339 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
340 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
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, const float sensorThickness=0.0050f)
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 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()
GLuint const GLchar * name
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