Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:27:01

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 
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   // make a muon based on a track ref
0103   reco::Muon makeMuon(edm::Event& iEvent, const edm::EventSetup& iSetup, const reco::TrackRef& track, TrackType type);
0104   // make a global muon based on the links object
0105   reco::Muon makeMuon(const reco::MuonTrackLinks& links);
0106 
0107   // make a muon based on track (p4)
0108   reco::Muon makeMuon(const reco::Track& track);
0109 
0110   reco::CaloMuon makeCaloMuon(const reco::Muon&);
0111 
0112   // check if a silicon track satisfies the trackerMuon requirements
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   // check number of common DetIds for a given trackerMuon and a stand alone
0122   // muon track
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   /// get the segment matches of the appropriate type
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   // selections
0201   double minPt_;
0202   double minP_;
0203   double minPCaloMuon_;
0204   int minNumberOfMatches_;
0205   double maxAbsEta_;
0206   bool addExtraSoftMuons_;
0207 
0208   // matching
0209   double maxAbsDx_;
0210   double maxAbsPullX2_;
0211   double maxAbsDy_;
0212   double maxAbsPullY2_;
0213 
0214   // what information to fill
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::TrackCollection> outerTrackSecondaryCollectionHandle_;
0232   edm::Handle<reco::MuonCollection> muonCollectionHandle_;
0233   edm::Handle<reco::MuonTrackLinksCollection> linkCollectionHandle_;
0234   edm::Handle<reco::TrackToTrackMap> tpfmsCollectionHandle_;
0235   edm::Handle<reco::TrackToTrackMap> pickyCollectionHandle_;
0236   edm::Handle<reco::TrackToTrackMap> dytCollectionHandle_;
0237   edm::Handle<reco::VertexCollection> pvHandle_;
0238 
0239   edm::EDGetTokenT<reco::TrackCollection> innerTrackCollectionToken_;
0240   edm::EDGetTokenT<reco::TrackCollection> outerTrackCollectionToken_;
0241   edm::EDGetTokenT<reco::TrackCollection> outerTrackSecondaryCollectionToken_;
0242   edm::EDGetTokenT<reco::MuonCollection> muonCollectionToken_;
0243   edm::EDGetTokenT<reco::MuonTrackLinksCollection> linkCollectionToken_;
0244   edm::EDGetTokenT<reco::TrackToTrackMap> tpfmsCollectionToken_;
0245   edm::EDGetTokenT<reco::TrackToTrackMap> pickyCollectionToken_;
0246   edm::EDGetTokenT<reco::TrackToTrackMap> dytCollectionToken_;
0247   edm::EDGetTokenT<reco::VertexCollection> pvToken_;
0248 
0249   edm::EDGetTokenT<RPCRecHitCollection> rpcHitToken_;
0250   edm::EDGetTokenT<GEMRecHitCollection> gemHitToken_;
0251   edm::EDGetTokenT<edm::ValueMap<reco::MuonQuality> > glbQualToken_;
0252 
0253   edm::Handle<RPCRecHitCollection> rpcHitHandle_;
0254   edm::Handle<GEMRecHitCollection> gemHitHandle_;
0255   edm::Handle<edm::ValueMap<reco::MuonQuality> > glbQualHandle_;
0256 
0257   const edm::ESGetToken<CSCGeometry, MuonGeometryRecord> geomTokenRun_;
0258   const edm::ESGetToken<Propagator, TrackingComponentsRecord> propagatorToken_;
0259   edm::ESGetToken<GlobalTrackingGeometry, GlobalTrackingGeometryRecord> globalGeomToken_;
0260 
0261   MuonCaloCompatibility muonCaloCompatibility_;
0262   std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorCalo_;
0263   std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorTrack_;
0264   std::unique_ptr<reco::isodeposit::IsoDepositExtractor> muIsoExtractorJet_;
0265   std::string trackDepositName_;
0266   std::string ecalDepositName_;
0267   std::string hcalDepositName_;
0268   std::string hoDepositName_;
0269   std::string jetDepositName_;
0270 
0271   bool fillGlobalTrackQuality_;
0272   bool fillGlobalTrackRefits_;
0273   edm::InputTag globalTrackQualityInputTag_;
0274 
0275   edm::InputTag pvInputTag_;
0276   bool selectHighPurity_;
0277   bool fillTrackerKink_;
0278   std::unique_ptr<MuonKinkFinder> trackerKinkFinder_;
0279 
0280   double caloCut_;
0281 
0282   bool arbClean_;
0283   std::unique_ptr<MuonMesh> meshAlgo_;
0284 };
0285 #endif