File: | /volatile/halld/gluex/nightly/2024-03-07/Linux_CentOS7.7-x86_64-gcc4.8.5/halld_recon/src/libraries/ANALYSIS/DHistogramActions_Thrown.cc |
Location: | line 483, column 79 |
Description: | Called C++ object pointer is uninitialized |
1 | #include "ANALYSIS/DHistogramActions.h" | |||
2 | ||||
3 | ||||
4 | void DHistogramAction_ParticleComboGenReconComparison::Initialize(JEventLoop* locEventLoop) | |||
5 | { | |||
6 | if(Get_UseKinFitResultsFlag() && (Get_Reaction()->Get_KinFitType() == d_NoFit)) | |||
7 | { | |||
8 | cout << "WARNING: REQUESTED HISTOGRAM OF KINEMAITIC FIT RESULTS WHEN NO KINEMATIC FIT!!!" << endl; | |||
9 | return; //no fit performed, but kinfit data requested!! | |||
10 | } | |||
11 | ||||
12 | Run_Update(locEventLoop); | |||
13 | ||||
14 | vector<const DParticleID*> locParticleIDs; | |||
15 | locEventLoop->Get(locParticleIDs); | |||
16 | ||||
17 | string locHistName, locHistTitle, locStepName, locStepROOTName, locParticleName, locParticleROOTName; | |||
18 | Particle_t locPID; | |||
19 | ||||
20 | size_t locNumSteps = Get_Reaction()->Get_NumReactionSteps(); | |||
21 | ||||
22 | dHistDeque_DeltaPOverP.resize(locNumSteps); | |||
23 | dHistDeque_DeltaTheta.resize(locNumSteps); | |||
24 | dHistDeque_DeltaPhi.resize(locNumSteps); | |||
25 | dHistDeque_DeltaT.resize(locNumSteps); | |||
26 | dHistDeque_DeltaT_TOF.resize(locNumSteps); | |||
27 | dHistDeque_DeltaT_BCAL.resize(locNumSteps); | |||
28 | dHistDeque_DeltaT_FCAL.resize(locNumSteps); | |||
29 | dHistDeque_DeltaVertexZ.resize(locNumSteps); | |||
30 | dHistDeque_DeltaPOverPVsP.resize(locNumSteps); | |||
31 | dHistDeque_DeltaPOverPVsTheta.resize(locNumSteps); | |||
32 | dHistDeque_DeltaThetaVsP.resize(locNumSteps); | |||
33 | dHistDeque_DeltaThetaVsTheta.resize(locNumSteps); | |||
34 | dHistDeque_DeltaPhiVsP.resize(locNumSteps); | |||
35 | dHistDeque_DeltaPhiVsTheta.resize(locNumSteps); | |||
36 | dHistDeque_DeltaTVsTheta.resize(locNumSteps); | |||
37 | dHistDeque_DeltaTVsP.resize(locNumSteps); | |||
38 | dHistDeque_DeltaVertexZVsTheta.resize(locNumSteps); | |||
39 | ||||
40 | dHistDeque_Pulls.resize(locNumSteps); | |||
41 | dHistDeque_PullsVsP.resize(locNumSteps); | |||
42 | dHistDeque_PullsVsTheta.resize(locNumSteps); | |||
43 | ||||
44 | dHistDeque_TimePull_CDC.resize(locNumSteps); | |||
45 | dHistDeque_TimePull_ST.resize(locNumSteps); | |||
46 | dHistDeque_TimePull_BCAL.resize(locNumSteps); | |||
47 | dHistDeque_TimePull_TOF.resize(locNumSteps); | |||
48 | dHistDeque_TimePull_FCAL.resize(locNumSteps); | |||
49 | ||||
50 | dHistDeque_TimePullVsTheta_CDC.resize(locNumSteps); | |||
51 | dHistDeque_TimePullVsTheta_BCAL.resize(locNumSteps); | |||
52 | dHistDeque_TimePullVsTheta_ST.resize(locNumSteps); | |||
53 | ||||
54 | dHistDeque_TimePullVsP_CDC.resize(locNumSteps); | |||
55 | dHistDeque_TimePullVsP_BCAL.resize(locNumSteps); | |||
56 | dHistDeque_TimePullVsP_ST.resize(locNumSteps); | |||
57 | dHistDeque_TimePullVsP_TOF.resize(locNumSteps); | |||
58 | dHistDeque_TimePullVsP_FCAL.resize(locNumSteps); | |||
59 | ||||
60 | //CREATE THE HISTOGRAMS | |||
61 | //Since we are creating histograms, the contents of gDirectory will be modified: must use JANA-wide ROOT lock | |||
62 | japp->RootWriteLock(); //ACQUIRE ROOT LOCK!! | |||
63 | { | |||
64 | CreateAndChangeTo_ActionDirectory(); | |||
65 | ||||
66 | //RF | |||
67 | locHistName = "DeltaT_RFBeamBunch"; | |||
68 | dRFBeamBunchDeltaT_Hist = GetOrCreate_Histogram<TH1I>(locHistName, ";RF #Deltat (Reconstructed - Thrown)", dNumRFDeltaTBins, dMinRFDeltaT, dMaxRFDeltaT); | |||
69 | ||||
70 | //beam particle | |||
71 | locPID = Get_Reaction()->Get_ReactionStep(0)->Get_InitialPID(); | |||
72 | bool locBeamParticleUsed = (locPID == Gamma); | |||
73 | if(locBeamParticleUsed) | |||
74 | { | |||
75 | locParticleName = string("Beam_") + ParticleType(locPID); | |||
76 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
77 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
78 | ||||
79 | // DeltaP/P | |||
80 | locHistName = string("DeltaPOverP"); | |||
81 | locHistTitle = locParticleROOTName + string(";#Deltap/p (Reconstructed - Thrown)"); | |||
82 | dBeamParticleHist_DeltaPOverP = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
83 | ||||
84 | // DeltaP/P Vs P | |||
85 | locHistName = string("DeltaPOverPVsP"); | |||
86 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltap/p (Reconstructed - Thrown)"); | |||
87 | dBeamParticleHist_DeltaPOverPVsP = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
88 | ||||
89 | // DeltaT | |||
90 | locHistName = string("DeltaT"); | |||
91 | locHistTitle = locParticleROOTName + string(";#Deltat (ns) (Reconstructed - Thrown)"); | |||
92 | dBeamParticleHist_DeltaT = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
93 | ||||
94 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
95 | } | |||
96 | ||||
97 | deque<string> locPullNames(8, ""); | |||
98 | locPullNames[0] = "E"; locPullNames[1] = "Px"; locPullNames[2] = "Py"; locPullNames[3] = "Pz"; | |||
99 | locPullNames[4] = "Xx"; locPullNames[5] = "Xy"; locPullNames[6] = "Xz"; locPullNames[7] = "T"; | |||
100 | ||||
101 | deque<string> locPullTitles(8, ""); | |||
102 | locPullTitles[0] = "E"; locPullTitles[1] = "p_{x}"; locPullTitles[2] = "p_{y}"; locPullTitles[3] = "p_{z}"; | |||
103 | locPullTitles[4] = "x_{x}"; locPullTitles[5] = "x_{y}"; locPullTitles[6] = "x_{z}"; locPullTitles[7] = "t"; | |||
104 | ||||
105 | //CREATE THE HISTOGRAMS | |||
106 | deque<Particle_t> locPIDs; | |||
107 | for(size_t loc_i = 0; loc_i < locNumSteps; ++loc_i) | |||
108 | { | |||
109 | const DReactionStep* locReactionStep = Get_Reaction()->Get_ReactionStep(loc_i); | |||
110 | locStepName = DAnalysis::Get_StepName(locReactionStep, true, false); | |||
111 | locStepROOTName = DAnalysis::Get_StepName(locReactionStep, true, true); | |||
112 | ||||
113 | Particle_t locInitialPID = locReactionStep->Get_InitialPID(); | |||
114 | ||||
115 | //get PIDs | |||
116 | auto locPIDs = Get_Reaction()->Get_FinalPIDs(loc_i, Get_UseKinFitResultsFlag(), Get_UseKinFitResultsFlag(), d_AllCharges, false); | |||
117 | if(Get_UseKinFitResultsFlag()) | |||
118 | { | |||
119 | if((!locBeamParticleUsed) || (loc_i != 0)) //add decaying parent particle //skip if on beam particle! | |||
120 | locPIDs.insert(locPIDs.begin(), locInitialPID); | |||
121 | } | |||
122 | if(locPIDs.empty()) | |||
123 | continue; | |||
124 | ||||
125 | CreateAndChangeTo_Directory(locStepName, locStepName); | |||
126 | for(size_t loc_j = 0; loc_j < locPIDs.size(); ++loc_j) | |||
127 | { | |||
128 | locPID = locPIDs[loc_j]; | |||
129 | locParticleName = ParticleType(locPID); | |||
130 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
131 | if(dHistDeque_DeltaPOverP[loc_i].find(locPID) != dHistDeque_DeltaPOverP[loc_i].end()) | |||
132 | continue; //pid already done | |||
133 | ||||
134 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
135 | ||||
136 | // DeltaP/P | |||
137 | locHistName = string("DeltaPOverP"); | |||
138 | locHistTitle = locParticleROOTName + string(";#Deltap/p (Reconstructed - Thrown)"); | |||
139 | dHistDeque_DeltaPOverP[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
140 | ||||
141 | // DeltaTheta | |||
142 | locHistName = string("DeltaTheta"); | |||
143 | locHistTitle = locParticleROOTName + string(";#Delta#theta#circ (Reconstructed - Thrown)"); | |||
144 | dHistDeque_DeltaTheta[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaThetaBins, dMinDeltaTheta, dMaxDeltaTheta); | |||
145 | ||||
146 | // DeltaPhi | |||
147 | locHistName = string("DeltaPhi"); | |||
148 | locHistTitle = locParticleROOTName + string(";#Delta#phi#circ (Reconstructed - Thrown)"); | |||
149 | dHistDeque_DeltaPhi[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi); | |||
150 | ||||
151 | // DeltaT | |||
152 | locHistName = string("DeltaT"); | |||
153 | locHistTitle = locParticleROOTName + string(";#Deltat (ns) (Reconstructed - Thrown)"); | |||
154 | dHistDeque_DeltaT[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
155 | ||||
156 | // DeltaT - BCAL | |||
157 | locHistName = string("DeltaT_BCAL"); | |||
158 | locHistTitle = locParticleROOTName + string(" in BCAL;#Deltat (ns) (Reconstructed - Thrown)"); | |||
159 | dHistDeque_DeltaT_BCAL[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
160 | ||||
161 | // DeltaT - TOF (charged only) | |||
162 | if(ParticleCharge(locPID) != 0) | |||
163 | { | |||
164 | locHistName = string("DeltaT_TOF"); | |||
165 | locHistTitle = locParticleROOTName + string(" in TOF;#Deltat (ns) (Reconstructed - Thrown)"); | |||
166 | dHistDeque_DeltaT_TOF[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
167 | } | |||
168 | ||||
169 | // DeltaT - FCAL (neutral only) | |||
170 | if(ParticleCharge(locPID) == 0) | |||
171 | { | |||
172 | locHistName = string("DeltaT_FCAL"); | |||
173 | locHistTitle = locParticleROOTName + string(" in FCAL;#Deltat (ns) (Reconstructed - Thrown)"); | |||
174 | dHistDeque_DeltaT_FCAL[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
175 | } | |||
176 | ||||
177 | // DeltaVertexZ | |||
178 | locHistName = string("DeltaVertexZ"); | |||
179 | locHistTitle = locParticleROOTName + string(";#DeltaVertex-Z (cm) (Reconstructed - Thrown)"); | |||
180 | dHistDeque_DeltaVertexZ[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaVertexZBins, dMinDeltaVertexZ, dMaxDeltaVertexZ); | |||
181 | ||||
182 | // DeltaP/P Vs P | |||
183 | locHistName = string("DeltaPOverPVsP"); | |||
184 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltap/p (Reconstructed - Thrown)"); | |||
185 | dHistDeque_DeltaPOverPVsP[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
186 | ||||
187 | // DeltaP/P Vs Theta | |||
188 | locHistName = string("DeltaPOverPVsTheta"); | |||
189 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltap/p (Reconstructed - Thrown)"); | |||
190 | dHistDeque_DeltaPOverPVsTheta[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
191 | ||||
192 | // DeltaTheta Vs P | |||
193 | locHistName = string("DeltaThetaVsP"); | |||
194 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Delta#theta#circ (Reconstructed - Thrown)"); | |||
195 | dHistDeque_DeltaThetaVsP[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaThetaBins, dMinDeltaTheta, dMaxDeltaTheta); | |||
196 | ||||
197 | // DeltaTheta Vs Theta | |||
198 | locHistName = string("DeltaThetaVsTheta"); | |||
199 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Delta#theta#circ (Reconstructed - Thrown)"); | |||
200 | dHistDeque_DeltaThetaVsTheta[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaThetaBins, dMinDeltaTheta, dMaxDeltaTheta); | |||
201 | ||||
202 | // DeltaPhi Vs P | |||
203 | locHistName = string("DeltaPhiVsP"); | |||
204 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Delta#phi#circ (Reconstructed - Thrown)"); | |||
205 | dHistDeque_DeltaPhiVsP[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi); | |||
206 | ||||
207 | // DeltaPhi Vs Theta | |||
208 | locHistName = string("DeltaPhiVsTheta"); | |||
209 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Delta#phi#circ (Reconstructed - Thrown)"); | |||
210 | dHistDeque_DeltaPhiVsTheta[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi); | |||
211 | ||||
212 | // DeltaT Vs Theta | |||
213 | locHistName = string("DeltaTVsTheta"); | |||
214 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat (ns) (Reconstructed - Thrown)"); | |||
215 | dHistDeque_DeltaTVsTheta[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
216 | ||||
217 | // DeltaT Vs P | |||
218 | locHistName = string("DeltaTVsP"); | |||
219 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat (ns) (Reconstructed - Thrown)"); | |||
220 | dHistDeque_DeltaTVsP[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
221 | ||||
222 | // DeltaVertexZ Vs Theta | |||
223 | locHistName = string("DeltaVertexZVsTheta"); | |||
224 | locHistTitle = locParticleROOTName + string(";#theta#circ;#DeltaVertex-Z (cm) (Reconstructed - Thrown)"); | |||
225 | dHistDeque_DeltaVertexZVsTheta[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaVertexZBins, dMinDeltaVertexZ, dMaxDeltaVertexZ); | |||
226 | ||||
227 | /************************************************************************ Pulls ************************************************************************/ | |||
228 | ||||
229 | CreateAndChangeTo_Directory("Pulls", "Pulls"); | |||
230 | for(size_t loc_j = 0; loc_j < dPullTypes.size(); ++loc_j) | |||
231 | { | |||
232 | if((ParticleCharge(locPID) != 0) && (dPullTypes[loc_j] == d_EPull)) | |||
233 | continue; | |||
234 | if((ParticleCharge(locPID) == 0) && ((dPullTypes[loc_j] >= d_PxPull) && (dPullTypes[loc_j] <= d_PzPull))) | |||
235 | continue; | |||
236 | ||||
237 | //Pull 1D | |||
238 | locHistName = locPullNames[loc_j] + string("Pull"); | |||
239 | locHistTitle = locParticleROOTName + string(";#Delta") + locPullTitles[loc_j] + string("/#sigma_{") + locPullTitles[loc_j] + string("} (Reconstructed - Thrown)"); | |||
240 | dHistDeque_Pulls[loc_i][locPID][dPullTypes[loc_j]] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
241 | ||||
242 | //Pull vs P | |||
243 | locHistName = locPullNames[loc_j] + string("PullVsP"); | |||
244 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Delta") + locPullTitles[loc_j] + string("/#sigma_{") + locPullTitles[loc_j] + string("} (Reconstructed - Thrown)"); | |||
245 | dHistDeque_PullsVsP[loc_i][locPID][dPullTypes[loc_j]] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
246 | ||||
247 | //Pull vs Theta | |||
248 | locHistName = locPullNames[loc_j] + string("PullVsTheta"); | |||
249 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Delta") + locPullTitles[loc_j] + string("/#sigma_{") + locPullTitles[loc_j] + string("} (Reconstructed - Thrown)"); | |||
250 | dHistDeque_PullsVsTheta[loc_i][locPID][dPullTypes[loc_j]] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
251 | } | |||
252 | ||||
253 | //Delta-t Pulls - CDC & ST | |||
254 | if(ParticleCharge(locPID) != 0) | |||
255 | { | |||
256 | //CDC | |||
257 | locHistName = "TimePull_CDC"; | |||
258 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
259 | dHistDeque_TimePull_CDC[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
260 | ||||
261 | locHistName = "TimePullVsTheta_CDC"; | |||
262 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat/#sigma_{#Deltat}"); | |||
263 | dHistDeque_TimePullVsTheta_CDC[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
264 | ||||
265 | locHistName = "TimePullVsP_CDC"; | |||
266 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
267 | dHistDeque_TimePullVsP_CDC[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
268 | ||||
269 | //ST | |||
270 | locHistName = "TimePull_ST"; | |||
271 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
272 | dHistDeque_TimePull_ST[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
273 | ||||
274 | locHistName = "TimePullVsTheta_ST"; | |||
275 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat/#sigma_{#Deltat}"); | |||
276 | dHistDeque_TimePullVsTheta_ST[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
277 | ||||
278 | locHistName = "TimePullVsP_ST"; | |||
279 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
280 | dHistDeque_TimePullVsP_ST[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
281 | } | |||
282 | ||||
283 | //Delta-t Pulls - BCAL | |||
284 | locHistName = "TimePull_BCAL"; | |||
285 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
286 | dHistDeque_TimePull_BCAL[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
287 | ||||
288 | locHistName = "TimePullVsTheta_BCAL"; | |||
289 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat/#sigma_{#Deltat}"); | |||
290 | dHistDeque_TimePullVsTheta_BCAL[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
291 | ||||
292 | locHistName = "TimePullVsP_BCAL"; | |||
293 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
294 | dHistDeque_TimePullVsP_BCAL[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
295 | ||||
296 | //Delta-t Pulls - TOF | |||
297 | if(ParticleCharge(locPID) != 0) //TOF | |||
298 | { | |||
299 | locHistName = "TimePull_TOF"; | |||
300 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
301 | dHistDeque_TimePull_TOF[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
302 | ||||
303 | locHistName = "TimePullVsP_TOF"; | |||
304 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
305 | dHistDeque_TimePullVsP_TOF[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
306 | } | |||
307 | ||||
308 | //Delta-t Pulls - FCAL | |||
309 | locHistName = "TimePull_FCAL"; | |||
310 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
311 | dHistDeque_TimePull_FCAL[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
312 | ||||
313 | locHistName = "TimePullVsP_FCAL"; | |||
314 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
315 | dHistDeque_TimePullVsP_FCAL[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
316 | ||||
317 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
318 | ||||
319 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
320 | } //end of particle loop | |||
321 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
322 | } //end of step loop | |||
323 | ||||
324 | //Return to the base directory | |||
325 | ChangeTo_BaseDirectory(); | |||
326 | } | |||
327 | japp->RootUnLock(); //RELEASE ROOT LOCK!! | |||
328 | } | |||
329 | ||||
330 | void DHistogramAction_ParticleComboGenReconComparison::Run_Update(JEventLoop* locEventLoop) | |||
331 | { | |||
332 | DApplication* locApplication = dynamic_cast<DApplication*>(locEventLoop->GetJApplication()); | |||
333 | DGeometry *locGeometry = locApplication->GetDGeometry(locEventLoop->GetJEvent().GetRunNumber()); | |||
334 | locGeometry->GetTargetZ(dTargetZCenter); | |||
335 | } | |||
336 | ||||
337 | bool DHistogramAction_ParticleComboGenReconComparison::Perform_Action(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo) | |||
338 | { | |||
339 | if(Get_UseKinFitResultsFlag() && (Get_Reaction()->Get_KinFitType() == d_NoFit)) | |||
340 | { | |||
341 | cout << "WARNING: REQUESTED HISTOGRAM OF KINEMAITIC FIT RESULTS WHEN NO KINEMATIC FIT!!! Skipping histogram." << endl; | |||
342 | return true; //no fit performed, but kinfit data requested!! | |||
343 | } | |||
344 | ||||
345 | vector<const DMCThrown*> locMCThrowns; | |||
346 | locEventLoop->Get(locMCThrowns); | |||
347 | if(locMCThrowns.empty()) | |||
348 | return true; //e.g. non-simulated event | |||
349 | ||||
350 | vector<const DBeamPhoton*> locBeamPhotons; | |||
351 | locEventLoop->Get(locBeamPhotons, "MCGEN"); | |||
352 | const DBeamPhoton* locThrownBeamPhoton = locBeamPhotons.empty() ? NULL__null : locBeamPhotons[0]; | |||
353 | ||||
354 | vector<const DMCThrownMatching*> locMCThrownMatchingVector; | |||
355 | locEventLoop->Get(locMCThrownMatchingVector); | |||
356 | if(locMCThrownMatchingVector.empty()) | |||
357 | return true; | |||
358 | const DMCThrownMatching* locMCThrownMatching = locMCThrownMatchingVector[0]; | |||
359 | ||||
360 | const DEventRFBunch* locEventRFBunch = locParticleCombo->Get_EventRFBunch(); | |||
361 | const DEventRFBunch* locThrownEventRFBunch = NULL__null; | |||
362 | locEventLoop->GetSingle(locThrownEventRFBunch, "Thrown"); | |||
363 | ||||
364 | //RF time difference | |||
365 | double locRFTime = locEventRFBunch->dTime; | |||
366 | double locRFDeltaT = locRFTime - locThrownEventRFBunch->dTime; | |||
367 | //FILL HISTOGRAMS | |||
368 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
369 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
370 | Lock_Action(); | |||
371 | { | |||
372 | dRFBeamBunchDeltaT_Hist->Fill(locRFDeltaT); | |||
373 | } | |||
374 | Unlock_Action(); | |||
375 | ||||
376 | const DKinematicData* locKinematicData; | |||
377 | for(size_t loc_i = 0; loc_i < locParticleCombo->Get_NumParticleComboSteps(); ++loc_i) | |||
378 | { | |||
379 | const DParticleComboStep* locParticleComboStep = locParticleCombo->Get_ParticleComboStep(loc_i); | |||
380 | ||||
381 | //initial particle | |||
382 | if(Get_UseKinFitResultsFlag()) | |||
383 | locKinematicData = locParticleComboStep->Get_InitialParticle(); | |||
384 | else | |||
385 | locKinematicData = locParticleComboStep->Get_InitialParticle_Measured(); | |||
386 | if(locKinematicData != NULL__null) | |||
387 | { | |||
388 | if(locKinematicData->PID() == Gamma) | |||
389 | { | |||
390 | //check if will be duplicate | |||
391 | const JObject* locSourceObject = locParticleComboStep->Get_InitialParticle_Measured(); | |||
392 | if(dPreviouslyHistogrammedBeamParticles.find(locSourceObject) == dPreviouslyHistogrammedBeamParticles.end()) | |||
393 | { | |||
394 | dPreviouslyHistogrammedBeamParticles.insert(locSourceObject); | |||
395 | Fill_BeamHists(locKinematicData, locThrownBeamPhoton); | |||
396 | } | |||
397 | } | |||
398 | } | |||
399 | ||||
400 | //final particles | |||
401 | for(size_t loc_j = 0; loc_j < locParticleComboStep->Get_NumFinalParticles(); ++loc_j) | |||
402 | { | |||
403 | if(Get_UseKinFitResultsFlag()) | |||
404 | locKinematicData = locParticleComboStep->Get_FinalParticle(loc_j); | |||
405 | else | |||
406 | locKinematicData = locParticleComboStep->Get_FinalParticle_Measured(loc_j); | |||
407 | if(locKinematicData == NULL__null) | |||
408 | continue; //e.g. a decaying or missing particle whose params aren't set yet | |||
409 | if(DAnalysis::Get_DecayStepIndex(Get_Reaction(), loc_i, loc_j) > 0) | |||
410 | continue; //decaying: not supported | |||
411 | if(Get_Reaction()->Get_ReactionStep(loc_i)->Get_MissingParticleIndex() == int(loc_j)) | |||
412 | continue; //missing: not supported | |||
413 | ||||
414 | //check if duplicate | |||
415 | const JObject* locSourceObject = locParticleComboStep->Get_FinalParticle_SourceObject(loc_j); | |||
416 | if(locSourceObject != NULL__null) //else is reconstructed missing/decaying particle: has many source object, and is unique to this combo: no dupes to check against: let it ride | |||
417 | { | |||
418 | pair<Particle_t, const JObject*> locParticleInfo(locKinematicData->PID(), locSourceObject); | |||
419 | pair<size_t, pair<Particle_t, const JObject*> > locHistInfo(loc_i, locParticleInfo); | |||
420 | if(dPreviouslyHistogrammedParticles.find(locHistInfo) != dPreviouslyHistogrammedParticles.end()) | |||
421 | continue; //previously histogrammed | |||
422 | dPreviouslyHistogrammedParticles.insert(locHistInfo); | |||
423 | } | |||
424 | ||||
425 | if(ParticleCharge(locKinematicData->PID()) != 0) | |||
426 | { | |||
427 | const DChargedTrackHypothesis* locChargedTrackHypothesis = static_cast<const DChargedTrackHypothesis*>(locKinematicData); | |||
428 | double locMatchFOM = 0.0; | |||
429 | const DMCThrown* locMCThrown = locMCThrownMatching->Get_MatchingMCThrown(locChargedTrackHypothesis, locMatchFOM); | |||
430 | if(locMCThrown != NULL__null) | |||
431 | Fill_ChargedHists(locChargedTrackHypothesis, locMCThrown, locThrownEventRFBunch, loc_i); | |||
432 | } | |||
433 | else | |||
434 | { | |||
435 | const DNeutralParticleHypothesis* locNeutralParticleHypothesis = static_cast<const DNeutralParticleHypothesis*>(locKinematicData); | |||
436 | double locMatchFOM = 0.0; | |||
437 | const DMCThrown* locMCThrown = locMCThrownMatching->Get_MatchingMCThrown(locNeutralParticleHypothesis, locMatchFOM); | |||
438 | if(locMCThrown != NULL__null) | |||
439 | Fill_NeutralHists(locNeutralParticleHypothesis, locMCThrown, locThrownEventRFBunch, loc_i); | |||
440 | } | |||
441 | } //end of particle loop | |||
442 | } //end of step loop | |||
443 | return true; | |||
444 | } | |||
445 | ||||
446 | void DHistogramAction_ParticleComboGenReconComparison::Fill_BeamHists(const DKinematicData* locKinematicData, const DKinematicData* locThrownKinematicData) | |||
447 | { | |||
448 | if(locThrownKinematicData == NULL__null) | |||
449 | return; | |||
450 | ||||
451 | DVector3 locMomentum = locKinematicData->momentum(); | |||
452 | DVector3 locThrownMomentum = locThrownKinematicData->momentum(); | |||
453 | ||||
454 | double locThrownP = locThrownMomentum.Mag(); | |||
455 | double locDeltaPOverP = (locMomentum.Mag() - locThrownP)/locThrownP; | |||
456 | double locDeltaT = locKinematicData->time() - locThrownKinematicData->time(); | |||
457 | ||||
458 | //FILL HISTOGRAMS | |||
459 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
460 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
461 | Lock_Action(); | |||
462 | { | |||
463 | dBeamParticleHist_DeltaPOverP->Fill(locDeltaPOverP); | |||
464 | dBeamParticleHist_DeltaPOverPVsP->Fill(locThrownP, locDeltaPOverP); | |||
465 | dBeamParticleHist_DeltaT->Fill(locDeltaT); | |||
466 | } | |||
467 | Unlock_Action(); | |||
468 | } | |||
469 | ||||
470 | void DHistogramAction_ParticleComboGenReconComparison::Fill_ChargedHists(const DChargedTrackHypothesis* locChargedTrackHypothesis, const DMCThrown* locMCThrown, const DEventRFBunch* locThrownEventRFBunch, size_t locStepIndex) | |||
471 | { | |||
472 | Particle_t locPID = locChargedTrackHypothesis->PID(); | |||
473 | double locThrownP = locMCThrown->momentum().Mag(); | |||
474 | double locThrownTheta = locMCThrown->momentum().Theta()*180.0/TMath::Pi(); | |||
475 | double locDeltaPOverP = (locChargedTrackHypothesis->momentum().Mag() - locThrownP)/locThrownP; | |||
476 | double locDeltaTheta = locChargedTrackHypothesis->momentum().Theta()*180.0/TMath::Pi() - locThrownTheta; | |||
477 | double locDeltaPhi = locChargedTrackHypothesis->momentum().Phi()*180.0/TMath::Pi() - locMCThrown->momentum().Phi()*180.0/TMath::Pi(); | |||
478 | double locDeltaT = locChargedTrackHypothesis->time() - locMCThrown->time(); //time comparison isn't fair if track comes from a detached vertex!!! | |||
479 | double locDeltaVertexZ = locChargedTrackHypothesis->position().Z() - locMCThrown->position().Z(); | |||
480 | const TMatrixDSym& locCovarianceMatrix = *(locChargedTrackHypothesis->errorMatrix().get()); | |||
| ||||
481 | ||||
482 | double locStartTime = locThrownEventRFBunch->dTime + (locMCThrown->z() - dTargetZCenter)/29.9792458; | |||
483 | double locTimePull = (locStartTime - locChargedTrackHypothesis->time())/sqrt(locCovarianceMatrix(6, 6)); | |||
| ||||
484 | double locT0Pull = (locStartTime - locChargedTrackHypothesis->t0())/locChargedTrackHypothesis->t0_err(); | |||
485 | ||||
486 | //FILL HISTOGRAMS | |||
487 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
488 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
489 | Lock_Action(); | |||
490 | { | |||
491 | dHistDeque_DeltaPOverP[locStepIndex][locPID]->Fill(locDeltaPOverP); | |||
492 | dHistDeque_DeltaTheta[locStepIndex][locPID]->Fill(locDeltaTheta); | |||
493 | dHistDeque_DeltaPhi[locStepIndex][locPID]->Fill(locDeltaPhi); | |||
494 | dHistDeque_DeltaT[locStepIndex][locPID]->Fill(locDeltaT); | |||
495 | if(locChargedTrackHypothesis->t0_detector() == SYS_START) | |||
496 | { | |||
497 | dHistDeque_TimePull_ST[locStepIndex][locPID]->Fill(locT0Pull); | |||
498 | dHistDeque_TimePullVsTheta_ST[locStepIndex][locPID]->Fill(locThrownTheta, locT0Pull); | |||
499 | dHistDeque_TimePullVsP_ST[locStepIndex][locPID]->Fill(locThrownP, locT0Pull); | |||
500 | } | |||
501 | if(locChargedTrackHypothesis->t0_detector() == SYS_CDC) | |||
502 | { | |||
503 | dHistDeque_TimePull_CDC[locStepIndex][locPID]->Fill(locT0Pull); | |||
504 | dHistDeque_TimePullVsTheta_CDC[locStepIndex][locPID]->Fill(locThrownTheta, locT0Pull); | |||
505 | dHistDeque_TimePullVsP_CDC[locStepIndex][locPID]->Fill(locThrownP, locT0Pull); | |||
506 | } | |||
507 | else if(locChargedTrackHypothesis->t1_detector() == SYS_CDC) | |||
508 | { | |||
509 | dHistDeque_TimePull_CDC[locStepIndex][locPID]->Fill(locTimePull); | |||
510 | dHistDeque_TimePullVsTheta_CDC[locStepIndex][locPID]->Fill(locThrownTheta, locTimePull); | |||
511 | dHistDeque_TimePullVsP_CDC[locStepIndex][locPID]->Fill(locThrownP, locTimePull); | |||
512 | } | |||
513 | if(locChargedTrackHypothesis->t1_detector() == SYS_BCAL) | |||
514 | { | |||
515 | dHistDeque_DeltaT_BCAL[locStepIndex][locPID]->Fill(locDeltaT); | |||
516 | dHistDeque_TimePull_BCAL[locStepIndex][locPID]->Fill(locTimePull); | |||
517 | dHistDeque_TimePullVsTheta_BCAL[locStepIndex][locPID]->Fill(locThrownTheta, locTimePull); | |||
518 | dHistDeque_TimePullVsP_BCAL[locStepIndex][locPID]->Fill(locThrownP, locTimePull); | |||
519 | } | |||
520 | else if(locChargedTrackHypothesis->t1_detector() == SYS_TOF) | |||
521 | { | |||
522 | dHistDeque_DeltaT_TOF[locStepIndex][locPID]->Fill(locDeltaT); | |||
523 | dHistDeque_TimePull_TOF[locStepIndex][locPID]->Fill(locTimePull); | |||
524 | dHistDeque_TimePullVsP_TOF[locStepIndex][locPID]->Fill(locThrownP, locTimePull); | |||
525 | } | |||
526 | else if(locChargedTrackHypothesis->t1_detector() == SYS_FCAL) | |||
527 | { | |||
528 | dHistDeque_TimePull_FCAL[locStepIndex][locPID]->Fill(locTimePull); | |||
529 | dHistDeque_TimePullVsP_FCAL[locStepIndex][locPID]->Fill(locThrownP, locTimePull); | |||
530 | } | |||
531 | dHistDeque_DeltaVertexZ[locStepIndex][locPID]->Fill(locDeltaVertexZ); | |||
532 | dHistDeque_DeltaPOverPVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaPOverP); | |||
533 | dHistDeque_DeltaPOverPVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaPOverP); | |||
534 | dHistDeque_DeltaThetaVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaTheta); | |||
535 | dHistDeque_DeltaThetaVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaTheta); | |||
536 | dHistDeque_DeltaPhiVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaPhi); | |||
537 | dHistDeque_DeltaPhiVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaPhi); | |||
538 | dHistDeque_DeltaTVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaT); | |||
539 | dHistDeque_DeltaTVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaT); | |||
540 | dHistDeque_DeltaVertexZVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaVertexZ); | |||
541 | ||||
542 | for(size_t loc_j = 0; loc_j < dPullTypes.size(); ++loc_j) | |||
543 | { | |||
544 | if(dPullTypes[loc_j] == d_EPull) | |||
545 | continue; | |||
546 | double locPull = 0.0; | |||
547 | if((dPullTypes[loc_j] >= d_PxPull) && (dPullTypes[loc_j] <= d_PzPull)) | |||
548 | { | |||
549 | int locIndex = int(dPullTypes[loc_j] - d_PxPull); | |||
550 | locPull = (locChargedTrackHypothesis->momentum()(locIndex) - locMCThrown->momentum()(locIndex))/sqrt(locCovarianceMatrix(locIndex, locIndex)); | |||
551 | } | |||
552 | else if((dPullTypes[loc_j] >= d_XxPull) && (dPullTypes[loc_j] <= d_XzPull)) | |||
553 | { | |||
554 | int locIndex = int(dPullTypes[loc_j] - d_XxPull); | |||
555 | locPull = (locChargedTrackHypothesis->position()(locIndex) - locMCThrown->position()(locIndex))/sqrt(locCovarianceMatrix(locIndex + 3, locIndex + 3)); | |||
556 | } | |||
557 | else if(dPullTypes[loc_j] == d_TPull) | |||
558 | locPull = (locChargedTrackHypothesis->time() - locMCThrown->time())/sqrt(locCovarianceMatrix(6, 6)); | |||
559 | (dHistDeque_Pulls[locStepIndex][locPID])[dPullTypes[loc_j]]->Fill(locPull); | |||
560 | (dHistDeque_PullsVsP[locStepIndex][locPID])[dPullTypes[loc_j]]->Fill(locThrownP, locPull); | |||
561 | (dHistDeque_PullsVsTheta[locStepIndex][locPID])[dPullTypes[loc_j]]->Fill(locThrownTheta, locPull); | |||
562 | } | |||
563 | } | |||
564 | Unlock_Action(); | |||
565 | } | |||
566 | ||||
567 | void DHistogramAction_ParticleComboGenReconComparison::Fill_NeutralHists(const DNeutralParticleHypothesis* locNeutralParticleHypothesis, const DMCThrown* locMCThrown, const DEventRFBunch* locThrownEventRFBunch, size_t locStepIndex) | |||
568 | { | |||
569 | Particle_t locPID = locNeutralParticleHypothesis->PID(); | |||
570 | const DNeutralShower* locNeutralShower = locNeutralParticleHypothesis->Get_NeutralShower(); | |||
571 | ||||
572 | double locThrownP = locMCThrown->momentum().Mag(); | |||
573 | double locThrownTheta = locMCThrown->momentum().Theta()*180.0/TMath::Pi(); | |||
574 | DVector3 locNeutralP3 = locNeutralParticleHypothesis->momentum(); | |||
575 | double locPMag = locNeutralP3.Mag(); | |||
576 | double locDeltaPOverP = (locPMag - locThrownP)/locThrownP; | |||
577 | double locDeltaTheta = locNeutralP3.Theta()*180.0/TMath::Pi() - locThrownTheta; | |||
578 | double locDeltaPhi = locNeutralP3.Phi()*180.0/TMath::Pi() - locMCThrown->momentum().Phi()*180.0/TMath::Pi(); | |||
579 | double locDeltaT = locNeutralParticleHypothesis->time() - locMCThrown->time(); //time comparison isn't fair if track comes from a detached vertex!!! | |||
580 | double locDeltaVertexZ = locNeutralParticleHypothesis->position().Z() - locMCThrown->position().Z(); | |||
581 | auto locCovarianceMatrix = locNeutralParticleHypothesis->errorMatrix(); | |||
582 | ||||
583 | double locStartTime = locThrownEventRFBunch->dTime + (locMCThrown->z() - dTargetZCenter)/29.9792458; | |||
584 | double locTimePull = (locCovarianceMatrix != nullptr) ? (locStartTime - locNeutralParticleHypothesis->time())/sqrt((*locCovarianceMatrix)(6, 6)) : std::numeric_limits<double>::quiet_NaN(); | |||
585 | ||||
586 | double locEPull = 0.0; | |||
587 | if(Get_UseKinFitResultsFlag()) | |||
588 | { | |||
589 | DMatrix locJacobian(1, 7); | |||
590 | locJacobian(0, 0) = locNeutralP3.Px()/locPMag; | |||
591 | locJacobian(0, 1) = locNeutralP3.Py()/locPMag; | |||
592 | locJacobian(0, 2) = locNeutralP3.Pz()/locPMag; | |||
593 | for(unsigned int loc_i = 0; loc_i < 4; ++loc_i) | |||
594 | locJacobian(0, 3 + loc_i) = 0.0; | |||
595 | ||||
596 | if(locCovarianceMatrix != nullptr) | |||
597 | { | |||
598 | TMatrixDSym locCovCopy = *locCovarianceMatrix; | |||
599 | locCovCopy.Similarity(locJacobian); | |||
600 | double locEUncertainty = sqrt(locCovCopy(0, 0)); | |||
601 | locEPull = (locNeutralParticleHypothesis->energy() - locMCThrown->energy())/locEUncertainty; | |||
602 | } | |||
603 | else | |||
604 | locEPull = std::numeric_limits<double>::quiet_NaN(); | |||
605 | } | |||
606 | else | |||
607 | locEPull = (locNeutralShower->dEnergy - locMCThrown->energy())/sqrt((*(locNeutralShower->dCovarianceMatrix))(0, 0)); | |||
608 | ||||
609 | //FILL HISTOGRAMS | |||
610 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
611 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
612 | Lock_Action(); | |||
613 | { | |||
614 | dHistDeque_DeltaPOverP[locStepIndex][locPID]->Fill(locDeltaPOverP); | |||
615 | dHistDeque_DeltaTheta[locStepIndex][locPID]->Fill(locDeltaTheta); | |||
616 | dHistDeque_DeltaPhi[locStepIndex][locPID]->Fill(locDeltaPhi); | |||
617 | dHistDeque_DeltaT[locStepIndex][locPID]->Fill(locDeltaT); | |||
618 | if(locNeutralParticleHypothesis->t1_detector() == SYS_BCAL) | |||
619 | { | |||
620 | dHistDeque_DeltaT_BCAL[locStepIndex][locPID]->Fill(locDeltaT); | |||
621 | dHistDeque_TimePull_BCAL[locStepIndex][locPID]->Fill(locTimePull); | |||
622 | dHistDeque_TimePullVsTheta_BCAL[locStepIndex][locPID]->Fill(locThrownTheta, locTimePull); | |||
623 | dHistDeque_TimePullVsP_BCAL[locStepIndex][locPID]->Fill(locThrownP, locTimePull); | |||
624 | } | |||
625 | else if(locNeutralParticleHypothesis->t1_detector() == SYS_FCAL) | |||
626 | { | |||
627 | dHistDeque_DeltaT_FCAL[locStepIndex][locPID]->Fill(locDeltaT); | |||
628 | dHistDeque_TimePull_FCAL[locStepIndex][locPID]->Fill(locTimePull); | |||
629 | dHistDeque_TimePullVsP_FCAL[locStepIndex][locPID]->Fill(locThrownP, locTimePull); | |||
630 | } | |||
631 | ||||
632 | dHistDeque_DeltaVertexZ[locStepIndex][locPID]->Fill(locDeltaVertexZ); | |||
633 | dHistDeque_DeltaPOverPVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaPOverP); | |||
634 | dHistDeque_DeltaPOverPVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaPOverP); | |||
635 | dHistDeque_DeltaThetaVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaTheta); | |||
636 | dHistDeque_DeltaThetaVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaTheta); | |||
637 | dHistDeque_DeltaPhiVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaPhi); | |||
638 | dHistDeque_DeltaPhiVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaPhi); | |||
639 | dHistDeque_DeltaTVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaT); | |||
640 | dHistDeque_DeltaTVsP[locStepIndex][locPID]->Fill(locThrownP, locDeltaT); | |||
641 | dHistDeque_DeltaVertexZVsTheta[locStepIndex][locPID]->Fill(locThrownTheta, locDeltaVertexZ); | |||
642 | ||||
643 | if(locCovarianceMatrix != nullptr) | |||
644 | { | |||
645 | for(size_t loc_j = 0; loc_j < dPullTypes.size(); ++loc_j) | |||
646 | { | |||
647 | if((dPullTypes[loc_j] >= d_PxPull) && (dPullTypes[loc_j] <= d_PzPull)) | |||
648 | continue; | |||
649 | double locPull = 0.0; | |||
650 | if(dPullTypes[loc_j] == d_EPull) | |||
651 | locPull = locEPull; | |||
652 | else if((dPullTypes[loc_j] >= d_XxPull) && (dPullTypes[loc_j] <= d_XzPull)) | |||
653 | { | |||
654 | int locIndex = int(dPullTypes[loc_j] - d_XxPull); | |||
655 | locPull = (locNeutralParticleHypothesis->position()(locIndex) - locMCThrown->position()(locIndex))/sqrt((*locCovarianceMatrix)(locIndex + 3, locIndex + 3)); | |||
656 | } | |||
657 | else if(dPullTypes[loc_j] == d_TPull) | |||
658 | locPull = (locNeutralParticleHypothesis->time() - locMCThrown->time())/sqrt((*locCovarianceMatrix)(6, 6)); | |||
659 | (dHistDeque_Pulls[locStepIndex][locPID])[dPullTypes[loc_j]]->Fill(locPull); | |||
660 | (dHistDeque_PullsVsP[locStepIndex][locPID])[dPullTypes[loc_j]]->Fill(locThrownP, locPull); | |||
661 | (dHistDeque_PullsVsTheta[locStepIndex][locPID])[dPullTypes[loc_j]]->Fill(locThrownTheta, locPull); | |||
662 | } | |||
663 | } | |||
664 | } | |||
665 | Unlock_Action(); | |||
666 | } | |||
667 | ||||
668 | void DHistogramAction_ThrownParticleKinematics::Initialize(JEventLoop* locEventLoop) | |||
669 | { | |||
670 | string locHistName, locHistTitle, locParticleName, locParticleROOTName; | |||
671 | Particle_t locPID; | |||
672 | ||||
673 | //CREATE THE HISTOGRAMS | |||
674 | //Since we are creating histograms, the contents of gDirectory will be modified: must use JANA-wide ROOT lock | |||
675 | japp->RootWriteLock(); //ACQUIRE ROOT LOCK!! | |||
676 | { | |||
677 | CreateAndChangeTo_ActionDirectory(); | |||
678 | ||||
679 | // Beam Particle: MCGEN | |||
680 | { | |||
681 | locPID = Gamma; | |||
682 | locParticleName = string("MCGENBeamParticle_") + ParticleType(locPID); | |||
683 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
684 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
685 | ||||
686 | locHistName = "Momentum"; | |||
687 | locHistTitle = string("MCGEN Thrown Beam ") + locParticleROOTName + string(";p (GeV/c)"); | |||
688 | dMCGENBeamParticle_P = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPBins, dMinP, dMaxP); | |||
689 | ||||
690 | locHistName = "Time"; | |||
691 | locHistTitle = string("MCGEN Thrown Beam ") + locParticleROOTName + string(";t (ns)"); | |||
692 | dMCGENBeamParticle_Time = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumTBins, dMinT, dMaxT); | |||
693 | ||||
694 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
695 | } | |||
696 | ||||
697 | // Beam Particle: All | |||
698 | { | |||
699 | locPID = Gamma; | |||
700 | locParticleName = string("TRUTHBeamParticles_") + ParticleType(locPID); | |||
701 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
702 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
703 | ||||
704 | locHistName = "Momentum"; | |||
705 | locHistTitle = string("TRUTH Thrown Beam ") + locParticleROOTName + string(";p (GeV/c)"); | |||
706 | dAllBeamParticle_P = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPBins, dMinP, dMaxP); | |||
707 | ||||
708 | locHistName = "Time"; | |||
709 | locHistTitle = string("TRUTH Thrown Beam ") + locParticleROOTName + string(";t (ns)"); | |||
710 | dAllBeamParticle_Time = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumTBins, dMinT, dMaxT); | |||
711 | ||||
712 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
713 | } | |||
714 | ||||
715 | for(size_t loc_i = 0; loc_i < dFinalStatePIDs.size(); ++loc_i) | |||
716 | { | |||
717 | locPID = dFinalStatePIDs[loc_i]; | |||
718 | locParticleName = ParticleType(locPID); | |||
719 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
720 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
721 | ||||
722 | // Momentum | |||
723 | locHistName = "Momentum"; | |||
724 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";p (GeV/c)"); | |||
725 | dHistMap_P[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPBins, dMinP, dMaxP); | |||
726 | ||||
727 | // Theta | |||
728 | locHistName = "Theta"; | |||
729 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#theta#circ"); | |||
730 | dHistMap_Theta[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumThetaBins, dMinTheta, dMaxTheta); | |||
731 | ||||
732 | // Phi | |||
733 | locHistName = "Phi"; | |||
734 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#phi#circ"); | |||
735 | dHistMap_Phi[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPhiBins, dMinPhi, dMaxPhi); | |||
736 | ||||
737 | // P Vs Theta | |||
738 | locHistName = "PVsTheta"; | |||
739 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#theta#circ;p (GeV/c)"); | |||
740 | dHistMap_PVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPBins, dMinP, dMaxP); | |||
741 | ||||
742 | // Phi Vs Theta | |||
743 | locHistName = "PhiVsTheta"; | |||
744 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#theta#circ;#phi#circ"); | |||
745 | dHistMap_PhiVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPhiBins, dMinPhi, dMaxPhi); | |||
746 | ||||
747 | // Vertex-Z | |||
748 | locHistName = "VertexZ"; | |||
749 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";Vertex-Z (cm)"); | |||
750 | dHistMap_VertexZ[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumVertexZBins, dMinVertexZ, dMaxVertexZ); | |||
751 | ||||
752 | // Vertex-Y Vs Vertex-X | |||
753 | locHistName = "VertexYVsX"; | |||
754 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";Vertex-X (cm);Vertex-Y (cm)"); | |||
755 | dHistMap_VertexYVsX[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNumVertexXYBins, dMinVertexXY, dMaxVertexXY, dNumVertexXYBins, dMinVertexXY, dMaxVertexXY); | |||
756 | ||||
757 | // Vertex-T | |||
758 | locHistName = "VertexT"; | |||
759 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";Vertex-T (ns)"); | |||
760 | dHistMap_VertexT[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumTBins, dMinT, dMaxT); | |||
761 | ||||
762 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
763 | } | |||
764 | ||||
765 | //Return to the base directory | |||
766 | ChangeTo_BaseDirectory(); | |||
767 | } | |||
768 | japp->RootUnLock(); //RELEASE ROOT LOCK!! | |||
769 | } | |||
770 | ||||
771 | bool DHistogramAction_ThrownParticleKinematics::Perform_Action(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo) | |||
772 | { | |||
773 | vector<const DMCThrown*> locMCThrowns, locMCThrowns_Decaying; | |||
774 | locEventLoop->Get(locMCThrowns, "FinalState"); | |||
775 | locEventLoop->Get(locMCThrowns_Decaying, "Decaying"); | |||
776 | locMCThrowns.insert(locMCThrowns.begin(), locMCThrowns_Decaying.begin(), locMCThrowns_Decaying.end()); | |||
777 | if(locMCThrowns.empty()) | |||
778 | return true; //e.g. non-simulated event | |||
779 | ||||
780 | if(Get_CalledPriorWithComboFlag()) | |||
781 | return true; //else double-counting! | |||
782 | ||||
783 | Particle_t locPID; | |||
784 | const DMCThrown* locMCThrown; | |||
785 | ||||
786 | vector<const DBeamPhoton*> locMCGENBeamPhotons; | |||
787 | locEventLoop->Get(locMCGENBeamPhotons, "MCGEN"); | |||
788 | ||||
789 | vector<const DBeamPhoton*> locBeamPhotons; | |||
790 | locEventLoop->Get(locBeamPhotons, "TRUTH"); | |||
791 | ||||
792 | //FILL HISTOGRAMS | |||
793 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
794 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
795 | Lock_Action(); | |||
796 | { | |||
797 | for(size_t loc_i = 0; loc_i < locMCGENBeamPhotons.size(); ++loc_i) | |||
798 | { | |||
799 | dMCGENBeamParticle_P->Fill(locMCGENBeamPhotons[loc_i]->energy()); | |||
800 | dMCGENBeamParticle_Time->Fill(locMCGENBeamPhotons[loc_i]->time()); | |||
801 | } | |||
802 | for(size_t loc_i = 0; loc_i < locBeamPhotons.size(); ++loc_i) | |||
803 | { | |||
804 | dAllBeamParticle_P->Fill(locBeamPhotons[loc_i]->energy()); | |||
805 | dAllBeamParticle_Time->Fill(locBeamPhotons[loc_i]->time()); | |||
806 | } | |||
807 | } | |||
808 | Unlock_Action(); | |||
809 | ||||
810 | for(size_t loc_i = 0; loc_i < locMCThrowns.size(); ++loc_i) | |||
811 | { | |||
812 | locMCThrown = locMCThrowns[loc_i]; | |||
813 | locPID = (Particle_t)locMCThrown->type; | |||
814 | if(dHistMap_P.find(locPID) == dHistMap_P.end()) | |||
815 | continue; //not interested in histogramming | |||
816 | ||||
817 | DVector3 locMomentum = locMCThrown->momentum(); | |||
818 | double locPhi = locMomentum.Phi()*180.0/TMath::Pi(); | |||
819 | double locTheta = locMomentum.Theta()*180.0/TMath::Pi(); | |||
820 | double locP = locMomentum.Mag(); | |||
821 | ||||
822 | //FILL HISTOGRAMS | |||
823 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
824 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
825 | Lock_Action(); | |||
826 | { | |||
827 | dHistMap_P[locPID]->Fill(locP); | |||
828 | dHistMap_Phi[locPID]->Fill(locPhi); | |||
829 | dHistMap_Theta[locPID]->Fill(locTheta); | |||
830 | dHistMap_PVsTheta[locPID]->Fill(locTheta, locP); | |||
831 | dHistMap_PhiVsTheta[locPID]->Fill(locTheta, locPhi); | |||
832 | dHistMap_VertexZ[locPID]->Fill(locMCThrown->position().Z()); | |||
833 | dHistMap_VertexYVsX[locPID]->Fill(locMCThrown->position().X(), locMCThrown->position().Y()); | |||
834 | dHistMap_VertexT[locPID]->Fill(locMCThrown->time()); | |||
835 | } | |||
836 | Unlock_Action(); | |||
837 | } | |||
838 | return true; | |||
839 | } | |||
840 | ||||
841 | void DHistogramAction_ReconnedThrownKinematics::Initialize(JEventLoop* locEventLoop) | |||
842 | { | |||
843 | string locHistName, locHistTitle, locParticleName, locParticleROOTName; | |||
844 | Particle_t locPID; | |||
845 | ||||
846 | Run_Update(locEventLoop); | |||
847 | ||||
848 | //CREATE THE HISTOGRAMS | |||
849 | //Since we are creating histograms, the contents of gDirectory will be modified: must use JANA-wide ROOT lock | |||
850 | japp->RootWriteLock(); //ACQUIRE ROOT LOCK!! | |||
851 | { | |||
852 | ||||
853 | CreateAndChangeTo_ActionDirectory(); | |||
854 | ||||
855 | // Beam Particle | |||
856 | locPID = Gamma; | |||
857 | locParticleName = string("Beam_") + ParticleType(locPID); | |||
858 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
859 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
860 | ||||
861 | locHistName = "Momentum"; | |||
862 | locHistTitle = string("Thrown Beam ") + locParticleROOTName + string(";p (GeV/c)"); | |||
863 | dBeamParticle_P = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPBins, dMinP, dMaxP); | |||
864 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
865 | ||||
866 | //PID | |||
867 | CreateAndChangeTo_Directory("PID", "PID"); | |||
868 | { | |||
869 | //beta vs p | |||
870 | locHistName = "BetaVsP_Q+"; | |||
871 | locHistTitle = "q^{+};p (GeV/c);#beta"; | |||
872 | dHistMap_QBetaVsP[1] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumBetaBins, dMinBeta, dMaxBeta); | |||
873 | ||||
874 | locHistName = "BetaVsP_Q-"; | |||
875 | locHistTitle = "q^{-};p (GeV/c);#beta"; | |||
876 | dHistMap_QBetaVsP[-1] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumBetaBins, dMinBeta, dMaxBeta); | |||
877 | } | |||
878 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
879 | ||||
880 | for(size_t loc_i = 0; loc_i < dFinalStatePIDs.size(); ++loc_i) | |||
881 | { | |||
882 | locPID = dFinalStatePIDs[loc_i]; | |||
883 | locParticleName = ParticleType(locPID); | |||
884 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
885 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
886 | ||||
887 | // Momentum | |||
888 | locHistName = "Momentum"; | |||
889 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";p (GeV/c)"); | |||
890 | dHistMap_P[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPBins, dMinP, dMaxP); | |||
891 | ||||
892 | // Theta | |||
893 | locHistName = "Theta"; | |||
894 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#theta#circ"); | |||
895 | dHistMap_Theta[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumThetaBins, dMinTheta, dMaxTheta); | |||
896 | ||||
897 | // Phi | |||
898 | locHistName = "Phi"; | |||
899 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#phi#circ"); | |||
900 | dHistMap_Phi[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPhiBins, dMinPhi, dMaxPhi); | |||
901 | ||||
902 | // P Vs Theta | |||
903 | locHistName = "PVsTheta"; | |||
904 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#theta#circ;p (GeV/c)"); | |||
905 | dHistMap_PVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPBins, dMinP, dMaxP); | |||
906 | ||||
907 | // Phi Vs Theta | |||
908 | locHistName = "PhiVsTheta"; | |||
909 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";#theta#circ;#phi#circ"); | |||
910 | dHistMap_PhiVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPhiBins, dMinPhi, dMaxPhi); | |||
911 | ||||
912 | // Vertex-Z | |||
913 | locHistName = "VertexZ"; | |||
914 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";Vertex-Z (cm)"); | |||
915 | dHistMap_VertexZ[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumVertexZBins, dMinVertexZ, dMaxVertexZ); | |||
916 | ||||
917 | // Vertex-Y Vs Vertex-X | |||
918 | locHistName = "VertexYVsX"; | |||
919 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";Vertex-X (cm);Vertex-Y (cm)"); | |||
920 | dHistMap_VertexYVsX[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNumVertexXYBins, dMinVertexXY, dMaxVertexXY, dNumVertexXYBins, dMinVertexXY, dMaxVertexXY); | |||
921 | ||||
922 | // Vertex-T | |||
923 | locHistName = "VertexT"; | |||
924 | locHistTitle = string("Thrown ") + locParticleROOTName + string(";Vertex-T (ns)"); | |||
925 | dHistMap_VertexT[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumTBins, dMinT, dMaxT); | |||
926 | ||||
927 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
928 | } | |||
929 | ||||
930 | //Return to the base directory | |||
931 | ChangeTo_BaseDirectory(); | |||
932 | } | |||
933 | japp->RootUnLock(); //RELEASE ROOT LOCK!! | |||
934 | } | |||
935 | ||||
936 | void DHistogramAction_ReconnedThrownKinematics::Run_Update(JEventLoop* locEventLoop) | |||
937 | { | |||
938 | const DAnalysisUtilities* locAnalysisUtilities = NULL__null; | |||
939 | locEventLoop->GetSingle(locAnalysisUtilities); | |||
940 | dAnalysisUtilities = locAnalysisUtilities; | |||
941 | } | |||
942 | ||||
943 | bool DHistogramAction_ReconnedThrownKinematics::Perform_Action(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo) | |||
944 | { | |||
945 | vector<const DMCThrown*> locMCThrowns, locMCThrowns_Decaying; | |||
946 | locEventLoop->Get(locMCThrowns, "FinalState"); | |||
947 | locEventLoop->Get(locMCThrowns_Decaying, "Decaying"); | |||
948 | locMCThrowns.insert(locMCThrowns.begin(), locMCThrowns_Decaying.begin(), locMCThrowns_Decaying.end()); | |||
949 | if(locMCThrowns.empty()) | |||
950 | return true; //e.g. non-simulated event | |||
951 | ||||
952 | if(Get_CalledPriorWithComboFlag()) | |||
953 | return true; //else double-counting! | |||
954 | ||||
955 | const DMCThrownMatching* locMCThrownMatching = NULL__null; | |||
956 | locEventLoop->GetSingle(locMCThrownMatching); | |||
957 | ||||
958 | vector<const DBeamPhoton*> locBeamPhotons; | |||
959 | locEventLoop->Get(locBeamPhotons); | |||
960 | ||||
961 | //FILL HISTOGRAMS | |||
962 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
963 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
964 | Lock_Action(); | |||
965 | { | |||
966 | for(size_t loc_i = 0; loc_i < locBeamPhotons.size(); ++loc_i) | |||
967 | dBeamParticle_P->Fill(locBeamPhotons[loc_i]->energy()); | |||
968 | } | |||
969 | Unlock_Action(); | |||
970 | ||||
971 | for(size_t loc_i = 0; loc_i < locMCThrowns.size(); ++loc_i) | |||
972 | { | |||
973 | const DMCThrown* locMCThrown = locMCThrowns[loc_i]; | |||
974 | Particle_t locPID = (Particle_t)locMCThrown->type; | |||
975 | ||||
976 | double locMatchFOM = 0.0; | |||
977 | double locBeta_Timing = 0.0; | |||
978 | if(ParticleCharge(locPID) != 0) | |||
979 | { | |||
980 | const DChargedTrackHypothesis* locChargedTrackHypothesis = locMCThrownMatching->Get_MatchingChargedHypothesis(locMCThrown, locMatchFOM); | |||
981 | if(locChargedTrackHypothesis == NULL__null) | |||
982 | continue; //not reconstructed | |||
983 | locBeta_Timing = locChargedTrackHypothesis->measuredBeta(); | |||
984 | } | |||
985 | else | |||
986 | { | |||
987 | const DNeutralParticleHypothesis* locNeutralParticleHypothesis = locMCThrownMatching->Get_MatchingNeutralHypothesis(locMCThrown, locMatchFOM); | |||
988 | if(locNeutralParticleHypothesis == NULL__null) | |||
989 | continue; //not reconstructed | |||
990 | locBeta_Timing = locNeutralParticleHypothesis->measuredBeta(); | |||
991 | } | |||
992 | ||||
993 | DVector3 locMomentum = locMCThrown->momentum(); | |||
994 | double locPhi = locMomentum.Phi()*180.0/TMath::Pi(); | |||
995 | double locTheta = locMomentum.Theta()*180.0/TMath::Pi(); | |||
996 | double locP = locMomentum.Mag(); | |||
997 | int locCharge = ParticleCharge(locPID); | |||
998 | ||||
999 | //FILL HISTOGRAMS | |||
1000 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
1001 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
1002 | Lock_Action(); | |||
1003 | { | |||
1004 | if(dHistMap_QBetaVsP.find(locCharge) != dHistMap_QBetaVsP.end()) | |||
1005 | dHistMap_QBetaVsP[locCharge]->Fill(locP, locBeta_Timing); | |||
1006 | if(dHistMap_P.find(locPID) != dHistMap_P.end()) | |||
1007 | { | |||
1008 | dHistMap_P[locPID]->Fill(locP); | |||
1009 | dHistMap_Phi[locPID]->Fill(locPhi); | |||
1010 | dHistMap_Theta[locPID]->Fill(locTheta); | |||
1011 | dHistMap_PVsTheta[locPID]->Fill(locTheta, locP); | |||
1012 | dHistMap_PhiVsTheta[locPID]->Fill(locTheta, locPhi); | |||
1013 | dHistMap_VertexZ[locPID]->Fill(locMCThrown->position().Z()); | |||
1014 | dHistMap_VertexYVsX[locPID]->Fill(locMCThrown->position().X(), locMCThrown->position().Y()); | |||
1015 | dHistMap_VertexT[locPID]->Fill(locMCThrown->time()); | |||
1016 | } | |||
1017 | } | |||
1018 | Unlock_Action(); | |||
1019 | } | |||
1020 | return true; | |||
1021 | } | |||
1022 | ||||
1023 | void DHistogramAction_GenReconTrackComparison::Initialize(JEventLoop* locEventLoop) | |||
1024 | { | |||
1025 | string locHistName, locHistTitle, locParticleName, locParticleROOTName; | |||
1026 | Particle_t locPID; | |||
1027 | ||||
1028 | Run_Update(locEventLoop); | |||
1029 | ||||
1030 | //CREATE THE HISTOGRAMS | |||
1031 | //Since we are creating histograms, the contents of gDirectory will be modified: must use JANA-wide ROOT lock | |||
1032 | japp->RootWriteLock(); //ACQUIRE ROOT LOCK!! | |||
1033 | { | |||
1034 | CreateAndChangeTo_ActionDirectory(); | |||
1035 | ||||
1036 | locHistName = "DeltaT_RFBeamBunch"; | |||
1037 | dRFBeamBunchDeltaT_Hist = GetOrCreate_Histogram<TH1I>(locHistName, ";RF #Deltat (Reconstructed - Thrown)", dNumRFDeltaTBins, dMinRFDeltaT, dMaxRFDeltaT); | |||
1038 | ||||
1039 | deque<string> locPullNames(8, ""); | |||
1040 | locPullNames[0] = "E"; locPullNames[1] = "Px"; locPullNames[2] = "Py"; locPullNames[3] = "Pz"; | |||
1041 | locPullNames[4] = "Xx"; locPullNames[5] = "Xy"; locPullNames[6] = "Xz"; locPullNames[7] = "T"; | |||
1042 | ||||
1043 | deque<string> locPullTitles(8, ""); | |||
1044 | locPullTitles[0] = "E"; locPullTitles[1] = "p_{x}"; locPullTitles[2] = "p_{y}"; locPullTitles[3] = "p_{z}"; | |||
1045 | locPullTitles[4] = "x_{x}"; locPullTitles[5] = "x_{y}"; locPullTitles[6] = "x_{z}"; locPullTitles[7] = "t"; | |||
1046 | ||||
1047 | for(size_t loc_i = 0; loc_i < dFinalStatePIDs.size(); ++loc_i) | |||
1048 | { | |||
1049 | locPID = dFinalStatePIDs[loc_i]; | |||
1050 | locParticleName = ParticleType(locPID); | |||
1051 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
1052 | CreateAndChangeTo_Directory(locParticleName, locParticleName); | |||
1053 | ||||
1054 | // MatchChiSqPerDF | |||
1055 | locHistName = string("MatchFOM"); | |||
1056 | locHistTitle = locParticleROOTName + string(";Thrown/Reconstructed Matching FOM"); | |||
1057 | dHistMap_MatchFOM[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumMCMatchingFOMBins, 0.0, 1.0); | |||
1058 | ||||
1059 | // DeltaP/P | |||
1060 | locHistName = string("DeltaPOverP"); | |||
1061 | locHistTitle = locParticleROOTName + string(";#Deltap/p (Reconstructed - Thrown)"); | |||
1062 | dHistMap_DeltaPOverP[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
1063 | ||||
1064 | // DeltaTheta | |||
1065 | locHistName = string("DeltaTheta"); | |||
1066 | locHistTitle = locParticleROOTName + string(";#Delta#theta#circ (Reconstructed - Thrown)"); | |||
1067 | dHistMap_DeltaTheta[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaThetaBins, dMinDeltaTheta, dMaxDeltaTheta); | |||
1068 | ||||
1069 | // DeltaPhi | |||
1070 | locHistName = string("DeltaPhi"); | |||
1071 | locHistTitle = locParticleROOTName + string(";#Delta#phi#circ (Reconstructed - Thrown)"); | |||
1072 | dHistMap_DeltaPhi[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi); | |||
1073 | ||||
1074 | // DeltaT | |||
1075 | locHistName = string("DeltaT"); | |||
1076 | locHistTitle = locParticleROOTName + string(";#Deltat (ns) (Reconstructed - Thrown)"); | |||
1077 | dHistMap_DeltaT[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
1078 | ||||
1079 | // DeltaT - BCAL | |||
1080 | locHistName = string("DeltaT_BCAL"); | |||
1081 | locHistTitle = locParticleROOTName + string(" in BCAL;#Deltat (ns) (Reconstructed - Thrown)"); | |||
1082 | dHistMap_DeltaT_BCAL[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
1083 | ||||
1084 | // DeltaT - TOF (charged only) | |||
1085 | if(ParticleCharge(locPID) != 0) | |||
1086 | { | |||
1087 | locHistName = string("DeltaT_TOF"); | |||
1088 | locHistTitle = locParticleROOTName + string(" in TOF;#Deltat (ns) (Reconstructed - Thrown)"); | |||
1089 | dHistMap_DeltaT_TOF[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
1090 | } | |||
1091 | ||||
1092 | // DeltaT - FCAL (neutral only) | |||
1093 | if(ParticleCharge(locPID) == 0) | |||
1094 | { | |||
1095 | locHistName = string("DeltaT_FCAL"); | |||
1096 | locHistTitle = locParticleROOTName + string(" in FCAL;#Deltat (ns) (Reconstructed - Thrown)"); | |||
1097 | dHistMap_DeltaT_FCAL[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
1098 | } | |||
1099 | ||||
1100 | // DeltaVertexZ | |||
1101 | locHistName = string("DeltaVertexZ"); | |||
1102 | locHistTitle = locParticleROOTName + string(";#DeltaVertex-Z (cm) (Reconstructed - Thrown)"); | |||
1103 | dHistMap_DeltaVertexZ[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumDeltaVertexZBins, dMinDeltaVertexZ, dMaxDeltaVertexZ); | |||
1104 | ||||
1105 | // DeltaP/P Vs P | |||
1106 | locHistName = string("DeltaPOverPVsP"); | |||
1107 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltap/p (Reconstructed - Thrown)"); | |||
1108 | dHistMap_DeltaPOverPVsP[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
1109 | ||||
1110 | // DeltaP/P Vs Theta | |||
1111 | locHistName = string("DeltaPOverPVsTheta"); | |||
1112 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltap/p (Reconstructed - Thrown)"); | |||
1113 | dHistMap_DeltaPOverPVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaPOverPBins, dMinDeltaPOverP, dMaxDeltaPOverP); | |||
1114 | ||||
1115 | // DeltaTheta Vs P | |||
1116 | locHistName = string("DeltaThetaVsP"); | |||
1117 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Delta#theta#circ (Reconstructed - Thrown)"); | |||
1118 | dHistMap_DeltaThetaVsP[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaThetaBins, dMinDeltaTheta, dMaxDeltaTheta); | |||
1119 | ||||
1120 | // DeltaTheta Vs Theta | |||
1121 | locHistName = string("DeltaThetaVsTheta"); | |||
1122 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Delta#theta#circ (Reconstructed - Thrown)"); | |||
1123 | dHistMap_DeltaThetaVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaThetaBins, dMinDeltaTheta, dMaxDeltaTheta); | |||
1124 | ||||
1125 | // DeltaPhi Vs P | |||
1126 | locHistName = string("DeltaPhiVsP"); | |||
1127 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Delta#phi#circ (Reconstructed - Thrown)"); | |||
1128 | dHistMap_DeltaPhiVsP[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi); | |||
1129 | ||||
1130 | // DeltaPhi Vs Theta | |||
1131 | locHistName = string("DeltaPhiVsTheta"); | |||
1132 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Delta#phi#circ (Reconstructed - Thrown)"); | |||
1133 | dHistMap_DeltaPhiVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi); | |||
1134 | ||||
1135 | // DeltaT Vs Theta | |||
1136 | locHistName = string("DeltaTVsTheta"); | |||
1137 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat (ns) (Reconstructed - Thrown)"); | |||
1138 | dHistMap_DeltaTVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
1139 | ||||
1140 | // DeltaT Vs P | |||
1141 | locHistName = string("DeltaTVsP"); | |||
1142 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat (ns) (Reconstructed - Thrown)"); | |||
1143 | dHistMap_DeltaTVsP[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNumDeltaTBins, dMinDeltaT, dMaxDeltaT); | |||
1144 | ||||
1145 | // DeltaVertexZ Vs Theta | |||
1146 | locHistName = string("DeltaVertexZVsTheta"); | |||
1147 | locHistTitle = locParticleROOTName + string(";#theta#circ;#DeltaVertex-Z (cm) (Reconstructed - Thrown)"); | |||
1148 | dHistMap_DeltaVertexZVsTheta[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNumDeltaVertexZBins, dMinDeltaVertexZ, dMaxDeltaVertexZ); | |||
1149 | ||||
1150 | // P Vs Theta | |||
1151 | locHistName = "PVsTheta_LargeDeltaT"; | |||
1152 | locHistTitle = locParticleROOTName + string(";#theta#circ;p (GeV/c)"); | |||
1153 | dHistMap_PVsTheta_LargeDeltaT[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPBins, dMinP, dMaxP); | |||
1154 | ||||
1155 | /************************************************************************ Pulls ************************************************************************/ | |||
1156 | ||||
1157 | CreateAndChangeTo_Directory("Pulls", "Pulls"); | |||
1158 | for(size_t loc_j = 0; loc_j < dPullTypes.size(); ++loc_j) | |||
1159 | { | |||
1160 | if((ParticleCharge(locPID) != 0) && (dPullTypes[loc_j] == d_EPull)) | |||
1161 | continue; | |||
1162 | if((ParticleCharge(locPID) == 0) && ((dPullTypes[loc_j] >= d_PxPull) && (dPullTypes[loc_j] <= d_PzPull))) | |||
1163 | continue; | |||
1164 | ||||
1165 | //Pull 1D | |||
1166 | locHistName = locPullNames[loc_j] + string("Pull"); | |||
1167 | locHistTitle = locParticleROOTName + string(";#Delta") + locPullTitles[loc_j] + string("/#sigma_{") + locPullTitles[loc_j] + string("} (Reconstructed - Thrown)"); | |||
1168 | dHistMap_Pulls[locPID][dPullTypes[loc_j]] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
1169 | ||||
1170 | //Pull vs P | |||
1171 | locHistName = locPullNames[loc_j] + string("PullVsP"); | |||
1172 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Delta") + locPullTitles[loc_j] + string("/#sigma_{") + locPullTitles[loc_j] + string("} (Reconstructed - Thrown)"); | |||
1173 | dHistMap_PullsVsP[locPID][dPullTypes[loc_j]] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
1174 | ||||
1175 | //Pull vs Theta | |||
1176 | locHistName = locPullNames[loc_j] + string("PullVsTheta"); | |||
1177 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Delta") + locPullTitles[loc_j] + string("/#sigma_{") + locPullTitles[loc_j] + string("} (Reconstructed - Thrown)"); | |||
1178 | dHistMap_PullsVsTheta[locPID][dPullTypes[loc_j]] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
1179 | } | |||
1180 | ||||
1181 | //Delta-t Pulls - CDC & ST | |||
1182 | if(ParticleCharge(locPID) != 0) | |||
1183 | { | |||
1184 | //CDC | |||
1185 | locHistName = "TimePull_CDC"; | |||
1186 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
1187 | dHistMap_TimePull_CDC[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
1188 | ||||
1189 | locHistName = "TimePullVsTheta_CDC"; | |||
1190 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat/#sigma_{#Deltat}"); | |||
1191 | dHistMap_TimePullVsTheta_CDC[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
1192 | ||||
1193 | locHistName = "TimePullVsP_CDC"; | |||
1194 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
1195 | dHistMap_TimePullVsP_CDC[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
1196 | ||||
1197 | //ST | |||
1198 | locHistName = "TimePull_ST"; | |||
1199 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
1200 | dHistMap_TimePull_ST[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
1201 | ||||
1202 | locHistName = "TimePullVsTheta_ST"; | |||
1203 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat/#sigma_{#Deltat}"); | |||
1204 | dHistMap_TimePullVsTheta_ST[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
1205 | ||||
1206 | locHistName = "TimePullVsP_ST"; | |||
1207 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
1208 | dHistMap_TimePullVsP_ST[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
1209 | } | |||
1210 | ||||
1211 | //Delta-t Pulls - BCAL | |||
1212 | locHistName = "TimePull_BCAL"; | |||
1213 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
1214 | dHistMap_TimePull_BCAL[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
1215 | ||||
1216 | locHistName = "TimePullVsTheta_BCAL"; | |||
1217 | locHistTitle = locParticleROOTName + string(";#theta#circ;#Deltat/#sigma_{#Deltat}"); | |||
1218 | dHistMap_TimePullVsTheta_BCAL[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DPullBins, -10.0, 10.0); | |||
1219 | ||||
1220 | locHistName = "TimePullVsP_BCAL"; | |||
1221 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
1222 | dHistMap_TimePullVsP_BCAL[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
1223 | ||||
1224 | //Delta-t Pulls - TOF | |||
1225 | if(ParticleCharge(locPID) != 0) //TOF | |||
1226 | { | |||
1227 | locHistName = "TimePull_TOF"; | |||
1228 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
1229 | dHistMap_TimePull_TOF[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
1230 | ||||
1231 | locHistName = "TimePullVsP_TOF"; | |||
1232 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
1233 | dHistMap_TimePullVsP_TOF[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
1234 | } | |||
1235 | ||||
1236 | //Delta-t Pulls - FCAL | |||
1237 | locHistName = "TimePull_FCAL"; | |||
1238 | locHistTitle = locParticleROOTName + string(";#Deltat/#sigma_{#Deltat}"); | |||
1239 | dHistMap_TimePull_FCAL[locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPullBins, -10.0, 10.0); | |||
1240 | ||||
1241 | locHistName = "TimePullVsP_FCAL"; | |||
1242 | locHistTitle = locParticleROOTName + string(";p (GeV/c);#Deltat/#sigma_{#Deltat}"); | |||
1243 | dHistMap_TimePullVsP_FCAL[locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DPullBins, -10.0, 10.0); | |||
1244 | ||||
1245 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
1246 | ||||
1247 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
1248 | } | |||
1249 | ||||
1250 | //Return to the base directory | |||
1251 | ChangeTo_BaseDirectory(); | |||
1252 | } | |||
1253 | japp->RootUnLock(); //RELEASE ROOT LOCK!! | |||
1254 | } | |||
1255 | ||||
1256 | void DHistogramAction_GenReconTrackComparison::Run_Update(JEventLoop* locEventLoop) | |||
1257 | { | |||
1258 | DApplication* locApplication = dynamic_cast<DApplication*>(locEventLoop->GetJApplication()); | |||
1259 | DGeometry *locGeometry = locApplication->GetDGeometry(locEventLoop->GetJEvent().GetRunNumber()); | |||
1260 | locGeometry->GetTargetZ(dTargetZCenter); | |||
1261 | } | |||
1262 | ||||
1263 | bool DHistogramAction_GenReconTrackComparison::Perform_Action(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo) | |||
1264 | { | |||
1265 | vector<const DMCThrown*> locMCThrowns; | |||
1266 | locEventLoop->Get(locMCThrowns); | |||
1267 | if(locMCThrowns.empty()) | |||
1268 | return true; //e.g. non-simulated event | |||
1269 | ||||
1270 | if(Get_CalledPriorWithComboFlag()) | |||
1271 | return true; //else double-counting! | |||
1272 | ||||
1273 | Particle_t locPID; | |||
1274 | double locDeltaPOverP, locDeltaTheta, locDeltaPhi, locDeltaVertexZ; | |||
1275 | double locThrownP, locThrownTheta, locDeltaT; | |||
1276 | ||||
1277 | vector<const DMCThrownMatching*> locMCThrownMatchingVector; | |||
1278 | locEventLoop->Get(locMCThrownMatchingVector); | |||
1279 | if(locMCThrownMatchingVector.empty()) | |||
1280 | return true; | |||
1281 | const DMCThrownMatching* locMCThrownMatching = locMCThrownMatchingVector[0]; | |||
1282 | ||||
1283 | const DEventRFBunch* locThrownEventRFBunch = NULL__null; | |||
1284 | locEventLoop->GetSingle(locThrownEventRFBunch, "Thrown"); | |||
1285 | ||||
1286 | //RF time difference | |||
1287 | vector<const DEventRFBunch*> locEventRFBunches; | |||
1288 | locEventLoop->Get(locEventRFBunches); | |||
1289 | const DEventRFBunch* locEventRFBunch = locEventRFBunches[0]; | |||
1290 | double locRFTime = locEventRFBunch->dTime; | |||
1291 | double locRFDeltaT = locRFTime - locThrownEventRFBunch->dTime; | |||
1292 | ||||
1293 | //FILL HISTOGRAMS | |||
1294 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
1295 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
1296 | Lock_Action(); | |||
1297 | { | |||
1298 | dRFBeamBunchDeltaT_Hist->Fill(locRFDeltaT); | |||
1299 | } | |||
1300 | Unlock_Action(); | |||
1301 | ||||
1302 | //charged particles | |||
1303 | map<const DMCThrown*, pair<const DChargedTrack*, double> > locThrownToChargedMap; | |||
1304 | locMCThrownMatching->Get_ThrownToChargedMap(locThrownToChargedMap); | |||
1305 | map<const DMCThrown*, pair<const DChargedTrack*, double> >::iterator locChargedIterator = locThrownToChargedMap.begin(); | |||
1306 | for(; locChargedIterator != locThrownToChargedMap.end(); ++locChargedIterator) | |||
1307 | { | |||
1308 | const DMCThrown* locMCThrown = locChargedIterator->first; | |||
1309 | locPID = (Particle_t)locMCThrown->type; | |||
1310 | if(dHistMap_DeltaPOverP.find(locPID) == dHistMap_DeltaPOverP.end()) | |||
1311 | continue; //e.g. not interested in histogramming | |||
1312 | ||||
1313 | double locMatchFOM = locChargedIterator->second.second; | |||
1314 | const DChargedTrackHypothesis* locChargedTrackHypothesis = locChargedIterator->second.first->Get_Hypothesis(locPID); | |||
1315 | if(locChargedTrackHypothesis == NULL__null) | |||
1316 | locChargedTrackHypothesis = locChargedIterator->second.first->Get_BestFOM(); | |||
1317 | ||||
1318 | locThrownP = locMCThrown->momentum().Mag(); | |||
1319 | locThrownTheta = locMCThrown->momentum().Theta()*180.0/TMath::Pi(); | |||
1320 | locDeltaPOverP = (locChargedTrackHypothesis->momentum().Mag() - locThrownP)/locThrownP; | |||
1321 | locDeltaTheta = locChargedTrackHypothesis->momentum().Theta()*180.0/TMath::Pi() - locThrownTheta; | |||
1322 | locDeltaPhi = locChargedTrackHypothesis->momentum().Phi()*180.0/TMath::Pi() - locMCThrown->momentum().Phi()*180.0/TMath::Pi(); | |||
1323 | locDeltaT = locChargedTrackHypothesis->time() - locMCThrown->time(); //time comparison isn't fair if track comes from a detached vertex!!! | |||
1324 | locDeltaVertexZ = locChargedTrackHypothesis->position().Z() - locMCThrown->position().Z(); | |||
1325 | const TMatrixDSym& locCovarianceMatrix = *(locChargedTrackHypothesis->errorMatrix().get()); | |||
1326 | ||||
1327 | const DTrackTimeBased* locTrackTimeBased = locChargedTrackHypothesis->Get_TrackTimeBased(); | |||
1328 | ||||
1329 | double locStartTime = locThrownEventRFBunch->dTime + (locMCThrown->z() - dTargetZCenter)/29.9792458; | |||
1330 | double locTimePull = (locStartTime - locChargedTrackHypothesis->time())/sqrt(locCovarianceMatrix(6, 6)); | |||
1331 | double locT0Pull = (locStartTime - locChargedTrackHypothesis->t0())/locChargedTrackHypothesis->t0_err(); | |||
1332 | ||||
1333 | //FILL HISTOGRAMS | |||
1334 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
1335 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
1336 | Lock_Action(); | |||
1337 | { | |||
1338 | dHistMap_MatchFOM[locPID]->Fill(locMatchFOM); | |||
1339 | dHistMap_DeltaPOverP[locPID]->Fill(locDeltaPOverP); | |||
1340 | dHistMap_DeltaTheta[locPID]->Fill(locDeltaTheta); | |||
1341 | dHistMap_DeltaPhi[locPID]->Fill(locDeltaPhi); | |||
1342 | dHistMap_DeltaT[locPID]->Fill(locDeltaT); | |||
1343 | if(locChargedTrackHypothesis->t0_detector() == SYS_START) | |||
1344 | { | |||
1345 | dHistMap_TimePull_ST[locPID]->Fill(locT0Pull); | |||
1346 | dHistMap_TimePullVsTheta_ST[locPID]->Fill(locThrownTheta, locT0Pull); | |||
1347 | dHistMap_TimePullVsP_ST[locPID]->Fill(locThrownP, locT0Pull); | |||
1348 | } | |||
1349 | if(locChargedTrackHypothesis->t0_detector() == SYS_CDC) | |||
1350 | { | |||
1351 | dHistMap_TimePull_CDC[locPID]->Fill(locT0Pull); | |||
1352 | dHistMap_TimePullVsTheta_CDC[locPID]->Fill(locThrownTheta, locT0Pull); | |||
1353 | dHistMap_TimePullVsP_CDC[locPID]->Fill(locThrownP, locT0Pull); | |||
1354 | } | |||
1355 | else if(locChargedTrackHypothesis->t1_detector() == SYS_CDC) | |||
1356 | { | |||
1357 | dHistMap_TimePull_CDC[locPID]->Fill(locTimePull); | |||
1358 | dHistMap_TimePullVsTheta_CDC[locPID]->Fill(locThrownTheta, locTimePull); | |||
1359 | dHistMap_TimePullVsP_CDC[locPID]->Fill(locThrownP, locTimePull); | |||
1360 | } | |||
1361 | if(locChargedTrackHypothesis->t1_detector() == SYS_BCAL) | |||
1362 | { | |||
1363 | dHistMap_DeltaT_BCAL[locPID]->Fill(locDeltaT); | |||
1364 | dHistMap_TimePull_BCAL[locPID]->Fill(locTimePull); | |||
1365 | dHistMap_TimePullVsTheta_BCAL[locPID]->Fill(locThrownTheta, locTimePull); | |||
1366 | dHistMap_TimePullVsP_BCAL[locPID]->Fill(locThrownP, locTimePull); | |||
1367 | } | |||
1368 | else if(locChargedTrackHypothesis->t1_detector() == SYS_TOF) | |||
1369 | { | |||
1370 | dHistMap_DeltaT_TOF[locPID]->Fill(locDeltaT); | |||
1371 | dHistMap_TimePull_TOF[locPID]->Fill(locTimePull); | |||
1372 | dHistMap_TimePullVsP_TOF[locPID]->Fill(locThrownP, locTimePull); | |||
1373 | } | |||
1374 | else if(locChargedTrackHypothesis->t1_detector() == SYS_FCAL) | |||
1375 | { | |||
1376 | dHistMap_TimePull_FCAL[locPID]->Fill(locTimePull); | |||
1377 | dHistMap_TimePullVsP_FCAL[locPID]->Fill(locThrownP, locTimePull); | |||
1378 | } | |||
1379 | dHistMap_DeltaVertexZ[locPID]->Fill(locDeltaVertexZ); | |||
1380 | dHistMap_DeltaPOverPVsP[locPID]->Fill(locThrownP, locDeltaPOverP); | |||
1381 | dHistMap_DeltaPOverPVsTheta[locPID]->Fill(locThrownTheta, locDeltaPOverP); | |||
1382 | dHistMap_DeltaThetaVsP[locPID]->Fill(locThrownP, locDeltaTheta); | |||
1383 | dHistMap_DeltaThetaVsTheta[locPID]->Fill(locThrownTheta, locDeltaTheta); | |||
1384 | dHistMap_DeltaPhiVsP[locPID]->Fill(locThrownP, locDeltaPhi); | |||
1385 | dHistMap_DeltaPhiVsTheta[locPID]->Fill(locThrownTheta, locDeltaPhi); | |||
1386 | dHistMap_DeltaTVsTheta[locPID]->Fill(locThrownTheta, locDeltaT); | |||
1387 | dHistMap_DeltaTVsP[locPID]->Fill(locThrownP, locDeltaT); | |||
1388 | dHistMap_DeltaVertexZVsTheta[locPID]->Fill(locThrownTheta, locDeltaVertexZ); | |||
1389 | if((locTrackTimeBased->FOM > 0.01) && (locDeltaT >= 1.002)) | |||
1390 | dHistMap_PVsTheta_LargeDeltaT[locPID]->Fill(locThrownTheta, locThrownP); | |||
1391 | ||||
1392 | for(size_t loc_j = 0; loc_j < dPullTypes.size(); ++loc_j) | |||
1393 | { | |||
1394 | if(dPullTypes[loc_j] == d_EPull) | |||
1395 | continue; | |||
1396 | double locPull = 0.0; | |||
1397 | if((dPullTypes[loc_j] >= d_PxPull) && (dPullTypes[loc_j] <= d_PzPull)) | |||
1398 | { | |||
1399 | int locIndex = int(dPullTypes[loc_j] - d_PxPull); | |||
1400 | locPull = (locChargedTrackHypothesis->momentum()(locIndex) - locMCThrown->momentum()(locIndex))/sqrt(locCovarianceMatrix(locIndex, locIndex)); | |||
1401 | } | |||
1402 | else if((dPullTypes[loc_j] >= d_XxPull) && (dPullTypes[loc_j] <= d_XzPull)) | |||
1403 | { | |||
1404 | int locIndex = int(dPullTypes[loc_j] - d_XxPull); | |||
1405 | locPull = (locChargedTrackHypothesis->position()(locIndex) - locMCThrown->position()(locIndex))/sqrt(locCovarianceMatrix(locIndex + 3, locIndex + 3)); | |||
1406 | } | |||
1407 | else if(dPullTypes[loc_j] == d_TPull) | |||
1408 | locPull = (locChargedTrackHypothesis->time() - locMCThrown->time())/sqrt(locCovarianceMatrix(6, 6)); | |||
1409 | (dHistMap_Pulls[locPID])[dPullTypes[loc_j]]->Fill(locPull); | |||
1410 | (dHistMap_PullsVsP[locPID])[dPullTypes[loc_j]]->Fill(locThrownP, locPull); | |||
1411 | (dHistMap_PullsVsTheta[locPID])[dPullTypes[loc_j]]->Fill(locThrownTheta, locPull); | |||
1412 | } | |||
1413 | } | |||
1414 | Unlock_Action(); | |||
1415 | } | |||
1416 | ||||
1417 | //neutral particles | |||
1418 | map<const DMCThrown*, pair<const DNeutralParticle*, double> > locThrownToNeutralMap; | |||
1419 | locMCThrownMatching->Get_ThrownToNeutralMap(locThrownToNeutralMap); | |||
1420 | map<const DMCThrown*, pair<const DNeutralParticle*, double> >::iterator locNeutralIterator = locThrownToNeutralMap.begin(); | |||
1421 | for(; locNeutralIterator != locThrownToNeutralMap.end(); ++locNeutralIterator) | |||
1422 | { | |||
1423 | const DMCThrown* locMCThrown = locNeutralIterator->first; | |||
1424 | locPID = (Particle_t)locMCThrown->type; | |||
1425 | if(dHistMap_DeltaPOverP.find(locPID) == dHistMap_DeltaPOverP.end()) | |||
1426 | continue; //e.g. not interested in histogramming | |||
1427 | ||||
1428 | double locMatchFOM = locNeutralIterator->second.second; | |||
1429 | const DNeutralParticleHypothesis* locNeutralParticleHypothesis = locNeutralIterator->second.first->Get_Hypothesis(locPID); | |||
1430 | if(locNeutralParticleHypothesis == NULL__null) | |||
1431 | locNeutralParticleHypothesis = locNeutralIterator->second.first->Get_BestFOM(); | |||
1432 | ||||
1433 | const DNeutralShower* locNeutralShower = locNeutralParticleHypothesis->Get_NeutralShower(); | |||
1434 | ||||
1435 | locThrownP = locMCThrown->momentum().Mag(); | |||
1436 | locThrownTheta = locMCThrown->momentum().Theta()*180.0/TMath::Pi(); | |||
1437 | locDeltaPOverP = (locNeutralParticleHypothesis->momentum().Mag() - locThrownP)/locThrownP; | |||
1438 | locDeltaTheta = locNeutralParticleHypothesis->momentum().Theta()*180.0/TMath::Pi() - locThrownTheta; | |||
1439 | locDeltaPhi = locNeutralParticleHypothesis->momentum().Phi()*180.0/TMath::Pi() - locMCThrown->momentum().Phi()*180.0/TMath::Pi(); | |||
1440 | locDeltaT = locNeutralParticleHypothesis->time() - locMCThrown->time(); //time comparison isn't fair if track comes from a detached vertex!!! | |||
1441 | locDeltaVertexZ = locNeutralParticleHypothesis->position().Z() - locMCThrown->position().Z(); | |||
1442 | const TMatrixDSym& locCovarianceMatrix = *(locNeutralParticleHypothesis->errorMatrix().get()); | |||
1443 | ||||
1444 | double locStartTime = locThrownEventRFBunch->dTime + (locMCThrown->z() - dTargetZCenter)/29.9792458; | |||
1445 | double locTimePull = (locStartTime - locNeutralParticleHypothesis->time())/sqrt(locCovarianceMatrix(6, 6)); | |||
1446 | ||||
1447 | //FILL HISTOGRAMS | |||
1448 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
1449 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
1450 | Lock_Action(); | |||
1451 | { | |||
1452 | dHistMap_MatchFOM[locPID]->Fill(locMatchFOM); | |||
1453 | dHistMap_DeltaPOverP[locPID]->Fill(locDeltaPOverP); | |||
1454 | dHistMap_DeltaTheta[locPID]->Fill(locDeltaTheta); | |||
1455 | dHistMap_DeltaPhi[locPID]->Fill(locDeltaPhi); | |||
1456 | dHistMap_DeltaT[locPID]->Fill(locDeltaT); | |||
1457 | if(locNeutralParticleHypothesis->t1_detector() == SYS_BCAL) | |||
1458 | { | |||
1459 | dHistMap_DeltaT_BCAL[locPID]->Fill(locDeltaT); | |||
1460 | dHistMap_TimePull_BCAL[locPID]->Fill(locTimePull); | |||
1461 | dHistMap_TimePullVsTheta_BCAL[locPID]->Fill(locThrownTheta, locTimePull); | |||
1462 | dHistMap_TimePullVsP_BCAL[locPID]->Fill(locThrownP, locTimePull); | |||
1463 | } | |||
1464 | else if(locNeutralParticleHypothesis->t1_detector() == SYS_FCAL) | |||
1465 | { | |||
1466 | dHistMap_DeltaT_FCAL[locPID]->Fill(locDeltaT); | |||
1467 | dHistMap_TimePull_FCAL[locPID]->Fill(locTimePull); | |||
1468 | dHistMap_TimePullVsP_FCAL[locPID]->Fill(locThrownP, locTimePull); | |||
1469 | } | |||
1470 | ||||
1471 | dHistMap_DeltaVertexZ[locPID]->Fill(locDeltaVertexZ); | |||
1472 | dHistMap_DeltaPOverPVsP[locPID]->Fill(locThrownP, locDeltaPOverP); | |||
1473 | dHistMap_DeltaPOverPVsTheta[locPID]->Fill(locThrownTheta, locDeltaPOverP); | |||
1474 | dHistMap_DeltaThetaVsP[locPID]->Fill(locThrownP, locDeltaTheta); | |||
1475 | dHistMap_DeltaThetaVsTheta[locPID]->Fill(locThrownTheta, locDeltaTheta); | |||
1476 | dHistMap_DeltaPhiVsP[locPID]->Fill(locThrownP, locDeltaPhi); | |||
1477 | dHistMap_DeltaPhiVsTheta[locPID]->Fill(locThrownTheta, locDeltaPhi); | |||
1478 | dHistMap_DeltaTVsTheta[locPID]->Fill(locThrownTheta, locDeltaT); | |||
1479 | dHistMap_DeltaTVsP[locPID]->Fill(locThrownP, locDeltaT); | |||
1480 | dHistMap_DeltaVertexZVsTheta[locPID]->Fill(locThrownTheta, locDeltaVertexZ); | |||
1481 | if(locDeltaT >= 1.002) | |||
1482 | dHistMap_PVsTheta_LargeDeltaT[locPID]->Fill(locThrownTheta, locThrownP); | |||
1483 | ||||
1484 | for(size_t loc_j = 0; loc_j < dPullTypes.size(); ++loc_j) | |||
1485 | { | |||
1486 | if((dPullTypes[loc_j] >= d_PxPull) && (dPullTypes[loc_j] <= d_PzPull)) | |||
1487 | continue; | |||
1488 | double locPull = 0.0; | |||
1489 | if(dPullTypes[loc_j] == d_EPull) | |||
1490 | locPull = (locNeutralShower->dEnergy - locMCThrown->energy())/sqrt((*(locNeutralShower->dCovarianceMatrix))(0, 0)); | |||
1491 | else if((dPullTypes[loc_j] >= d_XxPull) && (dPullTypes[loc_j] <= d_XzPull)) | |||
1492 | { | |||
1493 | int locIndex = int(dPullTypes[loc_j] - d_XxPull); | |||
1494 | locPull = (locNeutralParticleHypothesis->position()(locIndex) - locMCThrown->position()(locIndex))/sqrt(locCovarianceMatrix(locIndex + 3, locIndex + 3)); | |||
1495 | } | |||
1496 | else if(dPullTypes[loc_j] == d_TPull) | |||
1497 | locPull = (locNeutralParticleHypothesis->time() - locMCThrown->time())/sqrt(locCovarianceMatrix(6, 6)); | |||
1498 | (dHistMap_Pulls[locPID])[dPullTypes[loc_j]]->Fill(locPull); | |||
1499 | (dHistMap_PullsVsP[locPID])[dPullTypes[loc_j]]->Fill(locThrownP, locPull); | |||
1500 | (dHistMap_PullsVsTheta[locPID])[dPullTypes[loc_j]]->Fill(locThrownTheta, locPull); | |||
1501 | } | |||
1502 | ||||
1503 | } | |||
1504 | Unlock_Action(); | |||
1505 | } | |||
1506 | return true; | |||
1507 | } | |||
1508 | ||||
1509 | void DHistogramAction_TruePID::Initialize(JEventLoop* locEventLoop) | |||
1510 | { | |||
1511 | string locStepName, locStepROOTName, locHistTitle, locHistName, locParticleName, locParticleROOTName; | |||
1512 | ||||
1513 | size_t locNumSteps = Get_Reaction()->Get_NumReactionSteps(); | |||
1514 | dHistDeque_P_CorrectID.resize(locNumSteps); | |||
1515 | dHistDeque_P_IncorrectID.resize(locNumSteps); | |||
1516 | dHistDeque_PVsTheta_CorrectID.resize(locNumSteps); | |||
1517 | dHistDeque_PVsTheta_IncorrectID.resize(locNumSteps); | |||
1518 | ||||
1519 | Run_Update(locEventLoop); | |||
1520 | ||||
1521 | //CREATE THE HISTOGRAMS | |||
1522 | //Since we are creating histograms, the contents of gDirectory will be modified: must use JANA-wide ROOT lock | |||
1523 | japp->RootWriteLock(); //ACQUIRE ROOT LOCK!! | |||
1524 | { | |||
1525 | CreateAndChangeTo_ActionDirectory(); | |||
1526 | ||||
1527 | for(size_t loc_i = 0; loc_i < locNumSteps; ++loc_i) | |||
1528 | { | |||
1529 | auto locDetectedPIDs = Get_Reaction()->Get_FinalPIDs(loc_i, false, false, d_AllCharges, false); | |||
1530 | if(locDetectedPIDs.empty()) | |||
1531 | continue; | |||
1532 | ||||
1533 | const DReactionStep* locReactionStep = Get_Reaction()->Get_ReactionStep(loc_i); | |||
1534 | locStepName = DAnalysis::Get_StepName(locReactionStep, true, false); | |||
1535 | locStepROOTName = DAnalysis::Get_StepName(locReactionStep, true, true); | |||
1536 | CreateAndChangeTo_Directory(locStepName, locStepName); | |||
1537 | ||||
1538 | for(auto locPID : locDetectedPIDs) | |||
1539 | { | |||
1540 | locParticleName = ParticleType(locPID); | |||
1541 | locParticleROOTName = ParticleName_ROOT(locPID); | |||
1542 | ||||
1543 | if(dHistDeque_P_CorrectID[loc_i].find(locPID) != dHistDeque_P_CorrectID[loc_i].end()) | |||
1544 | continue; //hists already created for this pid | |||
1545 | ||||
1546 | //P of Correct ID | |||
1547 | locHistName = string("Momentum_CorrectID_") + locParticleName; | |||
1548 | locHistTitle = string("Correct ") + locParticleROOTName + string(" ID, ") + locStepROOTName + string(";p (GeV/c)"); | |||
1549 | dHistDeque_P_CorrectID[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPBins, dMinP, dMaxP); | |||
1550 | ||||
1551 | //P of Incorrect ID | |||
1552 | locHistName = string("Momentum_IncorrectID_") + locParticleName; | |||
1553 | locHistTitle = string("Incorrect ") + locParticleROOTName + string(" ID, ") + locStepROOTName + string(";p (GeV/c)"); | |||
1554 | dHistDeque_P_IncorrectID[loc_i][locPID] = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, dNumPBins, dMinP, dMaxP); | |||
1555 | ||||
1556 | //P Vs Theta of Correct ID | |||
1557 | locHistName = string("PVsTheta_CorrectID_") + locParticleName; | |||
1558 | locHistTitle = string("Correct ") + locParticleROOTName + string(" ID, ") + locStepROOTName + string(";#theta#circ;p (GeV/c)"); | |||
1559 | dHistDeque_PVsTheta_CorrectID[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNumThetaBins, dMinTheta, dMaxTheta, dNum2DPBins, dMinP, dMaxP); | |||
1560 | ||||
1561 | //P Vs Theta of Incorrect ID | |||
1562 | locHistName = string("PVsTheta_IncorrectID_") + locParticleName; | |||
1563 | locHistTitle = string("Incorrect ") + locParticleROOTName + string(" ID, ") + locStepROOTName + string(";#theta#circ;p (GeV/c)"); | |||
1564 | dHistDeque_PVsTheta_IncorrectID[loc_i][locPID] = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNumThetaBins, dMinTheta, dMaxTheta, dNum2DPBins, dMinP, dMaxP); | |||
1565 | } | |||
1566 | gDirectory(ROOT::Internal::TDirectoryAtomicAdapter(TDirectory::CurrentDirectory ()))->cd(".."); | |||
1567 | } //end of step loop | |||
1568 | ||||
1569 | //# Combos Pass/Fail All True PID | |||
1570 | locHistName = "Combo_TruePIDStatus"; | |||
1571 | locHistTitle = Get_Reaction()->Get_ReactionName() + string(";# Combos;All Combo Particles True PID Status"); | |||
1572 | dHist_TruePIDStatus = GetOrCreate_Histogram<TH1I>(locHistName, locHistTitle, 2, -0.5, 1.5); | |||
1573 | ||||
1574 | //Return to the base directory | |||
1575 | ChangeTo_BaseDirectory(); | |||
1576 | } | |||
1577 | japp->RootUnLock(); //RELEASE ROOT LOCK!! | |||
1578 | } | |||
1579 | ||||
1580 | void DHistogramAction_TruePID::Run_Update(JEventLoop* locEventLoop) | |||
1581 | { | |||
1582 | const DAnalysisUtilities* locAnalysisUtilities = NULL__null; | |||
1583 | locEventLoop->GetSingle(locAnalysisUtilities); | |||
1584 | dAnalysisUtilities = locAnalysisUtilities; | |||
1585 | } | |||
1586 | ||||
1587 | bool DHistogramAction_TruePID::Perform_Action(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo) | |||
1588 | { | |||
1589 | vector<const DMCThrownMatching*> locMCThrownMatchingVector; | |||
1590 | locEventLoop->Get(locMCThrownMatchingVector); | |||
1591 | if(locMCThrownMatchingVector.empty()) | |||
1592 | return true; | |||
1593 | const DMCThrownMatching* locMCThrownMatching = locMCThrownMatchingVector[0]; | |||
1594 | double locP, locTheta; | |||
1595 | const DMCThrown* locMCThrown; | |||
1596 | Particle_t locPID; | |||
1597 | ||||
1598 | int locComboTruePIDStatus = 1; | |||
1599 | for(size_t loc_i = 0; loc_i < locParticleCombo->Get_NumParticleComboSteps(); ++loc_i) | |||
1600 | { | |||
1601 | const DParticleComboStep* locParticleComboStep = locParticleCombo->Get_ParticleComboStep(loc_i); | |||
1602 | auto locParticles = locParticleComboStep->Get_FinalParticles_Measured(Get_Reaction()->Get_ReactionStep(loc_i)); | |||
1603 | for(size_t loc_j = 0; loc_j < locParticles.size(); ++loc_j) | |||
1604 | { | |||
1605 | locPID = locParticles[loc_j]->PID(); | |||
1606 | ||||
1607 | double locMatchFOM = 0.0; | |||
1608 | if(ParticleCharge(locPID) == 0) | |||
1609 | locMCThrown = locMCThrownMatching->Get_MatchingMCThrown(static_cast<const DNeutralParticleHypothesis*>(locParticles[loc_j]), locMatchFOM); | |||
1610 | else | |||
1611 | locMCThrown = locMCThrownMatching->Get_MatchingMCThrown(static_cast<const DChargedTrackHypothesis*>(locParticles[loc_j]), locMatchFOM); | |||
1612 | ||||
1613 | bool locCutResult = (locMCThrown == NULL__null) ? false : (((Particle_t)locMCThrown->type) == locPID); | |||
1614 | if(!locCutResult) | |||
1615 | locComboTruePIDStatus = 0; | |||
1616 | ||||
1617 | //check if duplicate | |||
1618 | const JObject* locSourceObject = Get_FinalParticle_SourceObject(locParticles[loc_j]); | |||
1619 | pair<Particle_t, const JObject*> locParticleInfo(locParticles[loc_j]->PID(), locSourceObject); | |||
1620 | pair<size_t, pair<Particle_t, const JObject*> > locHistInfo(loc_i, locParticleInfo); | |||
1621 | if(dPreviouslyHistogrammedParticles.find(locHistInfo) != dPreviouslyHistogrammedParticles.end()) | |||
1622 | continue; //previously histogrammed | |||
1623 | dPreviouslyHistogrammedParticles.insert(locHistInfo); | |||
1624 | ||||
1625 | locP = locParticles[loc_j]->momentum().Mag(); | |||
1626 | locTheta = locParticles[loc_j]->momentum().Theta()*180.0/TMath::Pi(); | |||
1627 | ||||
1628 | //FILL HISTOGRAMS | |||
1629 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
1630 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
1631 | Lock_Action(); | |||
1632 | { | |||
1633 | if(locCutResult) | |||
1634 | { | |||
1635 | dHistDeque_P_CorrectID[loc_i][locPID]->Fill(locP); | |||
1636 | dHistDeque_PVsTheta_CorrectID[loc_i][locPID]->Fill(locTheta, locP); | |||
1637 | } | |||
1638 | else | |||
1639 | { | |||
1640 | dHistDeque_P_IncorrectID[loc_i][locPID]->Fill(locP); | |||
1641 | dHistDeque_PVsTheta_IncorrectID[loc_i][locPID]->Fill(locTheta, locP); | |||
1642 | } | |||
1643 | } | |||
1644 | Unlock_Action(); | |||
1645 | } | |||
1646 | } | |||
1647 | ||||
1648 | //FILL HISTOGRAMS | |||
1649 | //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock | |||
1650 | //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex | |||
1651 | Lock_Action(); | |||
1652 | { | |||
1653 | dHist_TruePIDStatus->Fill(locComboTruePIDStatus); | |||
1654 | } | |||
1655 | Unlock_Action(); | |||
1656 | ||||
1657 | return true; | |||
1658 | } | |||
1659 |