Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
CRHitRemoval Class Reference
Inheritance diagram for CRHitRemoval:
art::EDProducer art::detail::Producer art::detail::LegacyModule art::Modifier art::ModuleBase art::ProductRegistryHelper

Public Member Functions

 CRHitRemoval (fhicl::ParameterSet const &pset)
 
virtual void produce (art::Event &e)
 
virtual void beginJob ()
 Begin job method. More...
 
virtual void endJob ()
 End job method. More...
 
- Public Member Functions inherited from art::EDProducer
 EDProducer (fhicl::ParameterSet const &pset)
 
template<typename Config >
 EDProducer (Table< Config > const &config)
 
std::string workerType () const
 
- Public Member Functions inherited from art::detail::Producer
virtual ~Producer () noexcept
 
 Producer (fhicl::ParameterSet const &)
 
 Producer (Producer const &)=delete
 
 Producer (Producer &&)=delete
 
Produceroperator= (Producer const &)=delete
 
Produceroperator= (Producer &&)=delete
 
void doBeginJob (SharedResources const &resources)
 
void doEndJob ()
 
void doRespondToOpenInputFile (FileBlock const &fb)
 
void doRespondToCloseInputFile (FileBlock const &fb)
 
void doRespondToOpenOutputFiles (FileBlock const &fb)
 
void doRespondToCloseOutputFiles (FileBlock const &fb)
 
bool doBeginRun (RunPrincipal &rp, ModuleContext const &mc)
 
bool doEndRun (RunPrincipal &rp, ModuleContext const &mc)
 
bool doBeginSubRun (SubRunPrincipal &srp, ModuleContext const &mc)
 
bool doEndSubRun (SubRunPrincipal &srp, ModuleContext const &mc)
 
bool doEvent (EventPrincipal &ep, ModuleContext const &mc, std::atomic< std::size_t > &counts_run, std::atomic< std::size_t > &counts_passed, std::atomic< std::size_t > &counts_failed)
 
- Public Member Functions inherited from art::Modifier
 ~Modifier () noexcept
 
 Modifier ()
 
 Modifier (Modifier const &)=delete
 
 Modifier (Modifier &&)=delete
 
Modifieroperator= (Modifier const &)=delete
 
Modifieroperator= (Modifier &&)=delete
 
- Public Member Functions inherited from art::ModuleBase
virtual ~ModuleBase () noexcept
 
 ModuleBase ()
 
ModuleDescription const & moduleDescription () const
 
void setModuleDescription (ModuleDescription const &)
 
std::array< std::vector< ProductInfo >, NumBranchTypes > const & getConsumables () const
 
void sortConsumables (std::string const &current_process_name)
 
template<typename T , BranchType BT>
ViewToken< T > consumesView (InputTag const &tag)
 
template<typename T , BranchType BT>
ViewToken< T > mayConsumeView (InputTag const &tag)
 

Private Types

using HitPtrVector = std::vector< art::Ptr< recob::Hit >>
 

Private Member Functions

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)
 
void copyAllHits (std::vector< art::Ptr< recob::Hit >> &, art::FindOneP< recob::Wire > &, recob::HitCollectionCreator &)
 
void copyInTimeHits (std::vector< art::Ptr< recob::Hit >> &, art::FindOneP< recob::Wire > &, recob::HitCollectionCreator &)
 
void FilterHits (HitPtrVector &hits, HitPtrVector &used_hits)
 

Private Attributes

std::vector< std::stringfCosmicProducerLabels
 List of cosmic tagger producers. More...
 
std::string fHitProducerLabel
 The full collection of hits. More...
 
std::string fPFParticleProducerLabel
 PFParticle producer. More...
 
std::vector< std::stringfTrackProducerLabels
 Track producer. More...
 
std::vector< std::stringfAssnProducerLabels
 Track to PFParticle assns producer. More...
 
std::vector< double > fCosmicTagThresholds
 Thresholds for tagging. More...
 
int fEndTickPadding
 Padding the end tick. More...
 
int fDetectorWidthTicks
 Effective drift time in ticks. More...
 
int fMinTickDrift
 Starting tick. More...
 
int fMaxTickDrift
 Ending tick. More...
 
int fMaxOutOfTime
 Max hits that can be out of time before rejecting. More...
 
int fNumEvent
 Number of events seen. More...
 
