Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DCustomAction_CutNoDetectorHit.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DCustomAction_CutNoDetectorHit.cc
4 // Created: Mon Feb 20 16:01:16 EST 2017
5 // Creator: pmatt (on Linux pmattdesktop.jlab.org 2.6.32-642.13.1.el6.x86_64 x86_64)
6 //
7 
9 
10 void DCustomAction_CutNoDetectorHit::Initialize(JEventLoop* locEventLoop)
11 {
12  //Optional: Create histograms and/or modify member variables.
13  //Create any histograms/trees/etc. within a ROOT lock.
14  //This is so that when running multithreaded, only one thread is writing to the ROOT file at a time.
15  //NEVER: Get anything from the JEventLoop while in a lock: May deadlock
16 
17  auto locMissingPIDs = Get_Reaction()->Get_MissingPIDs();
18  dMissingPID = (locMissingPIDs.size() == 1) ? locMissingPIDs[0] : Unknown;
19  if(locMissingPIDs.size() != 1)
20  return; //invalid reaction setup
21 
22  DApplication* locApplication = dynamic_cast<DApplication*>(locEventLoop->GetJApplication());
23  dMagneticFieldMap = locApplication->GetBfield(locEventLoop->GetJEvent().GetRunNumber());
24  locEventLoop->GetSingle(dParticleID);
25 
26  string locHistName, locHistTitle;
27  string locTrackString = string("Missing ") + ParticleName_ROOT(dMissingPID);
28 
29  //CREATE THE HISTOGRAMS
30  //Since we are creating histograms, the contents of gDirectory will be modified: must use JANA-wide ROOT lock
31  japp->RootWriteLock(); //ACQUIRE ROOT LOCK!!
32  {
33  //Required: Create a folder in the ROOT output file that will contain all of the output ROOT objects (if any) for this action.
34  //If another thread has already created the folder, it just changes to it.
36 
37  //SC MATCHING
38  locHistName = "SCTrackDeltaPhiVsP";
39  locHistTitle = locTrackString + string(";p (GeV/c);SC / Track #Delta#phi#circ");
40  dHist_SCTrackDeltaPhiVsP = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DDeltaPhiBins, dSCMatchMinDeltaPhi, dSCMatchMaxDeltaPhi);
41 
42  locHistName = "SCTrackDeltaPhiVsTheta";
43  locHistTitle = locTrackString + string(";#theta#circ;SC / Track #Delta#phi#circ");
45 
46  locHistName = "SCTrackDeltaPhiVsZ";
47  locHistTitle = locTrackString + string(";Projected SC Hit-Z (cm);SC / Track #Delta#phi#circ");
48  dHistMap_SCTrackDeltaPhiVsZ = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DSCZBins, 0.0, 120.0, dNum2DDeltaPhiBins, dSCMatchMinDeltaPhi, dSCMatchMaxDeltaPhi);
49 
50  //TOF MATCHING
51  locHistName = "TOFTrackDistanceVsP";
52  locHistTitle = locTrackString + string(";p (GeV/c);TOF / Track Distance (cm)");
53  dHist_TOFPointTrackDistanceVsP = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DTrackDOCABins, dMinTrackDOCA, dMaxTrackMatchDOCA);
54 
55  locHistName = "TOFTrackDistanceVsTheta";
56  locHistTitle = locTrackString + string(";#theta#circ;TOF / Track Distance (cm)");
57  dHist_TOFPointTrackDistanceVsTheta = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, 20.0, dNum2DTrackDOCABins, dMinTrackDOCA, dMaxTrackMatchDOCA);
58 
59  //FCAL MATCHING
60  locHistName = "FCALTrackDistanceVsP";
61  locHistTitle = locTrackString + string(";p (GeV/c);FCAL / Track Distance (cm)");
62  dHist_FCALTrackDistanceVsP = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, dMaxP, dNum2DTrackDOCABins, dMinTrackDOCA, dMaxTrackMatchDOCA);
63 
64  locHistName = "FCALTrackDistanceVsTheta";
65  locHistTitle = locTrackString + string(";#theta#circ;FCAL / Track Distance (cm)");
66  dHist_FCALTrackDistanceVsTheta = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, 20.0, dNum2DTrackDOCABins, dMinTrackDOCA, dMaxTrackMatchDOCA);
67 
68  //BCAL MATCHING
69  locHistName = "BCALDeltaPhiVsP";
70  locHistTitle = locTrackString + string(";p (GeV/c);BCAL / Track #Delta#phi#circ");
71  dHist_BCALDeltaPhiVsP = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DPBins, dMinP, 4.0, dNum2DDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi);
72 
73  locHistName = "BCALDeltaPhiVsZ";
74  locHistTitle = locTrackString + string(";Projected BCAL Hit-Z (cm);BCAL / Track #Delta#phi#circ");
75  dHistMap_BCALDeltaPhiVsZ = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DBCALZBins, 0.0, 450.0, dNum2DDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi);
76 
77  locHistName = "BCALDeltaPhiVsTheta";
78  locHistTitle = locTrackString + string(";#theta#circ;BCAL / Track #Delta#phi#circ");
79  dHistMap_BCALDeltaPhiVsTheta = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DDeltaPhiBins, dMinDeltaPhi, dMaxDeltaPhi);
80 
81  locHistName = "BCALDeltaZVsTheta";
82  locHistTitle = locTrackString + string(";#theta#circ;BCAL / Track #Deltaz (cm)");
83  dHist_BCALDeltaZVsTheta = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DThetaBins, dMinTheta, dMaxTheta, dNum2DDeltaZBins, dMinDeltaZ, dMaxDeltaZ);
84 
85  locHistName = "BCALDeltaZVsZ";
86  locHistTitle = locTrackString + string(";Projected BCAL Hit-Z (cm);BCAL / Track #Deltaz (cm)");
87  dHistMap_BCALDeltaZVsZ = GetOrCreate_Histogram<TH2I>(locHistName, locHistTitle, dNum2DBCALZBins, 0.0, 450.0, dNum2DDeltaZBins, dMinDeltaZ, dMaxDeltaZ);
88 }
89  japp->RootUnLock(); //RELEASE ROOT LOCK!!
90 }
91 
92 bool DCustomAction_CutNoDetectorHit::Perform_Action(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo)
93 {
94  //Write custom code to perform an action on the INPUT DParticleCombo (DParticleCombo)
95  //NEVER: Grab DParticleCombo or DAnalysisResults objects (of any tag!) from the JEventLoop within this function
96  //NEVER: Grab objects that are created post-kinfit (e.g. DKinFitResults, etc.) from the JEventLoop if Get_UseKinFitResultsFlag() == false: CAN CAUSE INFINITE DEPENDENCY LOOP
97  //NEVER: Get anything from the JEventLoop while in a lock: May deadlock
98 
99  if(dMissingPID == Unknown)
100  return false; //invalid reaction setup
101  if(ParticleCharge(dMissingPID) == 0)
102  return false; //NOT SUPPORTED
103 
104  auto locMissingParticles = locParticleCombo->Get_MissingParticles(Get_Reaction());
105  if(locMissingParticles.empty())
106  return false; //kinfit failed to converge
107  auto locMissingParticle = locMissingParticles[0];
108  double locP = locMissingParticle->momentum().Mag();
109  double locTheta = locMissingParticle->momentum().Theta()*180.0/TMath::Pi();
110 
111  // Generate & swim reference trajectory for this
115  rt.Swim(locMissingParticle->position(), locMissingParticle->momentum(), rt.q);
116 
117  vector<const DBCALShower*> locBCALShowers;
118  locEventLoop->Get(locBCALShowers);
119 
120  vector<const DFCALShower*> locFCALShowers;
121  locEventLoop->Get(locFCALShowers);
122 
123  vector<const DTOFPoint*> locTOFPoints;
124  locEventLoop->Get(locTOFPoints);
125 
126  vector<const DSCHit*> locSCHits;
127  locEventLoop->Get(locSCHits);
128 
129  // MATCHING: BCAL
130  shared_ptr<const DBCALShowerMatchParams> locBestBCALMatchParams;
131  double locStartTimeVariance = 0.0;
132  DVector3 locProjPos, locProjMom;
133  double locStartTime = locParticleCombo->Get_ParticleComboStep(0)->Get_SpacetimeVertex().T();
134  bool locBCALHitFoundFlag = dParticleID->Get_ClosestToTrack(&rt, locBCALShowers, false, locStartTime, locBestBCALMatchParams, &locStartTimeVariance, &locProjPos, &locProjMom);
135  double locBCALProjectedZ = locProjPos.Z();
136  double locBCALDeltaPhi = locBCALHitFoundFlag ? locBestBCALMatchParams->dDeltaPhiToShower*180.0/TMath::Pi() : 9.9E9;
137 
138  // MATCHING: FCAL
139  shared_ptr<const DFCALShowerMatchParams> locBestFCALMatchParams;
140  locStartTime = locParticleCombo->Get_ParticleComboStep(0)->Get_SpacetimeVertex().T();
141  DVector3 locProjPos_FCALMissing, locProjMom_FCALMissing;
142  bool locFCALHitFoundFlag = dParticleID->Get_ClosestToTrack(&rt, locFCALShowers, false, locStartTime, locBestFCALMatchParams, &locStartTimeVariance, &locProjPos_FCALMissing, &locProjMom_FCALMissing);
143 
144  // MATCHING: SC
145  shared_ptr<const DSCHitMatchParams> locBestSCMatchParams;
146  locStartTime = locParticleCombo->Get_ParticleComboStep(0)->Get_SpacetimeVertex().T();
147  bool locSCHitFoundFlag = dParticleID->Get_ClosestToTrack(&rt, locSCHits, true, false, locStartTime, locBestSCMatchParams, &locStartTimeVariance, &locProjPos, &locProjMom);
148  double locSCProjectedZ = locProjPos.Z();
149  double locSCDeltaPhi = locSCHitFoundFlag ? locBestSCMatchParams->dDeltaPhiToHit*180.0/TMath::Pi() : 9.9E9;
150 
151  // MATCHING: TOF
152  shared_ptr<const DTOFHitMatchParams> locBestTOFMatchParams;
153  DVector3 locProjPos_TOFMissing, locProjMom_TOFMissing;
154  locStartTime = locParticleCombo->Get_ParticleComboStep(0)->Get_SpacetimeVertex().T();
155  bool locTOFHitFoundFlag = dParticleID->Get_ClosestToTrack(&rt, locTOFPoints, false, locStartTime, locBestTOFMatchParams, &locStartTimeVariance, &locProjPos_TOFMissing, &locProjMom_TOFMissing);
156  double locTOFDistance = 999.9;
157  if(locTOFHitFoundFlag)
158  {
159  double locDeltaX = locBestTOFMatchParams->dDeltaXToHit;
160  double locDeltaY = locBestTOFMatchParams->dDeltaYToHit;
161  if(locBestTOFMatchParams->dTOFPoint->Is_XPositionWellDefined() == locBestTOFMatchParams->dTOFPoint->Is_YPositionWellDefined())
162  locTOFDistance = sqrt(locDeltaX*locDeltaX + locDeltaY*locDeltaY);
163  else
164  locTOFDistance = locBestTOFMatchParams->dTOFPoint->Is_XPositionWellDefined() ? locDeltaX : locDeltaY;
165  }
166 
167 
168  /************************************************* TIME-BASED TRACKS *************************************************/
169 
170 /*
171  const DAnalysisUtilities* dAnalysisUtilities = nullptr;
172  locEventLoop->GetSingle(dAnalysisUtilities);
173 
174 
175  TMatrixDSym locMissingCovarianceMatrix(3);
176  const TMatrixFSym& locKinFitCovarianceMatrix = *(locMissingParticle->errorMatrix());
177  for(unsigned int loc_q = 0; loc_q < 3; ++loc_q)
178  {
179  for(unsigned int loc_r = 0; loc_r < 3; ++loc_r)
180  locMissingCovarianceMatrix(loc_q, loc_r) = locKinFitCovarianceMatrix(loc_q, loc_r);
181  }
182 
183 
184  //Get unused tracks
185  vector<const DTrackTimeBased*> locUnusedTimeBasedTracks;
186  dAnalysisUtilities->Get_UnusedTimeBasedTracks(locEventLoop, locParticleCombo, locUnusedTimeBasedTracks);
187 
188  //loop over unused tracks
189  double locBestMatchFOM = -1.0;
190 
191  const DTrackTimeBased* locBestTimeBasedTrack = nullptr;
192  for(size_t loc_i = 0; loc_i < locUnusedTimeBasedTracks.size(); ++loc_i)
193  {
194  const DTrackTimeBased* locTimeBasedTrack = locUnusedTimeBasedTracks[loc_i];
195  if(locTimeBasedTrack->PID() != dMissingPID)
196  continue; //only use tracking results with correct PID
197 
198  DVector3 locTimeBasedDP3 = locTimeBasedTrack->momentum();
199  TVector3 locTimeBasedP3(locTimeBasedDP3.X(), locTimeBasedDP3.Y(), locTimeBasedDP3.Z());
200 
201  const TMatrixFSym& locCovarianceMatrix = *(locTimeBasedTrack->errorMatrix());
202  TMatrixDSym locDCovarianceMatrix(3);
203  for(unsigned int loc_j = 0; loc_j < 3; ++loc_j)
204  {
205  for(unsigned int loc_k = 0; loc_k < 3; ++loc_k)
206  locDCovarianceMatrix(loc_j, loc_k) = locCovarianceMatrix(loc_j, loc_k);
207  }
208  locDCovarianceMatrix += locMissingCovarianceMatrix;
209 
210  //invert matrix
211  TDecompLU locDecompLU(locDCovarianceMatrix);
212  //check to make sure that the matrix is decomposable and has a non-zero determinant
213  if(!locDecompLU.Decompose() || (fabs(locDCovarianceMatrix.Determinant()) < 1.0E-300))
214  continue;
215 
216  locDCovarianceMatrix.Invert();
217  DVector3 locDeltaP3 = locTimeBasedTrack->momentum() - locMissingParticle->momentum();
218 
219  DMatrix locDeltas(3, 1);
220  locDeltas(0, 0) = locDeltaP3.Px();
221  locDeltas(1, 0) = locDeltaP3.Py();
222  locDeltas(2, 0) = locDeltaP3.Pz();
223  double locChiSq = (locDCovarianceMatrix.SimilarityT(locDeltas))(0, 0);
224  double locMatchFOM = TMath::Prob(locChiSq, 3);
225 
226  if(locMatchFOM < locBestMatchFOM)
227  continue;
228  locBestMatchFOM = locMatchFOM;
229  locBestTimeBasedTrack = locTimeBasedTrack;
230  }
231 
232  if(locTOFHitFoundFlag && (locBestTimeBasedTrack != nullptr))
233  {
234  DVector3 locBestProjPos, locBestProjMom;
235  double locStartTimeVariance = 0.0;
236  shared_ptr<const DTOFHitMatchParams> locReconTOFMatchParams;
237  locStartTime = locParticleCombo->Get_ParticleComboStep(0)->Get_SpacetimeVertex().T();
238  if(dParticleID->Get_ClosestToTrack(locBestTimeBasedTrack->rt, locTOFPoints, false, locStartTime, locReconTOFMatchParams, &locStartTimeVariance, &locBestProjPos, &locBestProjMom))
239  {
240  //NOW CHECK FOR FCAL HITS
241  locStartTime = locParticleCombo->Get_ParticleComboStep(0)->Get_SpacetimeVertex().T();
242  DVector3 locBestProjPosFCAL, locBestProjMomFCAL;
243  double locStartTimeVarianceFCAL = 0.0;
244  shared_ptr<const DFCALShowerMatchParams> locReconFCALMatchParams;
245  if(locFCALHitFoundFlag && dParticleID->Get_ClosestToTrack(locBestTimeBasedTrack->rt, locFCALShowers, false, locStartTime, locReconFCALMatchParams, &locStartTimeVarianceFCAL, &locBestProjPosFCAL, &locBestProjMomFCAL))
246  {
247  cout << "projected to hit tof AND fcal:" << endl;
248  auto locReconP3 = locBestTimeBasedTrack->momentum();
249  auto locMissingP3 = locMissingParticle->momentum();
250  cout << "recon p/theta/phi: " << locReconP3.Mag() << ", " << locReconP3.Theta()*180.0/TMath::Pi() << ", " << locReconP3.Phi()*180.0/TMath::Pi() << endl;
251  cout << "missing p/theta/phi: " << locMissingP3.Mag() << ", " << locMissingP3.Theta()*180.0/TMath::Pi() << ", " << locMissingP3.Phi()*180.0/TMath::Pi() << endl;
252  cout << "TOF recon proj position = " << locBestProjPos.X() << ", " << locBestProjPos.Y() << ", " << locBestProjPos.Z() << endl;
253  cout << "TOF missing proj position = " << locProjPos_TOFMissing.X() << ", " << locProjPos_TOFMissing.Y() << ", " << locProjPos_TOFMissing.Z() << endl;
254  cout << "TOF: nearest hit: delta x/y, hor/vert bars: " << locReconTOFMatchParams->dDeltaXToHit << ", " << locReconTOFMatchParams->dDeltaYToHit << ", " << locReconTOFMatchParams->dTOFPoint->dHorizontalBar << ", " << locReconTOFMatchParams->dTOFPoint->dVerticalBar << endl;
255  cout << "TOF: missing proj'd delta x/y, distance = " << locBestTOFMatchParams->dDeltaXToHit << ", " << locBestTOFMatchParams->dDeltaYToHit << ", " << locTOFDistance << endl;
256  cout << "FCAL recon proj position = " << locBestProjPosFCAL.X() << ", " << locBestProjPosFCAL.Y() << ", " << locBestProjPosFCAL.Z() << endl;
257  cout << "FCAL missing proj position = " << locProjPos_FCALMissing.X() << ", " << locProjPos_FCALMissing.Y() << ", " << locProjPos_FCALMissing.Z() << endl;
258  cout << "FCAL: recon/missing doca to shower: " << locReconFCALMatchParams->dDOCAToShower << ", " << locBestFCALMatchParams->dDOCAToShower << endl;
259  }
260  }
261 
262 // const DDetectorMatches* locDetectorMatches = nullptr;
263 // locEventLoop->GetSingle(locDetectorMatches);
264  }
265 */
266 
267  //FILL HISTOGRAMS
268  auto locKinFitResults = locParticleCombo->Get_KinFitResults();
269  if((locKinFitResults != nullptr) && (locKinFitResults->Get_ConfidenceLevel() > 0.0001))
270  {
271  //Since we are filling histograms local to this action, it will not interfere with other ROOT operations: can use action-wide ROOT lock
272  //Note, the mutex is unique to this DReaction + action_string combo: actions of same class with different hists will have a different mutex
273  Lock_Action(); //ACQUIRE ROOT LOCK!!
274  {
275  /********************************************************** MATCHING DISTANCE **********************************************************/
276 
277  //BCAL
278  if(locBCALHitFoundFlag)
279  {
280  dHist_BCALDeltaPhiVsP->Fill(locP, locBCALDeltaPhi);
281  dHistMap_BCALDeltaPhiVsZ->Fill(locBCALProjectedZ, locBCALDeltaPhi);
282  dHistMap_BCALDeltaPhiVsTheta->Fill(locTheta, locBCALDeltaPhi);
283  dHist_BCALDeltaZVsTheta->Fill(locTheta, locBestBCALMatchParams->dDeltaZToShower);
284  dHistMap_BCALDeltaZVsZ->Fill(locBCALProjectedZ, locBestBCALMatchParams->dDeltaZToShower);
285  }
286 
287  //FCAL
288  if(locFCALHitFoundFlag)
289  {
290  dHist_FCALTrackDistanceVsP->Fill(locP, locBestFCALMatchParams->dDOCAToShower);
291  dHist_FCALTrackDistanceVsTheta->Fill(locTheta, locBestFCALMatchParams->dDOCAToShower);
292  }
293 
294  //TOF Point
295  if(locTOFHitFoundFlag)
296  {
297  dHist_TOFPointTrackDistanceVsP->Fill(locP, locTOFDistance);
298  dHist_TOFPointTrackDistanceVsTheta->Fill(locTheta, locTOFDistance);
299  }
300 
301  //SC
302  if(locSCHitFoundFlag)
303  {
304  dHist_SCTrackDeltaPhiVsP->Fill(locP, locSCDeltaPhi);
305  dHist_SCTrackDeltaPhiVsTheta->Fill(locTheta, locSCDeltaPhi);
306  dHistMap_SCTrackDeltaPhiVsZ->Fill(locSCProjectedZ, locSCDeltaPhi);
307  }
308  }
309  Unlock_Action(); //RELEASE ROOT LOCK!!
310  }
311 
312  //Check for slow protons stopping in target: don't expect any hits
313  bool locMassiveParticleFlag = (ParticleMass(dMissingPID) + 0.001 > ParticleMass(Proton));
314  if((locP < 0.2) && locMassiveParticleFlag)
315  return false; //don't even bother to try
316  if((locP < 0.3) && locMassiveParticleFlag)
317  return true;
318  if((locP < 0.4) && (locTheta < 30.0) && locMassiveParticleFlag)
319  return true;
320 
321  //REQUIRE: ST hit
322  if(!locSCHitFoundFlag)
323  return false;
324  double locSCDeltaPhiCut = 25.0 + 0.12*exp(0.13*(locSCProjectedZ - 50.0));
325  if(fabs(locSCDeltaPhi) > locSCDeltaPhiCut)
326  return false; //could expand, would only effect 2pi missing pi forward-z
327 
328  //Check for slow protons stopping in the drift chambers: don't expect any further hits
329  if((locP < 0.4) && locMassiveParticleFlag)
330  return true;
331 
332  //REQUIRE EITHER BCAL hit OR TOF && FCAL hits
333 
334  //BCAL Hit
335  if(locBCALHitFoundFlag)
336  return ((fabs(locBCALDeltaPhi) < 2.0) && (fabs(locBestBCALMatchParams->dDeltaZToShower) < 15.0));
337 
338  //FCAL & TOF Hit:
339  if(!locTOFHitFoundFlag || !locFCALHitFoundFlag)
340  return false;
341 
342  if(locTOFHitFoundFlag)
343  return (locTOFDistance < 30.0);
344 
345  return (locBestFCALMatchParams->dDOCAToShower < 50.0); //is always true: there's always another FCAL hit
346 }
347 
void Initialize(JEventLoop *locEventLoop)
static char * ParticleName_ROOT(Particle_t p)
Definition: particleType.h:851
TVector3 DVector3
Definition: DVector3.h:14
const DReaction * Get_Reaction(void) const
char string[256]
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
void SetMass(double mass)
void Swim(const DVector3 &pos, const DVector3 &mom, double q=-1000.0, const TMatrixFSym *cov=NULL, double smax=2000.0, const DCoordinateSystem *wire=NULL)
TDirectoryFile * CreateAndChangeTo_ActionDirectory(void)
static int ParticleCharge(Particle_t p)
bool Perform_Action(JEventLoop *locEventLoop, const DParticleCombo *locParticleCombo)
JApplication * japp
vector< const DKinematicData * > Get_MissingParticles(const DReaction *locReaction) const
bool Get_ClosestToTrack(const DReferenceTrajectory *rt, const vector< const DBCALShower * > &locBCALShowers, bool locCutFlag, double &locStartTime, shared_ptr< const DBCALShowerMatchParams > &locBestMatchParams, double *locStartTimeVariance=nullptr, DVector3 *locBestProjPos=nullptr, DVector3 *locBestProjMom=nullptr) const
DLorentzVector Get_SpacetimeVertex(void) const
vector< Particle_t > Get_MissingPIDs(int locStepIndex=-1, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
Definition: DReaction.cc:46
static double ParticleMass(Particle_t p)
double sqrt(double)
const DKinFitResults * Get_KinFitResults(void) const
const DParticleComboStep * Get_ParticleComboStep(size_t locStepIndex) const