ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/NonMCBackground/src/SelectionEMU.cc
Revision: 1.9
Committed: Mon Jun 25 18:08:04 2012 UTC (12 years, 10 months ago) by dkralph
Content type: text/plain
Branch: MAIN
Changes since 1.8: +56 -38 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 dkralph 1.4 //***************************************************************************************************
2     //
3     // selection sync'ed with https://twiki.cern.ch/twiki/bin/viewauth/CMS/HiggsZZ4l2012SummerSync
4     //
5     //***************************************************************************************************
6    
7     // system headers
8     #include <map>
9     #include <utility>
10    
11     // mit headers
12     #include "Vertex.h"
13    
14     // 4L stuff
15 khahn 1.1 #include "SelectionStatus.h"
16     #include "EventData.h"
17     #include "SimpleLepton.h"
18     #include "EfficiencyWeightsInterface.h"
19 dkralph 1.4 #include "ElectronSelection.h"
20     #include "MuonSelection.h"
21 khahn 1.1 #include "IsolationSelection.h"
22     #include "SelectionEMU.h"
23 dkralph 1.4 #include "ReferenceSelection.h"
24     #include "Selection.h"
25     #include "CommonDefs.h"
26 khahn 1.1 #include "SelectionDefs.h"
27 dkralph 1.4 #include "FSR.h"
28 dkralph 1.5 #include "SelectionFuncs.h"
29 khahn 1.1
30    
31 dkralph 1.4 extern vector<SimpleLepton> failingLeptons;
32     extern vector<SimpleLepton> passingLeptons;
33 dkralph 1.9 extern vector<int> muTrigObjs,eleTrigObjs,muTriggers,eleTriggers;
34     extern bitset<TRIGGER_BIG_NUMBER> triggerBits;
35 khahn 1.1
36 dkralph 1.4 //--------------------------------------------------------------------------------------------------
37     EventData apply_HZZ4L_EMU_selection(ControlFlags &ctrl, // input control
38 dkralph 1.9 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::Array<mithep::Electron> *electronArr, // input electrons
46     SelectionStatus (*ElectronPreSelector)( ControlFlags &,
47     const mithep::Electron*,
48     const mithep::Vertex *),
49     SelectionStatus (*ElectronIDSelector)( ControlFlags &,
50     const mithep::Electron*,
51     const mithep::Vertex *),
52     SelectionStatus (*ElectronIsoSelector)( ControlFlags &,
53     const mithep::Electron*,
54 dkralph 1.4 const mithep::Vertex *,
55 dkralph 1.9 const mithep::Array<mithep::PFCandidate> *,
56 dkralph 1.4 const mithep::Array<mithep::PileupEnergyDensity> *,
57 dkralph 1.9 mithep::ElectronTools::EElectronEffectiveAreaTarget,
58     vector<const mithep::PFCandidate*>),
59     const mithep::Array<mithep::Muon> *muonArr, // input muons
60     SelectionStatus (*MuonPreSelector)( ControlFlags &,
61     const mithep::Muon*,
62     const mithep::Vertex *,
63     const mithep::Array<mithep::PFCandidate> *),
64     SelectionStatus (*MuonIDSelector)( ControlFlags &,
65     const mithep::Muon*,
66     // const mithep::Vertex &),
67     const mithep::Vertex *,
68     const mithep::Array<mithep::PFCandidate> *),
69     SelectionStatus (*MuonIsoSelector)( ControlFlags &,
70     const mithep::Muon*,
71     const mithep::Vertex *,
72     const mithep::Array<mithep::PFCandidate> *,
73     const mithep::Array<mithep::PileupEnergyDensity> *,
74     mithep::MuonTools::EMuonEffectiveAreaTarget,
75     vector<const mithep::PFCandidate*>)
76     )
77 dkralph 1.4 //--------------------------------------------------------------------------------------------------
78 khahn 1.1 {
79    
80     EventData ret;
81     unsigned evtfail = 0x0;
82     TRandom3 r;
83    
84 dkralph 1.4 failingLeptons.clear();
85     passingLeptons.clear();
86    
87     mithep::MuonTools::EMuonEffectiveAreaTarget eraMu;
88     mithep::ElectronTools::EElectronEffectiveAreaTarget eraEle;
89     getEATargets(ctrl,eraMu,eraEle);
90    
91     const mithep::Vertex * vtx;
92     bool goodVertex = setPV( ctrl, vtxArr, vtx );
93     if(goodVertex) {
94     ret.status.selectionBits.flip(PASS_SKIM2);
95     } else {
96     if(ctrl.debug) cout << "found bad vertex" << endl;
97     ret.status.setStatus(SelectionStatus::FAIL);
98     return ret;
99 khahn 1.1 }
100    
101 dkralph 1.4 //***********************************************************
102     // Lepton Selection
103     //***********************************************************
104 khahn 1.1 vector<SimpleLepton> lepvec;
105 dkralph 1.4 vector<const mithep::PFCandidate*> photonsToVeto;
106    
107 khahn 1.1
108     if( ctrl.debug ) cout << "\tnMuons: " << muonArr->GetEntries() << endl;
109     //----------------------------------------------------
110 dkralph 1.4 for(int i=0; i<muonArr->GetEntries(); i++)
111 khahn 1.1 {
112 dkralph 1.4 const mithep::Muon *mu = (mithep::Muon*)((*muonArr)[i]);
113 khahn 1.1
114 dkralph 1.8
115     SelectionStatus denomSel;
116 dkralph 1.9 denomSel |= muonPreSelectionNoD0DzIP(ctrl,mu,vtx,pfCandidates);
117     if( !denomSel.passPre() ) continue;
118 dkralph 1.8
119 khahn 1.1 SelectionStatus musel;
120 dkralph 1.4 musel |= (*MuonPreSelector)(ctrl,mu,vtx,pfCandidates);
121     musel |= (*MuonIDSelector)(ctrl,mu,vtx,pfCandidates );
122 dkralph 1.8 musel |= (*MuonIsoSelector)(ctrl,mu,vtx,pfCandidates,puEnergyDensity,eraMu,photonsToVeto);
123 dkralph 1.4
124     SimpleLepton tmplep;
125     float pt = mu->Pt();
126     tmplep.vec.SetPtEtaPhiM(pt,
127     mu->Eta(),
128     mu->Phi(),
129     MUON_MASS);
130 khahn 1.1
131 dkralph 1.4 tmplep.type = 13;
132     tmplep.index = i;
133     tmplep.charge = mu->Charge();
134     tmplep.isoTrk = mu->IsoR03SumPt();
135     tmplep.isoEcal = mu->IsoR03EmEt();
136     tmplep.isoHcal = mu->IsoR03HadEt();
137     tmplep.isoPF04 = musel.isoPF04;
138     tmplep.chisoPF04 = musel.chisoPF04;
139     tmplep.gaisoPF04 = musel.gaisoPF04;
140     tmplep.neisoPF04 = musel.neisoPF04;
141     // tmplep.isoPF03 = computePFMuonIso(mu,vtx,pfCandidates,0.3);
142     // tmplep.isoPF04 = computePFMuonIso(mu,vtx,pfCandidates,0.4);
143     tmplep.ip3dSig = mu->Ip3dPVSignificance();
144     tmplep.is4l = false;
145     tmplep.isEB = (fabs(mu->Eta()) < 1.479 ? 1 : 0 );
146     tmplep.isoMVA = musel.isoMVA;
147     tmplep.isLoose = musel.loose();
148 dkralph 1.9
149     bitset<TRIGGER_BIG_NUMBER> hltMatchBits = fillHLTMatchBits( mu->Eta(), mu->Phi(), hltTable, hltObjArr, fTrigObjs);
150     tmplep.isTight = testBits(ctrl,triggerBits,muTriggers,hltMatchBits,muTrigObjs);
151    
152     tmplep.bdtfail = 0;
153     if(triggerBits.test(kHLT_IsoMu24_eta2p1)) tmplep.bdtfail |= 1;
154     if(hltMatchBits.test(kHLT_IsoMu24_eta2p1_MuObj)) tmplep.bdtfail |= 2;
155     if(triggerBits.test(kHLT_IsoMu24)) tmplep.bdtfail |= 4;
156     if(hltMatchBits.test(kHLT_IsoMu24_MuObj)) tmplep.bdtfail |= 8;
157    
158 dkralph 1.4 tmplep.status = musel;
159     tmplep.fsrRecoveryAttempted = false;
160 dkralph 1.6 SelectionStatus tmpstat = PassWwMuonSel(mu,vtx,pfCandidates);
161     tmplep.tightCutsApplied = tmpstat.tight();
162 dkralph 1.4 lepvec.push_back(tmplep);
163     if( ctrl.debug ) cout << endl;
164     }
165    
166     if( ctrl.debug ) { cout << "\tnElectron: " << electronArr->GetEntries() << endl; }
167     // --------------------------------------------------------------------------------
168     for(int i=0; i<electronArr->GetEntries(); i++)
169     {
170     const mithep::Electron *ele = (mithep::Electron*)((*electronArr)[i]);
171 khahn 1.1
172 dkralph 1.8 SelectionStatus denomSel;
173 dkralph 1.9 denomSel |= electronPreSelectionNoD0DzIP(ctrl,ele,vtx);
174 dkralph 1.8 if( !(denomSel.getStatus() & SelectionStatus::PRESELECTION) ) continue;
175    
176 dkralph 1.4 SelectionStatus elesel;
177     elesel |= (*ElectronPreSelector)(ctrl,ele,vtx);
178     elesel |= (*ElectronIDSelector)(ctrl,ele,vtx);
179 dkralph 1.8 elesel |= (*ElectronIsoSelector)(ctrl,ele,vtx,pfCandidates,puEnergyDensity,eraEle,photonsToVeto);
180 khahn 1.1
181 dkralph 1.4 SimpleLepton tmplep;
182     float pt = ele->Pt();
183     tmplep.vec.SetPtEtaPhiM( pt,
184     ele->Eta(),
185     ele->Phi(),
186     ELECTRON_MASS );
187 khahn 1.1
188 dkralph 1.4 tmplep.type = 11;
189 khahn 1.1 tmplep.index = i;
190 dkralph 1.4 tmplep.charge = ele->Charge();
191     tmplep.isoTrk = ele->TrackIsolationDr03();
192     tmplep.isoEcal = ele->EcalRecHitIsoDr03();
193     tmplep.isoHcal = ele->HcalTowerSumEtDr03();
194     tmplep.isoPF04 = elesel.isoPF04;
195     tmplep.chisoPF04 = elesel.chisoPF04;
196     tmplep.gaisoPF04 = elesel.gaisoPF04;
197     tmplep.neisoPF04 = elesel.neisoPF04;
198     // tmplep.isoPF03 = computePFEleIso(ele,vtx,pfCandidates,0.3);
199     // tmplep.isoPF04 = computePFEleIso(ele,vtx,pfCandidates,0.4);
200     tmplep.ip3dSig = ele->Ip3dPVSignificance();
201 khahn 1.1 tmplep.is4l = false;
202 dkralph 1.4 tmplep.isEB = ele->IsEB();
203     tmplep.scID = ele->SCluster()->GetUniqueID();
204 dkralph 1.9
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 dkralph 1.4 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);
215     tmplep.tightCutsApplied = tmpstat.tight();
216 khahn 1.1 lepvec.push_back(tmplep);
217 dkralph 1.4 if( ctrl.debug ) cout << endl;
218 khahn 1.1 }
219 khahn 1.3
220 dkralph 1.4 sort( lepvec.begin(), lepvec.end(), SimpleLepton::lep_pt_sort );
221    
222     //********************************************************
223     // Step 2: Lepton Cleaning
224     //********************************************************
225     vector<vector<SimpleLepton>::iterator> electrons_to_erase;
226     for (vector<SimpleLepton>::iterator it1=lepvec.begin(); it1 != lepvec.end(); it1++ ) {
227     if ( abs(it1->type) != 11 ) continue;
228     TVector3 evec = it1->vec.Vect();
229    
230     bool erase_this_electron=false;
231     for (vector<SimpleLepton>::iterator it2=lepvec.begin(); it2 != lepvec.end(); it2++ ) {
232     if ( it2 == it1 ) continue;
233     if ( abs(it2->type) != 13 ) continue;
234 dkralph 1.7 // if( !(it2->status.looseIDAndPre()) ) continue;
235 dkralph 1.4 TVector3 mvec = it2->vec.Vect();
236 khahn 1.1
237 dkralph 1.4 if ( evec.DrEtaPhi(mvec) < 0.05 ) {
238     erase_this_electron=true;
239     break;
240 khahn 1.1 }
241 dkralph 1.4 }
242     if( erase_this_electron )
243     electrons_to_erase.push_back(it1);
244     }
245     for( int i=0; i<electrons_to_erase.size(); i++ ) {
246     lepvec.erase(electrons_to_erase[i]);
247     }
248 khahn 1.1
249     //********************************************************
250 dkralph 1.4 // Step 3: Good Leptons
251 khahn 1.1 //********************************************************
252 dkralph 1.4 vector<double> pt_of_leptons_to_erase;
253     for (int i=0; i<lepvec.size(); i++ ) {
254     bool already_pushed=false;
255     if( !(lepvec[i].status.loose()) ) {
256     pt_of_leptons_to_erase.push_back(lepvec[i].vec.Pt());
257     already_pushed = true;
258     failingLeptons.push_back(lepvec[i]); // these should pass preselection
259     } else {
260     passingLeptons.push_back(lepvec[i]);
261     }
262     #ifndef SYNC
263     if( !already_pushed && fabs(lepvec[i].ip3dSig)>4 )
264     pt_of_leptons_to_erase.push_back(lepvec[i].vec.Pt());
265     #endif
266 khahn 1.1 }
267 dkralph 1.4 for( int i=0; i<pt_of_leptons_to_erase.size(); i++ ) {
268     for( vector<SimpleLepton>::iterator it=lepvec.begin(); it != lepvec.end(); it++ ) {
269     SimpleLepton flep = *it;
270     if( flep.vec.Pt() != pt_of_leptons_to_erase[i] ) continue;
271     lepvec.erase(it);
272     break;
273     }
274 khahn 1.1 }
275 dkralph 1.4
276 khahn 1.1 //******************************************************************************
277 dkralph 1.4 // W + (OF SS lepton) Selection
278 khahn 1.1 //******************************************************************************
279 dkralph 1.7 if(has_ssof_lepton(ctrl)) {
280     ret.status.setStatus(SelectionStatus::EVTPASS);
281     ret.Z1leptons.push_back(passingLeptons[0]);
282     ret.Z1leptons.push_back(passingLeptons[0]);
283     ret.Z2leptons.push_back(passingLeptons[0]);
284     ret.Z2leptons.push_back(passingLeptons[0]);
285     } else {
286     ret.status.setStatus(SelectionStatus::FAIL);
287 khahn 1.1 }
288 dkralph 1.7 return ret;
289 dkralph 1.4 }
290     //----------------------------------------------------------------------------------------
291     bool has_ssof_lepton(ControlFlags &ctrl)
292     {
293     bool has_ssof=false;
294     for(unsigned iw=0; iw<passingLeptons.size(); iw++) {
295     SimpleLepton w_lep = passingLeptons[iw];
296     //????????????????????????????????????????????????????????????????????????????????????????
297     // this is applied in skim (skim also applies ww muon id)
298     // if(abs(w_lep.type) == 11) {
299     // if( !(w_lep.tightCutsApplied) )
300     // continue;
301     // }
302     //????????????????????????????????????????????????????????????????????????????????????????
303     for(unsigned ifake=0; ifake<failingLeptons.size(); ifake++) {
304     SimpleLepton fake_lep = failingLeptons[ifake];
305     if(abs(fake_lep.type) == abs(w_lep.type)) continue;
306     if(fake_lep.charge != w_lep.charge) continue;
307     has_ssof = true;
308     }
309     for(unsigned ipass=0; ipass<passingLeptons.size(); ipass++) {
310     if(ipass == iw) continue;
311     SimpleLepton pass_lep = passingLeptons[ipass];
312     if(abs(pass_lep.type) == abs(w_lep.type)) continue;
313     if(pass_lep.charge != w_lep.charge) continue;
314     has_ssof = true;
315 khahn 1.1 }
316 dkralph 1.4 }
317 khahn 1.1
318 dkralph 1.4 return has_ssof;
319 khahn 1.1 }