ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/Selection/src/Selection.cc
Revision: 1.1.1.1 (vendor branch)
Committed: Thu Sep 8 13:33:18 2011 UTC (13 years, 8 months ago) by khahn
Content type: text/plain
Branch: kh
CVS Tags: v1
Changes since 1.1: +0 -0 lines
Log Message:

File Contents

# User Rev Content
1 khahn 1.1 #include "Selection.h"
2     #include "PassHLT.h"
3     #include "HZZCiCElectronSelection.h"
4     #include "RunLumiRangeMap.h"
5    
6     mithep::RunLumiRangeMap rlrm;
7    
8     void initRunLumiRangeMap() {
9     rlrm.AddJSONFile(std::string("./data/Cert_136033-149442_7TeV_Apr21ReReco_Collisions10_JSON.txt"));
10     rlrm.AddJSONFile(std::string("./data/Cert_160404-173244_7TeV_PromptReco_Collisions11_JSON_v2.txt"));
11     rlrm.AddJSONFile(std::string("./data/Cert_160404-163869_7TeV_May10ReReco_Collisions11_JSON_v3.txt"));
12     rlrm.AddJSONFile(std::string("./data/Cert_170249-172619_7TeV_ReReco5Aug_Collisions11_JSON.txt"));
13     };
14    
15     unsigned fails_HZZ4L_selection(ControlFlags &ctrl, // input control
16     mithep::TEventInfo *info, // input event inof
17     TClonesArray *electronArr, // input electrons
18     TClonesArray *muonArr, // input muons
19     TNtuple * passtuple ) {
20    
21     fails_HZZ4L_selection( ctrl, info, electronArr, muonArr, passtuple, NULL );
22    
23     };
24    
25     unsigned fails_HZZ4L_selection(ControlFlags &ctrl, // input control
26     mithep::TEventInfo *info, // input event inof
27     TClonesArray *electronArr, // input electrons
28     TClonesArray *muonArr, // input muons
29     LabVectors *l ) {
30    
31     fails_HZZ4L_selection( ctrl, info, electronArr, muonArr, NULL, l );
32    
33     };
34    
35    
36     unsigned fails_HZZ4L_selection(ControlFlags &ctrl, // input control
37     mithep::TEventInfo *info, // input event inof
38     TClonesArray *electronArr, // input electrons
39     TClonesArray *muonArr, // input muons
40     TNtuple * passtuple,
41     LabVectors * l ) { // output ntuple
42    
43     unsigned evtfail = 0x0;
44     double eventweight = info->eventweight;
45    
46     if( !ctrl.mc ) {
47     // not accounting for overlap atm
48     mithep::RunLumiRangeMap::RunLumiPairType rl(info->runNum, info->lumiSec);
49     if( !(rlrm.HasRunLumi(rl)) ) {
50     evtfail |= (1<<EVTFAIL_JSON);
51     return evtfail;
52     }
53     }
54    
55    
56     if( ctrl.debug ) {
57     cout << "Run: " << info->runNum
58     << "\tEvt: " << info->evtNum
59     << "\tLumi: " << info->lumiSec
60     << endl;
61     }
62    
63    
64     //********************************************************
65     // Trigger
66     //********************************************************
67     if( !ctrl.mc ) {
68     // if( !(passHLT(info->triggerBits, info->runNum, channel) ) ) {
69     if( !(passHLT(info->triggerBits, info->runNum, 999) ) ) {
70     evtfail |= (1<<EVTFAIL_TRIGGER);
71     return evtfail;
72     }
73     } else {
74     if( !(passHLTMC(info->triggerBits)) ) {
75     evtfail |= (1<<EVTFAIL_TRIGGER);
76     return evtfail;
77     }
78     // cout << "MC trigger bits: " << hex << info->triggerBits << dec << endl;
79     }
80    
81     if( ctrl.debug ) {
82     cout << "presel nlep: " << muonArr->GetEntries() + electronArr->GetEntries()
83     << "\tnmuon: " << muonArr->GetEntries()
84     << "\tnelectron: " << electronArr->GetEntries()
85     << endl;
86     }
87    
88     //********************************************************
89     // Lepton Selection
90     //********************************************************
91     vector<SimpleLepton> lepvec;
92    
93     //
94     cout << "\tnMuons: " << muonArr->GetEntries() << endl;
95     //----------------------------------------------------
96     for(Int_t i=0; i<muonArr->GetEntries(); i++) {
97     const mithep::TMuon *mu = (mithep::TMuon*)((*muonArr)[i]);
98     unsigned muonfail = passMuonSelectionZZ(mu);
99     if( ctrl.debug ) {
100     cout << "muon:: pt: " << mu->pt
101     << "\teta: " << mu->eta
102     << "\tmask: 0x" << hex << muonfail << dec
103     << endl;
104     }
105     if ( !muonfail ) {
106     SimpleLepton tmplep;
107     tmplep.vec.SetPtEtaPhiM(mu->pt,
108     mu->eta,
109     mu->phi,
110     105.658369e-3);
111     tmplep.type = 13;
112     tmplep.index = i;
113     tmplep.charge = mu->q;
114     tmplep.isoTrk = mu->trkIso03;
115     tmplep.isoEcal = mu->emIso03;
116     tmplep.isoHcal = mu->hadIso03;
117     tmplep.ip3dSig = mu->ip3dSig;
118     tmplep.is4l = false;
119     tmplep.isEB = (fabs(mu->eta) < 1.479 ? 1 : 0 );
120     lepvec.push_back(tmplep);
121     if( ctrl.debug ) { cout << "muon passes ... " << endl;}
122     }
123     }
124    
125     //
126     if( ctrl.debug ) { cout << "\tnElectron: " << electronArr->GetEntries() << endl; }
127     //----------------------------------------------------
128     for(Int_t i=0; i<electronArr->GetEntries(); i++) {
129     const mithep::TElectron *ele = (mithep::TElectron*)((*electronArr)[i]);
130    
131     Bool_t isMuonOverlap = kFALSE;
132     for (int k=0; k<lepvec.size(); ++k) {
133     TVector3 tmplep;
134     tmplep.SetPtEtaPhi(ele->pt, ele->eta, ele->phi);
135     if ( lepvec[k].type == 13 && lepvec[k].vec.Vect().DrEtaPhi(tmplep) < 0.1 ) {
136     cout << "-----> isMuonOverlap! " << endl;
137     isMuonOverlap = kTRUE;
138     break;
139     }
140     }
141    
142     CICStruct tightcuts = getTightCuts();
143     unsigned failsCIC = failsCicSelection(ele, tightcuts);
144     if( ctrl.debug ){
145     cout << "CIC category: " << cicCategory(ele)
146     << "\tfailmask : 0x" << hex << failsCIC << dec
147     << "\tscEt: " << ele->scEt
148     << "\tscEta: " << ele->scEta
149     << endl;
150     }
151     if ( !failsCIC && !isMuonOverlap ) {
152     SimpleLepton tmplep;
153     tmplep.vec.SetPtEtaPhiM( ele->pt,
154     ele->eta,
155     ele->phi,
156     0.51099892e-3 );
157     tmplep.type = 11;
158     tmplep.index = i;
159     tmplep.charge = ele->q;
160     tmplep.isoTrk = ele->trkIso03;
161     tmplep.isoEcal = ele->emIso03;
162     tmplep.isoHcal = ele->hadIso03;
163     tmplep.ip3dSig = ele->ip3dSig;
164     tmplep.is4l = false;
165     tmplep.isEB = ele->isEB;
166     lepvec.push_back(tmplep);
167     if( ctrl.debug ) { cout << "\telectron passes ... " << endl; }
168     }
169     }
170    
171     sort( lepvec.begin(), lepvec.end(), SimpleLepton::lep_pt_sort );
172    
173     int nmu=0, nele=0;
174     for( int i=0; i<lepvec.size(); i++ ) {
175     if( abs(lepvec[i].type) == 11 ) nele++;
176     else nmu++;
177     }
178     if( ctrl.debug ) {
179     cout << "postsel nlep: " << lepvec.size()
180     << "\tnmuon: " << nmu
181     << "\tnelectron: " << nele
182     << endl;
183     }
184    
185     //******************************************************************************
186     //Z1 Selection
187     //******************************************************************************
188     int Z1LeptonPlusIndex = -1;
189     int Z1LeptonMinusIndex = -1;
190     double BestZ1Mass = -999;
191     if( ctrl.debug ) { cout << "looking for a Z1 ..." << endl; }
192     for(int i = 0; i < lepvec.size(); ++i) {
193     for(int j = i+1; j < lepvec.size(); ++j) {
194     if( ctrl.debug ) { cout << "\tconsidering leptons " << i << " & " << j << endl; }
195     if (!(lepvec[i].vec.Pt() > 20.0 || lepvec[j].vec.Pt() > 20.0)) continue;
196     if( ctrl.debug ) { cout << "\tat least one is > 20 GeV" << endl; }
197     if (!(lepvec[i].vec.Pt() > 10.0 && lepvec[j].vec.Pt() > 10.0)) continue;
198     if( ctrl.debug ) { cout << "\tthe other is > 10 GeV" << endl; }
199     if (lepvec[i].charge == lepvec[j].charge) continue;
200     if( ctrl.debug ) { cout << "\tthey're opposite charge" << endl; }
201     if (fabs(lepvec[i].type) != fabs(lepvec[j].type)) continue;
202     if( ctrl.debug ) { cout << "\tthey're same flavor" << endl; }
203    
204     //Make Z1 hypothesis
205     TLorentzVector leptonPlus, leptonMinus;
206     if ( lepvec[i].charge > 0 ) {
207     leptonPlus = lepvec[i].vec;
208     leptonMinus = lepvec[j].vec;
209     } else {
210     leptonPlus = lepvec[j].vec;
211     leptonMinus = lepvec[i].vec;
212     }
213    
214     float tmpZ1Mass = (leptonPlus+leptonMinus).M();
215     cout << "Z1 selection, tmpZ1Mass: " << tmpZ1Mass << endl;
216     if( tmpZ1Mass > 60 ) {
217     if (fabs(tmpZ1Mass - 91.1876) < fabs(BestZ1Mass - 91.1876)) {
218     BestZ1Mass = tmpZ1Mass;
219     cout << "Z1 selection, new BestZ1Mass: " << BestZ1Mass
220     << "\tdM: " << fabs(BestZ1Mass - 91.1876)
221     << endl;
222     if (lepvec[i].charge > 0) {
223     Z1LeptonPlusIndex = i;
224     Z1LeptonMinusIndex = j;
225     } else {
226     Z1LeptonPlusIndex = j;
227     Z1LeptonMinusIndex = i;
228     }
229     }
230     }
231     }
232     }
233     // stop if no Z1 candidate is found
234     if( BestZ1Mass < 0 ) {
235     evtfail |= (1<<EVTFAIL_Z1);
236     return evtfail;
237     }
238     cout << "\tgot a Z1 ... run: " << info->runNum << "\tevt: " << info->evtNum << endl;
239     cout << "\tZ1 plusindex: " << Z1LeptonPlusIndex << "\tminusindex: " << Z1LeptonMinusIndex << endl;
240     TLorentzVector Z1LeptonPlus = lepvec[Z1LeptonPlusIndex].vec;
241     TLorentzVector Z1LeptonMinus = lepvec[Z1LeptonMinusIndex].vec;
242     TLorentzVector Z1Candidate = Z1LeptonPlus + Z1LeptonMinus;
243     if( l != NULL ) {
244     l->vecz1 = Z1Candidate;
245     l->vecl1p = Z1LeptonPlus;
246     l->vecl1m = Z1LeptonMinus;
247     }
248    
249     //******************************************************************************
250     // Z1 + l
251     //******************************************************************************
252     if( lepvec.size() < 3 ) {
253     evtfail |= (1<<EVTFAIL_Z1_PLUSL);
254     return evtfail;
255     }
256    
257     //******************************************************************************
258     // 4l/Z2 Selection
259     //******************************************************************************
260     Int_t Z2LeptonPlusIndex = -1;
261     Int_t Z2LeptonMinusIndex = -1;
262     Double_t BestZ2Mass = -1;
263     cout << "looking for a Z2 ... out of " << lepvec.size() << " leptons" <<endl;
264     for(int i = 0; i < lepvec.size(); ++i) {
265     for(int j = i+1; j < lepvec.size(); ++j) {
266     // cout << "i: " << i << "\tj: " << j << endl;
267     if (i == Z1LeptonPlusIndex || i == Z1LeptonMinusIndex) {
268     // cout << "\ti matches a Z1 index, skipping ..." << endl;
269     continue; //skip Z1 leptons
270     }
271     if (j == Z1LeptonPlusIndex || j == Z1LeptonMinusIndex) {
272     // cout << "\tj matches a Z1 index, skipping ..." << endl;
273     continue; //skip Z1 leptons
274     }
275     if (lepvec[i].charge == lepvec[j].charge) {
276     // cout << "\ti and j are same sign, skipping ..." << endl;
277     continue; //require opp sign
278     }
279     if (fabs(lepvec[i].type) != fabs(lepvec[j].type)) {
280     // cout << "\ti and j are not same flavor, skipping ..." << endl;
281     continue; //require same flavor
282     }
283    
284    
285     //Make Z2 hypothesis
286     TLorentzVector leptonPlus, leptonMinus;
287    
288     if (lepvec[i].charge > 0 ) {
289     leptonPlus = lepvec[i].vec;
290     leptonMinus = lepvec[j].vec;
291     } else {
292     leptonPlus = lepvec[j].vec;
293     leptonMinus = lepvec[i].vec;
294     }
295    
296     TLorentzVector dilepton = leptonPlus+leptonMinus;
297     TLorentzVector fourLepton = Z1Candidate + dilepton;
298    
299     cout << "dilepton.M() : " << dilepton.M() << endl;
300     cout << "fourLepton.M() : " << fourLepton.M() << endl;
301    
302     if (!(dilepton.M() > 12.0)) continue;
303     if (!(fourLepton.M() > 100.0)) continue;
304    
305    
306     //for 4e and 4mu, require at least 1 of the other opp sign lepton pairs have mass > 12
307     if (fabs(lepvec[i].type) == fabs(lepvec[Z1LeptonPlusIndex].type)) {
308     TLorentzVector pair1 = Z1LeptonPlus+leptonMinus;
309     TLorentzVector pair2 = Z1LeptonMinus+leptonPlus;
310     cout << "pair1: " << pair1.M() << "\tpair2: "<< pair2.M() << endl;
311     if (!(pair1.M() > 12 || pair2.M() > 12)) continue;
312     }
313    
314     //Disambiguiation is done by choosing the pair with the largest ptMax and largest ptMin
315     if (Z2LeptonPlusIndex < 0) {
316     if (lepvec[i].charge > 0) {
317     Z2LeptonPlusIndex = i;
318     Z2LeptonMinusIndex = j;
319     } else {
320     Z2LeptonPlusIndex = j;
321     Z2LeptonMinusIndex = i;
322     }
323     } else {
324     Double_t BestPairPtMax = lepvec[Z2LeptonPlusIndex].vec.Pt();
325     Double_t BestPairPtMin = lepvec[Z2LeptonMinusIndex].vec.Pt();
326     if (lepvec[Z2LeptonMinusIndex].vec.Pt() > BestPairPtMax) {
327     BestPairPtMax = lepvec[Z2LeptonMinusIndex].vec.Pt();
328     BestPairPtMin = lepvec[Z2LeptonPlusIndex].vec.Pt();
329     }
330    
331     Double_t CurrentPairPtMax = lepvec[i].vec.Pt();
332     Double_t CurrentPairPtMin = lepvec[j].vec.Pt();
333     if (lepvec[j].vec.Pt() > CurrentPairPtMax) {
334     CurrentPairPtMax = lepvec[j].vec.Pt();
335     CurrentPairPtMin = lepvec[i].vec.Pt();
336     }
337    
338     if (CurrentPairPtMax > BestPairPtMax) {
339     if (lepvec[i].charge > 0) {
340     Z2LeptonPlusIndex = i;
341     Z2LeptonMinusIndex = j;
342     } else {
343     Z2LeptonPlusIndex = j;
344     Z2LeptonMinusIndex = i;
345     }
346     } else if (CurrentPairPtMax == BestPairPtMax) {
347     if (CurrentPairPtMin > BestPairPtMin) {
348     if (lepvec[i].charge > 0) {
349     Z2LeptonPlusIndex = i;
350     Z2LeptonMinusIndex = j;
351     } else {
352     Z2LeptonPlusIndex = j;
353     Z2LeptonMinusIndex = i;
354     }
355     }
356     }
357     }
358     }
359     }
360    
361     // stop if no Z2 candidate is found
362     if (Z2LeptonPlusIndex == -1) {
363     evtfail |= ( 1<<EVTFAIL_4L );
364     return evtfail;
365     // h_evtfail->Fill( evtfail );
366     // cout << "evtfail: " << hex << evtfail << dec << endl;
367     // continue;
368     }
369     cout << "\tgot a Z2 ..." << endl;
370     cout << "\tZ2 plusindex: " << Z2LeptonPlusIndex << "\tminusindex: " << Z2LeptonMinusIndex << endl;
371     TLorentzVector Z2LeptonPlus = lepvec[Z2LeptonPlusIndex].vec;
372     TLorentzVector Z2LeptonMinus = lepvec[Z2LeptonMinusIndex].vec;
373     TLorentzVector Z2Candidate = Z2LeptonPlus+Z2LeptonMinus;
374     TLorentzVector ZZSystem = Z1Candidate + Z2Candidate;
375     if( l != NULL ) {
376     l->vecz2 = Z2Candidate;
377     l->vecl2p = Z2LeptonPlus;
378     l->vecl2m = Z2LeptonMinus;
379     l->vec4l = ZZSystem;
380     }
381     lepvec[Z1LeptonPlusIndex].is4l = true;
382     lepvec[Z1LeptonMinusIndex].is4l = true;
383     lepvec[Z2LeptonPlusIndex].is4l = true;
384     lepvec[Z2LeptonMinusIndex].is4l = true;
385    
386     //***************************************************************
387     // Isolation
388     //***************************************************************
389     bool failiso=false;
390    
391     /*
392     int i,j;
393     i=Z1LeptonPlusIndex;
394     j=Z1LeptonMinusIndex;
395     float RIso1 = (lepvec[i].isoTrk+lepvec[i].isoEcal+lepvec[i].isoHcal)/lepvec[i].vec.Pt();
396     float RIso2 = (lepvec[j].isoTrk+lepvec[j].isoEcal+lepvec[j].isoHcal)/lepvec[j].vec.Pt();
397     float comboIso12 = RIso1 + RIso2;
398     i=Z2LeptonPlusIndex;
399     j=Z2LeptonMinusIndex;
400     float RIso3 = (lepvec[i].isoTrk+lepvec[i].isoEcal+lepvec[i].isoHcal)/lepvec[i].vec.Pt();
401     float RIso4 = (lepvec[j].isoTrk+lepvec[j].isoEcal+lepvec[j].isoHcal)/lepvec[j].vec.Pt();
402     float comboIso34 = RIso3 + RIso4;
403     if( comboIso12 > 0.35 || comboIso34 > 0.35 ) {
404     failiso = true;
405     }
406     */
407    
408     float rho = info->PileupEnergyDensity;
409     for( int i=0; i<lepvec.size(); i++ ) {
410     if( !(lepvec[i].is4l) ) continue;
411     float effArea_ecal_i, effArea_hcal_i;
412     if( lepvec[i].isEB ) {
413     if( lepvec[i].type == 11 ) {
414     effArea_ecal_i = 0.101;
415     effArea_hcal_i = 0.021;
416     } else {
417     effArea_ecal_i = 0.074;
418     effArea_hcal_i = 0.022;
419     }
420     } else {
421     if( lepvec[i].type == 11 ) {
422     effArea_ecal_i = 0.046;
423     effArea_hcal_i = 0.040;
424     } else {
425     effArea_ecal_i = 0.045;
426     effArea_hcal_i = 0.030;
427     }
428     }
429     float isoEcal_corr_i = lepvec[i].isoEcal - (effArea_ecal_i*rho);
430     float isoHcal_corr_i = lepvec[i].isoHcal - (effArea_hcal_i*rho);
431     for( int j=i+1; j<lepvec.size(); j++ ) {
432     if( !(lepvec[j].is4l) ) continue;
433     float effArea_ecal_j, effArea_hcal_j;
434     if( lepvec[j].isEB ) {
435     if( lepvec[j].type == 11 ) {
436     effArea_ecal_j = 0.101;
437     effArea_hcal_j = 0.021;
438     } else {
439     effArea_ecal_j = 0.074;
440     effArea_hcal_j = 0.022;
441     }
442     } else {
443     if( lepvec[j].type == 11 ) {
444     effArea_ecal_j = 0.046;
445     effArea_hcal_j = 0.040;
446     } else {
447     effArea_ecal_j = 0.045;
448     effArea_hcal_j = 0.030;
449     }
450     }
451     float isoEcal_corr_j = lepvec[j].isoEcal - (effArea_ecal_j*rho);
452     float isoHcal_corr_j = lepvec[j].isoHcal - (effArea_hcal_j*rho);
453     float RIso_i = (lepvec[i].isoTrk+isoEcal_corr_i+isoHcal_corr_i)/lepvec[i].vec.Pt();
454     float RIso_j = (lepvec[j].isoTrk+isoEcal_corr_j+isoHcal_corr_j)/lepvec[j].vec.Pt();
455     float comboIso = RIso_i + RIso_j;
456     if( info->evtNum == 1038911933 ) {
457     float tmpdR = lepvec[i].vec.DrEtaPhi(lepvec[j].vec);
458     cout << "i: " << i
459     << "\tdR: " << tmpdR
460     << "\trho: " << rho
461     << "\tRIso_i: " << RIso_i
462     << "\ttkrel: " << lepvec[i].isoTrk/lepvec[i].vec.Pt()
463     << "\tecalrel: " << lepvec[i].isoEcal/lepvec[i].vec.Pt()
464     << "\tecalrelcor: " << isoEcal_corr_i/lepvec[i].vec.Pt()
465     << "\thcalrel: " << lepvec[i].isoHcal/lepvec[i].vec.Pt()
466     << "\thcalrelcor: " << isoHcal_corr_i/lepvec[i].vec.Pt()
467     << "\tpt_i: " << lepvec[i].vec.Pt()
468     << "\tj: " << j
469     << "\tRIso_j: " << RIso_j
470     << "\ttkrel: " << lepvec[j].isoTrk/lepvec[j].vec.Pt()
471     << "\tecalrel: " << lepvec[j].isoEcal/lepvec[j].vec.Pt()
472     << "\tecalrelcor: " << isoEcal_corr_j/lepvec[j].vec.Pt()
473     << "\thcalrel: " << lepvec[j].isoHcal/lepvec[j].vec.Pt()
474     << "\thcalrelcor: " << isoHcal_corr_j/lepvec[j].vec.Pt()
475     << "\tpt_j: " << lepvec[j].vec.Pt()
476     << "\tcombo: " << comboIso
477     << endl;
478     cout.flush();
479     }
480     if( comboIso > 0.35 ) {
481     cout << "combo failing for indices: " << i << "," << j << endl;
482     failiso = true;
483     // break;
484     }
485     }
486     }
487     if( failiso ) {
488     evtfail |= ( 1<<EVTFAIL_ISOLATION );
489     return evtfail;
490     //h_evtfail->Fill( evtfail, eventweight );
491     // h_evtfail->Fill( evtfail );
492     // cout << "evtfail: " << hex << evtfail << dec << endl;
493     // continue;
494     }
495    
496     //***************************************************************
497     // IP significance
498     //***************************************************************
499     bool failip = false;
500     for( int i=0; i<lepvec.size(); i++ ) {
501     if( !(lepvec[i].is4l) ) continue;
502     if( lepvec[i].ip3dSig > 4 ) {
503     failip=true;
504     break;
505     }
506     }
507     if( failip ) {
508     evtfail |= (1<<EVTFAIL_IP );
509     return evtfail;
510     //h_evtfail->Fill( evtfail, eventweight );
511     // h_evtfail->Fill( evtfail );
512     // cout << "evtfail: " << hex << evtfail << dec << endl;
513     // continue;
514     }
515    
516     //***************************************************************
517     // remaining kinematic cuts
518     //***************************************************************
519     if ( Z1Candidate.M() > 120 ||
520     Z2Candidate.M() < 20 ||
521     Z2Candidate.M() > 120 ||
522     !(lepvec[Z1LeptonPlusIndex].vec.Pt() > 20.0 || lepvec[Z1LeptonMinusIndex].vec.Pt() > 20.0) ||
523     !(lepvec[Z1LeptonPlusIndex].vec.Pt() > 10.0 && lepvec[Z1LeptonMinusIndex].vec.Pt() > 10.0)
524     ) {
525     evtfail |= (1<<EVTFAIL_KINEMATICS );
526     return evtfail;
527     //h_evtfail->Fill( evtfail, eventweight );
528     // h_evtfail->Fill( evtfail );
529     // cout << "evtfail: " << hex << evtfail << dec << endl;
530     // continue;
531     }
532    
533     int channel;
534     if( lepvec[Z1LeptonMinusIndex].type == 11 && lepvec[Z2LeptonMinusIndex].type == 11 ) channel=0;
535     if( lepvec[Z1LeptonMinusIndex].type == 13 && lepvec[Z2LeptonMinusIndex].type == 13 ) channel=1;
536     if( (lepvec[Z1LeptonMinusIndex].type == 11 && lepvec[Z2LeptonMinusIndex].type == 13) ||
537     (lepvec[Z1LeptonMinusIndex].type == 13 && lepvec[Z2LeptonMinusIndex].type == 11)) channel=2;
538    
539    
540    
541     if( passtuple != NULL ) {
542     passtuple->Fill( info->runNum,
543     info->evtNum,
544     info->lumiSec,
545     channel,
546     Z1Candidate.M(),
547     Z2Candidate.M(),
548     ZZSystem.M(),
549     ZZSystem.Pt(),
550     eventweight);
551     }
552    
553     cout << "run: " << info->runNum
554     << "\tevt: " << info->evtNum
555     << "\tZ1channel: " << lepvec[Z1LeptonMinusIndex].type
556     << "\tZ2channel: " << lepvec[Z2LeptonMinusIndex].type
557     << "\tmZ1: " << Z1Candidate.M()
558     << "\tmZ2: " << Z2Candidate.M()
559     << "\tm4l: " << ZZSystem.M()
560     << "\tevtfail: " << hex << evtfail << dec
561     << "\ttrigbits: " << hex << info->triggerBits << dec
562     // << "\ttree: " << inputFiles[q][f]
563     << endl;
564    
565     return evtfail;
566    
567     }
568    
569    
570    
571    
572