Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-09-12 10:16:58

0001 #ifndef MuonIdentification_MuonIdProducer_h
0002 #define MuonIdentification_MuonIdProducer_h
0003 
0004 // -*- C++ -*-
0005 //
0006 // Package:    MuonIdentification
0007 // Class:      MuonIdProducer
0008 //
0009 /*
0010 
0011  Description: reco::Muon producer that can fill various information:
0012               - track-segment matching
0013               - energy deposition
0014               - muon isolation
0015               - muon hypothesis compatibility (calorimeter)
0016               Acceptable inputs:
0017               - reco::TrackCollection
0018               - reco::MuonCollection
0019               - reco::MuonTrackLinksCollection
0020 */
0021 //
0022 // Original Author:  Dmytro Kovalskyi
0023 //
0024 //
0025 
0026 // user include files
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 // #include "Utilities/Timing/interface/TimerStack.h"
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 // RPC-Muon stuffs
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   // make a muon based on a track ref
0104   reco::Muon makeMuon(edm::Event& iEvent, const edm::EventSetup& iSetup, const reco::TrackRef& track, TrackType type);
0105   // make a global muon based on the links object
0106   reco::Muon makeMuon(const reco::MuonTrackLinks& links);
0107 
0108   // make a muon based on track (p4)
0109   reco::Muon makeMuon(const reco::Track& track);
0110 
0111   reco::CaloMuon makeCaloMuon(const reco::Muon&);
0112 
0113   // check if a silicon track satisfies the trackerMuon requirements
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   // check number of common DetIds for a given trackerMuon and a stand alone
0123   // muon track
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   /// get the segment matches of the appropriate type
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   // selections
0202   double minPt_;
0203   double minP_;
0204   double minPCaloMuon_;
0205   int minNumberOfMatches_;
0206   double maxAbsEta_;
0207   bool addExtraSoftMuons_;
0208 
0209   // matching
0210   double maxAbsDx_;
0211   double maxAbsPullX2_;
0212   double maxAbsDy_;
0213   double maxAbsPullY2_;
0214 
0215   // what information to fill
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