int fNumCRRejects
 Number of tracks produced. More...
 

Additional Inherited Members

- Public Types inherited from art::EDProducer
using ModuleType = EDProducer
 
using WorkerType = WorkerT< EDProducer >
 
- Public Types inherited from art::detail::Producer
template<typename UserConfig , typename KeysToIgnore = void>
using Table = Modifier::Table< UserConfig, KeysToIgnore >
 
- Public Types inherited from art::Modifier
template<typename UserConfig , typename UserKeysToIgnore = void>
using Table = ProducerTable< UserConfig, detail::ModuleConfig, UserKeysToIgnore >
 
- Static Public Member Functions inherited from art::EDProducer
static void commitEvent (EventPrincipal &ep, Event &e)
 
- Protected Member Functions inherited from art::ModuleBase
ConsumesCollectorconsumesCollector ()
 
template<typename T , BranchType = InEvent>
ProductToken< T > consumes (InputTag const &)
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > consumesView (InputTag const &)
 
template<typename T , BranchType = InEvent>
void consumesMany ()
 
template<typename T , BranchType = InEvent>
ProductToken< T > mayConsume (InputTag const &)
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > mayConsumeView (InputTag const &)
 
template<typename T , BranchType = InEvent>
void mayConsumeMany ()
 

Detailed Description

Definition at line 46 of file CRHitRemoval_module.cc.

Member Typedef Documentation

Definition at line 58 of file CRHitRemoval_module.cc.

Constructor & Destructor Documentation

CRHitRemoval::CRHitRemoval ( fhicl::ParameterSet const &  pset)
explicit

Constructor.

Arguments:

pset - Fcl parameters.

Definition at line 107 of file CRHitRemoval_module.cc.

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 }
std::string fPFParticleProducerLabel
PFParticle producer.
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.
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
std::vector< std::string > fAssnProducerLabels
Track to PFParticle assns producer.
std::string fHitProducerLabel
The full collection of hits.
std::vector< double > fCosmicTagThresholds
Thresholds for tagging.
ProducesCollector & producesCollector() noexcept
int fMaxOutOfTime
Max hits that can be out of time before rejecting.
std::vector< std::string > fTrackProducerLabels
Track producer.
int fNumEvent
Number of events seen.
std::vector< std::string > fCosmicProducerLabels
List of cosmic tagger producers.

Member Function Documentation

void CRHitRemoval::beginJob ( )
virtual

Begin job method.

Reimplemented from art::EDProducer.

Definition at line 131 of file CRHitRemoval_module.cc.

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 }
int fEndTickPadding
Padding the end tick.
int fMaxTickDrift
Ending tick.
int fDetectorWidthTicks
Effective drift time in ticks.
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 CRHitRemoval::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 
)
private

Find all hits in PFParticle hierarchy

Arguments:

pfParticle - the top level PFParticle to have hits removed pfParticleHandle - handle to the PFParticle objects partToClusAssns - list of PFParticle to Cluster associations clusToHitAssns - list of Cluster to Hit associations hitVec - the current list of hits

This recursively called method will remove all hits associated to an input PFParticle and, in addition, will call itself for all daughters of the input PFParticle

Definition at line 417 of file CRHitRemoval_module.cc.

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 }
const std::vector< size_t > & Daughters() const
Returns the collection of daughter particles.
Definition: PFParticle.h:114
size_t Self() const
Returns the index of this particle.
Definition: PFParticle.h:92
Cluster finding and building.
int fMaxTickDrift
Ending tick.
static int max(int a, int b)
Detector simulation of raw signals on wires.
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)
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
Definition: statistics.h:55
int fMinTickDrift
Starting tick.
void CRHitRemoval::copyAllHits ( std::vector< art::Ptr< recob::Hit >> &  inputHits,
art::FindOneP< recob::Wire > &  wireAssns,
recob::HitCollectionCreator newHitCollection 
)
private

Definition at line 464 of file CRHitRemoval_module.cc.

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 }
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
void CRHitRemoval::copyInTimeHits ( std::vector< art::Ptr< recob::Hit >> &  inputHits,
art::FindOneP< recob::Wire > &  wireAssns,
recob::HitCollectionCreator newHitCollection 
)
private

