CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/SimMuon/MCTruth/interface/MuonAssociatorByHits.h

Go to the documentation of this file.
00001 #ifndef MuonAssociatorByHits_h
00002 #define MuonAssociatorByHits_h
00003 
00004 #include "FWCore/Framework/interface/Frameworkfwd.h"
00005 #include "FWCore/Framework/interface/Event.h"
00006 #include "FWCore/Framework/interface/EventSetup.h"
00007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00008 #include "FWCore/Utilities/interface/InputTag.h"
00009 #include "DataFormats/Common/interface/Handle.h"
00010 #include "DataFormats/Common/interface/Ref.h"
00011 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00012 #include "DataFormats/TrackReco/interface/Track.h"
00013 #include "DataFormats/MuonReco/interface/Muon.h"
00014 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00015 #include "DataFormats/RecoCandidate/interface/TrackAssociation.h"
00016 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
00017 #include "SimMuon/MCTruth/interface/DTHitAssociator.h"
00018 #include "SimMuon/MCTruth/interface/MuonTruth.h"
00019 #include "SimMuon/MCTruth/interface/RPCHitAssociator.h"
00020 #include "SimTracker/TrackerHitAssociation/interface/TrackerHitAssociator.h"
00021 #include "SimTracker/TrackAssociation/interface/TrackAssociatorBase.h"
00022 
00023 class MuonAssociatorByHits : public TrackAssociatorBase {
00024   
00025  public:
00026   typedef std::pair <uint32_t, EncodedEventId> SimHitIdpr;
00027   typedef std::map<unsigned int, std::vector<SimHitIdpr> > MapOfMatchedIds;
00028 
00029   MuonAssociatorByHits( const edm::ParameterSet& );  
00030   ~MuonAssociatorByHits();
00031   
00032   // Get base methods from base class
00033   using TrackAssociatorBase::associateRecoToSim;
00034   using TrackAssociatorBase::associateSimToReco;
00035  
00036   /* Associate SimTracks to RecoTracks By Hits */
00038   reco::RecoToSimCollection associateRecoToSim(const edm::RefToBaseVector<reco::Track>&,
00039                                                const edm::RefVector<TrackingParticleCollection>&,
00040                                                const edm::Event * event = 0, const edm::EventSetup * setup = 0) const;
00041   
00043   reco::SimToRecoCollection associateSimToReco(const edm::RefToBaseVector<reco::Track>&,
00044                                                const edm::RefVector<TrackingParticleCollection>&,
00045                                                const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ;
00046 
00047  
00048   void getMatchedIds
00049     (MapOfMatchedIds & tracker_matchedIds_valid, MapOfMatchedIds & muon_matchedIds_valid,
00050      MapOfMatchedIds & tracker_matchedIds_INVALID, MapOfMatchedIds & muon_matchedIds_INVALID,
00051      int& n_tracker_valid, int& n_dt_valid, int& n_csc_valid, int& n_rpc_valid,
00052      int& n_tracker_matched_valid, int& n_dt_matched_valid, int& n_csc_matched_valid, int& n_rpc_matched_valid,
00053      int& n_tracker_INVALID, int& n_dt_INVALID, int& n_csc_INVALID, int& n_rpc_INVALID,
00054      int& n_tracker_matched_INVALID, int& n_dt_matched_INVALID, int& n_csc_matched_INVALID, int& n_rpc_matched_INVALID,
00055      trackingRecHit_iterator begin, trackingRecHit_iterator end,
00056      TrackerHitAssociator* trackertruth, DTHitAssociator& dttruth, MuonTruth& csctruth, RPCHitAssociator& rpctruth, 
00057      bool printRts) const;
00058   
00059   int getShared(MapOfMatchedIds & matchedIds, TrackingParticleCollection::const_iterator trpart) const;
00060 
00061 
00062   enum MuonTrackType { InnerTk, OuterTk, GlobalTk, Segments };
00063   struct RefToBaseSort { 
00064     template<typename T> bool operator()(const edm::RefToBase<T> &r1, const edm::RefToBase<T> &r2) const { 
00065         return (r1.id() == r2.id() ? r1.key() < r2.key() : r1.id() < r2.id()); 
00066     }
00067   };
00068   typedef std::map<edm::RefToBase<reco::Muon>, std::vector<std::pair<TrackingParticleRef, double> >, RefToBaseSort> MuonToSimCollection;
00069   typedef std::map<TrackingParticleRef, std::vector<std::pair<edm::RefToBase<reco::Muon>, double> > >               SimToMuonCollection;
00070 
00071 
00072   void associateMuons(MuonToSimCollection & recoToSim, SimToMuonCollection & simToReco,
00073                       const edm::RefToBaseVector<reco::Muon> &, MuonTrackType ,
00074                       const edm::RefVector<TrackingParticleCollection>&,
00075                       const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ; 
00076 
00077   void associateMuons(MuonToSimCollection & recoToSim, SimToMuonCollection & simToReco,
00078                       const edm::Handle<edm::View<reco::Muon> > &, MuonTrackType , 
00079                       const edm::Handle<TrackingParticleCollection>&,
00080                       const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ;
00081 
00082  private:
00083   const bool includeZeroHitMuons;    
00084   const bool acceptOneStubMatchings;
00085   bool UseTracker;
00086   bool UseMuon;
00087   const bool AbsoluteNumberOfHits_track;
00088   unsigned int NHitCut_track;    
00089   double EfficiencyCut_track;
00090   double PurityCut_track;
00091   const bool AbsoluteNumberOfHits_muon;
00092   unsigned int NHitCut_muon;    
00093   double EfficiencyCut_muon;
00094   double PurityCut_muon;
00095   const bool UsePixels;
00096   const bool UseGrouped;
00097   const bool UseSplitting;
00098   const bool ThreeHitTracksAreSpecial;
00099   const bool dumpDT;
00100   const bool dumpInputCollections;
00101   const bool crossingframe;
00102   edm::InputTag simtracksTag;
00103   edm::InputTag simtracksXFTag;
00104   const edm::ParameterSet& conf_;
00105 
00106   int LayerFromDetid(const DetId&) const;
00107   const TrackingRecHit* getHitPtr(edm::OwnVector<TrackingRecHit>::const_iterator iter) const {return &*iter;}
00108   const TrackingRecHit* getHitPtr(trackingRecHit_iterator iter) const {return &**iter;}
00109 
00110   std::string write_matched_simtracks(const std::vector<SimHitIdpr>&) const;
00111 
00112   /* ==== ALL BELOW THIS IS FOR EXPERTS OR INTERNAL USE ONLY ==== */
00113   typedef std::vector<std::pair<trackingRecHit_iterator, trackingRecHit_iterator> > TrackHitsCollection;
00114   struct IndexMatch {
00115       IndexMatch(size_t index, double global_quality) : idx(index), quality(global_quality) {}
00116       size_t idx; double quality; 
00117       bool operator<(const IndexMatch &other) const { return other.quality < quality; } 
00118   };
00119   typedef std::map<size_t, std::vector<IndexMatch> > IndexAssociation;
00120  
00121   IndexAssociation associateSimToRecoIndices(const TrackHitsCollection &, 
00122                                              const edm::RefVector<TrackingParticleCollection>&,
00123                                              const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ; 
00124   IndexAssociation associateRecoToSimIndices(const TrackHitsCollection &, 
00125                                              const edm::RefVector<TrackingParticleCollection>&,
00126                                              const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ;
00127   
00128 
00129 
00130 };
00131 
00132 #endif