CMS 3D CMS Logo

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

reco::modules::TrackMultiSelector Class Reference

#include <TrackMultiSelector.h>

Inheritance diagram for reco::modules::TrackMultiSelector:
edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Classes

struct  Block

Public Member Functions

 TrackMultiSelector (const edm::ParameterSet &cfg)
 constructor
virtual ~TrackMultiSelector ()
 destructor

Private Types

typedef math::XYZPoint Point

Private Member Functions

void produce (edm::Event &evt, const edm::EventSetup &es)
 process one event
short select (const reco::Track &tk, const reco::BeamSpot &beamSpot, const std::vector< Point > &points)
 return class, or -1 if rejected
void selectVertices (const reco::VertexCollection &vtxs, std::vector< Point > &points)
bool testVtx (const reco::Track &tk, const reco::BeamSpot &beamSpot, const std::vector< Point > &points, const Block &cut)

Private Attributes

edm::InputTag beamspot_
double beamspotD0_
double beamspotDZsigmas_
std::vector< Blockblocks_
 filter psets
bool copyExtras_
 copy only the tracks, not extras and rechits (for AOD)
bool copyTrajectories_
 copy also trajectories and trajectory->track associations
std::vector< std::string > labels_
 output labels
std::vector
< TrackingRecHitRefProd
rHits_
std::vector
< reco::TrackExtraRefProd
rTrackExtras_
std::vector< reco::TrackRefProdrTracks_
std::vector< edm::RefProd
< std::vector< Trajectory > > > 
rTrajectories_
std::auto_ptr
< TrackingRecHitCollection > * 
selHits_
std::auto_ptr
< reco::TrackExtraCollection > * 
selTrackExtras_
std::auto_ptr
< reco::TrackCollection > * 
selTracks_
 some storage
std::auto_ptr< std::vector
< Trajectory > > * 
selTrajs_
std::auto_ptr
< TrajTrackAssociationCollection > * 
selTTAss_
bool splitOutputs_
 split selections in more sets
edm::InputTag src_
 source collection label
edm::InputTag vertices_
double vtxChi2Prob_
int32_t vtxNumber_
 vertex cuts
size_t vtxTracks_
std::vector< std::pair< short,
reco::TrackRef > > 
whereItWent_

Detailed Description

Definition at line 37 of file TrackMultiSelector.h.


Member Typedef Documentation

Definition at line 56 of file TrackMultiSelector.h.


Constructor & Destructor Documentation

TrackMultiSelector::TrackMultiSelector ( const edm::ParameterSet cfg) [explicit]

constructor

Definition at line 22 of file TrackMultiSelector.cc.

