25 |
|
#include "CommonDefs.h" |
26 |
|
#include "SelectionDefs.h" |
27 |
|
#include "FSR.h" |
28 |
< |
#include "UtilFuncs.h" |
28 |
> |
#include "SelectionFuncs.h" |
29 |
|
|
30 |
|
|
31 |
|
extern vector<SimpleLepton> failingLeptons; |
32 |
|
extern vector<SimpleLepton> passingLeptons; |
33 |
+ |
extern vector<int> muTrigObjs,eleTrigObjs,muTriggers,eleTriggers; |
34 |
+ |
extern bitset<TRIGGER_BIG_NUMBER> triggerBits; |
35 |
|
|
36 |
|
//-------------------------------------------------------------------------------------------------- |
37 |
|
EventData apply_HZZ4L_EMU_selection(ControlFlags &ctrl, // input control |
38 |
< |
const mithep::EventHeader *info, // input event info |
39 |
< |
const mithep::Array<mithep::Vertex> * vtxArr , |
40 |
< |
const mithep::Array<mithep::PFCandidate> *pfCandidates, |
41 |
< |
const mithep::Array<mithep::PileupEnergyDensity> *puEnergyDensity, |
42 |
< |
const mithep::Array<mithep::Electron> *electronArr, // input electrons |
43 |
< |
SelectionStatus (*ElectronPreSelector)( ControlFlags &, |
44 |
< |
const mithep::Electron*, |
45 |
< |
const mithep::Vertex *), |
46 |
< |
SelectionStatus (*ElectronIDSelector)( ControlFlags &, |
47 |
< |
const mithep::Electron*, |
48 |
< |
const mithep::Vertex *), |
49 |
< |
SelectionStatus (*ElectronIsoSelector)( ControlFlags &, |
50 |
< |
const mithep::Electron*, |
51 |
< |
const mithep::Vertex *, |
52 |
< |
const mithep::Array<mithep::PFCandidate> *, |
53 |
< |
const mithep::Array<mithep::PileupEnergyDensity> *, |
54 |
< |
mithep::ElectronTools::EElectronEffectiveAreaTarget, |
53 |
< |
vector<const mithep::PFCandidate*>), |
54 |
< |
const mithep::Array<mithep::Muon> *muonArr, // input muons |
55 |
< |
SelectionStatus (*MuonPreSelector)( ControlFlags &, |
56 |
< |
const mithep::Muon*, |
57 |
< |
const mithep::Vertex *, |
58 |
< |
const mithep::Array<mithep::PFCandidate> *), |
59 |
< |
SelectionStatus (*MuonIDSelector)( ControlFlags &, |
60 |
< |
const mithep::Muon*, |
61 |
< |
// const mithep::Vertex &), |
62 |
< |
const mithep::Vertex *, |
63 |
< |
const mithep::Array<mithep::PFCandidate> *), |
64 |
< |
SelectionStatus (*MuonIsoSelector)( ControlFlags &, |
65 |
< |
const mithep::Muon*, |
38 |
> |
const mithep::EventHeader *info, // input event info |
39 |
> |
mithep::TriggerTable *hltTable, |
40 |
> |
mithep::Array<mithep::TriggerObject> *hltObjArr, |
41 |
> |
mithep::TriggerObjectsTable *fTrigObjs, |
42 |
> |
const mithep::Array<mithep::Vertex> * vtxArr , |
43 |
> |
const mithep::Array<mithep::PFCandidate> *pfCandidates, |
44 |
> |
const mithep::Array<mithep::PileupEnergyDensity> *puEnergyDensity, |
45 |
> |
const mithep::DecayParticleCol *fConversions, |
46 |
> |
const mithep::Array<mithep::Electron> *electronArr, // input electrons |
47 |
> |
SelectionStatus (*ElectronPreSelector)( ControlFlags &, |
48 |
> |
const mithep::Electron*, |
49 |
> |
const mithep::Vertex *), |
50 |
> |
SelectionStatus (*ElectronIDSelector)( ControlFlags &, |
51 |
> |
const mithep::Electron*, |
52 |
> |
const mithep::Vertex *), |
53 |
> |
SelectionStatus (*ElectronIsoSelector)( ControlFlags &, |
54 |
> |
const mithep::Electron*, |
55 |
|
const mithep::Vertex *, |
56 |
< |
const mithep::Array<mithep::PFCandidate> *, |
56 |
> |
const mithep::Array<mithep::PFCandidate> *, |
57 |
|
const mithep::Array<mithep::PileupEnergyDensity> *, |
58 |
< |
mithep::MuonTools::EMuonEffectiveAreaTarget, |
59 |
< |
vector<const mithep::PFCandidate*>) |
60 |
< |
) |
58 |
> |
mithep::ElectronTools::EElectronEffectiveAreaTarget, |
59 |
> |
vector<const mithep::PFCandidate*>), |
60 |
> |
const mithep::Array<mithep::Muon> *muonArr, // input muons |
61 |
> |
SelectionStatus (*MuonPreSelector)( ControlFlags &, |
62 |
> |
const mithep::Muon*, |
63 |
> |
const mithep::Vertex *, |
64 |
> |
const mithep::Array<mithep::PFCandidate> *), |
65 |
> |
SelectionStatus (*MuonIDSelector)( ControlFlags &, |
66 |
> |
const mithep::Muon*, |
67 |
> |
// const mithep::Vertex &), |
68 |
> |
const mithep::Vertex *, |
69 |
> |
const mithep::Array<mithep::PFCandidate> *), |
70 |
> |
SelectionStatus (*MuonIsoSelector)( ControlFlags &, |
71 |
> |
const mithep::Muon*, |
72 |
> |
const mithep::Vertex *, |
73 |
> |
const mithep::Array<mithep::PFCandidate> *, |
74 |
> |
const mithep::Array<mithep::PileupEnergyDensity> *, |
75 |
> |
mithep::MuonTools::EMuonEffectiveAreaTarget, |
76 |
> |
vector<const mithep::PFCandidate*>) |
77 |
> |
) |
78 |
|
//-------------------------------------------------------------------------------------------------- |
79 |
|
{ |
80 |
|
|
112 |
|
{ |
113 |
|
const mithep::Muon *mu = (mithep::Muon*)((*muonArr)[i]); |
114 |
|
|
109 |
– |
SelectionStatus musel; |
115 |
|
|
116 |
< |
musel |= (*MuonPreSelector)(ctrl,mu,vtx,pfCandidates); |
117 |
< |
if( !(musel.getStatus() & SelectionStatus::PRESELECTION) ) continue; |
116 |
> |
SelectionStatus denomSel; |
117 |
> |
denomSel |= muonPreSelectionNoD0DzIP(ctrl,mu,vtx,pfCandidates); |
118 |
> |
if( !denomSel.passPre() ) continue; |
119 |
|
|
120 |
+ |
SelectionStatus musel; |
121 |
+ |
musel |= (*MuonPreSelector)(ctrl,mu,vtx,pfCandidates); |
122 |
|
musel |= (*MuonIDSelector)(ctrl,mu,vtx,pfCandidates ); |
123 |
< |
|
116 |
< |
if( !(ctrl.doFSR) ) { |
117 |
< |
musel |= (*MuonIsoSelector)(ctrl,mu,vtx,pfCandidates,puEnergyDensity,eraMu,photonsToVeto); |
118 |
< |
} |
123 |
> |
musel |= (*MuonIsoSelector)(ctrl,mu,vtx,pfCandidates,puEnergyDensity,eraMu,photonsToVeto); |
124 |
|
|
125 |
|
SimpleLepton tmplep; |
126 |
|
float pt = mu->Pt(); |
145 |
|
tmplep.is4l = false; |
146 |
|
tmplep.isEB = (fabs(mu->Eta()) < 1.479 ? 1 : 0 ); |
147 |
|
tmplep.isoMVA = musel.isoMVA; |
143 |
– |
tmplep.isTight = musel.tight(); |
148 |
|
tmplep.isLoose = musel.loose(); |
149 |
+ |
|
150 |
+ |
bitset<TRIGGER_BIG_NUMBER> hltMatchBits = fillHLTMatchBits( mu->Eta(), mu->Phi(), hltTable, hltObjArr, fTrigObjs); |
151 |
+ |
tmplep.isTight = testBits(ctrl,triggerBits,muTriggers,hltMatchBits,muTrigObjs); |
152 |
+ |
|
153 |
+ |
tmplep.bdtfail = 0; |
154 |
+ |
if(triggerBits.test(kHLT_IsoMu24_eta2p1)) tmplep.bdtfail |= 1; |
155 |
+ |
if(hltMatchBits.test(kHLT_IsoMu24_eta2p1_MuObj)) tmplep.bdtfail |= 2; |
156 |
+ |
if(triggerBits.test(kHLT_IsoMu24)) tmplep.bdtfail |= 4; |
157 |
+ |
if(hltMatchBits.test(kHLT_IsoMu24_MuObj)) tmplep.bdtfail |= 8; |
158 |
+ |
|
159 |
|
tmplep.status = musel; |
160 |
|
tmplep.fsrRecoveryAttempted = false; |
161 |
< |
tmplep.tightCutsApplied = false; |
161 |
> |
tmplep.tightCutsApplied = muon2012CutBasedIDTight(ctrl,mu,vtx,pfCandidates,puEnergyDensity,eraMu); |
162 |
|
lepvec.push_back(tmplep); |
163 |
|
if( ctrl.debug ) cout << endl; |
164 |
|
} |
169 |
|
{ |
170 |
|
const mithep::Electron *ele = (mithep::Electron*)((*electronArr)[i]); |
171 |
|
|
172 |
< |
SelectionStatus elesel; |
172 |
> |
SelectionStatus denomSel; |
173 |
> |
denomSel |= electronPreSelectionNoD0DzIP(ctrl,ele,vtx); |
174 |
> |
if( !denomSel.passPre() ) continue; |
175 |
|
|
176 |
+ |
SelectionStatus elesel; |
177 |
|
elesel |= (*ElectronPreSelector)(ctrl,ele,vtx); |
161 |
– |
if( !(elesel.getStatus() & SelectionStatus::PRESELECTION) ) continue; |
162 |
– |
|
178 |
|
elesel |= (*ElectronIDSelector)(ctrl,ele,vtx); |
179 |
< |
|
165 |
< |
if( !(ctrl.doFSR) ) { |
166 |
< |
elesel |= (*ElectronIsoSelector)(ctrl,ele,vtx,pfCandidates,puEnergyDensity,eraEle,photonsToVeto); |
167 |
< |
} |
179 |
> |
elesel |= (*ElectronIsoSelector)(ctrl,ele,vtx,pfCandidates,puEnergyDensity,eraEle,photonsToVeto); |
180 |
|
|
181 |
|
SimpleLepton tmplep; |
182 |
|
float pt = ele->Pt(); |
201 |
|
tmplep.is4l = false; |
202 |
|
tmplep.isEB = ele->IsEB(); |
203 |
|
tmplep.scID = ele->SCluster()->GetUniqueID(); |
204 |
+ |
|
205 |
+ |
bitset<TRIGGER_BIG_NUMBER> hltMatchBits = fillHLTMatchBits( ele->Eta(), ele->Phi(), hltTable, hltObjArr, fTrigObjs); |
206 |
+ |
tmplep.isTight = testBits(ctrl,triggerBits,eleTriggers,hltMatchBits,eleTrigObjs); |
207 |
+ |
|
208 |
|
tmplep.isTight = elesel.tight(); |
209 |
|
tmplep.isLoose = elesel.loose(); |
210 |
|
tmplep.status = elesel; |
211 |
|
tmplep.idMVA = elesel.idMVA; |
212 |
|
tmplep.isoMVA = elesel.isoMVA; |
213 |
|
tmplep.fsrRecoveryAttempted = false; |
214 |
< |
SelectionStatus tmpstat = electronTagSelection(ele,vtx,pfCandidates); |
199 |
< |
tmplep.tightCutsApplied = tmpstat.tight(); |
214 |
> |
tmplep.tightCutsApplied = electron2012CutBasedIDMedium(ctrl,ele,vtx,pfCandidates,fConversions,puEnergyDensity,eraEle); |
215 |
|
lepvec.push_back(tmplep); |
216 |
|
if( ctrl.debug ) cout << endl; |
217 |
|
} |
230 |
|
for (vector<SimpleLepton>::iterator it2=lepvec.begin(); it2 != lepvec.end(); it2++ ) { |
231 |
|
if ( it2 == it1 ) continue; |
232 |
|
if ( abs(it2->type) != 13 ) continue; |
233 |
< |
if( !(it2->status.looseIDAndPre()) ) continue; |
233 |
> |
// if( !(it2->status.looseIDAndPre()) ) continue; |
234 |
|
TVector3 mvec = it2->vec.Vect(); |
235 |
|
|
236 |
|
if ( evec.DrEtaPhi(mvec) < 0.05 ) { |
248 |
|
//******************************************************** |
249 |
|
// Step 3: Good Leptons |
250 |
|
//******************************************************** |
236 |
– |
vector<double> pt_of_leptons_to_erase; |
251 |
|
for (int i=0; i<lepvec.size(); i++ ) { |
238 |
– |
bool already_pushed=false; |
252 |
|
if( !(lepvec[i].status.loose()) ) { |
253 |
< |
pt_of_leptons_to_erase.push_back(lepvec[i].vec.Pt()); |
241 |
< |
already_pushed = true; |
242 |
< |
failingLeptons.push_back(lepvec[i]); // these should pass preselection |
253 |
> |
failingLeptons.push_back(lepvec[i]); |
254 |
|
} else { |
255 |
|
passingLeptons.push_back(lepvec[i]); |
256 |
|
} |
246 |
– |
#ifndef SYNC |
247 |
– |
if( !already_pushed && fabs(lepvec[i].ip3dSig)>4 ) |
248 |
– |
pt_of_leptons_to_erase.push_back(lepvec[i].vec.Pt()); |
249 |
– |
#endif |
250 |
– |
} |
251 |
– |
for( int i=0; i<pt_of_leptons_to_erase.size(); i++ ) { |
252 |
– |
for( vector<SimpleLepton>::iterator it=lepvec.begin(); it != lepvec.end(); it++ ) { |
253 |
– |
SimpleLepton flep = *it; |
254 |
– |
if( flep.vec.Pt() != pt_of_leptons_to_erase[i] ) continue; |
255 |
– |
lepvec.erase(it); |
256 |
– |
break; |
257 |
– |
} |
257 |
|
} |
258 |
|
|
259 |
|
//****************************************************************************** |
260 |
|
// W + (OF SS lepton) Selection |
261 |
|
//****************************************************************************** |
262 |
< |
if(ctrl.fakeScheme.Contains("emu-")) { |
263 |
< |
if(has_ssof_lepton(ctrl)) { |
264 |
< |
ret.status.setStatus(SelectionStatus::EVTPASS); |
265 |
< |
ret.Z1leptons.push_back(passingLeptons[0]); |
266 |
< |
ret.Z1leptons.push_back(passingLeptons[0]); |
267 |
< |
ret.Z2leptons.push_back(passingLeptons[0]); |
268 |
< |
ret.Z2leptons.push_back(passingLeptons[0]); |
269 |
< |
} else { |
271 |
< |
ret.status.setStatus(SelectionStatus::FAIL); |
272 |
< |
} |
273 |
< |
return ret; |
262 |
> |
if(has_ssof_lepton(ctrl)) { |
263 |
> |
ret.status.setStatus(SelectionStatus::EVTPASS); |
264 |
> |
ret.Z1leptons.push_back(passingLeptons[0]); |
265 |
> |
ret.Z1leptons.push_back(passingLeptons[0]); |
266 |
> |
ret.Z2leptons.push_back(passingLeptons[0]); |
267 |
> |
ret.Z2leptons.push_back(passingLeptons[0]); |
268 |
> |
} else { |
269 |
> |
ret.status.setStatus(SelectionStatus::FAIL); |
270 |
|
} |
271 |
+ |
return ret; |
272 |
|
} |
276 |
– |
|
277 |
– |
// //---------------------------------------------------------------------------- |
278 |
– |
// // |
279 |
– |
// // Get primary vertices |
280 |
– |
// // Assumes primary vertices are ordered by sum-pT^2 (as should be in CMSSW) |
281 |
– |
// // NOTE: if no PV is found from fitting tracks, the beamspot is used |
282 |
– |
// // |
283 |
– |
// //---------------------------------------------------------------------------- |
284 |
– |
// bool setPV(ControlFlags ctrl, |
285 |
– |
// const mithep::Array<mithep::Vertex> * vtxArr, |
286 |
– |
// const mithep::Vertex* &vtx) |
287 |
– |
// //---------------------------------------------------------------------------- |
288 |
– |
// { |
289 |
– |
|
290 |
– |
// const mithep::Vertex *bestPV = 0; |
291 |
– |
// float best_sumpt=-1; |
292 |
– |
|
293 |
– |
// // good PV requirements |
294 |
– |
// const UInt_t fMinNTracksFit = 0; |
295 |
– |
// const Double_t fMinNdof = 4; |
296 |
– |
// const Double_t fMaxAbsZ = 24; |
297 |
– |
// const Double_t fMaxRho = 2; |
298 |
– |
|
299 |
– |
// for(int i=0; i<vtxArr->GetEntries(); ++i) { |
300 |
– |
// const mithep::Vertex *pv = (mithep::Vertex*)(vtxArr->At(i)); |
301 |
– |
// if( ctrl.debug ) cout << "vertex :: " << i << "\tntrks: " << pv->NTracks() << endl; |
302 |
– |
|
303 |
– |
// // Select best PV for corrected d0; if no PV passing cuts, the first PV in the collection will be used |
304 |
– |
// if(!pv->IsValid()) continue; |
305 |
– |
// if(pv->NTracksFit() < fMinNTracksFit) continue; |
306 |
– |
// if(pv->Ndof() < fMinNdof) continue; |
307 |
– |
// if(fabs(pv->Z()) > fMaxAbsZ) continue; |
308 |
– |
// if(pv->Position().Rho() > fMaxRho) continue; |
309 |
– |
|
310 |
– |
// // take the first ... |
311 |
– |
// bestPV = pv; |
312 |
– |
// break; |
313 |
– |
|
314 |
– |
// // this never reached ... |
315 |
– |
// float tmp_sumpt=0; |
316 |
– |
// for( int t=0; t<pv->NTracks(); t++ ) |
317 |
– |
// tmp_sumpt += pv->Trk(t)->Pt(); |
318 |
– |
|
319 |
– |
// if( tmp_sumpt > best_sumpt ) { |
320 |
– |
// bestPV = pv; |
321 |
– |
// best_sumpt = tmp_sumpt; |
322 |
– |
// if( ctrl.debug) cout << "new PV set, pt : " << best_sumpt << endl; |
323 |
– |
// } |
324 |
– |
// } |
325 |
– |
|
326 |
– |
// // sync |
327 |
– |
// if(!bestPV) |
328 |
– |
// return false; |
329 |
– |
// else { |
330 |
– |
// vtx = bestPV; |
331 |
– |
// return true; |
332 |
– |
// } |
333 |
– |
// }; |
273 |
|
//---------------------------------------------------------------------------------------- |
274 |
|
bool has_ssof_lepton(ControlFlags &ctrl) |
275 |
|
{ |
300 |
|
|
301 |
|
return has_ssof; |
302 |
|
} |
364 |
– |
// //---------------------------------------------------------------------------------------- |
365 |
– |
// void getEATargets(ControlFlags &ctrl, mithep::MuonTools::EMuonEffectiveAreaTarget &eraMu, mithep::ElectronTools::EElectronEffectiveAreaTarget &eraEle) |
366 |
– |
// { |
367 |
– |
// if( !ctrl.mc && ctrl.era == 2011 ) { |
368 |
– |
// eraMu = mithep::MuonTools::kMuEAData2011; |
369 |
– |
// eraEle = mithep::ElectronTools::kEleEAData2011; |
370 |
– |
// } else if( !ctrl.mc && ctrl.era == 2012 ) { |
371 |
– |
// eraMu = mithep::MuonTools::kMuEAData2012; |
372 |
– |
// eraEle = mithep::ElectronTools::kEleEAData2012; |
373 |
– |
// } else if( ctrl.mc && ctrl.era == 2011 ) { |
374 |
– |
// eraMu = mithep::MuonTools::kMuEAFall11MC; |
375 |
– |
// eraEle = mithep::ElectronTools::kEleEAFall11MC; |
376 |
– |
// } else if( ctrl.mc && ctrl.era == 2012 ) { |
377 |
– |
// eraMu = mithep::MuonTools::kMuEAData2012; |
378 |
– |
// eraEle = mithep::ElectronTools::kEleEAData2012; |
379 |
– |
// } else { |
380 |
– |
// cerr << "unknown era for effective areas ... quitting." << endl; |
381 |
– |
// exit(1); |
382 |
– |
// } |
383 |
– |
// } |