File indexing completed on 2025-09-12 10:16:58
0001 #ifndef MuonIdentification_MuonIdProducer_h
0002 #define MuonIdentification_MuonIdProducer_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include "FWCore/Framework/interface/Frameworkfwd.h"
0028 #include "FWCore/Framework/interface/stream/EDProducer.h"
0029
0030 #include "FWCore/Framework/interface/Event.h"
0031 #include "FWCore/Framework/interface/EventSetup.h"
0032 #include "FWCore/Framework/interface/MakerMacros.h"
0033
0034 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0035
0036 #include "DataFormats/Common/interface/Handle.h"
0037 #include "DataFormats/TrackReco/interface/Track.h"
0038 #include "DataFormats/TrackReco/interface/TrackToTrackMap.h"
0039 #include "DataFormats/VertexReco/interface/Vertex.h"
0040 #include "DataFormats/MuonReco/interface/Muon.h"
0041 #include "DataFormats/MuonReco/interface/MuonTrackLinks.h"
0042 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0043
0044 #include "TrackingTools/TrackAssociator/interface/TrackDetectorAssociator.h"
0045
0046
0047 #include "RecoMuon/MuonIdentification/interface/MuonTimingFiller.h"
0048 #include "RecoMuon/MuonIdentification/interface/MuonCaloCompatibility.h"
0049 #include "PhysicsTools/IsolationAlgos/interface/IsoDepositExtractor.h"
0050 #include "RecoMuon/MuonIdentification/interface/MuonShowerDigiFiller.h"
0051
0052
0053 #include "DataFormats/RPCRecHit/interface/RPCRecHitCollection.h"
0054 #include "DataFormats/RPCRecHit/interface/RPCRecHit.h"
0055 #include "DataFormats/MuonReco/interface/MuonRPCHitMatch.h"
0056 #include "DataFormats/MuonReco/interface/MuonGEMHitMatch.h"
0057
0058 #include "DataFormats/MuonReco/interface/Muon.h"
0059 #include "DataFormats/MuonReco/interface/CaloMuon.h"
0060
0061 #include "RecoMuon/MuonIdentification/interface/MuonIdTruthInfo.h"
0062 #include "RecoMuon/MuonIdentification/interface/MuonArbitrationMethods.h"
0063 #include "DataFormats/Common/interface/ValueMap.h"
0064 #include "Geometry/GEMGeometry/interface/GEMGeometry.h"
0065
0066 class MuonMesh;
0067 class MuonKinkFinder;
0068
0069 class MuonIdProducer : public edm::stream::EDProducer<> {
0070 public:
0071 typedef reco::Muon::MuonTrackType TrackType;
0072
0073 explicit MuonIdProducer(const edm::ParameterSet&);
0074
0075 ~MuonIdProducer() override;
0076
0077 void produce(edm::Event&, const edm::EventSetup&) override;
0078 void beginRun(const edm::Run&, const edm::EventSetup&) override;
0079
0080 static double sectorPhi(const DetId& id);
0081
0082 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0083
0084 private:
0085 void fillMuonId(edm::Event&,
0086 const edm::EventSetup&,
0087 reco::Muon&,
0088 TrackDetectorAssociator::Direction direction = TrackDetectorAssociator::InsideOut);
0089 void fillArbitrationInfo(reco::MuonCollection*, unsigned int muonType = reco::Muon::TrackerMuon);
0090 void arbitrateMuons(reco::MuonCollection*, reco::CaloMuonCollection*);
0091 void fillMuonIsolation(edm::Event&,
0092 const edm::EventSetup&,
0093 reco::Muon& aMuon,
0094 reco::IsoDeposit& trackDep,
0095 reco::IsoDeposit& ecalDep,
0096 reco::IsoDeposit& hcalDep,
0097 reco::IsoDeposit& hoDep,
0098 reco::IsoDeposit& jetDep);
0099 void fillGlbQuality(edm::Event&, const edm::EventSetup&, reco::Muon& aMuon);
0100 void fillTrackerKink(reco::Muon& aMuon);
0101 void init(edm::Event&, const edm::EventSetup&);
0102
0103
0104 reco::Muon makeMuon(edm::Event& iEvent, const edm::EventSetup& iSetup, const reco::TrackRef& track, TrackType type);
0105
0106 reco::Muon makeMuon(const reco::MuonTrackLinks& links);
0107
0108
0109 reco::Muon makeMuon(const reco::Track& track);
0110
0111 reco::CaloMuon makeCaloMuon(const reco::Muon&);
0112
0113
0114 bool isGoodTrack(const reco::Track& track);
0115
0116 bool isGoodTrackerMuon(const reco::Muon& muon);
0117 bool isGoodCaloMuon(const reco::CaloMuon& muon);
0118 bool isGoodRPCMuon(const reco::Muon& muon);
0119 bool isGoodGEMMuon(const reco::Muon& muon);
0120 bool isGoodME0Muon(const reco::Muon& muon);
0121
0122
0123
0124 int overlap(const reco::Muon& muon, const reco::Track& track);
0125
0126 unsigned int chamberId(const DetId&);
0127
0128 double phiOfMuonInteractionRegion(const reco::Muon& muon) const;
0129
0130 bool checkLinks(const reco::MuonTrackLinks*) const;
0131 inline bool approxEqual(const double a, const double b, const double tol = 1E-3) const {
0132 return std::abs(a - b) < tol;
0133 }
0134
0135
0136 std::vector<reco::MuonSegmentMatch>* getSegmentMatches(reco::MuonChamberMatch& chamber, unsigned int muonType) const {
0137 if (muonType == reco::Muon::TrackerMuon)
0138 return &chamber.segmentMatches;
0139 else if (muonType == reco::Muon::ME0Muon)
0140 return &chamber.me0Matches;
0141 else if (muonType == reco::Muon::GEMMuon)
0142 return &chamber.gemMatches;
0143 else
0144 throw cms::Exception("getSegmentMatches called with unsupported muonType");
0145 }
0146
0147 TrackDetectorAssociator trackAssociator_;
0148 TrackAssociatorParameters parameters_;
0149
0150 struct ICTypes {
0151 enum ICTypeKey { INNER_TRACKS, OUTER_TRACKS, LINKS, MUONS, TEV_FIRSTHIT, TEV_PICKY, TEV_DYT, NONE };
0152
0153 static ICTypeKey toKey(const std::string& s) {
0154 if (s == "inner tracks")
0155 return INNER_TRACKS;
0156 else if (s == "outer tracks")
0157 return OUTER_TRACKS;
0158 else if (s == "links")
0159 return LINKS;
0160 else if (s == "muons")
0161 return MUONS;
0162 else if (s == "tev firstHit")
0163 return TEV_FIRSTHIT;
0164 else if (s == "tev picky")
0165 return TEV_PICKY;
0166 else if (s == "tev dyt")
0167 return TEV_DYT;
0168
0169 throw cms::Exception("FatalError") << "Unknown input collection type: " << s;
0170 }
0171
0172 static std::string toStr(const ICTypeKey k) {
0173 switch (k) {
0174 case INNER_TRACKS:
0175 return "inner tracks";
0176 case OUTER_TRACKS:
0177 return "outer tracks";
0178 case LINKS:
0179 return "links";
0180 case MUONS:
0181 return "muons";
0182 case TEV_FIRSTHIT:
0183 return "tev firstHit";
0184 case TEV_PICKY:
0185 return "tev picky";
0186 case TEV_DYT:
0187 return "tev dyt";
0188 default:
0189 throw cms::Exception("FatalError") << "Unknown input collection type";
0190 }
0191 return "";
0192 }
0193 };
0194 std::vector<edm::InputTag> inputCollectionLabels_;
0195 std::vector<ICTypes::ICTypeKey> inputCollectionTypes_;
0196
0197 std::unique_ptr<MuonTimingFiller> theTimingFiller_;
0198
0199 std::unique_ptr<MuonShowerDigiFiller> theShowerDigiFiller_;
0200
0201
0202 double minPt_;
0203 double minP_;
0204 double minPCaloMuon_;
0205 int minNumberOfMatches_;
0206 double maxAbsEta_;
0207 bool addExtraSoftMuons_;
0208
0209
0210 double maxAbsDx_;
0211 double maxAbsPullX2_;
0212 double maxAbsDy_;
0213 double maxAbsPullY2_;
0214
0215
0216 bool fillCaloCompatibility_;
0217 bool fillEnergy_;
0218 bool storeCrossedHcalRecHits_;
0219 bool fillMatching_;
0220 bool fillShowerDigis_;
0221 bool fillIsolation_;
0222 bool writeIsoDeposits_;
0223 double ptThresholdToFillCandidateP4WithGlobalFit_;
0224 double sigmaThresholdToFillCandidateP4WithGlobalFit_;
0225
0226 bool arbitrateTrackerMuons_;
0227
0228 bool debugWithTruthMatching_;
0229
0230 edm::Handle<reco::TrackCollection> innerTrackCollectionHandle_;
0231 edm::Handle<reco::TrackCollection> outerTrackCollectionHandle_;
0232 edm::Handle<reco::TrackCollection> outerTrackSecondaryCollectionHandle_;
0233 edm::Handle<reco::MuonCollection> muonCollectionHandle_;
0234 edm::Handle<reco::MuonTrackLinksCollection> linkCollectionHandle_;
0235 edm::Handle<reco::TrackToTrackMap> tpfmsCollectionHandle_;
0236 edm::Handle<reco::TrackToTrackMap> pickyCollectionHandle_;
0237 edm::Handle<reco::TrackToTrackMap> dytCollectionHandle_;
0238 edm::Handle<reco::VertexCollection> pvHandle_;
0239
0240 edm::EDGetTokenT<reco::TrackCollection> innerTrackCollectionToken_;
0241 edm::EDGetTokenT<reco::TrackCollection> outerTrackCollectionToken_;
0242 edm::EDGetTokenT<reco::TrackCollection> outerTrackSecondaryCollectionToken_;
0243 edm::EDGetTokenT<reco::MuonCollection> muonCollectionToken_;
0244 edm::EDGetTokenT<reco::MuonTrackLinksCollection> linkCollectionToken_;
0245 edm::EDGetTokenT<reco::TrackToTrackMap> tpfmsCollectionToken_;
0246 edm::EDGetTokenT<reco::TrackToTrackMap> pickyCollectionToken_;
0247 edm::EDGetTokenT<reco::TrackToTrackMap> dytCollectionToken_;
0248 edm::EDGetTokenT<reco::VertexCollection> pvToken_;
0249
0250 edm::EDGetTokenT<RPCRecHitCollection> rpcHitToken_;
0251 edm::EDGetTokenT<GEMRecHitCollection> gemHitToken_;
0252 edm::EDGetTokenT<edm::ValueMap<reco::MuonQuality> > glbQualToken_;
0253
0254 edm::Handle<RPCRecHitCollection> rpcHitHandle_;
0255 edm::Handle<GEMRecHitCollection> gemHitHandle_;
0256 edm::Handle<edm::ValueMap<reco::MuonQuality> > glbQualHandle_;
0257
0258 const edm::ESGetToken<CSCGeometry, MuonGeometryRecord> geomTokenRun_;
0259 const edm::ESGetToken<Propagator, TrackingComponentsRecord> propagatorToken_;
0260 edm::ESGetToken<GlobalTrackingGeometry, GlobalTrackingGeometryRecord> globalGeomToken_;
0261
0262 MuonCaloCompatibility muonCaloCompatibility_;
0263 std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorCalo_;
0264 std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorTrack_;
0265 std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorJet_;
0266 std::string trackDepositName_;
0267 std::string ecalDepositName_;
0268 std::string hcalDepositName_;
0269 std::string hoDepositName_;
0270 std::string jetDepositName_;
0271
0272 bool fillGlobalTrackQuality_;
0273 bool fillGlobalTrackRefits_;
0274 edm::InputTag globalTrackQualityInputTag_;
0275
0276 edm::InputTag pvInputTag_;
0277 bool selectHighPurity_;
0278 bool fillTrackerKink_;
0279 std::unique_ptr<MuonKinkFinder> trackerKinkFinder_;
0280
0281 double caloCut_;
0282
0283 bool arbClean_;
0284 std::unique_ptr<MuonMesh> meshAlgo_;
0285 edm::ESGetToken<GEMGeometry, MuonGeometryRecord> gemgeomToken_;
0286 const GEMGeometry* gemgeom;
0287 double GEM_edgecut_;
0288 };
0289 #endif