Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DSourceComboP4Handler.h
Go to the documentation of this file.
1 #ifndef DSourceComboP4Handler_h
2 #define DSourceComboP4Handler_h
3 
4 #include <unordered_map>
5 #include <vector>
6 #include <map>
7 #include <set>
8 
9 #include "TF1.h"
10 #include "TH1I.h"
11 #include "TH2I.h"
12 #include "TROOT.h"
13 #include "TFile.h"
14 #include "TDirectoryFile.h"
15 
16 #include "particleType.h"
17 #include "DLorentzVector.h"
18 #include "PID/DKinematicData.h"
19 #include "PID/DNeutralShower.h"
20 #include "PID/DChargedTrack.h"
21 #include "ANALYSIS/DSourceCombo.h"
23 
24 using namespace std;
25 using namespace jana;
26 
27 namespace DAnalysis
28 {
29 
31 class DSourceComboer;
32 
34 {
35  public:
36 
37  //CONSTRUCTORS
38  DSourceComboP4Handler(void) = delete;
39  DSourceComboP4Handler(DSourceComboer* locSourceComboer, bool locCreateHistsFlag = true);
40  ~DSourceComboP4Handler(void){Fill_Histograms();}
41  void Set_DebugLevel(int locDebugLevel){dDebugLevel = locDebugLevel;}
42 
43  //SET HANDLERS
44  void Set_SourceComboVertexer(const DSourceComboVertexer* locSourceComboVertexer){dSourceComboVertexer = locSourceComboVertexer;}
45  void Set_SourceComboTimeHandler(const DSourceComboTimeHandler* locSourceComboTimeHandler){dSourceComboTimeHandler = locSourceComboTimeHandler;}
46 
47  //SETUP FOR EACH EVENT
48  void Reset(void);
49  void Set_PhotonKinematics(const DPhotonKinematicsByZBin& locPhotonKinematics){dPhotonKinematics = locPhotonKinematics;}
50 
51  //GET CUTS
52  bool Get_InvariantMassCuts(Particle_t locPID, pair<float, float>& locMinMaxCuts_GeV) const;
53  bool Get_MissingMassSquaredCuts(Particle_t locPID, pair<TF1*, TF1*>& locMinMaxCuts_GeVSq) const;
54 
55  //GET/CALC PARTICLE P4
56  DLorentzVector Get_P4_NotMassiveNeutral(Particle_t locPID, const JObject* locObject, const DVector3& locVertex, bool locAccuratePhotonsFlag) const;
57  DLorentzVector Calc_MassiveNeutralP4(const DNeutralShower* locNeutralShower, Particle_t locPID, const DVector3& locVertex, double locVertexTime) const;
58 
59  //GET/CALC COMBO P4
60  //locRFVertexTime: the RF time propagated to the vertex, through any decaying particles if necessary
61  DLorentzVector Calc_P4_NoMassiveNeutrals(const DSourceCombo* locReactionCombo, const DSourceCombo* locVertexCombo, const DVector3& locVertex, signed char locVertexZBin, const DKinematicData* locBeamParticle, const DSourceComboUse& locToExcludeUse, size_t locInstanceToExclude, bool locAccuratePhotonsFlag);
62  DLorentzVector Calc_P4_SourceParticles(const DSourceCombo* locVertexCombo, const DVector3& locVertex, double locRFVertexTime, bool locAccuratePhotonsFlag);
63  bool Calc_P4_Decay(bool locIsProductionVertex, bool locIsPrimaryProductionVertex, const DSourceCombo* locReactionFullCombo, const DSourceComboUse& locDecayUse, const DSourceCombo* locDecayCombo, DVector3 locVertex, double locTimeOffset, int locRFBunch, double locRFVertexTime, DLorentzVector& locDecayP4, const DKinematicData* locBeamParticle, const DSourceComboUse& locToExcludeUse, size_t locInstanceToExclude, bool locAccuratePhotonsFlag);
64  bool Calc_P4_HasMassiveNeutrals(bool locIsProductionVertex, bool locIsPrimaryProductionVertex, const DSourceCombo* locReactionFullCombo, const DSourceCombo* locCurrentCombo, DVector3 locVertex, double locTimeOffset, int locRFBunch, double locRFVertexTime, const DSourceComboUse& locToExcludeUse, size_t locInstanceToExclude, DLorentzVector& locTotalP4, const DKinematicData* locBeamParticle, bool locAccuratePhotonsFlag);
65 
66  //CUT
67  //use this method when the combo DOES NOT contain massive neutrals
68  bool Cut_InvariantMass_NoMassiveNeutrals(const DSourceCombo* locVertexCombo, Particle_t locDecayPID, Particle_t locTargetPIDToSubtract, const DVector3& locVertex, signed char locVertexZBin, bool locAccuratePhotonsFlag);
69  bool Cut_InvariantMass_HasMassiveNeutral_OrPhotonVertex(const DReactionVertexInfo* locReactionVertexInfo, const DSourceCombo* locReactionFullCombo, vector<int>& locValidRFBunches);
70  bool Cut_InvariantMass_HasMassiveNeutral(bool locIsProductionVertex, bool locIsPrimaryProductionVertex, const DSourceCombo* locReactionFullCombo, const DSourceCombo* locVertexCombo, Particle_t locDecayPID, Particle_t locTargetPIDToSubtract, double locPrimaryVertexZ, const DVector3& locVertex, double locTimeOffset, vector<int>& locValidRFBunches, const DKinematicData* locBeamParticle, bool locAccuratePhotonsFlag);
71  bool Cut_InvariantMass_MissingMassVertex(const DReactionVertexInfo* locReactionVertexInfo, const DSourceCombo* locReactionFullCombo, const DKinematicData* locBeamParticle, int locRFBunch);
72  bool Cut_InvariantMass_AccuratePhotonKinematics(const DReactionVertexInfo* locReactionVertexInfo, const DSourceCombo* locReactionFullCombo, const DKinematicData* locBeamParticle, int locRFBunch);
73  bool Cut_MissingMassSquared(const DReaction* locReaction, const DReactionVertexInfo* locReactionVertexInfo, const DSourceComboUse& locReactionFullComboUse, const DSourceCombo* locReactionFullCombo, const DKinematicData* locBeamParticle, int locRFBunch);
74 
75  private:
76  DLorentzVector Get_P4(Particle_t locPID, const JObject* locObject, signed char locVertexZBin, int locRFBunch);
77  bool Get_InvariantMassCut(const DSourceCombo* locSourceCombo, Particle_t locDecayPID, bool locAccuratePhotonsFlag, pair<float, float>& locMinMaxMassCuts_GeV) const;
78  bool Cut_MissingMassSquared(const DReaction* locReaction, const DReactionVertexInfo* locReactionVertexInfo, const DSourceComboUse& locReactionFullComboUse, const DSourceCombo* locFullCombo, Particle_t locMissingPID, int locStepIndex, int locDecayStepIndex, const DLorentzVector& locInitialStateP4, int locRFBunch, const DKinematicData* locBeamParticle, DLorentzVector& locMissingP4);
79  void Fill_Histograms(void);
80 
81  int dDebugLevel = 0;
82  bool dPrintCutFlag = false;
83 
84  //Get/Set Cuts
85  void Define_DefaultCuts(void);
86  void Get_CommandLineCuts_MM2(void);
87  void Get_CommandLineCuts_IM(void);
88  void Get_CommandLineCuts_MissingEnergy(void);
89  void Create_CutFunctions(void);
90 
91  //HANDLERS
92  DSourceComboer* dSourceComboer; //for quickly determining whether a combo has a massive neutral or not, and to facilitate access to combo vertices
93  const DSourceComboVertexer* dSourceComboVertexer = nullptr; //for getting vertex positions & time offsets for massive neutral p4 calculations
94  const DSourceComboTimeHandler* dSourceComboTimeHandler = nullptr; //for getting the propagated RF time for massive neutral p4 calculations
95 
96  //NEUTRAL SHOWER DATA
97  DPhotonKinematicsByZBin dPhotonKinematics; //FCAL shower data at center of target, BCAL in vertex-z bins
98 
99  //TOTAL FINAL STATE FOUR-MOMENTUM
100  map<pair<const DSourceCombo*, signed char>, DLorentzVector> dFinalStateP4ByCombo; //signed char: vertex-z bin
101  //int: RF bunch //bool: is prod vertex //first combo: reaction full //kindata: beam //use: use to exclude //size_t: instance to exclude
102  map<tuple<bool, const DSourceCombo*, const DSourceCombo*, int, const DKinematicData*, DSourceComboUse, size_t>, DLorentzVector> dFinalStateP4ByCombo_HasMassiveNeutrals;
103 
104  //CUT DEFAULTS
105  string dDefaultMissingMassSquaredCutFunctionString = "[0]";
106  map<Particle_t, pair<string, string>> dMissingMassSquaredCuts_TF1FunctionStrings; //pair: low bound, high bound
107  map<Particle_t, pair<vector<double>, vector<double>>> dMissingMassSquaredCuts_TF1Params; //pair: low bound, high bound
108  pair<string, string> dMissingEnergyCuts_TF1FunctionStrings; //pair: low bound, high bound
109  pair<vector<double>, vector<double>> dMissingEnergyCuts_TF1Params; //pair: low bound, high bound
110 
111  //CUTS
112  double dMaxMassiveNeutralBeta = 0.99999;
113  double d2PhotonInvariantMassCutError = 0.02; //see derivation at top of .cc file
114  map<Particle_t, pair<double, double>> dInvariantMassCuts;
115  map<Particle_t, pair<TF1*, TF1*>> dMissingMassSquaredCuts; //cuts are function of beam energy //For none missing, Particle_t = unknown
116  pair<TF1*, TF1*> dMissingECuts; //for no-missing-particle only
117 
118  //HISTOGRAMS
120  vector<pair<float, float>> dMissingEVsBeamEnergy_PreMissMassSqCut;
122  vector<pair<float, float>> dMissingEVsBeamEnergy_PostMissMassSqCut;
124  vector<pair<float, float>> dMissingPtVsMissingE_PreMissMassSqCut;
126  vector<pair<float, float>> dMissingPtVsMissingE_PostMissMassSqCut;
127 
128  set<tuple<Particle_t, const DSourceCombo*>> dInvariantMassFilledSet; //only filled once per combo, even if used for different vertex-z bins!!!!
129  set<tuple<Particle_t, bool, const DSourceCombo*, const DSourceCombo*, int>> dInvariantMassFilledSet_MassiveNeutral; //int: RF bunch //bool: is prod vertex //first combo: reaction full
130  map<DetectorSystem_t, TH1*> dHistMap_2GammaMass; //SYS_BCAL/FCAL if both in bcal/fcal, SYS_NULL if one each
131  map<DetectorSystem_t, vector<float>> d2GammaInvariantMasses;
132  map<Particle_t, TH1*> dHistMap_InvariantMass;
133  map<Particle_t, TH2*> dHistMap_MissingMassSquaredVsBeamEnergy; //none missing = Unknown pid
134  map<Particle_t, vector<float>> dInvariantMasses;
135  map<Particle_t, vector<pair<float, float>>> dMissingMassPairs;
136 };
137 
138 inline void DSourceComboP4Handler::Reset(void)
139 {
140  Fill_Histograms();
141 
142  dInvariantMassFilledSet.clear();
143  dInvariantMassFilledSet_MassiveNeutral.clear();
144  dPhotonKinematics.clear();
145  dFinalStateP4ByCombo.clear();
146  dFinalStateP4ByCombo_HasMassiveNeutrals.clear();
147 }
148 
149 inline bool DSourceComboP4Handler::Get_InvariantMassCuts(Particle_t locPID, pair<float, float>& locMinMaxCuts_GeV) const
150 {
151  auto locIterator = dInvariantMassCuts.find(locPID);
152  if(locIterator == dInvariantMassCuts.end())
153  return false;
154  locMinMaxCuts_GeV = locIterator->second;
155  return true;
156 }
157 
158 inline bool DSourceComboP4Handler::Get_MissingMassSquaredCuts(Particle_t locPID, pair<TF1*, TF1*>& locMinMaxCuts_GeVSq) const
159 {
160  auto locIterator = dMissingMassSquaredCuts.find(locPID);
161  if(locIterator == dMissingMassSquaredCuts.end())
162  return false;
163  locMinMaxCuts_GeVSq = locIterator->second;
164  return true;
165 }
166 
167 }
168 
169 #endif // DSourceComboP4Handler_h
vector< pair< float, float > > dMissingPtVsMissingE_PostMissMassSqCut
DPhotonKinematicsByZBin dPhotonKinematics
map< Particle_t, vector< pair< float, float > > > dMissingMassPairs
map< DetectorSystem_t, vector< float > > d2GammaInvariantMasses
map< Particle_t, pair< double, double > > dInvariantMassCuts
TVector3 DVector3
Definition: DVector3.h:14
vector< pair< float, float > > dMissingEVsBeamEnergy_PreMissMassSqCut
unordered_map< signed char, unordered_map< const DNeutralShower *, shared_ptr< const DKinematicData >>> DPhotonKinematicsByZBin
map< Particle_t, vector< float > > dInvariantMasses
map< Particle_t, pair< vector< double >, vector< double > > > dMissingMassSquaredCuts_TF1Params
set< tuple< Particle_t, bool, const DSourceCombo *, const DSourceCombo *, int > > dInvariantMassFilledSet_MassiveNeutral
TLorentzVector DLorentzVector
map< tuple< bool, const DSourceCombo *, const DSourceCombo *, int, const DKinematicData *, DSourceComboUse, size_t >, DLorentzVector > dFinalStateP4ByCombo_HasMassiveNeutrals
tuple< Particle_t, signed char, const DSourceComboInfo *, bool, Particle_t > DSourceComboUse
Definition: DSourceCombo.h:34
map< Particle_t, TH1 * > dHistMap_InvariantMass
map< Particle_t, TH2 * > dHistMap_MissingMassSquaredVsBeamEnergy
map< Particle_t, pair< TF1 *, TF1 * > > dMissingMassSquaredCuts
vector< pair< float, float > > dMissingPtVsMissingE_PreMissMassSqCut
map< pair< const DSourceCombo *, signed char >, DLorentzVector > dFinalStateP4ByCombo
pair< string, string > dMissingEnergyCuts_TF1FunctionStrings
void Set_DebugLevel(int locDebugLevel)
void Set_SourceComboVertexer(const DSourceComboVertexer *locSourceComboVertexer)
pair< vector< double >, vector< double > > dMissingEnergyCuts_TF1Params
vector< pair< float, float > > dMissingEVsBeamEnergy_PostMissMassSqCut
map< Particle_t, pair< string, string > > dMissingMassSquaredCuts_TF1FunctionStrings
void Set_SourceComboTimeHandler(const DSourceComboTimeHandler *locSourceComboTimeHandler)
void Set_PhotonKinematics(const DPhotonKinematicsByZBin &locPhotonKinematics)
set< tuple< Particle_t, const DSourceCombo * > > dInvariantMassFilledSet
map< DetectorSystem_t, TH1 * > dHistMap_2GammaMass
Particle_t
Definition: particleType.h:12