ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/NonMCBackground/src/SelectionEMU.cc
Revision: 1.15
Committed: Sat Jul 21 11:27:54 2012 UTC (12 years, 10 months ago) by dkralph
Content type: text/plain
Branch: MAIN
Changes since 1.14: +4 -4 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 dkralph 1.10 const mithep::DecayParticleCol *fConversions,
46 dkralph 1.9 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 dkralph 1.4 const mithep::Vertex *,
56 dkralph 1.9 const mithep::Array<mithep::PFCandidate> *,
57 dkralph 1.4 const mithep::Array<mithep::PileupEnergyDensity> *,
58 dkralph 1.9 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 dkralph 1.4 //--------------------------------------------------------------------------------------------------
79 khahn 1.1 {
80    
81     EventData ret;
82     unsigned evtfail = 0x0;
83     TRandom3 r;
84    
85 dkralph 1.4 failingLeptons.clear();
86     passingLeptons.clear();
87    
88     mithep::MuonTools::EMuonEffectiveAreaTarget eraMu;
89     mithep::ElectronTools::EElectronEffectiveAreaTarget eraEle;
90     getEATargets(ctrl,eraMu,eraEle);
91    
92     const mithep::Vertex * vtx;
93     bool goodVertex = setPV( ctrl, vtxArr, vtx );
94     if(goodVertex) {
95     ret.status.selectionBits.flip(PASS_SKIM2);
96     } else {
97     if(ctrl.debug) cout << "found bad vertex" << endl;
98     ret.status.setStatus(SelectionStatus::FAIL);
99     return ret;
100 khahn 1.1 }
101    
102 dkralph 1.4 //***********************************************************
103     // Lepton Selection
104     //***********************************************************
105 khahn 1.1 vector<SimpleLepton> lepvec;
106 dkralph 1.4 vector<const mithep::PFCandidate*> photonsToVeto;
107    
108 khahn 1.1
109     if( ctrl.debug ) cout << "\tnMuons: " << muonArr->GetEntries() << endl;
110     //----------------------------------------------------
111 dkralph 1.4 for(int i=0; i<muonArr->GetEntries(); i++)
112 khahn 1.1 {
113 dkralph 1.4 const mithep::Muon *mu = (mithep::Muon*)((*muonArr)[i]);
114 khahn 1.1
115 dkralph 1.8
116     SelectionStatus denomSel;
117 dkralph 1.13 denomSel |= muonPreSelectionNoD0IP(ctrl,mu,vtx,pfCandidates);
118 dkralph 1.9 if( !denomSel.passPre() ) continue;
119 dkralph 1.8
120 khahn 1.1 SelectionStatus musel;
121 dkralph 1.4 musel |= (*MuonPreSelector)(ctrl,mu,vtx,pfCandidates);
122     musel |= (*MuonIDSelector)(ctrl,mu,vtx,pfCandidates );
123 dkralph 1.8 musel |= (*MuonIsoSelector)(ctrl,mu,vtx,pfCandidates,puEnergyDensity,eraMu,photonsToVeto);
124 dkralph 1.4
125     SimpleLepton tmplep;
126     float pt = mu->Pt();
127     tmplep.vec.SetPtEtaPhiM(pt,
128     mu->Eta(),
129     mu->Phi(),
130     MUON_MASS);
131 khahn 1.1
132 dkralph 1.4 tmplep.type = 13;
133     tmplep.index = i;
134     tmplep.charge = mu->Charge();
135     tmplep.isoPF04 = musel.isoPF04;
136     tmplep.chisoPF04 = musel.chisoPF04;
137     tmplep.gaisoPF04 = musel.gaisoPF04;
138     tmplep.neisoPF04 = musel.neisoPF04;
139     tmplep.ip3dSig = mu->Ip3dPVSignificance();
140     tmplep.is4l = false;
141     tmplep.isEB = (fabs(mu->Eta()) < 1.479 ? 1 : 0 );
142     tmplep.isoMVA = musel.isoMVA;
143     tmplep.isLoose = musel.loose();
144 dkralph 1.9
145     bitset<TRIGGER_BIG_NUMBER> hltMatchBits = fillHLTMatchBits( mu->Eta(), mu->Phi(), hltTable, hltObjArr, fTrigObjs);
146     tmplep.isTight = testBits(ctrl,triggerBits,muTriggers,hltMatchBits,muTrigObjs);
147    
148     tmplep.bdtfail = 0;
149     if(triggerBits.test(kHLT_IsoMu24_eta2p1)) tmplep.bdtfail |= 1;
150     if(hltMatchBits.test(kHLT_IsoMu24_eta2p1_MuObj)) tmplep.bdtfail |= 2;
151     if(triggerBits.test(kHLT_IsoMu24)) tmplep.bdtfail |= 4;
152     if(hltMatchBits.test(kHLT_IsoMu24_MuObj)) tmplep.bdtfail |= 8;
153    
154 dkralph 1.4 tmplep.status = musel;
155     tmplep.fsrRecoveryAttempted = false;
156 dkralph 1.11 tmplep.tightCutsApplied = muon2012CutBasedIDTightVersionWithOldIsoThatWorksOn2011(ctrl,mu,vtx,pfCandidates,puEnergyDensity,eraMu);
157 dkralph 1.15 // tmplep.d0 = mu->HasTrackerTrk() ? mu->TrackerTrk()->D0Corrected(*vtx) : 0;
158     // tmplep.dz = mu->HasTrackerTrk() ? mu->TrackerTrk()->DzCorrected(*vtx) : 0;
159 dkralph 1.14
160 dkralph 1.4 lepvec.push_back(tmplep);
161     if( ctrl.debug ) cout << endl;
162     }
163    
164     if( ctrl.debug ) { cout << "\tnElectron: " << electronArr->GetEntries() << endl; }
165     // --------------------------------------------------------------------------------
166     for(int i=0; i<electronArr->GetEntries(); i++)
167     {
168     const mithep::Electron *ele = (mithep::Electron*)((*electronArr)[i]);
169 khahn 1.1
170 dkralph 1.8 SelectionStatus denomSel;
171 dkralph 1.13 denomSel |= electronPreSelectionNoD0IP(ctrl,ele,vtx);
172 dkralph 1.10 if( !denomSel.passPre() ) continue;
173 dkralph 1.8
174 dkralph 1.4 SelectionStatus elesel;
175     elesel |= (*ElectronPreSelector)(ctrl,ele,vtx);
176     elesel |= (*ElectronIDSelector)(ctrl,ele,vtx);
177 dkralph 1.8 elesel |= (*ElectronIsoSelector)(ctrl,ele,vtx,pfCandidates,puEnergyDensity,eraEle,photonsToVeto);
178 khahn 1.1
179 dkralph 1.4 SimpleLepton tmplep;
180     float pt = ele->Pt();
181     tmplep.vec.SetPtEtaPhiM( pt,
182     ele->Eta(),
183     ele->Phi(),
184     ELECTRON_MASS );
185 khahn 1.1
186 dkralph 1.4 tmplep.type = 11;
187 khahn 1.1 tmplep.index = i;
188 dkralph 1.4 tmplep.charge = ele->Charge();
189     tmplep.isoPF04 = elesel.isoPF04;
190     tmplep.chisoPF04 = elesel.chisoPF04;
191     tmplep.gaisoPF04 = elesel.gaisoPF04;
192     tmplep.neisoPF04 = elesel.neisoPF04;
193     tmplep.ip3dSig = ele->Ip3dPVSignificance();
194 khahn 1.1 tmplep.is4l = false;
195 dkralph 1.4 tmplep.isEB = ele->IsEB();
196     tmplep.scID = ele->SCluster()->GetUniqueID();
197 dkralph 1.9
198     bitset<TRIGGER_BIG_NUMBER> hltMatchBits = fillHLTMatchBits( ele->Eta(), ele->Phi(), hltTable, hltObjArr, fTrigObjs);
199     tmplep.isTight = testBits(ctrl,triggerBits,eleTriggers,hltMatchBits,eleTrigObjs);
200    
201 dkralph 1.4 tmplep.isTight = elesel.tight();
202     tmplep.isLoose = elesel.loose();
203     tmplep.status = elesel;
204     tmplep.idMVA = elesel.idMVA;
205     tmplep.isoMVA = elesel.isoMVA;
206     tmplep.fsrRecoveryAttempted = false;
207 dkralph 1.11 tmplep.tightCutsApplied = electron2012CutBasedIDMediumVersionThatWorksOn2011(ctrl,ele,vtx,pfCandidates,fConversions,puEnergyDensity,eraEle);
208 dkralph 1.15 // tmplep.d0 = ele->BestTrk()->D0Corrected(*vtx);
209     // tmplep.dz = ele->BestTrk()->DzCorrected(*vtx);
210 dkralph 1.14
211 khahn 1.1 lepvec.push_back(tmplep);
212 dkralph 1.4 if( ctrl.debug ) cout << endl;
213 khahn 1.1 }
214 khahn 1.3
215 dkralph 1.4 sort( lepvec.begin(), lepvec.end(), SimpleLepton::lep_pt_sort );
216    
217     //********************************************************
218     // Step 2: Lepton Cleaning
219     //********************************************************
220     vector<vector<SimpleLepton>::iterator> electrons_to_erase;
221     for (vector<SimpleLepton>::iterator it1=lepvec.begin(); it1 != lepvec.end(); it1++ ) {
222     if ( abs(it1->type) != 11 ) continue;
223     TVector3 evec = it1->vec.Vect();
224    
225     bool erase_this_electron=false;
226     for (vector<SimpleLepton>::iterator it2=lepvec.begin(); it2 != lepvec.end(); it2++ ) {
227     if ( it2 == it1 ) continue;
228     if ( abs(it2->type) != 13 ) continue;
229 dkralph 1.7 // if( !(it2->status.looseIDAndPre()) ) continue;
230 dkralph 1.4 TVector3 mvec = it2->vec.Vect();
231 khahn 1.1
232 dkralph 1.4 if ( evec.DrEtaPhi(mvec) < 0.05 ) {
233     erase_this_electron=true;
234     break;
235 khahn 1.1 }
236 dkralph 1.4 }
237     if( erase_this_electron )
238     electrons_to_erase.push_back(it1);
239     }
240     for( int i=0; i<electrons_to_erase.size(); i++ ) {
241     lepvec.erase(electrons_to_erase[i]);
242     }
243 khahn 1.1
244     //********************************************************
245 dkralph 1.4 // Step 3: Good Leptons
246 khahn 1.1 //********************************************************
247 dkralph 1.4 for (int i=0; i<lepvec.size(); i++ ) {
248     if( !(lepvec[i].status.loose()) ) {
249 dkralph 1.10 failingLeptons.push_back(lepvec[i]);
250 dkralph 1.4 } else {
251     passingLeptons.push_back(lepvec[i]);
252     }
253 khahn 1.1 }
254 dkralph 1.4
255 khahn 1.1 //******************************************************************************
256 dkralph 1.4 // W + (OF SS lepton) Selection
257 khahn 1.1 //******************************************************************************
258 dkralph 1.7 if(has_ssof_lepton(ctrl)) {
259     ret.status.setStatus(SelectionStatus::EVTPASS);
260     ret.Z1leptons.push_back(passingLeptons[0]);
261     ret.Z1leptons.push_back(passingLeptons[0]);
262     ret.Z2leptons.push_back(passingLeptons[0]);
263     ret.Z2leptons.push_back(passingLeptons[0]);
264     } else {
265     ret.status.setStatus(SelectionStatus::FAIL);
266 khahn 1.1 }
267 dkralph 1.7 return ret;
268 dkralph 1.4 }
269     //----------------------------------------------------------------------------------------
270     bool has_ssof_lepton(ControlFlags &ctrl)
271     {
272     bool has_ssof=false;
273     for(unsigned iw=0; iw<passingLeptons.size(); iw++) {
274     SimpleLepton w_lep = passingLeptons[iw];
275     //????????????????????????????????????????????????????????????????????????????????????????
276     // this is applied in skim (skim also applies ww muon id)
277     // if(abs(w_lep.type) == 11) {
278     // if( !(w_lep.tightCutsApplied) )
279     // continue;
280     // }
281     //????????????????????????????????????????????????????????????????????????????????????????
282     for(unsigned ifake=0; ifake<failingLeptons.size(); ifake++) {
283     SimpleLepton fake_lep = failingLeptons[ifake];
284     if(abs(fake_lep.type) == abs(w_lep.type)) continue;
285     if(fake_lep.charge != w_lep.charge) continue;
286     has_ssof = true;
287     }
288     for(unsigned ipass=0; ipass<passingLeptons.size(); ipass++) {
289     if(ipass == iw) continue;
290     SimpleLepton pass_lep = passingLeptons[ipass];
291     if(abs(pass_lep.type) == abs(w_lep.type)) continue;
292     if(pass_lep.charge != w_lep.charge) continue;
293     has_ssof = true;
294 khahn 1.1 }
295 dkralph 1.4 }
296 khahn 1.1
297 dkralph 1.4 return has_ssof;
298 khahn 1.1 }