ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/LeptonSelection/src/MuonSelection.cc
Revision: 1.25
Committed: Sun Jun 3 15:51:33 2012 UTC (12 years, 11 months ago) by khahn
Content type: text/plain
Branch: MAIN
Changes since 1.24: +30 -0 lines
Log Message:
adding noD0 preselection for HF studies

File Contents

# User Rev Content
1 khahn 1.1 #include <math.h>
2     #include <iostream>
3    
4     #include "MuonSelection.h"
5     #include "ParseArgs.h"
6     #include "SelectionStatus.h"
7    
8 khahn 1.4 #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 khahn 1.19 extern vector<bool> PFnoPUflag;
17 khahn 1.4 extern Float_t computePFMuonIso(const mithep::Muon *mu,
18 anlevin 1.21 const mithep::Vertex * vtx,
19 khahn 1.4 const mithep::Array<mithep::PFCandidate> * pfCandidates,
20     const Double_t dRMax);
21    
22 anlevin 1.24 bool trackToPFMuonSelection( const mithep::Track *track, const mithep::MuonCol * muoncol )
23     {
24     bool pass = false;
25     for(UInt_t i=0; i<muoncol->GetEntries(); ++i) {
26     const mithep::Muon *mu = muoncol->At(i);
27     if(mu->TrackerTrk() == track && (mu->IsGlobalMuon() || mu->IsTrackerMuon()) && mu->IsPFMuon())
28     pass = true;
29     }
30    
31     return pass;
32    
33     }
34    
35 khahn 1.4 //--------------------------------------------------------------------------------------------------
36 khahn 1.8 SelectionStatus muonDummyVeto(ControlFlags &ctrl,
37     const mithep::Muon *muon,
38 anlevin 1.21 const mithep::Vertex * vtx)
39 khahn 1.8 //--------------------------------------------------------------------------------------------------
40     {
41     SelectionStatus status;
42     status.setStatus(SelectionStatus::PRESELECTION);
43     return status;
44     }
45    
46     //--------------------------------------------------------------------------------------------------
47     SelectionStatus muonCutBasedVeto(ControlFlags &ctrl,
48     const mithep::Muon *muon,
49 anlevin 1.21 const mithep::Vertex *vtx)
50 khahn 1.8 //--------------------------------------------------------------------------------------------------
51     {
52     //
53     // Loose cut-based ID for isolation veto
54     //
55     bool ret = true;
56    
57     if(!(muon->IsGlobalMuon() || muon->IsTrackerMuon())) ret = false;
58     if( muon->NValidHits() < 11 ) ret = false;
59     if( fabs(muon->Ip3dPVSignificance()) >= 4 ) ret = false;
60    
61     SelectionStatus status;
62     if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
63     return status;
64     }
65    
66    
67     //--------------------------------------------------------------------------------------------------
68 khahn 1.4 SelectionStatus noPreSelection( ControlFlags &ctrl, const mithep::Muon * mu )
69    
70     //--------------------------------------------------------------------------------------------------
71     {
72 anlevin 1.3 SelectionStatus status;
73     status.setStatus(SelectionStatus::PRESELECTION);
74     if(ctrl.debug) cout << "muon presel returning status : " << status.getStatus() << endl;
75     return status;
76     }
77 khahn 1.1
78 khahn 1.4 //--------------------------------------------------------------------------------------------------
79     SelectionStatus muonPreSelection( ControlFlags &ctrl,
80     const mithep::Muon * mu,
81 anlevin 1.21 const mithep::Vertex * vtx,
82 khahn 1.4 const mithep::Array<mithep::PFCandidate> * pfCandidates )
83     //--------------------------------------------------------------------------------------------------
84     {
85     bool ret = true;
86 khahn 1.20
87     ret &= ( fabs(mu->Ip3dPVSignificance()) < 100 );
88 khahn 1.14 ret &= ( mu->Pt() >= 5 );
89 khahn 1.7 ret &= ( fabs(mu->Eta()) <= 2.4 );
90 khahn 1.11 ret &= ( mu->IsTrackerMuon() || mu->IsGlobalMuon() );
91 khahn 1.20 // if( mu->IsTrackerMuon() && mu->HasTrackerTrk() && !mu->IsGlobalMuon() )
92     // ret &= ( mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated);
93     ret &= ( mu->IsoR03SumPt()/mu->Pt() < 0.7 );
94 khahn 1.1
95     SelectionStatus status;
96     if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
97     if(ctrl.debug) cout << "muon presel returning status : " << status.getStatus() << endl;
98     return status;
99     }
100    
101 khahn 1.4
102 khahn 1.1
103 khahn 1.13 //--------------------------------------------------------------------------------------------------
104     SelectionStatus muonReferencePreSelection( ControlFlags &ctrl,
105     const mithep::Muon * mu,
106 anlevin 1.21 const mithep::Vertex * vtx,
107 khahn 1.13 const mithep::Array<mithep::PFCandidate> * pfCandidates )
108     //--------------------------------------------------------------------------------------------------
109     {
110     bool ret = true;
111 khahn 1.20
112 khahn 1.13 if(ctrl.debug) cout << "inside muonpresel ... " << endl;
113 khahn 1.16 ret &= ( fabs(mu->Ip3dPVSignificance()) < 100 );
114 khahn 1.13 if(ctrl.debug) cout << "and pass IP (" << mu->Ip3dPVSignificance() << ") ? ... " << ret << endl;
115 khahn 1.14 ret &= ( mu->Pt() >= 5 );
116 khahn 1.13 if(ctrl.debug) cout << "and >5 GeV (" << mu->Pt() << ") ? ... " << ret << endl;
117     ret &= ( fabs(mu->Eta()) <= 2.4 );
118     if(ctrl.debug) cout << "and < 2.4 eta (" << mu->Eta() << ")? ... " << ret << endl;
119     ret &= ( mu->IsTrackerMuon() || mu->IsGlobalMuon() );
120 anlevin 1.21 if(ctrl.debug) cout << "is Tracker or Global? ... " << ret << endl;
121 khahn 1.23 ret &= (mu->HasTrackerTrk() &&
122     mu->TrackerTrk()->D0Corrected(*vtx) < 0.5
123     && mu->TrackerTrk()->DzCorrected(*vtx) < 1.0);
124 anlevin 1.21 if(ctrl.debug) cout << "d0 and dz? ... " << ret << endl;
125    
126 khahn 1.13 // if( mu->IsTrackerMuon() && mu->HasTrackerTrk() && !mu->IsGlobalMuon() )
127     // ret &= ( mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated);
128     // if(ctrl.debug) cout << "if isTrackerMuon, arbitrated ? ... " << ret << endl;
129     // ret &= ( mu->BestTrk()->DzCorrected(vtx) < 0.1);
130     // if( ctrl.debug ) cout << "elepresel : ret after dZcorr : " << ret << endl;
131    
132    
133     SelectionStatus status;
134     if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
135     if(ctrl.debug) cout << "muon presel returning status : " << status.getStatus() << endl;
136     return status;
137     }
138    
139 khahn 1.25 //--------------------------------------------------------------------------------------------------
140     SelectionStatus muonPreSelectionNoD0DzIP( ControlFlags &ctrl,
141     const mithep::Muon * mu,
142     const mithep::Vertex * vtx,
143     const mithep::Array<mithep::PFCandidate> * pfCandidates )
144     //--------------------------------------------------------------------------------------------------
145     {
146     bool ret = true;
147    
148     if(ctrl.debug) cout << "inside muonpresel ... " << endl;
149     ret &= ( mu->Pt() >= 5 );
150     if(ctrl.debug) cout << "and >5 GeV (" << mu->Pt() << ") ? ... " << ret << endl;
151     ret &= ( fabs(mu->Eta()) <= 2.4 );
152     if(ctrl.debug) cout << "and < 2.4 eta (" << mu->Eta() << ")? ... " << ret << endl;
153     ret &= ( mu->IsTrackerMuon() || mu->IsGlobalMuon() );
154     if(ctrl.debug) cout << "is Tracker or Global? ... " << ret << endl;
155    
156     // if( mu->IsTrackerMuon() && mu->HasTrackerTrk() && !mu->IsGlobalMuon() )
157     // ret &= ( mu->Quality().QualityMask().Mask() & mithep::MuonQuality::AllArbitrated);
158     // if(ctrl.debug) cout << "if isTrackerMuon, arbitrated ? ... " << ret << endl;
159     // ret &= ( mu->BestTrk()->DzCorrected(vtx) < 0.1);
160     // if( ctrl.debug ) cout << "elepresel : ret after dZcorr : " << ret << endl;
161    
162    
163     SelectionStatus status;
164     if( ret ) status.setStatus(SelectionStatus::PRESELECTION);
165     if(ctrl.debug) cout << "muon presel returning status : " << status.getStatus() << endl;
166     return status;
167     }
168    
169 khahn 1.13
170    
171 anlevin 1.3
172 khahn 1.4 //--------------------------------------------------------------------------------------------------
173     SelectionStatus muonIDMVASelection(ControlFlags &ctrl,
174     const mithep::Muon *mu,
175 anlevin 1.21 const mithep::Vertex * vtx )
176 khahn 1.4 //--------------------------------------------------------------------------------------------------
177     {
178     double global_rchi2 = (mu->IsGlobalMuon()) ? mu->GlobalTrk()->RChi2() : 0.;
179 anlevin 1.3
180 khahn 1.13 //
181     // WARNING !!! KH hacked out to sync
182     //
183     /*
184 khahn 1.4 double mvaval = muIDMVA->MVAValue_ID(mu->Pt(),
185     mu->Eta(),
186     mu->IsGlobalMuon(),
187     mu->IsTrackerMuon(),
188     mu->TrackerTrk()->RChi2(),
189     global_rchi2,
190     (Double_t)(mu->NValidHits()),
191 khahn 1.11 (Double_t)(mu->TrackerTrk()->NHits()),
192 khahn 1.4 (Double_t)(mu->TrackerTrk()->NPixelHits()),
193     (Double_t)(mu->NMatches()),
194     mu->TrkKink(),
195     muTools.GetSegmentCompatability(mu),
196     muTools.GetCaloCompatability(mu,true,true),
197     mu->HadEnergy(),
198     mu->EmEnergy(),
199     mu->HadS9Energy(),
200     mu->EmS9Energy(),
201     (Bool_t)(ctrl.debug) );
202 khahn 1.13 */
203     double mvaval = 0.0;
204 anlevin 1.3
205 khahn 1.4 SelectionStatus status;
206     bool pass = false;
207    
208     if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
209 khahn 1.7 && fabs(mu->Eta()) <= 1.5 && mu->Pt() <= 10 && mvaval >= MUON_IDMVA_CUT_BIN0) pass = true;
210 khahn 1.4 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
211 khahn 1.7 && fabs(mu->Eta()) <= 1.5 && mu->Pt() > 10 && mvaval >= MUON_IDMVA_CUT_BIN1) pass = true;
212 khahn 1.4 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
213 khahn 1.7 && fabs(mu->Eta()) > 1.5 && mu->Pt() <= 10 && mvaval >= MUON_IDMVA_CUT_BIN2) pass = true;
214 khahn 1.4 else if( mu->IsGlobalMuon() && mu->IsTrackerMuon()
215     && fabs(mu->Eta()) > 1.5 && mu->Pt() > 10 && mvaval >= MUON_IDMVA_CUT_BIN3) pass = true;
216 khahn 1.11 else if( !(mu->IsGlobalMuon()) && mu->IsTrackerMuon() && mvaval >= MUON_IDMVA_CUT_BIN4 ) pass = true;
217     else if( mu->IsGlobalMuon() && !(mu->IsTrackerMuon()) && mvaval >= MUON_IDMVA_CUT_BIN5 ) pass = true;
218    
219 khahn 1.4
220    
221     if( pass ) {
222     status.orStatus(SelectionStatus::LOOSEID);
223     status.orStatus(SelectionStatus::TIGHTID);
224 anlevin 1.3 }
225    
226 khahn 1.4 return status;
227     }
228 anlevin 1.3
229 khahn 1.4 //--------------------------------------------------------------------------------------------------
230     void initMuonIDMVA()
231     //--------------------------------------------------------------------------------------------------
232     {
233     muIDMVA = new mithep::MuonIDMVA();
234     vector<string> weightFiles;
235 khahn 1.6 weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_barrel_lowpt_V2.weights.xml");
236     weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_barrel_highpt_V2.weights.xml");
237     weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_endcap_lowpt_V2.weights.xml");
238     weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_endcap_highpt_V2.weights.xml");
239     weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_tracker_V2.weights.xml");
240     weightFiles.push_back("./data/MuonIDMVAWeights/MuonIDMVA_BDTG_global_V2.weights.xml");
241 khahn 1.4 muIDMVA->Initialize( "MuonIDMVA",
242     mithep::MuonIDMVA::kIDV0,
243     kTRUE, weightFiles);
244     }
245 khahn 1.9
246     //--------------------------------------------------------------------------------------------------
247     SelectionStatus muonIDPFSelection(ControlFlags &ctrl,
248     const mithep::Muon *mu,
249 anlevin 1.21 const mithep::Vertex * vtx,
250 khahn 1.9 const mithep::Array<mithep::PFCandidate> * pfCandidates )
251     //--------------------------------------------------------------------------------------------------
252     {
253     bool pass = false;
254     SelectionStatus status; // init'ed to FAIL
255    
256     // check that it matches to a PF muon
257     for( int i=0; i<pfCandidates->GetEntries(); i++ ) {
258 khahn 1.19 // tmp
259     if( !(PFnoPUflag[i]) ) continue; // my PF no PU hack
260    
261 khahn 1.9 const mithep::PFCandidate *pf = (mithep::PFCandidate*)((*pfCandidates)[i]);
262 khahn 1.19 if( (pf->TrackerTrk() == mu->TrackerTrk()) && abs(pf->PFType()) == mithep::PFCandidate::eMuon ) {
263 khahn 1.17 pass = true;
264     break;
265 khahn 1.9 }
266     }
267 anlevin 1.22 //
268     // if(mu->IsPFMuon()) pass = true;
269     // else pass = false;
270 khahn 1.9
271 khahn 1.13 //
272     // NB : ipsig here for reference synch ...
273     //
274 khahn 1.19 #ifdef SYNC
275 khahn 1.16 if( pass && fabs(mu->Ip3dPVSignificance()) < 4 ) {
276 khahn 1.9 status.orStatus(SelectionStatus::LOOSEID);
277     status.orStatus(SelectionStatus::TIGHTID);
278     }
279 khahn 1.19 #else
280     if( pass ) {
281     status.orStatus(SelectionStatus::LOOSEID);
282     status.orStatus(SelectionStatus::TIGHTID);
283     }
284     #endif
285 khahn 1.9
286     return status;
287     }