ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/LeptonSelection/src/MuonSelection.cc
(Generate patch)

Comparing UserCode/MitHzz4l/LeptonSelection/src/MuonSelection.cc (file contents):
Revision 1.3 by anlevin, Wed Feb 29 10:10:18 2012 UTC vs.
Revision 1.9 by khahn, Tue May 1 16:38:35 2012 UTC

# Line 1 | Line 1
1   #include <math.h>
2   #include <iostream>
3  
4 #include "HiggsAnaDefs.hh"
5
4   #include "MuonSelection.h"
5   #include "ParseArgs.h"
6   #include "SelectionStatus.h"
7  
8 < SelectionStatus noPreSelection( ControlFlags &ctrl,  const mithep::TMuon * mu ) {
8 > #include "Track.h"
9 > #include "MuonTools.h"
10 > #include "MuonQuality.h"
11 > #include "MuonIDMVA.h"
12 >
13 > mithep::MuonIDMVA * muIDMVA;
14 > mithep::MuonTools muTools;
15 >
16 > extern Float_t computePFMuonIso(const mithep::Muon *mu,
17 >                        const mithep::Vertex & vtx,
18 >                        const mithep::Array<mithep::PFCandidate> * pfCandidates,
19 >                        const Double_t dRMax);
20 >
21 > //--------------------------------------------------------------------------------------------------
22 > SelectionStatus muonDummyVeto(ControlFlags &ctrl,
23 >                              const mithep::Muon *muon,
24 >                              const mithep::Vertex &vtx)
25 > //--------------------------------------------------------------------------------------------------
26 > {
27 >  SelectionStatus status;
28 >  status.setStatus(SelectionStatus::PRESELECTION);
29 >  return status;  
30 > }
31 >
32 > //--------------------------------------------------------------------------------------------------
33 > SelectionStatus muonCutBasedVeto(ControlFlags &ctrl,
34 >                                 const mithep::Muon *muon,
35 >                                 const mithep::Vertex &vtx)
36 > //--------------------------------------------------------------------------------------------------
37 > {
38 >  //
39 >  // Loose cut-based ID for isolation veto
40 >  //
41 >  bool ret = true;
42 >  
43 >  if(!(muon->IsGlobalMuon() || muon->IsTrackerMuon())) ret = false;
44 >  if( muon->NValidHits() < 11 )                        ret = false;
45 >  if( fabs(muon->Ip3dPVSignificance()) >= 4 )          ret = false;
46 >
47 >  SelectionStatus status;
48 >  if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
49 >  return status;
50 > }
51 >
52 >
53 > //--------------------------------------------------------------------------------------------------
54 > SelectionStatus noPreSelection( ControlFlags &ctrl,  const mithep::Muon * mu )
55 >
56 > //--------------------------------------------------------------------------------------------------
57 > {
58          SelectionStatus status;
59          status.setStatus(SelectionStatus::PRESELECTION);
60          if(ctrl.debug) cout << "muon presel returning status : " << status.getStatus() << endl;
61          return status;
62   }
63  
64 < SelectionStatus muonPreSelection( ControlFlags &ctrl,  const mithep::TMuon * mu ) {
64 > //--------------------------------------------------------------------------------------------------
65 > SelectionStatus muonPreSelection( ControlFlags &ctrl,  
66 >                                  const mithep::Muon * mu,
67 >                                  const mithep::Vertex & vtx,
68 >                                  const mithep::Array<mithep::PFCandidate> * pfCandidates )
69 > //--------------------------------------------------------------------------------------------------
70 > {
71 >  bool ret = true;
72    if(ctrl.debug) cout << "inside muonpresel ... " << endl;
73 <  bool ret = isMuFO(mu);
73 >  //  bool ret = isMuFO(mu,vtx,pfCandidates);
74    if(ctrl.debug) cout << "iS fo? ... " << ret << endl;  
75 <  ret &= ( fabs(mu->ip3dSig) < 4 );
76 <  if(ctrl.debug) cout << "and pass IP (" << mu->ip3dSig << ") ? ... " << ret << endl;  
77 <  ret &= ( mu->pt > 5 );
78 <  if(ctrl.debug) cout << "and >5 GeV ? ... " << ret << endl;  
79 <  ret &= ( fabs(mu->eta) < 2.4 );
80 <  if(ctrl.debug) cout << "and < 2.4 eta ? ... " << ret << endl;  
75 >  ret &= ( fabs(mu->Ip3dPVSignificance()) < 4 );
76 >  if(ctrl.debug) cout << "and pass IP (" << mu->Ip3dPVSignificance() << ") ? ... " << ret << endl;  
77 >  ret &= ( mu->Pt() > 5 );
78 >  if(ctrl.debug) cout << "and >5 GeV (" << mu->Pt() << ") ? ... " << ret << endl;  
79 >  ret &= ( fabs(mu->Eta()) <= 2.4 );
80 >  if(ctrl.debug) cout << "and < 2.4 eta (" << mu->Eta() << ")? ... " << ret << endl;  
81 >  ret &=  (mu->IsTrackerMuon() && mu->HasTrackerTrk() &&
82 >           (mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated));
83 >  if(ctrl.debug) cout << "and isTrackerMuon ? ... " << ret << endl;  
84 >  //  ret &=  (mu->IsoR03SumPt()/mu->Pt() < 0.7 );
85 >  ret &=  (mu->IsoR03SumPt()/mu->Pt() < 0.7 );
86 >  if(ctrl.debug) cout << "and loose trk iso ? ... " << ret << endl;  
87  
88    SelectionStatus status;
89    if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
# Line 31 | Line 91 | SelectionStatus muonPreSelection( Contro
91    return status;
92   }
93  
94 < bool isMuFO( const mithep::TMuon * mu ) {
94 >
95 > //--------------------------------------------------------------------------------------------------
96 > bool isMuFO( const mithep::Muon * mu,
97 >             const mithep::Vertex & vtx,
98 >             const mithep::Array<mithep::PFCandidate> * pfCandidates )
99 > //--------------------------------------------------------------------------------------------------
100 > {
101    bool isgood=true;
102 <  float reliso = mu->pfIso03/mu->pt;
102 >  float reliso = computePFMuonIso(mu,vtx,pfCandidates,0.3)/mu->Pt();
103  
104 <  if( mu->pt < 5  )         isgood=false;                          
105 <  if ( fabs(mu->dz) > 0.2 ) isgood=false;   // needed to remove cosmics in HF sample
104 >  if( mu->Pt() < 5  )         isgood=false;                          
105 >  if ( fabs(mu->BestTrk()->DzCorrected(vtx)) > 0.2 ) isgood=false;   // needed to remove cosmics in HF sample
106  
107    //
108  
109    // HF seems to not want tkquality, SS does
110 <  if( mu->pt>20 ) {
111 <    if ( !((mu->typeBits & kGlobal) && mu->nSeg>0  ) ) isgood=false; //&& mu->nValidHits>0
110 >  if( mu->Pt()>20 ) {
111 >    if ( !((mu->IsGlobalMuon()) && mu->NSegments()>0  ) ) isgood=false; //&& mu->nValidHits>0
112    } else {
113 <    if ( !((mu->typeBits & kGlobal) && mu->nSeg>0 ) //&& //&& mu->nValidHits>0
114 <         && !( (mu->typeBits & kTracker) &&  (mu->qualityBits & kTMOneStationLoose)
113 >    if ( !((mu->IsGlobalMuon()) && mu->NSegments()>0 ) //&& //&& mu->nValidHits>0
114 >         && !( (mu->IsTrackerMuon()) &&  (mu->Quality().QualityMask().Mask() & muTools.kTMOneStationLoose)
115                 )
116           )   isgood=false;
117    }
# Line 64 | Line 130 | bool isMuFO( const mithep::TMuon * mu )
130  
131  
132    // comment for more stats for mu fake shape
133 <  if( mu->pt < 20 ) {
133 >  if( mu->Pt() < 20 ) {
134      if( reliso > 3 ) isgood=false;    
135    } else {
136      if( reliso > 5 ) isgood=false;    
# Line 73 | Line 139 | bool isMuFO( const mithep::TMuon * mu )
139    return isgood;
140   };
141  
142 <
143 < SelectionStatus passSoftMuonSelection( ControlFlags &ctrl, const mithep::TMuon * mu ) {
142 > //--------------------------------------------------------------------------------------------------
143 > SelectionStatus passSoftMuonSelection( ControlFlags &ctrl,
144 >                                       const mithep::Muon * mu ,
145 >                                       const mithep::Vertex & vtx)
146 > //--------------------------------------------------------------------------------------------------
147 > {
148  
149    int level=0;
150    unsigned failmask=0x0;
151    
152 <  if(mu->nTkHits < 11 )  
152 >  // Use tracker track when available
153 >  const mithep::Track *muTrk=0;
154 >  if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
155 >  else if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk(); }
156 >  else if(mu->HasGlobalTrk())     { muTrk = mu->GlobalTrk(); }
157 >  assert(muTrk);                  
158 >
159 >  if(mu->TrackerTrk()->NHits() < 11 )  
160      failmask |= (1<<level);
161    level++;
162  
163 <  if(fabs(mu->d0) > 0.2)
163 >  if(fabs(muTrk->D0Corrected(vtx)) > 0.2)
164      failmask |= (1<<level);
165    level++;
166  
167 <  if(fabs(mu->dz) > 0.1)
167 >  if(fabs(muTrk->DzCorrected(vtx)) > 0.1)
168      failmask |= (1<<level);
169    level++;
170  
171 <  if(!(mu->typeBits & kTracker))
171 >  if(!(mu->IsTrackerMuon()))
172      failmask |= (1<<level);
173    level++;
174  
175 <  if(!(mu->qualityBits & kTMLastStationAngTight))
175 >  //  if(!(mu->Quality().QualityMask().Mask() & muTools.kTMLastStationAngTight))
176 >  if(!(mu->Quality().QualityMask().Mask() & muTools.kTMLastStationTight))
177      failmask |= (1<<level);      
178    level++;
179  
180 <  Double_t iso = (mu->trkIso03 + mu->emIso03 + mu->hadIso03)/mu->pt;
181 <  if(mu->pt>20 && iso<0.1)
180 >  Double_t iso = (mu->IsoR03SumPt() + mu->IsoR03EmEt() + mu->IsoR03HadEt())/mu->Pt();
181 >  if(mu->Pt()>20 && iso<0.1)
182      failmask |= (1<<level);
183  
184    bool passtight  = !(failmask);
# Line 109 | Line 187 | SelectionStatus passSoftMuonSelection( C
187    
188   }
189  
190 <
190 > //--------------------------------------------------------------------------------------------------
191   //unsigned passMuonSelectionZZ( const mithep::TMuon * mu ) {
192 < SelectionStatus passMuonSelectionZZ( ControlFlags &ctrl, const mithep::TMuon * mu ) {
192 > SelectionStatus passMuonSelectionZZ( ControlFlags &ctrl, const mithep::Muon * mu )
193 > //--------------------------------------------------------------------------------------------------
194 > {
195    int level=0;
196    unsigned failmask=0x0;
197  
198 <  if(mu->pt < 5) {
198 >  if(mu->Pt() < 5) {
199      failmask |= (1<<level);
200    }
201  
202    level++;
203 <  if(fabs(mu->eta) > 2.4) {
203 >  if(fabs(mu->Eta()) > 2.4) {
204      failmask |= (1<<level);
205    }
206  
207    level++;
208 <  if(!(mu->typeBits & kGlobal)) {
208 >  if(!(mu->IsGlobalMuon())) {
209      failmask |= (1<<level);
210    }
211  
212    level++;
213 <  if(mu->nTkHits          < 10) {
213 >  if(mu->TrackerTrk()->NHits()  < 10) {
214      failmask |= (1<<level);
215    }
216  
217  
218    level++;  
219 <  if( (mu->trkIso03/mu->pt) > 0.7 ) {
219 >  if( (mu->IsoR03SumPt()/mu->Pt()) > 0.7 ) {
220      failmask |= (1<<level);
221    }
222  
# Line 148 | Line 228 | SelectionStatus passMuonSelectionZZ( Con
228    //  if(fabs(muon->dz)       > 0.1)   return false;  
229    
230    SelectionStatus status;
231 <  if( !failmask ) status.setStatus(SelectionStatus::LOOSEID);
232 <  if( !failmask ) status.setStatus(SelectionStatus::TIGHTID);
231 >  if( !failmask ) status.orStatus(SelectionStatus::LOOSEID);
232 >  if( !failmask ) status.orStatus(SelectionStatus::TIGHTID);
233    return status;
234  
235  
# Line 162 | Line 242 | SelectionStatus passMuonSelectionZZ( Con
242   //
243   // Kevin's WW selection
244   //
245 < SelectionStatus passMuonSelection( ControlFlags &ctrl, const mithep::TMuon * mu ) {
245 > //--------------------------------------------------------------------------------------------------
246 > SelectionStatus passMuonSelection( ControlFlags &ctrl,
247 >                                   const mithep::Muon * mu,
248 >                                   const mithep::Vertex & vtx   )
249 > //--------------------------------------------------------------------------------------------------
250 > {
251 >  SelectionStatus status;
252    int level=0;
253    unsigned failmask=0x0;
254  
255 +  // Use tracker track when available
256 +  const mithep::Track *muTrk=0;
257 +  if(mu->HasTrackerTrk())         { muTrk = mu->TrackerTrk(); }
258 +  else if(mu->HasGlobalTrk())     { muTrk = mu->GlobalTrk(); }
259 +  else if(mu->HasStandaloneTrk()) { muTrk = mu->StandaloneTrk(); }
260 +  assert(muTrk);                  
261 +  
262 +
263  
264    // 0x1
265 <  if(mu->pt < 5) {
265 >  if(muTrk->Pt() < 5) {
266      failmask |= (1<<level);
267    }
268  
269    // 0x2
270    level++;
271 <  if(fabs(mu->eta) > 2.4) {
271 >  if(fabs(muTrk->Eta()) > 2.4) {
272      failmask |= (1<<level);
273    }
274  
275    // 0x4
276    level++;
277 <  if(mu->ptErr/mu->pt > 0.1)   {
277 >  if(muTrk->PtErr()/muTrk->Pt() > 0.1)   {
278      failmask |= (1<<level);
279    }
280  
281    // 0x8
282    level++;
283 <  if( fabs(mu->dz) > 0.1 )   {
283 >  if( fabs(muTrk->DzCorrected(vtx)) > 0.1 )   {
284      failmask |= (1<<level);
285    }
286  
287 +  double muNchi2;
288 +  if(mu->HasStandaloneTrk())      { muNchi2 = mu->StandaloneTrk()->RChi2(); }
289 +  else if(mu->HasGlobalTrk())     { muNchi2 = mu->GlobalTrk()->RChi2();     }
290 +  else if(mu->HasTrackerTrk())    { muNchi2 = mu->TrackerTrk()->RChi2();    }
291  
292 <  Bool_t isGlobal  = (mu->typeBits & kGlobal) && (mu->muNchi2 < 10) && (mu->nMatch > 1) && (mu->nValidHits > 0);
293 <  Bool_t isTracker = (mu->typeBits & kTracker) && (mu->qualityBits & kTMLastStationTight);
292 >  unsigned qualityBits = mu->Quality().QualityMask().Mask();
293 >  
294 >  Bool_t isGlobal  = (mu->IsGlobalMuon()) && (muNchi2 < 10) && (mu->NMatches() > 1) && (mu->NValidHits() > 0);
295 >  Bool_t isTracker = (mu->IsTrackerMuon() ) && (qualityBits & muTools.kTMLastStationTight);
296  
297    // 0x10
298    level++;
299 <  if(!isGlobal && !isTracker) {
299 >  if((!isGlobal && !isTracker) || !(mu->HasTrackerTrk())) {
300      failmask |= (1<<level);
301 +    status.setStatus(SelectionStatus::FAIL);
302 +    return status;    
303    }
304  
305    // 0x20
306    level++;
307 <  if( mu->nTkHits < 10 ) {
307 >  assert(mu->HasTrackerTrk());
308 >  assert(mu->TrackerTrk());
309 >  if( mu->TrackerTrk()->NHits() < 10 ) {
310      failmask |= (1<<level);
311    }
312  
313    level++;
314 <  if(mu->nPixHits         < 1) {
314 >  if(muTrk->NPixelHits()          < 1) {
315      failmask |= (1<<level);
316    }
317  
318  
319    level++;
320 <  if(fabs(mu->d0)>0.02)   {
320 >  if(fabs(muTrk->D0Corrected(vtx))>0.02)   {
321      failmask |= (1<<level);
322    }
323  
# Line 229 | Line 333 | SelectionStatus passMuonSelection( Contr
333    }
334    */
335  
336 <  SelectionStatus status;
337 <  if( !failmask ) status.setStatus(SelectionStatus::LOOSEID);
234 <  if( !failmask ) status.setStatus(SelectionStatus::TIGHTID);
336 >  if( !failmask ) status.orStatus(SelectionStatus::LOOSEID);
337 >  if( !failmask ) status.orStatus(SelectionStatus::TIGHTID);
338    return status;
339  
340  
341   };
342  
240 SelectionStatus passMuonSelectionBackDoor( ControlFlags &ctrl, const mithep::TMuon * mu ) {
241  int level=0;
242  unsigned failmask=0x0;
343  
344 <  if(mu->pt < 5) {
345 <    failmask |= (1<<level);
346 <  }
344 > //--------------------------------------------------------------------------------------------------
345 > SelectionStatus muonIDMVASelection(ControlFlags &ctrl,
346 >                                 const mithep::Muon *mu,
347 >                                 const mithep::Vertex & vtx   )
348 > //--------------------------------------------------------------------------------------------------
349 > {
350 >  assert(mu->IsTrackerMuon()); // must be
351 >  assert(mu->HasTrackerTrk());
352 >  assert(mu->TrackerTrk());
353  
354 <  level++;
355 <  if(fabs(mu->eta) > 2.5) {
356 <    failmask |= (1<<level);
357 <  }
354 >  /*
355 >  cerr << "TrackerTrk: " << mu->TrackerTrk() << endl;
356 >  flush(cerr);
357 >  cerr << "Rchi2: " << mu->TrackerTrk()->RChi2() << endl;
358 >  flush(cerr);
359  
360 <  level++;
361 <  if(!(mu->typeBits & kGlobal) || !(mu->typeBits & kTracker)) {
362 <    failmask |= (1<<level);
256 <  }
360 >  cerr << "calling MVa ... "<< endl;
361 >  flush(cerr);
362 >  */
363  
364 <  level++;
365 <  if(mu->nTkHits          <= 10) {
366 <    failmask |= (1<<level);
364 >  double global_rchi2 = (mu->IsGlobalMuon()) ? mu->GlobalTrk()->RChi2() : 0.;
365 >
366 >  double mvaval = muIDMVA->MVAValue_ID(mu->Pt(),
367 >                                    mu->Eta(),
368 >                                    mu->IsGlobalMuon(),
369 >                                    mu->IsTrackerMuon(),
370 >                                    mu->TrackerTrk()->RChi2(),
371 >                                    global_rchi2,
372 >                                    (Double_t)(mu->NValidHits()),
373 >                                    (Double_t)(mu->TrackerTrk()->NHits()),
374 >                                    (Double_t)(mu->TrackerTrk()->NPixelHits()),
375 >                                    (Double_t)(mu->NMatches()),
376 >                                    mu->TrkKink(),
377 >                                    muTools.GetSegmentCompatability(mu),
378 >                                    muTools.GetCaloCompatability(mu,true,true),
379 >                                    mu->HadEnergy(),
380 >                                    mu->EmEnergy(),
381 >                                    mu->HadS9Energy(),
382 >                                    mu->EmS9Energy(),
383 >                                    (Bool_t)(ctrl.debug) );
384 >
385 >
386 >  SelectionStatus status;
387 >  bool pass = false;
388 >  
389 >  if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
390 >      && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_IDMVA_CUT_BIN0)  pass = true;
391 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
392 >           && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_IDMVA_CUT_BIN1)  pass = true;
393 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
394 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_IDMVA_CUT_BIN2)  pass = true;
395 >  else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
396 >           && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_IDMVA_CUT_BIN3)  pass = true;
397 >  else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon()
398 >           && (mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated) && mvaval >= MUON_IDMVA_CUT_BIN4)
399 >    pass = true;
400 >
401 >
402 >  if( pass ) {
403 >    status.orStatus(SelectionStatus::LOOSEID);
404 >    status.orStatus(SelectionStatus::TIGHTID);
405    }
406  
407 <        level++;
408 <        if(mu->ip3dSig > 4) {
409 <                failmask |= (1<<level);
410 <        }
411 <        
412 <        level++;
413 <  if(mu->muNchi2          >= 10)  {
414 <                failmask |= (1<<level);
415 <        }
416 <                
417 <        level++;
418 <  if(mu->nValidHits       < 1)   {
419 <                failmask |= (1<<level);
420 <        }
421 <        
422 <        level++;
423 <  if(mu->nMatch   < 2)   {
424 <                failmask |= (1<<level);
425 <        }
407 >  return status;
408 > }
409 >
410 > //--------------------------------------------------------------------------------------------------
411 > void initMuonIDMVA()
412 > //--------------------------------------------------------------------------------------------------
413 > {
414 >  muIDMVA = new mithep::MuonIDMVA();
415 >  vector<string> weightFiles;
416 >  weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_barrel_lowpt_V2.weights.xml");
417 >  weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_barrel_highpt_V2.weights.xml");
418 >  weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_endcap_lowpt_V2.weights.xml");
419 >  weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_endcap_highpt_V2.weights.xml");
420 >  weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_tracker_V2.weights.xml");
421 >  weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_global_V2.weights.xml");
422 >  muIDMVA->Initialize( "MuonIDMVA",
423 >                       mithep::MuonIDMVA::kIDV0,
424 >                       kTRUE, weightFiles);
425 > }
426 >
427 > //--------------------------------------------------------------------------------------------------
428 > SelectionStatus muonIDPFSelection(ControlFlags &ctrl,
429 >                                  const mithep::Muon *mu,
430 >                                  const mithep::Vertex & vtx,
431 >                                  const mithep::Array<mithep::PFCandidate> * pfCandidates )
432 > //--------------------------------------------------------------------------------------------------
433 > {
434 >  bool pass = false;
435 >  SelectionStatus status; // init'ed to FAIL
436    
437 <  SelectionStatus status;
438 <        
285 <  if( !failmask ) status.setStatus(SelectionStatus::LOOSEID);
286 <  if( !failmask ) status.setStatus(SelectionStatus::TIGHTID);
287 <        
288 <        return status;
437 >  // check that muon is tracker
438 >  if( !(mu->IsTrackerMuon()) )   return status;
439  
440 < };
440 >  // check that it matches to a PF muon
441 >  for( int i=0; i<pfCandidates->GetEntries(); i++ ) {
442 >    const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*pfCandidates)[i]);
443 >    if( pf->HasTrackerTrk() ) {
444 >      if( pf->TrackerTrk() == mu->TrackerTrk() && abs(pf->PFType()) == mithep::PFCandidate::eMuon ) {
445 >        pass = true;
446 >        break;
447 >      }
448 >    }
449 >  }
450 >
451 >  if( pass ) {
452 >    status.orStatus(SelectionStatus::LOOSEID);
453 >    status.orStatus(SelectionStatus::TIGHTID);
454 >  }
455 >
456 >  return status;
457 > }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines