babymaker  8522a50888c6c2e6eb3059ef64397a0b29afe7a5
bmaker_basic.cc
Go to the documentation of this file.
1 
4 // System include files
5 #include <cmath>
6 #include <memory>
7 #include <iostream>
8 #include <stdlib.h>
9 #include <iomanip> // put_time
10 
11 // FW include files
12 #include "FWCore/Framework/interface/Frameworkfwd.h"
13 #include "FWCore/Framework/interface/EDAnalyzer.h"
14 #include "FWCore/Framework/interface/Event.h"
15 #include "FWCore/Framework/interface/MakerMacros.h"
16 #include "FWCore/ParameterSet/interface/ParameterSet.h"
17 
18 // FW physics include files
19 #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
20 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
21 
22 // ROOT include files
23 #include "TFile.h"
24 #include "TROOT.h"
25 
26 // User include files
30 
31 using namespace std;
32 using namespace utilities;
33 
35 void bmaker_basic::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
36  nevents++;
37  isData = iEvent.isRealData();
38  baby.Clear();
39 
41  baby.run() = iEvent.id().run();
42  baby.event() = iEvent.id().event();
43  baby.lumiblock() = iEvent.luminosityBlock();
44  if(isData){
45  if (debug) cout<<"INFO: Checking JSON..."<<endl;
46  // We are applying the golden JSON with lumisToProcess in bmaker_basic_cfg.py
47  bool nonblind(eventTool->isInJSON("nonblind", baby.run(), baby.lumiblock()));
48  //if(!isInJSON("golden", baby.run(), baby.lumiblock()) && !nonblind) return;
49  baby.nonblind() = nonblind;
50  } else baby.nonblind() = true;
51 
53  if (debug) cout<<"INFO: Processing trigger info..."<<endl;
54  bool triggerFired;
55  edm::Handle<edm::TriggerResults> triggerBits;
56  iEvent.getByToken(tok_trigResults_hlt_,triggerBits);
57  edm::Handle<pat::PackedTriggerPrescales> triggerPrescales;
58  iEvent.getByToken(tok_patTrig_,triggerPrescales);
59 
60  if(triggerBits.isValid() && triggerPrescales.isValid()){
61  const edm::TriggerNames &names = iEvent.triggerNames(*triggerBits);
62  // Not saving data events that don't have triggers we care about
63  triggerFired = writeTriggers(names, triggerBits, triggerPrescales);
64  }
65  else
66  triggerFired = true;
67  if(!triggerFired && isData) {
68  reportTime(iEvent);
69  return;
70  }
71 
73  if (debug) cout<<"INFO: Writing vertices..."<<endl;
74  edm::Handle<reco::VertexCollection> vtx;
75  iEvent.getByToken(tok_primVertex_, vtx);
76  edm::Handle<std::vector< PileupSummaryInfo > > pu_info;
77  if(!isData) {
78  iEvent.getByToken(tok_addPileup_, pu_info);
79  if(!pu_info.isValid()) iEvent.getByToken(tok_slimAddPileup_, pu_info);
80  }
81  writeVertices(vtx, pu_info);
82 
84  if (debug) cout<<"INFO: Writing leptons..."<<endl;
85  // pfcands, to be used in calculating isolation
86  edm::Handle<pat::PackedCandidateCollection> pfcands;
87  iEvent.getByToken(tok_packPFCands_, pfcands);
88 
89  // Event energy density, to be used in calculating isolation and JECs
90  edm::Handle<double> rhoEventCentral_h;
91  iEvent.getByToken(tok_rhoFastJet_centralNeutral_, rhoEventCentral_h);
92  double rhoEventCentral = static_cast<double>(*rhoEventCentral_h);
93 
94  vCands sig_leps, veto_leps, sig_mus, veto_mus, sig_els, veto_els;
95  vCands all_mus, all_els;
96  edm::Handle<pat::MuonCollection> allmuons;
97  iEvent.getByToken(tok_muons_, allmuons);
98  sig_mus = writeMuons(allmuons, pfcands, vtx, veto_mus, all_mus, rhoEventCentral);
99  edm::Handle<pat::ElectronCollection> allelectrons;
100  iEvent.getByToken(tok_electrons_, allelectrons);
101  sig_els = writeElectrons(allelectrons, pfcands, vtx, veto_els, all_els, rhoEventCentral);
102 
103  writeDiLep(sig_mus, sig_els, veto_mus, veto_els);
104 
105  // Putting muons and electrons together
106  sig_leps = sig_mus;
107  sig_leps.insert(sig_leps.end(), sig_els.begin(), sig_els.end());
108  writeLeptons(sig_leps);
109  // if (baby.nleps()<1) return;
110  veto_leps = veto_mus;
111  veto_leps.insert(veto_leps.end(), veto_els.begin(), veto_els.end());
112 
114  if (debug) cout<<"INFO: Writing photons..."<<endl;
115  vCands photons;
116  edm::Handle<double> rhoEvent_h;
117  iEvent.getByToken(tok_rhoFastJet_all_, rhoEvent_h);
118  edm::Handle<reco::BeamSpot> beamspot;
119  iEvent.getByToken(tok_offBeamSpot_, beamspot);
120  edm::Handle<pat::PhotonCollection> allphotons;
121  iEvent.getByToken(tok_photons_, allphotons);
122  edm::Handle<vector<reco::Conversion> > conversions;
123  iEvent.getByToken(tok_reducedEgamma_conver_, conversions);
124  photons = writePhotons(allphotons, allelectrons, conversions, beamspot, *rhoEvent_h);
125 
127  if (debug) cout<<"INFO: Applying JECs..."<<endl;
128  edm::Handle<pat::JetCollection> alljets;
129  iEvent.getByToken(tok_jets_, alljets);
130  edm::Handle<edm::View<reco::GenJet> > genjets;
131  iEvent.getByToken(tok_genJets_, genjets) ;
132  jetTool->getJetCorrections(genjets, alljets, *rhoEvent_h);
133 
135  if (debug) cout<<"INFO: Writing MET..."<<endl;
136  edm::Handle<pat::METCollection> mets;
137  iEvent.getByToken(tok_met_, mets);
138  edm::Handle<pat::METCollection> mets_nohf;
139  iEvent.getByToken(tok_met_noHF_, mets_nohf);
140  writeMET(mets, mets_nohf);
141 
143  if (debug) cout<<"INFO: Calculating track veto..."<<endl;
144  vCands tks,ra4tks;
145  if (eventTool->hasGoodPV(vtx)){
146  // RA2/b track veto
147  tks = lepTool->getIsoTracks(pfcands, baby.met(), baby.met_phi());
148  baby.ntks() = tks.size();
149 
150  // RA4 track veto
151  if(baby.leps_id().size()>0){
152  vector<float> isos,relisos;
153  ra4tks = lepTool->getRA4IsoTracks(pfcands, baby.met(), baby.met_phi(),rhoEventCentral,isos,relisos,baby.leps_id().at(0));
154  vector<float> tks_pt;
155  vector<float> tks_eta;
156  vector<float> tks_phi;
157  vector<int> tks_pdg;
158  vector<float> tks_miniso;
159  vector<float> tks_mt2;
160  vector<float> tks_mt;
161  int nveto=0;
162 
163  for(unsigned i=0;i<ra4tks.size();i++){
164  tks_pt.push_back(ra4tks.at(i)->pt());
165  tks_eta.push_back(ra4tks.at(i)->eta());
166  tks_phi.push_back(ra4tks.at(i)->phi());
167  tks_pdg.push_back(ra4tks.at(i)->pdgId());
168  tks_miniso.push_back(isos.at(i));
169  tks_mt2.push_back(getMT2(baby.leps_pt().at(0),baby.leps_phi().at(0),tks_pt.back(),tks_phi.back(),baby.met(),baby.met_phi()));
170  tks_mt.push_back(getMT(tks_pt.back(),tks_phi.back(),baby.met(),baby.met_phi()));
171  if(fabs(tks_pdg.back())==211 && tks_pt.back()>15. && tks_miniso.back()<0.05 && tks_mt2.back()<100) nveto++;
172  else if (fabs(tks_pdg.back())==13 && tks_pt.back()>10. && tks_miniso.back()<0.2 && tks_mt2.back()<100) nveto++;
173  else if (fabs(tks_pdg.back())==11 && tks_pt.back()>10. && tks_miniso.back()<0.1 && tks_mt2.back()<100) nveto++;
174  }
175  baby.tks_pt() = tks_pt;
176  baby.tks_eta() = tks_eta;
177  baby.tks_phi() = tks_phi;
178  baby.tks_pdg() = tks_pdg;
179  baby.tks_miniso() = tks_miniso;
180  baby.tks_mt2() = tks_mt2;
181  baby.tks_mt() = tks_mt;
182  baby.nveto()=nveto;
183 
184  }
185  } // if goodPV
186 
188  if (debug) cout<<"INFO: Writing jets..."<<endl;
189  vector<LVector> jets;
190  vector<vector<LVector> > sys_jets;
191  if (!doSystematics) {
192  writeJets(alljets, genjets, sig_leps, veto_leps, photons, tks, jets, sys_jets);
193  } else {
194  writeJets(alljets, genjets, sig_leps, veto_leps, photons, tks, jets, sys_jets);
195  for (unsigned isys(0); isys<kSysLast; isys++) baby.sys_mj().push_back(jetTool->getSysMJ(1.2, sys_jets[isys]));
196  }
197  writeFatJets(jets);
198 
200  // It requires previous storing of MET
201  if (debug) cout<<"INFO: Calculating mT..."<<endl;
202  if(sig_leps.size()>0){
203  float wx = baby.met()*cos(baby.met_phi()) + sig_leps[0]->px();
204  float wy = baby.met()*sin(baby.met_phi()) + sig_leps[0]->py();
205  float wphi = atan2(wy, wx);
206  baby.dphi_wlep() = deltaPhi(wphi, sig_leps[0]->phi());
207 
208  baby.mt() = getMT(baby.met(), baby.met_phi(), sig_leps[0]->pt(), sig_leps[0]->phi());
209  baby.mt_nohf() = getMT(baby.met_nohf(), baby.met_nohf_phi(), sig_leps[0]->pt(), sig_leps[0]->phi());
210  }
211  // calculating met with systematics and corresponding mT
212  if (doSystematics) {
213  baby.sys_met().resize(kSysLast,-999.);
214  baby.sys_mt().resize(kSysLast,-999.);
215  for (unsigned isys(0); isys<kSysLast; isys++) {
216  float sys_met_phi(0.);
217  jetTool->getMETWithJEC(mets, baby.sys_met()[isys], sys_met_phi, isys);
218  if (sig_leps.size()>0)
219  baby.sys_mt()[isys] = getMT(baby.sys_met()[isys], sys_met_phi, sig_leps[0]->pt(), sig_leps[0]->phi());
220  }
221  }
222 
224  // the HBHE noise filter needs to be recomputed in early 2015 data
225  if (debug) cout<<"INFO: Writing filters..."<<endl;
226  edm::Handle<bool> filter_hbhe;
227  if(iEvent.getByToken(tok_HBHENoiseFilter_,filter_hbhe)) {
228  if(filter_hbhe.isValid())
229  baby.pass_hbhe() = *filter_hbhe;
230  else
231  baby.pass_hbhe() = true;
232 
233  iEvent.getByToken(tok_HBHEIsoNoiseFilter_,filter_hbhe);
234  if(filter_hbhe.isValid())
235  baby.pass_hbheiso() = *filter_hbhe;
236  else
237  baby.pass_hbheiso() = true;
238  }
239  edm::Handle<edm::TriggerResults> filterBits;
240  if(isData) iEvent.getByToken(tok_trigResults_reco_,filterBits);
241  else iEvent.getByToken(tok_trigResults_pat_,filterBits);
242  // re-recoed data will have the process label "PAT" rather than "RECO";
243  // if the attempt to find data with "RECO" process fails, try "PAT"
244  if(!filterBits.isValid() && isData)
245  iEvent.getByToken(tok_trigResults_pat_,filterBits);
246  if(filterBits.isValid()){
247  const edm::TriggerNames &fnames = iEvent.triggerNames(*filterBits);
248  //this method uses baby.pass_jets(), so call only after writeJets()!!
249  writeFilters(fnames, filterBits, vtx);
250  }
251 
253  if (debug) cout<<"INFO: Writing HLT objects..."<<endl;
254  edm::Handle<pat::TriggerObjectStandAloneCollection> triggerObjects;
255  iEvent.getByToken(tok_selectedPatTrig_,triggerObjects);
256  // Requires having called writeMuons and writeElectrons for truth-matching
257  if(triggerBits.isValid() && triggerPrescales.isValid()){
258  const edm::TriggerNames &names = iEvent.triggerNames(*triggerBits);
259  writeHLTObjects(names, triggerObjects, all_mus, all_els, photons);
260  }
261 
263  if (!isData) {
264  if (debug) cout<<"INFO: Writing MC particles..."<<endl;
265  edm::Handle<reco::GenParticleCollection> genParticles;
266  iEvent.getByToken(tok_pruneGenPart_, genParticles);
267  writeMC(genParticles, all_mus, all_els, photons);
268  }
269 
271  if (debug) cout<<"INFO: Calculating MET rebalancing..."<<endl;
272  baby.jetmismeas() = false;
273  if(doMetRebalancing && sig_leps.size()==1) {
274  double temp_met = baby.met();
275  double temp_met_phi = baby.met_phi();
276  rebalancedMET(temp_met, temp_met_phi);
277  baby.met_rebal() = temp_met;
278  baby.mt_rebal() = getMT(temp_met, temp_met_phi, sig_leps[0]->pt(), sig_leps[0]->phi());
279  if(baby.met_rebal()/baby.met()<0.2 && baby.mt_rebal()<150) baby.jetmismeas()=true;
280  } else {
281  // use default values for events that do not have exactly one lepton
282  baby.mt_rebal() = baby.mt();
283  baby.met_rebal() = baby.met();
284  }
285 
287  if (debug) cout<<"INFO: Retrieving hard scatter info..."<<endl;
288  edm::Handle<LHEEventProduct> lhe_info;
289  baby.stitch() = true;
290  if (!isData) {
291  iEvent.getByToken(tok_extLHEProducer_, lhe_info);
292  if(!lhe_info.isValid()) iEvent.getByToken(tok_source_, lhe_info);
293  writeGenInfo(lhe_info);
294  if((outname.Contains("TTJets") && (outname.Contains("Lept") || outname.Contains("TTJets_Tune")) && baby.ht_isr_me()>600)
295  || (outname.Contains("DYJetsToLL_M-50_TuneCUETP8M") && baby.ht_isr_me()>100))
296  baby.stitch() = false;
297  if(outname.Contains("TTJets_Tune") && baby.ntruleps()!=0) baby.stitch()=false;
298  } // if it is not data
299 
301  // w_btag calculated in writeJets
302  // w_toppt and sys_isr calculated in writeMC
303  edm::Handle<GenEventInfoProduct> gen_event_info;
304  iEvent.getByToken(tok_generator_, gen_event_info);
305  writeWeights(sig_leps, gen_event_info, lhe_info);
306 
307 
309  baby.Fill();
310 
311  reportTime(iEvent);
312 
313 }
314 
315 
316 /*
317 ______ _ _ _ _
318 | ___ \ | | (_) | (_)
319 | |_/ /_ __ __ _ _ __ ___| |__ __ ___ __ _| |_ _ _ __ __ _
320 | ___ \ '__/ _` | '_ \ / __| '_ \ \ \ /\ / / '__| | __| | '_ \ / _` |
321 | |_/ / | | (_| | | | | (__| | | | \ V V /| | | | |_| | | | | (_| |
322 \____/|_| \__,_|_| |_|\___|_| |_| \_/\_/ |_| |_|\__|_|_| |_|\__, |
323  __/ |
324  |___/
325 */
326 
327 // Requires having called jetTool->getJetCorrections(alljets, rhoEvent_) beforehand
328 void bmaker_basic::writeMET(edm::Handle<pat::METCollection> mets, edm::Handle<pat::METCollection> mets_nohf){
329  jetTool->getMETWithJEC(mets, baby.met(), baby.met_phi(), kSysLast);
330  jetTool->getMETRaw(mets, baby.met_raw(), baby.met_raw_phi());
331  baby.met_mini() = mets->at(0).pt();
332  baby.met_mini_phi() = mets->at(0).phi();
333  baby.met_calo() = mets->at(0).caloMETPt();
334  baby.met_calo_phi() = mets->at(0).caloMETPhi();
335  if(mets_nohf.isValid()){
336  baby.met_nohf() = mets_nohf->at(0).pt();
337  baby.met_nohf_phi() = mets_nohf->at(0).phi();
338  }
339  if(!isData){
340  baby.met_tru() = mets->at(0).genMET()->pt();
341  baby.met_tru_phi() = mets->at(0).genMET()->phi();
342  }
343  if(isnan(baby.met())) {
344  cout<<"MET is NaN. Perhaps you are running on old miniAOD with a new release. Setting MET to zero."<<endl;
345  baby.met() = 0;
346  }
347 }
348 
349 // Requires having called jetTool->getJetCorrections(alljets, rhoEvent_) beforehand
350 void bmaker_basic::writeJets(edm::Handle<pat::JetCollection> alljets,
351  edm::Handle<edm::View <reco::GenJet> > genjets,
352  vCands &sig_leps, vCands &veto_leps, vCands &photons, vCands &tks,
353  vector<LVector> &jets, vector<vector<LVector> > &sys_jets){
354  vCands jets_ra2;
355  LVector jetsys_p4, jetsys_nob_p4;
356  baby.njets() = 0; baby.nbl() = 0; baby.nbm() = 0; baby.nbt() = 0;
357  baby.ht() = 0.; baby.ht_hlt() = 0.;
358  baby.njets_ra2() = 0; baby.njets_clean() = 0; baby.nbm_ra2() = 0; baby.ht_ra2() = 0.; baby.ht_clean() = 0.;
359  baby.pass_jets() = true; baby.pass_jets_nohf() = true; baby.pass_jets_tight() = true;
360  baby.pass_jets_ra2() = true; baby.pass_jets_tight_ra2() = true;
361  baby.sys_bctag().resize(2, 1.); baby.sys_udsgtag().resize(2, 1.);
362  baby.sys_bctag_loose().resize(2, 1.); baby.sys_udsgtag_loose().resize(2, 1.);
363  baby.w_btag() = baby.w_btag_loose() = 1.;
364  if (isFastSim){ baby.sys_fs_bctag().resize(2, 1.); baby.sys_fs_udsgtag().resize(2, 1.);}
365  if (doSystematics) {
366  baby.sys_njets().resize(kSysLast, 0); baby.sys_nbm().resize(kSysLast, 0);
367  baby.sys_pass().resize(kSysLast, true); baby.sys_ht().resize(kSysLast, 0.);
368  sys_jets.resize(kSysLast, vector<LVector>());
369  }
370  float mht_px(0.), mht_py(0.), mht_clean_px(0.), mht_clean_py(0.);
371  for (size_t ijet(0); ijet < alljets->size(); ijet++) {
372  const pat::Jet &jet = (*alljets)[ijet];
373  if(fabs(jet.eta()) > 5) continue;
374 
375  LVector jetp4(jetTool->corrJet[ijet]);
376  float csv(jet.bDiscriminator("pfCombinedInclusiveSecondaryVertexV2BJetTags"));
377  bool isLep = jetTool->leptonInJet(jet, sig_leps);
378  bool looseID = jetTool->idJet(jet, jetTool->kLoose);
379  bool tightID = jetTool->idJet(jet, jetTool->kTight);
380  bool goodPtEta = jetp4.pt() > jetTool->JetPtCut && fabs(jet.eta()) <= jetTool->JetEtaCut;
381 
382  // RA4 Jet Quality filters
383  //--------------------------------
384  if(jetp4.pt() > jetTool->JetPtCut && !isLep) {
385  if(goodPtEta && !looseID) baby.pass_jets_nohf() = false;
386  if(!looseID) baby.pass_jets() = false;
387  if(!tightID) baby.pass_jets_tight() = false;
388  }
389 
390  // RA4 Jet Variables
391  //----------------------------
392  if((looseID && goodPtEta) || isLep) {
393  baby.jets_pt().push_back(jetp4.pt());
394  baby.jets_eta().push_back(jet.eta());
395  baby.jets_phi().push_back(jet.phi());
396  baby.jets_m().push_back(jetp4.mass());
397  baby.jets_islep().push_back(isLep);
398  if(!isData && jetTool->genJetPt[ijet]>0.) baby.jets_pt_res().push_back(jetp4.pt()/jetTool->genJetPt[ijet]);
399  else baby.jets_pt_res().push_back(-99999.);
400  baby.jets_hflavor().push_back(jet.hadronFlavour());
401  baby.jets_csv().push_back(csv);
402  jets.push_back(jetp4);
403 
404 
405  if(!isLep){
406  if(addBTagWeights) {
407  bool btag(csv > jetTool->CSVMedium);
408  bool btagLoose(csv > jetTool->CSVLoose);
409  //central weight for fastsim taken into account together with the fullsim inside jetTool->jetBTagWeight()
410  baby.w_btag() *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM,
411  "central", "central");
412  // now, vary only the full sim scale factor, regardless of whether we run on Fast or Full sim
413  // this is necessary since uncertainties for FastSim and FullSim are uncorrelated
414  baby.sys_bctag()[0] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM, "up", "central");
415  baby.sys_bctag()[1] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM, "down", "central");
416  baby.sys_udsgtag()[0] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM, "central", "up");
417  baby.sys_udsgtag()[1] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM, "central", "down");
418  baby.w_btag_loose() *= jetTool->jetBTagWeight(jet, jetp4, btagLoose, BTagEntry::OP_LOOSE, "central", "central");
419  baby.sys_bctag_loose()[0] *= jetTool->jetBTagWeight(jet, jetp4, btagLoose, BTagEntry::OP_LOOSE, "up", "central");
420  baby.sys_bctag_loose()[1] *= jetTool->jetBTagWeight(jet, jetp4, btagLoose, BTagEntry::OP_LOOSE, "down", "central");
421  baby.sys_udsgtag_loose()[0] *= jetTool->jetBTagWeight(jet, jetp4, btagLoose, BTagEntry::OP_LOOSE, "central", "up");
422  baby.sys_udsgtag_loose()[1] *= jetTool->jetBTagWeight(jet, jetp4, btagLoose, BTagEntry::OP_LOOSE, "central", "down");
423  if (isFastSim) {
424  // now we vary only the FastSim SF
425  baby.sys_fs_bctag()[0] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM,
426  "central", "central", "up", "central");
427  baby.sys_fs_bctag()[1] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM,
428  "central", "central", "down", "central");
429  baby.sys_fs_udsgtag()[0] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM,
430  "central", "central", "central", "up");
431  baby.sys_fs_udsgtag()[1] *= jetTool->jetBTagWeight(jet, jetp4, btag, BTagEntry::OP_MEDIUM,
432  "central", "central", "central", "down");
433  }
434  }
435  jetsys_p4 += jet.p4();
436  baby.njets()++;
437  baby.ht() += jetp4.pt();
438  if(csv > jetTool->CSVLoose) baby.nbl()++;
439  if(csv > jetTool->CSVMedium) baby.nbm()++;
440  else jetsys_nob_p4 += jet.p4();
441  if(csv > jetTool->CSVTight) baby.nbt()++;
442  }
443  }
444 
445  // HLT HT definition
446  //----------------------------
447  if(jetp4.pt() > jetTool->JetHLTPtCut && fabs(jet.eta()) <= jetTool->JetHLTEtaCut) baby.ht_hlt() += jetp4.pt();
448 
449  // RA2 Jet Variables
450  //----------------------------
451  bool isLep_ra2 = jetTool->jetMatched(jet, veto_leps); // Uses RA2/b's loose matching, dpt/pt < 100%, dR < 0.4
452  bool isPhoton = jetTool->jetMatched(jet, photons); // Uses RA2/b's loose matching, dpt/pt < 100%, dR < 0.4
453  bool isIsoTrack = jetTool->jetMatched(jet, tks); // Uses RA2/b's loose matching, dpt/pt < 100%, dR < 0.4
454  bool applyId_ra2 = !isLep_ra2 && !isPhoton && !isIsoTrack; // Only check ID if jet not matched
455  bool goodJet_ra2 = (looseID || !applyId_ra2);
456  bool tightJet_ra2 = (tightID || !applyId_ra2);
457 
458  if(jetp4.pt() > jetTool->JetPtCut) { // Check jet ID on 30 GeV jets
459  if(!goodJet_ra2) baby.pass_jets_ra2() = false;
460  if(!tightJet_ra2) baby.pass_jets_tight_ra2() = false;
461  }
462 
463  if(goodPtEta && goodJet_ra2) {
464  baby.njets_ra2()++;
465  baby.ht_ra2() += jetp4.pt();
466  jets_ra2.push_back(dynamic_cast<const reco::Candidate *>(&jet));
467  if(csv > jetTool->CSVMedium) baby.nbm_ra2()++;
468  if(!isLep_ra2 && !isPhoton) {
469  baby.njets_clean()++;
470  baby.ht_clean() += jetp4.pt();
471  }
472  }
473  if(goodJet_ra2 && jetp4.pt() > jetTool->JetPtCut && fabs(jet.eta()) <= jetTool->JetMHTEtaCut){
474  mht_px -= jet.px();
475  mht_py -= jet.py();
476  if(!isLep_ra2 && !isPhoton) {
477  mht_clean_px -= jet.px();
478  mht_clean_py -= jet.py();
479  }
480  }
481 
482  // Systematic variations
483  //----------------------------
484  if (doSystematics){
485  for (unsigned isys(0); isys<kSysLast; isys++){
486  jetp4 = jetTool->corrJet[ijet];
487  if (isys == kSysJER) jetp4 *= (1 + jetTool->jerUnc[ijet]);
488  else if (isys == kSysJECUp) jetp4 *= (1 + jetTool->jecUnc[ijet]);
489  else if (isys == kSysJECDn) jetp4 *= (1 - jetTool->jecUnc[ijet]);
490  //for now store pass_jets in the baby.sys_pass
491  //variable will be updated with rest of filters in writeFilters()
492  if(jetp4.pt() > jetTool->JetPtCut && !isLep && !looseID) baby.sys_pass()[isys] = false;
493 
494  if(looseID && jetp4.pt() > jetTool->JetPtCut && fabs(jet.eta()) <= jetTool->JetEtaCut) {
495  sys_jets[isys].push_back(jetp4);
496  if(!isLep){
497  baby.sys_njets()[isys]++;
498  baby.sys_ht()[isys] += jetp4.pt();
499  if(csv > jetTool->CSVMedium) baby.sys_nbm()[isys]++;
500  }
501  }
502  } // loop over systematics
503  } // do systematics
504  } // Loop over jets
505 
506  if(!isData) baby.ht_tru() = jetTool->trueHT(genjets);
507 
508  baby.mht() = hypot(mht_px, mht_py);
509  baby.mht_phi() = atan2(mht_py, mht_px);
510  baby.mht_clean() = hypot(mht_clean_px, mht_clean_py);
511  baby.mht_clean_phi() = atan2(mht_clean_py, mht_clean_px);
512  baby.low_dphi() = jetTool->isLowDphi(jets_ra2, baby.mht_phi(), baby.dphi1(), baby.dphi2(), baby.dphi3(), baby.dphi4());
513 
514  for (unsigned i(0); i<2; i++){
515  baby.sys_bctag()[i] /= baby.w_btag();
516  baby.sys_udsgtag()[i] /= baby.w_btag();
517  baby.sys_bctag_loose()[i] /= baby.w_btag_loose();
518  baby.sys_udsgtag_loose()[i] /= baby.w_btag_loose();
519  if (isFastSim) {
520  baby.sys_fs_bctag()[i] /= baby.w_btag();
521  baby.sys_fs_udsgtag()[i] /= baby.w_btag();
522  }
523  }
524  // ISR system for Z->ll and tt->llbb configurations
525  baby.jetsys_pt() = jetsys_p4.pt();
526  baby.jetsys_eta() = jetsys_p4.eta();
527  baby.jetsys_phi() = jetsys_p4.phi();
528  baby.jetsys_nob_pt() = jetsys_nob_p4.pt();
529  baby.jetsys_nob_eta() = jetsys_nob_p4.eta();
530  baby.jetsys_nob_phi() = jetsys_nob_p4.phi();
531 
532  // write deltaR between csvm jets
533  jetTool->getDeltaRbb(baby.dr_bb(), jets, baby.jets_csv(), baby.jets_islep());
534 
535 }
536 
537 void bmaker_basic::writeFatJets(vector<LVector> &jets){
538  jetTool->clusterFatJets(baby.nfjets(), baby.mj(),
539  baby.fjets_pt(), baby.fjets_eta(),
540  baby.fjets_phi(), baby.fjets_m(),
541  baby.fjets_nconst(),
542  baby.fjets_sumcsv(), baby.fjets_poscsv(),
543  baby.fjets_btags(), baby.jets_fjet_index(),
544  1.2, jets, baby.jets_csv());
545  jetTool->clusterFatJets(baby.nfjets08(), baby.mj08(),
546  baby.fjets08_pt(), baby.fjets08_eta(),
547  baby.fjets08_phi(), baby.fjets08_m(),
548  baby.fjets08_nconst(),
549  baby.fjets08_sumcsv(), baby.fjets08_poscsv(),
550  baby.fjets08_btags(), baby.jets_fjet08_index(),
551  0.8, jets, baby.jets_csv());
552 
553 }
554 
555 vCands bmaker_basic::writeMuons(edm::Handle<pat::MuonCollection> muons,
556  edm::Handle<pat::PackedCandidateCollection> pfcands,
557  edm::Handle<reco::VertexCollection> vtx,
558  vCands &veto_mus, vCands &all_mus, double rhoEventCentral){
559  vCands sig_mus;
560  veto_mus.clear(); all_mus.clear();
561  baby.nmus() = 0; baby.nvmus() = 0;
562  for (size_t ilep(0); ilep < muons->size(); ilep++) {
563  const pat::Muon &lep = (*muons)[ilep];
564  if(!lepTool->isVetoMuon(lep, vtx, -99.)) continue; // Storing leptons that pass all veto cuts except for iso
565 
566  double lep_iso(lepTool->getPFIsolation(pfcands, dynamic_cast<const reco::Candidate *>(&lep), 0.05, 0.2, 10., rhoEventCentral, false));
567  double lep_reliso(lepTool->getRelIsolation(lep, rhoEventCentral));
568  double dz(0.), d0(0.);
569  lepTool->vertexMuon(lep, vtx, dz, d0); // Calculating dz and d0
570 
571  baby.mus_pt().push_back(lep.pt());
572  baby.mus_eta().push_back(lep.eta());
573  baby.mus_phi().push_back(lep.phi());
574  baby.mus_dz().push_back(dz);
575  baby.mus_d0().push_back(d0);
576  baby.mus_charge().push_back(lep.charge());
577  baby.mus_sigid().push_back(lepTool->idMuon(lep, vtx, lepTool->kMedium));
578  baby.mus_tight().push_back(lepTool->idMuon(lep, vtx, lepTool->kTight));
579  baby.mus_miniso().push_back(lep_iso);
580  baby.mus_reliso().push_back(lep_reliso);
581  baby.mus_tm().push_back(false); // Filled in writeMC
582  baby.mus_inz().push_back(false); // Filled in writeDiLep
583  baby.mus_inzv().push_back(false); // Filled in writeDiLep
584  baby.mus_vvvl().push_back(false); // Filled in writeHLTObjects
585  baby.mus_isomu18().push_back(false); // Filled in writeHLTObjects
586  baby.mus_mu50().push_back(false); // Filled in writeHLTObjects
587  baby.mus_mu8().push_back(false); // Filled in writeHLTObjects
588  all_mus.push_back(dynamic_cast<const reco::Candidate *>(&lep)); // For truth-matching in writeMC
589 
590  if(lepTool->isVetoMuon(lep, vtx, lep_iso)) {
591  baby.nvmus()++;
592  veto_mus.push_back(dynamic_cast<const reco::Candidate *>(&lep));
593  }
594  if(lepTool->isSignalMuon(lep, vtx, lep_iso)) {
595  baby.nmus()++;
596  sig_mus.push_back(dynamic_cast<const reco::Candidate *>(&lep));
597  baby.mus_sig().push_back(true);
598  } else baby.mus_sig().push_back(false);
599  } // Loop over muons
600 
601  return sig_mus;
602 }
603 
604 
605 vCands bmaker_basic::writeElectrons(edm::Handle<pat::ElectronCollection> electrons,
606  edm::Handle<pat::PackedCandidateCollection> pfcands,
607  edm::Handle<reco::VertexCollection> vtx,
608  vCands &veto_els, vCands &all_els, double rhoEventCentral){
609  vCands sig_els;
610  veto_els.clear(); all_els.clear();
611  baby.nels() = 0; baby.nvels() = 0;
612  for (size_t ilep(0); ilep < electrons->size(); ilep++) {
613  const pat::Electron &lep = (*electrons)[ilep];
614  if(!lepTool->isVetoElectron(lep, vtx, -99.)) continue; // Storing leptons that pass all veto cuts except for iso
615 
616  double lep_iso(lepTool->getPFIsolation(pfcands, dynamic_cast<const reco::Candidate *>(&lep), 0.05, 0.2, 10., rhoEventCentral, false));
617  double lep_reliso(lepTool->getRelIsolation(lep, rhoEventCentral));
618  double dz(0.), d0(0.);
619  lepTool->vertexElectron(lep, vtx, dz, d0); // Calculating dz and d0
620 
621  baby.els_pt().push_back(lep.pt());
622  baby.els_sceta().push_back(lep.superCluster()->position().eta());
623  baby.els_eta().push_back(lep.eta());
624  baby.els_phi().push_back(lep.phi());
625  baby.els_dz().push_back(dz);
626  baby.els_d0().push_back(d0);
627  baby.els_charge().push_back(lep.charge());
628  baby.els_sigid().push_back(lepTool->idElectron(lep, vtx, lepTool->kMedium));
629  baby.els_ispf().push_back(lep.numberOfSourceCandidatePtrs()==2 && abs(lep.sourceCandidatePtr(1)->pdgId())==11);
630  baby.els_tight().push_back(lepTool->idElectron(lep, vtx, lepTool->kTight));
631  baby.els_miniso().push_back(lep_iso);
632  baby.els_reliso().push_back(lep_reliso);
633  baby.els_tm().push_back(false); // Filled in writeMC
634  baby.els_inz().push_back(false); // Filled in writeDiLep
635  baby.els_inzv().push_back(false); // Filled in writeDiLep
636  baby.els_vvvl().push_back(false); // Filled in writeHLTObjects
637  baby.els_ele23().push_back(false); // Filled in writeHLTObjects
638  baby.els_ele105().push_back(false); // Filled in writeHLTObjects
639  baby.els_ele8().push_back(false); // Filled in writeHLTObjects
640  all_els.push_back(dynamic_cast<const reco::Candidate *>(&lep)); // For truth-matching in writeMC
641 
642  if(lepTool->isVetoElectron(lep, vtx, lep_iso)){
643  baby.nvels()++;
644  veto_els.push_back(dynamic_cast<const reco::Candidate *>(&lep));
645  }
646  if(lepTool->isSignalElectron(lep, vtx, lep_iso)) {
647  baby.nels()++;
648  sig_els.push_back(dynamic_cast<const reco::Candidate *>(&lep));
649  baby.els_sig().push_back(true);
650  } else baby.els_sig().push_back(false);
651  } // Loop over electrons
652 
653  return sig_els;
654 }
655 
657  baby.nleps() = baby.nmus() + baby.nels();
658  baby.nvleps() = baby.nvmus() + baby.nvels();
659  sort(leptons.begin(), leptons.end(), greaterPt);
660  for(size_t ind(0); ind < leptons.size(); ind++) {
661  baby.leps_pt().push_back(leptons[ind]->pt());
662  baby.leps_eta().push_back(leptons[ind]->eta());
663  baby.leps_phi().push_back(leptons[ind]->phi());
664  baby.leps_id().push_back(leptons[ind]->pdgId());
665  } // Loop over leptons
666 }
667 
668 void bmaker_basic::writeDiLep(vCands &sig_mus, vCands &sig_els, vCands &veto_mus, vCands &veto_els){
684  // setElMuMass(veto_els, veto_mus, &baby_base::elmuv_m, &baby_base::elmuv_pt1, &baby_base::elmuv_pt2, &baby_base::elmuv_pt,
685  // &baby_base::elmuv_eta, &baby_base::elmuv_phi);
686 }
687 
689  baby_float ll_pt, baby_float ll_eta, baby_float ll_phi, baby_vfloat l_pt, baby_vbool l_inz,
690  baby_float ll_w){
691  for(size_t lep1(0); lep1 < leptons.size(); lep1++){
692  for(size_t lep2(lep1+1); lep2 < leptons.size(); lep2++){
693  if(leptons[lep1]->charge()*leptons[lep2]->charge()<0){
694  LVector z_p4(leptons[lep1]->p4());
695  z_p4 += leptons[lep2]->p4();
696  (baby.*ll_m)() = z_p4.mass();
697  (baby.*ll_pt)() = z_p4.pt();
698  (baby.*ll_eta)() = z_p4.eta();
699  (baby.*ll_phi)() = z_p4.phi();
700  float pt1(leptons[lep1]->pt()), pt2(leptons[lep2]->pt());
701  (baby.*ll_pt1)() = max(pt1, pt2);
702  (baby.*ll_pt2)() = min(pt1, pt2);
703  for(size_t ilep(0); ilep < (baby.*l_pt)().size(); ilep++){
704  if(fabs(pt1 - (baby.*l_pt)()[ilep]) < 1e-7) (baby.*l_inz)()[ilep] = true;
705  if(fabs(pt2 - (baby.*l_pt)()[ilep]) < 1e-7) (baby.*l_inz)()[ilep] = true;
706  }
707  (baby.*ll_w)() = lepton_tools::getScaleFactor({leptons[lep1], leptons[lep2]});
708  return; // We only set it with the first good ll combination
709  }
710  } // Loop over lep2
711  } // Loop over lep1
712 }
713 
714 void bmaker_basic::setElMuMass(vCands leptons1, vCands leptons2, baby_float ll_m, baby_float ll_pt1, baby_float ll_pt2,
715  baby_float ll_pt, baby_float ll_eta, baby_float ll_phi,
716  baby_float ll_w){
717  for(size_t lep1(0); lep1 < leptons1.size(); lep1++){
718  for(size_t lep2(0); lep2 < leptons2.size(); lep2++){
719  if(leptons1[lep1]->charge()*leptons2[lep2]->charge()<0){
720  LVector z_p4(leptons1[lep1]->p4());
721  z_p4 += leptons2[lep2]->p4();
722  (baby.*ll_m)() = z_p4.mass();
723  (baby.*ll_pt)() = z_p4.pt();
724  (baby.*ll_eta)() = z_p4.eta();
725  (baby.*ll_phi)() = z_p4.phi();
726  float pt1(leptons1[lep1]->pt()), pt2(leptons2[lep2]->pt());
727  (baby.*ll_pt1)() = pt1;
728  (baby.*ll_pt2)() = pt2;
729  (baby.*ll_w)() = lepton_tools::getScaleFactor({leptons1[lep1], leptons2[lep2]});
730  return; // We only set it with the first good ll combination
731  }
732  } // Loop over lep2
733  } // Loop over lep1
734 }
735 
736 
737 vCands bmaker_basic::writePhotons(edm::Handle<pat::PhotonCollection> allphotons,
738  edm::Handle<std::vector<pat::Electron> > &electrons,
739  edm::Handle<reco::ConversionCollection> &conversions,
740  edm::Handle<reco::BeamSpot> &beamspot, double rho){
741  vCands photons;
742  baby.nph() = 0;
743 
744  for (size_t ind(0); ind < allphotons->size(); ind++) {
745  const pat::Photon &photon = (*allphotons)[ind];
746 
747  if(photon.pt() < 50) continue;
748  if(!photonTool->idPhoton(photon, electrons, conversions, beamspot, rho)) continue;
749 
750  if(photon.pt() > photonTool->PhotonPtCut) baby.nph()++;
751  baby.ph_pt().push_back(photon.pt());
752  baby.ph_eta().push_back(photon.eta());
753  baby.ph_phi().push_back(photon.phi());
754  baby.ph_tm().push_back(false); // Filled in writeMC
755  baby.ph_ph90().push_back(false); // Filled in writeHLTObjects
756 
757  photons.push_back(dynamic_cast<const reco::Candidate *>(&photon));
758  } // Loop over allphotons
759 
760  return photons;
761 } // writePhotons
762 
763 bool bmaker_basic::writeTriggers(const edm::TriggerNames &names,
764  edm::Handle<edm::TriggerResults> triggerBits,
765  edm::Handle<pat::PackedTriggerPrescales> triggerPrescales){
766  bool keep(false);
767  baby.trig().resize(trig_name.size(), false);
768  baby.trig_prescale().resize(trig_name.size(), -1.);
769  for (size_t itrig(0); itrig < triggerBits->size(); itrig++) {
770  for(size_t itn(0); itn < trig_name.size(); itn++){
771  if(names.triggerName(itrig).find(trig_name[itn])!=string::npos){
772  baby.trig()[itn] = triggerBits->accept(itrig);
773  baby.trig_prescale()[itn] = triggerPrescales->getPrescaleForIndex(itrig);
774  if(baby.trig()[itn]) keep = true;
775  }
776  }
777  }
778 
779  return keep;
780 }
781 
782 void bmaker_basic::writeHLTObjects(const edm::TriggerNames &names,
783  edm::Handle<pat::TriggerObjectStandAloneCollection> triggerObjects,
784  vCands &all_mus, vCands &all_els, vCands &photons){
785  baby.nmus_vvvl() = 0; baby.nmus_isomu18() = 0;
786  baby.nels_vvvl() = 0; baby.nels_ele23() = 0;
787  const float relptThreshold(1), drThreshold(0.3);
788  for (pat::TriggerObjectStandAlone obj : *triggerObjects) {
789  obj.unpackPathNames(names);
790  TString name(obj.collection());
791  float objpt(obj.pt());
792  if(name=="hltPFMETProducer::HLT") baby.onmet() = objpt;
793  if(name=="hltPFHT::HLT") baby.onht() = objpt; // There's 2 of these, and we want the last one
794 
795  if(name=="hltL3MuonCandidates::HLT"){
796  bool vvvl(obj.hasFilterLabel("hltL3MuVVVLIsoFIlter"));
797  bool isomu18(obj.hasFilterLabel("hltL3crIsoL1sMu16L1f0L2f10QL3f18QL3trkIsoFiltered0p09") );
798  bool mu50(obj.hasFilterLabel("hltL3fL1sMu16orMu25L1f0L2f10QL3Filtered50Q"));
799  bool mu8(obj.hasFilterLabel("hltDoubleMu8Mass8L3Filtered"));
800  if(vvvl) {
801  baby.nmus_vvvl()++;
802  baby.mus_vvvl_pt().push_back(objpt);
803  baby.mus_vvvl_eta().push_back(obj.eta());
804  baby.mus_vvvl_phi().push_back(obj.phi());
805  }
806  if(isomu18) baby.nmus_isomu18()++;
807  if(vvvl && baby.onmu_vvvl()<objpt) baby.onmu_vvvl() = objpt;
808  if(isomu18 && baby.onmu_isomu18()<objpt) baby.onmu_isomu18() = objpt;
809  if(mu50 && baby.onmu_mu50()<objpt) baby.onmu_mu50() = objpt;
810  if(mu8 && baby.onmu_mu8()<objpt) baby.onmu_mu8() = objpt;
811  double mindr(999.);
812  int minind(-1);
813  if(vvvl || isomu18 || mu50 || mu8){
814  for(size_t ind(0); ind < all_mus.size(); ind++) {
815  double dr(deltaR(obj, *(all_mus[ind])));
816  //double drelpt(fabs((all_mus[ind]->pt() - objpt)/objpt));
817  //if(dr > drThreshold || drelpt > relptThreshold) continue;
818  if(dr > drThreshold) continue;
819  if(dr < mindr){
820  mindr = dr;
821  minind = ind;
822  }
823  } // Loop over reco muons
824  if(minind>=0){
825  baby.mus_vvvl()[minind] = vvvl;
826  baby.mus_isomu18()[minind] = isomu18;
827  baby.mus_mu50()[minind] = mu50;
828  baby.mus_mu8()[minind] = mu8;
829  }
830  } // At least one match
831  }
832  if(name=="hltEgammaCandidates::HLT" || name=="hltDoubleEle8HLTPixelMatchElectronProducer::HLT"){
833  bool vvvl(obj.hasFilterLabel("hltEle15VVVLGsfTrackIsoFilter"));
834  bool ele23(obj.hasFilterLabel("hltEle23WPLooseGsfTrackIsoFilter") );
835  bool ele105(obj.hasFilterLabel("hltEle105CaloIdVTGsfTrkIdTGsfDphiFilter"));
836  bool ele8(obj.hasFilterLabel("hltDoubleEle8Mass8Filter"));
837  if(vvvl) {
838  baby.nels_vvvl()++;
839  baby.els_vvvl_pt().push_back(objpt);
840  baby.els_vvvl_eta().push_back(obj.eta());
841  baby.els_vvvl_phi().push_back(obj.phi());
842  }
843  if(ele23) baby.nels_ele23()++;
844  if(vvvl && baby.onel_vvvl()<objpt) baby.onel_vvvl() = objpt;
845  if(ele23 && baby.onel_ele23()<objpt) baby.onel_ele23() = objpt;
846  if(ele105 && baby.onel_ele105()<objpt) baby.onel_ele105() = objpt;
847  if(ele8 && baby.onel_ele8()<objpt) baby.onel_ele8() = objpt;
848  if(vvvl || ele23 || ele105 || ele8){
849  double mindr(999.);
850  int minind(-1);
851  for(size_t ind(0); ind < all_els.size(); ind++) {
852  double dr(deltaR(obj, *(all_els[ind])));
853  double drelpt(fabs((all_els[ind]->pt() - objpt)/objpt));
854  if(dr > drThreshold || drelpt > relptThreshold) continue;
855  if(dr < mindr){
856  mindr = dr;
857  minind = ind;
858  }
859  } // Loop over reco elecrons
860  if(minind>=0){
861  baby.els_vvvl()[minind] = vvvl;
862  baby.els_ele23()[minind] = ele23;
863  baby.els_ele105()[minind] = ele105;
864  baby.els_ele8()[minind] = ele8;
865  }
866  } // At least one electron match
867  bool ph90(obj.hasFilterLabel("hltEG90L1SingleEG40HEFilter"));
868  if(ph90 && baby.onph_ph90()<objpt) baby.onph_ph90() = objpt;
869  if(ph90){
870  double mindr(999.);
871  int minind(-1);
872  for(size_t ind(0); ind < photons.size(); ind++) {
873  double dr(deltaR(obj, *(photons[ind])));
874  double drelpt(fabs((photons[ind]->pt() - objpt)/objpt));
875  if(dr > drThreshold || drelpt > relptThreshold) continue;
876  if(dr < mindr){
877  mindr = dr;
878  minind = ind;
879  }
880  } // Loop over reco photons
881  if(minind>=0){
882  baby.ph_ph90()[minind] = ph90;
883  }
884  } // At least one photon match
885  }
886  } // Loop over trigger objects
887 }
888 
889 // From https://twiki.cern.ch/twiki/bin/viewauth/CMS/MissingETOptionalFiltersRun2
890 void bmaker_basic::writeFilters(const edm::TriggerNames &fnames,
891  edm::Handle<edm::TriggerResults> filterBits,
892  edm::Handle<reco::VertexCollection> vtx){
893  baby.pass_goodv() = true; baby.pass_cschalo() = true; baby.pass_eebadsc() = true;
894  for (size_t i(0); i < filterBits->size(); ++i) {
895  string name = fnames.triggerName(i);
896  bool pass = static_cast<bool>(filterBits->accept(i));
897  if (name=="Flag_goodVertices") baby.pass_goodv() = pass;
898  //else if (name=="Flag_CSCTightHaloFilter") baby.pass_cschalo() = pass; // Requires reading it from txt file
899  else if (name=="Flag_eeBadScFilter") baby.pass_eebadsc() = pass;
900  //else if (name=="Flag_HBHENoiseFilter") baby.pass_hbhe() = pass; // Requires re-running in 2015
901  }
902 
903  //baby.pass_goodv() &= eventTool->hasGoodPV(vtx); // We needed to re-run it for Run2015B
904  baby.pass_cschalo() = eventTool->passBeamHalo(baby.run(), baby.event());
905 
906  baby.pass() = baby.pass_goodv() && baby.pass_eebadsc() && baby.pass_cschalo() && baby.pass_hbhe() && baby.pass_hbheiso()
907  && baby.pass_jets();
908  baby.pass_ra2() = baby.pass_goodv() && baby.pass_eebadsc() && baby.pass_cschalo() && baby.pass_hbhe() && baby.pass_hbheiso()
909  && baby.pass_jets_ra2();
910  baby.pass_nohf() = baby.pass_goodv() && baby.pass_eebadsc() && baby.pass_cschalo() && baby.pass_hbhe() && baby.pass_hbheiso()
911  && baby.pass_jets_nohf();
912 
913  if (doSystematics){
914  for (unsigned isys(0); isys<kSysLast; isys++){
915  // sys_pass_jets already stored in the value of this variable in the baby
916  baby.sys_pass()[isys] = baby.sys_pass()[isys] && baby.pass_goodv() && baby.pass_eebadsc() && baby.pass_cschalo() && baby.pass_hbhe() && baby.pass_hbheiso();
917  }
918  }
919 }
920 
921 void bmaker_basic::writeVertices(edm::Handle<reco::VertexCollection> vtx,
922  edm::Handle<std::vector< PileupSummaryInfo > > pu_info){
923  baby.npv() = vtx->size();
924  if(pu_info.isValid()){
925  for(size_t bc(0); bc<pu_info->size(); ++bc){
926  if(pu_info->at(bc).getBunchCrossing()==0){
927  baby.ntrupv() = pu_info->at(bc).getPU_NumInteractions();
928  baby.ntrupv_mean() = pu_info->at(bc).getTrueNumInteractions();
929  break;
930  }
931  } // Loop over true PVs
932  } // if pu_info is valid
933 }
934 
935 void bmaker_basic::writeGenInfo(edm::Handle<LHEEventProduct> lhe_info){
936  baby.nisr_me()=0; baby.ht_isr_me()=0.;
937  for ( unsigned int icount = 0 ; icount < (unsigned int)lhe_info->hepeup().NUP; icount++ ) {
938  unsigned int pdgid = abs(lhe_info->hepeup().IDUP[icount]);
939  int status = lhe_info->hepeup().ISTUP[icount];
940  int mom1id = abs(lhe_info->hepeup().IDUP[lhe_info->hepeup().MOTHUP[icount].first-1]);
941  int mom2id = abs(lhe_info->hepeup().IDUP[lhe_info->hepeup().MOTHUP[icount].second-1]);
942  float px = (lhe_info->hepeup().PUP[icount])[0];
943  float py = (lhe_info->hepeup().PUP[icount])[1];
944  float pt = sqrt(px*px+py*py);
945 
946  if(status==1 && (pdgid<6 || pdgid==21) && mom1id!=6 && mom2id!=6 && mom1id!=24 && mom2id!=24
947  && mom1id!=23 && mom2id!=23 && mom1id!=25 && mom2id!=25) {
948  baby.nisr_me()++;
949  baby.ht_isr_me() += pt;
950  }
951 
952  } // Loop over generator particles
953 
954  if(outname.Contains("SMS")){ //Get mgluino and mlsp
955 
956  typedef std::vector<std::string>::const_iterator comments_const_iterator;
957 
958  comments_const_iterator c_begin = lhe_info->comments_begin();
959  comments_const_iterator c_end = lhe_info->comments_end();
960 
961  TString model_params;
962  for(comments_const_iterator cit=c_begin; cit!=c_end; ++cit) {
963  size_t found = (*cit).find("model");
964  if(found != std::string::npos) {
965  // std::cout <<"BABYMAKER: "<< *cit <<"end"<< std::endl;
966  model_params = *cit;
967  }
968  }
969  mcTool->getMassPoints(model_params,baby.mgluino(),baby.mlsp());
970  }
971 } // writeGenInfo
972 
973 void bmaker_basic::writeMC(edm::Handle<reco::GenParticleCollection> genParticles,
974  vCands &all_mus, vCands &all_els, vCands &photons){
975  LVector isr_p4;
976  float metw_tru_x(0.), metw_tru_y(0.);
977  float lep_tru_pt(0.), lep_tru_phi(0.);
978  baby.ntruleps()=0; baby.ntrumus()=0; baby.ntruels()=0; baby.ntrutaush()=0; baby.ntrutausl()=0;
979  baby.nleps_tm()=0;
980  baby.fromGS()=false;
981  baby.m_tt()=0;
982  vector<float> top_pt;
983  int topIndex=-1;
984  int antitopIndex=-1;
985  const size_t bsmid(1000000);
986  for (size_t imc(0); imc < genParticles->size(); imc++) {
987  const reco::GenParticle &mc = (*genParticles)[imc];
988  size_t id = abs(mc.pdgId());
989  bool isLast = mcTool->isLast(mc, id);
990  // mcTool->printParticle(mc); // Prints various properties of the MC particle
991 
992  const reco::GenParticle *mom = nullptr;
993  size_t momid = abs(mcTool->mom(mc, mom));
994  bool isTop(id==6);
995  bool isNewPhysics(id>=bsmid);
996  bool isGluino(id==1000021);
997  bool isZ(id==23);
998  bool isW(id==24);
999  bool bTopOrBSM(id==5 && (momid==6 || momid>=bsmid));
1000  bool nuFromZ((id==12 || id==14 || id==16) && momid==23);
1001  bool eFromTopZ(id==11 && (momid==24 || momid==23));
1002  bool muFromTopZ(id==13 && (momid==24 || momid==23));
1003  bool tauFromTopZ(id==15 && (momid==24 || momid==23));
1004  bool fromWOrWTau(mcTool->fromWOrWTau(mc));
1005 
1006  if(isLast){
1007  if(isTop) mc.pdgId()>0 ? topIndex=imc : antitopIndex=imc;
1008 
1010  if((isTop && outname.Contains("TTJets"))
1011  || (isGluino && (outname.Contains("SMS") || outname.Contains("RPV")))
1012  || (isZ && outname.Contains("DY"))) isr_p4 -= mc.p4();
1013 
1015  if(isTop || isNewPhysics || isZ
1016  || isW || bTopOrBSM || eFromTopZ || muFromTopZ
1017  || tauFromTopZ || nuFromZ || fromWOrWTau){
1018  baby.mc_id().push_back(mc.pdgId());
1019  baby.mc_pt().push_back(mc.pt());
1020  baby.mc_eta().push_back(mc.eta());
1021  baby.mc_phi().push_back(mc.phi());
1022  baby.mc_mass().push_back(mc.mass());
1023  baby.mc_mom().push_back(mcTool->mom(mc,mom));
1024  }
1025  if(isTop && (outname.Contains("TTJets") || outname.Contains("TT_"))){
1026  top_pt.push_back(mc.pt());
1027  }
1028 
1030  if(muFromTopZ) baby.ntrumus()++;
1031  if(eFromTopZ) baby.ntruels()++;
1032  if(tauFromTopZ){
1033  const reco::GenParticle *tauDaughter(0);
1034  if(mcTool->decaysTo(mc, 11, tauDaughter) || mcTool->decaysTo(mc, 13, tauDaughter)){
1035  baby.mc_id().push_back(tauDaughter->pdgId());
1036  baby.mc_pt().push_back(tauDaughter->pt());
1037  baby.mc_eta().push_back(tauDaughter->eta());
1038  baby.mc_phi().push_back(tauDaughter->phi());
1039  baby.mc_mom().push_back(mcTool->mom(*tauDaughter,mom));
1040  baby.ntrutausl()++;
1041  } else baby.ntrutaush()++;
1042  }
1043  }
1044 
1046  const float relptThreshold(0.3), drThreshold(0.1);
1047  if(id==11 && fromWOrWTau){
1048  double mindr(999.);
1049  int minind(-1);
1050  for(size_t ind(0); ind < all_els.size(); ind++) {
1051  double dr(deltaR(mc, *(all_els[ind])));
1052  double drelpt(fabs((all_els[ind]->pt() - mc.pt())/mc.pt()));
1053  if(dr > drThreshold || drelpt > relptThreshold) continue;
1054  if(dr < mindr){
1055  mindr = dr;
1056  minind = ind;
1057  }
1058  } // Loop over all_els
1059  if(minind >= 0) {
1060  baby.els_tm()[minind] = true;
1061  if(baby.els_sig()[minind]) baby.nleps_tm()++;
1062  }
1063  if(lep_tru_pt < mc.pt()){
1064  lep_tru_pt = mc.pt();
1065  lep_tru_phi = mc.phi();
1066  } // Lepton pt to find mt_tru
1067  } // If it is an electron
1068  if(id==13 && fromWOrWTau){
1069  double mindr(999.);
1070  int minind(-1);
1071  for(size_t ind(0); ind < all_mus.size(); ind++) {
1072  double dr(deltaR(mc, *(all_mus[ind])));
1073  double drelpt(fabs((all_mus[ind]->pt() - mc.pt())/mc.pt()));
1074  if(dr > drThreshold || drelpt > relptThreshold) continue;
1075  if(dr < mindr){
1076  mindr = dr;
1077  minind = ind;
1078  }
1079  } // Loop over all_mus
1080  if(minind >= 0) {
1081  baby.mus_tm()[minind] = true;
1082  if(baby.mus_sig()[minind]) baby.nleps_tm()++;
1083  }
1084  if(lep_tru_pt < mc.pt()){
1085  lep_tru_pt = mc.pt();
1086  lep_tru_phi = mc.phi();
1087  } // Lepton pt to find mt_tru
1088  } // If it is a muon
1089  if(id==22){
1090  double mindr(999.);
1091  int minind(-1);
1092  for(size_t ind(0); ind < photons.size(); ind++) {
1093  double dr(deltaR(mc, *(photons[ind])));
1094  double drelpt(fabs((photons[ind]->pt() - mc.pt())/mc.pt()));
1095  if(dr > drThreshold || drelpt > relptThreshold) continue;
1096  if(dr < mindr){
1097  mindr = dr;
1098  minind = ind;
1099  }
1100  } // Loop over photons
1101  if(minind >= 0) baby.ph_tm()[minind] = true;
1102  } // If it is a photon
1103 
1105  if((id==12 || id==14 || id==16 || id==18 || id==1000012 || id==1000014 || id==1000016
1106  || id==1000022 || id==1000023 || id==1000025 || id==1000035 || id==1000039) &&
1107  id != momid){ // neutrinos decay to themselves
1108  if(fromWOrWTau) {
1109  metw_tru_x += mc.px();
1110  metw_tru_y += mc.py();
1111  }
1112  } // If undetected neutral particle
1113 
1114  // don't need to check for gluon splitting if flag is already set
1115  if(!baby.fromGS()) baby.fromGS()|=mcTool->isFromGSP(dynamic_cast<const reco::Candidate*>(&mc));
1116  } // Loop over genParticles
1117  // calculate invariant mass of ttbar pair
1118  if(topIndex>=0 && antitopIndex>=0) {
1119  reco::Candidate::LorentzVector topP4 = genParticles->at(topIndex).p4();
1120  reco::Candidate::LorentzVector antitopP4 = genParticles->at(antitopIndex).p4();
1121  reco::Candidate::LorentzVector ttbarP4 = topP4+antitopP4;
1122  baby.m_tt()=ttbarP4.mass();
1123  }
1124 
1125  baby.ntruleps() = baby.ntrumus()+baby.ntruels()+baby.ntrutaush()+baby.ntrutausl();
1126  baby.isr_tru_pt() = isr_p4.pt();
1127  baby.isr_tru_eta() = isr_p4.eta();
1128  baby.isr_tru_phi() = isr_p4.phi();
1129 
1130  vector<float> isr_sys;
1131  if(outname.Contains("SMS") || outname.Contains("RPV")){
1132  isr_sys.push_back(1. + weightTool->isrWeight(baby.isr_tru_pt()));
1133  isr_sys.push_back(1. - weightTool->isrWeight(baby.isr_tru_pt()));
1134  }
1135  else{ isr_sys.push_back(1.); isr_sys.push_back(1.);}
1136  baby.sys_isr()=isr_sys;
1137 
1138  if((outname.Contains("TTJets") || outname.Contains("TT_")) && top_pt.size() == 2) baby.w_toppt() = weightTool->topPtWeight(top_pt.at(0),top_pt.at(1));
1139  else baby.w_toppt() = 1.;
1140 
1141  baby.met_tru_nuw() = hypot(metw_tru_x, metw_tru_y);
1142  baby.met_tru_nuw_phi() = atan2(metw_tru_y, metw_tru_x);
1143 
1144  baby.mt_tru() = getMT(baby.met_tru(), baby.met_tru_phi(), lep_tru_pt, lep_tru_phi);
1145  baby.mt_tru_nuw() = getMT(baby.met_tru_nuw(), baby.met_tru_nuw_phi(), lep_tru_pt, lep_tru_phi);
1146 } // writeMC
1147 
1148 // Finds the jet that minimizes the MET when a variation is performed
1149 void bmaker_basic::rebalancedMET( double& minMET, double& minMETPhi)
1150 {
1151  for(unsigned int iJet=0; iJet<baby.jets_pt().size(); iJet++) {
1152  // calculate best rescaling factor for this jet
1153  double rescalingFactor=calculateRescalingFactor(iJet);
1154  double newMETPhi=0;
1155  double newMET=calculateRebalancedMET(iJet, rescalingFactor, newMETPhi);
1156  if(newMET<minMET) {
1157  minMET=newMET;
1158  minMETPhi=newMETPhi;
1159  }
1160  }
1161 }
1162 
1163 // calculate a rebalancing of the jet momentum that minimizes MET
1164 double bmaker_basic::calculateRescalingFactor(unsigned int jetIdx)
1165 {
1166 
1167  // don't allow jet pt to be scaled by more than this factor
1168  const double scaleCutoff=1;
1169 
1170  TVector3 jet, metVector;
1171  jet.SetPtEtaPhi(baby.jets_pt().at(jetIdx), baby.jets_eta().at(jetIdx), baby.jets_phi().at(jetIdx));
1172  metVector.SetPtEtaPhi(baby.met(), 0, baby.met_phi());
1173 
1174  double denominator = -jet.Px()*jet.Px()-jet.Py()*jet.Py();
1175  double numerator = jet.Px()*metVector.Px()+jet.Py()*metVector.Py();
1176 
1177  double rescalingFactor=1e6;
1178  if(denominator!=0) rescalingFactor = numerator/denominator;
1179  if(fabs(rescalingFactor)>scaleCutoff) rescalingFactor=scaleCutoff*rescalingFactor/fabs(rescalingFactor);
1180  // the resolution tail is on the _low_ side, not the high side
1181  // so we always need to subtract pT
1182  if(rescalingFactor>0) rescalingFactor=0;
1183 
1184  return rescalingFactor;
1185 }
1186 
1187 double bmaker_basic::calculateRebalancedMET(unsigned int jetIdx, double mu, double& METPhi)
1188 {
1189  TVector3 jet, metVector;
1190  jet.SetPtEtaPhi(baby.jets_pt().at(jetIdx), baby.jets_eta().at(jetIdx), baby.jets_phi().at(jetIdx));
1191  metVector.SetPtEtaPhi(baby.met(), 0, baby.met_phi());
1192 
1193  double sumPx = metVector.Px()+mu*jet.Px();
1194  double sumPy = metVector.Py()+mu*jet.Py();
1195 
1196  METPhi=atan(sumPy/sumPx);
1197 
1198  return sqrt(sumPx*sumPx+sumPy*sumPy);
1199 }
1200 
1201 void bmaker_basic::writeWeights(const vCands &sig_leps, edm::Handle<GenEventInfoProduct> &gen_event_info,
1202  edm::Handle<LHEEventProduct> &lhe_info){
1203  if (debug) cout<<"INFO: Filling weights..."<<endl;
1204 
1205  // Initializing weights
1206  if(isData) {
1207  baby.eff_trig() = baby.w_btag() = baby.w_btag_loose() = baby.w_pu() = baby.w_pu_rpv() = baby.w_lep() = baby.w_fs_lep() = baby.w_toppt() = 1.;
1208  baby.eff_jetid() = baby.w_lumi() = baby.weight() = baby.weight_rpv() = 1.;
1209  return;
1210  }
1211 
1212  // Luminosity weight
1213  const float luminosity = 1000., fneg(xsec::fractionNegWeights(outname));
1214  baby.w_lumi() = xsec*luminosity / (static_cast<double>(nevents_sample)*(1-2*fneg));
1215  if (gen_event_info->weight() < 0) baby.w_lumi() *= -1.;
1216 
1217  // Pile-up weight
1218  baby.w_pu() = weightTool->pileupWeight(baby.ntrupv_mean());
1219  baby.w_pu_rpv() = weightTool->pileupWeightRPV(baby.ntrupv_mean(), 0);
1220  baby.sys_pu_rpv().resize(2, 1.);
1221  baby.sys_pu_rpv()[0] = weightTool->pileupWeightRPV(baby.ntrupv_mean(), 1)/baby.w_pu_rpv();
1222  baby.sys_pu_rpv()[1] = weightTool->pileupWeightRPV(baby.ntrupv_mean(), -1)/baby.w_pu_rpv();
1223 
1224  // Lepton SFs
1225  double sf = lepTool->getScaleFactor(sig_leps);
1226  double unc = lepTool->getScaleFactorUncertainty(sig_leps)/sf;
1227  baby.w_lep() = sf;
1228  baby.sys_lep().resize(2, 1.);
1229  baby.sys_lep().at(0) = 1.+unc;
1230  baby.sys_lep().at(1) = 1.-unc;
1231 
1232  // Lepton SFs in FastSim
1233  baby.sys_fs_lep().resize(2, 1.);
1234  if(isFastSim){
1235  double sf_fs = lepTool->getScaleFactorFs(sig_leps, baby.npv());
1236  double unc_fs = lepTool->getScaleFactorUncertaintyFs(sig_leps, baby.npv())/sf_fs;
1237  baby.w_fs_lep() = sf_fs;
1238  baby.sys_fs_lep()[0] = 1.+unc_fs;
1239  baby.sys_fs_lep()[1] = 1.-unc_fs;
1240  } else baby.w_fs_lep() = 1.;
1241 
1242  // VVVL trigger efficiency
1243  baby.eff_trig() = weightTool->triggerEfficiency(baby.nmus(), baby.nels(), baby.sys_trig());
1244 
1245  // In FastSim the JetID is broken, so we just apply 0.99 +- 0.01
1246  if(isFastSim) baby.eff_jetid() = 0.99;
1247  else baby.eff_jetid() = 1.;
1249  // w_btag calculated in writeJets
1250  // w_toppt and sys_isr calculated in writeMC
1251  baby.weight() = baby.w_lumi() * baby.w_lep() * baby.w_fs_lep() * baby.w_toppt() * baby.w_btag()
1252  * baby.eff_trig() * baby.eff_jetid();
1253  baby.weight_rpv() = baby.w_lumi() * baby.w_lep() * baby.w_fs_lep() * baby.w_toppt() * baby.w_btag()
1254  * baby.w_pu_rpv() * baby.eff_jetid();
1255 
1257  weightTool->getTheoryWeights(lhe_info);
1258  // Renormalization and Factorization scales
1259  baby.sys_mur().push_back(weightTool->theoryWeight(weight_tools::muRup));
1260  baby.sys_mur().push_back(weightTool->theoryWeight(weight_tools::muRdown));
1261  baby.sys_muf().push_back(weightTool->theoryWeight(weight_tools::muFup));
1262  baby.sys_muf().push_back(weightTool->theoryWeight(weight_tools::muFdown));
1263  baby.sys_murf().push_back(weightTool->theoryWeight(weight_tools::muRup_muFup));
1264  baby.sys_murf().push_back(weightTool->theoryWeight(weight_tools::muRdown_muFdown));
1265  // PDF variations
1266  weightTool->getPDFWeights(baby.sys_pdf(), baby.w_pdf());
1267 
1268 }
1269 
1270 /*
1271  _____ _ _
1272 / __ \ | | | |
1273 | / \/ ___ _ __ ___| |_ _ __ _ _ ___| |_ ___ _ __ ___
1274 | | / _ \| '_ \/ __| __| '__| | | |/ __| __/ _ \| '__/ __|
1275 | \__/\ (_) | | | \__ \ |_| | | |_| | (__| || (_) | | \__ \
1276  \____/\___/|_| |_|___/\__|_| \__,_|\___|\__\___/|_| |___/
1277 */
1278 
1279 //Constructor (this line searchable)
1280 bmaker_basic::bmaker_basic(const edm::ParameterSet& iConfig):
1281  outname(TString(iConfig.getParameter<string>("outputFile"))),
1282  inputfiles(iConfig.getParameter<vector<string> >("inputFiles")),
1283  jsonfile(iConfig.getParameter<string>("json")),
1284  condor_subtime(iConfig.getParameter<string>("condor_subtime")),
1285  jec_label(iConfig.getParameter<string>("jec")),
1286  met_label(iConfig.getParameter<edm::InputTag>("met")),
1287  met_nohf_label(iConfig.getParameter<edm::InputTag>("met_nohf")),
1288  jets_label(iConfig.getParameter<edm::InputTag>("jets")),
1289  nevents_sample(iConfig.getParameter<unsigned int>("nEventsSample")),
1290  nevents(0),
1291  doMetRebalancing(iConfig.getParameter<bool>("doMetRebalancing")),
1292  addBTagWeights(iConfig.getParameter<bool>("addBTagWeights")),
1293  isFastSim(iConfig.getParameter<bool>("isFastSim")),
1294  doSystematics(iConfig.getParameter<bool>("doSystematics")),
1295  debug(iConfig.getParameter<bool>("debugMode")),
1296 
1297  // Initialize tokens
1298  tok_trigResults_hlt_(consumes<edm::TriggerResults>(edm::InputTag("TriggerResults","","HLT"))),
1299  tok_patTrig_(consumes<pat::PackedTriggerPrescales>(edm::InputTag("patTrigger"))),
1300  tok_primVertex_(consumes<reco::VertexCollection>(edm::InputTag("offlineSlimmedPrimaryVertices"))),
1301  tok_addPileup_(consumes<std::vector< PileupSummaryInfo > >(edm::InputTag("addPileupInfo"))),
1302  tok_slimAddPileup_(consumes<std::vector< PileupSummaryInfo > >(edm::InputTag("slimmedAddPileupInfo"))),
1303  tok_packPFCands_(consumes<pat::PackedCandidateCollection>(edm::InputTag("packedPFCandidates"))),
1304  tok_rhoFastJet_centralNeutral_(consumes<double>(edm::InputTag("fixedGridRhoFastjetCentralNeutral"))),
1305  tok_muons_(consumes<pat::MuonCollection>(edm::InputTag("slimmedMuons"))),
1306  tok_electrons_(consumes<pat::ElectronCollection>(edm::InputTag("slimmedElectrons"))),
1307  tok_rhoFastJet_all_(consumes<double>(edm::InputTag("fixedGridRhoFastjetAll"))),
1308  tok_offBeamSpot_(consumes<reco::BeamSpot>(edm::InputTag("offlineBeamSpot"))),
1309  tok_photons_(consumes<pat::PhotonCollection>(edm::InputTag("slimmedPhotons"))),
1310  tok_reducedEgamma_conver_(consumes<vector<reco::Conversion> >(edm::InputTag("reducedEgamma","reducedConversions"))),
1311  tok_jets_(consumes<pat::JetCollection>(jets_label)),
1312  tok_genJets_(consumes<edm::View<reco::GenJet> >(edm::InputTag("slimmedGenJets"))),
1313  tok_met_(consumes<pat::METCollection>(met_label)),
1314  tok_met_noHF_(consumes<pat::METCollection>(met_nohf_label)),
1315  tok_HBHENoiseFilter_(consumes<bool>(edm::InputTag("HBHENoiseFilterResultProducer","HBHENoiseFilterResult"))),
1316  tok_HBHEIsoNoiseFilter_(consumes<bool>(edm::InputTag("HBHENoiseFilterResultProducer","HBHEIsoNoiseFilterResult"))),
1317  tok_trigResults_reco_(consumes<edm::TriggerResults>(edm::InputTag("TriggerResults","","RECO"))),
1318  tok_trigResults_pat_(consumes<edm::TriggerResults>(edm::InputTag("TriggerResults","","PAT"))),
1319  tok_selectedPatTrig_(consumes<pat::TriggerObjectStandAloneCollection>(edm::InputTag("selectedPatTrigger"))),
1320  tok_pruneGenPart_(consumes<reco::GenParticleCollection>(edm::InputTag("prunedGenParticles"))),
1321  tok_extLHEProducer_(consumes<LHEEventProduct>(edm::InputTag("externalLHEProducer"))),
1322  tok_source_(consumes<LHEEventProduct>(edm::InputTag("source"))),
1323  tok_generator_(consumes<GenEventInfoProduct>(edm::InputTag("generator")))
1324 {
1325  time(&startTime);
1326 
1327 
1328  lepTool = new lepton_tools();
1330  photonTool = new photon_tools();
1331  mcTool = new mc_tools();
1332  weightTool = new weight_tools();
1333  eventTool = new event_tools(outname);
1334 
1335 
1336  outfile = new TFile(outname, "recreate");
1337  outfile->cd();
1338  baby.tree_.SetDirectory(outfile);
1339 
1341  // if(xsec<=0) {
1342  // cout<<"BABYMAKER: Cross section not found, aborting"<<endl<<endl;
1343  // exit(1);
1344  // }
1345 
1346  trig_name = vector<TString>();
1347  if(outname.Contains("Run201")){
1348  trig_name.push_back("HLT_PFHT350_PFMET100_"); // 0
1349  trig_name.push_back("HLT_Mu15_IsoVVVL_PFHT350_PFMET50_v"); // 1
1350  trig_name.push_back("HLT_Mu15_IsoVVVL_PFHT600_v"); // 2
1351  trig_name.push_back("HLT_Mu15_IsoVVVL_BTagCSV0p72_PFHT400_v"); // 3
1352  trig_name.push_back("HLT_Mu15_IsoVVVL_PFHT350_v"); // 4
1353  trig_name.push_back("HLT_Ele15_IsoVVVL_PFHT350_PFMET50_v"); // 5
1354  trig_name.push_back("HLT_Ele15_IsoVVVL_PFHT600_v"); // 6
1355  trig_name.push_back("HLT_Ele15_IsoVVVL_BTagCSV0p72_PFHT400_v"); // 7
1356  trig_name.push_back("HLT_Ele15_IsoVVVL_PFHT350_v"); // 8
1357  trig_name.push_back("HLT_DoubleMu8_Mass8_PFHT300_v"); // 9
1358  trig_name.push_back("HLT_DoubleEle8_CaloIdM_TrackIdM_Mass8_PFHT300_v"); // 10
1359  trig_name.push_back("HLT_PFHT475_v"); // 11
1360  trig_name.push_back("HLT_PFHT800_v"); // 12
1361  trig_name.push_back("HLT_PFMET120_JetIdCleaned_Mu5_v"); // 13
1362  trig_name.push_back("HLT_PFMET170_JetIdCleaned_v"); // 14
1363  trig_name.push_back("HLT_DoubleIsoMu17_eta2p1_v"); // 15
1364  trig_name.push_back("HLT_Mu17_TrkIsoVVL_Mu8_TrkIsoVVL_DZ_v"); // 16
1365  trig_name.push_back("HLT_IsoMu20_v"); // 17
1366  trig_name.push_back("HLT_IsoMu18_v"); // 18
1367  trig_name.push_back("HLT_IsoMu24_eta2p1_v"); // 19
1368  trig_name.push_back("HLT_IsoMu27_v"); // 20
1369  trig_name.push_back("HLT_Mu50_v"); // 21
1370  trig_name.push_back("HLT_Ele27_eta2p1_WPLoose_Gsf_v"); // 22
1371  trig_name.push_back("HLT_Ele23_WPLoose_Gsf_v"); // 23
1372  trig_name.push_back("HLT_Ele105_CaloIdVT_GsfTrkIdT_v"); // 24
1373  trig_name.push_back("HLT_DoubleEle33_CaloIdL_GsfTrkIdVL_v"); // 25
1374  trig_name.push_back("HLT_DoubleEle24_22_eta2p1_WPLoose_Gsf_v"); // 26
1375  trig_name.push_back("HLT_Photon90_CaloIdL_PFHT500_v"); // 27
1376  trig_name.push_back("HLT_PFMETNoMu90_JetIdCleaned_PFMHTNoMu90_IDTight_v"); // 28
1377  } else {
1378  trig_name.push_back("HLT_PFHT350_PFMET120_NoiseCleaned_v"); // 0
1379  trig_name.push_back("HLT_Mu15_IsoVVVL_PFHT400_PFMET70_v"); // 1
1380  trig_name.push_back("HLT_Mu15_IsoVVVL_PFHT600_v"); // 2
1381  trig_name.push_back("HLT_Mu15_IsoVVVL_BTagCSV07_PFHT400_v"); // 3
1382  trig_name.push_back("HLT_Mu15_PFHT300_v"); // 4
1383  trig_name.push_back("HLT_Ele15_IsoVVVL_PFHT400_PFMET70_v"); // 5
1384  trig_name.push_back("HLT_Ele15_IsoVVVL_PFHT600_v"); // 6
1385  trig_name.push_back("HLT_Ele15_IsoVVVL_BTagtop8CSV07_PFHT400_v"); // 7
1386  trig_name.push_back("HLT_Ele15_PFHT300_v"); // 8
1387  trig_name.push_back("HLT_DoubleMu8_Mass8_PFHT300_v"); // 9
1388  trig_name.push_back("HLT_DoubleEle8_CaloIdM_TrackIdM_Mass8_PFHT300_v"); // 10
1389  trig_name.push_back("HLT_PFHT350_v"); // 11
1390  trig_name.push_back("HLT_PFHT900_v"); // 12
1391  trig_name.push_back("HLT_PFMET120_NoiseCleaned_Mu5_v"); // 13
1392  trig_name.push_back("HLT_PFMET170_NoiseCleaned_v"); // 14
1393  trig_name.push_back("HLT_DoubleIsoMu17_eta2p1_v"); // 15
1394  trig_name.push_back("HLT_Mu17_TrkIsoVVL_Mu8_TrkIsoVVL_DZ_v"); // 16
1395  trig_name.push_back("HLT_IsoMu20_v"); // 17
1396  trig_name.push_back("HLT_IsoMu17_eta2p1_v"); // 18
1397  trig_name.push_back("HLT_IsoMu24_eta2p1_v"); // 19
1398  trig_name.push_back("HLT_IsoMu27_v"); // 20
1399  trig_name.push_back("HLT_Mu50_v"); // 21
1400  trig_name.push_back("HLT_Ele27_eta2p1_WP75_Gsf_v"); // 22
1401  trig_name.push_back("HLT_Ele22_eta2p1_WP75_Gsf_v"); // 23
1402  trig_name.push_back("HLT_Ele105_CaloIdVT_GsfTrkIdT_v"); // 24
1403  trig_name.push_back("HLT_DoubleEle33_CaloIdL_GsfTrkIdVL_v"); // 25
1404  trig_name.push_back("HLT_DoubleEle24_22_eta2p1_WP75_Gsf_v"); // 26
1405  trig_name.push_back("HLT_Photon90_CaloIdL_PFHT500_v"); // 27
1406  trig_name.push_back("HLT_PFMETNoMu90_JetIdCleaned_PFMHTNoMu90_IDTight_v"); // 28
1407  }
1408 
1409 }
1410 
1411 
1413  outfile->cd();
1414  baby.tree_.SetDirectory(outfile);
1415  baby.Write();
1416 
1417  string commit_s = execute("git rev-parse HEAD");
1418  while(!commit_s.empty() && commit_s.at(commit_s.length()-1) == '\n') commit_s.erase(commit_s.length()-1);
1419  TString commit = commit_s;
1420  TString type = baby.Type();
1421  TString root_version = gROOT->GetVersion();
1422  TString root_tutorial_dir = gROOT->GetTutorialsDir();
1423  TString user(getenv("ORIGIN_USER"));
1424  if (user=="") user = getenv("USER");
1425  TString cmssw(getenv("CMSSW_BASE"));
1426  time_t curTime;
1427  time(&curTime);
1428  char time_c[100];
1429  struct tm * timeinfo = localtime(&curTime);
1430  strftime(time_c,100,"%Y-%m-%d %H:%M:%S",timeinfo);
1431  TString date(time_c);
1432  int seconds(floor(difftime(curTime,startTime)+0.5));
1433 
1434  vector<TString> sys_names;
1435  sys_names.resize(kSysLast,"");
1436  sys_names[kSysJER] = "jer";
1437  sys_names[kSysJECUp] = "jec_up";
1438  sys_names[kSysJECDn] = "jec_dn";
1439 
1440  TTree treeglobal("treeglobal", "treeglobal");
1441  treeglobal.Branch("nev_sample", &nevents_sample);
1442  treeglobal.Branch("nev_file", &nevents);
1443  treeglobal.Branch("runtime_seconds", &seconds);
1444  treeglobal.Branch("git_commit", &commit);
1445  // treeglobal.Branch("model", &model);
1446  treeglobal.Branch("baby_type", &type);
1447  treeglobal.Branch("root_version", &root_version);
1448  treeglobal.Branch("root_tutorial_dir", &root_tutorial_dir);
1449  treeglobal.Branch("trig_names", &trig_name);
1450  treeglobal.Branch("sys_names", &sys_names);
1451  treeglobal.Branch("xsec", &xsec);
1452  treeglobal.Branch("user", &user);
1453  treeglobal.Branch("cmssw", &cmssw);
1454  treeglobal.Branch("jec", &jec_label);
1455  treeglobal.Branch("json", &jsonfile);
1456  treeglobal.Branch("date", &date);
1457  treeglobal.Branch("inputfiles", &inputfiles);
1458  treeglobal.Branch("condor_subtime", &condor_subtime);
1459  treeglobal.Fill();
1460  treeglobal.SetDirectory(outfile);
1461  treeglobal.Write();
1462 
1463  outfile->Close();
1464 
1465  int minutes((seconds/60)%60), hours(seconds/3600);
1466  TString runtime("");
1467  if(hours<10) runtime += "0";
1468  runtime += hours; runtime += ":";
1469  if(minutes<10) runtime += "0";
1470  runtime += minutes; runtime += ":";
1471  if((seconds%60)<10) runtime += "0";
1472  runtime += seconds%60;
1473  float hertz(nevents); hertz /= seconds;
1474  cout<<endl<<"BABYMAKER: Written "<<nevents<<" events in "<<outname<<". It took "<<seconds<<" seconds to run ("<<runtime<<"), "
1475  <<roundNumber(hertz,1)<<" Hz, "<<roundNumber(1000,2,hertz)<<" ms per event"<<endl<<endl;
1476  cout<<"BABYMAKER: *********** List of input files ***********"<<endl;
1477  for(size_t ifile(0); ifile < inputfiles.size(); ifile++)
1478  cout<<"BABYMAKER: "<<inputfiles[ifile].c_str()<<endl;
1479  cout<<endl;
1480 
1481  delete outfile;
1482 
1483  delete lepTool;
1484  delete photonTool;
1485  delete jetTool;
1486  delete mcTool;
1487  delete weightTool;
1488 }
1489 
1490 void bmaker_basic::reportTime(const edm::Event& iEvent){
1491  // Time reporting
1492  if(nevents==1) {
1493  time_t curTime;
1494  time(&curTime);
1495  cout<<endl<<"BABYMAKER: Took "<<roundNumber(difftime(curTime,startTime),1)<<" seconds for set up and run first event"
1496  <<endl<<endl;
1497  time(&startTime);
1498  }
1499  if(debug || (nevents<100&&nevents%10==0) || (nevents<1000&&nevents%100==0)
1500  || (nevents<10000&&nevents%1000==0) || nevents%10000==0) {
1501  time_t curTime;
1502  time(&curTime);
1503  float seconds(difftime(curTime,startTime));
1504  cout<<"BABYMAKER: Run "<<iEvent.id().run()<<", Event "<< setw(8)<<iEvent.id().event()
1505  <<", LumiSection "<< setw(5)<< iEvent.luminosityBlock()
1506  <<". Ran "<<setw(7)<<nevents<<" events in "<<setw(7)<<seconds<<" seconds -> "
1507  <<setw(5)<<roundNumber(nevents-1,1,seconds)<<" Hz, "
1508  <<setw(5)<<roundNumber(seconds*1000,2,nevents-1)<<" ms per event"<<endl;
1509  }
1510 }
1511 
1512 // ------------ method called once each job just before starting event loop ------------
1514 }
1515 
1516 // ------------ method called once each job just after ending the event loop ------------
1518 }
1519 
1520 // ------------ method called when starting to processes a run ------------
1521 /*
1522 void
1523 bmaker_basic::beginRun(edm::Run const&, edm::EventSetup const&)
1524 {
1525 }
1526 */
1527 
1528 // ------------ method called when ending the processing of a run ------------
1529 /*
1530 void
1531 bmaker_basic::endRun(edm::Run const&, edm::EventSetup const&)
1532 {
1533 }
1534 */
1535 
1536 // ------------ method called when starting to processes a luminosity block ------------
1537 /*
1538 void
1539 bmaker_basic::beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
1540 {
1541 }
1542 */
1543 
1544 // ------------ method called when ending the processing of a luminosity block ------------
1545 /*
1546 void
1547 bmaker_basic::endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
1548 {
1549 }
1550 */
1551 
1552 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
1553 void
1554 bmaker_basic::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
1555  //The following says we do not know what parameters are allowed so do no validation
1556  // Please change this to state exactly what you do use, even if it is no parameters
1557  edm::ParameterSetDescription desc;
1558  desc.setUnknown();
1559  descriptions.addDefault(desc);
1560 }
1561 
1562 //define this as a plug-in
virtual void analyze(const edm::Event &, const edm::EventSetup &) override
Definition: bmaker_basic.cc:35
void writeFilters(const edm::TriggerNames &fnames, edm::Handle< edm::TriggerResults > filterBits, edm::Handle< reco::VertexCollection > vtx)
float const & elel_pt2() const
Definition: baby_base.cc:3084
float fractionNegWeights(const TString &file)
float const & mumuv_pt1() const
Definition: baby_base.cc:3832
TTree tree_
Definition: baby_base.hh:573
TString condor_subtime
float const & mumu_pt1() const
Definition: baby_base.cc:3755
DEFINE_FWK_MODULE(bmaker_basic)
float const & elmu_w() const
Definition: baby_base.cc:3249
double calculateRescalingFactor(unsigned int jetIdx)
std::vector< float > const & mus_pt() const
Definition: baby_base.cc:5207
float const & elelv_w() const
Definition: baby_base.cc:3172
float const & mumuv_m() const
Definition: baby_base.cc:3799
float const & elel_phi() const
Definition: baby_base.cc:3051
std::vector< bool > const & mus_inz() const
Definition: baby_base.cc:4591
TString jec_label
vCands writeElectrons(edm::Handle< pat::ElectronCollection > electrons, edm::Handle< pat::PackedCandidateCollection > pfcands, edm::Handle< reco::VertexCollection > vtx, vCands &veto_els, vCands &all_els, double rhoEventCentral)
void writeGenInfo(edm::Handle< LHEEventProduct > lhe_info)
std::vector< bool > const & els_inz() const
Definition: baby_base.cc:4492
float crossSection(const TString &file)
void Write()
Definition: baby_base.cc:2442
std::vector< float > &(baby_base::* baby_vfloat)()
Definition: bmaker_basic.hh:49
float const & elmu_pt2() const
Definition: baby_base.cc:3238
vCands writePhotons(edm::Handle< pat::PhotonCollection > allphotons, edm::Handle< std::vector< pat::Electron > > &electrons, edm::Handle< reco::ConversionCollection > &conversions, edm::Handle< reco::BeamSpot > &beamspot, double rho)
float const & elel_m() const
Definition: baby_base.cc:3040
void writeLeptons(vCands &leptons)
float const & elelv_pt() const
Definition: baby_base.cc:3139
float const & mumu_eta() const
Definition: baby_base.cc:3711
void setDiLepMass(vCands leptons, baby_float ll_m, baby_float ll_pt1, baby_float ll_pt2, baby_float ll_pt, baby_float ll_eta, baby_float ll_phi, baby_vfloat l_pt, baby_vbool l_inz, baby_float ll_w)
void writeHLTObjects(const edm::TriggerNames &names, edm::Handle< pat::TriggerObjectStandAloneCollection > triggerObjects, vCands &all_mus, vCands &all_els, vCands &photons)
void setElMuMass(vCands leptons1, vCands leptons2, baby_float ll_m, baby_float ll_pt1, baby_float ll_pt2, baby_float ll_pt, baby_float ll_eta, baby_float ll_phi, baby_float ll_w)
std::vector< const reco::Candidate * > vCands
Definition: utilities.hh:14
void writeMET(edm::Handle< pat::METCollection > mets, edm::Handle< pat::METCollection > mets_nohf)
STL namespace.
list reco
Definition: get_flist.py:50
float const & elelv_pt2() const
Definition: baby_base.cc:3161
std::vector< bool > const & mus_inzv() const
Definition: baby_base.cc:4602
float const & mumuv_w() const
Definition: baby_base.cc:3854
void writeVertices(edm::Handle< reco::VertexCollection > vtx, edm::Handle< std::vector< PileupSummaryInfo > > pu_info)
float const & mumuv_pt() const
Definition: baby_base.cc:3821
mc_tools * mcTool
Definition: bmaker_basic.hh:68
float const & elmu_m() const
Definition: baby_base.cc:3194
void reportTime(const edm::Event &iEvent)
baby_basic baby
Definition: bmaker_basic.hh:59
float const & mumuv_phi() const
Definition: baby_base.cc:3810
std::vector< bool > &(baby_base::* baby_vbool)()
Definition: bmaker_basic.hh:50
void writeDiLep(vCands &sig_mus, vCands &sig_els, vCands &veto_mus, vCands &veto_els)
float getMT(float pt1, float phi1, float pt2, float phi2)
Definition: utilities.cc:37
event_tools * eventTool
Definition: bmaker_basic.hh:67
float const & elelv_pt1() const
Definition: baby_base.cc:3150
bmaker_basic(const edm::ParameterSet &)
float const & mumu_m() const
Definition: baby_base.cc:3722
float const & elmu_pt1() const
Definition: baby_base.cc:3227
jet_met_tools * jetTool
Definition: bmaker_basic.hh:65
float const & elelv_m() const
Definition: baby_base.cc:3117
weight_tools * weightTool
Definition: bmaker_basic.hh:69
std::vector< TString > trig_name
unsigned int nevents
float const & mumu_phi() const
Definition: baby_base.cc:3733
void rebalancedMET(double &MET, double &METPhi)
float const & elel_pt() const
Definition: baby_base.cc:3062
void writeMC(edm::Handle< reco::GenParticleCollection > genParticles, vCands &all_mus, vCands &all_els, vCands &photons)
bool greaterPt(const reco::Candidate *a, const reco::Candidate *b)
Definition: utilities.cc:29
string cmssw
Definition: sub_cond.py:236
void writeWeights(const vCands &sig_leps, edm::Handle< GenEventInfoProduct > &gen_event_info, edm::Handle< LHEEventProduct > &lhe_info)
std::vector< float > const & els_pt() const
Definition: baby_base.cc:4800
TString roundNumber(double num, int decimals, double denom=1.)
Definition: utilities.cc:462
unsigned int nevents_sample
float const & elel_pt1() const
Definition: baby_base.cc:3073
lepton_tools * lepTool
Definition: bmaker_basic.hh:64
void writeJets(edm::Handle< pat::JetCollection > alljets, edm::Handle< edm::View< reco::GenJet > > genjets, vCands &sig_leps, vCands &veto_leps, vCands &photons, vCands &tks, std::vector< LVector > &jets, std::vector< std::vector< LVector > > &sysjets)
float const & mumuv_pt2() const
Definition: baby_base.cc:3843
float const & mumu_pt2() const
Definition: baby_base.cc:3766
photon_tools * photonTool
Definition: bmaker_basic.hh:66
time_t startTime
Definition: bmaker_basic.hh:61
virtual void endJob() override
tuple ind
Definition: resubmit.py:140
reco::Candidate::LorentzVector LVector
Definition: utilities.hh:15
float const & elmu_eta() const
Definition: baby_base.cc:3183
vCands writeMuons(edm::Handle< pat::MuonCollection > muons, edm::Handle< pat::PackedCandidateCollection > pfcands, edm::Handle< reco::VertexCollection > vtx, vCands &veto_mus, vCands &all_mus, double rhoEventCentral)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void writeFatJets(std::vector< LVector > &jets)
bool writeTriggers(const edm::TriggerNames &names, edm::Handle< edm::TriggerResults > triggerBits, edm::Handle< pat::PackedTriggerPrescales > triggerPrescales)
float const & mumuv_eta() const
Definition: baby_base.cc:3788
float const & elelv_phi() const
Definition: baby_base.cc:3128
std::string execute(const std::string &cmd)
std::vector< std::string > inputfiles
float const & elmu_phi() const
Definition: baby_base.cc:3205
float const & mumu_pt() const
Definition: baby_base.cc:3744
float const & elel_w() const
Definition: baby_base.cc:3095
float getMT2(float pt1, float phi1, float pt2, float phi2, float met, float met_phi)
Definition: utilities.cc:47
virtual void beginJob() override
float const & elel_eta() const
Definition: baby_base.cc:3029
float &(baby_base::* baby_float)()
Definition: bmaker_basic.hh:48
double calculateRebalancedMET(unsigned int jetIdx, double mu, double &METPhi)
static double getScaleFactor(const reco::Candidate &cand)
virtual std::string Type() const
Definition: baby_basic.cc:31
float const & elelv_eta() const
Definition: baby_base.cc:3106
TString jsonfile
TString outname
std::vector< bool > const & els_inzv() const
Definition: baby_base.cc:4503
float const & elmu_pt() const
Definition: baby_base.cc:3216
TFile * outfile
Definition: bmaker_basic.hh:58
float const & mumu_w() const
Definition: baby_base.cc:3777