ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Rebeca/TopTreesCode/Selection.cc
Revision: 1.1
Committed: Thu Apr 28 18:55:26 2011 UTC (14 years ago) by rebeca
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
TopTrees code working in CMSSW 4X

File Contents

# Content
1 #include "../interface/Selection.h"
2
3 //____CONSTRUCTORS______________________________________________________//
4
5 Selection::Selection() {
6 setJetCuts();
7 setMuonCuts();
8 setDiMuonCuts();
9 setElectronCuts();
10 setLooseMuonCuts();
11 setLooseElectronCuts();
12 setPlainElectronCuts();
13 }
14
15 Selection::Selection(const std::vector<TRootJet*>& jets_, const std::vector<TRootMuon*>& muons_, const std::vector<TRootMET*>& mets_){
16 setJetCuts();
17 setMuonCuts();
18 setDiMuonCuts();
19 setElectronCuts();
20 setLooseMuonCuts();
21 setLooseElectronCuts();
22 setPlainElectronCuts();
23 for(unsigned int i=0;i<jets_.size();i++) jets.push_back(jets_[i]);
24 for(unsigned int i=0;i<muons_.size();i++) muons.push_back(muons_[i]);
25 for(unsigned int i=0;i<mets_.size();i++) mets.push_back(mets_[i]);
26 }
27
28 Selection::Selection(const std::vector<TRootJet*>& jets_, const std::vector<TRootMuon*>& muons_, const std::vector<TRootElectron*>& electrons_, const std::vector<TRootMET*>& mets_){
29 setJetCuts();
30 setMuonCuts();
31 setDiMuonCuts();
32 setElectronCuts();
33 setLooseMuonCuts();
34 setLooseElectronCuts();
35 setPlainElectronCuts();
36 for(unsigned int i=0;i<jets_.size();i++) jets.push_back(jets_[i]);
37 for(unsigned int i=0;i<muons_.size();i++) muons.push_back(muons_[i]);
38 for(unsigned int i=0;i<electrons_.size();i++) electrons.push_back(electrons_[i]);
39 for(unsigned int i=0;i<mets_.size();i++) mets.push_back(mets_[i]);
40 }
41
42 Selection::Selection(const Selection& s) {
43 // copy the objects
44 jets = s.jets;
45 electrons = s.electrons;
46 muons = s.muons;
47 mets = s.mets;
48 // copy the cutvalues
49 setJetCuts(s.JetPtThreshold_,s.JetEtaThreshold_,s.JetEMFThreshold_,s.n90HitsThreshold_,s.fHPDThreshold_,s.DRJetElectron_,s.DRJetMuon_);
50 setMuonCuts(s.MuonPtThreshold_,s.MuonEtaThreshold_,s.MuonRelIso_,s.MuonNofValidHits_,s.Muond0Cut_,s.MuonDRJetsCut_,s.MuonNMatches_,s.MuonDistVzPVz_,s.MuonNPixelLayersWithMeasurement_);
51 setDiMuonCuts(s.MuonPtThreshold_,s.MuonEtaThreshold_,s.MuonRelIso_,s.MuonNofValidHits_,s.Muond0Cut_,s.MuonDRJetsCut_);
52 setLooseMuonCuts(s.JetPtThreshold_,s.JetEtaThreshold_,s.MuonRelIso_);
53 setElectronCuts(s.ElectronEtThreshold_,s.ElectronEtaThreshold_,s.ElectronRelIso_,s.Electrond0Cut_,s.ElectronDistVzPVz_);
54 setLooseElectronCuts(s.ElectronEtThreshold_,s.ElectronEtaThreshold_,s.ElectronRelIso_);
55 setPlainElectronCuts(s.ElectronEtThreshold_,s.ElectronEtaThreshold_);
56 }
57
58 //______________________________________________________________________//
59
60 //____DESTRUCTOR________________________________________________________//
61
62 Selection::~Selection() {
63 jets.clear();
64 electrons.clear();
65 muons.clear();
66 mets.clear();
67 }
68
69 //______________________________________________________________________//
70
71
72 //____CUT INITIALISATION________________________________________________//
73
74 void Selection::setJetCuts(float Pt, float Eta, float EMF, float n90Hits, float fHPD, float dRJetElectron, float dRJetMuon) {
75 JetPtThreshold_ = Pt;
76 JetEtaThreshold_ = Eta;
77 JetEMFThreshold_ = EMF;
78 n90HitsThreshold_ = n90Hits;
79 fHPDThreshold_ = fHPD;
80 DRJetElectron_ = dRJetElectron;
81 DRJetMuon_ = dRJetMuon; // only used for PFlow without PF2PAT
82 }
83
84 void Selection::setJetCuts() {
85 setJetCuts(15.,2.4,0.01,1.,0.98,0.3,0.1); // refSelV4 values
86 }
87
88 void Selection::setElectronCuts(float Et, float Eta, float RelIso, float d0, float DistVzPVz) {
89 ElectronEtThreshold_ = Et;
90 ElectronEtaThreshold_ = Eta;
91 ElectronRelIso_ = RelIso;
92 Electrond0Cut_ = d0;
93 ElectronDistVzPVz_ = DistVzPVz;
94
95 // setup VBTF cuts (DO NOT TOUCH)
96 cutsVBTFWP70["sigmaIEtaIEta_B"]=0.01;
97 cutsVBTFWP70["deltaPhi_B"]=0.03;
98 cutsVBTFWP70["deltaETA_B"]=0.004;
99 cutsVBTFWP70["HoverE_B"]=0.025;
100 cutsVBTFWP70["sigmaIEtaIEta_E"]=0.03;
101 cutsVBTFWP70["deltaPhi_E"]=0.02;
102 cutsVBTFWP70["deltaETA_E"]=0.005;
103 cutsVBTFWP70["HoverE_E"]=0.025;
104
105 }
106
107 void Selection::setElectronCuts() {
108 setElectronCuts(20,2.4,0.1,0.02,1);
109 }
110
111 void Selection::setLooseElectronCuts(float Et, float Eta, float RelIso) {
112 ElectronLooseEtThreshold_ = Et;
113 ElectronLooseEtaThreshold_ = Eta;
114 ElectronLooseRelIso_ = RelIso;
115
116 // setup VBTF cuts (DO NOT TOUCH)
117 cutsVBTFWP95["sigmaIEtaIEta_B"]=0.01;
118 cutsVBTFWP95["deltaPhi_B"]=0.8;
119 cutsVBTFWP95["deltaETA_B"]=0.007;
120 cutsVBTFWP95["HoverE_B"]=0.15;
121 cutsVBTFWP95["sigmaIEtaIEta_E"]=0.03;
122 cutsVBTFWP95["deltaPhi_E"]=0.7;
123 cutsVBTFWP95["deltaETA_E"]=0.01;
124 cutsVBTFWP95["HoverE_E"]=0.07;
125 }
126
127 void Selection::setLooseElectronCuts() {
128 setLooseElectronCuts(15,2.5,0.2); // refSelV4 (mu) values
129 }
130
131 void Selection::setPlainElectronCuts(float Et, float Eta) {
132 ElectronLooseEtThreshold_ = Et;
133 ElectronLooseEtaThreshold_ = Eta;
134 }
135
136 void Selection::setPlainElectronCuts() {
137 setPlainElectronCuts(10,2.5);
138 }
139
140 void Selection::setMuonCuts(float Pt, float Eta, float RelIso, int NValidHits, float d0, float DRJets, int NMatches, float DistVzPVz, int NPixelLayersWithMeas) {
141 MuonPtThreshold_ = Pt;
142 MuonEtaThreshold_ = Eta;
143 MuonRelIso_ = RelIso;
144 MuonNofValidHits_ = NValidHits;
145 Muond0Cut_ = d0;
146 MuonDRJetsCut_ = DRJets;
147 MuonNMatches_ = NMatches;
148 MuonDistVzPVz_ = DistVzPVz;
149 MuonNPixelLayersWithMeasurement_ = NPixelLayersWithMeas;
150 }
151
152 void Selection::setMuonCuts() {
153 setMuonCuts(20,2.4,0.05,10,0.02,0.3,1,1,1); // refSelV4 values
154 }
155
156 void Selection::setDiMuonCuts(float Pt, float Eta, float RelIso, int NValidHits, float d0, float DRJets) {
157 MuonPtThreshold_ = Pt;
158 MuonEtaThreshold_ = Eta;
159 MuonRelIso_ = RelIso;
160 MuonNofValidHits_ = NValidHits;
161 Muond0Cut_ = d0;
162 MuonDRJetsCut_ = DRJets;
163 }
164
165 void Selection::setDiMuonCuts() {
166 setDiMuonCuts(20,2.4,0.15,10,0.02,0.3); // refSelV4 values
167 }
168
169 void Selection::setLooseMuonCuts(float Pt, float Eta, float RelIso) {
170 MuonLoosePtThreshold_ = Pt;
171 MuonLooseEtaThreshold_ = Eta;
172 MuonLooseRelIso_ = RelIso;
173 }
174
175 void Selection::setLooseMuonCuts() {
176 setLooseMuonCuts(10,2.5,0.2); // refSelV4 (mu+el) values
177 }
178
179 //______________________________________________________________________//
180
181 //__EXTRA METHODS_______________________________________________________//
182
183 bool passVBTFID(TRootElectron* el, std::map<std::string,float> cuts) {
184
185 //try the cuts manually
186 bool passvbtf = false;
187
188 float sigmaiEtaiEta = el->sigmaIEtaIEta();
189 float deltaPhi = el->deltaPhiIn();
190 float deltaETA = el->deltaEtaIn();
191 float HoverE = el->hadronicOverEm();
192
193 if (fabs(el->superClusterEta()) < 1.4442)
194 if (sigmaiEtaiEta < cuts["sigmaIEtaIEta_B"])
195 if (fabs(deltaPhi) < cuts["deltaPhi_B"])
196 if (fabs(deltaETA) < cuts["deltaETA_B"])
197 if (HoverE < cuts["HoverE_B"])
198 passvbtf=true;
199
200 if (fabs(el->superClusterEta()) > 1.5660)
201 if (sigmaiEtaiEta < cuts["sigmaIEtaIEta_E"])
202 if (fabs(deltaPhi) < cuts["deltaPhi_E"])
203 if (fabs(deltaETA) < cuts["deltaETA_E"])
204 if (HoverE < cuts["HoverE_E"])
205 passvbtf=true;
206
207 return passvbtf;
208
209 }
210
211 //______________________________________________________________________//
212
213 //____SELECTION GETTERS_________________________________________________//
214
215 // ______________JETS_________________________________________________//
216
217 std::vector<TRootJet*> Selection::GetSelectedJets(float PtThr, float EtaThr, bool applyJetID) const{
218 std::vector<TRootJet*> selectedJets;
219
220 for(unsigned int i=0;i<jets.size();i++){
221
222 TRootJet* init_jet = (TRootJet*) jets[i];
223
224 if (init_jet->jetType() == 1) { // CaloJets
225
226 const TRootCaloJet* CaloJet = static_cast<const TRootCaloJet*>(init_jet);
227
228 if(fabs(CaloJet->Eta())<EtaThr && CaloJet->Pt()>PtThr) {
229
230 if( applyJetID ) {
231 if ( CaloJet->ecalEnergyFraction() > JetEMFThreshold_) {
232 if (CaloJet->fHPD() < fHPDThreshold_ ) {
233 if (CaloJet->n90Hits()> n90HitsThreshold_ ) {
234 selectedJets.push_back(init_jet);
235 }
236 }
237 }
238 }
239 else selectedJets.push_back(init_jet);
240
241 }
242 }
243
244 else if (init_jet->jetType() == 2) { // PFJets
245
246 const TRootPFJet* PFJet = static_cast<const TRootPFJet*>(init_jet);
247
248 if(fabs(PFJet->Eta())<JetEtaThreshold_ && PFJet->Pt()>JetPtThreshold_)
249 if ( applyJetID ) {
250 if (PFJet->nConstituents() > 1 )
251 if (PFJet->chargedEmEnergyFraction() < 0.99 )
252 if (PFJet->neutralHadronEnergyFraction() < 0.99 )
253 if (PFJet->neutralEmEnergyFraction() < 0.99 )
254 if (fabs(PFJet->Eta()) >= 2.4 || PFJet->chargedHadronEnergyFraction() > 0)
255 if (fabs(PFJet->Eta()) >= 2.4 || PFJet->chargedMultiplicity() > 0)
256 selectedJets.push_back(init_jet);
257 } else selectedJets.push_back(init_jet);
258 }
259
260 else if (init_jet->jetType() == 3) { // JPTJets
261
262 const TRootJPTJet* JPTJet = static_cast<const TRootJPTJet*>(init_jet);
263
264 if(fabs(JPTJet->Eta())<JetEtaThreshold_ && JPTJet->Pt()>JetPtThreshold_)
265 if( applyJetID ) {
266 if ( JPTJet->ecalEnergyFraction() > JetEMFThreshold_) {
267 if (JPTJet->fHPD() < fHPDThreshold_ ) {
268 if (JPTJet->n90Hits()> n90HitsThreshold_ ) {
269 selectedJets.push_back(init_jet);
270 }
271 }
272 }
273 }
274 else selectedJets.push_back(init_jet);
275 }
276 }
277 std::sort(selectedJets.begin(),selectedJets.end(),HighestPt());
278 return selectedJets;
279 }
280
281 std::vector<TRootJet*> Selection::GetSelectedJets(float PtThr, float EtaThr, vector<TLorentzVector*> lepton, float dRLeptonJet, bool applyJetID) const {
282 std::vector<TRootJet*> init_jets = GetSelectedJets(PtThr,EtaThr,applyJetID);
283 std::vector<TRootJet*> selectedJets;
284 for (unsigned int i=0; i<init_jets.size(); i++) {
285 float minDrElJet = 9999999999.;
286 for (unsigned int j=0; j<lepton.size(); j++) {
287 TLorentzVector* l = (TLorentzVector*) lepton[j];
288 float dr = l->DeltaR(*init_jets[i]);
289 if ( dr < minDrElJet ) minDrElJet = dr;
290 }
291
292 if (minDrElJet >= dRLeptonJet)
293 selectedJets.push_back(init_jets[i]);
294 }
295 std::sort(selectedJets.begin(),selectedJets.end(),HighestPt());
296 return selectedJets;
297 }
298
299 std::vector<TRootJet*> Selection::GetSelectedJets(float PtThr, float EtaThr, vector<TRootMuon*> muons, float dRLeptonJet, bool applyJetID) const {
300 std::vector<TLorentzVector*> leptons;
301 for (unsigned int i=0; i<muons.size(); i++)
302 leptons.push_back((TLorentzVector*)muons[i]);
303 return GetSelectedJets(JetPtThreshold_,JetEtaThreshold_,leptons,DRJetMuon_,applyJetID);
304 }
305
306 std::vector<TRootJet*> Selection::GetSelectedJets(float PtThr, float EtaThr, vector<TRootElectron*> electrons, float dRLeptonJet, bool applyJetID) const {
307 std::vector<TLorentzVector*> leptons;
308 for (unsigned int i=0; i<electrons.size(); i++)
309 leptons.push_back((TLorentzVector*)electrons[i]);
310 return GetSelectedJets(JetPtThreshold_,JetEtaThreshold_,leptons,DRJetElectron_,applyJetID);
311 }
312
313 std::vector<TRootJet*> Selection::GetSelectedJets(vector<TRootMuon*> muons, bool applyJetID) const {
314 std::vector<TLorentzVector*> leptons;
315 for (unsigned int i=0; i<muons.size(); i++)
316 leptons.push_back((TLorentzVector*)muons[i]);
317 return GetSelectedJets(JetPtThreshold_,JetEtaThreshold_,leptons,DRJetMuon_,applyJetID);
318 }
319
320 std::vector<TRootJet*> Selection::GetSelectedJets(vector<TRootElectron*> electrons, bool applyJetID) const {
321 std::vector<TLorentzVector*> leptons;
322 for (unsigned int i=0; i<electrons.size(); i++)
323 leptons.push_back((TLorentzVector*)electrons[i]);
324 return GetSelectedJets(JetPtThreshold_,JetEtaThreshold_,leptons,DRJetElectron_,applyJetID);
325 }
326
327
328 std::vector<TRootJet*> Selection::GetSelectedJets(bool applyJetID) const{
329 return GetSelectedJets(JetPtThreshold_,JetEtaThreshold_,applyJetID);
330 }
331
332 std::vector<TRootJet*> Selection::GetSelectedBJets(const std::vector<TRootJet*>& seljets, int& btagAlgo, float& btagCut) const{
333 std::vector<TRootJet*> bjets;
334 Float_t btagDisc = 0;
335 for(unsigned int i = 0; i<seljets.size(); i++) {
336 if( btagAlgo == 0) btagDisc = seljets[i]->btag_trackCountingHighEffBJetTags();
337 else if(btagAlgo == 1) btagDisc = seljets[i]->btag_trackCountingHighPurBJetTags();
338 else if(btagAlgo == 2) btagDisc = seljets[i]->btag_jetProbabilityBJetTags();
339 else if(btagAlgo == 3) btagDisc = seljets[i]->btag_jetBProbabilityBJetTags();
340 else if(btagAlgo == 4) btagDisc = seljets[i]->btag_simpleSecondaryVertexHighEffBJetTags();
341 else if(btagAlgo == 5) btagDisc = seljets[i]->btag_simpleSecondaryVertexHighPurBJetTags();
342 else if(btagAlgo == 6) btagDisc = seljets[i]->btag_combinedSecondaryVertexBJetTags();
343 else btagDisc = -999999;
344 if(btagDisc>btagCut) bjets.push_back(seljets[i]);
345 }
346 return bjets;
347 }
348
349 // ______________MUONS________________________________________________//
350
351 std::vector<TRootMuon*> Selection::GetSelectedMuons(float PtThr, float EtaThr,float MuonRelIso) const{
352 std::vector<TRootMuon*> selectedMuons;
353 for(unsigned int i=0;i<muons.size();i++){
354 if(muons[i]->isGlobalMuon() && muons[i]->isTrackerMuon() && muons[i]->idGlobalMuonPromptTight()
355 && muons[i]->Pt()>PtThr
356 && fabs(muons[i]->Eta())<EtaThr
357 && muons[i]->relativeIso03() < MuonRelIso
358 && fabs(muons[i]->d0()) <Muond0Cut_
359 && muons[i]->nofValidHits()>MuonNofValidHits_
360 && muons[i]->nofMatches()>MuonNMatches_
361 && muons[i]->nofPixelLayersWithMeasurement() >= MuonNPixelLayersWithMeasurement_
362 ) {
363
364 selectedMuons.push_back(muons[i]);
365 }
366 }
367 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
368 return selectedMuons;
369 }
370
371 std::vector<TRootMuon*> Selection::GetSelectedMuons() const{
372 return GetSelectedMuons(MuonPtThreshold_,MuonEtaThreshold_,MuonRelIso_);
373 }
374
375 std::vector<TRootMuon*> Selection::GetSelectedMuons(float PtThr, float EtaThr,float MuonRelIso, vector<TRootJet*> selJets) const{
376 std::vector<TRootMuon*> selectedMuons;
377 std::vector<TRootMuon*> init_muons=GetSelectedMuons(PtThr,EtaThr,MuonRelIso);
378 for(unsigned int i=0;i<init_muons.size();i++){
379 float mindRMuJet = 999999.;
380 TRootJet* jet;
381 for(unsigned int j=0;j<selJets.size();j++) {
382 jet = selJets.at(j);
383 float dRMuJet = init_muons[i]->DeltaR(*jet);
384 if(dRMuJet < mindRMuJet) mindRMuJet = dRMuJet;
385 }
386 if(mindRMuJet > MuonDRJetsCut_){
387 selectedMuons.push_back(init_muons[i]);
388 }
389 }
390 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
391 return selectedMuons;
392 }
393
394 std::vector<TRootMuon*> Selection::GetSelectedMuons(float PtThr, float EtaThr, float MuonRelIso, TRootVertex* vertex, vector<TRootJet*> selJets) const {
395 std::vector<TRootMuon*> selectedMuons;
396 std::vector<TRootMuon*> init_muons=GetSelectedMuons(PtThr,EtaThr,MuonRelIso,selJets);
397 for(unsigned int i=0;i<init_muons.size();i++){
398 TRootMuon* mu = (TRootMuon*) init_muons[i];
399 if ( fabs(mu->vz() - vertex->Z()) < MuonDistVzPVz_) {
400 selectedMuons.push_back(init_muons[i]);
401 }
402 }
403 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
404 return selectedMuons;
405 }
406
407 std::vector<TRootMuon*> Selection::GetSelectedMuons(TRootVertex* vertex) const {
408 std::vector<TRootJet*> empty;
409 return GetSelectedMuons(MuonPtThreshold_,MuonEtaThreshold_,MuonRelIso_,vertex,empty);
410 }
411
412 std::vector<TRootMuon*> Selection::GetSelectedMuons(TRootVertex* vertex, vector<TRootJet*> selJets) const {
413 return GetSelectedMuons(MuonPtThreshold_,MuonEtaThreshold_,MuonRelIso_,vertex,selJets);
414 }
415
416 std::vector<TRootMuon*> Selection::GetSelectedDiMuons(float PtThr, float EtaThr,float MuonRelIso) const{
417 std::vector<TRootMuon*> selectedMuons;
418 for(unsigned int i=0;i<muons.size();i++){
419 if(muons[i]->isGlobalMuon() && muons[i]->isTrackerMuon() && muons[i]->idGlobalMuonPromptTight()
420 && muons[i]->Pt()>PtThr
421 && fabs(muons[i]->Eta())<EtaThr
422 && muons[i]->relativeIso03() < MuonRelIso
423 && fabs(muons[i]->d0()) <Muond0Cut_
424 && muons[i]->nofValidHits()>MuonNofValidHits_
425 ) {
426
427 selectedMuons.push_back(muons[i]);
428 }
429 }
430 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
431 return selectedMuons;
432 }
433
434 std::vector<TRootMuon*> Selection::GetSelectedDiMuons() const{
435 return GetSelectedDiMuons(MuonPtThreshold_,MuonEtaThreshold_,MuonRelIso_);
436 }
437
438 std::vector<TRootMuon*> Selection::GetSelectedDiMuons(float PtThr, float EtaThr,float MuonRelIso, vector<TRootJet*> selJets) const{
439 std::vector<TRootMuon*> selectedMuons;
440 std::vector<TRootMuon*> init_muons=GetSelectedDiMuons(PtThr,EtaThr,MuonRelIso);
441 for(unsigned int i=0;i<init_muons.size();i++){
442 float mindRMuJet = 999999.;
443 TRootJet* jet;
444 for(unsigned int j=0;j<selJets.size();j++) {
445 jet = selJets.at(j);
446 float dRMuJet = init_muons[i]->DeltaR(*jet);
447 if(dRMuJet < mindRMuJet) mindRMuJet = dRMuJet;
448 }
449 if(mindRMuJet > MuonDRJetsCut_){
450 selectedMuons.push_back(init_muons[i]);
451 }
452 }
453 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
454 return selectedMuons;
455 }
456
457
458
459 std::vector<TRootMuon*> Selection::GetSelectedLooseMuons(float PtThr, float EtaThr,float MuonRelIso) const{
460 std::vector<TRootMuon*> selectedMuons;
461 for(unsigned int i=0;i<muons.size();i++){
462 if(muons[i]->isGlobalMuon() && fabs(muons[i]->Eta())<EtaThr && muons[i]->Pt()>PtThr && muons[i]->relativeIso03() < MuonRelIso ) {
463
464 selectedMuons.push_back(muons[i]);
465 }
466 }
467 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
468 return selectedMuons;
469 }
470
471 std::vector<TRootMuon*> Selection::GetSelectedLooseMuons() const{
472 return GetSelectedLooseMuons(MuonLoosePtThreshold_, MuonLooseEtaThreshold_, MuonLooseRelIso_);
473 }
474
475 std::vector<TRootMuon*> Selection::GetSelectedMuonsNoID(float PtThr, float EtaThr,float MuonRelIso) const{
476 std::vector<TRootMuon*> selectedMuons;
477 for(unsigned int i=0;i<muons.size();i++){
478 if(fabs(muons[i]->Eta())<EtaThr && muons[i]->Pt()>PtThr && muons[i]->relativeIso03() < MuonRelIso){
479 selectedMuons.push_back(muons[i]);
480 }
481 }
482 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
483 return selectedMuons;
484 }
485
486 std::vector<TRootMuon*> Selection::GetSelectedMuonsInvIso(float PtThr, float EtaThr,float MuonRelIso) const{
487 std::vector<TRootMuon*> init_muons = GetSelectedMuons(PtThr,EtaThr,9999.);
488 std::vector<TRootMuon*> selectedMuons;
489 for(unsigned int i=0;i<init_muons.size();i++){
490 //Compute isolation
491 if(init_muons[i]->relativeIso03() > MuonRelIso )
492 selectedMuons.push_back(init_muons[i]);
493 }
494 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
495 return selectedMuons;
496 }
497
498 std::vector<TRootMuon*> Selection::GetSelectedMuonsInvIso(float PtThr, float EtaThr,float MuonRelIso, vector<TRootJet*> selJets) const{
499 std::vector<TRootMuon*> init_muons = GetSelectedMuonsInvIso(PtThr,EtaThr,MuonRelIso);
500 std::vector<TRootMuon*> selectedMuons;
501 for(unsigned int i=0;i<init_muons.size();i++){
502 float mindRMuJet = 999.;
503 for(unsigned int j=0;j<selJets.size();j++) {
504 float dRMuJet = init_muons[i]->DeltaR(*selJets.at(j));
505 if(dRMuJet < mindRMuJet) mindRMuJet = dRMuJet;
506 }
507 if(mindRMuJet> MuonDRJetsCut_){
508 selectedMuons.push_back(muons[i]);
509 }
510 }
511 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
512 return selectedMuons;
513 }
514
515 std::vector<TRootMuon*> Selection::GetSelectedMuonsNonIso(float PtThr, float EtaThr, vector<TRootJet*> selJets) const{
516 return GetSelectedMuons(PtThr,EtaThr,9999.,selJets);
517 }
518
519 std::vector<TRootMuon*> Selection::GetSelectedMuonsNonIso() const{
520 return GetSelectedMuons(MuonPtThreshold_,MuonEtaThreshold_,9999.);
521 }
522
523 std::vector<TRootMuon*> Selection::GetSelectedMuonsIsoRange(float PtThr, float EtaThr,float MuonRelIsoMin, float MuonRelIsoMax, vector<TRootJet*> selJets) const{
524 std::vector<TRootMuon*> init_muons = GetSelectedMuons(PtThr,EtaThr,9999.,selJets);
525 std::vector<TRootMuon*> selectedMuons;
526 for(unsigned int i=0;i<init_muons.size();i++){
527 //Compute isolation
528 if( MuonRelIsoMin < init_muons[i]->relativeIso03() && init_muons[i]->relativeIso03() < MuonRelIsoMax )
529 selectedMuons.push_back(muons[i]);
530 }
531 std::sort(selectedMuons.begin(),selectedMuons.end(),HighestPt());
532 return selectedMuons;
533 }
534
535 // ______________ELECTRONS____________________________________________//
536
537 std::vector<TRootElectron*> Selection::GetSelectedElectrons(float EtThr, float EtaThr, float ElectronRelIso) const {
538 std::vector<TRootElectron*> selectedElectrons;
539 //cout << ElectronRelIso << endl;
540 for(unsigned int i=0;i<electrons.size();i++){
541 TRootElectron* el = (TRootElectron*) electrons[i];
542 //Compute isolation
543 float RelIso = (el->caloIso(3)+el->trackerIso(3)) / el->Et();
544
545 //try the cuts manually
546 bool passvbtf = passVBTFID(el,cutsVBTFWP70);
547
548 // supercluster eta cut -> EB-EE transition region
549 if(el->Et() > EtThr && fabs(el->Eta())< EtaThr)
550 if ( fabs(el->superClusterEta()) > 1.5660 || fabs(el->superClusterEta()) < 1.4442 )
551 if ( fabs(el->d0()) < Electrond0Cut_ )
552 if ( RelIso < ElectronRelIso )
553 if (passvbtf)
554 if((fabs(el->Dist()) >= 0.02 || fabs(el->DCot()) >= 0.02) && el->missingHits() == 0)
555
556 selectedElectrons.push_back(electrons[i]);
557 }
558 std::sort(selectedElectrons.begin(),selectedElectrons.end(),HighestPt());
559 return selectedElectrons;
560 }
561
562 std::vector<TRootElectron*> Selection::GetSelectedElectrons() const{
563 return GetSelectedElectrons(ElectronEtThreshold_, ElectronEtaThreshold_, ElectronRelIso_);
564 }
565
566 std::vector<TRootElectron*> Selection::GetSelectedElectrons(TRootVertex* vertex) const{
567 return GetSelectedElectrons(ElectronEtThreshold_, ElectronEtaThreshold_, ElectronRelIso_,vertex);
568 }
569
570 std::vector<TRootElectron*> Selection::GetSelectedElectrons(float EtThr, float EtaThr, float ElectronRelIso, TRootVertex* vertex) const {
571 std::vector<TRootElectron*> init_electrons = GetSelectedElectrons(EtThr,EtaThr,ElectronRelIso);
572 std::vector<TRootElectron*> selectedElectrons;
573 for(unsigned int i=0;i<init_electrons.size();i++){
574 TRootElectron* el = (TRootElectron*) init_electrons[i];
575 if ( fabs(el->vz() - vertex->Z()) < ElectronDistVzPVz_) {
576 selectedElectrons.push_back(init_electrons[i]);
577 }
578 }
579
580 std::sort(selectedElectrons.begin(),selectedElectrons.end(),HighestPt());
581 return selectedElectrons;
582 }
583
584 std::vector<TRootElectron*> Selection::GetSelectedLooseElectrons(float EtThr, float EtaThr, float ElectronRelIso, bool vbtfid) const {
585 std::vector<TRootElectron*> selectedElectrons;
586 for(unsigned int i=0;i<electrons.size();i++){
587 TRootElectron* el = (TRootElectron*) electrons[i];
588 //Compute isolation
589 float RelIso = (el->caloIso(3)+el->trackerIso(3)) / el->Et();
590
591 //try the cuts manually
592 bool passvbtf = passVBTFID(el,cutsVBTFWP95);
593
594 if(el->Et() > EtThr && fabs(el->Eta()) < EtaThr && RelIso < ElectronRelIso)
595 if ( !vbtfid || ( vbtfid && fabs(el->superClusterEta()) > 1.5660 || fabs(el->superClusterEta()) < 1.4442 ) )
596 if (!vbtfid || (vbtfid && passvbtf))
597 selectedElectrons.push_back(electrons[i]);
598 }
599 std::sort(selectedElectrons.begin(),selectedElectrons.end(),HighestPt());
600 return selectedElectrons;
601 }
602
603 std::vector<TRootElectron*> Selection::GetSelectedLooseElectrons(bool vbtfid) const {
604 return GetSelectedLooseElectrons(ElectronLooseEtThreshold_, ElectronLooseEtaThreshold_, ElectronLooseRelIso_,vbtfid);
605 }
606
607
608 std::vector<TRootElectron*> Selection::GetSelectedPlainElectrons(float EtThr, float EtaThr) const {
609 std::vector<TRootElectron*> selectedPlainElectrons;
610 for(unsigned int i=0;i<electrons.size();i++){
611 TRootElectron* el = (TRootElectron*) electrons[i];
612 //Compute isolation
613
614
615 if(el->Et() > EtThr && fabs(el->Eta()) < EtaThr)
616
617 selectedPlainElectrons.push_back(electrons[i]);
618 }
619 std::sort(selectedPlainElectrons.begin(),selectedPlainElectrons.end(),HighestPt());
620 return selectedPlainElectrons;
621 }
622
623 //____________IS SELECTED_______________________________________________//
624
625 bool Selection::isPVSelected(const std::vector<TRootVertex*>& vertex, int NdofCut, float Zcut, float RhoCut){
626 if(vertex.size()==0) return false;
627 float Rho = sqrt(vertex[0]->x()*vertex[0]->x()+vertex[0]->y()*vertex[0]->y());
628 if(!vertex[0]->isFake() && vertex[0]->ndof()>NdofCut && abs(vertex[0]->z())<Zcut && Rho<RhoCut) return true;
629 return false;
630 }
631
632 bool Selection::isSelected(unsigned int Njets, bool Veto2ndLepton) const{
633 if(Veto2ndLepton){
634 if(GetSelectedMuons().size()==1 && GetSelectedElectrons().size()==0 && GetSelectedJets().size()>= Njets) return true;
635 }
636 else{
637 if(GetSelectedMuons().size()>0 && GetSelectedJets().size()>= Njets) return true;
638 }
639 return false;
640 }
641
642 bool Selection::isSelected(float JetPtThr, unsigned int Njets, bool Veto2ndLepton) const{
643 if(Veto2ndLepton){
644 if(GetSelectedMuons().size()==1 && GetSelectedElectrons().size()==0 && GetSelectedJets(JetPtThr, JetEtaThreshold_, JetEMFThreshold_).size()>= Njets) return true;
645 }
646 else{
647 if(GetSelectedMuons().size()>0 && GetSelectedJets(JetPtThr, JetEtaThreshold_, JetEMFThreshold_).size()>= Njets) return true;
648 }
649 return false;
650 }
651
652 bool Selection::isSelected(float PtThrJets, float EtaThrJets, float PtThrMuons, float EtaThrMuons, float MuonRelIso, float PtThrElectrons, float EtaThrElectrons, float ElectronRelIso, unsigned int Njets, bool Veto2ndLepton) const{
653 if(Veto2ndLepton){
654 if(GetSelectedMuons(PtThrMuons, EtaThrMuons, MuonRelIso, GetSelectedJets(PtThrJets, EtaThrJets, Njets)).size()==1 && GetSelectedElectrons(PtThrElectrons, EtaThrElectrons, ElectronRelIso).size()==0 && GetSelectedJets(PtThrJets, EtaThrJets, Njets).size()>=Njets) return true;
655 }
656 else{
657 if(GetSelectedMuons(PtThrMuons, EtaThrMuons, MuonRelIso, GetSelectedJets(PtThrJets, EtaThrJets, Njets)).size()>0 && GetSelectedJets(PtThrJets, EtaThrJets, Njets).size()>=Njets) return true;
658 }
659 return false;
660 }
661
662 //______________________________________________________________________//