3 #include "TDatabasePDG.h"
10 constexpr
float amu = 0.93146;
18 switch (std::abs(mcp.PartInfo)) {
20 pdg = TDatabasePDG::Instance()->ConvertGeant3ToPdg(mcp.Particle);
27 pdg = TDatabasePDG::Instance()->ConvertGeant3ToPdg(mcp.Particle);
32 static_cast<int>(mcp.Charge),
33 static_cast<unsigned int>(TMath::Nint(mcp.Mass /
amu)),
35 {TVector3{mcp.Coo[0], mcp.Coo[1], mcp.Coo[2]}},
36 {mcp.Momentum * TVector3{mcp.Dir[0], mcp.Dir[1], mcp.Dir[2]}},
40 mcp.Nskip & 0xFFFFFF};
46 unsigned int layerOld = tkID / 100;
58 std::optional<MCTruthPlusData::TrMCHit>
GetTrMCHit(TrTrackR *pTrTrack,
unsigned int jLayer,
float tof_beta,
59 double match_radius = 0.1) {
60 AMSEventR *
event = AMSEventR::Head();
62 throw std::runtime_error(
"Invalid pointer for AMSEventR::Head");
63 if (event->nMCEventgC() == 0)
64 throw std::runtime_error(
"No MCEventg information in this event");
66 if (!pTrTrack->TestHitLayerJ(jLayer))
69 AMSPlaneM plm = pTrTrack->GetHitCooLJN(jLayer);
70 TVector3 mglob = plm.getMGlobal();
71 AMSPoint point = AMSPoint(mglob.x(), mglob.y(), mglob.z());
74 std::vector<TrMCClusterR> mcHits{};
75 std::copy_if(
begin(event->TrMCCluster()),
end(event->TrMCCluster()), std::back_inserter(mcHits),
76 [&point, &match_radius](TrMCClusterR &hit) { return hit.GetXgl().dist(point) < match_radius; });
82 decltype(mcHits)::iterator mcclusterIt;
84 if (pTrTrack->GetInnerQ(tof_beta) > 1.5) {
86 mcclusterIt = std::max_element(
begin(mcHits),
end(mcHits),
87 [](TrMCClusterR &cl1, TrMCClusterR &cl2) {
return cl1.GetEdep() < cl2.GetEdep(); });
90 mcclusterIt = std::min_element(
begin(mcHits),
end(mcHits), [&point](TrMCClusterR &cl1, TrMCClusterR &cl2) {
91 return cl1.GetXgl().dist(point) < cl2.GetXgl().dist(point);
96 mcHit.
pID = TDatabasePDG::Instance()->ConvertGeant3ToPdg(mcclusterIt->GetPart());
97 for (
unsigned int ic = 0; ic < 3; ic++) {
98 mcHit.
Coo[ic] = mcclusterIt->GetXgl()[ic];
99 mcHit.
Mom[ic] = mcclusterIt->GetMom()[ic];
106 if (a.parentID < b.parentID)
108 else if (a.parentID > b.parentID)
111 if (a.Coo[2] > b.Coo[2])
113 else if (a.Coo[2] < b.Coo[2])
116 return a.Momentum > b.Momentum;
120 bool MCTruthBaseData::Fill(AMSEventR *evPtr) {
125 auto primIt = std::find_if(
begin(evPtr->MCEventg()),
end(evPtr->MCEventg()),
126 [](
const MCEventgR &mcp) { return mcp.Coo[2] > 160.0; });
128 if (primIt ==
end(evPtr->MCEventg())) {
129 throw std::runtime_error(
"No generation point found for primary particle (with CooZ > 160 cm)");
132 constexpr
float z_tolerance = 2.0f;
135 for (
const auto &mcp : evPtr->MCEventg()) {
136 if (mcp.parentID != 0)
140 [&mcp](
float height) {
return fabs(mcp.Coo[2] - height) < z_tolerance; });
143 Primary.Momentum.resize(position + 1);
144 Primary.Momentum[position] = mcp.Momentum * TVector3{mcp.Dir[0], mcp.Dir[1], mcp.Dir[2]};
146 Primary.Position.resize(position + 1);
147 Primary.Position[position] = TVector3{mcp.Coo[0], mcp.Coo[1], mcp.Coo[2]};
154 bool MCTruthPlusData::Fill(AMSEventR *evPtr) {
162 const MCEventgR &firstPrim = evPtr->MCEventg()[0];
163 for (MCEventgR &mcp : evPtr->MCEventg()) {
165 if (mcp.parentID == 0)
168 if (mcp.Momentum / firstPrim.Momentum > 0.005) {
176 bool MCTruthPlusData::FillTrMCHit(TrTrackR *pTrTrack,
float tof_beta) {
177 for (
unsigned int ij = 0; ij < 9; ij++) {
178 if (
auto mcHit =
GetTrMCHit(pTrTrack, ij + 1, tof_beta); mcHit)
179 TrackMCHits[ij] = mcHit.value();