All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CRHitRemoval_module.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Class: CRHitRemoval
4 // Module Type: producer
5 // File: CRHitRemoval_module.cc
6 //
7 // This module produces RecoBase/Hit objects after removing those
8 // deemed to be due to CR muons.
9 //
10 // Configuration parameters:
11 //
12 // CosmicProducerLabels - a list of cosmic ray producers which should be or'ed
13 // HitProducerLabel - the producer of the recob::Hit objects
14 // PFParticleProducerLabel - the producer of the recob::PFParticles to consider
15 // TrackProducerLabel - the producer of the recob::Track objects
16 // CosmicTagThresholds - a vector of thresholds to apply to label as cosmic
17 // EndTickPadding - # ticks to "pad" the end tick to account for possible
18 // uncertainty in drift velocity
19 //
20 // Created by Tracy Usher (usher@slac.stanford.edu) on September 18, 2014
21 //
22 ////////////////////////////////////////////////////////////////////////
23 
24 #include <algorithm>
25 
26 #include "art/Framework/Core/EDProducer.h"
27 #include "art/Framework/Core/ModuleMacros.h"
28 #include "art/Framework/Principal/Event.h"
29 #include "art/Framework/Principal/Handle.h"
30 #include "art/Framework/Services/Registry/ServiceHandle.h"
31 #include "canvas/Persistency/Common/Assns.h"
32 #include "canvas/Persistency/Common/FindManyP.h"
33 #include "canvas/Persistency/Common/FindOneP.h"
34 #include "canvas/Persistency/Common/Ptr.h"
35 #include "messagefacility/MessageLogger/MessageLogger.h"
36 
47 
48 class CRHitRemoval : public art::EDProducer {
49 public:
50  // Copnstructors, destructor.
51  explicit CRHitRemoval(fhicl::ParameterSet const& pset);
52 
53  // Overrides.
54  virtual void produce(art::Event& e);
55  virtual void beginJob();
56  virtual void endJob();
57 
58 private:
59  // define vector for hits to make sure of uniform use
60  using HitPtrVector = std::vector<art::Ptr<recob::Hit>>;
61 
62  // Methods
63  void collectPFParticleHits(const recob::PFParticle* pfParticle,
64  const art::Handle<std::vector<recob::PFParticle>>& pfParticleHandle,
65  const art::FindManyP<recob::Cluster>& partToClusAssns,
66  const art::FindManyP<recob::Hit>& clusToHitAssns,
67  HitPtrVector& hitVec);
68 
69  void copyAllHits(std::vector<art::Ptr<recob::Hit>>&,
70  art::FindOneP<recob::Wire>&,
72 
73  void copyInTimeHits(std::vector<art::Ptr<recob::Hit>>&,
74  art::FindOneP<recob::Wire>&,
76 
77  void FilterHits(HitPtrVector& hits, HitPtrVector& used_hits);
78 
79  // Fcl parameters.
80  std::vector<std::string> fCosmicProducerLabels; ///< List of cosmic tagger producers
81  std::string fHitProducerLabel; ///< The full collection of hits
82  std::string fPFParticleProducerLabel; ///< PFParticle producer
83  std::vector<std::string> fTrackProducerLabels; ///< Track producer
84  std::vector<std::string> fAssnProducerLabels; ///< Track to PFParticle assns producer
85 
86  std::vector<double> fCosmicTagThresholds; ///< Thresholds for tagging
87 
88  int fEndTickPadding; ///< Padding the end tick
89 
90  int fDetectorWidthTicks; ///< Effective drift time in ticks
91  int fMinTickDrift; ///< Starting tick
92  int fMaxTickDrift; ///< Ending tick
93  int fMaxOutOfTime; ///< Max hits that can be out of time before rejecting
94 
95  // Statistics.
96  int fNumEvent; ///< Number of events seen.
97  int fNumCRRejects; ///< Number of tracks produced.
98 };
99 
100 DEFINE_ART_MODULE(CRHitRemoval)
101 
102 //----------------------------------------------------------------------------
103 /// Constructor.
104 ///
105 /// Arguments:
106 ///
107 /// pset - Fcl parameters.
108 ///
109 CRHitRemoval::CRHitRemoval(fhicl::ParameterSet const& pset)
110  : EDProducer{pset}, fNumEvent(0), fNumCRRejects(0)
111 {
112  fCosmicProducerLabels = pset.get<std::vector<std::string>>("CosmicProducerLabels");
113  fHitProducerLabel = pset.get<std::string>("HitProducerLabel");
114  fPFParticleProducerLabel = pset.get<std::string>("PFParticleProducerLabel");
115  fTrackProducerLabels = pset.get<std::vector<std::string>>("TrackProducerLabels");
116  fAssnProducerLabels = pset.get<std::vector<std::string>>("AssnProducerLabels");
117  fCosmicTagThresholds = pset.get<std::vector<double>>("CosmicTagThresholds");
118  fEndTickPadding = pset.get<int>("EndTickPadding", 50);
119  fMaxOutOfTime = pset.get<int>("MaxOutOfTime", 4);
120 
121  // let HitCollectionCreator declare that we are going to produce
122  // hits and associations with wires and raw digits
123  // (with no particular product label)
124  recob::HitCollectionCreator::declare_products(producesCollector(), "", true, false);
125 
126  // Report.
127  mf::LogInfo("CRHitRemoval") << "CRHitRemoval configured\n";
128 }
129 
130 //----------------------------------------------------------------------------
131 /// Begin job method.
132 void
134 {
135  auto const* geo = lar::providerFrom<geo::Geometry>();
136  auto const clock_data = art::ServiceHandle<detinfo::DetectorClocksService const>()->DataForJob();
137  auto const detp =
138  art::ServiceHandle<detinfo::DetectorPropertiesService const>()->DataForJob(clock_data);
139 
140  float const samplingRate = sampling_rate(clock_data);
141  float const driftVelocity = detp.DriftVelocity(detp.Efield(), detp.Temperature()); // cm/us
142 
143  fDetectorWidthTicks = 2 * geo->DetHalfWidth() / (driftVelocity * samplingRate / 1000);
144  fMinTickDrift =
145  clock_data.Time2Tick(clock_data.TriggerTime()); // this is the hardware trigger time
147 }
148 
149 //----------------------------------------------------------------------------
150 /// Produce method.
151 ///
152 /// Arguments:
153 ///
154 /// evt - Art event.
155 ///
156 /// This is the primary method. The goal is to produce a list of recob::Hit
157 /// objects which are a "clean" subset of all hits and which are believed to
158 /// be due to a neutrino interaction. It does this by considering input CosmicTag
159 /// objects, relating them to PFParticles/Tracks and removing the hits
160 /// associated to those objects which are believed to be Cosmic Rays.
161 ///
162 void
164 {
165  ++fNumEvent;
166 
167  // Start by looking up the original hits
168  art::Handle<std::vector<recob::Hit>> hitHandle;
169  evt.getByLabel(fHitProducerLabel, hitHandle);
170 
171  // If there are no hits then there should be no output
172  if (!hitHandle.isValid()) return;
173 
174  // also get the associated wires
175  // Note that we no longer assume RawDigit associations and will not preserve them if they exist
176  // we assume they have been created by the same module as the hits
177  art::FindOneP<recob::Wire> ChannelHitWires(hitHandle, evt, fHitProducerLabel);
178 
179  HitPtrVector ChHits;
180  art::fill_ptr_vector(ChHits, hitHandle);
181 
182  // this object contains the hit collection
183  // and its associations to wires and raw digits:
184  recob::HitCollectionCreator hcol(evt, ChannelHitWires.isValid(), false);
185 
186  // Now recover thre remaining collections of objects in the event store that we need
187  // Recover the PFParticles that are ultimately associated to tracks
188  // This will be the key to recovering the hits
189  art::Handle<std::vector<recob::PFParticle>> pfParticleHandle;
190  evt.getByLabel(fPFParticleProducerLabel, pfParticleHandle);
191 
192  // Without a valid collection of PFParticles we can't do the hit removal
193  if (!pfParticleHandle.isValid()) {
194  copyAllHits(ChHits, ChannelHitWires, hcol);
195 
196  // put the hit collection and associations into the event
197  hcol.put_into(evt);
198 
199  return;
200  }
201 
202  // Recover the clusters so we can do associations to the hits
203  // In theory the clusters come from the same producer as the PFParticles
204  art::Handle<std::vector<recob::Cluster>> clusterHandle;
205  evt.getByLabel(fPFParticleProducerLabel, clusterHandle);
206 
207  // If there are no clusters then something is really wrong
208  if (!clusterHandle.isValid()) {
209  copyAllHits(ChHits, ChannelHitWires, hcol);
210 
211  // put the hit collection and associations into the event
212  hcol.put_into(evt);
213 
214  return;
215  }
216 
217  // Build the list of cosmic tag producers, associations and thresholds
218  std::vector<art::Handle<std::vector<anab::CosmicTag>>> cosmicHandleVec;
219  std::vector<std::map<int, std::vector<art::Ptr<recob::Track>>>> cosmicToTrackVecMapVec;
220  std::vector<std::map<int, std::vector<art::Ptr<recob::PFParticle>>>> trackToPFParticleVecMapVec;
221  std::vector<double> thresholdVec;
222 
223  for (size_t idx = 0; idx != fCosmicProducerLabels.size(); idx++) {
224  std::string& handleLabel(fCosmicProducerLabels[idx]);
225 
226  art::Handle<std::vector<anab::CosmicTag>> cosmicHandle;
227  evt.getByLabel(handleLabel, cosmicHandle);
228 
229  if (cosmicHandle.isValid()) {
230  // Look up the associations to tracks
231  art::FindManyP<recob::Track> cosmicTrackAssns(cosmicHandle, evt, handleLabel);
232 
233  // Get the handle to the tracks
234  art::Handle<std::vector<recob::Track>> trackHandle;
235  evt.getByLabel(fTrackProducerLabels[idx], trackHandle);
236 
237  // This should be the case
238  if (trackHandle.isValid()) {
239  std::map<int, std::vector<art::Ptr<recob::Track>>> cosmicToTrackVecMap;
240  std::map<int, std::vector<art::Ptr<recob::PFParticle>>> trackToPFParticleVecMap;
241 
242  // Loop through the cosmic tags
243  for (size_t cosmicIdx = 0; cosmicIdx < cosmicHandle->size(); cosmicIdx++) {
244  art::Ptr<anab::CosmicTag> cosmicTag(cosmicHandle, cosmicIdx);
245 
246  std::vector<art::Ptr<recob::Track>> cosmicToTrackVec =
247  cosmicTrackAssns.at(cosmicTag.key());
248 
249  cosmicToTrackVecMap[cosmicTag.key()] = cosmicToTrackVec;
250 
251  art::FindManyP<recob::PFParticle> trackPFParticleAssns(
252  trackHandle, evt, fAssnProducerLabels[idx]);
253 
254  for (auto& track : cosmicToTrackVec) {
255  std::vector<art::Ptr<recob::PFParticle>> trackToPFParticleVec =
256  trackPFParticleAssns.at(track.key());
257 
258  for (auto& pfParticle : trackToPFParticleVec)
259  trackToPFParticleVecMap[track.key()].push_back(pfParticle);
260  }
261  }
262 
263  // Store these collections
264  cosmicHandleVec.emplace_back(cosmicHandle);
265  cosmicToTrackVecMapVec.emplace_back(cosmicToTrackVecMap);
266  trackToPFParticleVecMapVec.emplace_back(trackToPFParticleVecMap);
267  thresholdVec.push_back(fCosmicTagThresholds[idx]);
268  }
269  }
270  }
271 
272  // No cosmic tags then nothing to do here
273  if (cosmicHandleVec.empty()) {
274  copyAllHits(ChHits, ChannelHitWires, hcol);
275 
276  // put the hit collection and associations into the event
277  hcol.put_into(evt);
278 
279  return;
280  }
281 
282  // Now we walk up the remaining list of associations needed to go from CR tags to hits
283  // We'll need to go from tracks to PFParticles
284  // From PFParticles we go to clusters
285  art::FindManyP<recob::Cluster> clusterAssns(pfParticleHandle, evt, fPFParticleProducerLabel);
286 
287  // Likewise, recover the collection of associations to hits
288  art::FindManyP<recob::Hit> clusterHitAssns(clusterHandle, evt, fPFParticleProducerLabel);
289 
290  // No point double counting hits
291  std::set<const recob::PFParticle*> taggedSet;
292 
293  // Start the identification of hits to remove. The outer loop is over the various producers of
294  // the CosmicTag objects we're examininig
295  for (size_t idx = 0; idx != cosmicHandleVec.size(); idx++) {
296  // Obviously, dereference the handle and associations
297  const art::Handle<std::vector<anab::CosmicTag>>& cosmicHandle(cosmicHandleVec[idx]);
298  const std::map<int, std::vector<art::Ptr<recob::Track>>>& crTagTrackVec(
299  cosmicToTrackVecMapVec[idx]);
300  const std::map<int, std::vector<art::Ptr<recob::PFParticle>>>& trackToPFParticleVecMap(
301  trackToPFParticleVecMapVec[idx]);
302 
303  for (size_t crIdx = 0; crIdx != cosmicHandle->size(); crIdx++) {
304  art::Ptr<anab::CosmicTag> cosmicTag(cosmicHandle, crIdx);
305 
306  // If this was tagged as a CR muon then we have work to do!
307  if (cosmicTag->CosmicScore() > thresholdVec[idx]) {
308  // Recover the associated track
309  std::vector<art::Ptr<recob::Track>> trackVec(crTagTrackVec.at(cosmicTag.key()));
310 
311  // Loop over the tracks (almost always only 1)
312  for (const auto& track : trackVec) {
313  std::map<int, std::vector<art::Ptr<recob::PFParticle>>>::const_iterator
314  trackToPFParticleVecItr = trackToPFParticleVecMap.find(track.key());
315 
316  if (trackToPFParticleVecItr != trackToPFParticleVecMap.end()) {
317  // Loop through them
318  for (const auto& pfParticlePtr : trackToPFParticleVecItr->second) {
319  // Get bare pointer
320  const recob::PFParticle* pfParticle = pfParticlePtr.get();
321 
322  // A cosmic ray must be a primary (by fiat)
323  while (!pfParticle->IsPrimary())
324  pfParticle =
325  art::Ptr<recob::PFParticle>(pfParticleHandle, pfParticle->Parent()).get();
326 
327  // Add to our list of tagged PFParticles
328  taggedSet.insert(pfParticle);
329  }
330  }
331  }
332  }
333  }
334  }
335 
336  // If no PFParticles have been tagged then nothing to do
337  if (!taggedSet.empty()) {
338  // This may all seem backwards... but what you want to do is remove all the hits which are associated to tagged
339  // cosmic ray tracks/PFParticles and what you want to leave is all other hits. This includes hits on other PFParticles
340  // as well as unassociated (as yet) hits.
341  // One also needs to deal with a slight complication with hits in 2D which are shared between untagged PFParticles and
342  // tagged ones... we should leave these in.
343 
344  // All that is left is to go through the PFParticles which have not been tagged and collect up all their hits
345  // to output to our new collection
346  // Note that this SHOULD take care of the case of shared 2D hits automagically since if the PFParticle has not
347  // been tagged and it shares hits we'll pick those up here.
348  HitPtrVector taggedHits;
349  HitPtrVector untaggedHits;
350 
351  // Loop through the PFParticles and build out the list of hits on untagged PFParticle trees
352  for (const auto& pfParticle : *pfParticleHandle) {
353  // Start with only primaries
354  if (!pfParticle.IsPrimary()) continue;
355 
356  // Temporary container for these hits
357  HitPtrVector tempHits;
358 
359  // Find the hits associated to this untagged PFParticle
360  collectPFParticleHits(&pfParticle, pfParticleHandle, clusterAssns, clusterHitAssns, tempHits);
361 
362  // One more possible chance at identifying tagged hits...
363  // Check these hits to see if any lie outside time window
364  bool goodHits(true);
365 
366  if (taggedSet.find(&pfParticle) != taggedSet.end()) goodHits = false;
367 
368  if (goodHits) {
369  int nOutOfTime(0);
370 
371  for (const auto& hit : tempHits) {
372  // Check on out of time hits
373  if (hit->PeakTimeMinusRMS() < fMinTickDrift || hit->PeakTimePlusRMS() > fMaxTickDrift)
374  nOutOfTime++;
375 
376  if (nOutOfTime > fMaxOutOfTime) {
377  goodHits = false;
378  break;
379  }
380  }
381  }
382 
383  if (goodHits)
384  std::copy(tempHits.begin(), tempHits.end(), std::back_inserter(untaggedHits));
385  else
386  std::copy(tempHits.begin(), tempHits.end(), std::back_inserter(taggedHits));
387  }
388 
389  // First task - remove hits from the tagged hit collection that are inthe untagged hits (shared hits)
390  FilterHits(taggedHits, untaggedHits);
391 
392  // Now filter the tagged hits from the total hit collection
393  FilterHits(ChHits, taggedHits);
394  }
395 
396  // Copy our new hit collection to the output
397  copyInTimeHits(ChHits, ChannelHitWires, hcol);
398 
399  // put the hit collection and associations into the event
400  hcol.put_into(evt);
401 }
402 
403 //----------------------------------------------------------------------------
404 /// Find all hits in PFParticle hierarchy
405 ///
406 /// Arguments:
407 ///
408 /// pfParticle - the top level PFParticle to have hits removed
409 /// pfParticleHandle - handle to the PFParticle objects
410 /// partToClusAssns - list of PFParticle to Cluster associations
411 /// clusToHitAssns - list of Cluster to Hit associations
412 /// hitVec - the current list of hits
413 ///
414 /// This recursively called method will remove all hits associated to an input
415 /// PFParticle and, in addition, will call itself for all daughters of the input
416 /// PFParticle
417 ///
418 void
420  const recob::PFParticle* pfParticle,
421  const art::Handle<std::vector<recob::PFParticle>>& pfParticleHandle,
422  const art::FindManyP<recob::Cluster>& partToClusAssns,
423  const art::FindManyP<recob::Hit>& clusToHitAssns,
424  HitPtrVector& hitVec)
425 {
426  // Recover the clusters associated to the input PFParticle
427  std::vector<art::Ptr<recob::Cluster>> clusterVec = partToClusAssns.at(pfParticle->Self());
428 
429  int minTick(fMinTickDrift);
430  int maxTick(fMaxTickDrift);
431 
432  // Loop over the clusters and grab the associated hits
433  for (const auto& cluster : clusterVec) {
434  std::vector<art::Ptr<recob::Hit>> clusHitVec = clusToHitAssns.at(cluster.key());
435  hitVec.insert(hitVec.end(), clusHitVec.begin(), clusHitVec.end());
436 
437  int minHitTick = (*std::min_element(clusHitVec.begin(),
438  clusHitVec.end(),
439  [](const auto& hit, const auto& min) {
440  return hit->PeakTimeMinusRMS() < min->PeakTimeMinusRMS();
441  }))
442  ->PeakTimeMinusRMS();
443  int maxHitTick = (*std::max_element(clusHitVec.begin(),
444  clusHitVec.end(),
445  [](const auto& hit, const auto& max) {
446  return hit->PeakTimePlusRMS() > max->PeakTimePlusRMS();
447  }))
448  ->PeakTimePlusRMS();
449 
450  if (minHitTick < minTick) minTick = minHitTick;
451  if (maxHitTick < maxTick) maxTick = maxHitTick;
452  }
453 
454  // Loop over the daughters of this particle and remove their hits as well
455  for (const auto& daughterId : pfParticle->Daughters()) {
456  art::Ptr<recob::PFParticle> daughter(pfParticleHandle, daughterId);
457 
459  daughter.get(), pfParticleHandle, partToClusAssns, clusToHitAssns, hitVec);
460  }
461 
462  return;
463 }
464 
465 void
466 CRHitRemoval::copyAllHits(std::vector<art::Ptr<recob::Hit>>& inputHits,
467  art::FindOneP<recob::Wire>& wireAssns,
468  recob::HitCollectionCreator& newHitCollection)
469 {
470  for (const auto& hitPtr : inputHits) {
471  art::Ptr<recob::Wire> wire = wireAssns.at(hitPtr.key());
472 
473  // just copy it
474  newHitCollection.emplace_back(*hitPtr, wire);
475  }
476 
477  return;
478 }
479 
480 void
481 CRHitRemoval::copyInTimeHits(std::vector<art::Ptr<recob::Hit>>& inputHits,
482  art::FindOneP<recob::Wire>& wireAssns,
483  recob::HitCollectionCreator& newHitCollection)
484 {
485  for (const auto& hitPtr : inputHits) {
486  // Check on out of time hits
487  if (hitPtr->PeakTimeMinusRMS() < fMinTickDrift || hitPtr->PeakTimePlusRMS() > fMaxTickDrift)
488  continue;
489 
490  art::Ptr<recob::Wire> wire = wireAssns.at(hitPtr.key());
491 
492  // just copy it
493  newHitCollection.emplace_back(*hitPtr, wire);
494  }
495 
496  return;
497 }
498 
499 //----------------------------------------------------------------------------
500 // Filter a collection of hits (set difference).
501 // This function is copied from Track3DKalmanHit_module.cc
502 //
503 // Arguments:
504 //
505 // hits - Hit collection from which hits should be removed.
506 // used_hits - Hits to remove.
507 //
508 void
510 {
511  if (used_hits.size() > 0) {
512  // Make sure both hit collections are sorted.
513  std::stable_sort(hits.begin(), hits.end());
514  std::stable_sort(used_hits.begin(), used_hits.end());
515 
516  // Do set difference operation.
517  std::vector<art::Ptr<recob::Hit>>::iterator it = std::set_difference(
518  hits.begin(), hits.end(), used_hits.begin(), used_hits.end(), hits.begin());
519 
520  // Truncate hit collection.
521  hits.erase(it, hits.end());
522  }
523 }
524 
525 //----------------------------------------------------------------------------
526 /// End job method.
527 void
529 {
530  double aveCRPerEvent = fNumEvent > 0 ? double(fNumCRRejects) / double(fNumEvent) : 0.;
531 
532  mf::LogInfo("CRHitRemoval") << "CRHitRemoval statistics:\n"
533  << " Number of events = " << fNumEvent << "\n"
534  << " Number of Cosmic Rays found = " << fNumCRRejects << ", "
535  << aveCRPerEvent << " average/event";
536 }
const std::vector< size_t > & Daughters() const
Returns the collection of daughter particles.
Definition: PFParticle.h:114
std::string fPFParticleProducerLabel
PFParticle producer.
Utilities related to art service access.
size_t Self() const
Returns the index of this particle.
Definition: PFParticle.h:92
process_name cluster
Definition: cheaterreco.fcl:51
Declaration of signal hit object.
int fEndTickPadding
Padding the end tick.
void copyAllHits(std::vector< art::Ptr< recob::Hit >> &, art::FindOneP< recob::Wire > &, recob::HitCollectionCreator &)
process_name use argoneut_mc_hitfinder track
process_name hit
Definition: cheaterreco.fcl:51
int fNumCRRejects
Number of tracks produced.
static void declare_products(art::ProducesCollector &collector, std::string instance_name="", bool doWireAssns=true, bool doRawDigitAssns=true)
Declares the hit products we are going to fill.
Definition: HitCreator.cxx:248
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:265
Helper functions to create a hit.
A class handling a collection of hits and its associations.
Definition: HitCreator.h:508
std::vector< std::string > fAssnProducerLabels
Track to PFParticle assns producer.
size_t Parent() const
Definition: PFParticle.h:96
std::vector< art::Ptr< recob::Hit >> HitPtrVector
std::string fHitProducerLabel
The full collection of hits.
int fMaxTickDrift
Ending tick.
bool IsPrimary() const
Returns whether the particle is the root of the flow.
Definition: PFParticle.h:86
void emplace_back(recob::Hit &&hit, art::Ptr< recob::Wire > const &wire=art::Ptr< recob::Wire >(), art::Ptr< raw::RawDigit > const &digits=art::Ptr< raw::RawDigit >())
Adds the specified hit to the data collection.
Definition: HitCreator.cxx:290
virtual void endJob()
End job method.
std::vector< double > fCosmicTagThresholds
Thresholds for tagging.
Declaration of cluster object.
Provides recob::Track data product.
void collectPFParticleHits(const recob::PFParticle *pfParticle, const art::Handle< std::vector< recob::PFParticle >> &pfParticleHandle, const art::FindManyP< recob::Cluster > &partToClusAssns, const art::FindManyP< recob::Hit > &clusToHitAssns, HitPtrVector &hitVec)
virtual void produce(art::Event &e)
Hierarchical representation of particle flow.
Definition: PFParticle.h:44
int fMaxOutOfTime
Max hits that can be out of time before rejecting.
CRHitRemoval(fhicl::ParameterSet const &pset)
void copyInTimeHits(std::vector< art::Ptr< recob::Hit >> &, art::FindOneP< recob::Wire > &, recob::HitCollectionCreator &)
int fDetectorWidthTicks
Effective drift time in ticks.
do i e
std::vector< std::string > fTrackProducerLabels
Track producer.
T copy(T const &v)
int fNumEvent
Number of events seen.
TCEvent evt
Definition: DataStructs.cxx:8
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
int fMinTickDrift
Starting tick.
void FilterHits(HitPtrVector &hits, HitPtrVector &used_hits)
virtual void beginJob()
Begin job method.
art framework interface to geometry description
std::vector< std::string > fCosmicProducerLabels
List of cosmic tagger producers.