References beamspot_, beamspotD0_, beamspotDZsigmas_, blocks_, copyExtras_, copyTrajectories_, edm::ParameterSet::getParameter(), i, prof2calltree::l, labels_, asciidump::le, rHits_, rTrackExtras_, rTracks_, rTrajectories_, selHits_, selTrackExtras_, selTracks_, selTrajs_, selTTAss_, and splitOutputs_.

                                                                    :
    src_( cfg.getParameter<edm::InputTag>( "src" ) ),
    vertices_( cfg.getParameter<edm::InputTag>( "vertices" ) ),
    copyExtras_(cfg.getUntrackedParameter<bool>("copyExtras", false)),
    copyTrajectories_(cfg.getUntrackedParameter<bool>("copyTrajectories", false)),
    splitOutputs_( cfg.getUntrackedParameter<bool>("splitOutputs", false) ),
    vtxNumber_( cfg.getParameter<int32_t>("vtxNumber") ),
    vtxTracks_( cfg.getParameter<uint32_t>("vtxTracks") ),
    vtxChi2Prob_( cfg.getParameter<double>("vtxChi2Prob") )
{
    edm::ParameterSet beamSpotPSet = cfg.getParameter<edm::ParameterSet>("beamspot");
    beamspot_   = beamSpotPSet.getParameter<edm::InputTag>("src");
    beamspotDZsigmas_ = beamSpotPSet.getParameter<double>("dzSigmas"); 
    beamspotD0_ = beamSpotPSet.getParameter<double>("d0"); 

    typedef std::vector<edm::ParameterSet> VPSet;
    VPSet psets = cfg.getParameter<VPSet>("cutSets");
    blocks_.reserve(psets.size());
    for (VPSet::const_iterator it = psets.begin(), ed = psets.end(); it != ed; ++it) {
        blocks_.push_back(TrackMultiSelector::Block(*it));
    }

    if (splitOutputs_) {
        char buff[15];
        for (size_t i = 0; i < blocks_.size(); ++i) {
            sprintf(buff,"set%d", static_cast<int>(i+1)); 
            labels_.push_back(std::string(buff));
        }
    } else {
        labels_.push_back(std::string(""));
    }

    std::string alias( cfg.getParameter<std::string>( "@module_label" ) );
    for (std::vector<std::string>::const_iterator li = labels_.begin(), le = labels_.end(); li != le; ++li) {
        const char *l= li->c_str();
        produces<reco::TrackCollection>(l).setBranchAlias( alias + "Tracks" + l);
        if (copyExtras_) {
            produces<reco::TrackExtraCollection>(l).setBranchAlias( alias + "TrackExtras" + l);
            produces<TrackingRecHitCollection>(l).setBranchAlias( alias + "RecHits" + l);
            if (copyTrajectories_) {
                produces< std::vector<Trajectory> >(l).setBranchAlias( alias + "Trajectories" + l);
                produces< TrajTrackAssociationCollection >(l).setBranchAlias( alias + "TrajectoryTrackAssociations" + l);
            }
        }
    } 

    size_t nblocks = splitOutputs_ ? blocks_.size() : 1;
    selTracks_ = new std::auto_ptr<reco::TrackCollection>[nblocks];
    selTrackExtras_ = new std::auto_ptr<reco::TrackExtraCollection>[nblocks]; 
    selHits_ = new std::auto_ptr<TrackingRecHitCollection>[nblocks]; 
    selTrajs_ = new std::auto_ptr< std::vector<Trajectory> >[nblocks]; 
    selTTAss_ = new std::auto_ptr< TrajTrackAssociationCollection >[nblocks]; 
    rTracks_ = std::vector<reco::TrackRefProd>(nblocks);
    rHits_ = std::vector<TrackingRecHitRefProd>(nblocks);
    rTrackExtras_ = std::vector<reco::TrackExtraRefProd>(nblocks);
    rTrajectories_ = std::vector< edm::RefProd< std::vector<Trajectory> > >(nblocks);
    for (size_t i = 0; i < nblocks; i++) {
        selTracks_[i] = std::auto_ptr<reco::TrackCollection>(new reco::TrackCollection());
        selTrackExtras_[i] = std::auto_ptr<reco::TrackExtraCollection>(new reco::TrackExtraCollection());
        selHits_[i] = std::auto_ptr<TrackingRecHitCollection>(new TrackingRecHitCollection());
        selTrajs_[i] = std::auto_ptr< std::vector<Trajectory> >(new std::vector<Trajectory>()); 
        selTTAss_[i] = std::auto_ptr< TrajTrackAssociationCollection >(new TrajTrackAssociationCollection());
    }
 
}
TrackMultiSelector::~TrackMultiSelector ( ) [virtual]

destructor

Definition at line 88 of file TrackMultiSelector.cc.

References selHits_, selTrackExtras_, selTracks_, selTrajs_, and selTTAss_.

                                        {
    delete [] selTracks_; 
    delete [] selTrackExtras_;
    delete [] selHits_;
    delete [] selTrajs_;
    delete [] selTTAss_;
}

Member Function Documentation

void TrackMultiSelector::produce ( edm::Event evt,
const edm::EventSetup es 
) [private, virtual]

process one event

Implements edm::EDProducer.

Definition at line 96 of file TrackMultiSelector.cc.

