Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DAnalysisResults_factory.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DAnalysisResults_factory.cc
4 // Created: Tue Aug 9 14:29:24 EST 2011
5 // Creator: pmatt (on Linux ifarml6 2.6.18-128.el5 x86_64)
6 //
7 
8 #ifdef VTRACE
9 #include "vt_user.h"
10 #endif
11 
13 
14 //------------------
15 // init
16 //------------------
18 {
19  dDebugLevel = 0;
20  dMinThrownMatchFOM = 5.73303E-7;
21  dResourcePool_KinFitResults.Set_ControlParams(100, 20, 300, 500, 0);
22 
23  return NOERROR;
24 }
25 
26 //------------------
27 // brun
28 //------------------
29 jerror_t DAnalysisResults_factory::brun(JEventLoop *locEventLoop, int32_t runnumber)
30 {
31  dApplication = dynamic_cast<DApplication*>(locEventLoop->GetJApplication());
32 
33  gPARMS->SetDefaultParameter("ANALYSIS:DEBUG_LEVEL", dDebugLevel);
34  gPARMS->SetDefaultParameter("ANALYSIS:KINFIT_CONVERGENCE", dRequireKinFitConvergence);
35 
36  auto locReactions = DAnalysis::Get_Reactions(locEventLoop);
37  Check_ReactionNames(locReactions);
38 
39  vector<const DMCThrown*> locMCThrowns;
40  locEventLoop->Get(locMCThrowns);
41 
42  //MAKE CONTROL HISTOGRAMS
43  dIsMCFlag = !locMCThrowns.empty();
44  Make_ControlHistograms(locReactions);
45 
46  //Loop over reactions
47  for(size_t loc_i = 0; loc_i < locReactions.size(); ++loc_i)
48  {
49  const DReaction* locReaction = locReactions[loc_i];
50  //Initialize actions: creates any histograms/trees associated with the action
51  auto locActions = locReaction->Get_AnalysisActions();
52  size_t locNumActions = locReaction->Get_NumAnalysisActions();
53  for(size_t loc_j = 0; loc_j < locNumActions; ++loc_j)
54  {
55  DAnalysisAction* locAnalysisAction = locActions[loc_j];
56  if(dDebugLevel > 0)
57  cout << "Initialize Action # " << loc_j + 1 << ": " << locAnalysisAction->Get_ActionName() << " of reaction: " << locReaction->Get_ReactionName() << endl;
58  locAnalysisAction->Initialize(locEventLoop);
59  }
60 
61  if(locMCThrowns.empty())
62  continue;
63 
64  //MC: auto-detect whether the DReaction is expected to be the entire reaction or a subset
65  bool locExactMatchFlag = true;
66  if(DAnalysis::Get_IsFirstStepBeam(locReactions[loc_i]))
67  locExactMatchFlag = false;
68  else if(!locReactions[loc_i]->Get_MissingPIDs().empty())
69  locExactMatchFlag = false;
70 
71  dMCReactionExactMatchFlags[locReactions[loc_i]] = locExactMatchFlag;
72  dTrueComboCuts[locReactions[loc_i]] = new DCutAction_TrueCombo(locReactions[loc_i], dMinThrownMatchFOM, locExactMatchFlag);
73  dTrueComboCuts[locReactions[loc_i]]->Initialize(locEventLoop);
74  }
75 
76  //CREATE FIT UTILS AND FITTER
77  dKinFitUtils = new DKinFitUtils_GlueX(locEventLoop);
79 
80  gPARMS->SetDefaultParameter("KINFIT:DEBUG_LEVEL", dKinFitDebugLevel);
82 
83  //CREATE COMBOERS
84  dSourceComboer = new DSourceComboer(locEventLoop);
86 
87  return NOERROR;
88 }
89 
90 void DAnalysisResults_factory::Check_ReactionNames(vector<const DReaction*>& locReactions) const
91 {
92  set<string> locReactionNames;
93  set<string> locDuplicateReactionNames;
94  for(auto& locReaction : locReactions)
95  {
96  string locReactionName = locReaction->Get_ReactionName();
97  if(locReactionNames.find(locReactionName) == locReactionNames.end())
98  locReactionNames.insert(locReactionName);
99  else
100  locDuplicateReactionNames.insert(locReactionName);
101  }
102 
103  if(locDuplicateReactionNames.empty())
104  return;
105 
106  cout << "ERROR: MULTIPLE DREACTIONS WITH THE SAME NAME(S): " << endl;
107  for(auto& locReactionName : locDuplicateReactionNames)
108  cout << locReactionName << ", ";
109  cout << endl;
110  cout << "ABORTING" << endl;
111  abort();
112 }
113 
114 void DAnalysisResults_factory::Make_ControlHistograms(vector<const DReaction*>& locReactions)
115 {
116  string locHistName, locHistTitle;
117  TH1D* loc1DHist;
118  TH2D* loc2DHist;
119 
120  dApplication->RootWriteLock(); //to prevent undefined behavior due to directory changes, etc.
121  {
122  TDirectory* locCurrentDir = gDirectory;
123 
124  for(size_t loc_i = 0; loc_i < locReactions.size(); ++loc_i)
125  {
126  const DReaction* locReaction = locReactions[loc_i];
127  string locReactionName = locReaction->Get_ReactionName();
128  auto locActions = locReaction->Get_AnalysisActions();
129  auto locKinFitType = locReaction->Get_KinFitType();
130 
131  //Get names for histograms
132  vector<string> locActionNames;
133  bool locPreKinFitFlag = true;
134  for(auto& locAction : locActions)
135  {
136  if(locPreKinFitFlag && locAction->Get_UseKinFitResultsFlag() && (locKinFitType != d_NoFit))
137  {
138  locPreKinFitFlag = false;
139  locActionNames.push_back("KinFit Convergence");
140  }
141  locActionNames.push_back(locAction->Get_ActionName());
142  }
143  if(locPreKinFitFlag && (locKinFitType != d_NoFit))
144  locActionNames.push_back("KinFit Convergence");
145 
146  string locDirName = locReactionName;
147  string locDirTitle = locReactionName;
148  locCurrentDir->cd();
149 
150  TDirectoryFile* locDirectoryFile = static_cast<TDirectoryFile*>(locCurrentDir->GetDirectory(locDirName.c_str()));
151  if(locDirectoryFile == NULL)
152  locDirectoryFile = new TDirectoryFile(locDirName.c_str(), locDirTitle.c_str());
153  locDirectoryFile->cd();
154 
155  locHistName = "NumParticleCombos";
156  loc1DHist = static_cast<TH1D*>(locDirectoryFile->Get(locHistName.c_str()));
157  if(loc1DHist == NULL)
158  {
159  double* locBinArray = new double[55];
160  for(unsigned int loc_j = 0; loc_j < 6; ++loc_j)
161  {
162  for(unsigned int loc_k = 1; loc_k <= 9; ++loc_k)
163  locBinArray[loc_j*9 + loc_k - 1] = double(loc_k)*pow(10.0, double(loc_j));
164  }
165  locBinArray[54] = 1.0E6;
166  locHistTitle = locReactionName + string(";# Particle Combinations;# Events");
167  loc1DHist = new TH1D(locHistName.c_str(), locHistTitle.c_str(), 54, locBinArray);
168  delete[] locBinArray;
169  }
170  dHistMap_NumParticleCombos[locReaction] = loc1DHist;
171 
172  locHistName = "NumEventsSurvivedAction";
173  loc1DHist = static_cast<TH1D*>(locDirectoryFile->Get(locHistName.c_str()));
174  if(loc1DHist == NULL)
175  {
176  locHistTitle = locReactionName + string(";;# Events Survived Action");
177  loc1DHist = new TH1D(locHistName.c_str(), locHistTitle.c_str(), locActionNames.size() + 2, -0.5, locActionNames.size() + 2.0 - 0.5); //+2 for input & # tracks
178  loc1DHist->GetXaxis()->SetBinLabel(1, "Input"); // a new event
179  loc1DHist->GetXaxis()->SetBinLabel(2, "Has Particle Combos"); // at least one DParticleCombo object before any actions
180  for(size_t loc_j = 0; loc_j < locActionNames.size(); ++loc_j)
181  loc1DHist->GetXaxis()->SetBinLabel(3 + loc_j, locActionNames[loc_j].c_str());
182  }
183  dHistMap_NumEventsSurvivedAction_All[locReaction] = loc1DHist;
184 
185  if(dIsMCFlag)
186  {
187  locHistName = "NumEventsWhereTrueComboSurvivedAction";
188  loc1DHist = static_cast<TH1D*>(locDirectoryFile->Get(locHistName.c_str()));
189  if(loc1DHist == NULL)
190  {
191  locHistTitle = locReactionName + string(";;# Events Where True Combo Survived Action");
192  loc1DHist = new TH1D(locHistName.c_str(), locHistTitle.c_str(), locActionNames.size() + 1, -0.5, locActionNames.size() + 1.0 - 0.5); //+1 for # tracks
193  loc1DHist->GetXaxis()->SetBinLabel(1, "Has Particle Combos"); // at least one DParticleCombo object before any actions
194  for(size_t loc_j = 0; loc_j < locActionNames.size(); ++loc_j)
195  loc1DHist->GetXaxis()->SetBinLabel(2 + loc_j, locActionNames[loc_j].c_str());
196  }
197  dHistMap_NumEventsWhereTrueComboSurvivedAction[locReaction] = loc1DHist;
198  }
199 
200  locHistName = "NumCombosSurvivedAction";
201  loc2DHist = static_cast<TH2D*>(locDirectoryFile->Get(locHistName.c_str()));
202  if(loc2DHist == NULL)
203  {
204  double* locBinArray = new double[55];
205  for(unsigned int loc_j = 0; loc_j < 6; ++loc_j)
206  {
207  for(unsigned int loc_k = 1; loc_k <= 9; ++loc_k)
208  locBinArray[loc_j*9 + loc_k - 1] = double(loc_k)*pow(10.0, double(loc_j));
209  }
210  locBinArray[54] = 1.0E6;
211 
212  locHistTitle = locReactionName + string(";;# Particle Combos Survived Action");
213  loc2DHist = new TH2D(locHistName.c_str(), locHistTitle.c_str(), locActionNames.size() + 1, -0.5, locActionNames.size() + 1 - 0.5, 54, locBinArray); //+1 for # tracks
214  delete[] locBinArray;
215  loc2DHist->GetXaxis()->SetBinLabel(1, "Has Particle Combos"); // at least one DParticleCombo object before any actions
216  for(size_t loc_j = 0; loc_j < locActionNames.size(); ++loc_j)
217  loc2DHist->GetXaxis()->SetBinLabel(2 + loc_j, locActionNames[loc_j].c_str());
218  }
219  dHistMap_NumCombosSurvivedAction[locReaction] = loc2DHist;
220 
221  locHistName = "NumCombosSurvivedAction1D";
222  loc1DHist = static_cast<TH1D*>(locDirectoryFile->Get(locHistName.c_str()));
223  if(loc1DHist == NULL)
224  {
225  locHistTitle = locReactionName + string(";;# Particle Combos Survived Action");
226  loc1DHist = new TH1D(locHistName.c_str(), locHistTitle.c_str(), locActionNames.size() + 1, -0.5, locActionNames.size() + 1 - 0.5); //+1 for # tracks
227  loc1DHist->GetXaxis()->SetBinLabel(1, "Combos Constructed"); // at least one DParticleCombo object before any actions
228  for(size_t loc_j = 0; loc_j < locActionNames.size(); ++loc_j)
229  loc1DHist->GetXaxis()->SetBinLabel(2 + loc_j, locActionNames[loc_j].c_str());
230  }
231  dHistMap_NumCombosSurvivedAction1D[locReaction] = loc1DHist;
232 
233  locDirectoryFile->cd("..");
234  }
235  locCurrentDir->cd();
236  }
237  dApplication->RootUnLock(); //unlock
238 }
239 
240 //------------------
241 // evnt
242 //------------------
243 jerror_t DAnalysisResults_factory::evnt(JEventLoop* locEventLoop, uint64_t eventnumber)
244 {
245 #ifdef VTRACE
246  VT_TRACER("DAnalysisResults_factory::evnt()");
247 #endif
248 
249  if(dDebugLevel > 0)
250  cout << "Analyze event: " << eventnumber << endl;
251 
252  //CHECK TRIGGER TYPE
253  const DTrigger* locTrigger = NULL;
254  locEventLoop->GetSingle(locTrigger);
255  if(!locTrigger->Get_IsPhysicsEvent())
256  return NOERROR;
257 
258  //RESET
259  dSourceComboer->Reset_NewEvent(locEventLoop);
262  dConstraintResultsMap.clear();
263  dPreToPostKinFitComboMap.clear();
265  {
266  decltype(dCreatedKinFitResults)().swap(dCreatedKinFitResults); //should have been reset by recycler, but just in case
267  }
268 
269  auto locReactions = DAnalysis::Get_Reactions(locEventLoop);
270  if(dDebugLevel > 0)
271  cout << "# DReactions: " << locReactions.size() << endl;
272 
273  //GET VERTEX INFOS
274  vector<const DReactionVertexInfo*> locReactionVertexInfos;
275  locEventLoop->Get(locReactionVertexInfos);
276 
277  for(auto& locReactionVertexInfo : locReactionVertexInfos)
278  {
279  //BUILD COMBOS
280  if(dDebugLevel > 0)
281  cout << "Build combos for reaction: " << locReactionVertexInfo->Get_Reaction()->Get_ReactionName() << endl;
282  auto locReactionComboMap = dSourceComboer->Build_ParticleCombos(locReactionVertexInfo);
283 
284  //LOOP OVER REACTIONS
285  for(auto& locReactionComboPair : locReactionComboMap)
286  {
287  auto& locReaction = locReactionComboPair.first;
288  auto& locCombos = locReactionComboPair.second;
289 //if(!locCombos.empty())
290 //cout << endl << "Event, #combos: " << locEventLoop->GetJEvent().GetEventNumber() << ", " << locCombos.size() << endl << endl;
291 
292  //FIND TRUE COMBO (IF MC)
293  auto locTrueParticleCombo = Find_TrueCombo(locEventLoop, locReaction, locCombos);
294  int locLastActionTrueComboSurvives = (locTrueParticleCombo != nullptr) ? -1 : -2; //-1/-2: combo does/does-not exist
295 
296  //MAKE RESULTS OBJECT
297  auto locAnalysisResults = new DAnalysisResults();
298  locAnalysisResults->Set_Reaction(locReaction);
299 
300  //RESET ACTIONS
301  auto locActions = locReaction->Get_AnalysisActions();
302  for(auto& locAction : locActions)
303  locAction->Reset_NewEvent();
304 
305  if(dDebugLevel > 0)
306  cout << "Combos built, execute actions for reaction: " << locReaction->Get_ReactionName() << endl;
307 
308  //LOOP OVER COMBOS
309  auto locIsKinFit = (locReaction->Get_KinFitType() != d_NoFit);
310  auto locNumActionsForHist = locIsKinFit ? locActions.size() + 2 : locActions.size() + 1;
311  vector<size_t> locNumCombosSurvived(locNumActionsForHist, 0);
312  locNumCombosSurvived[0] = locCombos.size(); //first cut is "is there a combo"
313  for(auto& locCombo : locCombos)
314  {
315  //EXECUTE PRE-KINFIT ACTIONS
316  size_t locActionIndex = 0;
317  if(!Execute_Actions(locEventLoop, locIsKinFit, locCombo, locTrueParticleCombo, true, locActions, locActionIndex, locNumCombosSurvived, locLastActionTrueComboSurvives))
318  continue; //failed: go to the next combo
319 
320  //KINFIT IF REQUESTED
321  auto locPostKinFitCombo = Handle_ComboFit(locReactionVertexInfo, locCombo, locReaction);
322  if(locPostKinFitCombo == nullptr)
323  continue; //failed to converge
324  if(locIsKinFit)
325  ++(locNumCombosSurvived[locActionIndex + 1]);
326 
327  //EXECUTE POST-KINFIT ACTIONS
328  if(!Execute_Actions(locEventLoop, locIsKinFit, locPostKinFitCombo, locTrueParticleCombo, false, locActions, locActionIndex, locNumCombosSurvived, locLastActionTrueComboSurvives))
329  continue; //failed: go to the next combo
330 
331  //SAVE COMBO
332  locAnalysisResults->Add_PassedParticleCombo(locPostKinFitCombo);
333  }
334 
335  if(dDebugLevel > 0)
336  cout << "Action loop completed, # surviving combos: " << locAnalysisResults->Get_NumPassedParticleCombos() << endl;
337 
338  //FILL HISTOGRAMS
339  japp->WriteLock("DAnalysisResults");
340  {
341  dHistMap_NumEventsSurvivedAction_All[locReaction]->Fill(0); //initial: a new event
342  if(locNumCombosSurvived[0] > 0)
343  dHistMap_NumParticleCombos[locReaction]->Fill(locNumCombosSurvived[0]);
344  for(size_t loc_j = 0; loc_j < locNumCombosSurvived.size(); ++loc_j)
345  {
346  if(locNumCombosSurvived[loc_j] == 0)
347  break;
348  if(dHistMap_NumCombosSurvivedAction[locReaction]->GetYaxis()->FindBin(locNumCombosSurvived[loc_j]) <= dHistMap_NumCombosSurvivedAction[locReaction]->GetNbinsY())
349  dHistMap_NumCombosSurvivedAction[locReaction]->Fill(loc_j, locNumCombosSurvived[loc_j]);
350  if(locNumCombosSurvived[loc_j] > 0)
351  dHistMap_NumEventsSurvivedAction_All[locReaction]->Fill(loc_j + 1); //+1 because 0 is initial (no cuts at all)
352 
353  auto locBinContent = dHistMap_NumCombosSurvivedAction1D[locReaction]->GetBinContent(loc_j + 1) + locNumCombosSurvived[loc_j];
354  dHistMap_NumCombosSurvivedAction1D[locReaction]->SetBinContent(loc_j + 1, locBinContent);
355  }
356  if(dIsMCFlag)
357  {
358  for(int loc_j = -1; loc_j <= locLastActionTrueComboSurvives; ++loc_j) //-1/-2: combo does/does-not exist
359  dHistMap_NumEventsWhereTrueComboSurvivedAction[locReaction]->Fill(loc_j + 1);
360  }
361  }
362  japp->Unlock("DAnalysisResults");
363 
364  //SAVE ANALYSIS RESULTS
365  _data.push_back(locAnalysisResults);
366  }
367  }
368 
369  return NOERROR;
370 }
371 
372 bool DAnalysisResults_factory::Execute_Actions(JEventLoop* locEventLoop, bool locIsKinFit, const DParticleCombo* locCombo, const DParticleCombo* locTrueCombo, bool locPreKinFitFlag, const vector<DAnalysisAction*>& locActions, size_t& locActionIndex, vector<size_t>& locNumCombosSurvived, int& locLastActionTrueComboSurvives)
373 {
374  for(; locActionIndex < locActions.size(); ++locActionIndex)
375  {
376  auto locAction = locActions[locActionIndex];
377  if(locPreKinFitFlag && locAction->Get_UseKinFitResultsFlag())
378  return true; //need to kinfit first!!!
379  if(dDebugLevel >= 10)
380  cout << "Execute action " << locActionIndex << ": " << locAction->Get_ActionName() << endl;
381  if(!(*locAction)(locEventLoop, locCombo))
382  return false; //failed
383 
384  auto locComboSurvivedIndex = (locIsKinFit && !locPreKinFitFlag) ? locActionIndex + 2 : locActionIndex + 1;
385  ++(locNumCombosSurvived[locComboSurvivedIndex]);
386  if(locCombo == locTrueCombo)
387  locLastActionTrueComboSurvives = locActionIndex;
388  }
389  return true;
390 }
391 
392 const DParticleCombo* DAnalysisResults_factory::Find_TrueCombo(JEventLoop *locEventLoop, const DReaction* locReaction, const vector<const DParticleCombo*>& locCombos)
393 {
394  //find the true particle combo
395  if(dTrueComboCuts.find(locReaction) == dTrueComboCuts.end())
396  return nullptr;
397  auto locAction = dTrueComboCuts[locReaction];
398  for(auto& locCombo : locCombos)
399  {
400  if((*locAction)(locEventLoop, locCombo))
401  return locCombo;
402  }
403  return nullptr;
404 }
405 
406 const DParticleCombo* DAnalysisResults_factory::Handle_ComboFit(const DReactionVertexInfo* locReactionVertexInfo, const DParticleCombo* locParticleCombo, const DReaction* locReaction)
407 {
408  auto locKinFitType = locReaction->Get_KinFitType();
409  if(locKinFitType == d_NoFit)
410  return locParticleCombo;
411 
412  //A given combo can be used for multiple DReactions, each with a different fit type or update-cov flag
413  auto locUpdateCovMatricesFlag = locReaction->Get_KinFitUpdateCovarianceMatricesFlag();
414  auto locNoConstrainMassSteps = DAnalysis::Get_NoConstrainMassSteps(locReaction);
415  auto locComboKinFitTuple = std::make_tuple(locParticleCombo, locKinFitType, locUpdateCovMatricesFlag, locNoConstrainMassSteps);
416 
417  //Check if same fit with this combo already done. If so, return it.
418  auto locComboIterator = dPreToPostKinFitComboMap.find(locComboKinFitTuple);
419  if(locComboIterator != dPreToPostKinFitComboMap.end())
420  return locComboIterator->second;
421 
422  //KINFIT
423  if(dDebugLevel >= 10)
424  cout << "Do kinfit" << endl;
425  auto locKinFitResultsPair = Fit_Kinematics(locReactionVertexInfo, locReaction, locParticleCombo, locKinFitType, locUpdateCovMatricesFlag);
426  if(locKinFitResultsPair.second == nullptr)
427  return (dRequireKinFitConvergence ? nullptr : locParticleCombo); //fit failed, or no constraints
428 
429  //Fit succeeded. Create new combo with kinfit results
430  if(dDebugLevel >= 10)
431  cout << "Create new combo" << endl;
432  auto locNewParticleCombo = dParticleComboCreator->Create_KinFitCombo_NewCombo(locParticleCombo, locReaction, locKinFitResultsPair.second, locKinFitResultsPair.first);
433  dPreToPostKinFitComboMap.emplace(locComboKinFitTuple, locNewParticleCombo);
434  return locNewParticleCombo;
435 }
436 
437 pair<shared_ptr<const DKinFitChain>, const DKinFitResults*> DAnalysisResults_factory::Fit_Kinematics(const DReactionVertexInfo* locReactionVertexInfo, const DReaction* locReaction, const DParticleCombo* locParticleCombo, DKinFitType locKinFitType, bool locUpdateCovMatricesFlag)
438 {
439  //Make DKinFitChain
440  auto locKinFitChain = dKinFitUtils->Make_KinFitChain(locReactionVertexInfo, locReaction, locParticleCombo, locKinFitType);
441 
442  //Make Constraints
443  vector<shared_ptr<DKinFitConstraint_Vertex>> locSortedVertexConstraints;
444  auto locConstraints = dKinFitUtils->Create_Constraints(locReactionVertexInfo, locReaction, locParticleCombo, locKinFitChain, locKinFitType, locSortedVertexConstraints);
445  if(locConstraints.empty())
446  return pair<shared_ptr<const DKinFitChain>, const DKinFitResults*>(nullptr, nullptr); //Nothing to fit!
447 
448  //see if constraints (particles) are identical to a previous kinfit
449  auto locResultPair = std::make_pair(locConstraints, locUpdateCovMatricesFlag);
450  auto locResultIterator = dConstraintResultsMap.find(locResultPair);
451  if(locResultIterator != dConstraintResultsMap.end())
452  {
453  //this has been kinfit before, use the same result
454  DKinFitResults* locKinFitResults = locResultIterator->second;
455  if(locKinFitResults != nullptr)
456  {
457  //previous kinfit succeeded, build the output DKinFitChain and register this combo with that fit
458  auto locOutputKinFitParticles = locKinFitResults->Get_OutputKinFitParticles();
459  auto locOutputKinFitChain = dKinFitUtils->Build_OutputKinFitChain(locKinFitChain, locOutputKinFitParticles);
460  return std::make_pair(locOutputKinFitChain, locKinFitResults);
461  }
462 
463  //else: the previous kinfit failed, so this one will too (don't save)
464  return pair<shared_ptr<const DKinFitChain>, const DKinFitResults*>(nullptr, nullptr);
465  }
466 
467  //Add constraints & perform fit
468  dKinFitUtils->Set_UpdateCovarianceMatricesFlag(locUpdateCovMatricesFlag);
470  dKinFitter->Add_Constraints(locConstraints);
471  bool locFitStatus = dKinFitter->Fit_Reaction();
472 
473  //Build results (unless failed), and register
474  DKinFitResults* locKinFitResults = nullptr;
475  if(locFitStatus) //success
476  {
477  auto locOutputKinFitParticles = dKinFitter->Get_KinFitParticles();
478  auto locOutputKinFitChain = dKinFitUtils->Build_OutputKinFitChain(locKinFitChain, locOutputKinFitParticles);
479  locKinFitResults = Build_KinFitResults(locParticleCombo, locKinFitType, locOutputKinFitChain);
480  dConstraintResultsMap.emplace(locResultPair, locKinFitResults);
481  return std::make_pair(locOutputKinFitChain, locKinFitResults);
482  }
483 
484  //failed fit
485  dKinFitter->Recycle_LastFitMemory(); //RESET MEMORY FROM LAST KINFIT!! //results no longer needed
486  dConstraintResultsMap.emplace(locResultPair, locKinFitResults);
487  return pair<shared_ptr<const DKinFitChain>, const DKinFitResults*>(nullptr, nullptr);
488 }
489 
490 DKinFitResults* DAnalysisResults_factory::Build_KinFitResults(const DParticleCombo* locParticleCombo, DKinFitType locKinFitType, const shared_ptr<const DKinFitChain>& locKinFitChain)
491 {
492  auto locKinFitResults = Get_KinFitResultsResource();
493  locKinFitResults->Set_KinFitType(locKinFitType);
494 
495  locKinFitResults->Set_ConfidenceLevel(dKinFitter->Get_ConfidenceLevel());
496  locKinFitResults->Set_ChiSq(dKinFitter->Get_ChiSq());
497  locKinFitResults->Set_NDF(dKinFitter->Get_NDF());
498 
499  //locKinFitResults->Set_VEta(dKinFitter->Get_VEta());
500  locKinFitResults->Set_VXi(dKinFitter->Get_VXi());
501  //locKinFitResults->Set_V(dKinFitter->Get_V());
502 
503  locKinFitResults->Set_NumConstraints(dKinFitter->Get_NumConstraintEquations());
504  locKinFitResults->Set_NumUnknowns(dKinFitter->Get_NumUnknowns());
505 
506  //Output particles and constraints
507  auto locOutputKinFitParticles = dKinFitter->Get_KinFitParticles();
508  locKinFitResults->Add_OutputKinFitParticles(locOutputKinFitParticles);
509  locKinFitResults->Add_KinFitConstraints(dKinFitter->Get_KinFitConstraints());
510 
511  //Pulls
512 
513  //Build this:
514  map<const JObject*, map<DKinFitPullType, double> > locPulls_JObject;
515 
516  //From this:
517  map<shared_ptr<DKinFitParticle>, map<DKinFitPullType, double> > locPulls_KinFitParticle;
518  dKinFitter->Get_Pulls(locPulls_KinFitParticle);
519 
520  //By looping over the pulls:
521  auto locMapIterator = locPulls_KinFitParticle.begin();
522  for(; locMapIterator != locPulls_KinFitParticle.end(); ++locMapIterator)
523  {
524  auto locOutputKinFitParticle = locMapIterator->first;
525  auto locInputKinFitParticle = dKinFitUtils->Get_InputKinFitParticle(locOutputKinFitParticle);
526  auto locSourceJObject = dKinFitUtils->Get_SourceJObject(locInputKinFitParticle);
527 
528  locPulls_JObject[locSourceJObject] = locMapIterator->second;
529  }
530  //Set Pulls
531  locKinFitResults->Set_Pulls(locPulls_JObject);
532 
533  //Particle Mapping
534  for(auto& locKinFitParticle : locOutputKinFitParticles)
535  {
536  if(locKinFitParticle == nullptr)
537  continue;
538 
539  const JObject* locSourceJObject = dKinFitUtils->Get_SourceJObject(locKinFitParticle);
540  if(locSourceJObject != NULL)
541  {
542  locKinFitResults->Add_ParticleMapping_SourceToOutput(locSourceJObject, locKinFitParticle);
543  continue; //*locParticleIterator was an input object //not directly used in the fit
544  }
545 
546  auto locInputKinFitParticle = dKinFitUtils->Get_InputKinFitParticle(locKinFitParticle);
547  if(locInputKinFitParticle != NULL)
548  {
549  locSourceJObject = dKinFitUtils->Get_SourceJObject(locInputKinFitParticle);
550  if(locSourceJObject != NULL) //else was a decaying/missing particle: no source
551  locKinFitResults->Add_ParticleMapping_SourceToOutput(locSourceJObject, locKinFitParticle);
552  }
553  }
554 
555  return locKinFitResults;
556 }
void Reset_NewEvent(void)
Definition: DKinFitter.cc:71
bool Get_IsFirstStepBeam(const DReaction *locReaction)
Definition: DReaction.h:178
void Set_UpdateCovarianceMatricesFlag(bool locUpdateCovarianceMatricesFlag)
Definition: DKinFitUtils.h:52
bool Fit_Reaction(void)
Definition: DKinFitter.cc:723
set< size_t > Get_NoConstrainMassSteps(const DReaction *locReaction)
Definition: DReaction.h:198
jerror_t brun(JEventLoop *locEventLoop, int32_t runnumber)
Called everytime a new run number is detected.
void Check_ReactionNames(vector< const DReaction * > &locReactions) const
map< tuple< const DParticleCombo *, DKinFitType, bool, set< size_t > >, const DParticleCombo * > dPreToPostKinFitComboMap
DKinFitType Get_KinFitType(void) const
Definition: DReaction.h:79
const DParticleCombo * Handle_ComboFit(const DReactionVertexInfo *locReactionVertexInfo, const DParticleCombo *locParticleCombo, const DReaction *locReaction)
DKinFitResults * Get_KinFitResultsResource(void)
vector< const DReaction * > Get_Reactions(JEventLoop *locEventLoop)
Definition: DReaction.cc:218
char string[256]
axes Fill(100, 100)
DCombosByReaction Build_ParticleCombos(const DReactionVertexInfo *locReactionVertexInfo)
unordered_map< const DReaction *, TH1 * > dHistMap_NumEventsWhereTrueComboSurvivedAction
const DParticleCombo * Create_KinFitCombo_NewCombo(const DParticleCombo *locOrigCombo, const DReaction *locReaction, const DKinFitResults *locKinFitResults, const shared_ptr< const DKinFitChain > &locKinFitChain)
void Make_ControlHistograms(vector< const DReaction * > &locReactions)
unordered_map< const DReaction *, DCutAction_TrueCombo * > dTrueComboCuts
unordered_map< const DReaction *, bool > dMCReactionExactMatchFlags
unordered_map< const DReaction *, TH1 * > dHistMap_NumEventsSurvivedAction_All
bool Execute_Actions(JEventLoop *locEventLoop, bool locIsKinFit, const DParticleCombo *locCombo, const DParticleCombo *locTrueCombo, bool locPreKinFitFlag, const vector< DAnalysisAction * > &locActions, size_t &locActionIndex, vector< size_t > &locNumCombosSurvived, int &locLastActionTrueComboSurvives)
void Recycle_LastFitMemory(void)
Definition: DKinFitter.cc:98
unordered_map< const DReaction *, TH1 * > dHistMap_NumCombosSurvivedAction1D
JApplication * japp
const DParticleCombo * Find_TrueCombo(JEventLoop *locEventLoop, const DReaction *locReaction, const vector< const DParticleCombo * > &locCombos)
bool Get_IsPhysicsEvent(void) const
DParticleComboCreator * Get_ParticleComboCreator(void) const
vector< DKinFitResults * > dCreatedKinFitResults
size_t Get_NumAnalysisActions(void) const
Definition: DReaction.h:93
map< pair< set< shared_ptr< DKinFitConstraint > >, bool >, DKinFitResults * > dConstraintResultsMap
DParticleComboCreator * dParticleComboCreator
unsigned int Get_NumConstraintEquations(void) const
Definition: DKinFitter.h:85
jerror_t init(void)
Called once at program start.
set< shared_ptr< DKinFitParticle > > Get_OutputKinFitParticles(void) const
shared_ptr< const DKinFitChain > Build_OutputKinFitChain(const shared_ptr< const DKinFitChain > &locInputKinFitChain, set< shared_ptr< DKinFitParticle >> &locKinFitOutputParticles)
string Get_ReactionName(void) const
Definition: DReaction.h:75
DResourcePool< DKinFitResults > dResourcePool_KinFitResults
set< shared_ptr< DKinFitConstraint > > Get_KinFitConstraints(void) const
Definition: DKinFitter.h:99
unsigned int Get_NDF(void) const
Definition: DKinFitter.h:90
h_means GetYaxis() -> SetTitleOffset(1.8)
void Set_DebugLevel(int locDebugLevel)
Definition: DKinFitter.cc:107
void Reset_NewFit(void)
Definition: DKinFitter.cc:77
double Get_ChiSq(void) const
Definition: DKinFitter.h:88
unordered_map< const DReaction *, TH2 * > dHistMap_NumCombosSurvivedAction
DKinFitResults * Build_KinFitResults(const DParticleCombo *locParticleCombo, DKinFitType locKinFitType, const shared_ptr< const DKinFitChain > &locKinFitChain)
void Add_Constraints(const set< shared_ptr< DKinFitConstraint >> &locKinFitConstraints)
Definition: DKinFitter.h:218
set< shared_ptr< DKinFitConstraint > > Create_Constraints(const DReactionVertexInfo *locReactionVertexInfo, const DReaction *locReaction, const DParticleCombo *locParticleCombo, const shared_ptr< const DKinFitChain > &locKinFitChain, DKinFitType locKinFitType, vector< shared_ptr< DKinFitConstraint_Vertex >> &locSortedVertexConstraints)
void Get_Pulls(map< shared_ptr< DKinFitParticle >, map< DKinFitPullType, double > > &locPulls) const
Definition: DKinFitter.h:91
const JObject * Get_SourceJObject(const shared_ptr< DKinFitParticle > &locInputKinFitParticle) const
void Reset_NewEvent(JEventLoop *locEventLoop)
const TMatrixDSym & Get_VXi(void)
Definition: DKinFitter.h:95
set< shared_ptr< DKinFitParticle > > Get_KinFitParticles(void) const
Definition: DKinFitter.h:100
double Get_ConfidenceLevel(void) const
Definition: DKinFitter.h:89
jerror_t evnt(JEventLoop *locEventLoop, uint64_t eventnumber)
Called every event.
bool Get_KinFitUpdateCovarianceMatricesFlag(void) const
Definition: DReaction.h:80
void Set_ControlParams(size_t locGetBatchSize, size_t locNumToAllocateAtOnce, size_t locMaxLocalPoolSize)
shared_ptr< DKinFitParticle > Get_InputKinFitParticle(const shared_ptr< DKinFitParticle > &locKinFitParticle) const
Definition: DKinFitUtils.h:203
unsigned int Get_NumUnknowns(void) const
Definition: DKinFitter.h:83
unordered_map< const DReaction *, TH1 * > dHistMap_NumParticleCombos
pair< shared_ptr< const DKinFitChain >, const DKinFitResults * > Fit_Kinematics(const DReactionVertexInfo *locReactionVertexInfo, const DReaction *locReaction, const DParticleCombo *locParticleCombo, DKinFitType locKinFitType, bool locUpdateCovMatricesFlag)
DKinFitUtils_GlueX * dKinFitUtils
virtual void Initialize(JEventLoop *locEventLoop)=0
shared_ptr< const DKinFitChain > Make_KinFitChain(const DReactionVertexInfo *locReactionVertexInfo, const DReaction *locReaction, const DParticleCombo *locParticleCombo, DKinFitType locKinFitType)
vector< DAnalysisAction * > Get_AnalysisActions(void) const
Definition: DReaction.h:94
void Recycle(const DType *locResource)
virtual string Get_ActionName(void) const