File indexing completed on 2025-03-31 22:27:14
0001 #ifndef MuonTrackValidator_h
0002 #define MuonTrackValidator_h
0003
0004
0005
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
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
0060 edm::LogVerbatim("MuonTrackValidator") << "constructing MuonTrackValidator: " << pset.dump();
0061
0062
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
0113 if (associators[0] == "MuonAssociationByHits")
0114 MABH = true;
0115
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
0129 for (unsigned int www = 0; www < label.size(); www++) {
0130
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
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
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 }
0184 }
0185
0186
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
0207
0208 TrackingParticleSelector tpSelector;
0209 CosmicTrackingParticleSelector cosmictpSelector;
0210
0211
0212 bool BiDirectional_RecoToSim_association;
0213
0214 bool MABH;
0215 bool doSummaryPlots_;
0216 };
0217
0218 #endif