ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMuons.cc
Revision: 1.39
Committed: Tue Mar 22 00:22:51 2011 UTC (14 years, 1 month ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_020d, TMit_020d, Mit_020c, Mit_021pre2, Mit_021pre1, Mit_020b, Mit_020a, Mit_020
Changes since 1.38: +3 -3 lines
Log Message:
fix bug in impact parameter filling

File Contents

# Content
1 // $Id: FillerMuons.cc,v 1.38 2011/03/13 22:16:08 bendavid Exp $
2
3 #include "MitProd/TreeFiller/interface/FillerMuons.h"
4 #include "DataFormats/MuonReco/interface/Muon.h"
5 #include "DataFormats/MuonReco/interface/MuonQuality.h"
6 #include "DataFormats/MuonReco/interface/MuonFwd.h"
7 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
8 #include "DataFormats/Common/interface/RefToPtr.h"
9 #include "DataFormats/VertexReco/interface/VertexFwd.h"
10 #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
11 #include "TrackingTools/TransientTrack/plugins/TransientTrackBuilderESProducer.h"
12 #include "TrackingTools/IPTools/interface/IPTools.h"
13 #include "RecoVertex/KalmanVertexFit/interface/KalmanVertexTrackCompatibilityEstimator.h"
14 #include "MitAna/DataTree/interface/Names.h"
15 #include "MitAna/DataTree/interface/MuonCol.h"
16 #include "MitAna/DataTree/interface/Track.h"
17 #include "MitProd/ObjectService/interface/ObjectService.h"
18 #include "RecoVertex/VertexTools/interface/LinearizedTrackStateFactory.h"
19 #include "RecoVertex/VertexTools/interface/VertexTrackFactory.h"
20 #include "RecoVertex/VertexPrimitives/interface/VertexTrack.h"
21 #include "RecoVertex/VertexPrimitives/interface/CachingVertex.h"
22 #include "RecoVertex/KalmanVertexFit/interface/KalmanVertexUpdator.h"
23
24 using namespace std;
25 using namespace edm;
26 using namespace mithep;
27
28 //--------------------------------------------------------------------------------------------------
29 FillerMuons::FillerMuons(const edm::ParameterSet &cfg, const char *name, bool active) :
30 BaseFiller(cfg,name,active),
31 edmName_(Conf().getUntrackedParameter<string>("edmName","muons")),
32 expectedHitsName_(Conf().getUntrackedParameter<string>("expectedHitsName","")),
33 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkMuonBrn)),
34 globalTrackMapName_(Conf().getUntrackedParameter<string>("globalTrackMapName","")),
35 staTrackMapName_(Conf().getUntrackedParameter<string>("staTrackMapName","")),
36 staVtxTrackMapName_(Conf().getUntrackedParameter<string>("staVtxTrackMapName","")),
37 trackerTrackMapName_(Conf().getUntrackedParameter<string>("trackerTrackMapName","")),
38 muonMapName_(Conf().getUntrackedParameter<string>("muonMapName","")),
39 pvEdmName_(Conf().getUntrackedParameter<string>("pvEdmName","offlinePrimaryVertices")),
40 pvBSEdmName_(Conf().getUntrackedParameter<string>("pvBSEdmName","offlinePrimaryVerticesWithBS")),
41 globalTrackMap_(0),
42 standaloneTrackMap_(0),
43 standaloneVtxTrackMap_(0),
44 trackerTrackMap_(0),
45 muonMap_(new mithep::MuonMap),
46 muons_(new mithep::MuonArr(16))
47 {
48 // Constructor.
49 }
50
51 //--------------------------------------------------------------------------------------------------
52 FillerMuons::~FillerMuons()
53 {
54 // Destructor.
55
56 delete muons_;
57 delete muonMap_;
58 }
59
60 //--------------------------------------------------------------------------------------------------
61 void FillerMuons::BookDataBlock(TreeWriter &tws)
62 {
63 // Add muons branch to tree and get pointers to maps.
64
65 tws.AddBranch(mitName_,&muons_);
66 OS()->add<mithep::MuonArr>(muons_,mitName_);
67
68 if (!globalTrackMapName_.empty()) {
69 globalTrackMap_ = OS()->get<TrackMap>(globalTrackMapName_);
70 if (globalTrackMap_)
71 AddBranchDep(mitName_,globalTrackMap_->GetBrName());
72 }
73 if (!staTrackMapName_.empty()) {
74 standaloneTrackMap_ = OS()->get<TrackMap>(staTrackMapName_);
75 if (standaloneTrackMap_)
76 AddBranchDep(mitName_,standaloneTrackMap_->GetBrName());
77 }
78 if (!staVtxTrackMapName_.empty()) {
79 standaloneVtxTrackMap_ = OS()->get<TrackMap>(staVtxTrackMapName_);
80 if (standaloneVtxTrackMap_)
81 AddBranchDep(mitName_,standaloneVtxTrackMap_->GetBrName());
82 }
83 if (!trackerTrackMapName_.empty()) {
84 trackerTrackMap_ = OS()->get<TrackMap>(trackerTrackMapName_);
85 if (trackerTrackMap_)
86 AddBranchDep(mitName_,trackerTrackMap_->GetBrName());
87 }
88 if (!muonMapName_.empty()) {
89 muonMap_->SetBrName(mitName_);
90 OS()->add<MuonMap>(muonMap_,muonMapName_);
91 }
92 }
93
94 //--------------------------------------------------------------------------------------------------
95 void FillerMuons::FillDataBlock(const edm::Event &event,
96 const edm::EventSetup &setup)
97 {
98 // Fill muon information.
99
100 muons_->Delete();
101 muonMap_->Reset();
102
103 Handle<reco::MuonCollection> hMuonProduct;
104 GetProduct(edmName_, hMuonProduct, event);
105 const reco::MuonCollection inMuons = *(hMuonProduct.product());
106
107 edm::Handle<reco::VertexCollection> hVertex;
108 event.getByLabel(pvEdmName_, hVertex);
109 const reco::VertexCollection *pvCol = hVertex.product();
110
111 edm::Handle<reco::VertexCollection> hVertexBS;
112 event.getByLabel(pvBSEdmName_, hVertexBS);
113 const reco::VertexCollection *pvBSCol = hVertexBS.product();
114
115 edm::ESHandle<TransientTrackBuilder> hTransientTrackBuilder;
116 setup.get<TransientTrackRecord>().get("TransientTrackBuilder",hTransientTrackBuilder);
117 const TransientTrackBuilder *transientTrackBuilder = hTransientTrackBuilder.product();
118
119 KalmanVertexTrackCompatibilityEstimator<5> kalmanEstimator;
120
121 LinearizedTrackStateFactory lTrackFactory;
122 VertexTrackFactory<5> vTrackFactory;
123 KalmanVertexUpdator<5> updator;
124
125 for (reco::MuonCollection::const_iterator iM = inMuons.begin(); iM != inMuons.end(); ++iM) {
126 mithep::Muon* outMuon = muons_->AddNew();
127
128 outMuon->SetPtEtaPhi(iM->pt(),iM->eta(),iM->phi());
129 outMuon->SetCharge(iM->charge());
130
131 outMuon->SetIsoR03SumPt(iM->isolationR03().sumPt);
132 outMuon->SetIsoR03EmEt(iM->isolationR03().emEt);
133 outMuon->SetIsoR03HadEt(iM->isolationR03().hadEt);
134 outMuon->SetIsoR03HoEt(iM->isolationR03().hoEt);
135 outMuon->SetIsoR03NTracks(iM->isolationR03().nTracks);
136 outMuon->SetIsoR03NJets(iM->isolationR03().nJets);
137 outMuon->SetIsoR05SumPt(iM->isolationR05().sumPt);
138 outMuon->SetIsoR05EmEt(iM->isolationR05().emEt);
139 outMuon->SetIsoR05HadEt(iM->isolationR05().hadEt);
140 outMuon->SetIsoR05HoEt(iM->isolationR05().hoEt);
141 outMuon->SetIsoR05NTracks(iM->isolationR05().nTracks);
142 outMuon->SetIsoR05NJets(iM->isolationR05().nJets);
143 outMuon->SetEmEnergy(iM->calEnergy().em);
144 outMuon->SetHadEnergy(iM->calEnergy().had);
145 outMuon->SetHoEnergy(iM->calEnergy().ho);
146 outMuon->SetEmS9Energy(iM->calEnergy().emS9);
147 outMuon->SetHadS9Energy(iM->calEnergy().hadS9);
148 outMuon->SetHoS9Energy(iM->calEnergy().hoS9);
149 outMuon->SetIsGlobalMuon(iM->isGlobalMuon());
150 outMuon->SetIsTrackerMuon(iM->isTrackerMuon());
151 outMuon->SetIsStandaloneMuon(iM->isStandAloneMuon());
152 outMuon->SetIsCaloMuon(iM->isCaloMuon());
153
154 //save results from the muon selector in the MuonQuality bitmask
155 outMuon->Quality().SetQuality(MuonQuality::All);
156 if (muon::isGoodMuon(*iM,muon::AllGlobalMuons))
157 outMuon->Quality().SetQuality(MuonQuality::AllGlobalMuons);
158 if (muon::isGoodMuon(*iM,muon::AllStandAloneMuons))
159 outMuon->Quality().SetQuality(MuonQuality::AllStandAloneMuons);
160 if (muon::isGoodMuon(*iM,muon::AllTrackerMuons))
161 outMuon->Quality().SetQuality(MuonQuality::AllTrackerMuons);
162 if (muon::isGoodMuon(*iM,muon::TrackerMuonArbitrated))
163 outMuon->Quality().SetQuality(MuonQuality::TrackerMuonArbitrated);
164 if (muon::isGoodMuon(*iM,muon::AllArbitrated))
165 outMuon->Quality().SetQuality(MuonQuality::AllArbitrated);
166 if (muon::isGoodMuon(*iM,muon::GlobalMuonPromptTight))
167 outMuon->Quality().SetQuality(MuonQuality::GlobalMuonPromptTight);
168 if (muon::isGoodMuon(*iM,muon::TMLastStationLoose))
169 outMuon->Quality().SetQuality(MuonQuality::TMLastStationLoose);
170 if (muon::isGoodMuon(*iM,muon::TMLastStationTight))
171 outMuon->Quality().SetQuality(MuonQuality::TMLastStationTight);
172 if (muon::isGoodMuon(*iM,muon::TM2DCompatibilityLoose))
173 outMuon->Quality().SetQuality(MuonQuality::TM2DCompatibilityLoose);
174 if (muon::isGoodMuon(*iM,muon::TM2DCompatibilityTight))
175 outMuon->Quality().SetQuality(MuonQuality::TM2DCompatibilityTight);
176 if (muon::isGoodMuon(*iM,muon::TMOneStationLoose))
177 outMuon->Quality().SetQuality(MuonQuality::TMOneStationLoose);
178 if (muon::isGoodMuon(*iM,muon::TMOneStationTight))
179 outMuon->Quality().SetQuality(MuonQuality::TMOneStationTight);
180 if (muon::isGoodMuon(*iM,muon::TMLastStationOptimizedLowPtLoose))
181 outMuon->Quality().SetQuality(MuonQuality::TMLastStationOptimizedLowPtLoose);
182 if (muon::isGoodMuon(*iM,muon::TMLastStationOptimizedLowPtTight))
183 outMuon->Quality().SetQuality(MuonQuality::TMLastStationOptimizedLowPtTight);
184 if (muon::isGoodMuon(*iM,muon::GMTkChiCompatibility))
185 outMuon->Quality().SetQuality(MuonQuality::GMTkChiCompatibility);
186 if (muon::isGoodMuon(*iM,muon::GMStaChiCompatibility))
187 outMuon->Quality().SetQuality(MuonQuality::GMStaChiCompatibility);
188 if (muon::isGoodMuon(*iM,muon::GMTkKinkTight))
189 outMuon->Quality().SetQuality(MuonQuality::GMTkKinkTight);
190 if (muon::isGoodMuon(*iM,muon::TMLastStationAngLoose))
191 outMuon->Quality().SetQuality(MuonQuality::TMLastStationAngLoose);
192 if (muon::isGoodMuon(*iM,muon::TMLastStationAngTight))
193 outMuon->Quality().SetQuality(MuonQuality::TMLastStationAngTight);
194 if (muon::isGoodMuon(*iM,muon::TMOneStationAngLoose))
195 outMuon->Quality().SetQuality(MuonQuality::TMOneStationAngLoose);
196 if (muon::isGoodMuon(*iM,muon::TMOneStationAngTight))
197 outMuon->Quality().SetQuality(MuonQuality::TMOneStationAngTight);
198 if (muon::isGoodMuon(*iM,muon::TMLastStationOptimizedBarrelLowPtLoose))
199 outMuon->Quality().SetQuality(MuonQuality::TMLastStationOptimizedBarrelLowPtLoose);
200 if (muon::isGoodMuon(*iM,muon::TMLastStationOptimizedBarrelLowPtTight))
201 outMuon->Quality().SetQuality(MuonQuality::TMLastStationOptimizedBarrelLowPtTight);
202
203
204 if (globalTrackMap_ && iM->combinedMuon().isNonnull()) {
205 outMuon->SetGlobalTrk(globalTrackMap_->GetMit(refToPtr(iM->combinedMuon())));
206 outMuon->SetNValidHits (iM->globalTrack()->hitPattern().numberOfValidMuonHits());
207 }
208 if (standaloneTrackMap_ && standaloneVtxTrackMap_ && iM->standAloneMuon().isNonnull()) {
209 Int_t refProductId = iM->standAloneMuon().id().id();
210 if ( refProductId == standaloneVtxTrackMap_->GetEdmProductId())
211 outMuon->SetStandaloneTrk(standaloneVtxTrackMap_->GetMit(refToPtr(iM->standAloneMuon())));
212 else if ( refProductId == standaloneTrackMap_->GetEdmProductId())
213 outMuon->SetStandaloneTrk(standaloneTrackMap_->GetMit(refToPtr(iM->standAloneMuon())));
214 else throw edm::Exception(edm::errors::Configuration, "FillerMuons:FillDataBlock()\n")
215 << "Error! Track reference in unmapped collection " << edmName_ << endl;
216 }
217 if (trackerTrackMap_ && iM->track().isNonnull()) {
218 outMuon->SetTrackerTrk(trackerTrackMap_->GetMit(refToPtr(iM->track())));
219 }
220
221 //compute impact parameter with respect to PV
222 if (iM->track().isNonnull()) {
223 const reco::TransientTrack &tt = transientTrackBuilder->build(iM->track());
224
225 reco::Vertex thevtx;// = pvCol->at(0);
226 reco::Vertex thevtxbs;// = pvBSCol->at(0);
227
228 double mindzvtx = 9999.;
229 for (uint ivtx = 0; ivtx<pvCol->size(); ++ivtx) {
230 reco::Vertex avtx = pvCol->at(ivtx);
231 double dzvtx = std::abs(iM->track()->dz(avtx.position()));
232 if (dzvtx<mindzvtx) {
233 mindzvtx = dzvtx;
234 thevtx = avtx;
235 }
236 }
237
238 double mindzvtxbs = 9999.;
239 for (uint ivtxbs = 0; ivtxbs<pvBSCol->size(); ++ivtxbs) {
240 reco::Vertex avtxbs = pvBSCol->at(ivtxbs);
241 double dzvtxbs = std::abs(iM->track()->dz(avtxbs.position()));
242 if (dzvtxbs<mindzvtxbs) {
243 mindzvtxbs = dzvtxbs;
244 thevtxbs = avtxbs;
245 }
246 }
247
248 if (0) { //don't refit vertex for now
249
250 if (find(thevtx.tracks_begin(), thevtx.tracks_end(), tt.trackBaseRef()) != thevtx.tracks_end()) {
251 GlobalPoint linP(Basic3DVector<float> (thevtx.position()));
252 KalmanVertexUpdator<5>::RefCountedLinearizedTrackState linTrack = lTrackFactory.linearizedTrackState(linP, tt);
253 GlobalError err(thevtx.covariance());
254 VertexState vState(linP, err);
255 KalmanVertexUpdator<5>::RefCountedVertexTrack vertexTrack = vTrackFactory.vertexTrack(linTrack, vState);
256
257 std::vector<KalmanVertexUpdator<5>::RefCountedVertexTrack> initialTracks(1, vertexTrack);
258 CachingVertex<5> cachingVertex(linP, err, initialTracks, thevtx.chi2());
259 const CachingVertex<5> &newCachingVertex = updator.remove(cachingVertex,vertexTrack);
260
261 if (newCachingVertex.isValid()) {
262 const TransientVertex &tvtx = newCachingVertex;
263 thevtx = tvtx;
264 }
265 }
266
267 if (find(thevtxbs.tracks_begin(), thevtxbs.tracks_end(), tt.trackBaseRef()) != thevtxbs.tracks_end()) {
268 GlobalPoint linP(Basic3DVector<float> (thevtxbs.position()));
269 KalmanVertexUpdator<5>::RefCountedLinearizedTrackState linTrack = lTrackFactory.linearizedTrackState(linP, tt);
270 GlobalError err(thevtxbs.covariance());
271 VertexState vState(linP, err);
272 KalmanVertexUpdator<5>::RefCountedVertexTrack vertexTrack = vTrackFactory.vertexTrack(linTrack, vState);
273
274 std::vector<KalmanVertexUpdator<5>::RefCountedVertexTrack> initialTracks(1, vertexTrack);
275 CachingVertex<5> cachingVertex(linP, err, initialTracks, thevtxbs.chi2());
276 const CachingVertex<5> &newCachingVertex = updator.remove(cachingVertex,vertexTrack);
277
278 if (newCachingVertex.isValid()) {
279 const TransientVertex &tvtx = newCachingVertex;
280 thevtxbs = tvtx;
281 }
282 }
283
284 }
285
286 //preserve sign of transverse impact parameter (cross-product definition from track, not lifetime-signing)
287 const double thesign = ( (-iM->track()->dxy(thevtx.position())) >=0 ) ? 1. : -1.;
288 const double thesignbs = ( (-iM->track()->dxy(thevtxbs.position())) >=0 ) ? 1. : -1.;
289
290 const std::pair<bool,Measurement1D> &d0pv = IPTools::absoluteTransverseImpactParameter(tt,thevtx);
291 if (d0pv.first) {
292 outMuon->SetD0PV(thesign*d0pv.second.value());
293 outMuon->SetD0PVErr(d0pv.second.error());
294 }
295 else {
296 outMuon->SetD0PV(-99.0);
297 }
298
299 const std::pair<bool,Measurement1D> &ip3dpv = IPTools::absoluteImpactParameter3D(tt,thevtx);
300 if (ip3dpv.first) {
301 outMuon->SetIp3dPV(thesign*ip3dpv.second.value());
302 outMuon->SetIp3dPVErr(ip3dpv.second.error());
303 }
304 else {
305 outMuon->SetIp3dPV(-99.0);
306 }
307
308 const std::pair<bool,Measurement1D> &d0pvbs = IPTools::absoluteTransverseImpactParameter(tt,thevtxbs);
309 if (d0pvbs.first) {
310 outMuon->SetD0PVBS(thesignbs*d0pvbs.second.value());
311 outMuon->SetD0PVBSErr(d0pvbs.second.error());
312 }
313 else {
314 outMuon->SetD0PVBS(-99.0);
315 }
316
317 const std::pair<bool,Measurement1D> &ip3dpvbs = IPTools::absoluteImpactParameter3D(tt,thevtxbs);
318 if (ip3dpvbs.first) {
319 outMuon->SetIp3dPVBS(thesignbs*ip3dpvbs.second.value());
320 outMuon->SetIp3dPVBSErr(ip3dpvbs.second.error());
321 }
322 else {
323 outMuon->SetIp3dPVBS(-99.0);
324 }
325
326 //compute compatibility with PV using taking into account also the case where muon track
327 //was included in the vertex fit
328 if (iM->track()->extra().isAvailable()) {
329
330 const std::pair<bool,double> &pvCompat = kalmanEstimator.estimate(pvCol->at(0),tt);
331 if (pvCompat.first) {
332 outMuon->SetPVCompatibility(pvCompat.second);
333 }
334 else {
335 outMuon->SetPVCompatibility(-99.0);
336 }
337
338 const std::pair<bool,double> &pvbsCompat = kalmanEstimator.estimate(pvBSCol->at(0),tt);
339 if (pvbsCompat.first) {
340 outMuon->SetPVBSCompatibility(pvbsCompat.second);
341 }
342 else {
343 outMuon->SetPVBSCompatibility(-99.0);
344 }
345 }
346
347 }
348
349 outMuon->SetNChambers (iM->numberOfChambers());
350 outMuon->SetStationMask(iM->stationMask(reco::Muon::SegmentAndTrackArbitration));
351 outMuon->SetNMatches (iM->numberOfMatches());
352 for(int i0 = 0; i0 < 4; i0++) {
353 // DTs
354 outMuon->SetDX(i0, iM->dX(i0+1,1));
355 outMuon->SetDY(i0, iM->dY(i0+1,1));
356 outMuon->SetPullX(i0, iM->pullX(i0+1,1));
357 outMuon->SetPullY(i0, iM->pullY(i0+1,1));
358 outMuon->SetTrackDist(i0, iM->trackDist(i0+1,1));
359 outMuon->SetTrackDistErr(i0, iM->trackDistErr(i0+1,1));
360 outMuon->SetNSegments(i0, NumberOfSegments(&(*iM),i0+1,1));
361 // CSCs
362 outMuon->SetDX(4+i0, iM->dX (i0+1,2));
363 outMuon->SetDY(4+i0, iM->dY (i0+1,2));
364 outMuon->SetPullX(4+i0, iM->pullX (i0+1,2));
365 outMuon->SetPullY(4+i0, iM->pullY (i0+1,2));
366 outMuon->SetTrackDist(4+i0, iM->trackDist(i0+1,2));
367 outMuon->SetTrackDistErr(4+i0,iM->trackDistErr(i0+1,2));
368 outMuon->SetNSegments(4+i0, NumberOfSegments(&(*iM),i0+1,2));
369 }
370
371 reco::MuonRef theRef(hMuonProduct, iM - inMuons.begin());
372 // fill corrected expected inner hits
373 if (iM->innerTrack().isNonnull()) {
374 outMuon->SetCorrectedNExpectedHitsInner(iM->innerTrack()->trackerExpectedHitsInner().numberOfHits());
375 }
376
377 // add muon to map
378 edm::Ptr<reco::Muon> thePtr(hMuonProduct, iM - inMuons.begin());
379 muonMap_->Add(thePtr, outMuon);
380
381 if (verbose_>1) {
382 if (!outMuon->HasGlobalTrk() && !outMuon->HasStandaloneTrk()) {
383 printf("mithep::Muon, pt=%5f, eta=%5f, phi=%5f, mass=%5f\n",outMuon->Pt(),outMuon->Eta(),outMuon->Phi(), outMuon->Mass());
384 printf(" reco::Muon, pt=%5f, eta=%5f, phi=%5f, mass=%5f\n",iM->pt(),iM->eta(),iM->phi(),iM->mass());
385 }
386 }
387
388 }
389 muons_->Trim();
390 }
391
392 int FillerMuons::NumberOfSegments(const reco::Muon *iM, int station, int muonSubdetId, reco::Muon::ArbitrationType type ) {
393 if(!iM->isMatchesValid()) return 0;
394 int segments(0);
395
396 for( std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = iM->matches().begin();
397 chamberMatch != iM->matches().end(); chamberMatch++ )
398 {
399 if(chamberMatch->segmentMatches.empty()) continue;
400 if(!(chamberMatch->station()==station && chamberMatch->detector()==muonSubdetId)) continue;
401 if(type == reco::Muon::NoArbitration) {
402 segments += chamberMatch->segmentMatches.size();
403 continue;
404 }
405 for( std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin();
406 segmentMatch != chamberMatch->segmentMatches.end(); segmentMatch++ )
407 {
408 if(type == reco::Muon::SegmentArbitration)
409 if(segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR)) {
410 segments++;
411 break;
412 }
413 if(type == reco::Muon::SegmentAndTrackArbitration)
414 if(segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
415 segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
416 segments++;
417 break;
418 }
419 if(type == reco::Muon::SegmentAndTrackArbitrationCleaned)
420 if(segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
421 segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR) &&
422 segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByCleaning)) {
423 segments++;
424 break;
425 }
426 if(type > 1<<7)
427 if(segmentMatch->isMask(type)) {
428 segments++;
429 break;
430 }
431 }
432 }
433 return segments;
434 }
435