CMS 3D CMS Logo

TriggerObjectTableProducer.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 #include <sstream>
4 
5 // user include files
8 
11 
14 
26 
28  public:
29  explicit TriggerObjectTableProducer(const edm::ParameterSet &iConfig) :
30  name_(iConfig.getParameter<std::string>("name")),
31  src_(consumes<std::vector<pat::TriggerObjectStandAlone>>(iConfig.getParameter<edm::InputTag>("src"))),
32  l1EG_(consumes<l1t::EGammaBxCollection>(iConfig.getParameter<edm::InputTag>("l1EG"))),
33  l1Sum_(consumes<l1t::EtSumBxCollection>(iConfig.getParameter<edm::InputTag>("l1Sum"))),
34  l1Jet_(consumes<l1t::JetBxCollection>(iConfig.getParameter<edm::InputTag>("l1Jet"))),
35  l1Muon_(consumes<l1t::MuonBxCollection>(iConfig.getParameter<edm::InputTag>("l1Muon"))),
36  l1Tau_(consumes<l1t::TauBxCollection>(iConfig.getParameter<edm::InputTag>("l1Tau")))
37  {
38  std::vector<edm::ParameterSet> selPSets = iConfig.getParameter<std::vector<edm::ParameterSet>>("selections");
39  sels_.reserve(selPSets.size());
40  std::stringstream idstr, qualitystr;
41  idstr << "ID of the object: ";
42  for (auto & pset : selPSets) {
43  sels_.emplace_back(pset);
44  idstr << sels_.back().id << " = " << sels_.back().name;
45  if (sels_.size() < selPSets.size()) idstr << ", ";
46  if (!sels_.back().qualityBitsDoc.empty()) {
47  qualitystr << sels_.back().qualityBitsDoc << " for " << sels_.back().name << "; ";
48  }
49  }
50  idDoc_ = idstr.str();
51  bitsDoc_ = qualitystr.str();
52 
53  produces<nanoaod::FlatTable>();
54  }
55 
57 
58  private:
59  void produce(edm::Event&, edm::EventSetup const&) override ;
60 
64 
70 
71  struct SelectedObject {
73  int id;
76  float l1DR2, l1DR2_2, l2DR2;
79 
81  name(pset.getParameter<std::string>("name")),
82  id(pset.getParameter<int>("id")),
83  cut(pset.getParameter<std::string>("sel")),
84  l1cut(""), l1cut_2(""), l2cut(""),
85  l1DR2(-1), l1DR2_2(-1), l2DR2(-1),
86  qualityBits(pset.getParameter<std::string>("qualityBits")),
87  qualityBitsDoc(pset.getParameter<std::string>("qualityBitsDoc"))
88  {
89  if (pset.existsAs<std::string>("l1seed")) {
91  l1DR2 = std::pow(pset.getParameter<double>("l1deltaR"), 2);
92  }
93  if (pset.existsAs<std::string>("l1seed_2")) {
95  l1DR2_2 = std::pow(pset.getParameter<double>("l1deltaR_2"), 2);
96  }
97  if (pset.existsAs<std::string>("l2seed")) {
99  l2DR2 = std::pow(pset.getParameter<double>("l2deltaR"), 2);
100  }
101  }
102 
103  bool match(const pat::TriggerObjectStandAlone & obj) const {
104  return cut(obj);
105  }
106  };
107 
108  std::vector<SelectedObject> sels_;
109 };
110 
111 // ------------ method called to produce the data ------------
112 void
114 {
115 
117  iEvent.getByToken(src_, src);
118 
119  std::vector<std::pair<const pat::TriggerObjectStandAlone *, const SelectedObject *>> selected;
120  for (const auto & obj : *src) {
121  for (const auto & sel : sels_) {
122  if (sel.match(obj)) {
123  selected.emplace_back(&obj,&sel);
124  break;
125  }
126  }
127  }
128 
129  // Self-cleaning
130  std::map<const pat::TriggerObjectStandAlone *,int> selected_bits;
131  for(unsigned int i = 0; i < selected.size(); ++i) {
132  const auto & obj = *selected[i].first;
133  const auto & sel = *selected[i].second;
134  selected_bits[&obj] = int(sel.qualityBits(obj));
135 
136  for(unsigned int j=0; j<i; ++j){
137  const auto & obj2 = *selected[j].first;
138  const auto & sel2 = *selected[j].second;
139  if(sel.id==sel2.id && abs(obj.pt()-obj2.pt())<1e-6 && deltaR2(obj,obj2)<1e-6){
140  selected_bits[&obj2] |= selected_bits[&obj]; //Keep filters from all the objects
141  selected.erase(selected.begin()+i);
142  i--;
143  }
144  }
145  }
146 
152  iEvent.getByToken(l1EG_, l1EG);
153  iEvent.getByToken(l1Sum_, l1Sum);
154  iEvent.getByToken(l1Jet_, l1Jet);
155  iEvent.getByToken(l1Muon_, l1Muon);
156  iEvent.getByToken(l1Tau_, l1Tau);
157 
158  std::vector<pair<pat::TriggerObjectStandAlone,int>> l1Objects;
159 
160  for(l1t::EGammaBxCollection::const_iterator it=l1EG->begin(0); it!=l1EG->end(0); it++){
161  pat::TriggerObjectStandAlone l1obj(it->p4());
162  l1obj.setCollection("L1EG");
163  l1obj.addTriggerObjectType(trigger::TriggerL1EG);
164  l1Objects.emplace_back(l1obj,it->hwIso());
165  }
166 
167  for(l1t::EtSumBxCollection::const_iterator it=l1Sum->begin(0); it!=l1Sum->end(0); it++){
168  pat::TriggerObjectStandAlone l1obj(it->p4());
169 
170  switch(it->getType()){
171 
173  l1obj.addTriggerObjectType(trigger::TriggerL1ETM);
174  l1obj.setCollection("L1ETM");
175  break;
176 
178  l1obj.addTriggerObjectType(trigger::TriggerL1ETM);
179  l1obj.setCollection("L1ETMHF");
180  break;
181 
183  l1obj.addTriggerObjectType(trigger::TriggerL1ETT);
184  l1obj.setCollection("L1ETT");
185  break;
186 
188  l1obj.addTriggerObjectType(trigger::TriggerL1ETT);
189  l1obj.setCollection("L1ETEm");
190  break;
191 
193  l1obj.addTriggerObjectType(trigger::TriggerL1HTT);
194  l1obj.setCollection("L1HTT");
195  break;
196 
198  l1obj.addTriggerObjectType(trigger::TriggerL1HTT);
199  l1obj.setCollection("L1HTTHF");
200  break;
201 
203  l1obj.addTriggerObjectType(trigger::TriggerL1HTM);
204  l1obj.setCollection("L1HTM");
205  break;
206 
208  l1obj.addTriggerObjectType(trigger::TriggerL1HTM);
209  l1obj.setCollection("L1HTMHF");
210  break;
211 
212  default:
213  continue;
214  }
215 
216  l1Objects.emplace_back(l1obj,it->hwIso());
217 
218  }
219 
220  for(l1t::JetBxCollection::const_iterator it=l1Jet->begin(0); it!=l1Jet->end(0); it++){
221  pat::TriggerObjectStandAlone l1obj(it->p4());
222  l1obj.setCollection("L1Jet");
223  l1obj.addTriggerObjectType(trigger::TriggerL1Jet);
224  l1Objects.emplace_back(l1obj,it->hwIso());
225  }
226 
227  for(l1t::MuonBxCollection::const_iterator it=l1Muon->begin(0); it!=l1Muon->end(0); it++){
228  pat::TriggerObjectStandAlone l1obj(it->p4());
229  l1obj.setCollection("L1Mu");
230  l1obj.addTriggerObjectType(trigger::TriggerL1Mu);
231  l1obj.setCharge(it->charge());
232  l1Objects.emplace_back(l1obj,it->hwIso());
233  }
234 
235  for(l1t::TauBxCollection::const_iterator it=l1Tau->begin(0); it!=l1Tau->end(0); it++){
236  pat::TriggerObjectStandAlone l1obj(it->p4());
237  l1obj.setCollection("L1Tau");
238  l1obj.addTriggerObjectType(trigger::TriggerL1Tau);
239  l1Objects.emplace_back(l1obj,it->hwIso());
240  }
241 
242 
243  unsigned int nobj = selected.size();
244  std::vector<float> pt(nobj,0), eta(nobj,0), phi(nobj,0), l1pt(nobj, 0), l1pt_2(nobj, 0), l2pt(nobj, 0);
245  std::vector<int> id(nobj,0), bits(nobj, 0), l1iso(nobj, 0), l1charge(nobj,0);
246  for (unsigned int i = 0; i < nobj; ++i) {
247  const auto & obj = *selected[i].first;
248  const auto & sel = *selected[i].second;
249  pt[i] = obj.pt();
250  eta[i] = obj.eta();
251  phi[i] = obj.phi();
252  id[i] = sel.id;
253  bits[i] = selected_bits[&obj];
254  if (sel.l1DR2 > 0) {
255  float best = sel.l1DR2;
256  for (const auto & l1obj : l1Objects) {
257  const auto & seed = l1obj.first;
258  float dr2 = deltaR2(seed, obj);
259  if (dr2 < best && sel.l1cut(seed)) {
260  l1pt[i] = seed.pt();
261  l1iso[i] = l1obj.second;
262  l1charge[i] = seed.charge();
263  }
264  }
265  }
266  if (sel.l1DR2_2 > 0) {
267  float best = sel.l1DR2_2;
268  for (const auto & l1obj : l1Objects) {
269  const auto & seed = l1obj.first;
270  float dr2 = deltaR2(seed, obj);
271  if (dr2 < best && sel.l1cut_2(seed)) {
272  l1pt_2[i] = seed.pt();
273  }
274  }
275  }
276  if (sel.l2DR2 > 0) {
277  float best = sel.l2DR2;
278  for (const auto & seed : *src) {
279  float dr2 = deltaR2(seed, obj);
280  if (dr2 < best && sel.l2cut(seed)) {
281  l2pt[i] = seed.pt();
282  }
283  }
284  }
285  }
286 
287  auto tab = std::make_unique<nanoaod::FlatTable>(nobj, name_, false, false);
288  tab->addColumn<int>("id", id, idDoc_, nanoaod::FlatTable::IntColumn);
289  tab->addColumn<float>("pt", pt, "pt", nanoaod::FlatTable::FloatColumn, 12);
290  tab->addColumn<float>("eta", eta, "eta", nanoaod::FlatTable::FloatColumn, 12);
291  tab->addColumn<float>("phi", phi, "phi", nanoaod::FlatTable::FloatColumn, 12);
292  tab->addColumn<float>("l1pt", l1pt, "pt of associated L1 seed", nanoaod::FlatTable::FloatColumn, 8);
293  tab->addColumn<int>("l1iso", l1iso, "iso of associated L1 seed", nanoaod::FlatTable::IntColumn);
294  tab->addColumn<int>("l1charge", l1charge, "charge of associated L1 seed", nanoaod::FlatTable::IntColumn);
295  tab->addColumn<float>("l1pt_2", l1pt_2, "pt of associated secondary L1 seed", nanoaod::FlatTable::FloatColumn, 8);
296  tab->addColumn<float>("l2pt", l2pt, "pt of associated 'L2' seed (i.e. HLT before tracking/PF)", nanoaod::FlatTable::FloatColumn, 10);
297  tab->addColumn<int>("filterBits", bits, "extra bits of associated information: "+bitsDoc_, nanoaod::FlatTable::IntColumn);
298  iEvent.put(std::move(tab));
299 }
300 
301 
302 //define this as a plug-in
BXVector< EGamma > EGammaBxCollection
Definition: EGamma.h:11
const_iterator end(int bx) const
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:161
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
enum start value shifted to 81 so as to avoid clashes with PDG codes
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision bits
delete x;
Definition: CaloConfig.h:22
BXVector< Tau > TauBxCollection
Definition: Tau.h:11
StringCutObjectSelector< pat::TriggerObjectStandAlone > l1cut
Definition: HeavyIon.h:7
edm::EDGetTokenT< l1t::JetBxCollection > l1Jet_
BXVector< EtSum > EtSumBxCollection
Definition: EtSum.h:11
TriggerObjectTableProducer(const edm::ParameterSet &iConfig)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< std::vector< pat::TriggerObjectStandAlone > > src_
void setCollection(const std::string &collName)
Methods.
Definition: TriggerObject.h:84
StringObjectFunction< pat::TriggerObjectStandAlone > qualityBits
edm::EDGetTokenT< l1t::MuonBxCollection > l1Muon_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
BXVector< Muon > MuonBxCollection
Definition: Muon.h:11
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
BXVector< Jet > JetBxCollection
Definition: Jet.h:11
StringCutObjectSelector< pat::TriggerObjectStandAlone > l1cut_2
bool match(const pat::TriggerObjectStandAlone &obj) const
HLT enums.
edm::EDGetTokenT< l1t::TauBxCollection > l1Tau_
StringCutObjectSelector< pat::TriggerObjectStandAlone > cut
std::vector< SelectedObject > sels_
edm::EDGetTokenT< l1t::EGammaBxCollection > l1EG_
edm::EDGetTokenT< l1t::EtSumBxCollection > l1Sum_
void produce(edm::Event &, edm::EventSetup const &) override
const_iterator begin(int bx) const
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
def move(src, dest)
Definition: eostools.py:511
StringCutObjectSelector< pat::TriggerObjectStandAlone > l2cut
std::vector< T >::const_iterator const_iterator
Definition: BXVector.h:20
Analysis-level trigger object class (stand-alone)