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