CMS 3D CMS Logo

NPUTablesProducer.cc
Go to the documentation of this file.
10 
11 #include <vector>
12 #include <iostream>
13 
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  {
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 
31  iEvent.getByToken(pvTag_, pvsIn);
32  const double refpvz = (*pvsIn)[0].position().z();
33 
35  if (iEvent.getByToken(npuTag_, npuInfo)) {
36  fillNPUObjectTable(*npuInfo, *npuTab, refpvz);
37  }
38 
39  iEvent.put(std::move(npuTab));
40  }
41 
42  void fillNPUObjectTable(const std::vector<PileupSummaryInfo> & npuProd, nanoaod::FlatTable & out, double refpvz) const {
43  // Get BX 0
44  unsigned int bx0 = 0;
45  unsigned int nt = 0;
46  unsigned int npu = 0;
47 
48  auto zbin = std::lower_bound( vz_.begin(), vz_.end()-1, std::abs(refpvz) );
49  float pudensity = 0;
50  float gpudensity = 0;
51 
52  for(unsigned int ibx=0; ibx<npuProd.size(); ibx++) {
53  if(npuProd[ibx].getBunchCrossing()==0) {
54  bx0 = ibx;
55  nt = npuProd[ibx].getTrueNumInteractions();
56  npu = npuProd[ibx].getPU_NumInteractions();
57 
58  std::vector<float> zpositions;
59  unsigned int nzpositions = npuProd[ibx].getPU_zpositions().size();
60  for (unsigned int j=0; j<nzpositions; ++j) {
61  zpositions.push_back(npuProd[ibx].getPU_zpositions()[j]);
62  if (std::abs(zpositions.back()- refpvz)<0.1) pudensity++; //N_PU/mm
63  auto bin = std::lower_bound( vz_.begin(), vz_.end()-1, std::abs(zpositions.back()) );
64  if ( bin != vz_.end() && bin==zbin) gpudensity++;
65  }
66  gpudensity/=(20.0*( *(zbin) - *(zbin - 1) )) ;
67  }
68  }
69  unsigned int eoot = 0;
70  for(unsigned int ipu=0; ipu<bx0; ipu++) {
71  eoot+=npuProd[ipu].getPU_NumInteractions();
72  }
73  unsigned int loot = 0;
74  for(unsigned int ipu=npuProd.size()-1; ipu>bx0; ipu--) {
75  loot+=npuProd[ipu].getPU_NumInteractions();
76  }
77  out.addColumnValue<float>("nTrueInt", nt, "the true mean number of the poisson distribution for this event from which the number of interactions each bunch crossing has been sampled", nanoaod::FlatTable::FloatColumn);
78  out.addColumnValue<int>("nPU", npu, "the number of pileup interactions that have been added to the event in the current bunch crossing", nanoaod::FlatTable::IntColumn);
79  out.addColumnValue<int>("sumEOOT", eoot, "number of early out of time pileup" , nanoaod::FlatTable::IntColumn);
80  out.addColumnValue<int>("sumLOOT", loot, "number of late out of time pileup" , nanoaod::FlatTable::IntColumn);
81  out.addColumnValue<float>("pudensity", pudensity, "PU vertices / mm", nanoaod::FlatTable::FloatColumn);
82  out.addColumnValue<float>("gpudensity", gpudensity, "Generator-level PU vertices / mm", nanoaod::FlatTable::FloatColumn);
83  }
84 
85  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions) {
87  desc.add<edm::InputTag>("src", edm::InputTag("slimmedAddPileupInfo"))->setComment("tag for the PU information (vector<PileupSummaryInfo>)");
88  desc.add<edm::InputTag>("pvsrc", edm::InputTag("offlineSlimmedPrimaryVertices"))->setComment("tag for the PVs");
89  desc.add<std::vector<double>> ("zbins", {})->setComment("Z bins to compute the generator-level number of PU vertices per mm");
90  descriptions.add("puTable", desc);
91  }
92 
93  protected:
96 
97  const std::vector<double> vz_;
98 };
99 
102 
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
void produce(edm::StreamID id, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
NPUTablesProducer(edm::ParameterSet const &params)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void addColumnValue(const std::string &name, const C &value, const std::string &docString, ColumnType type=defaultColumnType< T >(), int mantissaBits=-1)
Definition: FlatTable.h:101
int nt
Definition: AMPTWrapper.h:32
bin
set the eta bin as selection string.
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