![]() |
![]() |
#include <TrackMerger.h>
Classes | |
class | GlobalMomentumSort |
class | MomentumSort |
Public Member Functions | |
void | init (const edm::EventSetup &iSetup) |
TrackCandidate | merge (const reco::Track &inner, const reco::Track &outer) const |
TrackMerger (const edm::ParameterSet &iConfig) | |
~TrackMerger () | |
Private Member Functions | |
int | layer (DetId detid) const |
Private Attributes | |
bool | debug_ |
edm::ESHandle < TransientTrackingRecHitBuilder > | theBuilder |
std::string | theBuilderName |
edm::ESHandle< TrackerGeometry > | theGeometry |
edm::ESHandle< MagneticField > | theMagField |
bool | useInnermostState_ |
Definition at line 11 of file TrackMerger.h.
TrackMerger::TrackMerger | ( | const edm::ParameterSet & | iConfig | ) |
Definition at line 23 of file TrackMerger.cc.
: useInnermostState_(iConfig.getParameter<bool>("useInnermostState")), debug_(iConfig.getUntrackedParameter<bool>("debug",false)), theBuilderName(iConfig.getParameter<std::string>("ttrhBuilderName")) { }
TrackMerger::~TrackMerger | ( | ) |
Definition at line 30 of file TrackMerger.cc.
{ }
void TrackMerger::init | ( | const edm::EventSetup & | iSetup | ) |
Definition at line 34 of file TrackMerger.cc.
References edm::EventSetup::get(), theBuilder, theBuilderName, theGeometry, and theMagField.
Referenced by reco::modules::DuplicateTrackMerger::produce().
{ iSetup.get<TrackerDigiGeometryRecord>().get(theGeometry); iSetup.get<IdealMagneticFieldRecord>().get(theMagField); iSetup.get<TransientRecHitRecord>().get(theBuilderName,theBuilder); }
int TrackMerger::layer | ( | DetId | detid | ) | const [private] |
Definition at line 161 of file TrackMerger.cc.
References PXFDetId::disk(), TIBDetId::layer(), TOBDetId::layer(), PXBDetId::layer(), PixelSubdetector::PixelBarrel, PixelSubdetector::PixelEndcap, DetId::subdetId(), StripSubdetector::TEC, StripSubdetector::TIB, StripSubdetector::TID, StripSubdetector::TOB, TIDDetId::wheel(), and TECDetId::wheel().
Referenced by merge().
{ switch (detid.subdetId()) { case PixelSubdetector::PixelBarrel: return PXBDetId(detid).layer(); case PixelSubdetector::PixelEndcap: return PXFDetId(detid).disk(); case StripSubdetector::TIB: return TIBDetId(detid).layer(); case StripSubdetector::TID: return TIDDetId(detid).wheel(); case StripSubdetector::TOB: return TOBDetId(detid).layer(); case StripSubdetector::TEC: return TECDetId(detid).wheel(); } return -1; // never match }
TrackCandidate TrackMerger::merge | ( | const reco::Track & | inner, |
const reco::Track & | outer | ||
) | const |
Definition at line 41 of file TrackMerger.cc.
References TrackingRecHit::all, alongMomentum, gather_cfg::cout, debug_, TrackingRecHit::geographicalId(), i, reco::Track::innerDetId(), reco::Track::innerMomentum(), reco::Track::innerPosition(), trajectoryStateTransform::innerStateOnSurface(), TrackingRecHit::isValid(), layer(), reco::TrackBase::momentum(), oppositeToMomentum, reco::Track::outerDetId(), reco::Track::outerMomentum(), reco::Track::outerPosition(), trajectoryStateTransform::outerStateOnSurface(), AlCaHLTBitMon_ParallelJobs::p, trajectoryStateTransform::persistentState(), edm::OwnVector< T, P >::push_back(), reco::Track::recHitsBegin(), reco::Track::recHitsEnd(), reco::Track::recHitsSize(), edm::OwnVector< T, P >::reserve(), TrackingRecHit::sharesInput(), edm::OwnVector< T, P >::size(), python::multivaluedict::sort(), evf::utils::state, DetId::subdetId(), theBuilder, theGeometry, theMagField, useInnermostState_, v, and TrackValidation_HighPurity_cff::valid.
Referenced by reco::modules::DuplicateTrackMerger::produce().
{ std::vector<const TrackingRecHit *> hits; hits.reserve(inner.recHitsSize() + outer.recHitsSize()); if (debug_) std::cout << "Inner track hits: " << std::endl; for (trackingRecHit_iterator it = inner.recHitsBegin(), ed = inner.recHitsEnd(); it != ed; ++it) { hits.push_back(&**it); if (debug_) { DetId id(hits.back()->geographicalId()); std::cout << " subdet " << id.subdetId() << " layer " << layer(id) << " valid " << hits.back()->isValid() << " detid: " << id() << std::endl; } } if (debug_) std::cout << "Outer track hits: " << std::endl; #if TRACK_SORT DetId lastId(hits.back()->geographicalId()); int lastSubdet = lastId.subdetId(), lastLayer = layer(lastId); for (trackingRecHit_iterator it = outer.recHitsBegin(), ed = outer.recHitsEnd(); it != ed; ++it) { const TrackingRecHit *hit = &**it; DetId id(hit->geographicalId()); int thisSubdet = id.subdetId(); if (thisSubdet > lastSubdet || (thisSubdet == lastSubdet && layer(id) > lastLayer)) { hits.push_back(hit); if (debug_) std::cout << " adding subdet " << id.subdetId() << " layer " << layer(id) << " valid " << hit->isValid() << " detid: " << id() << std::endl; } else { if (debug_) std::cout << " skipping subdet " << thisSubdet << " layer " << layer(id) << " valid " << hit->isValid() << " detid: " << id() << std::endl; } } #else size_t nHitsFirstTrack = hits.size(); for (trackingRecHit_iterator it = outer.recHitsBegin(), ed = outer.recHitsEnd(); it != ed; ++it) { const TrackingRecHit *hit = &**it; DetId id(hit->geographicalId()); int lay = layer(id); bool shared = false; bool valid = hit->isValid(); if (debug_) std::cout << " subdet " << id.subdetId() << " layer " << layer(id) << " valid " << valid << " detid: " << id() << std::endl; size_t iHit = 0; foreach(const TrackingRecHit *& hit2, hits) { ++iHit; if (iHit > nHitsFirstTrack) break; DetId id2 = hit2->geographicalId(); if (id.subdetId() != id2.subdetId()) continue; if (layer(id2) != lay) continue; if (hit->sharesInput(hit2, TrackingRecHit::all)) { if (debug_) std::cout << " discared as duplicate of other hit" << id() << std::endl; shared = true; break; } if (hit2->isValid() && !valid) { if (debug_) std::cout << " replacing old invalid hit on detid " << id2() << std::endl; hit2 = hit; shared = true; break; } if (debug_) std::cout << " discared as additional hit on layer that already contains hit with detid " << id() << std::endl; shared = true; break; } if (shared) continue; hits.push_back(hit); } #endif math::XYZVector p = (inner.innerMomentum() + outer.outerMomentum()); GlobalVector v(p.x(), p.y(), p.z()); if (!useInnermostState_) v *= -1; TrackCandidate::RecHitContainer ownHits; unsigned int nhits = hits.size(); ownHits.reserve(nhits); #if TRACK_SORT if (!useInnermostState_) std::reverse(hits.begin(), hits.end()); foreach(const TrackingRecHit * hit, hits) { ownHits.push_back(*hit); } #elif DET_SORT // OLD METHOD, sometimes fails std::sort(hits.begin(), hits.end(), MomentumSort(v, &*theGeometry)); foreach(const TrackingRecHit * hit, hits) { ownHits.push_back(*hit); } #else // NEW sort, more accurate std::vector<TransientTrackingRecHit::RecHitPointer> ttrh(nhits); for (unsigned int i = 0; i < nhits; ++i) ttrh[i] = theBuilder->build(hits[i]); std::sort(ttrh.begin(), ttrh.end(), GlobalMomentumSort(v)); foreach(const TransientTrackingRecHit::RecHitPointer & hit, ttrh) { ownHits.push_back(*hit->hit()); } #endif PTrajectoryStateOnDet state; PropagationDirection pdir; if (useInnermostState_) { pdir = alongMomentum; if ((inner.outerPosition()-inner.innerPosition()).Dot(inner.momentum()) >= 0) { // use inner state TrajectoryStateOnSurface originalTsosIn(trajectoryStateTransform::innerStateOnSurface(inner, *theGeometry, &*theMagField)); state = trajectoryStateTransform::persistentState( originalTsosIn, DetId(inner.innerDetId()) ); } else { // use outer state TrajectoryStateOnSurface originalTsosOut(trajectoryStateTransform::outerStateOnSurface(inner, *theGeometry, &*theMagField)); state = trajectoryStateTransform::persistentState( originalTsosOut, DetId(inner.outerDetId()) ); } } else { pdir = oppositeToMomentum; if ((outer.outerPosition()-inner.innerPosition()).Dot(inner.momentum()) >= 0) { // use outer state TrajectoryStateOnSurface originalTsosOut(trajectoryStateTransform::outerStateOnSurface(outer, *theGeometry, &*theMagField)); state = trajectoryStateTransform::persistentState( originalTsosOut, DetId(outer.outerDetId()) ); } else { // use inner state TrajectoryStateOnSurface originalTsosIn(trajectoryStateTransform::innerStateOnSurface(outer, *theGeometry, &*theMagField)); state = trajectoryStateTransform::persistentState( originalTsosIn, DetId(outer.innerDetId()) ); } } TrajectorySeed seed(state, TrackCandidate::RecHitContainer(), pdir); return TrackCandidate(ownHits, seed, state, (useInnermostState_ ? inner : outer).seedRef()); }
bool TrackMerger::debug_ [private] |
Definition at line 23 of file TrackMerger.h.
Referenced by merge().
Definition at line 25 of file TrackMerger.h.
std::string TrackMerger::theBuilderName [private] |
Definition at line 24 of file TrackMerger.h.
Referenced by init().
edm::ESHandle<TrackerGeometry> TrackMerger::theGeometry [private] |
Definition at line 20 of file TrackMerger.h.
edm::ESHandle<MagneticField> TrackMerger::theMagField [private] |
Definition at line 21 of file TrackMerger.h.
bool TrackMerger::useInnermostState_ [private] |
Definition at line 22 of file TrackMerger.h.
Referenced by merge().