Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DSourceComboer.h
Go to the documentation of this file.
1 #ifndef DSourceComboer_h
2 #define DSourceComboer_h
3 
4 #include <map>
5 #include <set>
6 #include <vector>
7 #include <memory>
8 #include <unordered_map>
9 #include <unordered_set>
10 #include <cmath>
11 #include <algorithm>
12 #include <stack>
13 
14 #include "TF1.h"
15 
16 #include "JANA/JObject.h"
17 #include "JANA/JEventLoop.h"
18 
19 #include "particleType.h"
20 #include "SplitString.h"
21 #include "DANA/DApplication.h"
22 #include "HDGEOMETRY/DGeometry.h"
23 #include "EVENTSTORE/DESSkimData.h"
24 
25 #include "PID/DNeutralShower.h"
26 #include "PID/DKinematicData.h"
27 #include "PID/DEventRFBunch.h"
28 
29 #include "ANALYSIS/DReaction.h"
30 #include "ANALYSIS/DSourceCombo.h"
33 #include "DResourcePool.h"
34 
39 
40 using namespace std;
41 using namespace jana;
42 
43 namespace DAnalysis
44 {
45 
46 /****************************************************** DEFINE LAMBDAS, USING STATEMENTS *******************************************************/
47 
49  bool operator()(const DSourceComboInfo* lhs, const DSourceComboInfo* rhs) const{return *lhs < *rhs;}
50 };
51 
52 /********************************************************** DEFINE USING STATEMENTS ***********************************************************/
53 
54 //DEFINE USING STATEMENTS
55 using DCombosByBeamBunch = map<vector<int>, vector<const DSourceCombo*>>;
56 using DSourceCombosByBeamBunchByUse = map<DSourceComboUse, DCombosByBeamBunch>;
57 //The DSourceCombosByUse_Large type uses a vector to pointer so that the combos can be easily copied and reused for another use
58 //e.g. when you can't place a mass cut yet: 2 different uses, identical combos: far faster to just copy the pointer to the large vector
59 using DSourceCombosByUse_Large = map<DSourceComboUse, vector<const DSourceCombo*>*>;
60 using DCombosByReaction = unordered_map<const DReaction*, vector<const DParticleCombo*>>;
61 
62 /************************************************************** DEFINE CLASSES ***************************************************************/
63 
64 class DSourceComboer : public JObject
65 {
67  {
68  d_ChargedStage = 0,
70  d_MixedStage
71  };
72 
73  enum class DConstructionStage
74  {
75  Input = 0,
76  Min_Particles,
77  Max_Particles,
78  In_Skim,
79  Charged_Combos,
80  Charged_RFBunch,
81  Full_Combos,
82  Neutral_RFBunch,
83  NoVertex_RFBunch,
84  HeavyNeutral_IM,
85  Beam_Combos,
86  MMVertex_Timing,
87  MMVertex_IMCuts,
88  AccuratePhoton_IM,
89  Reaction_BeamRFCuts,
90  Missing_Mass
91  };
92 
93  using DConstructionStageType = std::underlying_type<DConstructionStage>::type;
94 
95  public:
96 
97  DSourceComboer(void) = delete;
98  DSourceComboer(JEventLoop* locEventLoop);
99  ~DSourceComboer(void);
100 
101  //RESET
102  void Reset_NewEvent(JEventLoop* locEventLoop);
103 
104  //BUILD COMBOS (what should be called from the outside to do all of the work)
105  DCombosByReaction Build_ParticleCombos(const DReactionVertexInfo* locReactionVertexInfo);
106 
107  //Get combo characteristics
108  Charge_t Get_ChargeContent(const DSourceComboInfo* locSourceComboInfo) const{return dComboInfoChargeContent.find(locSourceComboInfo)->second;}
109  bool Get_HasMassiveNeutrals(const DSourceComboInfo* locSourceComboInfo) const{return (dComboInfosWithMassiveNeutrals.find(locSourceComboInfo) != dComboInfosWithMassiveNeutrals.end());}
110  bool Get_HasPhotons(const DSourceComboInfo* locSourceComboInfo) const{return (dComboInfosWithPhotons.find(locSourceComboInfo) != dComboInfosWithPhotons.end());}
111 
112  //Combo utility functions
113  const DSourceCombo* Get_StepSourceCombo(const DReaction* locReaction, size_t locDesiredStepIndex, const DSourceCombo* locVertexPrimaryCombo, size_t locVertexPrimaryStepIndex = 0) const;
114  const DSourceCombo* Get_VertexPrimaryCombo(const DSourceCombo* locReactionCombo, const DReactionStepVertexInfo* locStepVertexInfo) const;
115  const DSourceCombo* Get_VertexPrimaryCombo(const DSourceCombo* locReactionCombo, const DReactionStepVertexInfo* locStepVertexInfo);
116  pair<DSourceComboUse, size_t> Get_StepSourceComboUse(const DReaction* locReaction, size_t locDesiredStepIndex, DSourceComboUse locVertexPrimaryComboUse, size_t locVertexPrimaryStepIndex) const;
117 
118  //Get combo uses
119  DSourceComboUse Get_SourceComboUse(const DReactionStepVertexInfo* locStepVertexInfo) const{return dSourceComboUseReactionMap.find(locStepVertexInfo)->second;};
120  DSourceComboUse Get_SourceComboUse(const DReaction* locReaction, size_t locStepIndex) const{return dSourceComboUseReactionStepMap.find(locReaction)->second.find(locStepIndex)->second;};
121  DSourceComboUse Get_PrimaryComboUse(const DReactionVertexInfo* locReactionVertexInfo) const{return Get_SourceComboUse(locReactionVertexInfo->Get_StepVertexInfo(0));};
122 
123  DParticleComboCreator* Get_ParticleComboCreator(void) const{return dParticleComboCreator;}
124  void Print_NumCombosByUse(void);
125 
126  private:
127 
128  /********************************************************** DECLARE MEMBER FUNCTIONS ***********************************************************/
129 
130  //SETUP
131  void Define_DefaultCuts(void);
132  void Get_CommandLineCuts_dEdx(void);
133  void Get_CommandLineCuts_EOverP(void);
134  void Create_CutFunctions(void);
135  void Setup_NeutralShowers(JEventLoop* locEventLoop);
136  void Recycle_Vectors(void);
137 
138  //INITIAL CHECKS
139  bool Check_Reactions(vector<const DReaction*>& locReactions);
140  bool Check_NumParticles(const DReaction* locReaction);
141  bool Check_Skims(const DReaction* locReaction) const;
142 
143  //PARTICLE CUTS
144  bool Cut_dEdxAndEOverP(const DChargedTrackHypothesis* locHypo);
145  bool Cut_dEdx(Particle_t locPID, DetectorSystem_t locSystem, double locP, double locdEdx);
146  bool Cut_EOverP(Particle_t locPID, DetectorSystem_t locSystem, double locP, double locEOverP);
147  void Fill_CutHistograms(void);
148  void Fill_SurvivalHistograms(void);
149 
150  //CREATE PHOTON COMBO INFOS & USES
151  void Create_SourceComboInfos(const DReactionVertexInfo* locReactionVertexInfo);
152  DSourceComboUse Create_ZDependentSourceComboUses(const DReactionVertexInfo* locReactionVertexInfo, const DSourceCombo* locReactionChargedCombo);
153  DSourceComboUse Build_NewZDependentUse(const DReaction* locReaction, size_t locStepIndex, signed char locVertexZBin, const DSourceComboUse& locOrigUse, const unordered_map<size_t, DSourceComboUse>& locCreatedUseMap);
154  DSourceComboUse Get_ZIndependentUse(const DSourceComboUse& locZDependentUse);
155  const DSourceComboInfo* Get_ZIndependentComboInfo(const DSourceComboInfo* locZDependentComboInfo);
156 
157  //CREATE PHOTON COMBO INFOS & USES: UTILITY METHODS
158  map<Particle_t, unsigned char> Build_ParticleMap(const DReaction* locReaction, size_t locStepIndex, Charge_t locCharge) const;
159  pair<bool, map<DSourceComboUse, unsigned char>> Get_FinalStateDecayingComboUses(const DReaction* locReaction, size_t locStepIndex, const map<size_t, DSourceComboUse>& locStepComboUseMap) const;
160  DSourceComboUse Make_ComboUse(Particle_t locInitPID, const map<Particle_t, unsigned char>& locNumParticles, const map<DSourceComboUse, unsigned char>& locFurtherDecays, bool locMissingDecayProductFlag, Particle_t locTargetToInclude);
161  const DSourceComboInfo* MakeOrGet_SourceComboInfo(const vector<pair<Particle_t, unsigned char>>& locNumParticles, const vector<pair<DSourceComboUse, unsigned char>>& locFurtherDecays, unsigned char locNumTabs);
162  const DSourceComboInfo* GetOrMake_SourceComboInfo(const vector<pair<Particle_t, unsigned char>>& locNumParticles, const vector<pair<DSourceComboUse, unsigned char>>& locFurtherDecays, unsigned char locNumTabs);
163 
164  //CREATE COMBOS
165  void Combo_WithNeutralsAndBeam(const vector<const DReaction*>& locReactions, const DReactionVertexInfo* locReactionVertexInfo, const DSourceComboUse& locPrimaryComboUse, const DSourceCombo* locReactionChargedCombo, const vector<int>& locBeamBunches_Charged, DCombosByReaction& locOutputComboMap);
166  void Combo_WithBeam(const vector<const DReaction*>& locReactions, const DReactionVertexInfo* locReactionVertexInfo, const DSourceComboUse& locReactionFullComboUse, const DSourceCombo* locReactionFullCombo, int locRFBunch, DCombosByReaction& locOutputComboMap);
167  const DParticleCombo* Build_ParticleCombo(const DReactionVertexInfo* locReactionVertexInfo, const DSourceCombo* locFullCombo, const DKinematicData* locBeamParticle);
168 
169  //CREATE SOURCE COMBOS - GENERAL METHODS
170  void Create_SourceCombos(const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, unsigned char locNumTabs);
171  void Create_SourceCombos_Unknown(const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, unsigned char locNumTabs);
172 
173  //COMBO VERTICALLY METHODS
174  //Note that vertical comboing always takes place at the same vertex-z
175  void Combo_Vertically_AllDecays(const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, unsigned char locNumTabs);
176  void Combo_Vertically_NDecays(const DSourceComboUse& locComboUseToCreate, const DSourceComboUse& locNMinus1ComboUse, const DSourceComboUse& locSourceComboDecayUse, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, unsigned char locNumTabs);
177  void Combo_Vertically_AllParticles(const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage, unsigned char locNumTabs);
178  void Combo_Vertically_NParticles(const DSourceComboUse& locComboUseToCreate, const DSourceComboUse& locNMinus1ComboUse, ComboingStage_t locComboingStage, unsigned char locNumTabs);
179 
180  //COMBO HORIZONTALLY ORGANIZATION METHODS
181  void Combo_Horizontally_All(const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, unsigned char locNumTabs);
182  void Combo_Horizontally_AddDecay(const DSourceComboUse& locComboUseToCreate, const DSourceComboUse& locComboUseAllBut1, const DSourceComboUse& locComboUseToAdd, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, bool locExpandAllBut1Flag, unsigned char locNumTabs);
183  void Combo_Horizontally_AddParticles(const DSourceComboUse& locComboUseToCreate, const DSourceComboUse& locComboUseAllBut1, const pair<Particle_t, unsigned char>& locParticlePairToAdd, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, bool locExpandAllBut1Flag, unsigned char locNumTabs);
184 
185  //COMBO HORIZONTALLY COMBOING METHODS
186  void Create_Combo_OneParticle(const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage, unsigned char locNumTabs);
187  void Create_Combo_OneDecay(const DSourceComboUse& locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, unsigned char locNumTabs);
188  void Combo_Horizontally_AddCombo(const DSourceComboUse& locComboUseToCreate, const DSourceComboUse& locAllBut1ComboUse, const DSourceComboUse& locSourceComboUseToAdd, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, bool locExpandAllBut1Flag, unsigned char locNumTabs);
189  void Combo_Horizontally_AddParticle(const DSourceComboUse& locComboUseToCreate, const DSourceComboUse& locAllBut1ComboUse, Particle_t locPID, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding, unsigned char locNumTabs);
190 
191  //BUILD/RETRIEVE RESUME-AT ITERATORS
192  void Build_ParticleIndices(Particle_t locPID, const vector<int>& locBeamBunches, const vector<const JObject*>& locParticles, signed char locVertexZBin);
193  void Build_ComboIndices(const DSourceComboUse& locSourceComboUse, const vector<int>& locBeamBunches, const vector<const DSourceCombo*>& locCombos, ComboingStage_t locComboingStage);
194  size_t Get_ResumeAtIndex_Particles(Particle_t locPID, const JObject* locPreviousObject, vector<int> locBeamBunches, signed char locVertexZBin) const;
195  size_t Get_ResumeAtIndex_Combos(const DSourceComboUse& locSourceComboUse, const DSourceCombo* locPreviousCombo, const vector<int>& locBeamBunches, ComboingStage_t locComboingStage) const;
196 
197  //GET POTENTIAL PARTICLES & COMBOS FOR COMBOING
198  const vector<const DSourceCombo*>& Get_CombosForComboing(const DSourceComboUse& locComboUse, ComboingStage_t locComboingStage, const vector<int>& locBeamBunches, const DSourceCombo* locChargedCombo_PresidingPrevious);
199  const vector<const DSourceCombo*>& Get_CombosByBeamBunch(const DSourceComboUse& locComboUse, DCombosByBeamBunch& locCombosByBunch, const vector<int>& locBeamBunches, ComboingStage_t locComboingStage);
200 
201  //REGISTER VALID RF BUNCHES
202  void Register_ValidRFBunches(const DSourceComboUse& locSourceComboUse, const DSourceCombo* locSourceCombo, const vector<int>& locRFBunches, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding);
203  void Build_ComboResumeIndices(const DSourceComboUse& locSourceComboUse, ComboingStage_t locComboingStage, const DSourceCombo* locChargedCombo_Presiding);
204 
205  //PARTICLE UTILITY FUNCTIONS
206  const vector<const JObject*>& Get_ParticlesForComboing(Particle_t locPID, ComboingStage_t locComboingStage, const vector<int>& locBeamBunches = {}, signed char locVertexZBin = 0);
207  const vector<const JObject*>& Get_ShowersByBeamBunch(const vector<int>& locBeamBunches, DPhotonShowersByBeamBunch& locShowersByBunch, signed char locVertexZBin);
208  shared_ptr<const DKinematicData> Create_KinematicData(const DNeutralShower* locNeutralShower, const DVector3& locVertex) const;
209  bool Get_IsComboingZIndependent(const JObject* locObject, Particle_t locPID) const;
210 
211  //COMBO UTILITY FUNCTIONS
212  DSourceCombosByUse_Large& Get_CombosSoFar(ComboingStage_t locComboingStage, Charge_t locChargeContent_SearchForUse, const DSourceCombo* locChargedCombo = nullptr);
213  DSourceCombosByBeamBunchByUse& Get_SourceCombosByBeamBunchByUse(Charge_t locChargeContent_SearchForUse, const DSourceCombo* locChargedCombo = nullptr);
214  void Copy_ZIndependentMixedResults(const DSourceComboUse& locComboUseToCreate, const DSourceCombo* locChargedCombo_Presiding);
215  const DSourceCombo* Get_ChargedCombo_WithNow(const DSourceCombo* locChargedCombo_Presiding, const DSourceComboInfo* locToCreateComboInfo, ComboingStage_t locComboingStage) const;
216  const DSourceCombo* Get_NextChargedCombo(const DSourceCombo* locChargedCombo_Presiding, const DSourceComboUse& locNextComboUse, ComboingStage_t locComboingStage, bool locGetPresidingFlag, size_t locInstance) const;
217  bool Get_ExpandAllBut1Flag(ComboingStage_t locComboingStage, const DSourceComboUse& locAllBut1ComboUse, Charge_t locToAddChargeContent);
218  bool Get_PromoteFlag(ComboingStage_t locComboingStage, Particle_t locDecayPID_UseToCheck, const DSourceComboInfo* locComboInfo_UseToCreate, const DSourceComboInfo* locComboInfo_UseToCheck, DSourceComboUse& locNonNeutralUse) const;
219  const DSourceCombo* Find_Combo_AtThisStep(const DSourceCombo* locSourceCombo, DSourceComboUse locUseToFind, size_t locDecayInstanceIndex) const;
220  void Check_ForDuplicates(const vector<const DSourceCombo*>& locCombos) const;
221  DSourceComboUse Find_ZDependentUse_AtThisStep(const DSourceComboUse& locSourceComboUse, DSourceComboUse locUseToFind, size_t locDecayInstanceIndex) const;
222 
223  //GET RESOURCES
224  DSourceCombo* Get_SourceComboResource(void);
225  vector<const DSourceCombo*>* Get_SourceComboVectorResource(void);
226 
227  /************************************************************** DEFINE MEMBERS ***************************************************************/
228 
229  //CONTROL INFORMATION
230  uint64_t dEventNumber = 0; //re-setup on new events
231  string dShowerSelectionTag = "PreSelect";
232  int dDebugLevel = 0;
233  bool dPrintCutFlag = false;
234 
235  //EXPERIMENT INFORMATION
237 
238  //RF BUNCH CUTS
239  pair<bool, size_t> dNumPlusMinusRFBunches = std::make_pair(false, 0); //by default use DReaction cut //only use this if set on command line
240  unordered_map<const DReaction*, size_t> dRFBunchCutsByReaction;
241  unordered_map<const DReactionVertexInfo*, size_t> dMaxRFBunchCuts;
242 
243  //HANDLERS AND VERTEXERS
248 
249  //SOURCE COMBO INFOS: CREATED ONCE DURING DSOURCECOMBOER OBJECT CONSTRUCTION
250  //with some exceptions (specific vertex-z, etc.)
251  //want to make sure we only have one of each type: suggests using a set
252  //however, after the first few events, almost all of these have already been created: vector has faster lookup time
253  //therefore, use the set when creating the objects during construction, but then move the results into the vector and keep it sorted
254  set<const DSourceComboInfo*, DCompare_SourceComboInfos> dSourceComboInfoSet;
255  vector<const DSourceComboInfo*> dSourceComboInfos;
256  unordered_map<const DSourceComboInfo*, Charge_t> dComboInfoChargeContent;
257  unordered_set<const DSourceComboInfo*> dComboInfosWithMassiveNeutrals;
258  unordered_set<const DSourceComboInfo*> dComboInfosWithPhotons;
259  //the rest
260  unordered_map<const DReactionStepVertexInfo*, DSourceComboUse> dSourceComboUseReactionMap; //primary combo info (nullptr if none)
261  //combo use -> step
262  map<pair<const DReactionStepVertexInfo*, DSourceComboUse>, size_t> dSourceComboInfoStepMap; //size_t: step index
263  //i need to go from step -> combo use
264  unordered_map<const DReaction*, map<size_t, DSourceComboUse>> dSourceComboUseReactionStepMap; //primary combo info (nullptr if none)
265  //with specific vertex-z's
266  map<pair<const DReactionVertexInfo*, vector<signed char>>, DSourceComboUse> dSourceComboUseVertexZMap;
267  map<DSourceComboUse, DSourceComboUse> dZDependentUseToIndependentMap; //from z-dependent -> z-independent
268 
269  //SKIM INFORMATION
270  const DESSkimData* dESSkimData = nullptr;
271 
272  //PARTICLES
273  size_t dMaxNumNeutrals = 20;
274  map<Particle_t, vector<const JObject*>> dTracksByPID;
276  map<bool, vector<const JObject*>> dTracksByCharge; //true/false: positive/negative
277  unordered_map<signed char, DPhotonShowersByBeamBunch> dShowersByBeamBunchByZBin; //char: zbin //for all showers: unknown z-bin, {} RF bunch
278 
279  //SOURCE COMBOS //vector: z-bin //if attempted and all failed, DSourceCombosByUse_Large vector will be empty
280  size_t dInitialComboVectorCapacity = 100;
282  unordered_map<const DSourceCombo*, DSourceCombosByUse_Large> dMixedCombosByUseByChargedCombo; //key: charged combo //value: contains mixed & neutral combos //neutral: key is nullptr
283  //also, sort by which beam bunches they are valid for: that way when comboing, we can retrieve only the combos that can possibly match the input RF bunches
284  unordered_map<const DSourceCombo*, DSourceCombosByBeamBunchByUse> dSourceCombosByBeamBunchByUse; //key: charged combo //value: contains mixed & neutral combos: key is nullptr
285  map<pair<const DSourceCombo*, const DReactionStepVertexInfo*>, const DSourceCombo*> dVertexPrimaryComboMap; //first combo: reaction primary combo (can be charged or full!)
286 
287  //RESUME SEARCH ITERATORS
288  //e.g. if a DSourceCombo is -> 2pi0, and we want to use it as a basis for building a combo of 3pi0s,
289  //then this iterator points to the first pi0 in the DSourceCombosByUse_Large vector that we want to test
290  //that way we save a lot of time, since we don't have to look for it again
291  //they are useful when comboing VERTICALLY, but cannot be used when comboing HORIZONTALLY
292  //e.g. when comboing a pi0 (with photons = A, D) with a single photon, the photon could be B, C, or E+: no single spot to resume at
293  map<tuple<const JObject*, Particle_t, vector<int>, signed char>, size_t> dResumeSearchAfterIndices_Particles; //vector<int>: RF bunches (empty for all) //signed char: zbin
294  map<pair<const DSourceCombo*, DSourceComboUse>, map<vector<int>, size_t>> dResumeSearchAfterIndices_Combos; //char: zbin, size_t: index
295 
296  //VALID RF BUNCHES BY COMBO
297  map<pair<const DSourceCombo*, signed char>, vector<int>> dValidRFBunches_ByCombo; //char: zbin
298 
299  //RESOURCE POOLS
300  //Don't use these directly! Use the Get_*Resource functions instead!!
303  //These are used to know what to recycle
304  vector<DSourceCombo*> dCreatedCombos;
305  vector<vector<const DSourceCombo*>*> dCreatedComboVectors;
306 
307  //Combo/event tracking
308  map<const DReaction*, TH1*> dNumEventsSurvivedStageMap;
309  map<const DReaction*, TH1*> dNumCombosSurvivedStageMap;
310  map<const DReaction*, TH2*> dNumCombosSurvivedStage2DMap;
311  map<const DReaction*, map<DConstructionStage, size_t>> dNumCombosSurvivedStageTracker; //index is for event stages!!!
312  map<DSourceComboUse, size_t> dNumMixedCombosMap_Charged;
313  map<DSourceComboUse, size_t> dNumMixedCombosMap_Mixed;
314  map<vector<const JObject*>, const DSourceCombo*> dNPhotonsToComboMap; //vector contents are auto-sorted by how they're created
315 
316  //dE/dx
317  map<Particle_t, map<DetectorSystem_t, pair<string, string>>> ddEdxCuts_TF1FunctionStrings; //pair: low bound, high bound
318  map<Particle_t, map<DetectorSystem_t, pair<vector<double>, vector<double>>>> ddEdxCuts_TF1Params; //pair: low bound, high bound
319  map<Particle_t, map<DetectorSystem_t, pair<TF1*, TF1*>>> ddEdxCutMap; //pair: first is lower bound, second is upper bound
320  map<Particle_t, map<DetectorSystem_t, vector<pair<double, double>>>> ddEdxValueMap; //pair: first is p, 2nd is dE/dx
321  map<Particle_t, map<DetectorSystem_t, TH2*>> dHistMap_dEdx;
322 
323  //E/p
324  map<Particle_t, map<DetectorSystem_t, string>> dEOverPCuts_TF1FunctionStrings;
325  map<Particle_t, map<DetectorSystem_t, vector<double>>> dEOverPCuts_TF1Params;
326  map<Particle_t, map<DetectorSystem_t, TF1*>> dEOverPCutMap; //if lepton, select above function, else select below
327  map<Particle_t, map<DetectorSystem_t, vector<pair<double, double>>>> dEOverPValueMap; //pair: first is p, 2nd is E/p
328  map<Particle_t, map<DetectorSystem_t, TH2*>> dHistMap_EOverP;
329 };
330 
331 /*********************************************************** INLINE MEMBER FUNCTION DEFINITIONS ************************************************************/
332 
333 
334 inline DSourceCombo* DSourceComboer::Get_SourceComboResource(void)
335 {
336  auto locCombo = dResourcePool_SourceCombo.Get_Resource();
337  dCreatedCombos.push_back(locCombo);
338  return locCombo;
339 }
340 
341 inline void DSourceComboer::Recycle_Vectors(void)
342 {
343  for(auto& locComboVector : dCreatedComboVectors)
344  {
345  vector<const DSourceCombo*> locTempCombo;
346  locTempCombo.reserve(dInitialComboVectorCapacity);
347  locTempCombo.swap(*locComboVector); //reduces capacity of combo vector to dInitialComboVectorCapacity
348  dResourcePool_SourceComboVector.Recycle(locComboVector);
349  }
350  decltype(dCreatedComboVectors)().swap(dCreatedComboVectors);
351 }
352 
353 inline vector<const DSourceCombo*>* DSourceComboer::Get_SourceComboVectorResource(void)
354 {
355  auto locComboVector = dResourcePool_SourceComboVector.Get_Resource();
356  locComboVector->clear();
357  locComboVector->reserve(dInitialComboVectorCapacity);
358  dCreatedComboVectors.push_back(locComboVector);
359  return locComboVector;
360 }
361 
362 inline bool DSourceComboer::Check_Skims(const DReaction* locReaction) const
363 {
364  if(dESSkimData == nullptr)
365  return true;
366 
367  string locReactionSkimString = locReaction->Get_EventStoreSkims();
368  vector<string> locReactionSkimVector;
369  SplitString(locReactionSkimString, locReactionSkimVector, ",");
370  for(size_t loc_j = 0; loc_j < locReactionSkimVector.size(); ++loc_j)
371  {
372  if(!dESSkimData->Get_IsEventSkim(locReactionSkimVector[loc_j]))
373  return false;
374  }
375 
376  return true;
377 }
378 
379 inline DSourceComboUse DSourceComboer::Get_ZIndependentUse(const DSourceComboUse& locZDependentUse)
380 {
381  auto locIterator = dZDependentUseToIndependentMap.find(locZDependentUse);
382  if(locIterator != dZDependentUseToIndependentMap.end())
383  return locIterator->second;
384 
385  auto locZIndependentComboInfo = Get_ZIndependentComboInfo(std::get<2>(locZDependentUse));
386  DSourceComboUse locZIndependentUse(std::get<0>(locZDependentUse), DSourceComboInfo::Get_VertexZIndex_ZIndependent(), locZIndependentComboInfo, std::get<3>(locZDependentUse), std::get<4>(locZDependentUse));
387  dZDependentUseToIndependentMap.emplace(locZDependentUse, locZIndependentUse);
388  return locZIndependentUse;
389 }
390 
391 inline const DSourceComboInfo* DSourceComboer::Get_ZIndependentComboInfo(const DSourceComboInfo* locZDependentComboInfo)
392 {
393  vector<pair<DSourceComboUse, unsigned char>> locFurtherDecays_ZIndependent;
394  for(const auto& locDecayPair : locZDependentComboInfo->Get_FurtherDecays())
395  locFurtherDecays_ZIndependent.emplace_back(Get_ZIndependentUse(locDecayPair.first), locDecayPair.second);
396 
397  return GetOrMake_SourceComboInfo(locZDependentComboInfo->Get_NumParticles(), locFurtherDecays_ZIndependent, 0);
398 }
399 
400 inline void DSourceComboer::Build_ParticleIndices(Particle_t locPID, const vector<int>& locBeamBunches, const vector<const JObject*>& locParticles, signed char locVertexZBin)
401 {
402  for(size_t loc_i = 0; loc_i < locParticles.size(); ++loc_i)
403  {
404  if(dDebugLevel >= 20)
405  {
406  cout << "build resume indices: vector address, locPID, particle, zbin, index, bunches: " << &locParticles << ", " << locPID << ", " << locParticles[loc_i] << ", " << int(locVertexZBin) << ", " << loc_i << ", ";
407  for(auto& locBunch : locBeamBunches)
408  cout << locBunch << ", ";
409  cout << endl;
410  }
411  dResumeSearchAfterIndices_Particles.emplace(std::make_tuple(locParticles[loc_i], locPID, locBeamBunches, locVertexZBin), loc_i);
412  }
413 }
414 
415 inline void DSourceComboer::Build_ComboIndices(const DSourceComboUse& locSourceComboUse, const vector<int>& locBeamBunches, const vector<const DSourceCombo*>& locCombos, ComboingStage_t locComboingStage)
416 {
417  for(size_t loc_i = 0; loc_i < locCombos.size(); ++loc_i)
418  {
419  if(dDebugLevel >= 20)
420  {
421  cout << "build resume indices: vector address, combo, decay pid, zbin, index, bunches: " << &locCombos << ", " << locCombos[loc_i] << ", " << std::get<0>(locSourceComboUse) << ", " << int(std::get<1>(locSourceComboUse)) << ", " << loc_i << ", ";
422  for(auto& locBunch : locBeamBunches)
423  cout << locBunch << ", ";
424  cout << endl;
425  }
426  dResumeSearchAfterIndices_Combos[std::make_pair(locCombos[loc_i], locSourceComboUse)].emplace(locBeamBunches, loc_i);
427  }
428 }
429 
430 inline size_t DSourceComboer::Get_ResumeAtIndex_Particles(Particle_t locPID, const JObject* locPreviousObject, vector<int> locBeamBunches, signed char locVertexZBin) const
431 {
432  if((ParticleCharge(locPID) == 0) && (ParticleMass(locPID) > 0.0))
433  {
434  locPID = Gamma;
435  locBeamBunches = {}; //need to get all showers
436  }
437  auto locParticleTuple = std::make_tuple(locPreviousObject, locPID, locBeamBunches, locVertexZBin);
438  if(dDebugLevel >= 20)
439  {
440  cout << "object, pid, zbin, bunches, find result, saved index: " << locPreviousObject << ", " << locPID << ", " << int(locVertexZBin) << ", ";
441  for(auto& locBunch : locBeamBunches)
442  cout << locBunch << ", ";
443  cout << (dResumeSearchAfterIndices_Particles.find(locParticleTuple) != dResumeSearchAfterIndices_Particles.end()) << ", " << dResumeSearchAfterIndices_Particles.find(locParticleTuple)->second + 1 << endl;
444  }
445  return dResumeSearchAfterIndices_Particles.find(locParticleTuple)->second + 1;
446 }
447 
448 inline size_t DSourceComboer::Get_ResumeAtIndex_Combos(const DSourceComboUse& locSourceComboUse, const DSourceCombo* locPreviousCombo, const vector<int>& locBeamBunches, ComboingStage_t locComboingStage) const
449 {
450  //Suppose you are comboing N pi0s together (let's say 3), and 6 different pi0 combos were reconstructed
451  //So, you choose the first pi0, then want to loop over the remaining ones
452  //To avoid duplication, you don't want to loop over ALL of the others, only the ones AFTER the first one
453  //So, the input is the last pi0 that you've chosen for your combo
454  //Then, just find the location where that pi0 is the possible-combos-vector (pi0 vector), and return that index + 1
455  auto locSearchPair = std::make_pair(locPreviousCombo, locSourceComboUse);
456  auto& locBunchIndexMap = dResumeSearchAfterIndices_Combos.find(locSearchPair)->second;
457  auto locSavedIndex = locBunchIndexMap.find(locBeamBunches)->second;
458  if(dDebugLevel >= 20)
459  {
460  cout << "Get_ResumeAtIndex_Combos: previous combo, bunches, saved index" << ", " << locPreviousCombo << ", ";
461  for(auto& locBunch : locBeamBunches)
462  cout << locBunch << ", ";
463  cout << locSavedIndex << endl;
464  }
465  return locSavedIndex + 1;
466 }
467 
468 inline bool DSourceComboer::Get_IsComboingZIndependent(const JObject* locObject, Particle_t locPID) const
469 {
470  //make this virtual!
471  if(ParticleCharge(locPID) != 0)
472  return true;
473 
474  //actually, everything is z-dependent for massive neutrals.
475  //however the momentum is SO z-dependent, that we can't cut on it until the end when we have the final vertex, AFTER comboing
476  //a mere z-bin is not enough.
477  //So, as far as COMBOING is concerned, massive neutrals are Z-INDEPENDENT
478  if(ParticleMass(locPID) > 0.0)
479  return true;
480 
481  auto locNeutralShower = static_cast<const DNeutralShower*>(locObject);
482  return (locNeutralShower->dDetectorSystem == SYS_FCAL);
483 }
484 
485 inline DSourceCombosByUse_Large& DSourceComboer::Get_CombosSoFar(ComboingStage_t locComboingStage, Charge_t locChargeContent_SearchForUse, const DSourceCombo* locChargedCombo)
486 {
487  //THE INPUT locChargedCombo MUST BE:
488  //If reading from: Whatever charged combo PREVIOUSLY presided over the creation of the combos you're trying to get
489  //If saving to (you are making a mixed): Whatever charged combo is presiding over what you are about to make
490 
491  //NOTE: If on mixed stage, it is NOT valid to get fully-charged combos from here! In fact, what you want is probably the input combo!
492  if((locComboingStage == d_ChargedStage) || (locChargeContent_SearchForUse == d_Charged))
493  return dSourceCombosByUse_Charged;
494  else if(locChargeContent_SearchForUse == d_Neutral)
495  return dMixedCombosByUseByChargedCombo[nullptr]; //if fully neutral, then the charged combo doesn't matter: only matters for mixing charges
496  return dMixedCombosByUseByChargedCombo[locChargedCombo];
497 }
498 
499 inline DSourceCombosByBeamBunchByUse& DSourceComboer::Get_SourceCombosByBeamBunchByUse(Charge_t locChargeContent_SearchForUse, const DSourceCombo* locChargedCombo)
500 {
501 //shouldn't ever be called if charged
502  //THE INPUT locChargedCombo MUST BE:
503  //If reading from: Whatever charged combo PREVIOUSLY presided over the creation of the combos you're trying to get
504  //If saving to (you are making a mixed): Whatever charged combo is presiding over what you are about to make
505  if(locChargeContent_SearchForUse == d_Neutral)
506  return dSourceCombosByBeamBunchByUse[nullptr];
507  return dSourceCombosByBeamBunchByUse[locChargedCombo];
508 }
509 
510 inline bool DSourceComboer::Cut_dEdx(Particle_t locPID, DetectorSystem_t locSystem, double locP, double locdEdx)
511 {
512  ddEdxValueMap[locPID][locSystem].emplace_back(locP, locdEdx);
513  if(ddEdxCutMap[locPID].find(locSystem) == ddEdxCutMap[locPID].end())
514  return true;
515 
516  auto locCutPair = ddEdxCutMap[locPID][locSystem];
517 //cout << "PID, p, dedx, cut value low/high, cut result: " << locPID << ", " << locP << ", " << locdEdx << ", " << locCutPair.first->Eval(locP) << ", " << locCutPair.second->Eval(locP) << ", " << ((locdEdx >= locCutPair.first->Eval(locP)) && (locdEdx <= locCutPair.second->Eval(locP))) << endl;
518  return ((locdEdx >= locCutPair.first->Eval(locP)) && (locdEdx <= locCutPair.second->Eval(locP)));
519 }
520 
521 inline bool DSourceComboer::Cut_EOverP(Particle_t locPID, DetectorSystem_t locSystem, double locP, double locEOverP)
522 {
523  dEOverPValueMap[locPID][locSystem].emplace_back(locP, locEOverP);
524  if(dEOverPCutMap[locPID].find(locSystem) == dEOverPCutMap[locPID].end())
525  return true;
526 
527  auto locCutFunc = dEOverPCutMap[locPID][locSystem];
528  return (IsLepton(locPID) == (locEOverP >= locCutFunc->Eval(locP)));
529 }
530 
531 inline DSourceComboer::~DSourceComboer(void)
532 {
533  //no need for a resource pool for these objects, as they will exist for the length of the program
534  Fill_SurvivalHistograms();
535  if(dDebugLevel >= 5)
536  {
537  Print_NumCombosByUse(); //for the final event
538 
539  cout << "FINAL Num combos by use (charged):" << endl;
540  for(const auto& locNumCombosByUsePair : dNumMixedCombosMap_Charged)
541  {
542  cout << locNumCombosByUsePair.second << " of ";
543  Print_SourceComboUse(locNumCombosByUsePair.first);
544  }
545  cout << "FINAL Num combos by use (neutral/mixed):" << endl;
546  for(const auto& locNumCombosByUsePair : dNumMixedCombosMap_Mixed)
547  {
548  cout << locNumCombosByUsePair.second << " of ";
549  Print_SourceComboUse(locNumCombosByUsePair.first);
550  }
551 
552  }
553  for(auto locComboInfo : dSourceComboInfos)
554  delete locComboInfo;
555  delete dSourceComboVertexer;
556  delete dSourceComboP4Handler;
557  delete dSourceComboTimeHandler;
558  delete dParticleComboCreator;
559 }
560 
561 
562 /*********************************************************** INLINE NAMESPACE-SCOPE FUNCTION DEFINITIONS ************************************************************/
563 
564 } //end DAnalysis namespace
565 
566 #endif // DSourceComboer_h
DSourceCombosByUse_Large dSourceCombosByUse_Charged
set< const DSourceComboInfo *, DCompare_SourceComboInfos > dSourceComboInfoSet
string Get_EventStoreSkims(void) const
Definition: DReaction.h:103
map< tuple< const JObject *, Particle_t, vector< int >, signed char >, size_t > dResumeSearchAfterIndices_Particles
DSourceComboP4Handler * dSourceComboP4Handler
map< vector< int >, vector< const DSourceCombo * >> DCombosByBeamBunch
unordered_map< const DReaction *, map< size_t, DSourceComboUse > > dSourceComboUseReactionStepMap
DSourceComboUse Get_SourceComboUse(const DReactionStepVertexInfo *locStepVertexInfo) const
map< vector< int >, vector< const JObject * >> DPhotonShowersByBeamBunch
map< Particle_t, map< DetectorSystem_t, vector< double > > > dEOverPCuts_TF1Params
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_dEdx
TVector3 DVector3
Definition: DVector3.h:14
map< const DReaction *, TH1 * > dNumCombosSurvivedStageMap
unordered_set< const DSourceComboInfo * > dComboInfosWithPhotons
const DReactionStepVertexInfo * Get_StepVertexInfo(size_t locStepIndex) const
vector< DSourceCombo * > dCreatedCombos
unordered_set< const DSourceComboInfo * > dComboInfosWithMassiveNeutrals
map< pair< const DSourceCombo *, signed char >, vector< int > > dValidRFBunches_ByCombo
map< pair< const DReactionVertexInfo *, vector< signed char > >, DSourceComboUse > dSourceComboUseVertexZMap
unordered_map< const DReaction *, size_t > dRFBunchCutsByReaction
unordered_map< const DSourceCombo *, DSourceCombosByBeamBunchByUse > dSourceCombosByBeamBunchByUse
std::underlying_type< DConstructionStage >::type DConstructionStageType
map< bool, vector< const JObject * > > dTracksByCharge
map< Particle_t, map< DetectorSystem_t, vector< pair< double, double > > > > dEOverPValueMap
DetectorSystem_t
Definition: GlueX.h:15
map< Particle_t, map< DetectorSystem_t, pair< TF1 *, TF1 * > > > ddEdxCutMap
unordered_map< const DReactionVertexInfo *, size_t > dMaxRFBunchCuts
vector< pair< Particle_t, unsigned char > > Get_NumParticles(bool locEntireChainFlag=false) const
Definition: DSourceCombo.h:247
static int ParticleCharge(Particle_t p)
map< pair< const DSourceCombo *, const DReactionStepVertexInfo * >, const DSourceCombo * > dVertexPrimaryComboMap
Charge_t
DSourceComboTimeHandler * dSourceComboTimeHandler
DResourcePool< DSourceCombo > dResourcePool_SourceCombo
unordered_map< const DSourceComboInfo *, Charge_t > dComboInfoChargeContent
tuple< Particle_t, signed char, const DSourceComboInfo *, bool, Particle_t > DSourceComboUse
Definition: DSourceCombo.h:34
map< pair< const DReactionStepVertexInfo *, DSourceComboUse >, size_t > dSourceComboInfoStepMap
DParticleComboCreator * Get_ParticleComboCreator(void) const
vector< vector< const DSourceCombo * > * > dCreatedComboVectors
map< DSourceComboUse, vector< const DSourceCombo * > * > DSourceCombosByUse_Large
DParticleComboCreator * dParticleComboCreator
Charge_t Get_ChargeContent(const DSourceComboInfo *locSourceComboInfo) const
DSourceComboUse Get_PrimaryComboUse(const DReactionVertexInfo *locReactionVertexInfo) const
map< const DReaction *, TH1 * > dNumEventsSurvivedStageMap
bool Get_HasPhotons(const DSourceComboInfo *locSourceComboInfo) const
vector< const DSourceComboInfo * > dSourceComboInfos
DSourceComboUse Get_SourceComboUse(const DReaction *locReaction, size_t locStepIndex) const
map< DSourceComboUse, size_t > dNumMixedCombosMap_Charged
void SplitString(string str, vector< T > &vec, const string &delim=" ")
Definition: SplitString.h:7
Definition: GlueX.h:22
map< Particle_t, vector< const JObject * > > dTracksByPID
unordered_map< const DSourceCombo *, DSourceCombosByUse_Large > dMixedCombosByUseByChargedCombo
map< Particle_t, map< DetectorSystem_t, vector< pair< double, double > > > > ddEdxValueMap
static int IsLepton(Particle_t p)
Definition: particleType.h:137
map< DSourceComboUse, DSourceComboUse > dZDependentUseToIndependentMap
map< DSourceComboUse, DCombosByBeamBunch > DSourceCombosByBeamBunchByUse
vector< pair< DSourceComboUse, unsigned char > > Get_FurtherDecays(void) const
Definition: DSourceCombo.h:76
unordered_map< const DReactionStepVertexInfo *, DSourceComboUse > dSourceComboUseReactionMap
static double ParticleMass(Particle_t p)
map< vector< const JObject * >, const DSourceCombo * > dNPhotonsToComboMap
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_EOverP
void Print_SourceComboUse(const DSourceComboUse &locComboUse, unsigned char locNumTabs=0, bool locIgnoreTabs=false)
Definition: DSourceCombo.h:337
DResourcePool< vector< const DSourceCombo * > > dResourcePool_SourceComboVector
map< DSourceComboUse, size_t > dNumMixedCombosMap_Mixed
unordered_map< signed char, DPhotonShowersByBeamBunch > dShowersByBeamBunchByZBin
map< const DReaction *, map< DConstructionStage, size_t > > dNumCombosSurvivedStageTracker
map< Particle_t, map< DetectorSystem_t, string > > dEOverPCuts_TF1FunctionStrings
map< Particle_t, map< DetectorSystem_t, pair< string, string > > > ddEdxCuts_TF1FunctionStrings
map< Particle_t, map< DetectorSystem_t, TF1 * > > dEOverPCutMap
map< Particle_t, map< DetectorSystem_t, pair< vector< double >, vector< double > > > > ddEdxCuts_TF1Params
bool operator()(const DSourceComboInfo *lhs, const DSourceComboInfo *rhs) const
bool Get_HasMassiveNeutrals(const DSourceComboInfo *locSourceComboInfo) const
map< const DReaction *, TH2 * > dNumCombosSurvivedStage2DMap
DSourceComboVertexer * dSourceComboVertexer
map< pair< const DSourceCombo *, DSourceComboUse >, map< vector< int >, size_t > > dResumeSearchAfterIndices_Combos
unordered_map< const DReaction *, vector< const DParticleCombo * >> DCombosByReaction
Particle_t
Definition: particleType.h:12