MiniAODSVAnalyzer

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

#include "DQMServices/Core/interface/DQMEDAnalyzer.h"
#include "DataFormats/PatCandidates/interface/Jet.h"
#include "DataFormats/BTauReco/interface/SecondaryVertexTagInfo.h"
#include "CommonTools/Statistics/interface/ChiSquaredProbability.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/Event.h"

/** \class MiniAODSVAnalyzer
 *
 *  Secondary Vertex Analyzer to run on MiniAOD
 *
 */

class MiniAODSVAnalyzer : public DQMEDAnalyzer {
public:
  explicit MiniAODSVAnalyzer(const edm::ParameterSet& pSet);
  ~MiniAODSVAnalyzer() override = default;

  void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;

private:
  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;

  const edm::EDGetTokenT<std::vector<pat::Jet>> jetToken_;
  const std::string svTagInfo_;
  const double ptMin_;
  const double etaMax_;

  MonitorElement* n_sv_;

  MonitorElement* sv_mass_;
  MonitorElement* sv_pt_;
  MonitorElement* sv_ntracks_;
  MonitorElement* sv_chi2norm_;
  MonitorElement* sv_chi2prob_;

  // relation to jet
  MonitorElement* sv_ptrel_;
  MonitorElement* sv_energyratio_;
  MonitorElement* sv_deltaR_;

  MonitorElement* sv_dxy_;
  MonitorElement* sv_dxysig_;
  MonitorElement* sv_d3d_;
  MonitorElement* sv_d3dsig_;
};

MiniAODSVAnalyzer::MiniAODSVAnalyzer(const edm::ParameterSet& pSet)
    : jetToken_(consumes<std::vector<pat::Jet>>(pSet.getParameter<edm::InputTag>("JetTag"))),
      svTagInfo_(pSet.getParameter<std::string>("svTagInfo")),
      ptMin_(pSet.getParameter<double>("ptMin")),
      etaMax_(pSet.getParameter<double>("etaMax")) {}

void MiniAODSVAnalyzer::bookHistograms(DQMStore::IBooker& ibook, edm::Run const& run, edm::EventSetup const& es) {
  ibook.setCurrentFolder("Btag/SV");

  n_sv_ = ibook.book1D("n_sv", "number of SV in jet", 5, 0, 5);
  n_sv_->setAxisTitle("number of SV in jet");

  sv_mass_ = ibook.book1D("sv_mass", "SV mass", 30, 0., 6.);
  sv_mass_->setAxisTitle("SV mass");

  sv_pt_ = ibook.book1D("sv_pt", "SV transverse momentum", 40, 0., 120.);
  sv_pt_->setAxisTitle("SV pt");

  sv_ntracks_ = ibook.book1D("sv_ntracks", "SV number of daugthers", 10, 0, 10);
  sv_ntracks_->setAxisTitle("number of tracks at SV");

  sv_chi2norm_ = ibook.book1D("sv_chi2norm", "normalized Chi2 of vertex", 30, 0, 15);
  sv_chi2norm_->setAxisTitle("normalized Chi2 of SV");

  sv_chi2prob_ = ibook.book1D("sv_chi2prob", "Chi2 probability of vertex", 20, 0., 1.);
  sv_chi2prob_->setAxisTitle("Chi2 probability of SV");

  sv_ptrel_ = ibook.book1D("sv_ptrel", "SV jet transverse momentum ratio", 25, 0., 1.);
  sv_ptrel_->setAxisTitle("pt(SV)/pt(jet)");

  sv_energyratio_ = ibook.book1D("sv_energyratio", "SV jet energy ratio", 25, 0., 1.);
  sv_energyratio_->setAxisTitle("E(SV)/E(jet)");

  sv_deltaR_ = ibook.book1D("sv_deltaR", "SV jet deltaR", 40, 0., 0.4);
  sv_deltaR_->setAxisTitle("deltaR(jet, SV)");

  sv_dxy_ = ibook.book1D("sv_dxy", "2D flight distance", 40, 0., 8.);
  sv_dxy_->setAxisTitle("dxy");

  sv_dxysig_ = ibook.book1D("sv_dxysig", "2D flight distance significance", 25, 0., 250.);
  sv_dxysig_->setAxisTitle("dxy significance");

  sv_d3d_ = ibook.book1D("sv_d3d", "3D flight distance", 40, 0., 8.);
  sv_d3d_->setAxisTitle("d3d");

  sv_d3dsig_ = ibook.book1D("sv_d3dsig", "3D flight distance significance", 25, 0., 250.);
  sv_d3dsig_->setAxisTitle("d3d significance");
}

void MiniAODSVAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
  edm::Handle<std::vector<pat::Jet>> jetCollection;
  iEvent.getByToken(jetToken_, jetCollection);

  // Loop over the pat::Jets
  for (std::vector<pat::Jet>::const_iterator jet = jetCollection->begin(); jet != jetCollection->end(); ++jet) {
    // jet selection
    if (jet->hasTagInfo(svTagInfo_) && jet->pt() > ptMin_ && std::abs(jet->eta()) < etaMax_) {
      const reco::CandSecondaryVertexTagInfo* taginfo =
          static_cast<const reco::CandSecondaryVertexTagInfo*>(jet->tagInfo(svTagInfo_));
      n_sv_->Fill(taginfo->nVertices());

      // loop secondary vertices
      for (unsigned int i = 0; i < taginfo->nVertices(); i++) {
        const reco::VertexCompositePtrCandidate& sv = taginfo->secondaryVertex(i);

        sv_mass_->Fill(sv.mass());
        sv_pt_->Fill(sv.pt());
        sv_ntracks_->Fill(sv.numberOfDaughters());
        sv_chi2norm_->Fill(sv.vertexNormalizedChi2());
        sv_chi2prob_->Fill(ChiSquaredProbability(sv.vertexChi2(), sv.vertexNdof()));

        sv_ptrel_->Fill(sv.pt() / jet->pt());
        sv_energyratio_->Fill(sv.energy() / jet->energy());
        sv_deltaR_->Fill(reco::deltaR(sv, jet->momentum()));

        sv_dxy_->Fill(taginfo->flightDistance(i, 2).value());
        sv_dxysig_->Fill(taginfo->flightDistance(i, 2).significance());
        sv_d3d_->Fill(taginfo->flightDistance(i, 3).value());
        sv_d3dsig_->Fill(taginfo->flightDistance(i, 3).significance());
      }
    }
  }
}

//define this as a plug-in
DEFINE_FWK_MODULE(MiniAODSVAnalyzer);