ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/MuonIDMod.cc
Revision: 1.21
Committed: Tue May 19 11:42:20 2009 UTC (15 years, 11 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.20: +20 -16 lines
Log Message:
Use the new ReqEventObject model.

File Contents

# User Rev Content
1 loizides 1.21 // $Id: MuonIDMod.cc,v 1.20 2009/05/11 08:02:43 loizides Exp $
2 loizides 1.1
3     #include "MitPhysics/Mods/interface/MuonIDMod.h"
4 loizides 1.6 #include "MitCommon/MathTools/interface/MathUtils.h"
5     #include "MitPhysics/Init/interface/ModNames.h"
6 loizides 1.1
7     using namespace mithep;
8    
9     ClassImp(mithep::MuonIDMod)
10    
11     //--------------------------------------------------------------------------------------------------
12     MuonIDMod::MuonIDMod(const char *name, const char *title) :
13     BaseMod(name,title),
14 loizides 1.6 fMuonBranchName(Names::gkMuonBrn),
15     fCleanMuonsName(ModNames::gkCleanMuonsName),
16 loizides 1.15 fVertexName("PrimaryVertexesBeamSpot"),
17 loizides 1.8 fMuonIDType("Loose"),
18     fMuonIsoType("TrackCaloSliding"),
19 loizides 1.6 fMuonClassType("Global"),
20 ceballos 1.2 fTrackIsolationCut(3.0),
21     fCaloIsolationCut(3.0),
22 loizides 1.8 fCombIsolationCut(5.0),
23 ceballos 1.3 fMuonPtMin(10),
24 loizides 1.21 fApplyD0Cut(kTRUE),
25 loizides 1.15 fD0Cut(0.025),
26 loizides 1.20 fReverseIsoCut(kFALSE),
27 loizides 1.15 fMuIDType(kIdUndef),
28     fMuIsoType(kIsoUndef),
29     fMuClassType(kClassUndef),
30 ceballos 1.14 fMuons(0),
31 loizides 1.15 fVertices(0),
32 loizides 1.20 fMuonTools(0)
33 loizides 1.1 {
34     // Constructor.
35     }
36    
37     //--------------------------------------------------------------------------------------------------
38     void MuonIDMod::Process()
39     {
40     // Process entries of the tree.
41    
42 loizides 1.21 LoadEventObject(fMuonBranchName, fMuons);
43     LoadEventObject(fVertexName, fVertices);
44 loizides 1.1
45 loizides 1.7 MuonOArr *CleanMuons = new MuonOArr;
46     CleanMuons->SetName(fCleanMuonsName);
47 loizides 1.1
48     for (UInt_t i=0; i<fMuons->GetEntries(); ++i) {
49 loizides 1.8 const Muon *mu = fMuons->At(i);
50 loizides 1.6
51     Bool_t pass = kFALSE;
52 loizides 1.19 Double_t pt = 0; // make sure pt is taken from the correct track!
53 loizides 1.6 switch (fMuClassType) {
54     case kAll:
55     pass = kTRUE;
56 loizides 1.19 if (mu->HasTrk())
57     pt = mu->Pt();
58 loizides 1.6 break;
59     case kGlobal:
60 loizides 1.19 pass = mu->HasGlobalTrk();
61 loizides 1.6 if (pass)
62     pt = mu->GlobalTrk()->Pt();
63     break;
64     case kSta:
65 loizides 1.19 pass = mu->HasStandaloneTrk();
66 loizides 1.6 if (pass)
67     pt = mu->StandaloneTrk()->Pt();
68     break;
69     case kTrackerOnly:
70 loizides 1.19 pass = mu->HasTrackerTrk();
71 loizides 1.6 if (pass)
72     pt = mu->TrackerTrk()->Pt();
73     break;
74     default:
75     break;
76 ceballos 1.5 }
77 loizides 1.6
78     if (!pass)
79     continue;
80    
81     if (pt <= fMuonPtMin)
82     continue;
83    
84     Bool_t idpass = kFALSE;
85     switch (fMuIDType) {
86     case kLoose:
87     idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationLoose) &&
88     fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityLoose);
89     break;
90     case kTight:
91     idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationTight) &&
92     fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityTight);
93     break;
94 loizides 1.18 case kNoId:
95     idpass = kTRUE;
96     break;
97 loizides 1.6 default:
98     break;
99 ceballos 1.4 }
100 loizides 1.6
101     if (!idpass)
102     continue;
103    
104     Bool_t isopass = kFALSE;
105     switch (fMuIsoType) {
106     case kTrackCalo:
107     isopass = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
108     (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
109     break;
110     case kTrackCaloCombined:
111     isopass = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
112     1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
113     break;
114     case kTrackCaloSliding:
115     {
116     Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
117     1.0 * mu->IsoR03EmEt() +
118     1.0 * mu->IsoR03HadEt();
119 loizides 1.19 if ((totalIso < (pt-10.0)*5.0/15.0 && pt <= 25) ||
120 ceballos 1.9 (totalIso < 5.0 && mu->Pt() > 25) ||
121     totalIso <= 0)
122 loizides 1.6 isopass = kTRUE;
123     }
124     break;
125 loizides 1.13 case kNoIso:
126     isopass = kTRUE;
127     break;
128 loizides 1.6 case kCustomIso:
129     default:
130     break;
131 ceballos 1.4 }
132 ceballos 1.3
133 ceballos 1.16 if ((isopass == kFALSE && fReverseIsoCut == kFALSE) ||
134     (isopass == kTRUE && fReverseIsoCut == kTRUE))
135 loizides 1.6 continue;
136    
137 loizides 1.21 if (fApplyD0Cut) {
138     const Track *mt = mu->BestTrk();
139     if (!mt)
140     continue;
141     Double_t d0_real = 1e30;
142     for(UInt_t i0 = 0; i0 < fVertices->GetEntries(); i0++) {
143     Double_t pD0 = mt->D0Corrected(*fVertices->At(i0));
144     if(TMath::Abs(pD0) < TMath::Abs(d0_real))
145     d0_real = TMath::Abs(pD0);
146     }
147     if(d0_real >= fD0Cut)
148     continue;
149 ceballos 1.14 }
150    
151 loizides 1.6 // add good muon
152     CleanMuons->Add(mu);
153 loizides 1.1 }
154    
155 loizides 1.10 // sort according to pt
156     CleanMuons->Sort();
157    
158 loizides 1.6 // add objects for other modules to use
159 loizides 1.7 AddObjThisEvt(CleanMuons);
160 loizides 1.1 }
161    
162     //--------------------------------------------------------------------------------------------------
163     void MuonIDMod::SlaveBegin()
164     {
165     // Run startup code on the computer (slave) doing the actual analysis. Here,
166 loizides 1.6 // we just request the muon collection branch.
167    
168 loizides 1.21 ReqEventObject(fMuonBranchName, fMuons, kTRUE);
169    
170     if (fApplyD0Cut)
171     ReqEventObject(fVertexName, fVertices, kTRUE);
172 loizides 1.1
173 loizides 1.6 fMuonTools = new MuonTools;
174 loizides 1.1
175 loizides 1.6 if (fMuonIDType.CompareTo("Tight") == 0)
176     fMuIDType = kTight;
177     else if (fMuonIDType.CompareTo("Loose") == 0)
178     fMuIDType = kLoose;
179 loizides 1.12 else if (fMuonIDType.CompareTo("NoId") == 0)
180     fMuIDType = kNoId;
181 loizides 1.6 else if (fMuonIDType.CompareTo("Custom") == 0) {
182     fMuIDType = kCustomId;
183     SendError(kWarning, "SlaveBegin",
184     "Custom muon identification is not yet implemented.");
185     } else {
186     SendError(kAbortAnalysis, "SlaveBegin",
187     "The specified muon identification %s is not defined.",
188     fMuonIDType.Data());
189     return;
190     }
191 loizides 1.1
192 loizides 1.6 if (fMuonIsoType.CompareTo("TrackCalo") == 0)
193     fMuIsoType = kTrackCalo;
194     else if (fMuonIsoType.CompareTo("TrackCaloCombined") == 0)
195     fMuIsoType = kTrackCaloCombined;
196     else if (fMuonIsoType.CompareTo("TrackCaloSliding") == 0)
197     fMuIsoType = kTrackCaloSliding;
198     else if (fMuonIsoType.CompareTo("NoIso") == 0)
199     fMuIsoType = kNoIso;
200     else if (fMuonIsoType.CompareTo("Custom") == 0) {
201     fMuIsoType = kCustomIso;
202     SendError(kWarning, "SlaveBegin",
203     "Custom muon isolation is not yet implemented.");
204     } else {
205     SendError(kAbortAnalysis, "SlaveBegin",
206     "The specified muon isolation %s is not defined.",
207     fMuonIsoType.Data());
208     return;
209     }
210 loizides 1.1
211 loizides 1.6 if (fMuonClassType.CompareTo("All") == 0)
212     fMuClassType = kAll;
213     else if (fMuonClassType.CompareTo("Global") == 0)
214     fMuClassType = kGlobal;
215     else if (fMuonClassType.CompareTo("Standalone") == 0)
216     fMuClassType = kSta;
217     else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
218     fMuClassType = kTrackerOnly;
219     else {
220     SendError(kAbortAnalysis, "SlaveBegin",
221     "The specified muon class %s is not defined.",
222     fMuonClassType.Data());
223     return;
224     }
225 loizides 1.1 }