CMS 3D CMS Logo

Classes | Public Member Functions | Private Member Functions | Private Attributes

TrackMerger Class Reference

#include <TrackMerger.h>

List of all members.

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< TrackerGeometrytheGeometry
edm::ESHandle< MagneticFieldtheMagField
bool useInnermostState_

Detailed Description

Definition at line 11 of file TrackMerger.h.


Constructor & Destructor Documentation

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.

{
}

Member Function Documentation

void TrackMerger::init ( const edm::EventSetup iSetup)
int TrackMerger::layer ( DetId  detid) const [private]
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());
}

Member Data Documentation

bool TrackMerger::debug_ [private]

Definition at line 23 of file TrackMerger.h.

Referenced by merge().

Definition at line 25 of file TrackMerger.h.

Referenced by init(), and merge().

std::string TrackMerger::theBuilderName [private]

Definition at line 24 of file TrackMerger.h.

Referenced by init().

Definition at line 20 of file TrackMerger.h.

Referenced by init(), and merge().

Definition at line 21 of file TrackMerger.h.

Referenced by init(), and merge().

Definition at line 22 of file TrackMerger.h.

Referenced by merge().