All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
CLICPfoSelector.cc
Go to the documentation of this file.
1 #include "CLICPfoSelector.h"
2 
3 #include <EVENT/LCCollection.h>
4 #include <EVENT/MCParticle.h>
5 #include <EVENT/SimTrackerHit.h>
6 #include <EVENT/Track.h>
7 #include <EVENT/TrackerHit.h>
8 
9 #include <IMPL/LCCollectionVec.h>
10 
11 #include <CalorimeterHitType.h>
12 #include <marlinutil/GeometryUtil.h>
13 
14 #include <cmath>
15 #include <limits>
16 
17 using namespace lcio;
18 using namespace marlin;
19 
20 const int precision = 2;
21 const int widthFloat = 7;
22 const int widthInt = 5;
23 
25 
26 CLICPfoSelector::CLICPfoSelector() : Processor("CLICPfoSelector") {
27  _description = "Selects Pfos from full PFO list using timing cuts";
28 
29  // Input pfo collections
30 
31  registerInputCollection(LCIO::RECONSTRUCTEDPARTICLE, "InputPfoCollection", "Input PFO Collection", m_inputPfoCollection,
32  std::string("PandoraPFANewPFOs"));
33 
34  // Output pfo collection
35  registerOutputCollection(LCIO::RECONSTRUCTEDPARTICLE, "SelectedPfoCollection", "Selected pfo collection name",
36  m_selectedPfoCollection, std::string("SelectedPandoraPFANewPFOs"));
37 
38  registerProcessorParameter("Monitoring", "Monitoring", m_monitoring, int(0));
39 
40  registerProcessorParameter("DisplaySelectedPfos", "DisplaySelectedPfos", m_displaySelectedPfos, int(0));
41 
42  registerProcessorParameter("DisplayRejectedPfos", "DisplayRejectedPfos", m_displayRejectedPfos, int(0));
43 
44  registerProcessorParameter("CorrectHitTimesForTimeOfFlight", "CorrectHitTimesForTimeOfFlight",
46 
47  registerProcessorParameter("MonitoringPfoEnergyToDisplay", "MonitoringPfoEnergyToDisplay", m_monitoringPfoEnergyToDisplay,
48  float(1.0));
49 
50  registerProcessorParameter("CheckProtonCorrection", "CheckProtonCorrection", m_checkProtonCorrection, int(0));
51 
52  registerProcessorParameter("CheckKaonCorrection", "CheckKaonCorrection", m_checkKaonCorrection, int(0));
53 
54  registerProcessorParameter("KeepKShorts", "KeepKShorts", m_keepKShorts, int(1));
55 
56  registerProcessorParameter("UseNeutronTiming", "UseNeutronTiming", m_useNeutronTiming, int(0));
57 
58  registerProcessorParameter("MinimumEnergyForNeutronTiming", "MinimumEnergyForNeutronTiming",
60 
61  registerProcessorParameter("ForwardCosThetaForHighEnergyNeutralHadrons", "ForwardCosThetaForHighEnergyNeutralHadrons",
63 
64  registerProcessorParameter("ForwardHighEnergyNeutralHadronsEnergy", "ForwardHighEnergyNeutralHadronsEnergy",
66 
67  registerProcessorParameter("FarForwardCosTheta", "FarForwardCosTheta", m_farForwardCosTheta, float(0.975));
68 
69  registerProcessorParameter("PtCutForTightTiming", "PtCutForTightTiming", m_ptCutForTightTiming, float(0.75));
70 
71  registerProcessorParameter("PhotonPtCut", "PhotonPtCut", m_photonPtCut, float(0.0));
72 
73  registerProcessorParameter("PhotonPtCutForLooseTiming", "PhotonPtCutForLooseTiming", m_photonPtCutForLooseTiming,
74  float(4.0));
75 
76  registerProcessorParameter("PhotonLooseTimingCut", "PhotonLooseTimingCut", m_photonLooseTimingCut, float(2.0));
77 
78  registerProcessorParameter("PhotonTightTimingCut", "PhotonTightTimingCut", m_photonTightTimingCut, float(1.0));
79 
80  registerProcessorParameter("ChargedPfoPtCut", "ChargedPfoPtCut", m_chargedPfoPtCut, float(0.0));
81 
82  registerProcessorParameter("ChargedPfoPtCutForLooseTiming", "ChargedPfoPtCutForLooseTiming",
84 
85  registerProcessorParameter("ChargedPfoLooseTimingCut", "ChargedPfoLooseTimingCut", m_chargedPfoLooseTimingCut, float(3.0));
86 
87  registerProcessorParameter("ChargedPfoTightTimingCut", "ChargedPfoTightTimingCut", m_chargedPfoTightTimingCut, float(1.5));
88 
89  registerProcessorParameter("ChargedPfoNegativeLooseTimingCut", "ChargedPfoNegativeLooseTimingCut",
91 
92  registerProcessorParameter("ChargedPfoNegativeTightTimingCut", "ChargedPfoNegativeTightTimingCut",
94 
95  registerProcessorParameter("NeutralHadronPtCut", "NeutralHadronPtCut", m_neutralHadronPtCut, float(0.0));
96 
97  registerProcessorParameter("NeutralHadronPtCutForLooseTiming", "NeutralHadronPtCutForLooseTiming",
99 
100  registerProcessorParameter("NeutralHadronLooseTimingCut", "NeutralHadronLooseTimingCut", m_neutralHadronLooseTimingCut,
101  float(2.5));
102 
103  registerProcessorParameter("NeutralHadronTightTimingCut", "NeutralHadronTightTimingCut", m_neutralHadronTightTimingCut,
104  float(1.5));
105 
106  registerProcessorParameter("NeutralFarForwardLooseTimingCut", "NeutralFarForwardLooseTimingCut",
108 
109  registerProcessorParameter("NeutralFarForwardTightTimingCut", "NeutralFarForwardTightTimingCut",
111 
112  registerProcessorParameter("PhotonFarForwardLooseTimingCut", "PhotonFarForwardLooseTimingCut",
114 
115  registerProcessorParameter("PhotonFarForwardTightTimingCut", "PhotonFarForwardTightTimingCut",
117 
118  registerProcessorParameter("HCalBarrelLooseTimingCut", "HCalBarrelLooseTimingCut", m_hCalBarrelLooseTimingCut,
119  float(20.0));
120 
121  registerProcessorParameter("HCalBarrelTightTimingCut", "HCalBarrelTightTimingCut", m_hCalBarrelTightTimingCut,
122  float(10.0));
123 
124  registerProcessorParameter("HCalEndCapTimingFactor", "HCalEndCapTimingFactor", m_hCalEndCapTimingFactor, float(1.0));
125 
126  registerProcessorParameter("NeutralHadronBarrelPtCutForLooseTiming", "NeutralHadronBarrelPtCutForLooseTiming",
128 
129  registerProcessorParameter("MinECalHitsForTiming", "MinECalHitsForTiming", m_minECalHitsForTiming, int(5));
130 
131  registerProcessorParameter("MinHCalEndCapHitsForTiming", "MinHCalEndCapHitsForTiming", m_minHCalEndCapHitsForTiming,
132  int(5));
133 
134  registerProcessorParameter("UseClusterLessPfos", "UseClusterLessPfos", m_useClusterLessPfos, int(1));
135 
136  registerProcessorParameter("MinMomentumForClusterLessPfos", "MinMomentumForClusterLessPfos",
137  m_minMomentumForClusterLessPfos, float(0.5));
138 
139  registerProcessorParameter("MaxMomentumForClusterLessPfos", "MaxMomentumForClusterLessPfos",
140  m_maxMomentumForClusterLessPfos, float(2.0));
141 
142  registerProcessorParameter("MinPtForClusterLessPfos", "MinPtForClusterLessPfos", m_minPtForClusterLessPfos, float(0.5));
143 
144  registerProcessorParameter("ClusterLessPfoTrackTimeCut", "ClusterLessPfoTrackTimeCut", m_clusterLessPfoTrackTimeCut,
145  float(10.0));
146 }
147 
149  printParameters();
150  _nRun = -1;
151  _nEvt = 0;
152 
153  _bField = MarlinUtil::getBzAtOrigin();
154 }
155 
157  _nRun++;
158  _nEvt = 0;
159  streamlog_out(DEBUG) << std::endl;
160  streamlog_out(DEBUG) << "CLICPfoSelector ---> new run : run number = " << _nRun << std::endl;
161 }
162 
163 void CLICPfoSelector::processEvent(LCEvent* evt) {
164  streamlog_out(DEBUG) << "CLICPfoSelector -> run = " << _nRun << " event = " << _nEvt << std::endl;
165 
166  LCCollectionVec* colPFO = new LCCollectionVec(LCIO::RECONSTRUCTEDPARTICLE);
167  colPFO->setSubset(true);
168 
169  // if we want to point back to the hits we need to set the flag
170 
171  // Reading PFOs
172 
173  try {
174  LCCollection* col = evt->getCollection(m_inputPfoCollection.c_str());
175  int nelem = col->getNumberOfElements();
176  PfoUtil::PfoList pfos;
177 
178  for (int iPfo = 0; iPfo < nelem; ++iPfo)
179  pfos.push_back(static_cast<ReconstructedParticle*>(col->getElementAt(iPfo)));
180  std::sort(pfos.begin(), pfos.end(), PfoUtil::PfoSortFunction);
181 
182  if (m_monitoring) {
183  streamlog_out(MESSAGE) << std::endl;
184  streamlog_out(MESSAGE) << "Number of Input Pfos = " << nelem << std::endl;
185  streamlog_out(MESSAGE) << " Type PDG E Pt cosTheta #trk time #Clu time ecal hcal "
186  << std::endl;
187  }
188  // int nDropped(0);
189 
190  float eTotalInput(0.);
191  float eTotalOutput(0.);
192 
193  for (int iPfo = 0; iPfo < nelem; ++iPfo) {
194  bool passPfoSelection = true;
195  ReconstructedParticle* pPfo = pfos[iPfo];
196  // const int id = pPfo->id();
197  const int type = pPfo->getType();
198  // const bool isCompound = pPfo->isCompound();
199  float momentum[3];
200  for (unsigned int i = 0; i < 3; i++)
201  momentum[i] = pPfo->getMomentum()[i];
202  const float pT_pfo = sqrt(momentum[0] * momentum[0] + momentum[1] * momentum[1]);
203  const float p_pfo = sqrt(pT_pfo * pT_pfo + momentum[2] * momentum[2]);
204  const float cosTheta = fabs(momentum[2]) / p_pfo;
205  const float energy = pPfo->getEnergy();
206  eTotalInput += energy;
207 
208  const ClusterVec clusters = pPfo->getClusters();
209  const TrackVec tracks = pPfo->getTracks();
210  //const Vertex startVertex(pPfo->getStartVertex());
211 
212  float trackTime = std::numeric_limits<float>::max();
213  float clusterTime = 999.;
214  float clusterTimeEcal = 999.;
215  float clusterTimeHcalEndcap = 999.;
216  int nEcalHits(0);
217  int nHcalEndCapHits(0);
218  int nCaloHits(0);
219  float tproton(0.);
220  float tkaon(0.);
221 
222  for (unsigned int i = 0; i < tracks.size(); i++) {
223  const Track* track = tracks[i];
224  const float d0 = track->getD0();
225  const float z0 = track->getZ0();
226  const float omega = track->getOmega();
227  const float tanL = track->getTanLambda();
228  const float phi0 = track->getPhi();
229 
230  HelixClass helix;
231  helix.Initialize_Canonical(phi0, d0, z0, omega, tanL, _bField);
232  const float px = helix.getMomentum()[0];
233  const float py = helix.getMomentum()[1];
234  const float pz = helix.getMomentum()[2];
235  const float p = sqrt(px * px + py * py + pz * pz);
236  float tof;
237  const float time = PfoUtil::TimeAtEcal(track, tof);
238  if (fabs(time) < trackTime) {
239  trackTime = time;
240  const float cproton = sqrt((p * p + 0.94 * 0.94) / (p * p + 0.14 * 0.14));
241  const float ckaon = sqrt((p * p + 0.49 * 0.49) / (p * p + 0.14 * 0.14));
242  tproton = (trackTime + tof) * (cproton - 1);
243  tkaon = (trackTime + tof) * (ckaon - 1);
244  }
245  }
246 
247  for (unsigned int i = 0; i < clusters.size(); i++) {
248  float meanTime(999.);
249  float meanTimeEcal(999.);
250  float meanTimeHcalEndcap(999.);
251  int nEcal(0);
252  int nHcalEnd(0);
253  int nCaloHitsUsed(0);
254 
255  const Cluster* cluster = clusters[i];
256  PfoUtil::GetClusterTimes(cluster, meanTime, nCaloHitsUsed, meanTimeEcal, nEcal, meanTimeHcalEndcap, nHcalEnd,
258 
259  // correct for track propagation time
260  if (!tracks.empty()) {
261  meanTime -= trackTime;
262  meanTimeEcal -= trackTime;
263  meanTimeHcalEndcap -= trackTime;
264  }
265 
266  if (fabs(meanTime) < clusterTime) {
267  clusterTime = meanTime;
268  nCaloHits = nCaloHitsUsed;
269  }
270  if (fabs(meanTimeEcal) < clusterTimeEcal) {
271  clusterTimeEcal = meanTimeEcal;
272  nEcalHits = nEcal;
273  }
274  if (fabs(meanTimeHcalEndcap) < clusterTimeHcalEndcap) {
275  clusterTimeHcalEndcap = meanTimeHcalEndcap;
276  nHcalEndCapHits = nHcalEnd;
277  }
278  }
279 
280  // now make selection
281 
282  float ptCut(m_neutralHadronPtCut);
283  float ptCutForLooseTiming(m_neutralHadronPtCutForLooseTiming);
284  float timingCutLow(0.);
285  float timingCutHigh(m_neutralHadronLooseTimingCut);
286  float hCalBarrelTimingCut(m_hCalBarrelLooseTimingCut);
287  if (cosTheta > m_farForwardCosTheta)
288  timingCutHigh = m_neutralFarForwardLooseTimingCut;
289 
290  // Neutral hadron cuts
291  if (pT_pfo <= m_ptCutForTightTiming) {
292  timingCutHigh = m_neutralHadronTightTimingCut;
293  hCalBarrelTimingCut = m_hCalBarrelTightTimingCut;
294  if (cosTheta > m_farForwardCosTheta)
295  timingCutHigh = m_neutralFarForwardTightTimingCut;
296  }
297 
298  // Photon cuts
299  if (type == 22) {
300  ptCut = m_photonPtCut;
301  ptCutForLooseTiming = m_photonPtCutForLooseTiming;
302  timingCutHigh = m_photonLooseTimingCut;
303  if (cosTheta > m_farForwardCosTheta)
304  timingCutHigh = m_photonFarForwardLooseTimingCut;
305 
306  if (pT_pfo <= m_ptCutForTightTiming) {
307  timingCutHigh = m_photonTightTimingCut;
308  if (cosTheta > m_farForwardCosTheta)
309  timingCutHigh = m_photonFarForwardTightTimingCut;
310  }
311  }
312 
313  // Charged PFO cuts
314  if (!tracks.empty()) {
315  ptCut = m_chargedPfoPtCut;
316  ptCutForLooseTiming = m_chargedPfoPtCutForLooseTiming;
317  timingCutLow = m_chargedPfoNegativeLooseTimingCut;
318  timingCutHigh = m_chargedPfoLooseTimingCut;
319  if (pT_pfo <= m_ptCutForTightTiming) {
320  timingCutLow = m_chargedPfoNegativeTightTimingCut;
321  timingCutHigh = m_chargedPfoTightTimingCut;
322  }
323  }
324 
325  // Reject low pt pfos (default is to set ptcut to zero)
326  if (pT_pfo < ptCut) {
327  passPfoSelection = false;
328  }
329 
330  // Reject out of time clusterless tracks
331  if (clusters.empty() && fabs(trackTime) > m_clusterLessPfoTrackTimeCut) {
332  passPfoSelection = false;
333  }
334 
335  const float pfoEnergyToDisplay(m_monitoring ? m_monitoringPfoEnergyToDisplay : std::numeric_limits<float>::max());
336 
337  // Only apply cuts to low pt pfos and very forward neutral hadrons
338  bool applyTimingCuts =
339  ((pT_pfo < ptCutForLooseTiming) || ((cosTheta > m_forwardCosThetaForHighEnergyNeutralHadrons) && (type == 2112)));
340  bool useHcalTimingOnly = ((cosTheta > m_forwardCosThetaForHighEnergyNeutralHadrons) && (type == 2112) &&
342 
343  if (passPfoSelection && applyTimingCuts) {
344  // Examine any associated clusters for additional timing information
345  bool selectPfo(false);
346  // Require any cluster to be "in time" to select pfo
347  if (!clusters.empty()) {
348  // Make the selection decisions
349  if (!useHcalTimingOnly && ((nEcalHits > m_minECalHitsForTiming) || (nEcalHits >= nCaloHits / 2.))) {
350  if ((clusterTimeEcal >= timingCutLow) && (clusterTimeEcal <= timingCutHigh))
351  selectPfo = true;
352  } else if (type == 22) {
353  if ((clusterTime >= timingCutLow) && (clusterTime <= timingCutHigh))
354  selectPfo = true;
355  } else if ((nHcalEndCapHits >= m_minHCalEndCapHitsForTiming) || (nHcalEndCapHits >= nCaloHits / 2.)) {
356  if ((clusterTimeHcalEndcap >= timingCutLow) &&
357  (clusterTimeHcalEndcap <= (m_hCalEndCapTimingFactor * timingCutHigh)))
358  selectPfo = true;
359  } else {
360  if ((clusterTime >= timingCutLow) && (clusterTime < hCalBarrelTimingCut))
361  selectPfo = true;
362 
363  if (tracks.empty() && (pT_pfo > m_neutralHadronBarrelPtCutForLooseTiming))
364  selectPfo = true;
365  }
366 
367  // keep KShorts
368  if (m_keepKShorts && type == 310) {
369  if (!selectPfo && m_monitoring && m_displayRejectedPfos)
370  streamlog_out(MESSAGE) << " Recovered KS : " << energy << std::endl;
371  selectPfo = true;
372  }
373  // check kaon and proton hypotheses
374  if (nEcalHits > m_minECalHitsForTiming) {
375  if (m_checkProtonCorrection && (clusterTimeEcal - tproton >= timingCutLow) &&
376  (clusterTimeEcal - tproton <= timingCutHigh)) {
377  if (!selectPfo && m_monitoring && m_displayRejectedPfos)
378  streamlog_out(MESSAGE) << " Recovered proton : " << energy << std::endl;
379  selectPfo = true;
380  }
381  if (m_checkKaonCorrection && (clusterTimeEcal - tkaon >= timingCutLow) &&
382  (clusterTimeEcal - tkaon <= timingCutHigh)) {
383  if (!selectPfo && m_monitoring && m_displayRejectedPfos)
384  streamlog_out(MESSAGE) << " Recovered kaon : " << energy << std::endl;
385  selectPfo = true;
386  }
387  }
388  } else {
389  // No clusters form part of this pfo - no additional timing information
391  pT_pfo > m_minPtForClusterLessPfos)
392  selectPfo = m_useClusterLessPfos;
393  }
394 
395  if (!selectPfo)
396  passPfoSelection = false;
397  }
398 
399  if (m_monitoring && (energy > pfoEnergyToDisplay)) {
400  if ((passPfoSelection && m_displaySelectedPfos) || (!passPfoSelection && m_displayRejectedPfos)) {
401  std::stringstream output;
402  output << std::fixed;
403  output << std::setprecision(precision);
404  if (passPfoSelection) {
405  output << " Selected PFO : ";
406  } else {
407  output << " Rejected PFO : ";
408  }
409  if (clusters.size() == 0)
410  FORMATTED_OUTPUT_TRACK_CLUSTER_full(output, type, energy, pT_pfo, cosTheta, tracks.size(), trackTime, "-", "-",
411  "-", "-");
412  if (tracks.size() == 0)
413  FORMATTED_OUTPUT_TRACK_CLUSTER_full(output, type, energy, pT_pfo, cosTheta, "", "-", clusters.size(),
414  clusterTime, clusterTimeEcal, clusterTimeHcalEndcap);
415  if (tracks.size() > 0 && clusters.size() > 0)
416  FORMATTED_OUTPUT_TRACK_CLUSTER_full(output, type, energy, pT_pfo, cosTheta, tracks.size(), trackTime,
417  clusters.size(), clusterTime, clusterTimeEcal, clusterTimeHcalEndcap);
418  streamlog_out(MESSAGE) << output.str();
419  }
420  }
421  if (passPfoSelection) {
422  eTotalOutput += energy;
423  colPFO->addElement(pPfo);
424  } else {
425  //streamlog_out( MESSAGE ) << " dropped E = " << energy << std::endl;
426  }
427  }
428 
429  if (m_monitoring) {
430  streamlog_out(MESSAGE) << " Total PFO energy in = " << eTotalInput << " GeV " << std::endl;
431  streamlog_out(MESSAGE) << " Total PFO energy out = " << eTotalOutput << " GeV " << std::endl;
432  }
433  } catch (DataNotAvailableException& e) {
434  streamlog_out(MESSAGE) << m_inputPfoCollection.c_str() << " collection is unavailable" << std::endl;
435  };
436 
437  evt->addCollection(colPFO, m_selectedPfoCollection.c_str());
438 
439  CleanUp();
440 
441  _nEvt++;
442 }
443 
445 
446 void CLICPfoSelector::check(LCEvent*) {}
447 
const int precision
float m_chargedPfoNegativeTightTimingCut
The charged hadron tight low timing cut.
#define FORMATTED_OUTPUT_TRACK_CLUSTER_full(out, N1, E1, E2, E3, N2, E4, N3, E5, E6, E7)
Definition: PfoUtilities.h:21
const int widthInt
std::string m_selectedPfoCollection
Output PFO collection name.
virtual void check(LCEvent *evt)
float m_farForwardCosTheta
Value of cos theta identifying the detector forward region.
virtual void end()
float m_neutralHadronTightTimingCut
The neutral hadron tight high timing cut.
float m_neutralHadronBarrelPtCutForLooseTiming
pt above which loose timing cuts are applied to neutral hadrons in barrel
int m_checkProtonCorrection
Check proton hypothesis.
int m_checkKaonCorrection
Check charged hypothesis.
float m_ptCutForTightTiming
The pt value below which tight timing cuts are used.
CLICPfoSelector aCLICPfoSelector
int m_monitoring
Whether to display monitoring information.
float m_clusterLessPfoTrackTimeCut
Maximum arrival time at Ecal for cluster-less pfo.
float TimeAtEcal(const Track *pTrack, float &tof)
Definition: PfoUtilities.cc:19
float m_photonFarForwardLooseTimingCut
The photon loose high timing cut for the forward region.
float m_minimumEnergyForNeutronTiming
Minimum energy for attempted neutron timing correction.
int m_useNeutronTiming
Attempt to make a (dubious) neutron timing correction.
float m_chargedPfoPtCut
The basic pt cut for a charged hadron pfo.
std::vector< EVENT::ReconstructedParticle * > PfoList
Definition: PfoUtilities.h:48
int m_minHCalEndCapHitsForTiming
Minimum hcal endcap hits in order to use hcal endcap timing info.
int m_useClusterLessPfos
Whether to accept any cluster-less pfos.
float m_neutralHadronLooseTimingCut
The neutral hadron loose high timing cut.
float m_chargedPfoPtCutForLooseTiming
The charged hadron pt value below which tight timing cuts are used.
float m_maxMomentumForClusterLessPfos
Minimum momentum for a cluster-less pfo.
float m_neutralFarForwardLooseTimingCut
The neutral hadron loose high timing cut for the forward region.
int m_correctHitTimesForTimeOfFlight
Correct hit times for straight line time of flight.
float m_chargedPfoLooseTimingCut
The charged hadron loose high timing cut.
virtual void processEvent(LCEvent *evt)
float m_neutralHadronPtCut
The basic pt cut for a neutral hadron pfo.
float m_photonPtCutForLooseTiming
The photon pt value below which tight timing cuts are used.
=== CLICPfoSelector Processor === Processor to select good pfos based on timing ...
float m_hCalBarrelLooseTimingCut
The loose timing cut for hits predominantly in hcal barrel.
float m_chargedPfoTightTimingCut
The charged hadron tight high timing cut.
float m_minMomentumForClusterLessPfos
Minimum momentum for a cluster-less pfo.
int m_minECalHitsForTiming
Minimum ecal hits in order to use ecal timing info.
float m_hCalBarrelTightTimingCut
The tight timing cut for hits predominantly in hcal barrel.
static const float e
const int widthFloat
float m_forwardCosThetaForHighEnergyNeutralHadrons
Forward region of HCAL where timing cuts will be applied to all neutral hadrons.
int m_displaySelectedPfos
Whether to display monitoring information concerning selected pfos.
virtual void init()
static bool PfoSortFunction(EVENT::ReconstructedParticle *lhs, EVENT::ReconstructedParticle *rhs)
Definition: PfoUtilities.h:50
std::vector< LCCollection * > LCCollectionVec
Definition: SiStripClus.h:55
void GetClusterTimes(const Cluster *cluster, float &meanTime, int &nCaloHitsUsed, float &meanTimeEcal, int &nEcal, float &meanTimeHcalEndcap, int &nHcalEnd, bool correctHitTimesForTimeOfFlight)
Definition: PfoUtilities.cc:49
float m_neutralFarForwardTightTimingCut
The neutral hadron tight high timing cut for the forward region.
int m_displayRejectedPfos
Whether to display monitoring information concerning rejected pfos.
float m_photonPtCut
The basic pt cut for a photon pfo.
float m_minPtForClusterLessPfos
Minimum pT for a cluster-less pfo.
float m_forwardHighEnergyNeutralHadronsEnergy
Energy cut for specific HCAL timing requirements cuts for neutral hadrons.
float m_neutralHadronPtCutForLooseTiming
The neutral hadron pt value below which tight timing cuts are used.
float m_monitoringPfoEnergyToDisplay
Minimum pfo energy in order to display monitoring information.
std::string m_inputPfoCollection
Input PFO collection name.
float m_hCalEndCapTimingFactor
Factor by which high timing cut is multiplied for hcal barrel hits.
float m_photonTightTimingCut
The photon tight high timing cut.
int m_keepKShorts
Keep kshorts.
virtual void processRunHeader(LCRunHeader *run)
float m_photonFarForwardTightTimingCut
The photon tight high timing cut for the forward region.
float m_chargedPfoNegativeLooseTimingCut
The charged hadron loose low timing cut.
float m_photonLooseTimingCut
The photon loose high timing cut.