Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
/**
 * \file L1TEfficiencyHarvesting.cc
 *
 * \author J. Pela, C. Battilana
 *
 */

// L1TMonitor includes
#include "DQMOffline/L1Trigger/interface/L1TEfficiencyHarvesting.h"
#include "FWCore/Framework/interface/MakerMacros.h"

using namespace edm;
using namespace std;

namespace dqmoffline {
  namespace l1t {
    L1TEfficiencyPlotHandler::L1TEfficiencyPlotHandler(const ParameterSet &ps, std::string plotName)
        : numeratorDir_(ps.getUntrackedParameter<std::string>("numeratorDir")),
          denominatorDir_(ps.getUntrackedParameter<std::string>("denominatorDir", numeratorDir_)),
          outputDir_(ps.getUntrackedParameter<std::string>("outputDir", numeratorDir_)),
          plotName_(plotName),
          numeratorSuffix_(ps.getUntrackedParameter<std::string>("numeratorSuffix", "Num")),
          denominatorSuffix_(ps.getUntrackedParameter<std::string>("denominatorSuffix", "Den")),
          h_efficiency_() {}

    L1TEfficiencyPlotHandler::L1TEfficiencyPlotHandler(const L1TEfficiencyPlotHandler &handler)
        : numeratorDir_(handler.numeratorDir_),
          denominatorDir_(handler.denominatorDir_),
          outputDir_(handler.outputDir_),
          plotName_(handler.plotName_),
          numeratorSuffix_(handler.numeratorSuffix_),
          denominatorSuffix_(handler.denominatorSuffix_),
          h_efficiency_(handler.h_efficiency_) {}

    void L1TEfficiencyPlotHandler::book(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) {
      edm::LogInfo("L1TEfficiencyPlotHandler")
          << "Booking efficiency histogram for " << outputDir_ << " and " << plotName_ << endl;

      std::string numeratorName = numeratorDir_ + "/" + plotName_ + numeratorSuffix_;
      std::string denominatorName = denominatorDir_ + "/" + plotName_ + denominatorSuffix_;
      MonitorElement *num = igetter.get(numeratorName);
      MonitorElement *den = igetter.get(denominatorName);

      if (!num || !den) {
        edm::LogWarning("L1TEfficiencyPlotHandler") << (!num && !den ? numeratorName + " && " + denominatorName
                                                        : !num       ? numeratorName
                                                                     : denominatorName)
                                                    << " not gettable. Quitting booking" << endl;
        return;
      }

      TH1 *numH = num->getTH1();
      TH1 *denH = den->getTH1();

      if (!numH || !denH) {
        edm::LogWarning("L1TEfficiencyPlotHandler") << (!numH && !denH ? numeratorName + " && " + denominatorName
                                                        : !num         ? numeratorName
                                                                       : denominatorName)
                                                    << " is not TH1F. Quitting booking" << endl;

        return;
      }

      if (numH->GetNbinsX() != denH->GetNbinsX()) {
        edm::LogWarning("L1TEfficiencyPlotHandler") << " # X bins in " << numeratorName << " and " << denominatorName
                                                    << " are different. Quitting booking" << endl;
        return;
      }

      MonitorElement::Kind kind = num->kind();
      bool is1D = kind == MonitorElement::Kind::TH1F || kind == MonitorElement::Kind::TH1D;
      bool is2D = kind == MonitorElement::Kind::TH2F || kind == MonitorElement::Kind::TH2D;

      if (is2D) {
        if (numH->GetNbinsY() != denH->GetNbinsY()) {
          edm::LogWarning("L1TEfficiencyPlotHandler") << " # Y bins in " << numeratorName << " and " << denominatorName
                                                      << " are different. Quitting booking" << endl;
          return;
        }
      }

      ibooker.setCurrentFolder(outputDir_);
      if (is1D) {
        h_efficiency_ = ibooker.book1D(plotName_, den->getTH1F());
      } else if (is2D) {
        h_efficiency_ = ibooker.book2D(plotName_, den->getTH2F());
      }
      h_efficiency_->setEfficiencyFlag();
    }

    void L1TEfficiencyPlotHandler::computeEfficiency(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) {
      if (!h_efficiency_)
        return;

      edm::LogInfo("L1TEfficiencyPlotHandler") << " Computing efficiency for " << plotName_ << endl;

      MonitorElement *num = igetter.get(numeratorDir_ + "/" + plotName_ + numeratorSuffix_);
      MonitorElement *den = igetter.get(denominatorDir_ + "/" + plotName_ + denominatorSuffix_);

      TH1 *numH = num->getTH1();
      TH1 *denH = den->getTH1();
      TH1 *effH = h_efficiency_->getTH1();

      effH->Divide(numH, denH, 1.0, 1.0, "B");
    }

    //___________DQM_analyzer_class________________________________________
    L1TEfficiencyHarvesting::L1TEfficiencyHarvesting(const ParameterSet &ps)
        : verbose_(ps.getUntrackedParameter<bool>("verbose")), plotHandlers_() {
      if (verbose_) {
        edm::LogInfo("L1TEfficiencyHarvesting") << "____________ Storage initialization ____________ " << endl;
      }

      for (const auto &plotConfig : ps.getUntrackedParameter<std::vector<edm::ParameterSet>>("plotCfgs")) {
        vector<string> plots = plotConfig.getUntrackedParameter<vector<string>>("plots");
        for (const auto &plot : plots) {
          plotHandlers_.push_back(L1TEfficiencyPlotHandler(plotConfig, plot));
        }
      }
    }

    //_____________________________________________________________________
    L1TEfficiencyHarvesting::~L1TEfficiencyHarvesting() {}

    //_____________________________________________________________________
    void L1TEfficiencyHarvesting::dqmEndJob(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) {
      if (verbose_) {
        edm::LogInfo("L1TEfficiencyHarvesting") << "Called endRun." << endl;
      }

      for (auto plotHandler : plotHandlers_) {
        plotHandler.book(ibooker, igetter);
        plotHandler.computeEfficiency(ibooker, igetter);
      }
    }

    //define this as a plug-in
    DEFINE_FWK_MODULE(L1TEfficiencyHarvesting);
  }  // namespace l1t
}  // namespace dqmoffline