Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DReactionVertexInfo.h
Go to the documentation of this file.
1 #ifndef DReactionVertexInfo_h
2 #define DReactionVertexInfo_h
3 
4 #include <unordered_map>
5 #include <vector>
6 #include <algorithm>
7 
8 #include "JANA/JObject.h"
9 
10 #include "ANALYSIS/DReaction.h"
12 
13 using namespace std;
14 using namespace jana;
15 
16 namespace DAnalysis
17 {
18 
19 class DReactionVertexInfo : public JObject
20 {
21  public:
22  JOBJECT_PUBLIC(DReactionVertexInfo);
23 
24  //CONSTRUCTORS
25  DReactionVertexInfo(void) = delete;
26  DReactionVertexInfo(const DReaction* locReaction, const vector<DReactionStepVertexInfo*>& locStepVertexInfos);
27 
28  //SETTERS
29  void Add_Reaction(const DReaction* locReaction){dReactions.push_back(locReaction);}
30 
31  //GETTERS
32  const DReaction* Get_Reaction(void) const{return *dReactions.begin();} //since their channels are identical, any one will do (if used correctly)
33  vector<const DReaction*> Get_Reactions(void) const{return dReactions;}
34  vector<const DReactionStepVertexInfo*> Get_StepVertexInfos(void) const{return dStepVertexInfos;}
35  const DReactionStepVertexInfo* Get_StepVertexInfo(size_t locStepIndex) const{return dVertexInfoMap.at(locStepIndex);}
36 
37  private:
38 
39  //these all have identical channel content: particles & steps must be in the same order, although actions, etc. may be different
40  vector<const DReaction*> dReactions;
41 
42  vector<const DReactionStepVertexInfo*> dStepVertexInfos; //in order of construction dependency
43  unordered_map<size_t, const DReactionStepVertexInfo*> dVertexInfoMap; //key is step index
44 };
45 
46 inline void Print_ReactionVertexInfo(const DReactionVertexInfo* locReactionInfo)
47 {
48  cout << "Reaction name: " << locReactionInfo->Get_Reaction()->Get_ReactionName() << endl;
49  for(auto& locStepInfo : locReactionInfo->Get_StepVertexInfos())
51 }
52 
53 inline DReactionVertexInfo::DReactionVertexInfo(const DReaction* locReaction, const vector<DReactionStepVertexInfo*>& locStepVertexInfos) :
54  dReactions({locReaction})
55 {
56  //transform into vector containing const pointers
57  auto locConstify = [](DReactionStepVertexInfo* locVertexInfo) -> const DReactionStepVertexInfo* {return const_cast<const DReactionStepVertexInfo*>(locVertexInfo);};
58  std::transform(locStepVertexInfos.begin(), locStepVertexInfos.end(), std::back_inserter(dStepVertexInfos), locConstify);
59 
60  //build the step index map
61  for(auto locVertexInfo : dStepVertexInfos)
62  {
63  for(auto locStepIndex : locVertexInfo->Get_StepIndices())
64  dVertexInfoMap.emplace(locStepIndex, locVertexInfo);
65  }
66 }
67 
68 //NAMESPACE SCOPE FUNCTIONS
69 inline vector<const DReactionStepVertexInfo*> Get_StepVertexInfos_OrderByStep(const DReactionVertexInfo* locReactionVertexInfo)
70 {
71  auto locStepVertexInfos = locReactionVertexInfo->Get_StepVertexInfos();
72 
73  //sort vertex infos in reverse-step order
74  auto Comparator_OrderByStep = [](const DReactionStepVertexInfo* lhs, const DReactionStepVertexInfo* rhs) -> bool
75  {return lhs->Get_StepIndices().front() < rhs->Get_StepIndices().front();}; // >: reverse order
76 
77  std::sort(locStepVertexInfos.begin(), locStepVertexInfos.end(), Comparator_OrderByStep);
78  return locStepVertexInfos;
79 }
80 
81 inline vector<const DReactionStepVertexInfo*> Get_StepVertexInfos_ReverseOrderByStep(const DReactionVertexInfo* locReactionVertexInfo)
82 {
83  auto locStepVertexInfos = locReactionVertexInfo->Get_StepVertexInfos();
84 
85  //sort vertex infos in reverse-step order
86  auto Comparator_ReverseOrderByStep = [](const DReactionStepVertexInfo* lhs, const DReactionStepVertexInfo* rhs) -> bool
87  {return lhs->Get_StepIndices().front() > rhs->Get_StepIndices().front();}; // >: reverse order
88 
89  std::sort(locStepVertexInfos.begin(), locStepVertexInfos.end(), Comparator_ReverseOrderByStep);
90  return locStepVertexInfos;
91 }
92 
93 inline vector<pair<int, int>> Get_FullConstrainParticles(const DReactionVertexInfo* locReactionVertexInfo, bool locFitFlag, DReactionState_t locState = d_EitherState, Charge_t locCharge = d_AllCharges, bool locIncludeDecayingFlag = true)
94 {
95  //no longer sorted!
96  auto locStepVertexInfos = locReactionVertexInfo->Get_StepVertexInfos();
97  vector<pair<int, int>> locAllFullConstrainParticles;
98  for(auto& locStepVertexInfo : locStepVertexInfos)
99  {
100  auto locFullConstrainParticles = locStepVertexInfo->Get_FullConstrainParticles(locFitFlag, locState, locCharge, locIncludeDecayingFlag);
101  locAllFullConstrainParticles.insert(locAllFullConstrainParticles.end(), locFullConstrainParticles.begin(), locFullConstrainParticles.end());
102  }
103  return locAllFullConstrainParticles;
104 }
105 
106 inline vector<pair<int, int>> Get_OnlyConstrainTimeParticles(const DReactionVertexInfo* locReactionVertexInfo)
107 {
108  //no longer sorted!
109  auto locStepVertexInfos = locReactionVertexInfo->Get_StepVertexInfos();
110  vector<pair<int, int>> locAllOnlyConstrainTimeParticles;
111  for(auto& locStepVertexInfo : locStepVertexInfos)
112  {
113  auto locOnlyConstrainTimeParticles = locStepVertexInfo->Get_OnlyConstrainTimeParticles();
114  locAllOnlyConstrainTimeParticles.insert(locAllOnlyConstrainTimeParticles.end(), locOnlyConstrainTimeParticles.begin(), locOnlyConstrainTimeParticles.end());
115  }
116  return locAllOnlyConstrainTimeParticles;
117 }
118 
119 } //end DAnalysis namespace
120 
121 #endif // DReactionVertexInfo_h
const DReaction * Get_Reaction(void) const
void Add_Reaction(const DReaction *locReaction)
vector< pair< int, int > > Get_OnlyConstrainTimeParticles(const DReactionVertexInfo *locReactionVertexInfo)
const DReactionStepVertexInfo * Get_StepVertexInfo(size_t locStepIndex) const
void Print_ReactionStepVertexInfo(const DReactionStepVertexInfo *locStepInfo)
vector< const DReaction * > dReactions
vector< const DReactionStepVertexInfo * > Get_StepVertexInfos_OrderByStep(const DReactionVertexInfo *locReactionVertexInfo)
Charge_t
void Print_ReactionVertexInfo(const DReactionVertexInfo *locReactionInfo)
string Get_ReactionName(void) const
Definition: DReaction.h:75
vector< const DReactionStepVertexInfo * > dStepVertexInfos
vector< pair< int, int > > Get_FullConstrainParticles(const DReactionVertexInfo *locReactionVertexInfo, bool locFitFlag, DReactionState_t locState=d_EitherState, Charge_t locCharge=d_AllCharges, bool locIncludeDecayingFlag=true)
vector< const DReactionStepVertexInfo * > Get_StepVertexInfos(void) const
vector< const DReactionStepVertexInfo * > Get_StepVertexInfos_ReverseOrderByStep(const DReactionVertexInfo *locReactionVertexInfo)
unordered_map< size_t, const DReactionStepVertexInfo * > dVertexInfoMap
vector< size_t > Get_StepIndices(void) const
vector< const DReaction * > Get_Reactions(void) const