1 #ifndef DSourceComboVertexer_h
2 #define DSourceComboVertexer_h
5 #include <unordered_map>
14 #include "JANA/JEventLoop.h"
57 bool Get_IsVertexKnown(
bool locIsProductionVertex,
const DSourceCombo* locReactionCombo,
const DSourceCombo* locVertexCombo,
const DKinematicData* locBeamParticle,
bool locIsCombo2ndVertex)
const;
58 bool Get_IsVertexKnown_NoBeam(
bool locIsProductionVertex,
const DSourceCombo* locVertexCombo,
bool locIsCombo2ndVertex)
const;
62 DVector3 Get_Vertex_NoBeam(
bool locIsProductionVertex,
const DSourceCombo* locVertexCombo,
bool locIsCombo2ndVertex)
const;
64 DVector3 Get_Vertex(
bool locIsProductionVertex,
const vector<const DKinematicData*>& locVertexParticles)
const;
73 vector<const DKinematicData*> Get_ConstrainingParticles(
bool locIsProductionVertex,
const DSourceCombo* locReactionCombo,
const DSourceCombo* locVertexCombo,
const DKinematicData* locBeamParticle,
bool locIsCombo2ndVertex)
const;
74 vector<const DKinematicData*> Get_ConstrainingParticles_NoBeam(
bool locIsProductionVertex,
const DSourceCombo* locVertexCombo,
bool locIsCombo2ndVertex)
const;
77 signed char Get_VertexZBin(
bool locIsProductionVertex,
const DSourceCombo* locReactionCombo,
const DSourceCombo* locPrimaryVertexCombo,
const DKinematicData* locBeamParticle,
bool locIsCombo2ndVertex)
const;
78 signed char Get_VertexZBin_NoBeam(
bool locIsProductionVertex,
const DSourceCombo* locPrimaryVertexCombo,
bool locIsCombo2ndVertex)
const;
83 vector<const DKinematicData*>::const_iterator Get_ThetaNearest90Iterator(
const vector<const DKinematicData*>& locParticles);
84 vector<const DKinematicData*> Get_FullConstrainDecayingParticles(
const DReactionStepVertexInfo* locStepVertexInfo,
const map<pair<int, int>,
const DKinematicData*>& locReconDecayParticleMap);
86 DVector3 Calc_Vertex(
bool locIsProductionVertexFlag,
const vector<pair<Particle_t, const JObject*>>& locChargedSourceParticles,
const vector<const DKinematicData*>& locDecayingParticles, vector<const DKinematicData*>& locVertexParticles);
90 void Construct_DecayingParticle_MissingMass(
const DReactionStepVertexInfo* locReactionStepVertexInfo,
const DSourceComboUse& locReactionFullComboUse,
const DSourceCombo* locReactionFullCombo,
const DSourceCombo* locFullVertexCombo,
const DKinematicData* locBeamParticle,
DVector3 locVertex,
int locRFBunch,
double locRFVertexTime, map<pair<int, int>,
const DKinematicData*>& locReconDecayParticleMap);
102 double dMinThetaForVertex = 30.0;
112 map<tuple<bool, const DSourceCombo*, const DKinematicData*>, unordered_map<const DSourceCombo*, double>>
dTimeOffsets;
140 inline void DSourceComboVertexer::Reset(
void)
142 dConstrainingParticlesByCombo.clear();
144 dTimeOffsets.clear();
146 for(
const auto& locParticlePair : dReconDecayParticles_FromProducts)
147 dResourcePool_KinematicData.
Recycle(locParticlePair.second);
148 for(
const auto& locParticlePair : dReconDecayParticles_FromMissing)
149 dResourcePool_KinematicData.Recycle(locParticlePair.second);
151 dReconDecayParticles_FromProducts.clear();
152 dReconDecayParticles_FromMissing.clear();
155 dVertexMap.emplace(std::make_pair(
false, vector<const DKinematicData*>()), dTargetCenter);
156 dVertexMap.emplace(std::make_pair(
true, vector<const DKinematicData*>()), dTargetCenter);
159 inline bool DSourceComboVertexer::Get_IsTimeOffsetKnown(
bool locIsPrimaryProductionVertex,
const DSourceCombo* locReactionCombo,
const DSourceCombo* locVertexCombo,
const DKinematicData* locBeamParticle)
const
163 if(locBeamParticle ==
nullptr)
165 auto locIterator = dTimeOffsets.find(std::make_tuple(locIsPrimaryProductionVertex, locReactionCombo,
nullptr));
166 if(locIterator == dTimeOffsets.end())
168 auto& locComboMap = locIterator->second;
169 auto locComboIterator = locComboMap.find(locVertexCombo);
170 return (locComboIterator != locComboMap.end());
173 auto locIterator = dTimeOffsets.find(std::make_tuple(locIsPrimaryProductionVertex, locReactionCombo, locBeamParticle));
174 if(locIterator == dTimeOffsets.end())
175 return Get_TimeOffset(locIsPrimaryProductionVertex, locReactionCombo, locVertexCombo,
nullptr);
177 auto& locComboMap = locIterator->second;
178 auto locComboIterator = locComboMap.find(locVertexCombo);
179 if(locComboIterator == locComboMap.end())
180 return Get_TimeOffset(locIsPrimaryProductionVertex, locReactionCombo, locVertexCombo,
nullptr);
185 inline double DSourceComboVertexer::Get_TimeOffset(
bool locIsPrimaryProductionVertex,
const DSourceCombo* locReactionCombo,
const DSourceCombo* locVertexCombo,
const DKinematicData* locBeamParticle)
const
189 if(locBeamParticle ==
nullptr)
191 auto locIterator = dTimeOffsets.find(std::make_tuple(locIsPrimaryProductionVertex, locReactionCombo,
nullptr));
192 if(locIterator == dTimeOffsets.end())
194 auto& locComboMap = locIterator->second;
195 auto locComboIterator = locComboMap.find(locVertexCombo);
196 return ((locComboIterator != locComboMap.end()) ? locComboIterator->second : 0.0);
199 auto locIterator = dTimeOffsets.find(std::make_tuple(locIsPrimaryProductionVertex, locReactionCombo, locBeamParticle));
200 if(locIterator == dTimeOffsets.end())
201 return Get_TimeOffset(locIsPrimaryProductionVertex, locReactionCombo, locVertexCombo,
nullptr);
203 auto& locComboMap = locIterator->second;
204 auto locComboIterator = locComboMap.find(locVertexCombo);
205 if(locComboIterator == locComboMap.end())
206 return Get_TimeOffset(locIsPrimaryProductionVertex, locReactionCombo, locVertexCombo,
nullptr);
208 return locComboIterator->second;
211 inline vector<const DKinematicData*> DSourceComboVertexer::Get_ConstrainingParticles(
bool locIsProductionVertex,
const DSourceCombo* locReactionCombo,
const DSourceCombo* locVertexCombo,
const DKinematicData* locBeamParticle,
bool locIsCombo2ndVertex)
const
218 if(locBeamParticle ==
nullptr)
220 auto locIterator = dConstrainingParticlesByCombo.find(std::make_tuple(locIsProductionVertex, (
const DSourceCombo*)
nullptr, locVertexCombo, (
const DKinematicData*)
nullptr, locIsCombo2ndVertex));
221 if(locIterator != dConstrainingParticlesByCombo.end())
222 return locIterator->second;
223 if(!locIsCombo2ndVertex)
227 locIterator = dConstrainingParticlesByCombo.find(std::make_tuple(!locIsProductionVertex, (
const DSourceCombo*)
nullptr, locVertexCombo, (
const DKinematicData*)
nullptr, locIsCombo2ndVertex));
228 if(locIterator != dConstrainingParticlesByCombo.end())
229 return locIterator->second;
233 auto locIterator = dConstrainingParticlesByCombo.find(std::make_tuple(
true, locReactionCombo, locVertexCombo, locBeamParticle, locIsCombo2ndVertex));
234 if(locIterator == dConstrainingParticlesByCombo.end())
235 locIterator = dConstrainingParticlesByCombo.find(std::make_tuple(locIsProductionVertex, (
const DSourceCombo*)
nullptr, locVertexCombo, (
const DKinematicData*)
nullptr, locIsCombo2ndVertex));
236 if(locIterator != dConstrainingParticlesByCombo.end())
237 return locIterator->second;
241 inline DVector3 DSourceComboVertexer::Get_Vertex(
bool locIsProductionVertex,
const vector<const DKinematicData*>& locVertexParticles)
const
243 auto locIterator =
dVertexMap.find(std::make_pair(locIsProductionVertex, locVertexParticles));
245 return locIterator->second;
251 return Get_VertexZBin(locIsProductionVertex,
nullptr, locPrimaryVertexCombo,
nullptr, locIsCombo2ndVertex);
261 return !
Get_ConstrainingParticles(locIsProductionVertex, locReactionCombo, locVertexCombo, locBeamParticle, locIsCombo2ndVertex).empty();
278 auto locConstrainingParticles =
Get_ConstrainingParticles(
true, locReactionCombo, locVertexCombo, locBeamParticle, locIsCombo2ndVertex);
279 if(locConstrainingParticles.empty())
280 locConstrainingParticles =
Get_ConstrainingParticles(locIsProductionVertex,
nullptr, locVertexCombo,
nullptr, locIsCombo2ndVertex);
281 return Get_Vertex(locIsProductionVertex, locConstrainingParticles);
289 auto locIsCombo2ndVertex = (locComboIsFullyCharged && locStepVertexInfo->Get_FullConstrainParticles(
false,
d_FinalState,
d_Charged,
false).empty());
290 return Get_Vertex(locIsProductionVertex, locReactionCombo, locReactionCombo, locBeamParticle, locIsCombo2ndVertex);
297 {
return fabs(rhs->momentum().Theta() - 0.5*TMath::Pi()) < fabs(lhs->
momentum().Theta() - 0.5*TMath::Pi());};
298 return std::max_element(locParticles.begin(), locParticles.end(), Get_Nearer90Theta);
306 return locIterator->second;
314 return locIterator->second;
319 #endif // DSourceComboVertexer_h
void Set_SourceComboTimeHandler(const DSourceComboTimeHandler *locSourceComboTimeHandler)
bool Get_VertexDeterminableWithPhotons(const DReactionStepVertexInfo *locStepVertexInfo) const
signed char Get_VertexZBin_NoBeam(bool locIsProductionVertex, const DSourceCombo *locPrimaryVertexCombo, bool locIsCombo2ndVertex) const
unordered_map< const DReactionStepVertexInfo *, bool > dVertexDeterminableWithPhotonsMap
void Set_DebugLevel(int locDebugLevel)
const DReactionStepVertexInfo * Get_StepVertexInfo(size_t locStepIndex) const
map< tuple< bool, const DSourceCombo *, const DSourceCombo *, const DKinematicData *, bool >, vector< const DKinematicData * > > dConstrainingParticlesByCombo
vector< const DKinematicData * > Get_ConstrainingParticles_NoBeam(bool locIsProductionVertex, const DSourceCombo *locVertexCombo, bool locIsCombo2ndVertex) const
bool Get_VertexDeterminableWithCharged(const DReactionStepVertexInfo *locStepVertexInfo) const
bool Get_ProductionVertexFlag(void) const
DVector3 Get_Vertex(bool locIsProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DKinematicData *locBeamParticle, bool locIsCombo2ndVertex) const
DVector3 Get_PrimaryVertex(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionCombo, const DKinematicData *locBeamParticle) const
tuple< Particle_t, signed char, const DSourceComboInfo *, bool, Particle_t > DSourceComboUse
vector< pair< Particle_t, const JObject * > > Get_SourceParticles(bool locEntireChainFlag=false, Charge_t locCharge=d_AllCharges) const
map< pair< bool, vector< const DKinematicData * > >, DVector3 > dVertexMap
const DAnalysisUtilities * dAnalysisUtilities
map< tuple< Particle_t, const DSourceCombo *, bool, const DSourceCombo *, const DKinematicData * >, const DKinematicData * > dReconDecayParticles_FromMissing
signed char Get_VertexZBin(bool locIsProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locPrimaryVertexCombo, const DKinematicData *locBeamParticle, bool locIsCombo2ndVertex) const
unordered_map< const DReactionStepVertexInfo *, bool > dVertexDeterminableWithChargedMap
void Set_Vertex(const DVertex *locVertex)
map< tuple< Particle_t, bool, const DSourceCombo *, const DKinematicData * >, const DKinematicData * > dReconDecayParticles_FromProducts
DSourceComboer * dSourceComboer
vector< const DKinematicData * > Get_ConstrainingParticles(bool locIsProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DKinematicData *locBeamParticle, bool locIsCombo2ndVertex) const
DSourceComboP4Handler * dSourceComboP4Handler
const DVector3 & momentum(void) const
DVector3 Get_Vertex_NoBeam(bool locIsProductionVertex, const DSourceCombo *locVertexCombo, bool locIsCombo2ndVertex) const
bool Get_IsVertexKnown(bool locIsProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DKinematicData *locBeamParticle, bool locIsCombo2ndVertex) const
bool Get_IsVertexKnown_NoBeam(bool locIsProductionVertex, const DSourceCombo *locVertexCombo, bool locIsCombo2ndVertex) const
map< tuple< bool, const DSourceCombo *, const DKinematicData * >, unordered_map< const DSourceCombo *, double > > dTimeOffsets
DResourcePool< DKinematicData > dResourcePool_KinematicData
vector< const DKinematicData * >::const_iterator Get_ThetaNearest90Iterator(const vector< const DKinematicData * > &locParticles)
void Recycle(const DType *locResource)