References reco::TrackExtraBase::add(), beamspot_, blocks_, copyExtras_, copyTrajectories_, cond::rpcobimon::current, edm::friendlyname::emptyString(), first, edm::Event::getByLabel(), edm::Event::getRefBeforePut(), i, reco::Track::innerDetId(), reco::Track::innerMomentum(), reco::Track::innerOk(), reco::Track::innerPosition(), reco::Track::innerStateCovariance(), edm::Ref< C, T, F >::key(), labels_, match(), n, reco::Track::outerDetId(), reco::Track::outerMomentum(), reco::Track::outerOk(), reco::Track::outerPosition(), reco::Track::outerStateCovariance(), edm::Event::put(), reco::Track::recHitsBegin(), reco::Track::recHitsEnd(), dt_dqm_sourceclient_common_cff::reco, reco::Track::residuals(), rHits_, rTrackExtras_, rTracks_, rTrajectories_, edm::second(), reco::Track::seedDirection(), reco::Track::seedRef(), select(), selectVertices(), selHits_, selTrackExtras_, selTracks_, selTrajs_, selTTAss_, reco::TrackExtra::setResiduals(), findQualityFiles::size, splitOutputs_, src_, vertices_, vtxNumber_, and whereItWent_.

{
    using namespace std; 
    using namespace edm;
    using namespace reco;

    size_t nblocks = splitOutputs_ ? blocks_.size() : 1;

    Handle<TrackCollection> hSrcTrack;
    Handle< vector<Trajectory> > hTraj;
    Handle< TrajTrackAssociationCollection > hTTAss;

    edm::Handle<reco::VertexCollection> hVtx;
    evt.getByLabel(vertices_, hVtx);
    std::vector<Point> points;
    if (vtxNumber_ != 0) selectVertices(*hVtx, points);

    edm::Handle<reco::BeamSpot> hBsp;
    evt.getByLabel(beamspot_, hBsp);

    evt.getByLabel( src_, hSrcTrack );

    for (size_t i = 0; i < nblocks; i++) {
        selTracks_[i] = auto_ptr<TrackCollection>(new TrackCollection());
        rTracks_[i] = evt.getRefBeforePut<TrackCollection>(labels_[i]);      
        if (copyExtras_) {
            selTrackExtras_[i] = auto_ptr<TrackExtraCollection>(new TrackExtraCollection());
            selHits_[i] = auto_ptr<TrackingRecHitCollection>(new TrackingRecHitCollection());
            rHits_[i] = evt.getRefBeforePut<TrackingRecHitCollection>(labels_[i]);
            rTrackExtras_[i] = evt.getRefBeforePut<TrackExtraCollection>(labels_[i]);
        }
    }
    
    if (copyTrajectories_) whereItWent_.resize(hSrcTrack->size());
    size_t current = 0;
    for (TrackCollection::const_iterator it = hSrcTrack->begin(), ed = hSrcTrack->end(); it != ed; ++it, ++current) {
        const Track & trk = * it;
        short where = select(trk, *hBsp, points); 
        if (where == -1) {
            if (copyTrajectories_) whereItWent_[current] = std::pair<short, reco::TrackRef>(-1, reco::TrackRef());
            continue;
        }
        if (!splitOutputs_) where = 0;
        selTracks_[where]->push_back( Track( trk ) ); // clone and store
        if (!copyExtras_) continue;

        // TrackExtras
        selTrackExtras_[where]->push_back( TrackExtra( trk.outerPosition(), trk.outerMomentum(), trk.outerOk(),
                    trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
                    trk.outerStateCovariance(), trk.outerDetId(),
                    trk.innerStateCovariance(), trk.innerDetId(),
                    trk.seedDirection(), trk.seedRef() ) );
        selTracks_[where]->back().setExtra( TrackExtraRef( rTrackExtras_[where], selTrackExtras_[where]->size() - 1) );
        TrackExtra & tx = selTrackExtras_[where]->back();
        tx.setResiduals(trk.residuals());
        // TrackingRecHits
        for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit ) {
            selHits_[where]->push_back( (*hit)->clone() );
            tx.add( TrackingRecHitRef( rHits_[where], selHits_[where]->size() - 1) );
        }
        if (copyTrajectories_) {
            whereItWent_[current] = std::pair<short, reco::TrackRef>(where, TrackRef(rTracks_[where], selTracks_[where]->size() - 1));
        }
    }
    if ( copyTrajectories_ ) {
        Handle< vector<Trajectory> > hTraj;
        Handle< TrajTrackAssociationCollection > hTTAss;
        evt.getByLabel(src_, hTTAss);
        evt.getByLabel(src_, hTraj);
        for (size_t i = 0; i < nblocks; i++) {
            rTrajectories_[i] = evt.getRefBeforePut< vector<Trajectory> >(labels_[i]);
            selTrajs_[i] = auto_ptr< vector<Trajectory> >(new vector<Trajectory>()); 
            selTTAss_[i] = auto_ptr< TrajTrackAssociationCollection >(new TrajTrackAssociationCollection());
        }
        for (size_t i = 0, n = hTraj->size(); i < n; ++i) {
            Ref< vector<Trajectory> > trajRef(hTraj, i);
            TrajTrackAssociationCollection::const_iterator match = hTTAss->find(trajRef);
            if (match != hTTAss->end()) {
                const Ref<TrackCollection> &trkRef = match->val; 
                short oldKey = static_cast<short>(trkRef.key());
                if (whereItWent_[oldKey].first != -1) {
                    int where = whereItWent_[oldKey].first;
                    selTrajs_[where]->push_back( Trajectory(*trajRef) );
                    selTTAss_[where]->insert ( Ref< vector<Trajectory> >(rTrajectories_[where], selTrajs_[where]->size() - 1), whereItWent_[oldKey].second );
                }
            }
        }
    }


    static const std::string emptyString;
    for (size_t i = 0; i < nblocks; i++) {
        const std::string & lbl = ( splitOutputs_ ? labels_[i] : emptyString);
        evt.put(selTracks_[i], lbl);
        if (copyExtras_ ) {
            evt.put(selTrackExtras_[i], lbl); 
            evt.put(selHits_[i], lbl);
            if ( copyTrajectories_ ) {
                evt.put(selTrajs_[i], lbl);
                evt.put(selTTAss_[i], lbl);
            }
        }
    }
}
short TrackMultiSelector::select ( const reco::Track tk,
const reco::BeamSpot beamSpot,
const std::vector< Point > &  points 
) [private]

