ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/Mods/src/MuonIDMod.cc
(Generate patch)

Comparing UserCode/MitPhysics/Mods/src/MuonIDMod.cc (file contents):
Revision 1.13 by loizides, Thu Dec 11 15:53:03 2008 UTC vs.
Revision 1.35 by ceballos, Wed Oct 20 02:44:16 2010 UTC

# Line 1 | Line 1
1 < // $Id$
1 >        // $Id$
2  
3   #include "MitPhysics/Mods/interface/MuonIDMod.h"
4   #include "MitCommon/MathTools/interface/MathUtils.h"
5 + #include "MitAna/DataTree/interface/MuonCol.h"
6 + #include "MitAna/DataTree/interface/VertexCol.h"
7   #include "MitPhysics/Init/interface/ModNames.h"
8  
9   using namespace mithep;
# Line 13 | Line 15 | ClassImp(mithep::MuonIDMod)
15    BaseMod(name,title),
16    fMuonBranchName(Names::gkMuonBrn),
17    fCleanMuonsName(ModNames::gkCleanMuonsName),  
18 <  fMuonIDType("Loose"),
18 >  fVertexName(ModNames::gkGoodVertexesName),
19 >  fMuonIDType("Minimal"),
20    fMuonIsoType("TrackCaloSliding"),  
21    fMuonClassType("Global"),  
22    fTrackIsolationCut(3.0),
23    fCaloIsolationCut(3.0),
24    fCombIsolationCut(5.0),
25    fMuonPtMin(10),
26 <  fMuons(0)
26 >  fApplyD0Cut(kTRUE),
27 >  fD0Cut(0.020),
28 >  fEtaCut(2.4),
29 >  fReverseIsoCut(kFALSE),
30 >  fReverseD0Cut(kFALSE),
31 >  fMuIDType(kIdUndef),
32 >  fMuIsoType(kIsoUndef),
33 >  fMuClassType(kClassUndef),
34 >  fMuons(0),
35 >  fVertices(0),
36 >  fMuonTools(0)
37   {
38    // Constructor.
39   }
# Line 30 | Line 43 | void MuonIDMod::Process()
43   {
44    // Process entries of the tree.
45  
46 <  LoadBranch(fMuonBranchName);
46 >  LoadEventObject(fMuonBranchName, fMuons);
47  
48    MuonOArr *CleanMuons = new MuonOArr;
49    CleanMuons->SetName(fCleanMuonsName);
# Line 39 | Line 52 | void MuonIDMod::Process()
52      const Muon *mu = fMuons->At(i);
53  
54      Bool_t pass = kFALSE;
55 <    Double_t pt = -1; // make sure pt is taken from the correct track!
55 >    Double_t pt = 0;  // make sure pt is taken from the correct track!
56 >    Double_t eta = 0; // make sure eta is taken from the correct track!
57      switch (fMuClassType) {
58        case kAll:
59          pass = kTRUE;
60 <        pt = mu->Pt();
60 >        if (mu->HasTrk()) {
61 >          pt  = mu->Pt();
62 >          eta = TMath::Abs(mu->Eta());
63 >        }
64          break;
65        case kGlobal:
66 <        pass = (mu->GlobalTrk() != 0);
67 <        if (pass)
68 <          pt = mu->GlobalTrk()->Pt();
69 <        break;
66 >        pass = mu->HasGlobalTrk() && mu->IsTrackerMuon();
67 >        if (pass && mu->TrackerTrk()) {
68 >          pt  = mu->TrackerTrk()->Pt();
69 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
70 >        }
71 >        else {
72 >          pt  = mu->Pt();
73 >          eta = TMath::Abs(mu->Eta());
74 >        }
75 >        break;
76        case kSta:
77 <        pass = (mu->StandaloneTrk() != 0);
78 <        if (pass)
79 <          pt = mu->StandaloneTrk()->Pt();
80 <        break;
81 <      case kTrackerOnly:
82 <        pass = (mu->TrackerTrk() != 0);
83 <        if (pass)
84 <          pt = mu->TrackerTrk()->Pt();
77 >        pass = mu->HasStandaloneTrk();
78 >        if (pass) {
79 >          pt  = mu->StandaloneTrk()->Pt();
80 >          eta = TMath::Abs(mu->StandaloneTrk()->Eta());
81 >        }
82 >        break;
83 >      case kTrackerMuon:
84 >        pass = mu->HasTrackerTrk() && mu->IsTrackerMuon() &&
85 >               mu->Quality().Quality(MuonQuality::TrackerMuonArbitrated);
86 >        if (pass) {
87 >          pt  = mu->TrackerTrk()->Pt();
88 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
89 >        }
90 >        break;
91 >      case kCaloMuon:
92 >        pass = mu->HasTrackerTrk() && mu->IsCaloMuon();
93 >        if (pass) {
94 >          pt  = mu->TrackerTrk()->Pt();
95 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
96 >        }
97 >        break;
98 >      case kTrackerBased:
99 >        pass = mu->HasTrackerTrk();
100 >        if (pass) {
101 >          pt  = mu->TrackerTrk()->Pt();
102 >          eta = TMath::Abs(mu->TrackerTrk()->Eta());
103 >        }
104          break;
105        default:
106          break;
# Line 70 | Line 112 | void MuonIDMod::Process()
112      if (pt <= fMuonPtMin)
113        continue;
114  
115 +    if (eta >= fEtaCut)
116 +      continue;
117 +
118 +    Double_t RChi2 = 0.0;
119 +    if     (mu->HasGlobalTrk()) {
120 +      RChi2 = mu->GlobalTrk()->Chi2()/mu->GlobalTrk()->Ndof();
121 +    }
122 +    else if(mu->BestTrk() != 0){
123 +      RChi2 = mu->BestTrk()->Chi2()/mu->BestTrk()->Ndof();
124 +    }
125      Bool_t idpass = kFALSE;
126      switch (fMuIDType) {
127 +      case kWMuId:
128 +        idpass = mu->BestTrk() != 0 &&
129 +                 mu->BestTrk()->NHits() > 10 &&
130 +                 RChi2 < 10.0 &&
131 +                 mu->NSegments() > 1 &&
132 +                 mu->BestTrk()->NPixelHits() > 0 &&
133 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
134 +        break;
135 +      case kZMuId:
136 +        idpass = mu->BestTrk() != 0 &&
137 +                 mu->BestTrk()->NHits() > 10 &&
138 +                 mu->NSegments() > 1 &&
139 +                 mu->BestTrk()->NPixelHits() > 0 &&
140 +                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
141 +        break;
142        case kLoose:
143 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationLoose) &&
144 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityLoose);
143 >        idpass = mu->BestTrk() != 0 &&
144 >                 mu->Quality().Quality(MuonQuality::TMOneStationLoose) &&
145 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityLoose) &&
146 >                 mu->BestTrk()->NHits() > 10 &&
147 >                 RChi2 < 10.0 &&
148 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
149          break;
150        case kTight:
151 <        idpass = fMuonTools->IsGood(mu, MuonTools::kTMOneStationTight) &&
152 <                 fMuonTools->IsGood(mu, MuonTools::kTM2DCompatibilityTight);
151 >        idpass = mu->BestTrk() !=  0 &&
152 >                 mu->Quality().Quality(MuonQuality::TMOneStationTight) &&
153 >                 mu->Quality().Quality(MuonQuality::TM2DCompatibilityTight) &&
154 >                 mu->BestTrk()->NHits() > 10 &&
155 >                 RChi2 < 10.0 &&
156 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
157 >        break;
158 >      case kMinimal:
159 >        idpass = mu->BestTrk() != 0 &&
160 >                 mu->BestTrk()->NHits() > 10 &&
161 >                 RChi2 < 10.0 &&
162 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight);
163 >        break;
164 >      case kNoId:
165 >        idpass = kTRUE;
166          break;
167        default:
168          break;
# Line 87 | Line 171 | void MuonIDMod::Process()
171      if (!idpass)
172        continue;
173  
174 <    Bool_t isopass = kFALSE;
174 >    Bool_t isocut = kFALSE;
175      switch (fMuIsoType) {
176        case kTrackCalo:
177 <        isopass = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
177 >        isocut = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
178            (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
179          break;
180        case kTrackCaloCombined:
181 <        isopass = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
182 <                   1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
181 >        isocut = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
182 >                  1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
183          break;
184        case kTrackCaloSliding:
185          {
186            Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
187                                1.0 * mu->IsoR03EmEt() +
188                                1.0 * mu->IsoR03HadEt();
189 <          if ((totalIso < (mu->Pt()-10.0)*5.0/15.0 && mu->Pt() <= 25) ||
190 <              (totalIso < 5.0 && mu->Pt() > 25) ||
191 <               totalIso <= 0)
192 <            isopass = kTRUE;
193 <        }
189 >          if (totalIso < (mu->Pt()*0.15) )
190 >            isocut = kTRUE;
191 >
192 >          if     (fReverseIsoCut == kTRUE &&
193 >                  isocut == kFALSE && totalIso < 10)
194 >            isocut = kTRUE;
195 >          else if(fReverseIsoCut == kTRUE)
196 >            isocut = kFALSE;
197 >        }
198          break;
199        case kNoIso:
200 <        isopass = kTRUE;
200 >        isocut = kTRUE;
201          break;
202        case kCustomIso:
203        default:
204          break;
205      }
206  
207 <    if (!isopass)
207 >    if (isocut == kFALSE)
208        continue;
209  
210 +    if (fApplyD0Cut) {
211 +      fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
212 +      Bool_t passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fReverseD0Cut);
213 +      if (!passD0cut)
214 +        continue;
215 +    }
216 +
217      // add good muon
218      CleanMuons->Add(mu);
219    }
# Line 136 | Line 231 | void MuonIDMod::SlaveBegin()
231    // Run startup code on the computer (slave) doing the actual analysis. Here,
232    // we just request the muon collection branch.
233  
234 <  ReqBranch(fMuonBranchName, fMuons);
234 >  ReqEventObject(fMuonBranchName, fMuons, kTRUE);
235  
236    fMuonTools = new MuonTools;
237  
238 <  if (fMuonIDType.CompareTo("Tight") == 0)
238 >  if (fMuonIDType.CompareTo("WMuId") == 0)
239 >    fMuIDType = kWMuId;
240 >  else if (fMuonIDType.CompareTo("ZMuId") == 0)
241 >    fMuIDType = kZMuId;
242 >  else if (fMuonIDType.CompareTo("Tight") == 0)
243      fMuIDType = kTight;
244    else if (fMuonIDType.CompareTo("Loose") == 0)
245      fMuIDType = kLoose;
246 +  else if (fMuonIDType.CompareTo("Minimal") == 0)
247 +    fMuIDType = kMinimal;
248    else if (fMuonIDType.CompareTo("NoId") == 0)
249      fMuIDType = kNoId;
250    else if (fMuonIDType.CompareTo("Custom") == 0) {
# Line 182 | Line 283 | void MuonIDMod::SlaveBegin()
283      fMuClassType = kGlobal;
284    else if (fMuonClassType.CompareTo("Standalone") == 0)
285      fMuClassType = kSta;
286 <  else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
287 <    fMuClassType = kTrackerOnly;
286 >  else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
287 >    fMuClassType = kTrackerMuon;
288 >  else if (fMuonClassType.CompareTo("CaloMuon") == 0)
289 >    fMuClassType = kCaloMuon;
290 >  else if (fMuonClassType.CompareTo("TrackerBased") == 0)
291 >    fMuClassType = kTrackerBased;
292    else {
293      SendError(kAbortAnalysis, "SlaveBegin",
294                "The specified muon class %s is not defined.",

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines