Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DReactionStep.cc
Go to the documentation of this file.
1 #include "DReactionStep.h"
2 
3 namespace DAnalysis
4 {
5 
6 /************************************************************** MEMBER FUNCTIONS ***************************************************************/
7 
8 int DReactionStep::Prepare_InfoArguments(vector<Particle_t>& locFinalPIDs, Particle_t locMissingFinalPID, bool locInclusiveFlag, bool locBeamMissingFlag, bool locSecondBeamMissingFlag) const
9 {
10  if((locInclusiveFlag || locBeamMissingFlag) && (locMissingFinalPID != Unknown))
11  {
12  cout << "ERROR: CANNOT HAVE MISSING PID + MISSING BEAM OR INCLUSIVE. ABORTING." << endl;
13  abort();
14  }
15 
16  if(locMissingFinalPID != Unknown)
17  {
18  locFinalPIDs.push_back(locMissingFinalPID);
19  return locFinalPIDs.size() - 1;
20  }
21  else if(locInclusiveFlag)
23  else if(locBeamMissingFlag)
25  else if(locSecondBeamMissingFlag)
27  else
29 }
30 
31 void DReactionStep::Add_FinalParticleID(Particle_t locPID, bool locIsMissingFlag)
32 {
33  Check_IsResonance(locPID);
34 
35  if(!locIsMissingFlag)
36  {
37  if(locPID == Unknown)
38  {
39  cout << "ERROR: CANNOT SET UNKNOWN PID AS NON-MISSING FINAL PARTICLE. ABORTING." << endl;
40  abort();
41  }
42  dReactionStepInfo->dFinalPIDs.push_back(locPID);
43  return;
44  }
45 
46  //now is missing, check to make sure none others are missing
47  if(dReactionStepInfo->dMissingParticleIndex != DReactionStep::Get_ParticleIndex_None())
48  {
49  cout << "ERROR: CANNOT SET MORE THAN ONE MISSING PARTICLE IN A STEP. ABORTING." << endl;
50  abort();
51  }
52 
53  //if unknown, instead set as inclusive
54  if(locPID == Unknown)
56  else
57  {
58  dReactionStepInfo->dMissingParticleIndex = dReactionStepInfo->dFinalPIDs.size();
59  dReactionStepInfo->dFinalPIDs.push_back(locPID);
60  }
61 }
62 
63 vector<Particle_t> DReactionStep::Get_FinalPIDs(bool locIncludeMissingFlag, Charge_t locCharge, bool locIncludeDuplicatesFlag) const
64 {
65  vector<Particle_t> locFinalPIDs = dReactionStepInfo->dFinalPIDs;
66  if(!locIncludeMissingFlag && (dReactionStepInfo->dMissingParticleIndex >= 0))
67  locFinalPIDs.erase(locFinalPIDs.begin() + dReactionStepInfo->dMissingParticleIndex);
68 
69  auto locComparator = [&](Particle_t& locPID) -> bool {return !Is_CorrectCharge(locPID, locCharge);};
70  locFinalPIDs.erase(std::remove_if(locFinalPIDs.begin(), locFinalPIDs.end(), locComparator), locFinalPIDs.end());
71 
72  if(!locIncludeDuplicatesFlag)
73  {
74  std::sort(locFinalPIDs.begin(), locFinalPIDs.end());
75  locFinalPIDs.erase(std::unique(locFinalPIDs.begin(), locFinalPIDs.end()), locFinalPIDs.end());
76  }
77  return locFinalPIDs;
78 }
79 
80 /************************************************************** NAMESPACE-SCOPE FUNCTIONS ***************************************************************/
81 
82 string Get_InitialParticlesName(const DReactionStep* locStep, bool locTLatexFlag)
83 {
84  std::function<char*(Particle_t)> locGetNameFunc = locTLatexFlag ? ParticleName_ROOT : ParticleType;
85  string locInitPIDString = locGetNameFunc(locStep->Get_InitialPID());
86  string locStepName = (locStep->Get_MissingParticleIndex() == DReactionStep::Get_ParticleIndex_Initial()) ? string("(") + locInitPIDString + string(")") : locInitPIDString;
87 
88  Particle_t locSecondBeamPID = locStep->Get_SecondBeamPID();
89  Particle_t locTargetPID = locStep->Get_TargetPID();
90  Particle_t locSecondPID = (locTargetPID != Unknown) ? locTargetPID : locSecondBeamPID;
91  if(locSecondPID != Unknown)
92  {
93  if(!locTLatexFlag)
94  locStepName += "_";
95  locStepName += locGetNameFunc(locSecondPID);
96  }
97 
98  return locStepName;
99 }
100 
101 vector<string> Get_FinalParticleNames(const DReactionStep* locStep, bool locIncludeMissingFlag, bool locTLatexFlag)
102 {
103  vector<string> locParticleNames;
104  std::function<char*(Particle_t)> locGetNameFunc = locTLatexFlag ? ParticleName_ROOT : ParticleType;
105 
106  vector<Particle_t> locFinalPIDs = locStep->Get_FinalPIDs(false);
107  auto locPIDTransformer = [&locGetNameFunc](Particle_t& locPID) -> string {return locGetNameFunc(locPID);};
108  std::transform(locFinalPIDs.begin(), locFinalPIDs.end(), std::back_inserter(locParticleNames), locPIDTransformer);
109 
110  if(!locIncludeMissingFlag)
111  return locParticleNames;
112 
113  if(locStep->Get_IsInclusiveFlag())
114  {
115  locParticleNames.push_back("(X)");
116  return locParticleNames;
117  }
118 
119  Particle_t locMissingPID = locStep->Get_MissingPID();
120  if(locMissingPID != Unknown)
121  locParticleNames.push_back(string("(") + locGetNameFunc(locMissingPID) + string(")"));
122 
123  return locParticleNames;
124 }
125 
126 bool Are_ParticlesIdentical(const DReactionStep* locStep1, const DReactionStep* locStep2, bool locExceptMissingUnknownInInputFlag)
127 {
128  if(locStep1->Get_InitialPID() != locStep2->Get_InitialPID())
129  return false;
130  if(locStep1->Get_SecondBeamPID() != locStep2->Get_SecondBeamPID())
131  return false;
132  if(locStep1->Get_TargetPID() != locStep2->Get_TargetPID())
133  return false;
134  if(locStep1->Get_MissingPID() != locStep2->Get_MissingPID())
135  return false;
136 
137  auto locFinalPIDs1 = locStep1->Get_FinalPIDs();
138  auto locFinalPIDs2 = locStep2->Get_FinalPIDs();
139  if(locFinalPIDs1.size() != locFinalPIDs2.size())
140  return false;
141 
142  //note order can be re-arranged!
143  return std::is_permutation(locFinalPIDs1.begin(), locFinalPIDs1.end(), locFinalPIDs2.begin());
144 }
145 
146 } //end DAnalysis namespace
static char * ParticleName_ROOT(Particle_t p)
Definition: particleType.h:851
static constexpr int Get_ParticleIndex_Initial(void)
bool Are_ParticlesIdentical(const DReactionStep *locStep1, const DReactionStep *locStep2, bool locExceptMissingUnknownInInputFlag)
char string[256]
Particle_t Get_TargetPID(void) const
Definition: DReactionStep.h:83
static char * ParticleType(Particle_t p)
Definition: particleType.h:142
int Prepare_InfoArguments(vector< Particle_t > &locFinalPIDs, Particle_t locMissingFinalPID, bool locInclusiveFlag, bool locBeamMissingFlag, bool locSecondBeamMissingFlag) const
Definition: DReactionStep.cc:8
Charge_t
vector< string > Get_FinalParticleNames(const DReactionStep *locStep, bool locIncludeMissingFlag, bool locTLatexFlag)
Particle_t Get_SecondBeamPID(void) const
Definition: DReactionStep.h:82
Particle_t Get_InitialPID(void) const
Definition: DReactionStep.h:81
void Add_FinalParticleID(Particle_t locPID, bool locIsMissingFlag=false)
shared_ptr< DReactionStepInfo > dReactionStepInfo
static constexpr int Get_ParticleIndex_Inclusive(void)
static constexpr int Get_ParticleIndex_None(void)
int Get_MissingParticleIndex(void) const
Definition: DReactionStep.h:93
static int Is_CorrectCharge(Particle_t locPID, Charge_t locCharge)
static void Check_IsResonance(Particle_t locPID)
vector< Particle_t > Get_FinalPIDs(bool locIncludeMissingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
static constexpr int Get_ParticleIndex_SecondBeam(void)
bool Get_IsInclusiveFlag(void) const
Definition: DReactionStep.h:94
string Get_InitialParticlesName(const DReactionStep *locStep, bool locTLatexFlag)
Particle_t Get_MissingPID(void) const
Particle_t
Definition: particleType.h:12