12#include <FairVolume.h>
14#include <TVirtualMC.h>
15#include <TVirtualMCStack.h>
16#include <TGeoVolume.h>
31 return 2. * (10. + radius * std::cos(2 * std::atan(std::exp(-eta))));
48 if (trkPars.configFile !=
"") {
56 LOGP(info,
"Summary of TRK configuration:");
57 for (
auto&
layer : mLayers) {
58 LOGP(info,
"Layer: {} name: {} r: {} cm | z: {} cm | thickness: {} cm",
layer.getNumber(),
layer.getName(),
layer.getInnerRadius(),
layer.getZ(),
layer.getChipThickness());
82 LOGP(warning,
"Loading Scoping Document configuration for ALICE3 TRK");
105 LOGP(warning,
"Loading \"After Upgrade Days March 2024\" configuration for ALICE3 TRK");
121 mLayers[3].setLayout(trkPars.layoutML);
122 mLayers[4].setLayout(trkPars.layoutML);
123 mLayers[5].setLayout(trkPars.layoutML);
124 mLayers[6].setLayout(trkPars.layoutML);
127 mLayers[7].setLayout(trkPars.layoutOL);
128 mLayers[8].setLayout(trkPars.layoutOL);
129 mLayers[9].setLayout(trkPars.layoutOL);
130 mLayers[10].setLayout(trkPars.layoutOL);
136 std::ifstream confFile(fileName);
137 if (!confFile.good()) {
138 LOGP(fatal,
"File {} not found, aborting.", fileName);
143 LOGP(info,
"Overriding geometry of ALICE3 TRK using {} file.", fileName);
146 std::vector<float> tmpBuff;
148 while (std::getline(confFile, line)) {
149 if (line[0] ==
'/') {
153 std::stringstream ss(line);
156 while (getline(ss, substr,
'\t')) {
157 tmpBuff.push_back(std::stof(substr));
166 LOGP(info,
"Exporting TRK Detector layout to {}", fileName);
167 std::ofstream conFile(fileName.c_str(), std::ios::out);
168 conFile <<
"/// TRK configuration file: inn_radius z_length lay_thickness" << std::endl;
169 for (
auto layer : mLayers) {
170 conFile <<
layer.getInnerRadius() <<
"\t" <<
layer.getZ() <<
"\t" <<
layer.getChipThickness() << std::endl;
185 float tmaxfdSi = 0.1;
186 float stemaxSi = 0.0075;
187 float deemaxSi = 0.1;
188 float epsilSi = 1.0E-4;
191 float tmaxfdAir = 0.1;
192 float stemaxAir = .10000E+01;
193 float deemaxAir = 0.1;
194 float epsilAir = 1.0E-4;
195 float stminAir = 0.0;
197 float tmaxfdCer = 0.1;
198 float stemaxCer = .10000E+01;
199 float deemaxCer = 0.1;
200 float epsilCer = 1.0E-4;
201 float stminCer = 0.0;
204 float aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
205 float zAir[4] = {6., 7., 8., 18.};
206 float wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
207 float dAir = 1.20479E-3;
210 float aCf[2] = {12.0107, 1.00794};
211 float zCf[2] = {6., 1.};
214 o2::base::Detector::Medium(1,
"AIR$", 1, 0, ifield, fieldm, tmaxfdAir, stemaxAir, deemaxAir, epsilAir, stminAir);
217 o2::base::Detector::Medium(3,
"SILICON$", 3, 0, ifield, fieldm, tmaxfdSi, stemaxSi, deemaxSi, epsilSi, stminSi);
222 TGeoManager* geoManager = gGeoManager;
223 TGeoVolume* vALIC = geoManager->GetVolume(
"barrel");
225 LOGP(fatal,
"Could not find barrel volume while constructing TRK geometry");
229 vALIC->AddNode(vTRK, 2,
new TGeoTranslation(0, 30., 0));
231 char vstrng[100] =
"TRKVol";
232 vTRK->SetTitle(vstrng);
234 for (
auto&
layer : mLayers) {
235 layer.createLayer(vTRK);
244 LOG(info) <<
"Initialize TRK O2Detector";
246 defineSensitiveVolumes();
249void Detector::defineSensitiveVolumes()
251 TGeoManager* geoManager = gGeoManager;
255 LOGP(info,
"Adding TRK Sensitive Volumes");
258 for (
int j{0};
j < mLayers.size();
j++) {
260 LOGP(info,
"Trying {}", volumeName.Data());
261 v = geoManager->GetVolume(volumeName.Data());
262 LOGP(info,
"Adding TRK Sensitive Volume {}",
v->GetName());
263 AddSensitiveVolume(
v);
275 if (FairRootManager::Instance()) {
276 FairRootManager::Instance()->RegisterAny(
addNameTo(
"Hit").
data(), mHits,
true);
290 if (!(fMC->TrackCharge())) {
294 int lay = vol->getVolumeId();
295 int volID = vol->getMCid();
299 if (fMC->IsTrackExiting() && (lay == 0 || lay == mLayers.size() - 1)) {
304 stack->addTrackReference(tr);
306 bool startHit =
false, stopHit =
false;
307 unsigned char status = 0;
308 if (fMC->IsTrackEntering()) {
309 status |= Hit::kTrackEntering;
311 if (fMC->IsTrackInside()) {
312 status |= Hit::kTrackInside;
314 if (fMC->IsTrackExiting()) {
315 status |= Hit::kTrackExiting;
317 if (fMC->IsTrackOut()) {
318 status |= Hit::kTrackOut;
320 if (fMC->IsTrackStop()) {
321 status |= Hit::kTrackStopped;
323 if (fMC->IsTrackAlive()) {
324 status |= Hit::kTrackAlive;
328 if ((status & Hit::kTrackEntering) || (status & Hit::kTrackInside && !mTrackData.mHitStarted)) {
330 }
else if ((status & (Hit::kTrackExiting | Hit::kTrackOut | Hit::kTrackStopped))) {
336 mTrackData.mEnergyLoss += fMC->Edep();
338 if (!(startHit | stopHit)) {
343 mTrackData.mEnergyLoss = 0.;
344 fMC->TrackMomentum(mTrackData.mMomentumStart);
345 fMC->TrackPosition(mTrackData.mPositionStart);
346 mTrackData.mTrkStatusStart = status;
347 mTrackData.mHitStarted =
true;
350 TLorentzVector positionStop;
351 fMC->TrackPosition(positionStop);
353 int stave(0), halfstave(0), chipinmodule(0),
module;
354 fMC->CurrentVolOffID(1, chipinmodule);
355 fMC->CurrentVolOffID(2, module);
356 fMC->CurrentVolOffID(3, halfstave);
357 fMC->CurrentVolOffID(4, stave);
359 Hit* p =
addHit(
stack->GetCurrentTrackNumber(), lay, mTrackData.mPositionStart.Vect(), positionStop.Vect(),
360 mTrackData.mMomentumStart.Vect(), mTrackData.mMomentumStart.E(), positionStop.T(),
361 mTrackData.mEnergyLoss, mTrackData.mTrkStatusStart, status);
366 stack->addHit(GetDetId());
373 const TVector3& startMom,
double startE,
double endTime,
double eLoss,
unsigned char startStatus,
374 unsigned char endStatus)
376 mHits->emplace_back(trackID, detID, startPos, endPos, startMom, startE, endTime, eLoss, startStatus, endStatus);
377 return &(mHits->back());
Definition of the Stack class.
Definition of the ITSMFT Hit class.
ClassImp(o2::trk::Detector)
o2::base::Detector * create_detector_trk(bool active)
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 TRKBaseParam & Instance()
void ConstructGeometry() 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 InitializeO2Detector() override
void configFromFile(std::string fileName="alice3_TRK_layout.txt")
void EndOfEvent() override
static o2::base::Detector * create(bool active)
void configToFile(std::string fileName="alice3_TRK_layout.txt")
void buildTRKNewVacuumVessel()
bool ProcessHits(FairVolume *v=nullptr) override
static const char * getTRKSensorPattern()
static GeometryTGeo * Instance()
static const char * getTRKLayerPattern()
static const char * getTRKVolPattern()
void createServices(TGeoVolume *motherVolume)
static ShmManager & Instance()
GLenum GLuint GLint GLint layer
float getDetLengthFromEta(const float eta, const float radius)
void freeSimVector(std::vector< T > *ptr)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)
Common utility functions.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"