ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMuons.cc
Revision: 1.42
Committed: Sun Jan 15 23:23:42 2012 UTC (13 years, 3 months ago) by pharris
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025d, Mit_025c
Branch point for: Mit_025c_branch
Changes since 1.41: +3 -2 lines
Log Message:
Added flag for unbiased vertex fitting

File Contents

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