return class, or -1 if rejected

Definition at line 219 of file TrackMultiSelector.cc.

References blocks_, reco::TrackBase::hitPattern(), reco::TrackBase::normalizedChi2(), reco::TrackBase::numberOfLostHits(), reco::TrackBase::pt(), testVtx(), and reco::HitPattern::trackerLayersWithMeasurement().

Referenced by produce().

                                                                                                                  {
   uint32_t vlayers = tk.hitPattern().trackerLayersWithMeasurement(), lhits = tk.numberOfLostHits();
   double pt = tk.pt(), chi2n =  tk.normalizedChi2();
   int which = 0;
   for (std::vector<TrackMultiSelector::Block>::const_iterator itb = blocks_.begin(), edb = blocks_.end(); itb != edb; ++itb, ++which) {
        if ( ( itb->vlayers.first <= vlayers ) && ( vlayers <= itb->vlayers.second ) &&
             ( itb->chi2n.first <= chi2n ) && ( chi2n <= itb->chi2n.second ) &&
             ( itb->pt.first    <= pt    ) && ( pt    <= itb->pt.second    ) &&
             ( itb->lhits.first <= lhits ) && ( lhits <= itb->lhits.second ) &&
             testVtx(tk, beamSpot, points, *itb) ) 
        {
            return which;
        }
    }
    return -1;
}
void TrackMultiSelector::selectVertices ( const reco::VertexCollection vtxs,
std::vector< Point > &  points 
) [private]

Definition at line 235 of file TrackMultiSelector.cc.

References dt_dqm_sourceclient_common_cff::reco, vtxChi2Prob_, vtxNumber_, and vtxTracks_.

Referenced by produce().

                                                                                                  {
    using namespace reco;

    int32_t toTake = vtxNumber_; 
    for (VertexCollection::const_iterator it = vtxs.begin(), ed = vtxs.end(); it != ed; ++it) {
        if ((it->tracksSize() >= vtxTracks_)  && 
                ( (it->chi2() == 0.0) || (TMath::Prob(it->chi2(), static_cast<int32_t>(it->ndof()) ) >= vtxChi2Prob_) ) ) {
            points.push_back(it->position()); 
            toTake--; if (toTake == 0) break;
        }
    }
}
bool TrackMultiSelector::testVtx ( const reco::Track tk,
const reco::BeamSpot beamSpot,
const std::vector< Point > &  points,
const Block cut 
) [inline, private]

