File indexing completed on 2023-03-17 11:20:32
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
0065 class MuonMesh;
0066 class MuonKinkFinder;
0067
0068 class MuonIdProducer : public edm::stream::EDProducer<> {
0069 public:
0070 typedef reco::Muon::MuonTrackType TrackType;
0071
0072 explicit MuonIdProducer(const edm::ParameterSet&);
0073
0074 ~MuonIdProducer() override;
0075
0076 void produce(edm::Event&, const edm::EventSetup&) override;
0077 void beginRun(const edm::Run&, const edm::EventSetup&) override;
0078
0079 static double sectorPhi(const DetId& id);
0080
0081 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0082
0083 private:
0084 void fillMuonId(edm::Event&,
0085 const edm::EventSetup&,
0086 reco::Muon&,
0087 TrackDetectorAssociator::Direction direction = TrackDetectorAssociator::InsideOut);
0088 void fillArbitrationInfo(reco::MuonCollection*, unsigned int muonType = reco::Muon::TrackerMuon);
0089 void arbitrateMuons(reco::MuonCollection*, reco::CaloMuonCollection*);
0090 void fillMuonIsolation(edm::Event&,
0091 const edm::EventSetup&,
0092 reco::Muon& aMuon,
0093 reco::IsoDeposit& trackDep,
0094 reco::IsoDeposit& ecalDep,
0095 reco::IsoDeposit& hcalDep,
0096 reco::IsoDeposit& hoDep,
0097 reco::IsoDeposit& jetDep);
0098 void fillGlbQuality(edm::Event&, const edm::EventSetup&, reco::Muon& aMuon);
0099 void fillTrackerKink(reco::Muon& aMuon);
0100 void init(edm::Event&, const edm::EventSetup&);
0101
0102
0103 reco::Muon makeMuon(edm::Event& iEvent, const edm::EventSetup& iSetup, const reco::TrackRef& track, TrackType type);
0104
0105 reco::Muon makeMuon(const reco::MuonTrackLinks& links);
0106
0107
0108 reco::Muon makeMuon(const reco::Track& track);
0109
0110 reco::CaloMuon makeCaloMuon(const reco::Muon&);
0111
0112
0113 bool isGoodTrack(const reco::Track& track);
0114
0115 bool isGoodTrackerMuon(const reco::Muon& muon);
0116 bool isGoodCaloMuon(const reco::CaloMuon& muon);
0117 bool isGoodRPCMuon(const reco::Muon& muon);
0118 bool isGoodGEMMuon(const reco::Muon& muon);
0119 bool isGoodME0Muon(const reco::Muon& muon);
0120
0121
0122
0123 int overlap(const reco::Muon& muon, const reco::Track& track);
0124
0125 unsigned int chamberId(const DetId&);
0126
0127 double phiOfMuonInteractionRegion(const reco::Muon& muon) const;
0128
0129 bool checkLinks(const reco::MuonTrackLinks*) const;
0130 inline bool approxEqual(const double a, const double b, const double tol = 1E-3) const {
0131 return std::abs(a - b) < tol;
0132 }
0133
0134
0135 std::vector<reco::MuonSegmentMatch>* getSegmentMatches(reco::MuonChamberMatch& chamber, unsigned int muonType) const {
0136 if (muonType == reco::Muon::TrackerMuon)
0137 return &chamber.segmentMatches;
0138 else if (muonType == reco::Muon::ME0Muon)
0139 return &chamber.me0Matches;
0140 else if (muonType == reco::Muon::GEMMuon)
0141 return &chamber.gemMatches;
0142 else
0143 throw cms::Exception("getSegmentMatches called with unsupported muonType");
0144 }
0145
0146 TrackDetectorAssociator trackAssociator_;
0147 TrackAssociatorParameters parameters_;
0148
0149 struct ICTypes {
0150 enum ICTypeKey { INNER_TRACKS, OUTER_TRACKS, LINKS, MUONS, TEV_FIRSTHIT, TEV_PICKY, TEV_DYT, NONE };
0151
0152 static ICTypeKey toKey(const std::string& s) {
0153 if (s == "inner tracks")
0154 return INNER_TRACKS;
0155 else if (s == "outer tracks")
0156 return OUTER_TRACKS;
0157 else if (s == "links")
0158 return LINKS;
0159 else if (s == "muons")
0160 return MUONS;
0161 else if (s == "tev firstHit")
0162 return TEV_FIRSTHIT;
0163 else if (s == "tev picky")
0164 return TEV_PICKY;
0165 else if (s == "tev dyt")
0166 return TEV_DYT;
0167
0168 throw cms::Exception("FatalError") << "Unknown input collection type: " << s;
0169 }
0170
0171 static std::string toStr(const ICTypeKey k) {
0172 switch (k) {
0173 case INNER_TRACKS:
0174 return "inner tracks";
0175 case OUTER_TRACKS:
0176 return "outer tracks";
0177 case LINKS:
0178 return "links";
0179 case MUONS:
0180 return "muons";
0181 case TEV_FIRSTHIT:
0182 return "tev firstHit";
0183 case TEV_PICKY:
0184 return "tev picky";
0185 case TEV_DYT:
0186 return "tev dyt";
0187 default:
0188 throw cms::Exception("FatalError") << "Unknown input collection type";
0189 }
0190 return "";
0191 }
0192 };
0193 std::vector<edm::InputTag> inputCollectionLabels_;
0194 std::vector<ICTypes::ICTypeKey> inputCollectionTypes_;
0195
0196 std::unique_ptr<MuonTimingFiller> theTimingFiller_;
0197
0198 std::unique_ptr<MuonShowerDigiFiller> theShowerDigiFiller_;
0199
0200
0201 double minPt_;
0202 double minP_;
0203 double minPCaloMuon_;
0204 int minNumberOfMatches_;
0205 double maxAbsEta_;
0206 bool addExtraSoftMuons_;
0207
0208
0209 double maxAbsDx_;
0210 double maxAbsPullX2_;
0211 double maxAbsDy_;
0212 double maxAbsPullY2_;
0213
0214
0215 bool fillCaloCompatibility_;
0216 bool fillEnergy_;
0217 bool storeCrossedHcalRecHits_;
0218 bool fillMatching_;
0219 bool fillShowerDigis_;
0220 bool fillIsolation_;
0221 bool writeIsoDeposits_;
0222 double ptThresholdToFillCandidateP4WithGlobalFit_;
0223 double sigmaThresholdToFillCandidateP4WithGlobalFit_;
0224
0225 bool arbitrateTrackerMuons_;
0226
0227 bool debugWithTruthMatching_;
0228
0229 edm::Handle<reco::TrackCollection> innerTrackCollectionHandle_;
0230 edm::Handle<reco::TrackCollection> outerTrackCollectionHandle_;
0231 edm::Handle<reco::MuonCollection> muonCollectionHandle_;
0232 edm::Handle<reco::MuonTrackLinksCollection> linkCollectionHandle_;
0233 edm::Handle<reco::TrackToTrackMap> tpfmsCollectionHandle_;
0234 edm::Handle<reco::TrackToTrackMap> pickyCollectionHandle_;
0235 edm::Handle<reco::TrackToTrackMap> dytCollectionHandle_;
0236 edm::Handle<reco::VertexCollection> pvHandle_;
0237
0238 edm::EDGetTokenT<reco::TrackCollection> innerTrackCollectionToken_;
0239 edm::EDGetTokenT<reco::TrackCollection> outerTrackCollectionToken_;
0240 edm::EDGetTokenT<reco::MuonCollection> muonCollectionToken_;
0241 edm::EDGetTokenT<reco::MuonTrackLinksCollection> linkCollectionToken_;
0242 edm::EDGetTokenT<reco::TrackToTrackMap> tpfmsCollectionToken_;
0243 edm::EDGetTokenT<reco::TrackToTrackMap> pickyCollectionToken_;
0244 edm::EDGetTokenT<reco::TrackToTrackMap> dytCollectionToken_;
0245 edm::EDGetTokenT<reco::VertexCollection> pvToken_;
0246
0247 edm::EDGetTokenT<RPCRecHitCollection> rpcHitToken_;
0248 edm::EDGetTokenT<GEMRecHitCollection> gemHitToken_;
0249 edm::EDGetTokenT<edm::ValueMap<reco::MuonQuality> > glbQualToken_;
0250
0251 edm::Handle<RPCRecHitCollection> rpcHitHandle_;
0252 edm::Handle<GEMRecHitCollection> gemHitHandle_;
0253 edm::Handle<edm::ValueMap<reco::MuonQuality> > glbQualHandle_;
0254
0255 const edm::ESGetToken<CSCGeometry, MuonGeometryRecord> geomTokenRun_;
0256 const edm::ESGetToken<Propagator, TrackingComponentsRecord> propagatorToken_;
0257 edm::ESGetToken<GlobalTrackingGeometry, GlobalTrackingGeometryRecord> globalGeomToken_;
0258
0259 MuonCaloCompatibility muonCaloCompatibility_;
0260 std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorCalo_;
0261 std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorTrack_;
0262 std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorJet_;
0263 std::string trackDepositName_;
0264 std::string ecalDepositName_;
0265 std::string hcalDepositName_;
0266 std::string hoDepositName_;
0267 std::string jetDepositName_;
0268
0269 bool fillGlobalTrackQuality_;
0270 bool fillGlobalTrackRefits_;
0271 edm::InputTag globalTrackQualityInputTag_;
0272
0273 edm::InputTag pvInputTag_;
0274 bool selectHighPurity_;
0275 bool fillTrackerKink_;
0276 std::unique_ptr<MuonKinkFinder> trackerKinkFinder_;
0277
0278 double caloCut_;
0279
0280 bool arbClean_;
0281 std::unique_ptr<MuonMesh> meshAlgo_;
0282 };
0283 #endif