Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-31 22:27:14

0001 #ifndef MuonTrackValidator_h
0002 #define MuonTrackValidator_h
0003 
0004 /** \class MuonTrackValidator
0005 * Class that produces histograms to validate Muon Track Reconstruction performances
0006 *
0007 */
0008 #include "FWCore/Framework/interface/Frameworkfwd.h"
0009 #include "Validation/RecoMuon/plugins/MuonTrackValidatorBase.h"
0010 #include "SimDataFormats/Associations/interface/TrackToTrackingParticleAssociator.h"
0011 
0012 #include "DataFormats/TrackReco/interface/Track.h"
0013 #include "SimDataFormats/Associations/interface/TrackAssociation.h"
0014 #include "DQMServices/Core/interface/DQMEDAnalyzer.h"
0015 
0016 #include "SimTracker/TrackAssociation/interface/ParametersDefinerForTP.h"
0017 #include "SimTracker/TrackAssociation/interface/CosmicParametersDefinerForTP.h"
0018 
0019 #include "FWCore/Framework/interface/Event.h"
0020 #include "FWCore/Framework/interface/ESHandle.h"
0021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0022 #include "FWCore/Framework/interface/ConsumesCollector.h"
0023 
0024 class MuonTrackValidator : public DQMEDAnalyzer, protected MuonTrackValidatorBase {
0025 public:
0026   /// Constructor
0027   MuonTrackValidator(const edm::ParameterSet& pset) : MuonTrackValidatorBase(pset) {
0028     dirName_ = pset.getParameter<std::string>("dirName");
0029     associatormap = pset.getParameter<std::vector<edm::InputTag>>("associatormap");
0030     UseAssociators = pset.getParameter<bool>("UseAssociators");
0031     useGEMs_ = pset.getParameter<bool>("useGEMs");
0032     useME0_ = pset.getParameter<bool>("useME0");
0033     edm::ParameterSet tpset = pset.getParameter<edm::ParameterSet>("muonTPSelector");
0034     tpSelector = TrackingParticleSelector(tpset.getParameter<double>("ptMin"),
0035                                           tpset.getParameter<double>("ptMax"),
0036                                           tpset.getParameter<double>("minRapidity"),
0037                                           tpset.getParameter<double>("maxRapidity"),
0038                                           tpset.getParameter<double>("tip"),
0039                                           tpset.getParameter<double>("lip"),
0040                                           tpset.getParameter<int>("minHit"),
0041                                           tpset.getParameter<bool>("signalOnly"),
0042                                           tpset.getParameter<bool>("intimeOnly"),
0043                                           tpset.getParameter<bool>("chargedOnly"),
0044                                           tpset.getParameter<bool>("stableOnly"),
0045                                           tpset.getParameter<std::vector<int>>("pdgId"));
0046 
0047     cosmictpSelector = CosmicTrackingParticleSelector(tpset.getParameter<double>("ptMin"),
0048                                                       tpset.getParameter<double>("minRapidity"),
0049                                                       tpset.getParameter<double>("maxRapidity"),
0050                                                       tpset.getParameter<double>("tip"),
0051                                                       tpset.getParameter<double>("lip"),
0052                                                       tpset.getParameter<int>("minHit"),
0053                                                       tpset.getParameter<bool>("chargedOnly"),
0054                                                       tpset.getParameter<std::vector<int>>("pdgId"));
0055 
0056     BiDirectional_RecoToSim_association = pset.getParameter<bool>("BiDirectional_RecoToSim_association");
0057     doSummaryPlots_ = pset.getParameter<bool>("doSummaryPlots");
0058 
0059     // dump cfg parameters
0060     edm::LogVerbatim("MuonTrackValidator") << "constructing MuonTrackValidator: " << pset.dump();
0061 
0062     // Declare consumes (also for the base class)
0063     bsSrc_Token = consumes<reco::BeamSpot>(bsSrc);
0064     if (label_tp_refvector)
0065       tp_refvector_Token = consumes<TrackingParticleRefVector>(label_tp);
0066     else
0067       tp_Token = consumes<TrackingParticleCollection>(label_tp);
0068     pileupinfo_Token = consumes<std::vector<PileupSummaryInfo>>(label_pileupinfo);
0069 
0070     if (!UseAssociators && label.size() != associatormap.size()) {
0071       throw cms::Exception("Configuration")
0072           << "Different number of labels and associators provided!" << '\n'
0073           << "Please, make sure to configure the muonValidator with the same number and ordering "
0074              "of labels and associators!";
0075     }
0076 
0077     if (label.size() == 1 && doSummaryPlots_) {
0078       edm::LogWarning("MuonTrackValidator")
0079           << "Cannot produce summary plots for a single collection label, disabling summary plots creation!" << '\n';
0080       doSummaryPlots_ = false;
0081     }
0082 
0083     if (label.size() != histoParameters.size()) {
0084       throw cms::Exception("Configuration")
0085           << "Different number of labels and histoParameters provided!" << '\n'
0086           << "Please, make sure to configure the muonValidator with the same number and ordering "
0087              "of labels and histoParameters!";
0088     }
0089 
0090     track_Collection_Token.reserve(label.size());
0091     simToRecoCollection_Token.reserve(label.size());
0092     recoToSimCollection_Token.reserve(label.size());
0093     for (unsigned int www = 0; www < label.size(); www++) {
0094       track_Collection_Token.push_back(consumes<edm::View<reco::Track>>(label[www]));
0095       simToRecoCollection_Token.push_back(consumes<reco::SimToRecoCollection>(associatormap[www]));
0096       recoToSimCollection_Token.push_back(consumes<reco::RecoToSimCollection>(associatormap[www]));
0097     }
0098 
0099     if (parametersDefiner == "LhcParametersDefinerForTP") {
0100       lhcParametersDefinerTP_ = std::make_unique<ParametersDefinerForTP>(bsSrc, consumesCollector());
0101     } else if (parametersDefiner == "CosmicParametersDefinerForTP") {
0102       cosmicParametersDefinerTP_ = std::make_unique<CosmicParametersDefinerForTP>(consumesCollector());
0103     } else {
0104       throw cms::Exception("Configuration") << "Unexpected label: parametersDefiner = " << parametersDefiner;
0105     }
0106 
0107     _simHitTpMapTag = mayConsume<SimHitTPAssociationProducer::SimHitTPAssociationList>(
0108         pset.getParameter<edm::InputTag>("simHitTpMapTag"));
0109 
0110     MABH = false;
0111     if (!UseAssociators) {
0112       // flag MuonAssociatorByHits
0113       if (associators[0] == "MuonAssociationByHits")
0114         MABH = true;
0115       // reset string associators to the map label
0116       associators.clear();
0117       associators.reserve(associatormap.size());
0118       std::transform(
0119           associatormap.begin(), associatormap.end(), std::back_inserter(associators), [](const edm::InputTag& tag) {
0120             return tag.label();
0121           });
0122     } else {
0123       for (auto const& associator : associators) {
0124         consumes<reco::TrackToTrackingParticleAssociator>(edm::InputTag(associator));
0125       }
0126     }
0127 
0128     // loop over the reco::Track collections to validate: check for inconsistent input settings
0129     for (unsigned int www = 0; www < label.size(); www++) {
0130       // inform on which SimHits will be counted
0131       if (histoParameters[www].usetracker)
0132         edm::LogVerbatim("MuonTrackValidator") << "\n usetracker = TRUE : Tracker SimHits WILL be counted";
0133       else
0134         edm::LogVerbatim("MuonTrackValidator") << "\n usetracker = FALSE : Tracker SimHits WILL NOT be counted";
0135       if (histoParameters[www].usemuon)
0136         edm::LogVerbatim("MuonTrackValidator") << " usemuon = TRUE : Muon SimHits WILL be counted";
0137       else
0138         edm::LogVerbatim("MuonTrackValidator") << " usemuon = FALSE : Muon SimHits WILL NOT be counted" << std::endl;
0139 
0140       std::string recoTracksLabel = label[www].label();
0141       std::string recoTracksInstance = label[www].instance();
0142 
0143       // tracks with hits only on tracker
0144       if (recoTracksLabel == "generalTracks" || recoTracksLabel == "probeTracks" ||
0145           recoTracksLabel == "displacedTracks" || recoTracksLabel == "extractGemMuons" ||
0146           recoTracksLabel == "extractMe0Muons" || recoTracksLabel == "ctfWithMaterialTracksP5LHCNavigation" ||
0147           recoTracksLabel == "ctfWithMaterialTracksP5" ||
0148           recoTracksLabel == "hltIterL3OIMuonTrackSelectionHighPurity" || recoTracksLabel == "hltIterL3MuonMerged" ||
0149           recoTracksLabel == "hltIterL3MuonAndMuonFromL1Merged") {
0150         if (histoParameters[www].usemuon) {
0151           edm::LogWarning("MuonTrackValidator")
0152               << "\n*** WARNING : inconsistent input tracksTag = " << label[www] << "\n with usemuon == true"
0153               << "\n ---> resetting to usemuon == false ";
0154           histoParameters[www].usemuon = false;
0155         }
0156         if (!histoParameters[www].usetracker) {
0157           edm::LogWarning("MuonTrackValidator")
0158               << "\n*** WARNING : inconsistent input tracksTag = " << label[www] << "\n with usetracker == false"
0159               << "\n ---> resetting to usetracker == true ";
0160           histoParameters[www].usetracker = true;
0161         }
0162       }
0163 
0164       // tracks with hits only on muon detectors
0165       else if (recoTracksLabel == "seedsOfSTAmuons" || recoTracksLabel == "standAloneMuons" ||
0166                recoTracksLabel == "seedsOfDisplacedSTAmuons" || recoTracksLabel == "displacedStandAloneMuons" ||
0167                recoTracksLabel == "refittedStandAloneMuons" || recoTracksLabel == "cosmicMuons" ||
0168                recoTracksLabel == "cosmicMuons1Leg" || recoTracksLabel == "hltL2Muons") {
0169         if (histoParameters[www].usetracker) {
0170           edm::LogWarning("MuonTrackValidator")
0171               << "\n*** WARNING : inconsistent input tracksTag = " << label[www] << "\n with usetracker == true"
0172               << "\n ---> resetting to usetracker == false ";
0173           histoParameters[www].usetracker = false;
0174         }
0175         if (!histoParameters[www].usemuon) {
0176           edm::LogWarning("MuonTrackValidator")
0177               << "\n*** WARNING : inconsistent input tracksTag = " << label[www] << "\n with usemuon == false"
0178               << "\n ---> resetting to usemuon == true ";
0179           histoParameters[www].usemuon = true;
0180         }
0181       }
0182 
0183     }  // for (unsigned int www=0;www<label.size();www++)
0184   }
0185 
0186   /// Destructor
0187   ~MuonTrackValidator() override {}
0188 
0189   void analyze(const edm::Event&, const edm::EventSetup&) override;
0190   void bookHistograms(DQMEDAnalyzer::DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
0191 
0192 private:
0193   std::string dirName_;
0194   std::vector<edm::InputTag> associatormap;
0195   std::vector<edm::EDGetTokenT<reco::SimToRecoCollection>> simToRecoCollection_Token;
0196   std::vector<edm::EDGetTokenT<reco::RecoToSimCollection>> recoToSimCollection_Token;
0197   edm::EDGetTokenT<SimHitTPAssociationProducer::SimHitTPAssociationList> _simHitTpMapTag;
0198 
0199   std::unique_ptr<ParametersDefinerForTP> lhcParametersDefinerTP_;
0200   std::unique_ptr<CosmicParametersDefinerForTP> cosmicParametersDefinerTP_;
0201 
0202   bool UseAssociators;
0203   bool useGEMs_;
0204   bool useME0_;
0205 
0206   // select tracking particles
0207   //(i.e. "denominator" of the efficiency ratio)
0208   TrackingParticleSelector tpSelector;
0209   CosmicTrackingParticleSelector cosmictpSelector;
0210 
0211   // flag new validation logic (bidirectional RecoToSim association)
0212   bool BiDirectional_RecoToSim_association;
0213   // flag MuonAssociatorByHits
0214   bool MABH;
0215   bool doSummaryPlots_;
0216 };
0217 
0218 #endif