Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DReaction_factory_trackeff_missing.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DReaction_factory_trackeff_missing.cc
4 // Created: Wed Feb 25 08:58:19 EST 2015
5 // Creator: pmatt (on Linux pmattdesktop.jlab.org 2.6.32-504.8.1.el6.x86_64 x86_64)
6 //
7 
11 
12 //------------------
13 // evnt
14 //------------------
15 jerror_t DReaction_factory_trackeff_missing::evnt(JEventLoop* locEventLoop, uint64_t locEventNumber)
16 {
17  //INIT
18  dSourceComboP4Handler = new DSourceComboP4Handler(nullptr, false);
19  dSourceComboTimeHandler = new DSourceComboTimeHandler(nullptr, nullptr, nullptr);
20 
21  // DOCUMENTATION:
22  // ANALYSIS library: https://halldweb1.jlab.org/wiki/index.php/GlueX_Analysis_Software
23  // DReaction factory: https://halldweb1.jlab.org/wiki/index.php/Analysis_DReaction
24 
25  // DEFINE CHANNELS:
26  vector<DReaction*> locReactions;
27 
28  /**************************************************** Reactions ****************************************************/
29 
30  //g, p -> pi+, pi-, (p)
31  auto locReaction = new DReaction("TrackEff_MissingProton");
32  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiMinus}, Proton));
33  locReactions.push_back(locReaction);
34 
35  //g, p -> pi+, p, (pi-)
36  locReaction = new DReaction("TrackEff_MissingPiMinus");
37  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, Proton}, PiMinus));
38  locReactions.push_back(locReaction);
39 
40  //g, p -> pi-, p, (pi+)
41  locReaction = new DReaction("TrackEff_MissingPiPlus");
42  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiMinus, Proton}, PiPlus));
43  locReactions.push_back(locReaction);
44 
45  //Example: g, p -> 2pi+, 2pi-, (p)
46  locReaction = new DReaction("TrackEff_MissingProton_4pi");
47  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiPlus, PiMinus, PiMinus}, Proton));
48  locReactions.push_back(locReaction);
49 
50  //Example: g, p -> pi+, (pi+), 2pi-, p
51  locReaction = new DReaction("TrackEff_MissingPiPlus_4pi");
52  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiMinus, PiMinus, Proton}, PiPlus));
53  locReactions.push_back(locReaction);
54 
55  //g, p -> 2pi+, pi-, (pi-) p
56  locReaction = new DReaction("TrackEff_MissingPiMinus_4pi");
57  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {PiPlus, PiPlus, PiMinus, Proton}, PiMinus));
58  locReactions.push_back(locReaction);
59 /*
60  //g, p -> omega, p
61  //FYI: omega (3pi) with missing proton is hopeless
62  locReaction = new DReaction("TrackEff_MissingPiMinus_3pi");
63  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {omega, Proton}));
64  locReaction->Add_ReactionStep(new DReactionStep(omega, {PiPlus, Pi0}, PiMinus));
65  locReaction->Add_ReactionStep(new DReactionStep(Pi0, {Gamma, Gamma}));
66  locReactions.push_back(locReaction);
67 
68  //g, p -> omega, p
69  locReaction = new DReaction("TrackEff_MissingPiPlus_3pi");
70  locReaction->Add_ReactionStep(new DReactionStep(Gamma, Proton, {omega, Proton}));
71  locReaction->Add_ReactionStep(new DReactionStep(omega, {PiMinus, Pi0}, PiPlus));
72  locReaction->Add_ReactionStep(new DReactionStep(Pi0, {Gamma, Gamma}));
73  locReactions.push_back(locReaction);
74 */
75  //Loop over reactions and do setup
76  for(auto& locReaction : locReactions)
77  {
78  /**************************************************** Control Settings ****************************************************/
79 
80  locReaction->Set_KinFitType(d_P4AndVertexFit); //d_P4AndVertexFit //No vertex: can't cut on kinfit conlev anyway, but could distort if alignment is bad
81  locReaction->Set_KinFitUpdateCovarianceMatricesFlag(true);
82 
83  // Highly Recommended: When generating particle combinations, reject all beam photons that match to a different RF bunch
84  locReaction->Set_NumPlusMinusRFBunches(1); // +/- 1 bunch for sideband subtraction
85 
86  /**************************************************** Analysis Actions ****************************************************/
87 
88  //Cut Pi0 tighter (if present)
89 // locReaction->Add_AnalysisAction(new DCutAction_InvariantMass(locReaction, Pi0, 0.12, 0.15));
90 
91  //TRACK PURITY
92  locReaction->Add_AnalysisAction(new DCutAction_MinTrackHits(locReaction, 12));
93 
94  //FURTHER PID
95  locReaction->Add_AnalysisAction(new DCutAction_TrackFCALShowerEOverP(locReaction, false, 0.5)); //false: measured data //value: cut e+/e- below this, tracks above this
96  locReaction->Add_AnalysisAction(new DCutAction_EachPIDFOM(locReaction, -9.9E9, true)); //cut particles with PID FOM = NaN
97 
98  // HISTOGRAM MASSES
99  Add_MassHistograms(locReaction, false, "PreKinFit"); //false: measured
100 
101  // SHOWER BACKGROUND
102  // IT's TOO DANGEROUS TO CUT ON EXTRA SHOWERS:
103  // IF THE TRACK WAS NOT RECONSTRUCTED, IT'S SHOWER IS "EXTRA"!!!! MAY BIAS EFFICIENCY
104 // locReaction->Add_AnalysisAction(new DCustomAction_CutExtraShowers(locReaction, 0.5));
105 
106  // KINEMATIC FIT
107  locReaction->Add_AnalysisAction(new DHistogramAction_KinFitResults(locReaction, 0.05, true)); //5% confidence level cut on pull histograms only //true: hist 2d dependence
108 
109  //POST-KINFIT PID CUTS
110  Add_PostKinfitTimingCuts(locReaction);
111 
112  // KINFIT MASS CUTS
113  Add_MassHistograms(locReaction, false, "PostKinFit"); //false: measured
114  Add_MassHistograms(locReaction, true, "PostKinFit_KinFit"); //true: kinfit
115 
116  // KINEMATICS
117  locReaction->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction, true, "PreDetectorHitCut")); //true: fill histograms with kinematic-fit particle data
118 
119  // DETECTOR HIT MATCHING MISSING TRACK TRAJECTORY
120  string locReactionName = locReaction->Get_ReactionName();
121 // if((locReactionName != "TrackEff_MissingPiMinus_3pi") && (locReactionName != "TrackEff_MissingPiPlus_3pi"))
122  {
123  locReaction->Add_AnalysisAction(new DCustomAction_CutNoDetectorHit(locReaction));
124  Add_MassHistograms(locReaction, false, "HasDetectorHit");
125  Add_MassHistograms(locReaction, true, "HasDetectorHit_KinFit");
126  }
127 
128  // KINEMATICS
129  locReaction->Add_AnalysisAction(new DHistogramAction_ParticleComboKinematics(locReaction, true)); //true: fill histograms with kinematic-fit particle data
130 
131  // Tracking Efficiency
132  locReaction->Add_AnalysisAction(new DCustomAction_TrackingEfficiency(locReaction, true));
133 
134  _data.push_back(locReaction); //Register the DReaction with the factory
135  }
136 
137  return NOERROR;
138 }
139 
140 //------------------
141 // fini
142 //------------------
144 {
145  for(size_t loc_i = 0; loc_i < dReactionStepPool.size(); ++loc_i)
146  delete dReactionStepPool[loc_i]; //cleanup memory
147  return NOERROR;
148 }
149 
150 /************************************************************** ACTIONS AND CUTS **************************************************************/
151 
152 void DReaction_factory_trackeff_missing::Add_MassHistograms(DReaction* locReaction, bool locUseKinFitResultsFlag, string locBaseUniqueName)
153 {
154  auto locKinFitType = locReaction->Get_KinFitType();
155  auto locP4Fit = ((locKinFitType != d_NoFit) && (locKinFitType != d_VertexFit) && (locKinFitType != d_SpacetimeFit));
156  auto locNumMissingParticles = locReaction->Get_MissingPIDs().size();
157 
158  size_t locNumInclusiveSteps = 0;
159  for(auto locReactionStep : locReaction->Get_ReactionSteps())
160  {
161  if(locReactionStep->Get_IsInclusiveFlag())
162  ++locNumInclusiveSteps;
163  }
164 
165  //invariant mass
166  set<Particle_t> locDecayPIDsUsed;
167  for(size_t loc_i = 1; loc_i < locReaction->Get_NumReactionSteps(); ++loc_i)
168  {
169  //do missing mass squared hists for every decaying and missing particle
170  auto locReactionStep = locReaction->Get_ReactionStep(loc_i);
171 
172  if(locP4Fit && locUseKinFitResultsFlag && locReactionStep->Get_KinFitConstrainInitMassFlag())
173  continue;
174 
175  auto locDecayPID = locReactionStep->Get_InitialPID();
176  if(locDecayPIDsUsed.find(locDecayPID) != locDecayPIDsUsed.end())
177  continue; //already done!
178  if(DAnalysis::Check_IfMissingDecayProduct(locReaction, loc_i))
179  continue;
180 
181  Create_InvariantMassHistogram(locReaction, locDecayPID, locUseKinFitResultsFlag, locBaseUniqueName);
182  locDecayPIDsUsed.insert(locDecayPID);
183  }
184 
185  //missing mass
186  for(size_t loc_i = 0; loc_i < locReaction->Get_NumReactionSteps(); ++loc_i)
187  {
188  auto locReactionStep = locReaction->Get_ReactionStep(loc_i);
189  set<Particle_t> locMissingDecayPIDsUsed;
190  for(size_t loc_j = 0; loc_j < locReactionStep->Get_NumFinalPIDs(); ++loc_j)
191  {
192  auto locPID = locReactionStep->Get_FinalPID(loc_j);
193 //cout << "i, j, pid, missing index: " << loc_i << ", " << loc_j << ", " << locPID << ", " << locReactionStep->Get_MissingParticleIndex() << endl;
194  if(locMissingDecayPIDsUsed.find(locPID) != locMissingDecayPIDsUsed.end())
195  continue;
196 
197  //check if missing particle
198  if(int(loc_j) == locReactionStep->Get_MissingParticleIndex())
199  {
200  if((locNumMissingParticles > 1) || (locNumInclusiveSteps > 0))
201  continue;
202  if(locUseKinFitResultsFlag && locP4Fit)
203  continue; //mass is constrained, will be a spike
204  Create_MissingMassSquaredHistogram(locReaction, locPID, locUseKinFitResultsFlag, locBaseUniqueName, 0, {});
205  }
206 
207  //check if decaying particle
208  auto locDecayStepIndex = DAnalysis::Get_DecayStepIndex(locReaction, loc_i, loc_j);
209 //cout << "decay step index: " << locDecayStepIndex << endl;
210  if(locDecayStepIndex <= 0)
211  continue; //nope
212 
213  //nothing can be missing anywhere, except in it's decay products
214  auto locMissingDecayProducts = DAnalysis::Get_MissingDecayProductIndices(locReaction, locDecayStepIndex);
215 //cout << "num missing total/decay: " << locNumMissingParticles << ", " << locMissingDecayProducts.size() << endl;
216  if((locNumMissingParticles - locMissingDecayProducts.size()) > 0)
217  continue; //nope
218 
219  //check inclusives, same thing
220  size_t locNumInclusiveDecayProductSteps = 0;
221  for(auto& locParticlePair : locMissingDecayProducts)
222  {
223  if(locParticlePair.second == DReactionStep::Get_ParticleIndex_Inclusive())
224  ++locNumInclusiveDecayProductSteps;
225  }
226 //cout << "num inclusives total/decay: " << locNumInclusiveSteps << ", " << locNumInclusiveDecayProductSteps << endl;
227  if((locNumInclusiveSteps - locNumInclusiveDecayProductSteps) > 0)
228  continue; //nope
229 
230 //cout << "p4 fit, use kinfit, constrain flag: " << locP4Fit << ", " << locUseKinFitResultsFlag << ", " << locReaction->Get_ReactionStep(locDecayStepIndex)->Get_KinFitConstrainInitMassFlag() << endl;
231  if(locP4Fit && locUseKinFitResultsFlag && locReaction->Get_ReactionStep(locDecayStepIndex)->Get_KinFitConstrainInitMassFlag())
232  continue; //constrained, will be a spike
233 
234  auto locFinalPIDs = locReactionStep->Get_FinalPIDs();
235  locFinalPIDs.erase(locFinalPIDs.begin() + loc_j);
236  deque<Particle_t> locMissingMassOffOfPIDs(locFinalPIDs.begin(), locFinalPIDs.end());
237  Create_MissingMassSquaredHistogram(locReaction, locPID, locUseKinFitResultsFlag, locBaseUniqueName, loc_i, locMissingMassOffOfPIDs);
238 
239  locMissingDecayPIDsUsed.insert(locPID);
240  }
241  }
242 
243  //if nothing missing, overall missing mass squared
244  if((locNumMissingParticles == 0) && (locNumInclusiveSteps == 0) && (!locUseKinFitResultsFlag || !locP4Fit))
245  Create_MissingMassSquaredHistogram(locReaction, Unknown, locUseKinFitResultsFlag, locBaseUniqueName, 0, {});
246 }
247 
249 {
250  locReaction->Add_AnalysisAction(new DHistogramAction_PID(locReaction, true));
251 
252  //Get, loop over detected PIDs in reaction
253  //Will have little effect except for on particles at detached vertices
254  auto locFinalPIDs = locReaction->Get_FinalPIDs(-1, false, false, d_AllCharges, false);
255  for(auto locPID : locFinalPIDs)
256  {
257  //Add timing cuts //false: measured data
258  auto locTimeCuts = dSourceComboTimeHandler->Get_TimeCuts(locPID);
259  for(auto& locSystemPair : locTimeCuts)
260  locReaction->Add_AnalysisAction(new DCutAction_PIDDeltaT(locReaction, true, locSystemPair.second->Eval(12.0), locPID, locSystemPair.first)); //true: kinfit results
261  }
262 }
263 
264 void DReaction_factory_trackeff_missing::Create_InvariantMassHistogram(DReaction* locReaction, Particle_t locPID, bool locUseKinFitResultsFlag, string locBaseUniqueName)
265 {
266  pair<float, float> locCutPair;
267  if(!dSourceComboP4Handler->Get_InvariantMassCuts(locPID, locCutPair))
268  return;
269 
270  //determine #bins
271  int locNumBins = int((locCutPair.second - locCutPair.first)*1000.0 + 0.001);
272  if(locNumBins < 200)
273  locNumBins *= 5; //get close to 1000 bins
274  if(locNumBins < 500)
275  locNumBins *= 2; //get close to 1000 bins
276 
277  //build name string
278  string locActionUniqueName = string(ParticleType(locPID)) + string("_") + locBaseUniqueName;
279 
280  //add histogram action
281  locReaction->Add_AnalysisAction(new DHistogramAction_InvariantMass(locReaction, locPID, locUseKinFitResultsFlag, locNumBins, locCutPair.first, locCutPair.second, locActionUniqueName));
282 }
283 
284 void DReaction_factory_trackeff_missing::Create_MissingMassSquaredHistogram(DReaction* locReaction, Particle_t locPID, bool locUseKinFitResultsFlag, string locBaseUniqueName, int locMissingMassOffOfStepIndex, const deque<Particle_t>& locMissingMassOffOfPIDs)
285 {
286  pair<TF1*, TF1*> locFuncPair;
287  if(!dSourceComboP4Handler->Get_MissingMassSquaredCuts(locPID, locFuncPair))
288  return;
289  auto locCutPair = std::make_pair(locFuncPair.first->Eval(12.0), locFuncPair.second->Eval(12.0)); //where it's likely widest
290 
291  //determine #bins
292  int locNumBins = int((locCutPair.second - locCutPair.first)*1000.0 + 0.001);
293  if(locNumBins < 200)
294  locNumBins *= 5; //get close to 1000 bins
295  if(locNumBins < 500)
296  locNumBins *= 2; //get close to 1000 bins
297 
298  //build name string
299  ostringstream locActionUniqueNameStream;
300  if((locPID == Unknown) && (locMissingMassOffOfStepIndex == 0))
301  locActionUniqueNameStream << locBaseUniqueName;
302  else if(locMissingMassOffOfStepIndex == 0)
303  locActionUniqueNameStream << ParticleType(locPID) << "_" << locBaseUniqueName;
304  else if(locPID == Unknown)
305  locActionUniqueNameStream << "Step" << locMissingMassOffOfStepIndex << "_" << locBaseUniqueName;
306  else
307  locActionUniqueNameStream << ParticleType(locPID) << "_Step" << locMissingMassOffOfStepIndex << "_" << locBaseUniqueName;
308 
309  if(dDebugFlag)
310  {
311  cout << "create miss mass squared action: off step index, kinfit flag, off pids: " << locMissingMassOffOfStepIndex << ", " << locUseKinFitResultsFlag;
312  for(auto& locPID : locMissingMassOffOfPIDs)
313  cout << ", " << locPID;
314  cout << endl;
315  }
316  //add histogram action
317  locReaction->Add_AnalysisAction(new DHistogramAction_MissingMassSquared(locReaction, locMissingMassOffOfStepIndex, locMissingMassOffOfPIDs, locUseKinFitResultsFlag, locNumBins, locCutPair.first, locCutPair.second, locActionUniqueNameStream.str()));
318 }
319 
bool Get_InvariantMassCuts(Particle_t locPID, pair< float, float > &locMinMaxCuts_GeV) const
DKinFitType Get_KinFitType(void) const
Definition: DReaction.h:79
void Add_MassHistograms(DReaction *locReaction, bool locUseKinFitResultsFlag, string locBaseUniqueName="")
bool Get_MissingMassSquaredCuts(Particle_t locPID, pair< TF1 *, TF1 * > &locMinMaxCuts_GeVSq) const
bool Get_KinFitConstrainInitMassFlag(void) const
Definition: DReactionStep.h:97
char string[256]
static char * ParticleType(Particle_t p)
Definition: particleType.h:142
bool Check_IfMissingDecayProduct(const DReaction *locReaction, size_t locStepIndex)
Definition: DReaction.h:259
vector< Particle_t > Get_FinalPIDs(int locStepIndex=-1, bool locIncludeMissingFlag=true, bool locIncludeDecayingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
Definition: DReaction.cc:17
vector< pair< int, int > > Get_MissingDecayProductIndices(const DReaction *locReaction, size_t locStepIndex)
Definition: DReaction.h:239
jerror_t evnt(JEventLoop *locEventLoop, uint64_t locEventNumber)
Particle_t Get_InitialPID(void) const
Definition: DReactionStep.h:81
map< DetectorSystem_t, TF1 * > Get_TimeCuts(Particle_t locPID) const
void Create_InvariantMassHistogram(DReaction *locReaction, Particle_t locPID, bool locUseKinFitResultsFlag, string locBaseUniqueName)
Particle_t Get_FinalPID(size_t locIndex) const
Definition: DReactionStep.h:87
jerror_t fini(void)
Called after last event of last event source has been processed.
vector< Particle_t > Get_MissingPIDs(int locStepIndex=-1, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
Definition: DReaction.cc:46
const DReactionStep * Get_ReactionStep(size_t locStepIndex) const
Definition: DReaction.h:84
int Get_DecayStepIndex(const DReaction *locReaction, size_t locStepIndex, size_t locParticleIndex)
Definition: DReaction.cc:135
void Add_AnalysisAction(DAnalysisAction *locAnalysisAction)
Definition: DReaction.h:50
vector< const DReactionStep * > Get_ReactionSteps(void) const
Definition: DReaction.h:85
size_t Get_NumReactionSteps(void) const
Definition: DReaction.h:83
void Create_MissingMassSquaredHistogram(DReaction *locReaction, Particle_t locPID, bool locUseKinFitResultsFlag, string locBaseUniqueName, int locMissingMassOffOfStepIndex, const deque< Particle_t > &locMissingMassOffOfPIDs)
Particle_t
Definition: particleType.h:12