Definition at line 201 of file TrackMultiSelector.cc.

References abs, beamspotD0_, beamspotDZsigmas_, debug_cff::d0, reco::modules::TrackMultiSelector::Block::d0, reco::TrackBase::d0Error(), reco::modules::TrackMultiSelector::Block::d0Rel, reco::TrackBase::dxy(), reco::modules::TrackMultiSelector::Block::dz, reco::TrackBase::dz(), reco::TrackBase::dzError(), reco::modules::TrackMultiSelector::Block::dzRel, end, max(), point, reco::BeamSpot::position(), and reco::BeamSpot::sigmaZ().

Referenced by select().

                                                                               {
    using std::abs;
    double d0Err =abs(tk.d0Error()), dzErr = abs(tk.dzError());  // not fully sure they're > 0!
    if (points.empty()) {
        Point spot = beamSpot.position();
        double dz = abs(tk.dz(spot)), d0 = abs(tk.dxy(spot));
        return ( dz < beamspotDZsigmas_*beamSpot.sigmaZ() ) && ( d0 < beamspotD0_ );
    }
    for (std::vector<Point>::const_iterator point = points.begin(), end = points.end(); point != end; ++point) {
        double dz = abs(tk.dz(*point)), d0 = abs(tk.dxy(*point));
        if ((dz < cut.dz) && (d0 < cut.d0) 
            && fabs(dz/std::max(dzErr,1e-9)) < cut.dzRel && (d0/std::max(d0Err,1e-8) < cut.d0Rel )) return true;
    }
    return false;
}

Member Data Documentation

Definition at line 67 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

Definition at line 68 of file TrackMultiSelector.h.

Referenced by testVtx(), and TrackMultiSelector().

Definition at line 68 of file TrackMultiSelector.h.

Referenced by testVtx(), and TrackMultiSelector().

filter psets

Definition at line 76 of file TrackMultiSelector.h.

Referenced by produce(), select(), and TrackMultiSelector().

copy only the tracks, not extras and rechits (for AOD)

Definition at line 70 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

copy also trajectories and trajectory->track associations

Definition at line 72 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

std::vector<std::string> reco::modules::TrackMultiSelector::labels_ [private]

output labels

Definition at line 82 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

Definition at line 91 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

Definition at line 90 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

Definition at line 89 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

Definition at line 92 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

Definition at line 86 of file TrackMultiSelector.h.

Referenced by produce(), TrackMultiSelector(), and ~TrackMultiSelector().

Definition at line 85 of file TrackMultiSelector.h.

Referenced by produce(), TrackMultiSelector(), and ~TrackMultiSelector().

some storage

Definition at line 84 of file TrackMultiSelector.h.

Referenced by produce(), TrackMultiSelector(), and ~TrackMultiSelector().

std::auto_ptr< std::vector<Trajectory> >* reco::modules::TrackMultiSelector::selTrajs_ [private]

Definition at line 87 of file TrackMultiSelector.h.

Referenced by produce(), TrackMultiSelector(), and ~TrackMultiSelector().

Definition at line 88 of file TrackMultiSelector.h.

Referenced by produce(), TrackMultiSelector(), and ~TrackMultiSelector().

split selections in more sets

Definition at line 74 of file TrackMultiSelector.h.

Referenced by produce(), and TrackMultiSelector().

source collection label

Definition at line 65 of file TrackMultiSelector.h.

Referenced by produce().

Definition at line 66 of file TrackMultiSelector.h.

Referenced by produce().

Definition at line 80 of file TrackMultiSelector.h.

Referenced by selectVertices().

vertex cuts

Definition at line 78 of file TrackMultiSelector.h.

Referenced by produce(), and selectVertices().

Definition at line 79 of file TrackMultiSelector.h.

Referenced by selectVertices().

std::vector< std::pair<short, reco::TrackRef> > reco::modules::TrackMultiSelector::whereItWent_ [private]

Definition at line 93 of file TrackMultiSelector.h.

Referenced by produce().