ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Utils/interface/MuonTools.h
Revision: 1.2
Committed: Tue Nov 11 21:21:28 2008 UTC (16 years, 5 months ago) by ceballos
Content type: text/plain
Branch: MAIN
Changes since 1.1: +97 -98 lines
Log Message:
fixing a memory leak

File Contents

# Content
1 #ifndef MITPHYSICS_UTIL_MUONTOOLS_H
2 #define MITPHYSICS_UTIL_MUONTOOLS_H
3 #include <vector>
4 #include <iostream>
5
6 #include "TH2D.h"
7 #include "TFile.h"
8 #include "MitAna/DataTree/interface/Collections.h"
9 #include "MitCommon/MathTools/interface/MathUtils.h"
10
11 namespace mithep {
12 class MuonTools {
13 public:
14 MuonTools();
15 ~MuonTools();
16 double getCaloCompatability(mithep::Muon* iMuon,bool iEMSpecial, bool iCorrectedHCAL);
17 enum selection {
18 AllArbitrated,
19 PromptTight,
20 TMLastStationLoose,
21 TMLastStationTight,
22 TMOneStationLoose,
23 TMOneStationTight,
24 TM2DCompatibilityLoose,
25 TM2DCompatibilityTight
26 };
27 static inline double sigWeight(double iVal0,double iVal1) {
28 if(iVal1 < 1.) return 1;
29 if(iVal0 < 3. && iVal1 > 3.) {
30 double lVal = TMath::Max(iVal0,1.);
31 return 1/TMath::Power(lVal,0.25);
32 }
33 double lVal = TMath::Max(iVal1,1.);
34 return 1/TMath::Power(lVal,0.25);
35 }
36 static inline int lastHit(mithep::Muon *iMuon) {
37 int lId = -1;
38 for(int i0 = 0; i0 < 8; i0++) {
39 if(iMuon->GetDX(i0) < 99999 || iMuon->GetDY(i0) < 99999) lId = i0;
40 }
41 return lId;
42 }
43 static inline int maxChamberId(mithep::Muon* iMuon,double iMaxD,double iMaxP) {
44 int lId = -1;
45 for(int i0 = 0; i0 < 8; i0++) {
46 if(iMuon->GetTrackDist(i0) < iMaxD &&
47 iMuon->GetTrackDist(i0)/iMuon->GetTrackDistErr(i0) < iMaxP) {
48 if(iMuon->GetDX(i0) >= 999999) {lId = i0;} else {lId = -1;}
49 }
50 }
51 return lId;
52 }
53 static inline int lastStation(mithep::Muon* iMuon,double iMaxD,double iMaxP) {
54 int lId = -1;
55 for(int i0 = 0; i0 < 8; i0++) {
56 if((lId % 4) > (i0 % 4)) continue;
57 if(iMuon->GetTrackDist(i0) < iMaxD &&
58 iMuon->GetTrackDist(i0)/iMuon->GetTrackDistErr(i0) < iMaxP) lId = i0;
59 }
60 return lId;
61 }
62 static inline int lastStation(mithep::Muon* iMuon,int iMax=8) {
63 int lId = -1; if(iMax > 8) iMax = 8;
64 for(int i0 = 0; i0 < iMax; i0++) {if(iMuon->StationBit(i0) && ((lId % 4) < (i0 % 4)))lId = i0;}
65 return lId;
66 }
67 static inline bool overflow(TH2D *iHist,double lVal0,double lVal1) {
68 if(iHist == 0) return true;
69 if(iHist ->GetXaxis()->FindBin(lVal0) == 0 ||
70 iHist ->GetXaxis()->FindBin(lVal0) > iHist->GetNbinsX() ||
71 iHist ->GetYaxis()->FindBin(lVal0) == 0 ||
72 iHist ->GetYaxis()->FindBin(lVal0) > iHist->GetNbinsY()) return true;
73 return false;
74 }
75 static inline MCParticle* etaPhiMatch(MCParticleCol* iMCParts,Muon *iMuon) {
76 mithep::MCParticle *lMC = 0; double lDR = 1.; double lPt = -1.;
77 for(unsigned int i0 = 0; i0 < iMCParts->GetEntries(); i0++) {
78 mithep::MCParticle* pMC = iMCParts->At(i0);
79 if(pMC->Status() != 1) continue;
80 double pDR = mithep::MathUtils::DeltaR(pMC->Mom(),iMuon->Mom());
81 if(pDR > lDR && pDR > 0.01) continue;
82 if(fabs(pMC->Pt()) < lPt) continue;
83 lDR = pDR;
84 lMC = pMC;
85 lPt = pMC->Pt();
86 }
87 return lMC;
88 }
89 static inline Muon* match(MuonCol* iMuons,Track *iTrack) {
90 mithep::Muon *lMuon = 0; double lDR = 1.; double lPt = -1.;
91 for(unsigned int i0 = 0; i0 < iMuons->GetEntries(); i0++) {
92 mithep::Muon* pMuon = iMuons->At(i0);
93 double pDR = mithep::MathUtils::DeltaR(pMuon->Mom(),iTrack->Mom4(0.109));
94 if(pDR > lDR && pDR > 0.01) continue;
95 if(fabs(pMuon->Pt()) < lPt) continue;
96 lDR = pDR;
97 lMuon = pMuon;
98 lPt = pMuon->Pt();
99 }
100 return lMuon;
101 }
102 static inline int NSegments(mithep::Muon *iMuon) {
103 int lNSegs = 0;
104 for(int i0 = 0; i0 < 8; i0++) {
105 if(iMuon->StationBit(i0)) lNSegs++;
106 }
107 return lNSegs;
108 }
109 static inline bool promptTight(int iId,Muon *iMuon) {
110 const mithep::Track *lTrack = 0;
111 if(iId == 0 ) lTrack = iMuon->GlobalTrk();
112 if(iId == 1 || (iId == -1 && lTrack == 0)) lTrack = iMuon->TrackerTrk();
113 if(iId == 2 || (iId == -1 && lTrack == 0)) lTrack = iMuon->StandaloneTrk();
114 if(lTrack == 0) return 0;
115 if(lTrack->NHits() < 11) return false;
116 if(lTrack->Chi2()/lTrack->Ndof() > 10.) return false;
117 if(lTrack->D0() > 0.2) return false;
118 if((lastHit(iMuon)% 4) == 0) return false;
119 return true;
120 }
121 static inline bool TMLastStation(Muon *iMuon,double iDYMin = 3., double iPYMin = 3.,double iDXMin = 3., double iPXMin = 3.,int iN = 2) {
122 if(iMuon->NSegments() < iN) return false; //2Last 1One
123 int lLast = lastStation(iMuon,-3.,-3.); //Last Required Station
124 if(lLast < 0) return false;
125 if(iMuon->GetDX(lLast) > 9999.) return false;
126 lLast = lastStation(iMuon); //No Requirements Imply StationMask (Segment and Track Arbitrated)
127 if(lLast < 0) return false;
128 if(!(fabs(iMuon->GetDX(lLast)) < iDXMin ||
129 fabs(iMuon->GetPullX(lLast)) < iPXMin)) return false;
130 if(lLast == 3) lLast = lastStation(iMuon,3);
131 if(lLast < 0) return false;
132 if(!(fabs(iMuon->GetDY(lLast)) < iDYMin || //Old Code it was 9999
133 fabs(iMuon->GetPullY(lLast)) < iPYMin)) return false;
134 return true;
135 }
136 static inline bool TMOneStation(Muon *iMuon,double iDYMin = 3., double iPYMin = 3.,double iDXMin = 3., double iPXMin = 3.,int iN = 1) {
137 if(iMuon->NSegments() < iN) return false; //2Last 1One
138 bool pGoodX = false; bool pBadY = false;
139 for(int i0 = 0; i0 < 8; i0++) {
140 if((fabs(iMuon->GetDX(i0)) < iDXMin ||
141 fabs(iMuon->GetPullX(i0)) < iPXMin)) pGoodX = true;
142 if(pGoodX &&
143 (fabs(iMuon->GetDY(i0)) < iDYMin ||
144 fabs(iMuon->GetPullY(i0)) < iPYMin)) return true;
145 if(fabs(iMuon->GetDY(i0)) < 999999) pBadY = true;
146 if(i0 == 3 && pGoodX && !pBadY) return true;
147 }
148 return false;
149 }
150 static inline double getCaloCompatabilitySlowly(mithep::Muon* iMuon,bool iEMSpecial, bool iCorrectedHCAL) {
151 std::cout << "Warning Loading Compatability Slowly" << std::endl;
152 TFile* lPion_templates = new TFile("MitCommon/MuonTools/data/PionCaloTemplate.root","READ");
153 TFile* lMuon_templates = new TFile("MitCommon/MuonTools/data/MuonCaloTemplate.root","READ");
154 TH2D* lpion_em_etaEmi = (TH2D*) lPion_templates->Get("em_etaEmi");
155 TH2D* lpion_had_etaEmi = (TH2D*) lPion_templates->Get("had_etaEmi");
156 TH2D* lpion_had_etaTmi = (TH2D*) lPion_templates->Get("had_etaTmi");
157 TH2D* lpion_em_etaB = (TH2D*) lPion_templates->Get("em_etaB") ;
158 TH2D* lpion_had_etaB = (TH2D*) lPion_templates->Get("had_etaB") ;
159 TH2D* lpion_ho_etaB = (TH2D*) lPion_templates->Get("ho_etaB") ;
160 TH2D* lpion_had_etaTpl = (TH2D*) lPion_templates->Get("had_etaTpl");
161 TH2D* lpion_em_etaEpl = (TH2D*) lPion_templates->Get("em_etaEpl") ;
162 TH2D* lpion_had_etaEpl = (TH2D*) lPion_templates->Get("had_etaEpl");
163 TH2D* lmuon_em_etaEmi = (TH2D*) lMuon_templates->Get("em_etaEmi") ;
164 TH2D* lmuon_had_etaEmi = (TH2D*) lMuon_templates->Get("had_etaEmi");
165 TH2D* lmuon_had_etaTmi = (TH2D*) lMuon_templates->Get("had_etaTmi");
166 TH2D* lmuon_em_etaB = (TH2D*) lMuon_templates->Get("em_etaB") ;
167 TH2D* lmuon_had_etaB = (TH2D*) lMuon_templates->Get("had_etaB") ;
168 TH2D* lmuon_ho_etaB = (TH2D*) lMuon_templates->Get("ho_etaB") ;
169 TH2D* lmuon_had_etaTpl = (TH2D*) lMuon_templates->Get("had_etaTpl");
170 TH2D* lmuon_em_etaEpl = (TH2D*) lMuon_templates->Get("em_etaEpl");
171 TH2D* lmuon_had_etaEpl = (TH2D*) lMuon_templates->Get("had_etaEpl");
172
173 double lEta = -1.; double lP = -1;
174 double lEM = -5.; double lHad = 0; double lHO = 0;
175 lEta = iMuon->Eta();
176 lP = iMuon->P();
177 if(lP >= 2000.) lP = 1999.9;
178 if(!iEMSpecial || iMuon->EmEnergy() != 0.) lEM = iMuon->EmEnergy();
179 lHad = iMuon->HadEnergy();
180 lHO = iMuon->HoEnergy();
181 if(lP < 0. ) return 0.5;
182 if(fabs(lEta) > 2.5 ) return 0.5;
183 TH2D* lTMuonHad = NULL;
184 TH2D* lTPionHad = NULL;
185 TH2D* lTMuonHo = NULL;
186 TH2D* lTPionHo = NULL;
187 TH2D* lTMuonEm = NULL;
188 TH2D* lTPionEm = NULL;
189
190 if(fabs(lEta) >= 1.27) {
191 if(iCorrectedHCAL) lHad *= 1.8/2.2;
192 if(lEta > 0) {
193 lTPionHad = lpion_had_etaEpl;
194 lTMuonHad = lmuon_had_etaEpl;
195 } else {
196 lTPionHad = lpion_had_etaEmi;
197 lTMuonHad = lmuon_had_etaEmi;
198 }
199 }
200 if(fabs(lEta) < 1.27 && fabs(lEta) >= 1.1 ) {
201 if(iCorrectedHCAL) lHad *= (1.8/(-2.2*fabs(lEta)+5.5));
202 if(lEta > 0) {
203 lTPionHad = lpion_had_etaTpl;
204 lTMuonHad = lmuon_had_etaTpl;
205 } else {
206 lTPionHad = lpion_had_etaTmi;
207 lTMuonHad = lmuon_had_etaTmi;
208 }
209 }
210 if(fabs(lEta) < 1.1) {
211 if(iCorrectedHCAL) lHad *= sin(2*atan(exp(iMuon->Eta())));
212 lTPionHad = lpion_had_etaB;
213 lTMuonHad = lmuon_had_etaB;
214 }
215 if(lEta > 1.479 ) {
216 lTPionEm = lpion_em_etaEpl;
217 lTMuonEm = lmuon_em_etaEpl;
218 }
219 if(fabs(lEta) <= 1.479) {
220 lTPionEm = lpion_em_etaB;
221 lTMuonEm = lmuon_em_etaB;
222 }
223 if(lEta < -1.479 ) {
224 lTPionEm = lpion_em_etaEmi;
225 lTMuonEm = lmuon_em_etaEmi;
226 }
227 if(fabs(lEta) < 1.28) {
228 lTPionHo = lpion_ho_etaB;
229 lTMuonHo = lmuon_ho_etaB;
230 }
231
232 double lPBX = 1.; double lPSX = 1.;
233 double lPBY = 1.; double lPSY = 1.;
234 double lPBZ = 1.; double lPSZ = 1.;
235 if(!overflow(lTPionEm, lP,lEM)) lPBX = lTPionEm ->GetBinContent(lTPionEm ->GetXaxis()->FindBin(lP),lTPionEm ->GetYaxis()->FindBin(lEM) );
236 if(!overflow(lTPionHad,lP,lHad)) lPBY = lTPionHad->GetBinContent(lTPionHad->GetXaxis()->FindBin(lP),lTPionHad->GetYaxis()->FindBin(lHad));
237 if(!overflow(lTPionHo, lP,lHO)) lPBZ = lTPionHo ->GetBinContent(lTPionHo ->GetXaxis()->FindBin(lP),lTPionHo ->GetYaxis()->FindBin(lHO) );
238 if(!overflow(lTMuonEm, lP,lEM )) lPSX = lTMuonEm ->GetBinContent(lTMuonEm ->GetXaxis()->FindBin(lP),lTMuonEm ->GetYaxis()->FindBin(lEM) );
239 if(!overflow(lTMuonHad,lP,lHad)) lPSY = lTMuonHad->GetBinContent(lTMuonHad->GetXaxis()->FindBin(lP),lTMuonHad->GetYaxis()->FindBin(lHad));
240 if(!overflow(lTMuonHo ,lP,lHO)) lPSZ = lTMuonHo ->GetBinContent(lTMuonHo ->GetXaxis()->FindBin(lP),lTMuonHo ->GetYaxis()->FindBin(lHO) );
241
242 if(lPSX == 0. || lPBX == 0. || (lEM <= 0. && !iEMSpecial)) {lPSX = 1.; lPBX = 1.;}
243 if(lPSY == 0. || lPBY == 0. || lHad == 0.) {lPSY = 1.; lPBY = 1.;}
244 if(lPSZ == 0. || lPBZ == 0. || lHO == 0.) {lPSZ = 1.; lPBZ = 1.;}
245 lPion_templates->Close();
246 lMuon_templates->Close();
247 if((lPSX*lPSY*lPSZ+lPBX*lPBY*lPBZ) > 0.) return lPSX*lPSY*lPSZ/(lPSX*lPSY*lPSZ+lPBX*lPBY*lPBZ);
248 return 0.5;
249 }
250 static inline float getSegmentCompatability(const mithep::Muon* iMuon) {
251 int lNStationsCrossed = 0;
252 int lNStationsSegment = 0;
253
254 std::vector<int> lStTrack(8);
255 std::vector<int> lStSegmentmatch(8);
256 std::vector<int> lStCrossed(8);
257 std::vector<float> lStBoundary(8);
258 std::vector<float> lStWeight(8);
259 float lWeight = 0.;
260 bool lAdjust = true;
261 for(int i0 = 0; i0 < 8; i0++) {
262 if(iMuon->GetTrackDist(i0) < 999999. ) {
263 lNStationsCrossed++;
264 lStCrossed[i0] = 1;
265 lStBoundary[i0] = 0.;
266 if(iMuon->GetTrackDist(i0) > -10. ) lStBoundary[i0] = iMuon->GetTrackDist(i0);
267 }
268 if(iMuon->GetDX(i0) < 999999.) { //Use iMuon->GetSegmentX--> CHECK
269 lNStationsSegment++;
270 lStSegmentmatch[i0] = 1;
271 }
272 if(iMuon->GetDY(i0) < 999999.) lAdjust = false;
273 }
274 int lPCross = -1;
275 const float lAtWeight = 0.5;
276 for(int i0 = 0; i0< 8; i0++) {
277 lStWeight[i0] = 0;
278 if(lStCrossed[i0] > 0 ) { lPCross++;
279 switch ( lNStationsCrossed ) {
280 case 1 :
281 lStWeight[i0] = 1.;
282 break;
283 case 2 :
284 if ( lPCross == 0 ) lStWeight[i0] = 0.33;
285 else lStWeight[i0] = 0.67;
286 break;
287 case 3 :
288 if ( lPCross == 0 ) lStWeight[i0] = 0.23;
289 else if( lPCross == 1 ) lStWeight[i0] = 0.33;
290 else lStWeight[i0] = 0.44;
291 break;
292 case 4 :
293 if ( lPCross == 0 ) lStWeight[i0] = 0.10;
294 else if( lPCross == 1 ) lStWeight[i0] = 0.20;
295 else if( lPCross == 2 ) lStWeight[i0] = 0.30;
296 else lStWeight[i0] = 0.40;
297 break;
298
299 default :
300 lStWeight[i0] = 1./lNStationsCrossed;
301 }
302
303 if(lStSegmentmatch[i0] <= 0 && lStBoundary[i0] != 0. ) {
304 lStWeight[i0] *= lAtWeight*0.5*(TMath::Erf(lStBoundary[i0]/6.)+1.);
305 } else if(lStSegmentmatch[i0] <= 0 && lStBoundary[i0] == 0) {lStWeight[i0] = 0.;}
306
307 if( lStSegmentmatch[i0] > 0) {
308 double lP2X = TMath::Power(iMuon->GetPullX(i0),2.);
309 double lP2Y = TMath::Power(iMuon->GetPullY(i0),2.);
310 double lD2X = TMath::Power(iMuon->GetDX(i0),2.);
311 double lD2Y = TMath::Power(iMuon->GetDY(i0),2.);
312 if( iMuon->GetDY(i0) < 999999 && iMuon->GetDX(i0) < 999999) {
313 lStWeight[i0] *= sigWeight(sqrt(lD2X+lD2Y),sqrt(lP2X+lP2Y));
314 } else if (iMuon->GetDY(i0) >= 999999 && i0 < 4) {
315 lStWeight[i0] *= sigWeight(iMuon->GetDX(i0),iMuon->GetPullX(i0));
316 } else if(i0 < 4) {
317 lStWeight[i0] *= sigWeight(iMuon->GetDY(i0),iMuon->GetPullY(i0));
318 }
319 }
320 }
321 lWeight += lStWeight[i0];
322 }
323 if(lNStationsCrossed == 0) lWeight = 0.5;
324 return lWeight;
325 }
326 static inline bool isGoodMuon(mithep::Muon *iMuon,selection iSelection) {
327 double lVal = 0;
328 switch(iSelection) {
329 case AllArbitrated:
330 if(iMuon->StandaloneTrk() != 0 || iMuon->GlobalTrk()!= 0) return true;
331 if(iMuon->NSegments() > 0) return true;
332 return false;
333 break;
334 case PromptTight:
335 return promptTight(-1,iMuon);
336 break;
337 case TMOneStationLoose:
338 return TMOneStation(iMuon,99999,999999);
339 case TMOneStationTight:
340 return TMOneStation(iMuon);
341 case TMLastStationLoose:
342 return TMLastStation(iMuon,999999,999999);
343 break;
344 case TMLastStationTight:
345 return TMLastStation(iMuon);
346 break;
347 case TM2DCompatibilityLoose:
348 lVal = 1.2*getSegmentCompatability(iMuon);
349 if(lVal/1.2 == 0.5) return false;
350 //if(fClass ) lVal += 0.8*getCaloCompatability(iMuon,true,true);
351 lVal += 0.8*getCaloCompatabilitySlowly(iMuon,true,true);
352 if(lVal > 0.7) return true;
353 return false;
354 break;
355 case TM2DCompatibilityTight:
356 lVal = 1.2*getSegmentCompatability(iMuon);
357 if(lVal/1.2 == 0.5) return false;
358 //if(fClass ) lVal += 0.8*getCaloCompatability(iMuon,true,true);
359 lVal += 0.8*getCaloCompatabilitySlowly(iMuon,true,true);
360 if(lVal > 1.0) return true;
361 return false;
362 break;
363 default:
364 return false;
365 }
366 return false;
367 }
368 bool isGood(mithep::Muon *iMuon,selection iSelection);
369 private:
370 TFile *fMuon_templates;
371 TFile *fPion_templates;
372 TH2D* fpion_em_etaEmi;
373 TH2D* fpion_had_etaEmi;
374 TH2D* fpion_had_etaTmi;
375 TH2D* fpion_em_etaB;
376 TH2D* fpion_had_etaB;
377 TH2D* fpion_ho_etaB;
378 TH2D* fpion_had_etaTpl;
379 TH2D* fpion_em_etaEpl;
380 TH2D* fpion_had_etaEpl;
381 TH2D* fmuon_em_etaEmi;
382 TH2D* fmuon_had_etaEmi;
383 TH2D* fmuon_had_etaTmi;
384 TH2D* fmuon_em_etaB;
385 TH2D* fmuon_had_etaB;
386 TH2D* fmuon_ho_etaB;
387 TH2D* fmuon_had_etaTpl;
388 TH2D* fmuon_em_etaEpl;
389 TH2D* fmuon_had_etaEpl;
390 };
391 }
392
393 #endif