Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DEventWriterROOT.h
Go to the documentation of this file.
1 #ifndef _DEventWriterROOT_
2 #define _DEventWriterROOT_
3 
4 #include <map>
5 #include <string>
6 
7 #include "TClonesArray.h"
8 #include "TLorentzVector.h"
9 #include "TVector3.h"
10 #include "TTree.h"
11 #include "TFile.h"
12 #include "TROOT.h"
13 
14 #include "JANA/JApplication.h"
15 #include "JANA/JObject.h"
16 #include "JANA/JEventLoop.h"
17 
18 #include "TRIGGER/DTrigger.h"
19 #include "BCAL/DBCALShower.h"
20 #include "FCAL/DFCALShower.h"
21 #include "TRACKING/DMCThrown.h"
23 
24 #include "PID/DVertex.h"
25 #include "PID/DChargedTrack.h"
26 #include "PID/DBeamPhoton.h"
29 #include "PID/DNeutralShower.h"
30 #include "PID/DEventRFBunch.h"
31 #include "PID/DMCReaction.h"
32 
34 #include "ANALYSIS/DReaction.h"
38 #include "ANALYSIS/DCutActions.h"
41 
42 using namespace std;
43 using namespace jana;
44 
45 class DEventWriterROOT : public JObject
46 {
47  public:
48  JOBJECT_PUBLIC(DEventWriterROOT);
49 
50  virtual ~DEventWriterROOT(void);
51  void Initialize(JEventLoop* locEventLoop);
52 
53  void Create_ThrownTree(JEventLoop* locEventLoop, string locOutputFileName) const;
54 
55  void Fill_DataTrees(JEventLoop* locEventLoop, string locDReactionTag) const; //fills all from this factory tag
56  void Fill_DataTree(JEventLoop* locEventLoop, const DReaction* locReaction, deque<const DParticleCombo*>& locParticleCombos) const;
57  void Fill_ThrownTree(JEventLoop* locEventLoop) const;
58 
59  protected:
60 
61  //CUSTOM FUNCTIONS: //Inherit from this class and write custom code in these functions
62  //DO NOT: Write any code that requires a lock of ANY KIND. No reading calibration constants, accessing gParams, etc. This can cause deadlock.
63  virtual void Create_CustomBranches_ThrownTree(DTreeBranchRegister& locBranchRegister, JEventLoop* locEventLoop) const{};
64  virtual void Fill_CustomBranches_ThrownTree(DTreeFillData* locTreeFillData, JEventLoop* locEventLoop, const DMCReaction* locMCReaction, const vector<const DMCThrown*>& locMCThrowns) const{};
65  virtual void Create_CustomBranches_DataTree(DTreeBranchRegister& locBranchRegister, JEventLoop* locEventLoop, const DReaction* locReaction, bool locIsMCDataFlag) const{};
66  virtual void Fill_CustomBranches_DataTree(DTreeFillData* locTreeFillData, JEventLoop* locEventLoop, const DReaction* locReaction, const DMCReaction* locMCReaction, const vector<const DMCThrown*>& locMCThrowns,
67  const DMCThrownMatching* locMCThrownMatching, const DDetectorMatches* locDetectorMatches,
68  const vector<const DBeamPhoton*>& locBeamPhotons, const vector<const DChargedTrackHypothesis*>& locChargedHypos,
69  const vector<const DNeutralParticleHypothesis*>& locNeutralHypos, const deque<const DParticleCombo*>& locParticleCombos) const{};
70 
71  //UTILITY FUNCTIONS
72  string Convert_ToBranchName(string locInputName) const;
73  string Build_BranchName(string locParticleBranchName, string locVariableName) const;
74  ULong64_t Calc_ParticleMultiplexID(Particle_t locPID) const;
75  void Get_DecayProductNames(const DReaction* locReaction, size_t locReactionStepIndex, TMap* locPositionToNameMap, TList*& locDecayProductNames, deque<size_t>& locSavedSteps) const;
76 
78 
79  private:
80 
82  unsigned int dInitNumBeamArraySize;
83  unsigned int dInitNumTrackArraySize;
85  unsigned int dInitNumComboArraySize;
86 
88 
89  //DEFAULT ACTIONS LISTED SEPARATELY FROM CUSTOM (in case in derived class user does something bizarre)
90  map<const DReaction*, DCutAction_ThrownTopology*> dCutActionMap_ThrownTopology;
91  map<const DReaction*, DCutAction_TrueCombo*> dCutActionMap_TrueCombo;
92  map<const DReaction*, DCutAction_BDTSignalCombo*> dCutActionMap_BDTSignalCombo;
93 
94  //add in future: let user execute custom actions (outside of lock): user adds and initializes actions in derived-writer constructor
95  //map<const DReaction*, map<string, map<const DParticleCombo*, bool> > > dCustomActionResultsMap; //string is action name
96 
97  /****************************************************************************************************************************************/
98 
99  //TREE INTERFACES, FILL OBJECTS
100  //The non-thrown objects are created during the constructor, and thus the maps can remain const
101  //The thrown objects are created later by the user (so they can specify file name), when the object is const, so they are declared mutable
102  mutable DTreeInterface* dThrownTreeInterface = nullptr;
104  map<const DReaction*, DTreeInterface*> dTreeInterfaceMap;
105  map<const DReaction*, DTreeFillData*> dTreeFillDataMap;
106 
107  map<const DReaction*, const DReactionVertexInfo*> dVertexInfoMap;
108 
109  //TREE CREATION:
110  void Create_DataTree(const DReaction* locReaction, JEventLoop* locEventLoop, bool locIsMCDataFlag);
111  TMap* Create_UserInfoMaps(DTreeBranchRegister& locTreeBranchRegister, JEventLoop* locEventLoop, const DReaction* locReaction) const;
112  void Create_UserTargetInfo(DTreeBranchRegister& locTreeBranchRegister, Particle_t locTargetPID) const;
113  void Create_Branches_Thrown(DTreeBranchRegister& locTreeBranchRegister, bool locIsOnlyThrownFlag) const;
114 
115  //TREE CREATION: PARTICLE INFO
116  void Create_Branches_ThrownParticles(DTreeBranchRegister& locTreeBranchRegister, bool locIsOnlyThrownFlag) const;
117  void Create_Branches_Beam(DTreeBranchRegister& locTreeBranchRegister, bool locIsMCDataFlag) const;
118  void Create_Branches_NeutralHypotheses(DTreeBranchRegister& locTreeBranchRegister, bool locIsMCDataFlag) const;
119  void Create_Branches_ChargedHypotheses(DTreeBranchRegister& locTreeBranchRegister, bool locIsMCDataFlag) const;
120 
121  //TREE CREATION: COMBO INFO
122  //TMap is locPositionToNameMap
123  void Create_Branches_Combo(DTreeBranchRegister& locTreeBranchRegister, const DReaction* locReaction, bool locIsMCDataFlag, TMap* locPositionToNameMap) const;
124  void Create_Branches_BeamComboParticle(DTreeBranchRegister& locTreeBranchRegister, Particle_t locBeamPID, DKinFitType locKinFitType) const;
125  void Create_Branches_ComboTrack(DTreeBranchRegister& locTreeBranchRegister, string locParticleBranchName, DKinFitType locKinFitType) const;
126  void Create_Branches_ComboNeutral(DTreeBranchRegister& locTreeBranchRegister, string locParticleBranchName, DKinFitType locKinFitType) const;
127 
128  //TREE FILLING: THROWN INFO
129  void Compute_ThrownPIDInfo(const vector<const DMCThrown*>& locMCThrowns_FinalState, const vector<const DMCThrown*>& locMCThrowns_Decaying,
130  ULong64_t& locNumPIDThrown_FinalState, ULong64_t& locPIDThrown_Decaying) const;
131  void Group_ThrownParticles(const vector<const DMCThrown*>& locMCThrowns_FinalState, const vector<const DMCThrown*>& locMCThrowns_Decaying,
132  vector<const DMCThrown*>& locMCThrownsToSave, map<const DMCThrown*, unsigned int>& locThrownIndexMap) const;
133  void Fill_ThrownInfo(DTreeFillData* locTreeFillData, const DMCReaction* locMCReaction, const DBeamPhoton* locTaggedMCGenBeam, const vector<const DMCThrown*>& locMCThrowns,
134  const map<const DMCThrown*, unsigned int>& locThrownIndexMap, ULong64_t locNumPIDThrown_FinalState, ULong64_t locPIDThrown_Decaying,
135  const DMCThrownMatching* locMCThrownMatching = NULL) const;
136  void Fill_ThrownParticleData(DTreeFillData* locTreeFillData, unsigned int locArrayIndex, const DMCThrown* locMCThrown,
137  const map<const DMCThrown*, unsigned int>& locThrownIndexMap, const DMCThrownMatching* locMCThrownMatching) const;
138 
139  //TREE FILLING: GET HYPOTHESES/BEAM
140  vector<const DBeamPhoton*> Get_BeamPhotons(const deque<const DParticleCombo*>& locParticleCombos) const;
141  vector<const DChargedTrackHypothesis*> Get_ChargedHypotheses(JEventLoop* locEventLoop) const;
142  vector<const DChargedTrackHypothesis*> Get_ChargedHypotheses_Used(JEventLoop* locEventLoop, const DReaction* locReaction, const deque<const DParticleCombo*>& locParticleCombos) const;
143  vector<const DNeutralParticleHypothesis*> Get_NeutralHypotheses(JEventLoop* locEventLoop, const set<Particle_t>& locReactionPIDs) const;
144  vector<const DNeutralParticleHypothesis*> Get_NeutralHypotheses_Used(JEventLoop* locEventLoop, const DReaction* locReaction, const set<Particle_t>& locReactionPIDs, const deque<const DParticleCombo*>& locParticleCombos) const;
145 
146  //TREE FILLING: INDEPENDENT PARTICLES
147  void Fill_BeamData(DTreeFillData* locTreeFillData, unsigned int locArrayIndex, const DBeamPhoton* locBeamPhoton, const DVertex* locVertex, const DMCThrownMatching* locMCThrownMatching) const;
148  void Fill_ChargedHypo(DTreeFillData* locTreeFillData, unsigned int locArrayIndex, const DChargedTrackHypothesis* locChargedTrackHypothesis, const DMCThrownMatching* locMCThrownMatching,
149  const map<const DMCThrown*, unsigned int>& locThrownIndexMap, const DDetectorMatches* locDetectorMatches) const;
150  void Fill_NeutralHypo(DTreeFillData* locTreeFillData, unsigned int locArrayIndex, const DNeutralParticleHypothesis* locPhotonHypothesis, const DMCThrownMatching* locMCThrownMatching,
151  const map<const DMCThrown*, unsigned int>& locThrownIndexMap, const DDetectorMatches* locDetectorMatches) const;
152 
153  //TREE FILLING: COMBO
154  void Fill_ComboData(DTreeFillData* locTreeFillData, const DReaction* locReaction, const DParticleCombo* locParticleCombo, unsigned int locComboIndex, const map<pair<oid_t, Particle_t>, size_t>& locObjectToArrayIndexMap) const;
155  void Fill_ComboStepData(DTreeFillData* locTreeFillData, const DReaction* locReaction, const DParticleCombo* locParticleCombo, unsigned int locStepIndex, unsigned int locComboIndex,
156  DKinFitType locKinFitType, const map<pair<oid_t, Particle_t>, size_t>& locObjectToArrayIndexMap) const;
157 
158  //TREE FILLING: COMBO PARTICLES
159  void Fill_ComboBeamData(DTreeFillData* locTreeFillData, unsigned int locComboIndex, const DBeamPhoton* locBeamPhoton, size_t locBeamIndex, DKinFitType locKinFitType) const;
160  void Fill_ComboChargedData(DTreeFillData* locTreeFillData, unsigned int locComboIndex, string locParticleBranchName, const DChargedTrackHypothesis* locMeasuredChargedHypo,
161  const DChargedTrackHypothesis* locChargedHypo, size_t locChargedIndex, DKinFitType locKinFitType) const;
162  void Fill_ComboNeutralData(DTreeFillData* locTreeFillData, unsigned int locComboIndex, string locParticleBranchName, const DNeutralParticleHypothesis* locMeasuredNeutralHypo,
163  const DNeutralParticleHypothesis* locNeutralHypo, size_t locNeutralIndex, DKinFitType locKinFitType) const;
164 };
165 
166 inline string DEventWriterROOT::Convert_ToBranchName(string locInputName) const
167 {
168  TString locTString(locInputName);
169  locTString.ReplaceAll("*", "Star");
170  locTString.ReplaceAll("(", "_");
171  locTString.ReplaceAll(")", "_");
172  locTString.ReplaceAll("+", "Plus");
173  locTString.ReplaceAll("-", "Minus");
174  locTString.ReplaceAll("'", "Prime");
175  return (string)((const char*)locTString);
176 }
177 
178 inline string DEventWriterROOT::Build_BranchName(string locParticleBranchName, string locVariableName) const
179 {
180  return ((locParticleBranchName != "") ? locParticleBranchName + string("__") + locVariableName : locVariableName);
181 }
182 
183 #endif //_DEventWriterROOT_
unsigned int dInitNumNeutralArraySize
map< const DReaction *, const DReactionVertexInfo * > dVertexInfoMap
virtual void Create_CustomBranches_DataTree(DTreeBranchRegister &locBranchRegister, JEventLoop *locEventLoop, const DReaction *locReaction, bool locIsMCDataFlag) const
map< const DReaction *, DTreeFillData * > dTreeFillDataMap
map< const DReaction *, DTreeInterface * > dTreeInterfaceMap
unsigned int dInitNumThrownArraySize
map< const DReaction *, DCutAction_ThrownTopology * > dCutActionMap_ThrownTopology
virtual void Fill_CustomBranches_ThrownTree(DTreeFillData *locTreeFillData, JEventLoop *locEventLoop, const DMCReaction *locMCReaction, const vector< const DMCThrown * > &locMCThrowns) const
unsigned int dInitNumComboArraySize
virtual void Fill_CustomBranches_DataTree(DTreeFillData *locTreeFillData, JEventLoop *locEventLoop, const DReaction *locReaction, const DMCReaction *locMCReaction, const vector< const DMCThrown * > &locMCThrowns, const DMCThrownMatching *locMCThrownMatching, const DDetectorMatches *locDetectorMatches, const vector< const DBeamPhoton * > &locBeamPhotons, const vector< const DChargedTrackHypothesis * > &locChargedHypos, const vector< const DNeutralParticleHypothesis * > &locNeutralHypos, const deque< const DParticleCombo * > &locParticleCombos) const
string Convert_ToBranchName(string locInputName) const
DTreeFillData dThrownTreeFillData
const DAnalysisUtilities * dAnalysisUtilities
map< const DReaction *, DCutAction_TrueCombo * > dCutActionMap_TrueCombo
unsigned int dInitNumTrackArraySize
unsigned int dInitNumBeamArraySize
map< const DReaction *, DCutAction_BDTSignalCombo * > dCutActionMap_BDTSignalCombo
string Build_BranchName(string locParticleBranchName, string locVariableName) const
virtual void Create_CustomBranches_ThrownTree(DTreeBranchRegister &locBranchRegister, JEventLoop *locEventLoop) const
Particle_t
Definition: particleType.h:12