File indexing completed on 2023-03-17 10:58:22
0001 #include "DQMOffline/RecoB/plugins/BTagPerformanceAnalyzerOnData.h"
0002 #include "FWCore/Framework/interface/MakerMacros.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "DQMOffline/RecoB/interface/TagInfoPlotterFactory.h"
0005
0006 using namespace reco;
0007 using namespace edm;
0008 using namespace std;
0009 using namespace RecoBTag;
0010
0011 BTagPerformanceAnalyzerOnData::BTagPerformanceAnalyzerOnData(const edm::ParameterSet& pSet)
0012 : jetSelector(pSet.getParameter<double>("etaMin"),
0013 pSet.getParameter<double>("etaMax"),
0014 pSet.getParameter<double>("ptRecJetMin"),
0015 pSet.getParameter<double>("ptRecJetMax"),
0016 0.0,
0017 99999.0,
0018 pSet.getParameter<double>("ratioMin"),
0019 pSet.getParameter<double>("ratioMax"),
0020 pSet.getParameter<bool>("doJetID")),
0021 etaRanges(pSet.getParameter<vector<double>>("etaRanges")),
0022 ptRanges(pSet.getParameter<vector<double>>("ptRanges")),
0023 doJEC(pSet.getParameter<bool>("doJEC")),
0024 moduleConfig(pSet.getParameter<vector<edm::ParameterSet>>("tagConfig")) {
0025 genToken = mayConsume<GenEventInfoProduct>(edm::InputTag("generator"));
0026 slInfoToken = consumes<SoftLeptonTagInfoCollection>(pSet.getParameter<InputTag>("softLeptonInfo"));
0027 jecMCToken = mayConsume<JetCorrector>(pSet.getParameter<edm::InputTag>("JECsourceMC"));
0028 jecDataToken = consumes<JetCorrector>(pSet.getParameter<edm::InputTag>("JECsourceData"));
0029
0030 if (etaRanges.size() <= 1)
0031 etaRanges = {pSet.getParameter<double>("etaMin"), pSet.getParameter<double>("etaMax")};
0032 if (ptRanges.size() <= 1)
0033 ptRanges = {pSet.getParameter<double>("ptRecJetMin"), pSet.getParameter<double>("ptRecJetMax")};
0034
0035 for (vector<edm::ParameterSet>::const_iterator iModule = moduleConfig.begin(); iModule != moduleConfig.end();
0036 ++iModule) {
0037 const string& dataFormatType = iModule->exists("type") ? iModule->getParameter<string>("type") : "JetTag";
0038 if (dataFormatType == "JetTag") {
0039 const InputTag& moduleLabel = iModule->getParameter<InputTag>("label");
0040 jetTagInputTags.push_back(moduleLabel);
0041 binJetTagPlotters.push_back(vector<std::unique_ptr<JetTagPlotter>>());
0042 jetTagToken.push_back(consumes<JetTagCollection>(moduleLabel));
0043 } else if (dataFormatType == "TagCorrelation") {
0044 const InputTag& label1 = iModule->getParameter<InputTag>("label1");
0045 const InputTag& label2 = iModule->getParameter<InputTag>("label2");
0046 tagCorrelationInputTags.push_back(std::pair<edm::InputTag, edm::InputTag>(label1, label2));
0047 binTagCorrelationPlotters.push_back(vector<std::unique_ptr<TagCorrelationPlotter>>());
0048 tagCorrelationToken.push_back(
0049 std::pair<edm::EDGetTokenT<reco::JetTagCollection>, edm::EDGetTokenT<reco::JetTagCollection>>(
0050 consumes<JetTagCollection>(label1), consumes<JetTagCollection>(label2)));
0051 } else {
0052 vector<edm::InputTag> vIP;
0053 tiDataFormatType.push_back(dataFormatType);
0054 binTagInfoPlotters.push_back(vector<std::unique_ptr<BaseTagInfoPlotter>>());
0055 std::vector<edm::EDGetTokenT<edm::View<reco::BaseTagInfo>>> tokens;
0056 if (dataFormatType == "GenericMVA") {
0057 const std::vector<InputTag> listInfo = iModule->getParameter<vector<InputTag>>("listTagInfos");
0058 for (unsigned int ITi = 0; ITi < listInfo.size(); ITi++) {
0059 tokens.push_back(consumes<View<BaseTagInfo>>(listInfo[ITi]));
0060 vIP.push_back(listInfo[ITi]);
0061 }
0062 } else {
0063 const InputTag& moduleLabel = iModule->getParameter<InputTag>("label");
0064 tokens.push_back(consumes<View<BaseTagInfo>>(moduleLabel));
0065 vIP.push_back(moduleLabel);
0066 }
0067 tagInfoToken.push_back(tokens);
0068 tagInfoInputTags.push_back(vIP);
0069 }
0070 }
0071 }
0072
0073 void BTagPerformanceAnalyzerOnData::bookHistograms(DQMStore::IBooker& ibook,
0074 edm::Run const& run,
0075 edm::EventSetup const& es) {
0076
0077
0078
0079 const int iEtaStart = -1;
0080 const int iEtaEnd = etaRanges.size() > 2 ? etaRanges.size() - 1
0081 : 0;
0082 const int iPtStart = -1;
0083 const int iPtEnd =
0084 ptRanges.size() > 2 ? ptRanges.size() - 1 : 0;
0085 setTDRStyle();
0086
0087 TagInfoPlotterFactory theFactory;
0088 int iTag = -1;
0089 int iTagCorr = -1;
0090 int iInfoTag = -1;
0091 for (vector<edm::ParameterSet>::const_iterator iModule = moduleConfig.begin(); iModule != moduleConfig.end();
0092 ++iModule) {
0093 const string& dataFormatType = iModule->exists("type") ? iModule->getParameter<string>("type") : "JetTag";
0094 if (dataFormatType == "JetTag") {
0095 iTag++;
0096 const string& folderName = iModule->getParameter<string>("folder");
0097
0098 bool doDifferentialPlots = false;
0099 double discrCut = -999.;
0100 if (iModule->exists("differentialPlots") && iModule->getParameter<bool>("differentialPlots") == true) {
0101 doDifferentialPlots = true;
0102 discrCut = iModule->getParameter<double>("discrCut");
0103 }
0104
0105
0106 for (int iEta = iEtaStart; iEta < iEtaEnd; ++iEta) {
0107
0108 for (int iPt = iPtStart; iPt < iPtEnd; ++iPt) {
0109 const EtaPtBin& etaPtBin = getEtaPtBin(iEta, iPt);
0110
0111
0112 binJetTagPlotters.at(iTag).push_back(
0113 std::make_unique<JetTagPlotter>(folderName,
0114 etaPtBin,
0115 iModule->getParameter<edm::ParameterSet>("parameters"),
0116 0,
0117 false,
0118 ibook,
0119 false,
0120 doDifferentialPlots,
0121 discrCut));
0122 }
0123 }
0124
0125 } else if (dataFormatType == "TagCorrelation") {
0126 iTagCorr++;
0127 const InputTag& label1 = iModule->getParameter<InputTag>("label1");
0128 const InputTag& label2 = iModule->getParameter<InputTag>("label2");
0129
0130
0131 for (int iEta = iEtaStart; iEta != iEtaEnd; ++iEta) {
0132
0133 for (int iPt = iPtStart; iPt != iPtEnd; ++iPt) {
0134 const EtaPtBin& etaPtBin = getEtaPtBin(iEta, iPt);
0135
0136 binTagCorrelationPlotters.at(iTagCorr).push_back(
0137 std::make_unique<TagCorrelationPlotter>(label1.label(),
0138 label2.label(),
0139 etaPtBin,
0140 iModule->getParameter<edm::ParameterSet>("parameters"),
0141 0,
0142 false,
0143 false,
0144 ibook));
0145 }
0146 }
0147 } else {
0148 iInfoTag++;
0149
0150 const InputTag& moduleLabel = iModule->getParameter<InputTag>("label");
0151 const string& folderName = iModule->getParameter<string>("folder");
0152
0153
0154 for (int iEta = iEtaStart; iEta < iEtaEnd; ++iEta) {
0155
0156 for (int iPt = iPtStart; iPt < iPtEnd; ++iPt) {
0157 const EtaPtBin& etaPtBin = getEtaPtBin(iEta, iPt);
0158
0159
0160 binTagInfoPlotters.at(iInfoTag).push_back(
0161 theFactory.buildPlotter(dataFormatType,
0162 moduleLabel.label(),
0163 etaPtBin,
0164 iModule->getParameter<edm::ParameterSet>("parameters"),
0165 folderName,
0166 0,
0167 false,
0168 ibook));
0169 }
0170 }
0171 }
0172 }
0173 }
0174
0175 EtaPtBin BTagPerformanceAnalyzerOnData::getEtaPtBin(const int& iEta, const int& iPt) {
0176
0177 bool etaActive_, ptActive_;
0178 double etaMin_, etaMax_, ptMin_, ptMax_;
0179
0180 if (iEta != -1) {
0181 etaActive_ = true;
0182 etaMin_ = etaRanges[iEta];
0183 etaMax_ = etaRanges[iEta + 1];
0184 } else {
0185 etaActive_ = false;
0186 etaMin_ = etaRanges[0];
0187 etaMax_ = etaRanges[etaRanges.size() - 1];
0188 }
0189
0190 if (iPt != -1) {
0191 ptActive_ = true;
0192 ptMin_ = ptRanges[iPt];
0193 ptMax_ = ptRanges[iPt + 1];
0194 } else {
0195 ptActive_ = false;
0196 ptMin_ = ptRanges[0];
0197 ptMax_ = ptRanges[ptRanges.size() - 1];
0198 }
0199 return EtaPtBin(etaActive_, etaMin_, etaMax_, ptActive_, ptMin_, ptMax_);
0200 }
0201
0202 BTagPerformanceAnalyzerOnData::~BTagPerformanceAnalyzerOnData() {
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221 }
0222
0223 void BTagPerformanceAnalyzerOnData::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0224 edm::Handle<reco::SoftLeptonTagInfoCollection> infoHandle;
0225 iEvent.getByToken(slInfoToken, infoHandle);
0226
0227
0228 const JetCorrector* corrector = nullptr;
0229 if (doJEC) {
0230 edm::Handle<GenEventInfoProduct> genInfoHandle;
0231 iEvent.getByToken(genToken, genInfoHandle);
0232 edm::Handle<JetCorrector> corrHandle;
0233 if (!genInfoHandle.isValid())
0234 iEvent.getByToken(jecDataToken, corrHandle);
0235 else
0236 iEvent.getByToken(jecMCToken, corrHandle);
0237 corrector = corrHandle.product();
0238 }
0239
0240
0241
0242 for (unsigned int iJetLabel = 0; iJetLabel != jetTagInputTags.size(); ++iJetLabel) {
0243 edm::Handle<reco::JetTagCollection> tagHandle;
0244 iEvent.getByToken(jetTagToken[iJetLabel], tagHandle);
0245
0246
0247
0248
0249 if (!tagHandle.isValid()) {
0250 edm::LogWarning("BTagPerformanceAnalyzerOnData")
0251 << " Collection " << jetTagInputTags[iJetLabel] << " not present. Skipping it for this event.";
0252 continue;
0253 }
0254
0255 const reco::JetTagCollection& tagColl = *(tagHandle.product());
0256 LogDebug("Info") << "Found " << tagColl.size() << " B candidates in collection " << jetTagInputTags[iJetLabel];
0257
0258 int plotterSize = binJetTagPlotters[iJetLabel].size();
0259 for (JetTagCollection::const_iterator tagI = tagColl.begin(); tagI != tagColl.end(); ++tagI) {
0260
0261 double jec = 1.0;
0262 if (doJEC && corrector) {
0263 jec = corrector->correction(*(tagI->first));
0264 }
0265
0266 if (!jetSelector(*(tagI->first), -1, infoHandle, jec))
0267 continue;
0268
0269 for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) {
0270 bool inBin = binJetTagPlotters[iJetLabel][iPlotter]->etaPtBin().inBin(*tagI->first, jec);
0271
0272 if (inBin)
0273 binJetTagPlotters[iJetLabel][iPlotter]->analyzeTag(*tagI, jec, -1);
0274 }
0275 }
0276 for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) {
0277 binJetTagPlotters[iJetLabel][iPlotter]->analyzeTag();
0278 }
0279 }
0280
0281
0282 for (unsigned int iJetLabel = 0; iJetLabel != tagCorrelationInputTags.size(); ++iJetLabel) {
0283 const std::pair<edm::EDGetTokenT<reco::JetTagCollection>, edm::EDGetTokenT<reco::JetTagCollection>>& inputTokens =
0284 tagCorrelationToken[iJetLabel];
0285 edm::Handle<reco::JetTagCollection> tagHandle1;
0286 iEvent.getByToken(inputTokens.first, tagHandle1);
0287 const reco::JetTagCollection& tagColl1 = *(tagHandle1.product());
0288
0289 edm::Handle<reco::JetTagCollection> tagHandle2;
0290 iEvent.getByToken(inputTokens.second, tagHandle2);
0291 const reco::JetTagCollection& tagColl2 = *(tagHandle2.product());
0292
0293 int plotterSize = binTagCorrelationPlotters[iJetLabel].size();
0294 for (JetTagCollection::const_iterator tagI = tagColl1.begin(); tagI != tagColl1.end(); ++tagI) {
0295
0296 double jec = 1.0;
0297 if (doJEC && corrector) {
0298 jec = corrector->correction(*(tagI->first));
0299 }
0300
0301 if (!jetSelector(*(tagI->first), -1, infoHandle, jec))
0302 continue;
0303
0304 for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) {
0305 bool inBin = binTagCorrelationPlotters[iJetLabel][iPlotter]->etaPtBin().inBin(*(tagI->first), jec);
0306
0307 if (inBin) {
0308 double discr2 = tagColl2[tagI->first];
0309 binTagCorrelationPlotters[iJetLabel][iPlotter]->analyzeTags(tagI->second, discr2, -1);
0310 }
0311 }
0312 }
0313 }
0314
0315
0316 for (unsigned int iJetLabel = 0; iJetLabel != tiDataFormatType.size(); ++iJetLabel) {
0317 int plotterSize = binTagInfoPlotters[iJetLabel].size();
0318 for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter)
0319 binTagInfoPlotters[iJetLabel][iPlotter]->setEventSetup(iSetup);
0320
0321 vector<edm::EDGetTokenT<edm::View<reco::BaseTagInfo>>>& tokens = tagInfoToken[iJetLabel];
0322
0323 vector<string> labels = binTagInfoPlotters[iJetLabel][0]->tagInfoRequirements();
0324 if (labels.empty())
0325 labels.push_back("label");
0326 if (labels.size() != tokens.size())
0327 throw cms::Exception("Configuration")
0328 << "Different number of Tag Infos than expected" << labels.size() << tokens.size() << endl;
0329
0330 unsigned int nInputTags = tokens.size();
0331 vector<edm::Handle<View<BaseTagInfo>>> tagInfoHandles(nInputTags);
0332 edm::ProductID jetProductID;
0333 unsigned int nTagInfos = 0;
0334 for (unsigned int iInputTags = 0; iInputTags < tokens.size(); ++iInputTags) {
0335 edm::Handle<View<BaseTagInfo>>& tagInfoHandle = tagInfoHandles[iInputTags];
0336 iEvent.getByToken(tokens[iInputTags], tagInfoHandle);
0337
0338
0339
0340 if (tagInfoHandle.isValid() == false) {
0341 edm::LogWarning("BTagPerformanceAnalyzerOnData")
0342 << " Collection " << tagInfoInputTags[iJetLabel][iInputTags] << " not present. Skipping it for this event.";
0343 continue;
0344 }
0345
0346 unsigned int size = tagInfoHandle->size();
0347 LogDebug("Info") << "Found " << size << " B candidates in collection " << tagInfoInputTags[iJetLabel][iInputTags];
0348 edm::ProductID thisProductID = (size > 0) ? (*tagInfoHandle)[0].jet().id() : edm::ProductID();
0349 if (iInputTags == 0) {
0350 jetProductID = thisProductID;
0351 nTagInfos = size;
0352 } else if (jetProductID != thisProductID)
0353 throw cms::Exception("Configuration") << "TagInfos are referencing a different jet collection." << endl;
0354 else if (nTagInfos != size)
0355 throw cms::Exception("Configuration") << "TagInfo collections are having a different size." << endl;
0356 }
0357
0358 for (unsigned int iTagInfos = 0; iTagInfos < nTagInfos; ++iTagInfos) {
0359 vector<const BaseTagInfo*> baseTagInfos(nInputTags);
0360 edm::RefToBase<Jet> jetRef;
0361 for (unsigned int iTagInfo = 0; iTagInfo < nInputTags; iTagInfo++) {
0362 const BaseTagInfo& baseTagInfo = (*tagInfoHandles[iTagInfo])[iTagInfos];
0363 if (iTagInfo == 0)
0364 jetRef = baseTagInfo.jet();
0365 else if (baseTagInfo.jet() != jetRef)
0366 throw cms::Exception("Configuration") << "TagInfos pointing to different jets." << endl;
0367 baseTagInfos[iTagInfo] = &baseTagInfo;
0368 }
0369
0370
0371 double jec = 1.0;
0372 if (doJEC && corrector) {
0373 jec = corrector->correction(*(jetRef));
0374 }
0375
0376 if (!jetSelector(*jetRef, -1, infoHandle, jec))
0377 continue;
0378
0379 for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) {
0380 bool inBin = binTagInfoPlotters[iJetLabel][iPlotter]->etaPtBin().inBin(*jetRef, jec);
0381
0382 if (inBin)
0383 binTagInfoPlotters[iJetLabel][iPlotter]->analyzeTag(baseTagInfos, jec, -1);
0384 }
0385 }
0386 }
0387 }
0388
0389
0390 DEFINE_FWK_MODULE(BTagPerformanceAnalyzerOnData);