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.36 by ceballos, Fri Oct 29 16:20:07 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("WWMuId"),
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 || mu->NMatches() > 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 || mu->NMatches() > 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 kWWMuId:
159 >        idpass = mu->BestTrk() != 0 &&
160 >                 mu->BestTrk()->NHits() > 10 &&
161 >                 RChi2 < 10.0 &&
162 >                (mu->NSegments() > 1 || mu->NMatches() > 1) &&
163 >                 mu->BestTrk()->NPixelHits() > 0 &&
164 >                 mu->Quality().Quality(MuonQuality::GlobalMuonPromptTight) &&
165 >                 mu->BestTrk()->PtErr()/mu->BestTrk()->Pt() < 0.1;
166 >        break;
167 >      case kNoId:
168 >        idpass = kTRUE;
169          break;
170        default:
171          break;
# Line 87 | Line 174 | void MuonIDMod::Process()
174      if (!idpass)
175        continue;
176  
177 <    Bool_t isopass = kFALSE;
177 >    Bool_t isocut = kFALSE;
178      switch (fMuIsoType) {
179        case kTrackCalo:
180 <        isopass = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
180 >        isocut = (mu->IsoR03SumPt() < fTrackIsolationCut) &&
181            (mu->IsoR03EmEt() + mu->IsoR03HadEt() < fCaloIsolationCut);
182          break;
183        case kTrackCaloCombined:
184 <        isopass = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
185 <                   1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
184 >        isocut = (1.0 * mu->IsoR03SumPt() + 1.0 * mu->IsoR03EmEt() +
185 >                  1.0 * mu->IsoR03HadEt() < fCombIsolationCut);
186          break;
187        case kTrackCaloSliding:
188          {
189            Double_t totalIso = 1.0 * mu->IsoR03SumPt() +
190                                1.0 * mu->IsoR03EmEt() +
191                                1.0 * mu->IsoR03HadEt();
192 <          if ((totalIso < (mu->Pt()-10.0)*5.0/15.0 && mu->Pt() <= 25) ||
193 <              (totalIso < 5.0 && mu->Pt() > 25) ||
194 <               totalIso <= 0)
195 <            isopass = kTRUE;
196 <        }
192 >          if (totalIso < (mu->Pt()*0.15) )
193 >            isocut = kTRUE;
194 >
195 >          if     (fReverseIsoCut == kTRUE &&
196 >                  isocut == kFALSE && totalIso < 10)
197 >            isocut = kTRUE;
198 >          else if(fReverseIsoCut == kTRUE)
199 >            isocut = kFALSE;
200 >        }
201          break;
202        case kNoIso:
203 <        isopass = kTRUE;
203 >        isocut = kTRUE;
204          break;
205        case kCustomIso:
206        default:
207          break;
208      }
209  
210 <    if (!isopass)
210 >    if (isocut == kFALSE)
211        continue;
212  
213 +    if (fApplyD0Cut) {
214 +      fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
215 +      Bool_t passD0cut = MuonTools::PassD0Cut(mu, fVertices, fD0Cut, fReverseD0Cut);
216 +      if (!passD0cut)
217 +        continue;
218 +    }
219 +
220      // add good muon
221      CleanMuons->Add(mu);
222    }
# Line 136 | Line 234 | void MuonIDMod::SlaveBegin()
234    // Run startup code on the computer (slave) doing the actual analysis. Here,
235    // we just request the muon collection branch.
236  
237 <  ReqBranch(fMuonBranchName, fMuons);
237 >  ReqEventObject(fMuonBranchName, fMuons, kTRUE);
238  
239    fMuonTools = new MuonTools;
240  
241 <  if (fMuonIDType.CompareTo("Tight") == 0)
241 >  if (fMuonIDType.CompareTo("WMuId") == 0)
242 >    fMuIDType = kWMuId;
243 >  else if (fMuonIDType.CompareTo("ZMuId") == 0)
244 >    fMuIDType = kZMuId;
245 >  else if (fMuonIDType.CompareTo("Tight") == 0)
246      fMuIDType = kTight;
247    else if (fMuonIDType.CompareTo("Loose") == 0)
248      fMuIDType = kLoose;
249 +  else if (fMuonIDType.CompareTo("WWMuId") == 0)
250 +    fMuIDType = kWWMuId;
251    else if (fMuonIDType.CompareTo("NoId") == 0)
252      fMuIDType = kNoId;
253    else if (fMuonIDType.CompareTo("Custom") == 0) {
# Line 182 | Line 286 | void MuonIDMod::SlaveBegin()
286      fMuClassType = kGlobal;
287    else if (fMuonClassType.CompareTo("Standalone") == 0)
288      fMuClassType = kSta;
289 <  else if (fMuonClassType.CompareTo("TrackerOnly") == 0)
290 <    fMuClassType = kTrackerOnly;
289 >  else if (fMuonClassType.CompareTo("TrackerMuon") == 0)
290 >    fMuClassType = kTrackerMuon;
291 >  else if (fMuonClassType.CompareTo("CaloMuon") == 0)
292 >    fMuClassType = kCaloMuon;
293 >  else if (fMuonClassType.CompareTo("TrackerBased") == 0)
294 >    fMuClassType = kTrackerBased;
295    else {
296      SendError(kAbortAnalysis, "SlaveBegin",
297                "The specified muon class %s is not defined.",

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines