15#include "FairLogger.h"
17#include <FairRootManager.h>
24 constexpr auto NEUTRON_PID = 2112;
25 constexpr auto MIN_TOF_DEFAULT = 1e99;
27 auto IsPrimaryTrack(
const R3BMCTrack& track) ->
bool
31 return track.GetMotherId() == -1 && track.GetPdgCode() == NEUTRON_PID;
35 auto MapPointsToHits(
const std::vector<R3BNeulandPoint>& points,
const std::vector<R3BNeulandHit>& hits)
36 -> std::map<const R3BNeulandPoint*, const R3BNeulandHit*>
38 auto point_to_hit_map = std::map<const R3BNeulandPoint*, const R3BNeulandHit*>{};
39 for (
const auto& point : points)
41 point_to_hit_map[&point] =
nullptr;
42 for (
const auto& hit : hits)
44 if (point.GetPaddle() == hit.GetPaddle())
46 point_to_hit_map[&point] = &hit;
50 return point_to_hit_map;
54 auto MapPointsToPrimaryTracks(
const std::vector<R3BNeulandPoint>& points,
const std::vector<R3BMCTrack>& tracks)
55 -> std::map<const R3BNeulandPoint*, const R3BMCTrack*>
57 std::map<const R3BNeulandPoint*, const R3BMCTrack*> point_to_track_map;
58 for (
const auto& point : points)
60 point_to_track_map[&point] =
nullptr;
61 auto iTrack = point.GetTrackID();
64 const auto& track = tracks.at(iTrack);
65 if (IsPrimaryTrack(track))
67 point_to_track_map[&point] = &track;
71 iTrack = track.GetMotherId();
74 return point_to_track_map;
78 const std::map<const R3BNeulandPoint*, const R3BMCTrack*>& point_to_track_map)
83 auto minToF = MIN_TOF_DEFAULT;
85 for (
auto [map_point, map_track] : point_to_track_map)
88 if (map_track == &track)
90 const auto ToF = map_point->GetTime();
102 const std::map<const R3BNeulandPoint*, const R3BMCTrack*>& point_to_track_map,
103 const std::map<const R3BNeulandPoint*, const R3BNeulandHit*>& point_to_hit_map)
108 double minHitToF = MIN_TOF_DEFAULT;
110 for (
const auto [map_point, map_track] : point_to_track_map)
114 if (map_track == &track && point_to_hit_map.find(map_point) != point_to_hit_map.end())
116 const auto ToF = map_point->GetTime();
120 minHitPoint = map_point;
124 return minHitPoint !=
nullptr ? point_to_hit_map.at(minHitPoint) :
nullptr;
131 std::string_view hitsIn,
132 std::string_view pointsOut,
133 std::string_view hitsOut,
134 std::string_view tracksOut)
135 : FairTask(
"R3BNeulandPrimaryInteractionFinder")
136 , fTracksIn(
"MCTrack")
137 , fPointsIn(pointsIn)
139 , fTracksOut(tracksOut)
140 , fPointsOut(pointsOut)
142 , fhDistance(new TH1D(
"fhDistance",
"Distance firstPoint to firstHit", 10000, 0, 1000))
143 , fhPointsVsHits(new TH2D(
"fhPointsVsHits",
"Number of Primary Points vs Number of Primary Hits", 6, 0, 6, 6, 0, 6))
144 , fhPointVsHitPaddle(
145 new TH2D(
"fhPointVsHitPaddle",
"First Point Paddle vs First Hit Paddle", 3001, -1, 3000, 3001, -1, 3000))
147 fhDistance->GetXaxis()->SetTitle(
"Distance [cm]");
148 fhPointsVsHits->GetXaxis()->SetTitle(
"# First Points");
149 fhPointsVsHits->GetYaxis()->SetTitle(
"# First Hits");
150 fhPointVsHitPaddle->GetXaxis()->SetTitle(
"First Point Paddle");
151 fhPointVsHitPaddle->GetYaxis()->SetTitle(
"First Hit Paddle");
167 const auto& tracks = fTracksIn.read();
168 const auto& points = fPointsIn.get();
169 const auto& hits = fHitsIn.get();
174 const auto point_to_hit_map = MapPointsToHits(points, hits);
175 const auto point_to_track_map = MapPointsToPrimaryTracks(points, tracks);
177 if (FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug))
179 LOG(debug) <<
"R3BNeulandPrimaryInteractionFinder: Points without Hit in: ";
180 for (
const auto [map_point, map_hit] : point_to_hit_map)
182 if (map_hit ==
nullptr)
184 const auto& point = map_point;
185 LOG(debug) << point->GetDetectorID() <<
":" << tracks.at(point->GetTrackID()).GetPdgCode() <<
":"
186 << point->GetLightYield() <<
":" << point->GetEnergyLoss() <<
"\t";
191 for (
const auto& track : tracks)
193 if (IsPrimaryTrack(track))
195 fTracksOut.get().push_back(track);
197 const auto* firstPoint = FindFirstPoint(track, point_to_track_map);
198 const auto* firstHit = FindFirstHit(track, point_to_track_map, point_to_hit_map);
200 if (firstPoint !=
nullptr)
202 fPointsOut.get().push_back(*firstPoint);
205 if (firstHit !=
nullptr)
208 fHitsOut.get().push_back(*firstHit);
211 if ((firstHit !=
nullptr) && (firstPoint !=
nullptr))
213 fhDistance->Fill((firstPoint->GetPosition() - firstHit->GetPosition()).Mag());
216 fhPointVsHitPaddle->Fill((firstPoint !=
nullptr) ? firstPoint->GetPaddle() : -1,
217 (firstHit !=
nullptr) ? firstHit->GetPaddle() : -1);
221 fhPointsVsHits->Fill(
static_cast<double>(fPointsOut.get().size()),
static_cast<double>(fHitsOut.get().size()));
226 TDirectory* tmp = gDirectory;
227 FairRootManager::Instance()->GetOutFile()->cd();
228 gDirectory->mkdir(
"R3BNeulandPrimaryInteractionFinder");
229 gDirectory->cd(
"R3BNeulandPrimaryInteractionFinder");
232 fhPointsVsHits->Write();
233 fhPointVsHitPaddle->Write();
R3BNeulandPrimaryInteractionFinder(std::string_view pointsIn="NeulandPoints", std::string_view hitsIn="NeulandHits", std::string_view pointsOut="NeulandPrimaryPoints", std::string_view hitsOut="NeulandPrimaryHits", std::string_view tracksOut="NeulandPrimaryTracks")
void Exec(Option_t *) override
auto Init() -> InitStatus override