Definition at line 479 of file CRHitRemoval_module.cc.

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 }
int fMaxTickDrift
Ending tick.
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
int fMinTickDrift
Starting tick.
void CRHitRemoval::endJob ( )
virtual

End job method.

Reimplemented from art::EDProducer.

Definition at line 526 of file CRHitRemoval_module.cc.

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 }
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
int fNumCRRejects
Number of tracks produced.
int fNumEvent
Number of events seen.
void CRHitRemoval::FilterHits ( HitPtrVector hits,
HitPtrVector used_hits 
)
private

Definition at line 507 of file CRHitRemoval_module.cc.

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 }
void CRHitRemoval::produce ( art::Event evt)
virtual

Produce method.

Arguments:

evt - Art event.

This is the primary method. The goal is to produce a list of recob::Hit objects which are a "clean" subset of all hits and which are believed to be due to a neutrino interaction. It does this by considering input CosmicTag objects, relating them to PFParticles/Tracks and removing the hits associated to those objects which are believed to be Cosmic Rays.

Implements art::EDProducer.

Definition at line 161 of file CRHitRemoval_module.cc.

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 }
std::string fPFParticleProducerLabel
PFParticle producer.
std::string string
Definition: nybbler.cc:12
void copyAllHits(std::vector< art::Ptr< recob::Hit >> &, art::FindOneP< recob::Wire > &, recob::HitCollectionCreator &)
bool isValid() const noexcept
Definition: Handle.h:191
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Definition: DataViewImpl.h:633
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
std::vector< double > fCosmicTagThresholds
Thresholds for tagging.
Detector simulation of raw signals on wires.
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)
Hierarchical representation of particle flow.
Definition: PFParticle.h:44
int fMaxOutOfTime
Max hits that can be out of time before rejecting.
void copyInTimeHits(std::vector< art::Ptr< recob::Hit >> &, art::FindOneP< recob::Wire > &, recob::HitCollectionCreator &)
std::vector< std::string > fTrackProducerLabels
Track producer.
T copy(T const &v)
int fNumEvent
Number of events seen.
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
Definition: Ptr.h:297
int fMinTickDrift
Starting tick.
void FilterHits(HitPtrVector &hits, HitPtrVector &used_hits)
Definition: fwd.h:31
std::vector< std::string > fCosmicProducerLabels
List of cosmic tagger producers.

Member Data Documentation

std::vector<std::string> CRHitRemoval::fAssnProducerLabels
private

Track to PFParticle assns producer.

Definition at line 82 of file CRHitRemoval_module.cc.

std::vector<std::string> CRHitRemoval::fCosmicProducerLabels
private

List of cosmic tagger producers.

Definition at line 78 of file CRHitRemoval_module.cc.

std::vector<double> CRHitRemoval::fCosmicTagThresholds
private

Thresholds for tagging.

Definition at line 84 of file CRHitRemoval_module.cc.

int CRHitRemoval::fDetectorWidthTicks
private

Effective drift time in ticks.

Definition at line 88 of file CRHitRemoval_module.cc.

int CRHitRemoval::fEndTickPadding
private

Padding the end tick.

Definition at line 86 of file CRHitRemoval_module.cc.

std::string CRHitRemoval::fHitProducerLabel
private

The full collection of hits.

Definition at line 79 of file CRHitRemoval_module.cc.

int CRHitRemoval::fMaxOutOfTime
private

Max hits that can be out of time before rejecting.

Definition at line 91 of file CRHitRemoval_module.cc.

int CRHitRemoval::fMaxTickDrift
private

Ending tick.

Definition at line 90 of file CRHitRemoval_module.cc.

int CRHitRemoval::fMinTickDrift
private

Starting tick.

Definition at line 89 of file CRHitRemoval_module.cc.

int CRHitRemoval::fNumCRRejects
private

Number of tracks produced.

Definition at line 95 of file CRHitRemoval_module.cc.

int CRHitRemoval::fNumEvent
private

Number of events seen.

Definition at line 94 of file CRHitRemoval_module.cc.

std::string CRHitRemoval::fPFParticleProducerLabel
private

PFParticle producer.

Definition at line 80 of file CRHitRemoval_module.cc.

std::vector<std::string> CRHitRemoval::fTrackProducerLabels
private

Track producer.

Definition at line 81 of file CRHitRemoval_module.cc.


The documentation for this class was generated from the following file: