3 #include "TDatabasePDG.h"
9 static float amu = 0.93146;
12 MCParticle particle{TDatabasePDG::Instance()->ConvertGeant3ToPdg(mcp.Particle),
13 static_cast<int>(mcp.Charge),
14 TMath::Nint(mcp.Mass /
amu),
15 TVector3{mcp.
Coo[0], mcp.Coo[1], mcp.Coo[2]},
16 {mcp.Momentum * TVector3{mcp.Dir[0], mcp.Dir[1], mcp.Dir[2]}},
20 mcp.Nskip & 0xFFFFFF};
28 unsigned int layerOld = tkID / 100;
41 AMSEventR *
event = AMSEventR::Head();
43 throw std::runtime_error(
"Invalid pointer for AMSEventR::Head");
44 if (event->nMCEventgC() == 0)
45 throw std::runtime_error(
"No MCEventg information in this event");
49 TrRecHitR *hit = pTrTrack->GetHitLJ(jLayer);
53 AMSPoint point = hit->GetCoord();
56 std::min_element(
begin(event->TrMCCluster()),
end(event->TrMCCluster()),
57 [&point](
auto &cl1,
auto &cl2) {
return cl1.GetXgl().dist(point) < cl2.GetXgl().dist(point); });
59 if (mcclusterIt ==
end(event->TrMCCluster()))
63 auto rmin = mcclusterIt->GetXgl().dist(point);
64 if (rmin > match_radius)
67 mcHit.
pID = mcclusterIt->GetPart();
68 for (
unsigned int ic = 0; ic < 3; ic++) {
69 mcHit.
Coo[ic] = mcclusterIt->GetXgl()[ic];
70 mcHit.
Mom[ic] = mcclusterIt->GetMom()[ic];
77 if (a.parentID < b.parentID)
79 else if (a.parentID > b.parentID)
82 if (a.Coo[2] > b.Coo[2])
84 else if (a.Coo[2] < b.Coo[2])
87 return a.Momentum > b.Momentum;
91 void MCTruthBaseData::Fill(AMSEventR *evPtr) {
96 auto primIt = std::find_if(
begin(evPtr->MCEventg()),
end(evPtr->MCEventg()),
97 [](
const MCEventgR &mcp) {
return mcp.Coo[2] > 160.0; });
99 if (primIt ==
end(evPtr->MCEventg())) {
100 throw std::runtime_error(
"No generation point found for primary particle (with CooZ > 160 cm)");
104 for (
const auto &mcp : evPtr->MCEventg()) {
105 if (mcp.parentID != 0)
109 [&mcp](
float height) {
return fabs(mcp.Coo[2] - height) < 3.5e-1; });
113 Primary.
Momentum[position] = mcp.Momentum * TVector3{mcp.Dir[0], mcp.Dir[1], mcp.Dir[2]};
118 void MCTruthPlusData::Fill(AMSEventR *evPtr) {
126 const MCEventgR &firstPrim = evPtr->MCEventg()[0];
128 const auto lastPrimIt = std::find_if(rbegin(evPtr->MCEventg()), rend(evPtr->MCEventg()),
129 [](
const MCEventgR &mcp) {
return mcp.parentID == 0; });
131 if (lastPrimIt == rend(evPtr->MCEventg()))
134 for (MCEventgR &mcp : evPtr->MCEventg()) {
135 if (mcp.Momentum / firstPrim.Momentum > 0.01 && mcp.Coo[2] <= lastPrimIt->Coo[2]) {
141 void MCTruthPlusData::FillTrMCHit(TrTrackR *pTrTrack) {
142 for (
unsigned int ij = 0; ij < 9; ij++) {
MCTruthPlusData::TrMCHit GetTrMCHit(TrTrackR *pTrTrack, unsigned int jLayer, double match_radius=0.1)
std::vector< TVector3 > Momentum
particle momentum at different z-heights. See MCTruth::MCHeights for a description of the possible he...
MCParticle GetMCParticle(const MCEventgR &mcp)
constexpr std::array< float, numMCHeights > MCHeightsZ
std::array< float, 3 > Coo
hit position
Simple struct for MC tracker hits.
MCParticle Primary
primary particle
unsigned int TkIDToLayerJ(int tkID)
TVector3 Coo
generation position
SingleTreeChain::EventItr end(SingleTreeChain &chain)
std::vector< MCParticle > Secondaries
list of particles created by interaction of the primary particle
MCTruth container class description.
Simple struct to describe a MC particle.
std::array< float, 3 > Mom
hit momentum
SingleTreeChain::EventItr begin(SingleTreeChain &chain)
LayerVariable< TrMCHit > TrackMCHits
MC hits of the primary particle on tracker layers.
unsigned int pID
particle PID