CMS 3D CMS Logo

HitPairEDProducer.cc
Go to the documentation of this file.
11 
19 
20 #include <memory>
21 #include <vector>
22 
23 namespace {
24  class ImplBase;
25 }
26 
28 public:
29  HitPairEDProducer(const edm::ParameterSet& iConfig);
30  ~HitPairEDProducer() override = default;
31 
32  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
33 
34  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
35 
36 private:
38 
39  std::unique_ptr<::ImplBase> impl_;
40 };
41 
42 namespace {
43  class ImplBase {
44  public:
45  ImplBase(const edm::ParameterSet& iConfig, edm::ConsumesCollector iC);
46  virtual ~ImplBase() = default;
47 
48  virtual void produces(edm::ProducesCollector) const = 0;
49 
50  virtual void produce(const bool clusterCheckOk, edm::Event& iEvent, const edm::EventSetup& iSetup) = 0;
51 
52  protected:
53  edm::RunningAverage localRA_;
54  const unsigned int maxElement_;
55  const unsigned int maxElementTotal_;
56  const bool putEmptyIfMaxElementReached_;
57 
59  std::vector<unsigned> layerPairBegins_;
60  };
61  ImplBase::ImplBase(const edm::ParameterSet& iConfig, edm::ConsumesCollector iC)
62  : maxElement_(iConfig.getParameter<unsigned int>("maxElement")),
63  maxElementTotal_(iConfig.getParameter<unsigned int>("maxElementTotal")),
64  putEmptyIfMaxElementReached_(iConfig.getParameter<bool>("putEmptyIfMaxElementReached")),
65  generator_(
66  iC, 0, 1, nullptr, maxElement_), // these indices are dummy, TODO: cleanup HitPairGeneratorFromLayerPair
67  layerPairBegins_(iConfig.getParameter<std::vector<unsigned>>("layerPairs")) {
68  if (layerPairBegins_.empty())
69  throw cms::Exception("Configuration")
70  << "HitPairEDProducer requires at least index for layer pairs (layerPairs parameter), none was given";
71  }
72 
74  template <typename T_SeedingHitSets, typename T_IntermediateHitDoublets, typename T_RegionLayers>
75  class Impl : public ImplBase {
76  public:
77  template <typename... Args>
78  Impl(const edm::ParameterSet& iConfig, edm::ConsumesCollector iC, Args&&... args)
79  : ImplBase(iConfig, iC), regionsLayers_(&layerPairBegins_, std::forward<Args>(args)..., iC) {}
80  ~Impl() override = default;
81 
82  void produces(edm::ProducesCollector producesCollector) const override {
83  T_SeedingHitSets::produces(producesCollector);
84  T_IntermediateHitDoublets::produces(producesCollector);
85  }
86 
87  void produce(const bool clusterCheckOk, edm::Event& iEvent, const edm::EventSetup& iSetup) override {
88  auto regionsLayers = regionsLayers_.beginEvent(iEvent);
89 
90  auto seedingHitSetsProducer = T_SeedingHitSets(&localRA_);
91  auto intermediateHitDoubletsProducer = T_IntermediateHitDoublets(regionsLayers.seedingLayerSetsHitsPtr());
92 
93  if (!clusterCheckOk) {
94  seedingHitSetsProducer.putEmpty(iEvent);
95  intermediateHitDoubletsProducer.putEmpty(iEvent);
96  return;
97  }
98 
99  seedingHitSetsProducer.reserve(regionsLayers.regionsSize());
100  intermediateHitDoubletsProducer.reserve(regionsLayers.regionsSize());
101 
102  unsigned int nDoublets = 0;
103 
104  for (const auto& regionLayers : regionsLayers) {
105  const TrackingRegion& region = regionLayers.region();
106  auto hitCachePtr_filler_shs = seedingHitSetsProducer.beginRegion(&region, nullptr);
107  auto hitCachePtr_filler_ihd =
108  intermediateHitDoubletsProducer.beginRegion(&region, std::get<0>(hitCachePtr_filler_shs));
109  auto hitCachePtr = std::get<0>(hitCachePtr_filler_ihd);
110 
111  for (SeedingLayerSetsHits::SeedingLayerSet layerSet : regionLayers.layerPairs()) {
112  auto doubletsOpt = generator_.doublets(region, iEvent, iSetup, layerSet, *hitCachePtr);
113  if (not doubletsOpt) {
114  if (putEmptyIfMaxElementReached_) {
115  putEmpty(iEvent, regionsLayers);
116  return;
117  } else {
118  continue;
119  }
120  }
121  auto& doublets = *doubletsOpt;
122  LogTrace("HitPairEDProducer") << " created " << doublets.size() << " doublets for layers "
123  << layerSet[0].index() << "," << layerSet[1].index();
124  if (doublets.empty())
125  continue; // don't bother if no pairs from these layers
126  nDoublets += doublets.size();
127  if (nDoublets >= maxElementTotal_) {
128  edm::LogError("TooManyPairs") << "number of total pairs exceed maximum, no pairs produced";
129  putEmpty(iEvent, regionsLayers);
130  return;
131  }
132  seedingHitSetsProducer.fill(std::get<1>(hitCachePtr_filler_shs), doublets);
133  intermediateHitDoubletsProducer.fill(std::get<1>(hitCachePtr_filler_ihd), layerSet, std::move(doublets));
134  }
135  }
136 
137  seedingHitSetsProducer.put(iEvent);
138  intermediateHitDoubletsProducer.put(iEvent);
139  }
140 
141  private:
142  template <typename T>
143  void putEmpty(edm::Event& iEvent, T& regionsLayers) {
144  auto seedingHitSetsProducerDummy = T_SeedingHitSets(&localRA_);
145  auto intermediateHitDoubletsProducerDummy = T_IntermediateHitDoublets(regionsLayers.seedingLayerSetsHitsPtr());
146  seedingHitSetsProducerDummy.putEmpty(iEvent);
147  intermediateHitDoubletsProducerDummy.putEmpty(iEvent);
148  }
149 
150  T_RegionLayers regionsLayers_;
151  };
152 
154  class DoNothing {
155  public:
156  DoNothing(const SeedingLayerSetsHits*) {}
157  DoNothing(edm::RunningAverage*) {}
158 
159  static void produces(edm::ProducesCollector){};
160 
161  void reserve(size_t) {}
162 
163  auto beginRegion(const TrackingRegion*, LayerHitMapCache* ptr) { return std::make_tuple(ptr, 0); }
164 
165  void fill(int, const HitDoublets&) {}
167 
168  void put(edm::Event&) {}
169  void putEmpty(edm::Event&) {}
170  };
171 
173  class ImplSeedingHitSets {
174  public:
175  ImplSeedingHitSets(edm::RunningAverage* localRA)
176  : seedingHitSets_(std::make_unique<RegionsSeedingHitSets>()), localRA_(localRA) {}
177 
178  static void produces(edm::ProducesCollector producesCollector) {
179  producesCollector.produces<RegionsSeedingHitSets>();
180  }
181 
182  void reserve(size_t regionsSize) { seedingHitSets_->reserve(regionsSize, localRA_->upper()); }
183 
184  auto beginRegion(const TrackingRegion* region, LayerHitMapCache*) {
185  hitCacheTmp_.clear();
186  return std::make_tuple(&hitCacheTmp_, seedingHitSets_->beginRegion(region));
187  }
188 
190  for (size_t i = 0, size = doublets.size(); i < size; ++i) {
191  filler.emplace_back(doublets.hit(i, HitDoublets::inner), doublets.hit(i, HitDoublets::outer));
192  }
193  }
194 
195  void put(edm::Event& iEvent) {
196  seedingHitSets_->shrink_to_fit();
197  localRA_->update(seedingHitSets_->size());
198  putEmpty(iEvent);
199  }
200 
201  void putEmpty(edm::Event& iEvent) { iEvent.put(std::move(seedingHitSets_)); }
202 
203  private:
204  std::unique_ptr<RegionsSeedingHitSets> seedingHitSets_;
205  edm::RunningAverage* localRA_;
206  LayerHitMapCache hitCacheTmp_; // used if !produceIntermediateHitDoublets
207  };
208 
210  class ImplIntermediateHitDoublets {
211  public:
212  ImplIntermediateHitDoublets(const SeedingLayerSetsHits* layers)
213  : intermediateHitDoublets_(std::make_unique<IntermediateHitDoublets>(layers)), layers_(layers) {}
214 
215  static void produces(edm::ProducesCollector producesCollector) {
216  producesCollector.produces<IntermediateHitDoublets>();
217  }
218 
219  void reserve(size_t regionsSize) { intermediateHitDoublets_->reserve(regionsSize, layers_->size()); }
220 
221  auto beginRegion(const TrackingRegion* region, LayerHitMapCache*) {
222  auto filler = intermediateHitDoublets_->beginRegion(region);
223  return std::make_tuple(&(filler.layerHitMapCache()), filler);
224  }
225 
228  HitDoublets&& doublets) {
229  filler.addDoublets(layerSet, std::move(doublets));
230  }
231 
232  void put(edm::Event& iEvent) {
233  intermediateHitDoublets_->shrink_to_fit();
234  putEmpty(iEvent);
235  }
236 
237  void putEmpty(edm::Event& iEvent) { iEvent.put(std::move(intermediateHitDoublets_)); }
238 
239  private:
240  std::unique_ptr<IntermediateHitDoublets> intermediateHitDoublets_;
241  const SeedingLayerSetsHits* layers_;
242  };
243 
245  // For the usual case that TrackingRegions and seeding layers are read separately
246  class RegionsLayersSeparate {
247  public:
248  class RegionLayers {
249  public:
250  RegionLayers(const TrackingRegion* region, const std::vector<SeedingLayerSetsHits::SeedingLayerSet>* layerPairs)
251  : region_(region), layerPairs_(layerPairs) {}
252 
253  const TrackingRegion& region() const { return *region_; }
254  const std::vector<SeedingLayerSetsHits::SeedingLayerSet>& layerPairs() const { return *layerPairs_; }
255 
256  private:
257  const TrackingRegion* region_;
258  const std::vector<SeedingLayerSetsHits::SeedingLayerSet>* layerPairs_;
259  };
260 
261  class EventTmp {
262  public:
263  class const_iterator {
264  public:
265  using internal_iterator_type = std::vector<std::unique_ptr<TrackingRegion>>::const_iterator;
266  using value_type = RegionLayers;
267  using difference_type = internal_iterator_type::difference_type;
268 
269  const_iterator(internal_iterator_type iter,
270  const std::vector<SeedingLayerSetsHits::SeedingLayerSet>* layerPairs)
271  : iter_(iter), layerPairs_(layerPairs) {}
272 
273  value_type operator*() const { return value_type(&(**iter_), layerPairs_); }
274 
275  const_iterator& operator++() {
276  ++iter_;
277  return *this;
278  }
279  const_iterator operator++(int) {
280  const_iterator clone(*this);
281  ++(*this);
282  return clone;
283  }
284 
285  bool operator==(const const_iterator& other) const { return iter_ == other.iter_; }
286  bool operator!=(const const_iterator& other) const { return !operator==(other); }
287 
288  private:
289  internal_iterator_type iter_;
290  const std::vector<SeedingLayerSetsHits::SeedingLayerSet>* layerPairs_;
291  };
292 
293  EventTmp(const SeedingLayerSetsHits* seedingLayerSetsHits,
294  const std::vector<std::unique_ptr<TrackingRegion>>* regions,
295  const std::vector<unsigned>& layerPairBegins)
296  : seedingLayerSetsHits_(seedingLayerSetsHits), regions_(regions) {
297  // construct the pairs from the sets
298  if (seedingLayerSetsHits_->numberOfLayersInSet() > 2) {
299  for (const auto& layerSet : *seedingLayerSetsHits_) {
300  for (const auto pairBeginIndex : layerPairBegins) {
301  if (pairBeginIndex + 1 >= seedingLayerSetsHits->numberOfLayersInSet()) {
302  throw cms::Exception("LogicError")
303  << "Layer pair index " << pairBeginIndex
304  << " is out of bounds, input SeedingLayerSetsHits has only "
305  << seedingLayerSetsHits->numberOfLayersInSet()
306  << " layers per set, and the index+1 must be < than the number of layers in set";
307  }
308 
309  // Take only the requested pair of the set
310  SeedingLayerSetsHits::SeedingLayerSet pairCandidate = layerSet.slice(pairBeginIndex, pairBeginIndex + 1);
311 
312  // it would be trivial to use 128-bit bitfield for O(1) check
313  // if a layer pair has been inserted, but let's test first how
314  // a "straightforward" solution works
315  auto found = std::find_if(
316  layerPairs.begin(), layerPairs.end(), [&](const SeedingLayerSetsHits::SeedingLayerSet& pair) {
317  return pair[0].index() == pairCandidate[0].index() && pair[1].index() == pairCandidate[1].index();
318  });
319  if (found != layerPairs.end())
320  continue;
321 
322  layerPairs.push_back(pairCandidate);
323  }
324  }
325  } else {
326  if (layerPairBegins.size() != 1) {
327  throw cms::Exception("LogicError")
328  << "With pairs of input layers, it doesn't make sense to specify more than one input layer pair, got "
329  << layerPairBegins.size();
330  }
331  if (layerPairBegins[0] != 0) {
332  throw cms::Exception("LogicError")
333  << "With pairs of input layers, it doesn't make sense to specify other input layer pair than 0; got "
334  << layerPairBegins[0];
335  }
336 
337  layerPairs.reserve(seedingLayerSetsHits->size());
338  for (const auto& set : *seedingLayerSetsHits)
339  layerPairs.push_back(set);
340  }
341  }
342 
343  const SeedingLayerSetsHits* seedingLayerSetsHitsPtr() const { return seedingLayerSetsHits_; }
344 
345  size_t regionsSize() const { return regions_->size(); }
346 
347  const_iterator begin() const { return const_iterator(regions_->begin(), &layerPairs); }
348  const_iterator cbegin() const { return begin(); }
349  const_iterator end() const { return const_iterator(regions_->end(), &layerPairs); }
350  const_iterator cend() const { return end(); }
351 
352  private:
353  const SeedingLayerSetsHits* seedingLayerSetsHits_;
354  const std::vector<std::unique_ptr<TrackingRegion>>* regions_;
355  std::vector<SeedingLayerSetsHits::SeedingLayerSet> layerPairs;
356  };
357 
358  RegionsLayersSeparate(const std::vector<unsigned>* layerPairBegins,
359  const edm::InputTag& seedingLayerTag,
360  const edm::InputTag& regionTag,
362  : layerPairBegins_(layerPairBegins),
363  seedingLayerToken_(iC.consumes<SeedingLayerSetsHits>(seedingLayerTag)),
364  regionToken_(iC.consumes(regionTag)) {}
365 
366  EventTmp beginEvent(const edm::Event& iEvent) const {
368  iEvent.getByToken(seedingLayerToken_, hlayers);
369  const auto* layers = hlayers.product();
370  if (layers->numberOfLayersInSet() < 2)
371  throw cms::Exception("LogicError")
372  << "HitPairEDProducer expects SeedingLayerSetsHits::numberOfLayersInSet() to be >= 2, got "
373  << layers->numberOfLayersInSet()
374  << ". This is likely caused by a configuration error of this module, or SeedingLayersEDProducer.";
375  auto const& regions = iEvent.get(regionToken_);
376  return EventTmp(layers, &regions, *layerPairBegins_);
377  }
378 
379  private:
380  const std::vector<unsigned>* layerPairBegins_;
381  edm::EDGetTokenT<SeedingLayerSetsHits> seedingLayerToken_;
383  };
384 
386  // For the case of automated pixel inactive region recovery where
387  // TrackingRegions and seeding layers become together
388  class RegionsLayersTogether {
389  public:
390  class EventTmp {
391  public:
393 
394  explicit EventTmp(const TrackingRegionsSeedingLayerSets* regionsLayers) : regionsLayers_(regionsLayers) {
395  if (regionsLayers->seedingLayerSetsHits().numberOfLayersInSet() != 2) {
396  throw cms::Exception("LogicError")
397  << "With trackingRegionsSeedingLayers input, the seeding layer sets may only contain layer pairs, now "
398  "got sets with "
399  << regionsLayers->seedingLayerSetsHits().numberOfLayersInSet() << " layers";
400  }
401  }
402 
403  const SeedingLayerSetsHits* seedingLayerSetsHitsPtr() const { return &(regionsLayers_->seedingLayerSetsHits()); }
404 
405  size_t regionsSize() const { return regionsLayers_->regionsSize(); }
406 
407  const_iterator begin() const { return regionsLayers_->begin(); }
408  const_iterator cbegin() const { return begin(); }
409  const_iterator end() const { return regionsLayers_->end(); }
410  const_iterator cend() const { return end(); }
411 
412  private:
413  const TrackingRegionsSeedingLayerSets* regionsLayers_;
414  };
415 
416  RegionsLayersTogether(const std::vector<unsigned>* layerPairBegins,
417  const edm::InputTag& regionLayerTag,
419  : regionLayerToken_(iC.consumes<TrackingRegionsSeedingLayerSets>(regionLayerTag)) {
420  if (layerPairBegins->size() != 1) {
421  throw cms::Exception("LogicError") << "With trackingRegionsSeedingLayers mode, it doesn't make sense to "
422  "specify more than one input layer pair, got "
423  << layerPairBegins->size();
424  }
425  if ((*layerPairBegins)[0] != 0) {
426  throw cms::Exception("LogicError") << "With trackingRegionsSeedingLayers mode, it doesn't make sense to "
427  "specify other input layer pair than 0; got "
428  << (*layerPairBegins)[0];
429  }
430  }
431 
432  EventTmp beginEvent(const edm::Event& iEvent) const {
434  iEvent.getByToken(regionLayerToken_, hregions);
435  return EventTmp(hregions.product());
436  }
437 
438  private:
440  };
441 } // namespace
442 
444  auto layersTag = iConfig.getParameter<edm::InputTag>("seedingLayers");
445  auto regionTag = iConfig.getParameter<edm::InputTag>("trackingRegions");
446  auto regionLayerTag = iConfig.getParameter<edm::InputTag>("trackingRegionsSeedingLayers");
447  const bool useRegionLayers = !regionLayerTag.label().empty();
448  if (useRegionLayers) {
449  if (!regionTag.label().empty()) {
450  throw cms::Exception("Configuration")
451  << "HitPairEDProducer requires either trackingRegions or trackingRegionsSeedingLayers to be set, now both "
452  "are set to non-empty value. Set the unneeded parameter to empty value.";
453  }
454  if (!layersTag.label().empty()) {
455  throw cms::Exception("Configuration")
456  << "With non-empty trackingRegionsSeedingLayers, please set also seedingLayers to empty value to reduce "
457  "confusion, because the parameter is not used";
458  }
459  }
460  if (regionTag.label().empty() && regionLayerTag.label().empty()) {
461  throw cms::Exception("Configuration")
462  << "HitPairEDProducer requires either trackingRegions or trackingRegionsSeedingLayers to be set, now both are "
463  "set to empty value. Set the needed parameter to a non-empty value.";
464  }
465 
466  const bool produceSeedingHitSets = iConfig.getParameter<bool>("produceSeedingHitSets");
467  const bool produceIntermediateHitDoublets = iConfig.getParameter<bool>("produceIntermediateHitDoublets");
468 
470  if (useRegionLayers)
471  throw cms::Exception("Configuration")
472  << "Mode 'trackingRegionsSeedingLayers' makes sense only with 'produceSeedingHitsSets', now also "
473  "'produceIntermediateHitDoublets is active";
474  impl_ = std::make_unique<::Impl<::ImplSeedingHitSets, ::ImplIntermediateHitDoublets, ::RegionsLayersSeparate>>(
475  iConfig, consumesCollector(), layersTag, regionTag);
476  } else if (produceSeedingHitSets) {
477  if (useRegionLayers) {
478  impl_ = std::make_unique<::Impl<::ImplSeedingHitSets, ::DoNothing, ::RegionsLayersTogether>>(
479  iConfig, consumesCollector(), regionLayerTag);
480  } else {
481  impl_ = std::make_unique<::Impl<::ImplSeedingHitSets, ::DoNothing, ::RegionsLayersSeparate>>(
482  iConfig, consumesCollector(), layersTag, regionTag);
483  }
484  } else if (produceIntermediateHitDoublets) {
485  if (useRegionLayers)
486  throw cms::Exception("Configuration")
487  << "Mode 'trackingRegionsSeedingLayers' makes sense only with 'produceSeedingHitsSets', now "
488  "'produceIntermediateHitDoublets is active instead";
489  impl_ = std::make_unique<::Impl<::DoNothing, ::ImplIntermediateHitDoublets, ::RegionsLayersSeparate>>(
490  iConfig, consumesCollector(), layersTag, regionTag);
491  } else
492  throw cms::Exception("Configuration")
493  << "HitPairEDProducer requires either produceIntermediateHitDoublets or produceSeedingHitSets to be True. If "
494  "neither are needed, just remove this module from your sequence/path as it doesn't do anything useful";
495 
496  auto clusterCheckTag = iConfig.getParameter<edm::InputTag>("clusterCheck");
497  if (!clusterCheckTag.label().empty())
498  clusterCheckToken_ = consumes<bool>(clusterCheckTag);
499 
500  impl_->produces(producesCollector());
501 }
502 
505 
506  desc.add<edm::InputTag>("seedingLayers", edm::InputTag("seedingLayersEDProducer"))
507  ->setComment("Set this empty if 'trackingRegionsSeedingLayers' is non-empty");
508  desc.add<edm::InputTag>("trackingRegions", edm::InputTag("globalTrackingRegionFromBeamSpot"))
509  ->setComment(
510  "Input tracking regions when using all layer sets in 'seedingLayers' (conflicts with "
511  "'trackingRegionsSeedingLayers', set this empty to use the other)");
512  desc.add<edm::InputTag>("trackingRegionsSeedingLayers", edm::InputTag(""))
513  ->setComment(
514  "Input tracking regions and corresponding layer sets in case of dynamically limiting the seeding layers "
515  "(conflicts with 'trackingRegions', set this empty to use the other; if using this set also 'seedingLayers' "
516  "to empty)");
517  desc.add<edm::InputTag>("clusterCheck", edm::InputTag("trackerClusterCheck"));
518  desc.add<bool>("produceSeedingHitSets", false);
519  desc.add<bool>("produceIntermediateHitDoublets", false);
520  desc.add<unsigned int>("maxElement", 1000000);
521  desc.add<unsigned int>("maxElementTotal", 50000000);
522  desc.add<bool>("putEmptyIfMaxElementReached", false)
523  ->setComment(
524  "If set to true (default is 'false'), abort processing and put empty data products also if any layer pair "
525  "yields at least maxElement doublets, in addition to aborting processing if the sum of doublets from all "
526  "layer pairs reaches maxElementTotal.");
527  desc.add<std::vector<unsigned>>("layerPairs", std::vector<unsigned>{0})
528  ->setComment("Indices to the pairs of consecutive layers, i.e. 0 means (0,1), 1 (1,2) etc.");
529 
530  descriptions.add("hitPairEDProducerDefault", desc);
531 }
532 
534  bool clusterCheckOk = true;
536  edm::Handle<bool> hclusterCheck;
537  iEvent.getByToken(clusterCheckToken_, hclusterCheck);
538  clusterCheckOk = *hclusterCheck;
539  }
540 
541  impl_->produce(clusterCheckOk, iEvent, iSetup);
542 }
543 
size
Write out results.
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
ProductRegistryHelper::BranchAliasSetterT< ProductType > produces()
SeedingLayerSet slice(size_t begin, size_t end) const
std::unique_ptr<::ImplBase > impl_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
T const * product() const
Definition: Handle.h:70
constexpr bool isUninitialized() const noexcept
Definition: EDGetToken.h:104
constexpr Process operator++(Process p)
Definition: DataFormats.h:68
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
unsigned short size() const
Get the number of SeedingLayerSets.
std::string const & label() const
Definition: InputTag.h:36
Helper class enforcing correct way of filling the doublets of a region.
Log< level::Error, false > LogError
#define LogTrace(id)
void put(edm::Event &evt, double value, const char *instanceName)
~HitPairEDProducer() override=default
Definition: __init__.py:1
int iEvent
Definition: GenABIO.cc:224
bool operator==(const QGLikelihoodParameters &lhs, const QGLikelihoodCategory &rhs)
Test if parameters are compatible with category.
edm::EDGetTokenT< bool > clusterCheckToken_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
HitPairEDProducer(const edm::ParameterSet &iConfig)
unsigned short numberOfLayersInSet() const
Get number of layers in each SeedingLayerSets.
void reserve(size_t nregions, size_t nhitsets)
Helper class enforcing correct way of filling the doublets of a region.
bool operator!=(DTCELinkId const &lhs, DTCELinkId const &rhs)
Definition: DTCELinkId.h:81
const SeedingLayerSetsHits & seedingLayerSetsHits() const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
void reserve(size_t nregions, size_t nlayersets)
MatrixMeschach operator*(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
long double T
def move(src, dest)
Definition: eostools.py:511