File indexing completed on 2023-03-17 10:58:25
0001 #include "DQMOffline/RecoB/interface/TrackCountingTagPlotter.h"
0002 #include "DQMOffline/RecoB/interface/Tools.h"
0003
0004 using namespace std;
0005 using namespace RecoBTag;
0006
0007 TrackCountingTagPlotter::TrackCountingTagPlotter(const std::string& tagName,
0008 const EtaPtBin& etaPtBin,
0009 const edm::ParameterSet& pSet,
0010 unsigned int mc,
0011 bool wf,
0012 DQMStore::IBooker& ibook)
0013 : BaseTagInfoPlotter(tagName, etaPtBin),
0014 mcPlots_(mc),
0015 nBinEffPur_(pSet.getParameter<int>("nBinEffPur")),
0016 startEffPur_(pSet.getParameter<double>("startEffPur")),
0017 endEffPur_(pSet.getParameter<double>("endEffPur")),
0018 willFinalize_(wf),
0019 lowerIPSBound(-35.0),
0020 upperIPSBound(35.0) {
0021 const std::string dir(theExtensionString.substr(1));
0022 if (willFinalize_)
0023 return;
0024
0025 trkNbr3D = std::make_unique<FlavourHistograms<int>>("selTrksNbr_3D" + theExtensionString,
0026 "Number of selected tracks for 3D IPS" + theExtensionString,
0027 31,
0028 -0.5,
0029 30.5,
0030 false,
0031 true,
0032 true,
0033 "b",
0034 dir,
0035 mc,
0036 ibook);
0037
0038 trkNbr2D = std::make_unique<FlavourHistograms<int>>("selTrksNbr_2D" + theExtensionString,
0039 "Number of selected tracks for 2D IPS" + theExtensionString,
0040 31,
0041 -0.5,
0042 30.5,
0043 false,
0044 true,
0045 true,
0046 "b",
0047 dir,
0048 mc,
0049 ibook);
0050
0051 for (unsigned int i = 1; i <= 4; i++) {
0052 tkcntHistosSig3D.push_back(std::make_unique<FlavourHistograms<double>>(
0053 "ips" + std::to_string(i) + "_3D" + theExtensionString,
0054 "3D Significance of impact parameter " + std::to_string(i) + ". trk",
0055 50,
0056 lowerIPSBound,
0057 upperIPSBound,
0058 false,
0059 true,
0060 true,
0061 "b",
0062 dir,
0063 mc,
0064 ibook));
0065 }
0066 tkcntHistosSig3D.push_back(std::make_unique<FlavourHistograms<double>>("ips_3D" + theExtensionString,
0067 "3D Significance of impact parameter",
0068 50,
0069 lowerIPSBound,
0070 upperIPSBound,
0071 false,
0072 true,
0073 true,
0074 "b",
0075 dir,
0076 mc,
0077 ibook));
0078
0079 for (unsigned int i = 1; i <= 4; i++) {
0080 tkcntHistosSig2D.push_back(std::make_unique<FlavourHistograms<double>>(
0081 "ips" + std::to_string(i) + "_2D" + theExtensionString,
0082 "2D Significance of impact parameter " + std::to_string(i) + ". trk",
0083 50,
0084 lowerIPSBound,
0085 upperIPSBound,
0086 false,
0087 true,
0088 true,
0089 "b",
0090 dir,
0091 mc,
0092 ibook));
0093 }
0094
0095 tkcntHistosSig2D.push_back(std::make_unique<FlavourHistograms<double>>("ips_2D" + theExtensionString,
0096 "2D Significance of impact parameter",
0097 50,
0098 lowerIPSBound,
0099 upperIPSBound,
0100 false,
0101 true,
0102 true,
0103 "b",
0104 dir,
0105 mc,
0106 ibook));
0107 }
0108
0109 TrackCountingTagPlotter::~TrackCountingTagPlotter() {}
0110
0111 void TrackCountingTagPlotter::analyzeTag(const reco::BaseTagInfo* baseTagInfo, double jec, int jetFlavour, float w) {
0112 const reco::TrackCountingTagInfo* tagInfo = dynamic_cast<const reco::TrackCountingTagInfo*>(baseTagInfo);
0113
0114 if (!tagInfo) {
0115 throw cms::Exception("Configuration")
0116 << "BTagPerformanceAnalyzer: Extended TagInfo not of type TrackCountingTagInfo. " << endl;
0117 }
0118
0119 trkNbr3D->fill(jetFlavour, tagInfo->selectedTracks(0), w);
0120 trkNbr2D->fill(jetFlavour, tagInfo->selectedTracks(1), w);
0121
0122 for (int n = 0; n != tagInfo->selectedTracks(1) && n != 4; ++n)
0123 tkcntHistosSig2D[n]->fill(jetFlavour, tagInfo->significance(n, 1), w);
0124 for (int n = tagInfo->selectedTracks(1); n < 4; ++n)
0125 tkcntHistosSig2D[n]->fill(jetFlavour, lowerIPSBound - 1.0, w);
0126
0127 for (int n = 0; n != tagInfo->selectedTracks(0) && n != 4; ++n)
0128 tkcntHistosSig3D[n]->fill(jetFlavour, tagInfo->significance(n, 0), w);
0129 for (int n = tagInfo->selectedTracks(0); n < 4; ++n)
0130 tkcntHistosSig3D[n]->fill(jetFlavour, lowerIPSBound - 1.0, w);
0131
0132 for (int n = 0; n != tagInfo->selectedTracks(1); ++n)
0133 tkcntHistosSig2D[4]->fill(jetFlavour, tagInfo->significance(n, 1), w);
0134 for (int n = 0; n != tagInfo->selectedTracks(0); ++n)
0135 tkcntHistosSig3D[4]->fill(jetFlavour, tagInfo->significance(n, 0), w);
0136 }
0137
0138 void TrackCountingTagPlotter::finalize(DQMStore::IBooker& ibook, DQMStore::IGetter& igetter_) {
0139
0140
0141
0142
0143 const std::string dir("TrackCounting" + theExtensionString);
0144
0145 tkcntHistosSig3D.clear();
0146 tkcntHistosSig2D.clear();
0147 effPurFromHistos.clear();
0148
0149 for (unsigned int i = 2; i <= 3; i++) {
0150 tkcntHistosSig3D.push_back(std::make_unique<FlavourHistograms<double>>(
0151 "ips" + std::to_string(i) + "_3D" + theExtensionString,
0152 "3D Significance of impact parameter " + std::to_string(i) + ". trk",
0153 50,
0154 lowerIPSBound,
0155 upperIPSBound,
0156 "b",
0157 dir,
0158 mcPlots_,
0159 igetter_));
0160 effPurFromHistos.push_back(std::make_unique<EffPurFromHistos>(
0161 *tkcntHistosSig3D.back(), dir, mcPlots_, ibook, nBinEffPur_, startEffPur_, endEffPur_));
0162 }
0163
0164 for (unsigned int i = 2; i <= 3; i++) {
0165 tkcntHistosSig2D.push_back(std::make_unique<FlavourHistograms<double>>(
0166 "ips" + std::to_string(i) + "_2D" + theExtensionString,
0167 "2D Significance of impact parameter " + std::to_string(i) + ". trk",
0168 50,
0169 lowerIPSBound,
0170 upperIPSBound,
0171 "b",
0172 dir,
0173 mcPlots_,
0174 igetter_));
0175 effPurFromHistos.push_back(std::make_unique<EffPurFromHistos>(
0176 *tkcntHistosSig2D.back(), dir, mcPlots_, ibook, nBinEffPur_, startEffPur_, endEffPur_));
0177 }
0178
0179 for (int n = 0; n != 4; ++n)
0180 effPurFromHistos[n]->compute(ibook);
0181 }
0182
0183 void TrackCountingTagPlotter::psPlot(const std::string& name) {
0184 const std::string cName("TrackCountingPlots" + theExtensionString);
0185 setTDRStyle()->cd();
0186 TCanvas canvas(cName.c_str(), cName.c_str(), 600, 900);
0187 canvas.UseCurrentStyle();
0188 if (willFinalize_) {
0189 for (int n = 0; n != 2; ++n) {
0190 canvas.Print((name + cName + ".ps").c_str());
0191 canvas.Clear();
0192 canvas.Divide(2, 3);
0193 canvas.cd(1);
0194 effPurFromHistos[0 + n]->discriminatorNoCutEffic().plot();
0195 canvas.cd(2);
0196 effPurFromHistos[0 + n]->discriminatorCutEfficScan().plot();
0197 canvas.cd(3);
0198 effPurFromHistos[0 + n]->plot();
0199 canvas.cd(4);
0200 effPurFromHistos[1 + n]->discriminatorNoCutEffic().plot();
0201 canvas.cd(5);
0202 effPurFromHistos[1 + n]->discriminatorCutEfficScan().plot();
0203 canvas.cd(6);
0204 effPurFromHistos[1 + n]->plot();
0205 }
0206 return;
0207 }
0208
0209 canvas.Clear();
0210 canvas.Divide(2, 3);
0211 canvas.Print((name + cName + ".ps[").c_str());
0212
0213 canvas.cd(1);
0214 trkNbr3D->plot();
0215 canvas.cd(2);
0216 tkcntHistosSig3D[4]->plot();
0217 for (int n = 0; n < 4; n++) {
0218 canvas.cd(3 + n);
0219 tkcntHistosSig3D[n]->plot();
0220 }
0221
0222 canvas.Print((name + cName + ".ps").c_str());
0223 canvas.Clear();
0224 canvas.Divide(2, 3);
0225
0226 canvas.cd(1);
0227 trkNbr2D->plot();
0228 canvas.cd(2);
0229 tkcntHistosSig2D[4]->plot();
0230 for (int n = 0; n != 4; ++n) {
0231 canvas.cd(3 + n);
0232 tkcntHistosSig2D[n]->plot();
0233 }
0234
0235 canvas.Print((name + cName + ".ps").c_str());
0236 canvas.Print((name + cName + ".ps]").c_str());
0237 }
0238
0239 void TrackCountingTagPlotter::epsPlot(const std::string& name) {
0240 if (willFinalize_) {
0241 for (int n = 0; n != 4; ++n)
0242 effPurFromHistos[n]->epsPlot(name);
0243 return;
0244 }
0245
0246 trkNbr2D->epsPlot(name);
0247 trkNbr3D->epsPlot(name);
0248 for (int n = 0; n != 5; ++n) {
0249 tkcntHistosSig2D[n]->epsPlot(name);
0250 tkcntHistosSig3D[n]->epsPlot(name);
0251 }
0252 }