CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
EnergyRingsTableProducer.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 
4 // user include files
7 
9 
13 
16 
18 
21 
23 public:
25  : name_(iConfig.getParameter<std::string>("name")),
26  srcJet_(consumes<edm::View<pat::Jet>>(iConfig.getParameter<edm::InputTag>("src"))) {
27  produces<nanoaod::FlatTable>();
28  }
29 
31 
32  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
34  desc.add<edm::InputTag>("src")->setComment("input Jet collection");
35  desc.add<std::string>("name")->setComment("name of the Jet FlatTable we are extending with energy rings");
36  descriptions.add("EnergyRingsTable", desc);
37  }
38 
39 private:
40  void produce(edm::Event&, edm::EventSetup const&) override;
41 
44 };
45 
46 // ------------ method called to produce the data ------------
49  iEvent.getByToken(srcJet_, srcJet);
50 
51  float cone_boundaries[] = {0.05, 0.1, 0.2, 0.3, 0.4};
52  size_t ncone_boundaries = sizeof(cone_boundaries) / sizeof(float);
53  unsigned int nJet = srcJet->size();
54  unsigned int ncand = 0;
55  std::vector<float> numdaughterspt03;
56  std::vector<std::vector<float>> EmFractionEnergyRings(ncone_boundaries + 1, std::vector<float>(nJet, 0.));
57  std::vector<std::vector<float>> ChFractionEnergyRings(ncone_boundaries + 1, std::vector<float>(nJet, 0.));
58  std::vector<std::vector<float>> NeFractionEnergyRings(ncone_boundaries + 1, std::vector<float>(nJet, 0.));
59  std::vector<std::vector<float>> MuFractionEnergyRings(ncone_boundaries + 1, std::vector<float>(nJet, 0.));
60 
61  for (unsigned int ij = 0; ij < nJet; ij++) {
62  ++ncand;
63  auto jet = srcJet->ptrAt(ij);
64  int numDaughtersPt03 = 0;
65  for (unsigned int ijcone = 0; ijcone < ncone_boundaries; ijcone++) {
66  EmFractionEnergyRings[ijcone][ij] = 0;
67  MuFractionEnergyRings[ijcone][ij] = 0;
68  ChFractionEnergyRings[ijcone][ij] = 0;
69  NeFractionEnergyRings[ijcone][ij] = 0;
70  }
71  for (const auto& d : jet->daughterPtrVector()) {
72  float candDr = Geom::deltaR(d->p4(), jet->p4());
73  size_t icone =
74  std::lower_bound(&cone_boundaries[0], &cone_boundaries[ncone_boundaries], candDr) - &cone_boundaries[0];
75  float candEnergy = d->energy();
76  int pdgid = abs(d->pdgId());
77  if (pdgid == 22 || pdgid == 11) {
78  EmFractionEnergyRings[icone][ij] += candEnergy;
79  } else if (pdgid == 13) {
80  MuFractionEnergyRings[icone][ij] += candEnergy;
81  } else if (d->charge() != 0) {
82  ChFractionEnergyRings[icone][ij] += candEnergy;
83  } else {
84  NeFractionEnergyRings[icone][ij] += candEnergy;
85  }
86  if (d->pt() > 0.3)
87  numDaughtersPt03 += 1;
88  } // end of jet daughters loop
89  numdaughterspt03.push_back(numDaughtersPt03);
90  } //end of jet loop
91  auto tab = std::make_unique<nanoaod::FlatTable>(ncand, name_, false, true); //extension to Jet collection set to true
92  tab->addColumn<int>("numDaughtersPt03", numdaughterspt03, "number of jet daughters with pT>0.3 GeV");
93 
94  tab->addColumn<float>("EmFractionEnergyRing0", EmFractionEnergyRings[0], "Em energy fraction in ring in dR 0-0.05");
95  tab->addColumn<float>("EmFractionEnergyRing1", EmFractionEnergyRings[1], "Em energy fraction in ring in dR 0.05-0.1");
96  tab->addColumn<float>("EmFractionEnergyRing2", EmFractionEnergyRings[2], "Em energy fraction in ring in dR 0.1-0.2");
97  tab->addColumn<float>("EmFractionEnergyRing3", EmFractionEnergyRings[3], "Em energy fraction in ring in dR 0.2-0.3");
98  tab->addColumn<float>("EmFractionEnergyRing4", EmFractionEnergyRings[4], "Em energy fraction in ring in dR 0.3-0.4");
99  tab->addColumn<float>(
100  "EmFractionEnergyRing5", EmFractionEnergyRings[5], "Em energy fraction in ring in dR 0.4 overflow");
101 
102  tab->addColumn<float>("ChFractionEnergyRing0", ChFractionEnergyRings[0], "Ch energy fraction in ring in dR 0-0.05");
103  tab->addColumn<float>("ChFractionEnergyRing1", ChFractionEnergyRings[1], "Ch energy fraction in ring in dR 0.05-0.1");
104  tab->addColumn<float>("ChFractionEnergyRing2", ChFractionEnergyRings[2], "Ch energy fraction in ring in dR 0.1-0.2");
105  tab->addColumn<float>("ChFractionEnergyRing3", ChFractionEnergyRings[3], "Ch energy fraction in ring in dR 0.2-0.3");
106  tab->addColumn<float>("ChFractionEnergyRing4", ChFractionEnergyRings[4], "Ch energy fraction in ring in dR 0.3-0.4");
107  tab->addColumn<float>(
108  "ChFractionEnergyRing5", ChFractionEnergyRings[5], "Ch energy fraction in ring in dR 0.4 overflow");
109 
110  tab->addColumn<float>("MuFractionEnergyRing0", MuFractionEnergyRings[0], "Mu energy fraction in ring in dR 0-0.05");
111  tab->addColumn<float>("MuFractionEnergyRing1", MuFractionEnergyRings[1], "Mu energy fraction in ring in dR 0.05-0.1");
112  tab->addColumn<float>("MuFractionEnergyRing2", MuFractionEnergyRings[2], "Mu energy fraction in ring in dR 0.1-0.2");
113  tab->addColumn<float>("MuFractionEnergyRing3", MuFractionEnergyRings[3], "Mu energy fraction in ring in dR 0.2-0.3");
114  tab->addColumn<float>("MuFractionEnergyRing4", MuFractionEnergyRings[4], "Mu energy fraction in ring in dR 0.3-0.4");
115  tab->addColumn<float>(
116  "MuFractionEnergyRing5", MuFractionEnergyRings[5], "Mu energy fraction in ring in dR 0.4 overflow");
117 
118  tab->addColumn<float>("NeFractionEnergyRing0", NeFractionEnergyRings[0], "Ne energy fraction in ring in dR 0-0.05");
119  tab->addColumn<float>("NeFractionEnergyRing1", NeFractionEnergyRings[1], "Ne energy fraction in ring in dR 0.05-0.1");
120  tab->addColumn<float>("NeFractionEnergyRing2", NeFractionEnergyRings[2], "Ne energy fraction in ring in dR 0.1-0.2");
121  tab->addColumn<float>("NeFractionEnergyRing3", NeFractionEnergyRings[3], "Ne energy fraction in ring in dR 0.2-0.3");
122  tab->addColumn<float>("NeFractionEnergyRing4", NeFractionEnergyRings[4], "Ne energy fraction in ring in dR 0.3-0.4");
123  tab->addColumn<float>(
124  "NeFractionEnergyRing5", NeFractionEnergyRings[5], "Ne energy fraction in ring in dR 0.4 overflow");
125 
126  iEvent.put(std::move(tab));
127 }
128 
130 //define this as a plug-in
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< edm::View< pat::Jet > > srcJet_
tuple d
Definition: ztail.py:151
int iEvent
Definition: GenABIO.cc:224
def move
Definition: eostools.py:511
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterDescriptionBase * add(U const &iLabel, T const &value)
EnergyRingsTableProducer(const edm::ParameterSet &iConfig)
void produce(edm::Event &, edm::EventSetup const &) override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
constexpr char Jet[]
Definition: modules.cc:9
__host__ __device__ constexpr RandomIt lower_bound(RandomIt first, RandomIt last, const T &value, Compare comp={})