CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RecoTrackAccumulator.cc
Go to the documentation of this file.
6 
8  edm::ProducesCollector producesCollector,
10  : signalTracksTag(conf.getParameter<edm::InputTag>("signalTracks")),
11  pileUpTracksTag(conf.getParameter<edm::InputTag>("pileUpTracks")),
12  outputLabel(conf.getParameter<std::string>("outputLabel")) {
13  producesCollector.produces<reco::TrackCollection>(outputLabel);
14  producesCollector.produces<TrackingRecHitCollection>(outputLabel);
16 
20 }
21 
23 
25  newTracks_ = std::unique_ptr<reco::TrackCollection>(new reco::TrackCollection);
26  newHits_ = std::unique_ptr<TrackingRecHitCollection>(new TrackingRecHitCollection);
27  newTrackExtras_ = std::unique_ptr<reco::TrackExtraCollection>(new reco::TrackExtraCollection);
28 
29  // this is needed to get the ProductId of the TrackExtra and TrackingRecHit and Track collections
30  rNewTracks = const_cast<edm::Event&>(e).getRefBeforePut<reco::TrackCollection>(outputLabel);
31  rNewTrackExtras = const_cast<edm::Event&>(e).getRefBeforePut<reco::TrackExtraCollection>(outputLabel);
32  rNewHits = const_cast<edm::Event&>(e).getRefBeforePut<TrackingRecHitCollection>(outputLabel);
33 }
34 
36  accumulateEvent(e, iSetup, signalTracksTag);
37 }
38 
40  edm::EventSetup const& iSetup,
41  edm::StreamID const&) {
42  if (e.bunchCrossing() == 0) {
43  accumulateEvent(e, iSetup, pileUpTracksTag);
44  }
45 }
46 
51 }
52 
53 template <class T>
58  e.getByLabel(label, tracks);
59  e.getByLabel(label, hits);
60  e.getByLabel(label, trackExtras);
61 
62  if (!tracks.isValid()) {
63  throw cms::Exception("RecoTrackAccumulator")
64  << "Failed to find track collections with inputTag " << label << std::endl;
65  }
66  if (!hits.isValid()) {
67  throw cms::Exception("RecoTrackAccumulator")
68  << "Failed to find hit collections with inputTag " << label << std::endl;
69  }
70  if (!trackExtras.isValid()) {
71  throw cms::Exception("RecoTrackAccumulator")
72  << "Failed to find trackExtra collections with inputTag " << label << std::endl;
73  }
74 
75  for (size_t t = 0; t < tracks->size(); ++t) {
76  const reco::Track& track = (*tracks)[t];
77  newTracks_->push_back(track);
78  // track extras:
79  auto const& extra = trackExtras->at(track.extra().key());
80  newTrackExtras_->emplace_back(extra.outerPosition(),
81  extra.outerMomentum(),
82  extra.outerOk(),
83  extra.innerPosition(),
84  extra.innerMomentum(),
85  extra.innerOk(),
86  extra.outerStateCovariance(),
87  extra.outerDetId(),
88  extra.innerStateCovariance(),
89  extra.innerDetId(),
90  extra.seedDirection(),
91  //If TrajectorySeeds are needed, then their list must be gotten from the
92  // secondary event directly and looked up similarly to TrackExtras.
93  //We can't use a default constructed RefToBase due to a bug in RefToBase
94  // which causes an seg fault when calling isAvailable on a default constructed one.
96  newTracks_->back().setExtra(reco::TrackExtraRef(rNewTrackExtras, newTracks_->size() - 1));
97  // rechits:
98  // note: extra.recHit(i) does not work for pileup events
99  // probably the Ref does not know its product id applies on a pileup event
100  auto& newExtra = newTrackExtras_->back();
101  auto const firstTrackIndex = newHits_->size();
102  for (unsigned int i = 0; i < extra.recHitsSize(); i++) {
103  newHits_->push_back((*hits)[extra.recHit(i).key()]);
104  }
105  newExtra.setHits(rNewHits, firstTrackIndex, newHits_->size() - firstTrackIndex);
106  newExtra.setTrajParams(extra.trajParams(), extra.chi2sX5());
107  assert(newExtra.recHitsSize() == newExtra.trajParams().size());
108  }
109 }
110 
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
void accumulateEvent(const T &e, edm::EventSetup const &c, const edm::InputTag &label)
const TrackExtraRef & extra() const
reference to "extra" object
Definition: Track.h:139
ProductRegistryHelper::BranchAliasSetterT< ProductType > produces()
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
void initializeEvent(edm::Event const &e, edm::EventSetup const &c) override
key_type key() const
Accessor for product key.
Definition: Ref.h:250
void accumulate(edm::Event const &e, edm::EventSetup const &c) override
char const * label
std::unique_ptr< reco::TrackCollection > newTracks_
TrackingRecHitRefProd rNewHits
std::unique_ptr< reco::TrackExtraCollection > newTrackExtras_
reco::TrackRefProd rNewTracks
bool isValid() const
Definition: HandleBase.h:70
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:10
edm::OwnVector< TrackingRecHit > TrackingRecHitCollection
collection of TrackingRecHits
std::unique_ptr< TrackingRecHitCollection > newHits_
void finalizeEvent(edm::Event &e, edm::EventSetup const &c) override
HLT enums.
#define DEFINE_DIGI_ACCUMULATOR(type)
long double T
def move(src, dest)
Definition: eostools.py:511
RecoTrackAccumulator(const edm::ParameterSet &conf, edm::ProducesCollector, edm::ConsumesCollector &iC)
reco::TrackExtraRefProd rNewTrackExtras