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
00033 using TrackAssociatorBase::associateRecoToSim;
00034 using TrackAssociatorBase::associateSimToReco;
00035
00036
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
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