LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
cluster::LineMerger Class Reference
Inheritance diagram for cluster::LineMerger:
art::EDProducer art::ProducerBase art::Consumer art::EngineCreator art::ProductRegistryHelper

Public Types

using ModuleType = EDProducer
 
using WorkerType = WorkerT< EDProducer >
 
template<typename UserConfig , typename KeysToIgnore = void>
using Table = ProducerBase::Table< UserConfig, KeysToIgnore >
 

Public Member Functions

 LineMerger (fhicl::ParameterSet const &pset)
 
 ~LineMerger ()
 
void produce (art::Event &evt)
 
void beginJob ()
 
template<typename PROD , BranchType B = InEvent>
ProductID getProductID (std::string const &instanceName={}) const
 
template<typename PROD , BranchType B>
ProductID getProductID (ModuleDescription const &moduleDescription, std::string const &instanceName) const
 
bool modifiesEvent () const
 
template<typename T , BranchType = InEvent>
ProductToken< T > consumes (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ProductToken< T > consumes (InputTag const &it)
 
template<typename T , BranchType = InEvent>
void consumesMany ()
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > consumesView (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ViewToken< T > consumesView (InputTag const &it)
 
template<typename T , BranchType = InEvent>
ProductToken< T > mayConsume (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ProductToken< T > mayConsume (InputTag const &it)
 
template<typename T , BranchType = InEvent>
void mayConsumeMany ()
 
template<typename Element , BranchType = InEvent>
ViewToken< Element > mayConsumeView (InputTag const &)
 
template<typename T , art::BranchType BT>
art::ViewToken< T > mayConsumeView (InputTag const &it)
 
base_engine_tcreateEngine (seed_t seed)
 
base_engine_tcreateEngine (seed_t seed, std::string const &kind_of_engine_to_make)
 
base_engine_tcreateEngine (seed_t seed, std::string const &kind_of_engine_to_make, label_t const &engine_label)
 
seed_t get_seed_value (fhicl::ParameterSet const &pset, char const key[]="seed", seed_t const implicit_seed=-1)
 

Static Public Member Functions

static cet::exempt_ptr< Consumernon_module_context ()
 

Protected Member Functions

CurrentProcessingContext const * currentContext () const
 
void validateConsumedProduct (BranchType const bt, ProductInfo const &pi)
 
void prepareForJob (fhicl::ParameterSet const &pset)
 
void showMissingConsumes () const
 

Private Member Functions

bool SlopeCompatibility (double slope1, double slope2)
 
int EndpointCompatibility (float sclstartwire, float sclstarttime, float sclendwire, float sclendtime, float cl2startwire, float cl2starttime, float cl2endwire, float cl2endtime)
 

Private Attributes

std::string fClusterModuleLabel
 
double fSlope
 
double fEndpointWindow
 

Detailed Description

Definition at line 52 of file LineMerger_module.cc.

Member Typedef Documentation

using art::EDProducer::ModuleType = EDProducer
inherited

Definition at line 34 of file EDProducer.h.

template<typename UserConfig , typename KeysToIgnore = void>
using art::EDProducer::Table = ProducerBase::Table<UserConfig, KeysToIgnore>
inherited

Definition at line 43 of file EDProducer.h.

using art::EDProducer::WorkerType = WorkerT<EDProducer>
inherited

Definition at line 35 of file EDProducer.h.

Constructor & Destructor Documentation

cluster::LineMerger::LineMerger ( fhicl::ParameterSet const &  pset)
explicit

Definition at line 379 of file LineMerger_module.cc.

380  : fClusterModuleLabel(pset.get<std::string>("ClusterModuleLabel"))
381  , fSlope (pset.get<double >("Slope"))
382  , fEndpointWindow (pset.get<double >("EndpointWindow"))
383  {
384  produces< std::vector<recob::Cluster> >();
385  produces< art::Assns<recob::Cluster, recob::Hit> >();
386  }
std::string fClusterModuleLabel
cluster::LineMerger::~LineMerger ( )

Definition at line 389 of file LineMerger_module.cc.

390  {
391  }

Member Function Documentation

void cluster::LineMerger::beginJob ( )
virtual

Reimplemented from art::EDProducer.

Definition at line 394 of file LineMerger_module.cc.

395  {
396  //this doesn't do anything now, but it might someday
397  }
template<typename T , BranchType = InEvent>
ProductToken<T> art::Consumer::consumes ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ProductToken<T> art::Consumer::consumes ( InputTag const &  it)
inherited

Definition at line 147 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

148 {
149  if (!moduleContext_)
150  return ProductToken<T>::invalid();
151 
152  consumables_[BT].emplace_back(ConsumableType::Product,
153  TypeID{typeid(T)},
154  it.label(),
155  it.instance(),
156  it.process());
157  return ProductToken<T>{it};
158 }
static ProductToken< T > invalid()
Definition: ProductToken.h:47
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename T , art::BranchType BT>
void art::Consumer::consumesMany ( )
inherited

Definition at line 162 of file Consumer.h.

163 {
164  if (!moduleContext_)
165  return;
166 
167  consumables_[BT].emplace_back(ConsumableType::Many, TypeID{typeid(T)});
168 }
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename Element , BranchType = InEvent>
ViewToken<Element> art::Consumer::consumesView ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ViewToken<T> art::Consumer::consumesView ( InputTag const &  it)
inherited

Definition at line 172 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

173 {
174  if (!moduleContext_)
175  return ViewToken<T>::invalid();
176 
177  consumables_[BT].emplace_back(ConsumableType::ViewElement,
178  TypeID{typeid(T)},
179  it.label(),
180  it.instance(),
181  it.process());
182  return ViewToken<T>{it};
183 }
static ViewToken< Element > invalid()
Definition: ProductToken.h:75
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
EngineCreator::base_engine_t & EngineCreator::createEngine ( seed_t  seed,
std::string const &  kind_of_engine_to_make 
)
inherited

Definition at line 32 of file EngineCreator.cc.

References art::EngineCreator::rng().

34 {
35  return rng()->createEngine(
36  placeholder_schedule_id(), seed, kind_of_engine_to_make);
37 }
long seed
Definition: chem4.cc:68
static art::ServiceHandle< art::RandomNumberGenerator > & rng()
EngineCreator::base_engine_t & EngineCreator::createEngine ( seed_t  seed,
std::string const &  kind_of_engine_to_make,
label_t const &  engine_label 
)
inherited

Definition at line 40 of file EngineCreator.cc.

References art::EngineCreator::rng().

43 {
44  return rng()->createEngine(
45  placeholder_schedule_id(), seed, kind_of_engine_to_make, engine_label);
46 }
long seed
Definition: chem4.cc:68
static art::ServiceHandle< art::RandomNumberGenerator > & rng()
CurrentProcessingContext const * art::EDProducer::currentContext ( ) const
protectedinherited

Definition at line 120 of file EDProducer.cc.

References art::EDProducer::current_context_.

121  {
122  return current_context_.get();
123  }
CPC_exempt_ptr current_context_
Definition: EDProducer.h:116
int cluster::LineMerger::EndpointCompatibility ( float  sclstartwire,
float  sclstarttime,
float  sclendwire,
float  sclendtime,
float  cl2startwire,
float  cl2starttime,
float  cl2endwire,
float  cl2endtime 
)
private
Todo:
13.5 ticks/wire. need to make this detector agnostic–spitz

Definition at line 577 of file LineMerger_module.cc.

References DEFINE_ART_MODULE, and fEndpointWindow.

Referenced by produce().

582  {
583 
585  float distance = std::sqrt((pow(sclendwire-cl2startwire,2)*13.5) + pow(sclendtime-cl2starttime,2));
586 
587  //not sure if this line is necessary--spitz
588  float distance2 = std::sqrt((pow(sclstartwire-cl2endwire,2)*13.5) + pow(sclstarttime-cl2endtime,2));
589 
590 // bool comp = (distance < fEndpointWindow ||
591 // distance2 < fEndpointWindow) ? true : false;
592 
593  //determine which way the two clusters should be merged. TY
594  int comp = 0;
595  if (distance < fEndpointWindow)
596  comp = 1;
597  else if (distance2 < fEndpointWindow)
598  comp = -1;
599  return comp;
600  }
EngineCreator::seed_t EngineCreator::get_seed_value ( fhicl::ParameterSet const &  pset,
char const  key[] = "seed",
seed_t const  implicit_seed = -1 
)
inherited

Definition at line 49 of file EngineCreator.cc.

References fhicl::ParameterSet::get().

Referenced by art::MixFilter< T >::initEngine_().

52 {
53  auto const& explicit_seeds = pset.get<std::vector<int>>(key, {});
54  return explicit_seeds.empty() ? implicit_seed : explicit_seeds.front();
55 }
template<typename PROD , BranchType B>
ProductID art::EDProducer::getProductID ( std::string const &  instanceName = {}) const
inlineinherited

Definition at line 123 of file EDProducer.h.

References art::EDProducer::moduleDescription_.

124  {
125  return ProducerBase::getProductID<PROD, B>(moduleDescription_,
126  instanceName);
127  }
ModuleDescription moduleDescription_
Definition: EDProducer.h:115
template<typename PROD , BranchType B>
ProductID art::ProducerBase::getProductID ( ModuleDescription const &  moduleDescription,
std::string const &  instanceName 
) const
inherited

Definition at line 56 of file ProducerBase.h.

References B, and art::ModuleDescription::moduleLabel().

Referenced by art::ProducerBase::modifiesEvent().

58  {
59  auto const& pd =
60  get_ProductDescription<PROD>(B, md.moduleLabel(), instanceName);
61  return pd.productID();
62  }
Int_t B
Definition: plot.C:25
template<typename T , BranchType = InEvent>
ProductToken<T> art::Consumer::mayConsume ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ProductToken<T> art::Consumer::mayConsume ( InputTag const &  it)
inherited

Definition at line 190 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

191 {
192  if (!moduleContext_)
193  return ProductToken<T>::invalid();
194 
195  consumables_[BT].emplace_back(ConsumableType::Product,
196  TypeID{typeid(T)},
197  it.label(),
198  it.instance(),
199  it.process());
200  return ProductToken<T>{it};
201 }
static ProductToken< T > invalid()
Definition: ProductToken.h:47
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename T , art::BranchType BT>
void art::Consumer::mayConsumeMany ( )
inherited

Definition at line 205 of file Consumer.h.

206 {
207  if (!moduleContext_)
208  return;
209 
210  consumables_[BT].emplace_back(ConsumableType::Many, TypeID{typeid(T)});
211 }
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
template<typename Element , BranchType = InEvent>
ViewToken<Element> art::Consumer::mayConsumeView ( InputTag const &  )
inherited
template<typename T , art::BranchType BT>
art::ViewToken<T> art::Consumer::mayConsumeView ( InputTag const &  it)
inherited

Definition at line 215 of file Consumer.h.

References art::InputTag::instance(), art::InputTag::label(), and art::InputTag::process().

216 {
217  if (!moduleContext_)
218  return ViewToken<T>::invalid();
219 
220  consumables_[BT].emplace_back(ConsumableType::ViewElement,
221  TypeID{typeid(T)},
222  it.label(),
223  it.instance(),
224  it.process());
225  return ViewToken<T>{it};
226 }
static ViewToken< Element > invalid()
Definition: ProductToken.h:75
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
bool art::ProducerBase::modifiesEvent ( ) const
inlineinherited

Definition at line 40 of file ProducerBase.h.

References art::ProducerBase::getProductID().

41  {
42  return true;
43  }
void art::Consumer::prepareForJob ( fhicl::ParameterSet const &  pset)
protectedinherited

Definition at line 89 of file Consumer.cc.

References fhicl::ParameterSet::get_if_present().

Referenced by art::EDProducer::doBeginJob(), art::EDFilter::doBeginJob(), and art::EDAnalyzer::doBeginJob().

90 {
91  if (!moduleContext_)
92  return;
93 
94  pset.get_if_present("errorOnMissingConsumes", requireConsumes_);
95  for (auto& consumablesPerBranch : consumables_) {
96  cet::sort_all(consumablesPerBranch);
97  }
98 }
bool requireConsumes_
Definition: Consumer.h:137
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
void cluster::LineMerger::produce ( art::Event evt)
virtual

Implements art::EDProducer.

Definition at line 400 of file LineMerger_module.cc.

References c2, util::CreateAssn(), EndpointCompatibility(), fClusterModuleLabel, art::DataViewImpl::getByLabel(), recob::Cluster::ID(), cluster::ClusterParamsImportWrapper< Algo >::ImportHits(), geo::kU, geo::kV, geo::kZ, art::Event::put(), recob::Cluster::Sentry, SlopeCompatibility(), and recob::Cluster::View().

401  {
402  // Get a Handle for the input Cluster object(s).
403  art::Handle< std::vector<recob::Cluster> > clusterVecHandle;
404  evt.getByLabel(fClusterModuleLabel,clusterVecHandle);
405 
406  constexpr size_t nViews = 3; // number of views we map
407 
408  //one vector for each view in the geometry (holds the index of the cluster)
409  std::array< std::vector<size_t>, nViews > ClsIndices;
410 
411  //vector with indicators for whether a cluster has been merged already
412  std::array< std::vector<int>, nViews > Cls_matches;
413 
414  // loop over the input Clusters
415  for(size_t i = 0; i < clusterVecHandle->size(); ++i){
416 
417  //get a art::Ptr to each Cluster
418  art::Ptr<recob::Cluster> cl(clusterVecHandle, i);
419 
420  size_t view = 0;
421  switch(cl->View()){
422  case geo::kU :
423  view = 0;
424  break;
425  case geo::kV :
426  view = 1;
427  break;
428  case geo::kZ :
429  view = 2;
430  break;
431  default :
432  continue; // ignore this cluster and process the next one
433  }// end switch on view
434 
435  Cls_matches[view].push_back(0);
436  ClsIndices[view].push_back(i);
437  }// end loop over input clusters
438 
439  std::unique_ptr<std::vector<recob::Cluster> > SuperClusters(new std::vector<recob::Cluster>);
440  std::unique_ptr< art::Assns<recob::Cluster, recob::Hit> > assn(new art::Assns<recob::Cluster, recob::Hit>);
441 
442  // prepare the algorithm to compute the cluster characteristics;
443  // we use the "standard" one here; configuration would happen here,
444  // but we are using the default configuration for that algorithm
445  ClusterParamsImportWrapper<StandardClusterParamsAlg> ClusterParamAlgo;
446 
447  art::FindManyP<recob::Hit> fmh(clusterVecHandle, evt, fClusterModuleLabel);
448 
449  for(size_t i = 0; i < nViews; ++i){
450 
451  int clustersfound = 0; // how many merged clusters found in each plane
452  int clsnum1 = 0;
453 
454  for(size_t c = 0; c < ClsIndices[i].size(); ++c){
455  if(Cls_matches[i][clsnum1] == 1){
456  ++clsnum1;
457  continue;
458  }
459 
460  // make a new cluster to put into the SuperClusters collection
461  // because we want to be able to adjust it later;
462  // use the hits associated with the current cluster
463  recob::Cluster const& StartingCluster
464  = clusterVecHandle->at(ClsIndices[i][c]);
465  ClusterAndHitMerger cl1(StartingCluster, fmh.at(ClsIndices[i][c]));
466  const recob::Cluster::ID_t clusterID = StartingCluster.ID();
467 
468  Cls_matches[i][clsnum1] = 1;
469  ++clustersfound;
470 
471  int clsnum2 = 0;
472  for(size_t c2 = 0; c2 < ClsIndices[i].size(); ++c2){
473 
474  if(Cls_matches[i][clsnum2] == 1){
475  ++clsnum2;
476  continue;
477  }
478 
479  const recob::Cluster& cl2( clusterVecHandle->at(ClsIndices[i][c2]) );
480 
481 
482  // check that the slopes are the same
483  // added 13.5 ticks/wirelength in ArgoNeuT.
484  // \todo need to make this detector agnostic
485  // would be nice to have a LArProperties function that returns ticks/wire.
486  bool sameSlope = SlopeCompatibility(cl1.StartAngle(), cl2.EndAngle())
487  || SlopeCompatibility(cl1.EndAngle(), cl2.StartAngle());
488 
489  // check that the endpoints fall within a circular window of each other
490  // done in place of intercept matching
491  int sameEndpoint = EndpointCompatibility(
492  cl1.StartWire(), cl1.StartTick(),
493  cl1.EndWire(), cl1.EndTick(),
494  cl2.StartWire(), cl2.StartTick(),
495  cl2.EndWire(), cl2.EndTick()
496  );
497 
498  // if the slopes and end points are the same, combine the clusters
499  // note that after 1 combination cl1 is no longer what we started
500  // with
501  if(sameSlope && (sameEndpoint != 0)) {
502  // combine the hit collections too
503  // (find the hits associated with this second cluster);
504  // take into account order when merging hits from two clusters: doc-1776
505  // if sameEndpoint is 1, the new hits come first
506  cl1.Add(cl2, fmh.at(ClsIndices[i][c2]), sameEndpoint == 1);
507  Cls_matches[i][clsnum2] = 1;
508  }
509 
510  ++clsnum2;
511  }// end loop over second cluster iterator
512 
513  // now add the final version of cl1 to the collection of SuperClusters
514  // and create the association between the super cluster and the hits
515  ClusterParamAlgo.ImportHits(cl1.Hits());
516 
517  // create the recob::Cluster directly in the vector
518  SuperClusters->emplace_back(
519  cl1.StartWire(), // start_wire
520  cl1.SigmaStartWire(), // sigma_start_wire
521  cl1.StartTick(), // start_tick
522  cl1.SigmaStartTick(), // sigma_start_tick
523  cl1.StartCharge(), // start_charge
524  cl1.StartAngle(), // start_angle
525  cl1.StartOpeningAngle(), // start_opening
526  cl1.EndWire(), // end_wire
527  cl1.SigmaEndWire(), // sigma_end_wire
528  cl1.EndTick(), // end_time
529  cl1.SigmaEndTick(), // sigma_end_tick
530  cl1.EndCharge(), // end_charge
531  cl1.EndAngle(), // end_angle
532  cl1.EndOpeningAngle(), // end_opening
533  ClusterParamAlgo.Integral().value(), // integral
534  ClusterParamAlgo.IntegralStdDev().value(), // integral_stddev
535  ClusterParamAlgo.SummedADC().value(), // summedADC
536  ClusterParamAlgo.SummedADCStdDev().value(), // summedADC_stddev
537  ClusterParamAlgo.NHits(), // n_hits
538  ClusterParamAlgo.MultipleHitDensity(), // multiple_hit_density
539  cl1.Width(), // width
540  clusterID, // ID
541  cl1.View(), // view
542  cl1.Plane(), // planeID
543  recob::Cluster::Sentry // sentry
544  );
545 
546  util::CreateAssn(*this, evt, *(SuperClusters.get()), cl1.Hits(), *(assn.get()));
547  ++clsnum1;
548 
549  }// end loop over first cluster iterator
550  }// end loop over planes
551 
552  mf::LogVerbatim("Summary") << std::setfill('-') << std::setw(175) << "-" << std::setfill(' ');
553  mf::LogVerbatim("Summary") << "LineMerger Summary:";
554  for(size_t i = 0; i < SuperClusters->size(); ++i)
555  mf::LogVerbatim("Summary") << SuperClusters->at(i);
556 
557  evt.put(std::move(SuperClusters));
558  evt.put(std::move(assn));
559 
560  return;
561 
562  }
MaybeLogger_< ELseverityLevel::ELsev_info, true > LogVerbatim
int EndpointCompatibility(float sclstartwire, float sclstarttime, float sclendwire, float sclendtime, float cl2startwire, float cl2starttime, float cl2endwire, float cl2endtime)
Planes which measure V.
Definition: geo_types.h:77
Planes which measure Z direction.
Definition: geo_types.h:79
Set of hits with a 2D structure.
Definition: Cluster.h:71
static const SentryArgument_t Sentry
An instance of the sentry object.
Definition: Cluster.h:182
ProductID put(std::unique_ptr< PROD > &&product)
Definition: Event.h:102
Planes which measure U.
Definition: geo_types.h:76
TCanvas * c2
Definition: plot_hist.C:75
std::string fClusterModuleLabel
bool CreateAssn(PRODUCER const &prod, art::Event &evt, std::vector< T > const &a, art::Ptr< U > const &b, art::Assns< U, T > &assn, std::string a_instance, size_t indx=UINT_MAX)
Creates a single one-to-one association.
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
Definition: DataViewImpl.h:344
ID_t ID() const
Identifier of this cluster.
Definition: Cluster.h:738
bool SlopeCompatibility(double slope1, double slope2)
int ID_t
Type of cluster ID.
Definition: Cluster.h:74
void art::Consumer::showMissingConsumes ( ) const
protectedinherited

Definition at line 125 of file Consumer.cc.

Referenced by art::EDProducer::doEndJob(), art::EDFilter::doEndJob(), art::EDAnalyzer::doEndJob(), and art::RootOutput::endJob().

126 {
127  if (!moduleContext_)
128  return;
129 
130  // If none of the branches have missing consumes statements, exit early.
131  if (std::all_of(cbegin(missingConsumes_),
132  cend(missingConsumes_),
133  [](auto const& perBranch) { return perBranch.empty(); }))
134  return;
135 
136  constexpr cet::HorizontalRule rule{60};
137  mf::LogPrint log{"MTdiagnostics"};
138  log << '\n'
139  << rule('=') << '\n'
140  << "The following consumes (or mayConsume) statements are missing from\n"
141  << module_context(moduleDescription_) << '\n'
142  << rule('-') << '\n';
143 
144  cet::for_all_with_index(
145  missingConsumes_, [&log](std::size_t const i, auto const& perBranch) {
146  for (auto const& pi : perBranch) {
147  log << " "
148  << assemble_consumes_statement(static_cast<BranchType>(i), pi)
149  << '\n';
150  }
151  });
152  log << rule('=');
153 }
cet::exempt_ptr< ModuleDescription const > moduleDescription_
Definition: Consumer.h:140
constexpr T pi()
Returns the constant pi (up to 35 decimal digits of precision)
bool moduleContext_
Definition: Consumer.h:136
ConsumableProductSets missingConsumes_
Definition: Consumer.h:139
bool cluster::LineMerger::SlopeCompatibility ( double  slope1,
double  slope2 
)
private

Definition at line 566 of file LineMerger_module.cc.

References fSlope.

Referenced by produce().

567  {
568  double sl1 = atan(slope1);
569  double sl2 = atan(slope2);
570 
571  //the units of fSlope are radians
572  bool comp = std::abs(sl1-sl2) < fSlope ? true : false;
573 
574  return comp;
575  }
void art::Consumer::validateConsumedProduct ( BranchType const  bt,
ProductInfo const &  pi 
)
protectedinherited

Definition at line 101 of file Consumer.cc.

References art::errors::ProductRegistrationFailure.

103 {
104  // Early exits if consumes tracking has been disabled or if the
105  // consumed product is an allowed consumable.
106  if (!moduleContext_)
107  return;
108 
109  if (cet::binary_search_all(consumables_[bt], pi))
110  return;
111 
112  if (requireConsumes_) {
114  "Consumer: an error occurred during validation of a "
115  "retrieved product\n\n")
116  << "The following consumes (or mayConsume) statement is missing from\n"
117  << module_context(moduleDescription_) << ":\n\n"
118  << " " << assemble_consumes_statement(bt, pi) << "\n\n";
119  }
120 
121  missingConsumes_[bt].insert(pi);
122 }
cet::exempt_ptr< ModuleDescription const > moduleDescription_
Definition: Consumer.h:140
bool requireConsumes_
Definition: Consumer.h:137
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
constexpr T pi()
Returns the constant pi (up to 35 decimal digits of precision)
ConsumableProducts consumables_
Definition: Consumer.h:138
bool moduleContext_
Definition: Consumer.h:136
ConsumableProductSets missingConsumes_
Definition: Consumer.h:139

Member Data Documentation

std::string cluster::LineMerger::fClusterModuleLabel
private

Definition at line 64 of file LineMerger_module.cc.

Referenced by produce().

double cluster::LineMerger::fEndpointWindow
private

Definition at line 66 of file LineMerger_module.cc.

Referenced by EndpointCompatibility().

double cluster::LineMerger::fSlope
private

Definition at line 65 of file LineMerger_module.cc.

Referenced by SlopeCompatibility().


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