CMS 3D CMS Logo

NPUTablesProducer.cc
Go to the documentation of this file.
10 
11 #include <vector>
12 #include <iostream>
13 #include <algorithm>
14 
16 public:
18  : npuTag_(consumes<std::vector<PileupSummaryInfo>>(params.getParameter<edm::InputTag>("src"))),
19  pvTag_(consumes<std::vector<reco::Vertex>>(params.getParameter<edm::InputTag>("pvsrc"))),
20  vz_(params.getParameter<std::vector<double>>("zbins")),
21  savePtHatMax_(params.getParameter<bool>("savePtHatMax")) {
22  produces<nanoaod::FlatTable>();
23  }
24 
25  ~NPUTablesProducer() override {}
26 
27  void produce(edm::StreamID id, edm::Event& iEvent, const edm::EventSetup& iSetup) const override {
28  auto npuTab = std::make_unique<nanoaod::FlatTable>(1, "Pileup", true);
29 
30  const auto& pvProd = iEvent.get(pvTag_);
31  const double refpvz = pvProd.at(0).position().z();
32 
34  if (iEvent.getByToken(npuTag_, npuInfo)) {
35  fillNPUObjectTable(*npuInfo, *npuTab, refpvz);
36  }
37 
38  iEvent.put(std::move(npuTab));
39  }
40 
41  void fillNPUObjectTable(const std::vector<PileupSummaryInfo>& npuProd, nanoaod::FlatTable& out, double refpvz) const {
42  // Get BX 0
43  unsigned int bx0 = 0;
44  float nt = 0;
45  unsigned int npu = 0;
46 
47  auto zbin = std::lower_bound(vz_.begin(), vz_.end() - 1, std::abs(refpvz));
48  float pudensity = 0;
49  float gpudensity = 0;
50 
51  float pthatmax = 0;
52 
53  for (unsigned int ibx = 0; ibx < npuProd.size(); ibx++) {
54  if (npuProd[ibx].getBunchCrossing() == 0) {
55  bx0 = ibx;
56  nt = npuProd[ibx].getTrueNumInteractions();
57  npu = npuProd[ibx].getPU_NumInteractions();
58 
59  std::vector<float> zpositions;
60  unsigned int nzpositions = npuProd[ibx].getPU_zpositions().size();
61  for (unsigned int j = 0; j < nzpositions; ++j) {
62  zpositions.push_back(npuProd[ibx].getPU_zpositions()[j]);
63  if (std::abs(zpositions.back() - refpvz) < 0.1)
64  pudensity++; //N_PU/mm
65  auto bin = std::lower_bound(vz_.begin(), vz_.end() - 1, std::abs(zpositions.back()));
66  if (bin != vz_.end() && bin == zbin)
67  gpudensity++;
68  }
69  gpudensity /= (20.0 * (*(zbin) - *(zbin - 1)));
70 
71  if (savePtHatMax_) {
72  if (!npuProd[ibx].getPU_pT_hats().empty()) {
73  pthatmax = *max_element(npuProd[ibx].getPU_pT_hats().begin(), npuProd[ibx].getPU_pT_hats().end());
74  }
75  }
76  }
77  }
78  unsigned int eoot = 0;
79  for (unsigned int ipu = 0; ipu < bx0; ipu++) {
80  eoot += npuProd[ipu].getPU_NumInteractions();
81  }
82  unsigned int loot = 0;
83  for (unsigned int ipu = npuProd.size() - 1; ipu > bx0; ipu--) {
84  loot += npuProd[ipu].getPU_NumInteractions();
85  }
86  out.addColumnValue<float>("nTrueInt",
87  nt,
88  "the true mean number of the poisson distribution for this event from which the number "
89  "of interactions each bunch crossing has been sampled",
90  10);
91  out.addColumnValue<int>(
92  "nPU",
93  npu,
94  "the number of pileup interactions that have been added to the event in the current bunch crossing");
95  out.addColumnValue<int>("sumEOOT", eoot, "number of early out of time pileup");
96  out.addColumnValue<int>("sumLOOT", loot, "number of late out of time pileup");
97  out.addColumnValue<float>("pudensity", pudensity, "PU vertices / mm");
98  out.addColumnValue<float>("gpudensity", gpudensity, "Generator-level PU vertices / mm");
99  if (savePtHatMax_) {
100  out.addColumnValue<float>("pthatmax", pthatmax, "Maximum pt-hat", 10);
101  }
102  }
103 
106  desc.add<edm::InputTag>("src", edm::InputTag("slimmedAddPileupInfo"))
107  ->setComment("tag for the PU information (vector<PileupSummaryInfo>)");
108  desc.add<edm::InputTag>("pvsrc", edm::InputTag("offlineSlimmedPrimaryVertices"))->setComment("tag for the PVs");
109  desc.add<std::vector<double>>("zbins", {})
110  ->setComment("Z bins to compute the generator-level number of PU vertices per mm");
111  desc.add<bool>("savePtHatMax", false)->setComment("Store maximum pt-hat of PU");
112  descriptions.add("puTable", desc);
113  }
114 
115 protected:
118 
119  const std::vector<double> vz_;
120 
122 };
123 
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
int iEvent
Definition: GenABIO.cc:224
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
NPUTablesProducer(edm::ParameterSet const &params)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
int nt
Definition: AMPTWrapper.h:42
void produce(edm::StreamID id, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
const edm::EDGetTokenT< std::vector< PileupSummaryInfo > > npuTag_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
fixed size matrix
HLT enums.
~NPUTablesProducer() override
void fillNPUObjectTable(const std::vector< PileupSummaryInfo > &npuProd, nanoaod::FlatTable &out, double refpvz) const
const edm::EDGetTokenT< std::vector< reco::Vertex > > pvTag_
const std::vector< double > vz_
def move(src, dest)
Definition: eostools.py:511