95 LOG(debug4) <<
"BmnNdet ProcessHits method called for event " << gMC->CurrentEvent();
96 Int_t trackID = gMC->GetStack()->GetCurrentTrackNumber();
99 if (gMC->IsTrackEntering()) {
100 LOG(debug4) <<
"BmnNdet::ProcessHits: vacuum" << gMC->CurrentVolName() <<
" " << gMC->CurrentVolPath();
101 TLorentzVector tPos, tMom;
102 gMC->TrackPosition(tPos);
103 gMC->TrackMomentum(tMom);
104 TVector3 pos = TVector3(tPos.X(), tPos.Y(), tPos.Z());
105 TVector3 mom = TVector3(tMom.X(), tMom.Y(), tMom.Z());
106 auto [planeId, direction] = fGeoHandler->
GetEnteredFace(pos, mom);
107 uint8_t armID = fGeoHandler->
GetArmFromPath(gMC->CurrentVolPath());
109 new ((*fSurfaceCollection)[fSurfaceCollection->GetEntriesFast()])
110 BmnNdetSurfacePoint(gMC->GetStack()->GetCurrentTrackNumber(), pos, mom, gMC->TrackTime() * 1.0e09,
111 gMC->TrackLength(), gMC->TrackPid(), gMC->CurrentEvent(), armID,
112 static_cast<uint8_t
>(planeId),
static_cast<uint8_t
>(direction));
126 if (
GetHit(trackID, address) ==
nullptr) {
128 <<
". Edep = " << gMC->Edep() <<
" Time = " << gMC->TrackTime() * 1.0e09;
129 if (!gMC->IsTrackEntering())
130 LOG(warning) <<
"trackID = " << trackID <<
" is not marked as gMC->IsTrackEntering() ";
134 newPoint->ResetLinks();
135 newPoint->SetEventID(gMC->CurrentEvent());
136 newPoint->SetTrackID(trackID);
138 TLorentzVector tPos, tMom;
139 gMC->TrackPosition(tPos);
140 gMC->TrackMomentum(tMom);
141 newPoint->SetPosition(TVector3(tPos.X(), tPos.Y(), tPos.Z()));
142 newPoint->SetMomentum(TVector3(tMom.X(), tMom.Y(), tMom.Z()));
144 double dEdep = (gMC->TrackCharge() != 0 && gMC->TrackStep() > 0) ? gMC->Edep() /
GetBirkQCF()
146 newPoint->SetEnergyLoss(dEdep);
147 newPoint->SetTime(gMC->TrackTime() * 1.0e09);
148 newPoint->SetLength(gMC->TrackLength());
153 double dEdep = (gMC->TrackCharge() != 0 && gMC->TrackStep() > 0) ? gMC->Edep() /
GetBirkQCF()
155 if (dEdep > std::numeric_limits<double>::epsilon()) {
156 LOG(debug4) <<
"BmnNdet::ProcessHits. trackID = " << trackID <<
" inside or exiting. "
158 <<
" Time = " << gMC->TrackTime() * 1.0e09;
161 double weighted_time = point->GetEnergyLoss() * point->GetTime() + dEdep * gMC->TrackTime() * 1.0e09;
162 point->SetEnergyLoss(point->GetEnergyLoss() + dEdep);
163 point->SetTime(weighted_time / point->GetEnergyLoss());
170 if (gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()) {
246 LOG(debug4) <<
"BmnNdet ConstructGeometry method called";
247 TString fileName = GetGeometryFileName();
248 if (fileName.EndsWith(
".root")) {
249 LOG(info) << Form(
"Constructing NDET geometry from ROOT file %s", fileName.Data());
250 ConstructRootGeometry();
253 FairGeoLoader* geoLoad = FairGeoLoader::Instance();
254 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
255 fGeoHandler->setGeomFile(GetGeometryFileName());
256 geoFace->addGeoModule(fGeoHandler);
258 Bool_t rc = geoFace->readSet(fGeoHandler);
260 fGeoHandler->create(geoLoad->getGeoBuilder());
261 TList* volList = fGeoHandler->getListOfVolumes();
264 FairRun* fRun = FairRun::Instance();
265 FairRuntimeDb* rtdb = fRun->GetRuntimeDb();
270 TListIter iter(volList);
271 FairGeoNode* node =
nullptr;
273 while ((node = (FairGeoNode*)iter.Next())) {
274 FairGeoVolume* aVol =
dynamic_cast<FairGeoVolume*
>(node);
275 if (node->isSensitive()) {
276 fSensNodes->AddLast(aVol);
277 LOG(debug4) <<
"BmnNdet ConstructGeometry add sensitive node " << aVol->GetName();
279 fPassNodes->AddLast(aVol);
280 LOG(debug4) <<
"BmnNdet ConstructGeometry add passive node " << aVol->GetName();
284 par->setInputVersion(fRun->GetRunId(), 1);
286 ProcessNodes(volList);
321 const auto* stack =
static_cast<CbmStack*
>(gMC->GetStack());
322 int current_id = start_track_id;
324 std::unordered_map<int, int> vacuum_map;
325 for (
int i = 0, n = fSurfaceCollection->GetEntriesFast();
i < n; ++
i) {
328 vacuum_map[
i] = pt->GetTrackID();
332 const TParticle* particle = stack->GetParticle(current_id);
334 LOG(error) <<
"BmnNdet::GetSurfacePoint. No particle with ID: " << current_id;
338 for (
const auto& [ipt, vac_track] : vacuum_map) {
339 if (vac_track == current_id) {
340 LOG(debug4) <<
"BmnNdet::GetSurfacePoint. Linked to " << vac_track;
345 if (particle->IsPrimary()) {
346 LOG(debug4) << Form(
"BmnNdet::GetSurfacePoint. Reached primary particle %d, no vacuum point found",
351 int mother_id = particle->GetFirstMother();
352 if (mother_id == current_id || mother_id < 0) {
353 LOG(error) << Form(
"BmnNdet::GetSurfacePoint. Invalid or circular mother link for track %d", current_id);
357 current_id = mother_id;