12#include <FairVolume.h>
14#include <TVirtualMC.h>
15#include <TVirtualMCStack.h>
16#include <TGeoVolume.h>
43 configLayers(iotofPars.enableInnerTOF, iotofPars.enableOuterTOF, iotofPars.enableForwardTOF);
86 float stemaxSi = 0.0075;
88 float epsilSi = 1.0E-4;
91 float tmaxfdAir = 0.1;
92 float stemaxAir = .10000E+01;
93 float deemaxAir = 0.1;
94 float epsilAir = 1.0E-4;
98 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
99 float zAir[4] = {6., 7., 8., 18.};
100 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
101 float dAir = 1.20479E-3;
104 o2::base::Detector::Medium(1,
"AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
107 o2::base::Detector::Medium(3,
"SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
112 TGeoManager* geoManager = gGeoManager;
113 TGeoVolume* vALIC = geoManager->GetVolume(
"barrel");
115 LOGP(fatal,
"Could not find barrel volume while constructing IOTOF geometry");
119 vALIC->AddNode(vIOTOF, 2,
new TGeoTranslation(0, 30., 0));
121 char vstrng[100] =
"IOTOFVol";
122 vIOTOF->SetTitle(vstrng);
125 if (iotofPars.enableInnerTOF) {
128 if (iotofPars.enableOuterTOF) {
131 if (iotofPars.enableForwardTOF) {
134 if (iotofPars.enableBackwardTOF) {
141 LOG(info) <<
"Initialize IOTOF O2Detector";
143 defineSensitiveVolumes();
146void Detector::defineSensitiveVolumes()
148 TGeoManager* geoManager = gGeoManager;
153 if (iotofPars.enableInnerTOF) {
155 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
156 AddSensitiveVolume(
v);
158 if (iotofPars.enableOuterTOF) {
160 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
161 AddSensitiveVolume(
v);
163 if (iotofPars.enableForwardTOF) {
165 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
166 AddSensitiveVolume(
v);
168 if (iotofPars.enableBackwardTOF) {
170 LOGP(info,
"Adding IOTOF Sensitive Volume {}",
v->GetName());
171 AddSensitiveVolume(
v);
183 if (FairRootManager::Instance()) {
184 FairRootManager::Instance()->RegisterAny(
addNameTo(
"Hit").
data(), mHits,
true);
198 if (!(fMC->TrackCharge())) {
202 int lay = vol->getVolumeId();
203 int volID = vol->getMCid();
207 if (fMC->IsTrackExiting() ) {
212 stack->addTrackReference(tr);
214 bool startHit =
false, stopHit =
false;
215 unsigned char status = 0;
216 if (fMC->IsTrackEntering()) {
217 status |= Hit::kTrackEntering;
219 if (fMC->IsTrackInside()) {
220 status |= Hit::kTrackInside;
222 if (fMC->IsTrackExiting()) {
223 status |= Hit::kTrackExiting;
225 if (fMC->IsTrackOut()) {
226 status |= Hit::kTrackOut;
228 if (fMC->IsTrackStop()) {
229 status |= Hit::kTrackStopped;
231 if (fMC->IsTrackAlive()) {
232 status |= Hit::kTrackAlive;
236 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
238 }
else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
244 mTrackData.mEnergyLoss += fMC->Edep();
246 if (!(startHit | stopHit)) {
251 mTrackData.mEnergyLoss = 0.;
252 fMC->TrackMomentum(mTrackData.mMomentumStart);
253 fMC->TrackPosition(mTrackData.mPositionStart);
254 mTrackData.mTrkStatusStart = status;
255 mTrackData.mHitStarted =
true;
258 TLorentzVector positionStop;
259 fMC->TrackPosition(positionStop);
261 int stave(0), halfstave(0), chipinmodule(0),
module;
262 fMC->CurrentVolOffID(1, chipinmodule);
263 fMC->CurrentVolOffID(2, module);
264 fMC->CurrentVolOffID(3, halfstave);
265 fMC->CurrentVolOffID(4, stave);
267 Hit* p =
addHit(
stack->GetCurrentTrackNumber(), lay, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
268 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
269 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
273 stack->addHit(GetDetId());
280 const TVector3& startMom,
double startE,
double endTime,
double eLoss,
unsigned char startStatus,
281 unsigned char endStatus)
283 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
284 return &(mHits->back());
Definition of the Stack class.
Definition of the ITSMFT Hit class.
ClassImp(o2::iotof::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
void configLayers(bool itof=true, bool otof=true, bool ftof=true, bool btof=true)
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 * 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"