15#include "FairLogger.h"
20#include <FairRootManager.h>
22#include <RtypesCore.h>
23#include <TDirectory.h>
26#include <fairlogger/Logger.h>
33 constexpr auto NEUTRON_PID = 2112;
34 constexpr auto MIN_TOF_DEFAULT = 1e99;
36 auto IsPrimaryTrack(
const R3BMCTrack& track) ->
bool
40 return track.GetMotherId() == -1 && track.GetPdgCode() == NEUTRON_PID;
44 auto MapPointsToHits(
const std::vector<R3BNeulandPoint>& points,
const std::vector<R3BNeulandHit>& hits)
45 -> std::map<const R3BNeulandPoint*, const R3BNeulandHit*>
47 auto point_to_hit_map = std::map<const R3BNeulandPoint*, const R3BNeulandHit*>{};
48 for (
const auto& point : points)
50 point_to_hit_map[&point] =
nullptr;
51 for (
const auto& hit : hits)
53 if (point.GetPaddle() == hit.GetPaddle())
55 point_to_hit_map[&point] = &hit;
59 return point_to_hit_map;
63 auto MapPointsToPrimaryTracks(
const std::vector<R3BNeulandPoint>& points,
const std::vector<R3BMCTrack>& tracks)
64 -> std::map<const R3BNeulandPoint*, const R3BMCTrack*>
66 std::map<const R3BNeulandPoint*, const R3BMCTrack*> point_to_track_map;
67 for (
const auto& point : points)
69 point_to_track_map[&point] =
nullptr;
70 auto iTrack = point.GetTrackID();
73 const auto& track = tracks.at(iTrack);
74 if (IsPrimaryTrack(track))
76 point_to_track_map[&point] = &track;
80 iTrack = track.GetMotherId();
83 return point_to_track_map;
87 const std::map<const R3BNeulandPoint*, const R3BMCTrack*>& point_to_track_map)
92 auto minToF = MIN_TOF_DEFAULT;
94 for (
auto [map_point, map_track] : point_to_track_map)
97 if (map_track == &track)
99 const auto ToF = map_point->GetTime();
103 minPoint = map_point;
111 const std::map<const R3BNeulandPoint*, const R3BMCTrack*>& point_to_track_map,
112 const std::map<const R3BNeulandPoint*, const R3BNeulandHit*>& point_to_hit_map)
117 double minHitToF = MIN_TOF_DEFAULT;
119 for (
const auto [map_point, map_track] : point_to_track_map)
123 if (map_track == &track && point_to_hit_map.find(map_point) != point_to_hit_map.end())
125 const auto ToF = map_point->GetTime();
129 minHitPoint = map_point;
133 return minHitPoint !=
nullptr ? point_to_hit_map.at(minHitPoint) :
nullptr;
140 std::string_view hitsIn,
141 std::string_view pointsOut,
142 std::string_view hitsOut,
143 std::string_view tracksOut)
144 : FairTask(
"R3BNeulandPrimaryInteractionFinder")
151 ,
fhDistance(new TH1D(
"fhDistance",
"Distance firstPoint to firstHit", 10000, 0, 1000))
152 ,
fhPointsVsHits(new TH2D(
"fhPointsVsHits",
"Number of Primary Points vs Number of Primary Hits", 6, 0, 6, 6, 0, 6))
154 new TH2D(
"fhPointVsHitPaddle",
"First Point Paddle vs First Hit Paddle", 3001, -1, 3000, 3001, -1, 3000))
156 fhDistance->GetXaxis()->SetTitle(
"Distance [cm]");
178 const auto& hits =
fHitsIn.get();
183 const auto point_to_hit_map = MapPointsToHits(points, hits);
184 const auto point_to_track_map = MapPointsToPrimaryTracks(points, tracks);
186 if (FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug))
188 LOG(debug) <<
"R3BNeulandPrimaryInteractionFinder: Points without Hit in: ";
189 for (
const auto [map_point, map_hit] : point_to_hit_map)
191 if (map_hit ==
nullptr)
193 const auto& point = map_point;
194 LOG(debug) << point->GetDetectorID() <<
":" << tracks.at(point->GetTrackID()).GetPdgCode() <<
":"
195 << point->GetLightYield() <<
":" << point->GetEnergyLoss() <<
"\t";
200 for (
const auto& track : tracks)
202 if (IsPrimaryTrack(track))
206 const auto* firstPoint = FindFirstPoint(track, point_to_track_map);
207 const auto* firstHit = FindFirstHit(track, point_to_track_map, point_to_hit_map);
209 if (firstPoint !=
nullptr)
214 if (firstHit !=
nullptr)
217 fHitsOut.get().push_back(*firstHit);
220 if ((firstHit !=
nullptr) && (firstPoint !=
nullptr))
222 fhDistance->Fill((firstPoint->GetPosition() - firstHit->GetPosition()).Mag());
226 (firstHit !=
nullptr) ? firstHit->GetPaddle() : -1);
235 TDirectory* tmp = gDirectory;
236 FairRootManager::Instance()->GetOutFile()->cd();
237 gDirectory->mkdir(
"R3BNeulandPrimaryInteractionFinder");
238 gDirectory->cd(
"R3BNeulandPrimaryInteractionFinder");
R3B::InputVectorConnector< R3BNeulandPoint > fPointsIn
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")
R3B::InputVectorConnector< R3BNeulandHit > fHitsIn
TH2D * fhPointVsHitPaddle
R3B::InputTCAConnector< R3BMCTrack > fTracksIn
R3B::OutputVectorConnector< R3BNeulandPoint > fPointsOut
void Exec(Option_t *) override
R3B::OutputVectorConnector< R3BNeulandHit > fHitsOut
auto Init() -> InitStatus override
R3B::OutputVectorConnector< R3BMCTrack > fTracksOut