CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/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 
00024 #include <boost/ptr_container/ptr_vector.hpp>
00025 
00026 class TrackerTopology;
00027 
00028 class MuonAssociatorByHits : public TrackAssociatorBase {
00029   
00030  public:
00031   typedef std::pair <uint32_t, EncodedEventId> SimHitIdpr;
00032   //typedef std::map<unsigned int, std::vector<SimHitIdpr> > MapOfMatchedIds;
00033   typedef std::pair<unsigned int,std::vector<SimHitIdpr> > uint_SimHitIdpr_pair;
00034   typedef boost::ptr_vector<uint_SimHitIdpr_pair> MapOfMatchedIds;
00035   
00036   MuonAssociatorByHits( const edm::ParameterSet& );  
00037   ~MuonAssociatorByHits();
00038   
00039   // Get base methods from base class
00040   using TrackAssociatorBase::associateRecoToSim;
00041   using TrackAssociatorBase::associateSimToReco;
00042  
00043   /* Associate SimTracks to RecoTracks By Hits */
00045   reco::RecoToSimCollection associateRecoToSim(const edm::RefToBaseVector<reco::Track>&,
00046                                                const edm::RefVector<TrackingParticleCollection>&,
00047                                                const edm::Event * event = 0, const edm::EventSetup * setup = 0) const;
00048   
00050   reco::SimToRecoCollection associateSimToReco(const edm::RefToBaseVector<reco::Track>&,
00051                                                const edm::RefVector<TrackingParticleCollection>&,
00052                                                const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ;
00053 
00054  
00055   void getMatchedIds
00056     (MapOfMatchedIds & tracker_matchedIds_valid, MapOfMatchedIds & muon_matchedIds_valid,
00057      MapOfMatchedIds & tracker_matchedIds_INVALID, MapOfMatchedIds & muon_matchedIds_INVALID,
00058      int& n_tracker_valid, int& n_dt_valid, int& n_csc_valid, int& n_rpc_valid,
00059      int& n_tracker_matched_valid, int& n_dt_matched_valid, int& n_csc_matched_valid, int& n_rpc_matched_valid,
00060      int& n_tracker_INVALID, int& n_dt_INVALID, int& n_csc_INVALID, int& n_rpc_INVALID,
00061      int& n_tracker_matched_INVALID, int& n_dt_matched_INVALID, int& n_csc_matched_INVALID, int& n_rpc_matched_INVALID,
00062      trackingRecHit_iterator begin, trackingRecHit_iterator end,
00063      TrackerHitAssociator* trackertruth, DTHitAssociator& dttruth, MuonTruth& csctruth, RPCHitAssociator& rpctruth, 
00064      bool printRts, const TrackerTopology *) const;
00065   
00066   int getShared(MapOfMatchedIds & matchedIds, TrackingParticleCollection::const_iterator trpart) const;
00067 
00068 
00069   enum MuonTrackType { InnerTk, OuterTk, GlobalTk, Segments };
00070   struct RefToBaseSort { 
00071     template<typename T> bool operator()(const edm::RefToBase<T> &r1, const edm::RefToBase<T> &r2) const { 
00072         return (r1.id() == r2.id() ? r1.key() < r2.key() : r1.id() < r2.id()); 
00073     }
00074   };
00075   typedef std::map<edm::RefToBase<reco::Muon>, std::vector<std::pair<TrackingParticleRef, double> >, RefToBaseSort> MuonToSimCollection;
00076   typedef std::map<TrackingParticleRef, std::vector<std::pair<edm::RefToBase<reco::Muon>, double> > >               SimToMuonCollection;
00077 
00078 
00079   void associateMuons(MuonToSimCollection & recoToSim, SimToMuonCollection & simToReco,
00080                       const edm::RefToBaseVector<reco::Muon> &, MuonTrackType ,
00081                       const edm::RefVector<TrackingParticleCollection>&,
00082                       const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ; 
00083 
00084   void associateMuons(MuonToSimCollection & recoToSim, SimToMuonCollection & simToReco,
00085                       const edm::Handle<edm::View<reco::Muon> > &, MuonTrackType , 
00086                       const edm::Handle<TrackingParticleCollection>&,
00087                       const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ;
00088 
00089  private:
00090   const bool includeZeroHitMuons;    
00091   const bool acceptOneStubMatchings;
00092   bool UseTracker;
00093   bool UseMuon;
00094   const bool AbsoluteNumberOfHits_track;
00095   unsigned int NHitCut_track;    
00096   double EfficiencyCut_track;
00097   double PurityCut_track;
00098   const bool AbsoluteNumberOfHits_muon;
00099   unsigned int NHitCut_muon;    
00100   double EfficiencyCut_muon;
00101   double PurityCut_muon;
00102   const bool UsePixels;
00103   const bool UseGrouped;
00104   const bool UseSplitting;
00105   const bool ThreeHitTracksAreSpecial;
00106   const bool dumpDT;
00107   const bool dumpInputCollections;
00108   const bool crossingframe;
00109   edm::InputTag simtracksTag;
00110   edm::InputTag simtracksXFTag;
00111   const edm::ParameterSet& conf_;
00112 
00113   int LayerFromDetid(const DetId&) const;
00114   const TrackingRecHit* getHitPtr(edm::OwnVector<TrackingRecHit>::const_iterator iter) const {return &*iter;}
00115   const TrackingRecHit* getHitPtr(trackingRecHit_iterator iter) const {return &**iter;}
00116 
00117   std::string write_matched_simtracks(const std::vector<SimHitIdpr>&) const;
00118 
00119   /* ==== ALL BELOW THIS IS FOR EXPERTS OR INTERNAL USE ONLY ==== */
00120   typedef std::vector<std::pair<trackingRecHit_iterator, trackingRecHit_iterator> > TrackHitsCollection;
00121   struct IndexMatch {
00122       IndexMatch(size_t index, double global_quality) : idx(index), quality(global_quality) {}
00123       size_t idx; double quality; 
00124       bool operator<(const IndexMatch &other) const { return other.quality < quality; } 
00125   };
00126   typedef std::map<size_t, std::vector<IndexMatch> > IndexAssociation;
00127  
00128   IndexAssociation associateSimToRecoIndices(const TrackHitsCollection &, 
00129                                              const edm::RefVector<TrackingParticleCollection>&,
00130                                              const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ; 
00131   IndexAssociation associateRecoToSimIndices(const TrackHitsCollection &, 
00132                                              const edm::RefVector<TrackingParticleCollection>&,
00133                                              const edm::Event * event = 0, const edm::EventSetup * setup = 0) const ;
00134   
00135 
00136 
00137 };
00138 
00139 #endif