ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMuons.cc
Revision: 1.37
Committed: Thu Jan 27 21:57:50 2011 UTC (14 years, 3 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_018
Changes since 1.36: +59 -9 lines
Log Message:
refit vertex without track to compute IP

File Contents

# User Rev Content
1 bendavid 1.37 // $Id: FillerMuons.cc,v 1.36 2010/11/22 16:55:51 bendavid Exp $
2 loizides 1.1
3     #include "MitProd/TreeFiller/interface/FillerMuons.h"
4     #include "DataFormats/MuonReco/interface/Muon.h"
5 sixie 1.26 #include "DataFormats/MuonReco/interface/MuonQuality.h"
6 loizides 1.1 #include "DataFormats/MuonReco/interface/MuonFwd.h"
7 sixie 1.26 #include "DataFormats/MuonReco/interface/MuonSelectors.h"
8 bendavid 1.15 #include "DataFormats/Common/interface/RefToPtr.h"
9 bendavid 1.27 #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 bendavid 1.28 #include "RecoVertex/KalmanVertexFit/interface/KalmanVertexTrackCompatibilityEstimator.h"
14 loizides 1.22 #include "MitAna/DataTree/interface/Names.h"
15     #include "MitAna/DataTree/interface/MuonCol.h"
16 loizides 1.1 #include "MitAna/DataTree/interface/Track.h"
17 loizides 1.22 #include "MitProd/ObjectService/interface/ObjectService.h"
18 bendavid 1.37 #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 loizides 1.1
24     using namespace std;
25     using namespace edm;
26     using namespace mithep;
27    
28 loizides 1.4 //--------------------------------------------------------------------------------------------------
29 loizides 1.18 FillerMuons::FillerMuons(const edm::ParameterSet &cfg, const char *name, bool active) :
30     BaseFiller(cfg,name,active),
31 loizides 1.1 edmName_(Conf().getUntrackedParameter<string>("edmName","muons")),
32 bendavid 1.32 expectedHitsName_(Conf().getUntrackedParameter<string>("expectedHitsName","")),
33 loizides 1.1 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkMuonBrn)),
34 loizides 1.9 globalTrackMapName_(Conf().getUntrackedParameter<string>("globalTrackMapName","")),
35     staTrackMapName_(Conf().getUntrackedParameter<string>("staTrackMapName","")),
36     staVtxTrackMapName_(Conf().getUntrackedParameter<string>("staVtxTrackMapName","")),
37     trackerTrackMapName_(Conf().getUntrackedParameter<string>("trackerTrackMapName","")),
38 bendavid 1.19 muonMapName_(Conf().getUntrackedParameter<string>("muonMapName","")),
39 bendavid 1.27 pvEdmName_(Conf().getUntrackedParameter<string>("pvEdmName","offlinePrimaryVertices")),
40     pvBSEdmName_(Conf().getUntrackedParameter<string>("pvEdmName","offlinePrimaryVerticesWithBS")),
41 bendavid 1.19 globalTrackMap_(0),
42     standaloneTrackMap_(0),
43     standaloneVtxTrackMap_(0),
44 loizides 1.9 trackerTrackMap_(0),
45 bendavid 1.19 muonMap_(new mithep::MuonMap),
46 pharris 1.12 muons_(new mithep::MuonArr(16))
47 loizides 1.1 {
48     // Constructor.
49     }
50    
51 loizides 1.4 //--------------------------------------------------------------------------------------------------
52 loizides 1.20 FillerMuons::~FillerMuons()
53     {
54     // Destructor.
55    
56 loizides 1.5 delete muons_;
57 bendavid 1.19 delete muonMap_;
58 loizides 1.1 }
59    
60 loizides 1.4 //--------------------------------------------------------------------------------------------------
61 bendavid 1.24 void FillerMuons::BookDataBlock(TreeWriter &tws)
62 loizides 1.20 {
63 loizides 1.9 // Add muons branch to tree and get pointers to maps.
64 loizides 1.1
65 loizides 1.20 tws.AddBranch(mitName_,&muons_);
66     OS()->add<mithep::MuonArr>(muons_,mitName_);
67 bendavid 1.19
68 loizides 1.20 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 loizides 1.1 }
93    
94 loizides 1.4 //--------------------------------------------------------------------------------------------------
95 loizides 1.1 void FillerMuons::FillDataBlock(const edm::Event &event,
96 loizides 1.4 const edm::EventSetup &setup)
97 loizides 1.1 {
98     // Fill muon information.
99    
100 bendavid 1.16 muons_->Delete();
101 bendavid 1.19 muonMap_->Reset();
102 loizides 1.1
103 loizides 1.6 Handle<reco::MuonCollection> hMuonProduct;
104 sixie 1.10 GetProduct(edmName_, hMuonProduct, event);
105 loizides 1.6 const reco::MuonCollection inMuons = *(hMuonProduct.product());
106 loizides 1.1
107 bendavid 1.27 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 bendavid 1.32
115 bendavid 1.27 edm::ESHandle<TransientTrackBuilder> hTransientTrackBuilder;
116     setup.get<TransientTrackRecord>().get("TransientTrackBuilder",hTransientTrackBuilder);
117     const TransientTrackBuilder *transientTrackBuilder = hTransientTrackBuilder.product();
118    
119 bendavid 1.28 KalmanVertexTrackCompatibilityEstimator<5> kalmanEstimator;
120    
121 bendavid 1.37 LinearizedTrackStateFactory lTrackFactory;
122     VertexTrackFactory<5> vTrackFactory;
123     KalmanVertexUpdator<5> updator;
124    
125 sixie 1.10 for (reco::MuonCollection::const_iterator iM = inMuons.begin(); iM != inMuons.end(); ++iM) {
126 bendavid 1.25 mithep::Muon* outMuon = muons_->AddNew();
127    
128     outMuon->SetPtEtaPhi(iM->pt(),iM->eta(),iM->phi());
129     outMuon->SetCharge(iM->charge());
130    
131 sixie 1.10 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 bendavid 1.17 outMuon->SetIsGlobalMuon(iM->isGlobalMuon());
150     outMuon->SetIsTrackerMuon(iM->isTrackerMuon());
151     outMuon->SetIsStandaloneMuon(iM->isStandAloneMuon());
152     outMuon->SetIsCaloMuon(iM->isCaloMuon());
153 pharris 1.11
154 sixie 1.26 //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 bendavid 1.30 if (globalTrackMap_ && iM->combinedMuon().isNonnull()) {
205 bendavid 1.15 outMuon->SetGlobalTrk(globalTrackMap_->GetMit(refToPtr(iM->combinedMuon())));
206 bendavid 1.30 outMuon->SetNValidHits (iM->globalTrack()->hitPattern().numberOfValidMuonHits());
207     }
208 loizides 1.1 if (standaloneTrackMap_ && standaloneVtxTrackMap_ && iM->standAloneMuon().isNonnull()) {
209     Int_t refProductId = iM->standAloneMuon().id().id();
210     if ( refProductId == standaloneVtxTrackMap_->GetEdmProductId())
211 bendavid 1.15 outMuon->SetStandaloneTrk(standaloneVtxTrackMap_->GetMit(refToPtr(iM->standAloneMuon())));
212 loizides 1.1 else if ( refProductId == standaloneTrackMap_->GetEdmProductId())
213 bendavid 1.15 outMuon->SetStandaloneTrk(standaloneTrackMap_->GetMit(refToPtr(iM->standAloneMuon())));
214 loizides 1.1 else throw edm::Exception(edm::errors::Configuration, "FillerMuons:FillDataBlock()\n")
215 loizides 1.14 << "Error! Track reference in unmapped collection " << edmName_ << endl;
216 loizides 1.1 }
217 bendavid 1.30 if (trackerTrackMap_ && iM->track().isNonnull()) {
218 bendavid 1.15 outMuon->SetTrackerTrk(trackerTrackMap_->GetMit(refToPtr(iM->track())));
219 bendavid 1.30 }
220 loizides 1.14
221 bendavid 1.27 //compute impact parameter with respect to PV
222     if (iM->track().isNonnull()) {
223     const reco::TransientTrack &tt = transientTrackBuilder->build(iM->track());
224    
225 bendavid 1.37 reco::Vertex thevtx = pvCol->at(0);
226     reco::Vertex thevtxbs = pvBSCol->at(0);
227    
228     if (find(thevtx.tracks_begin(), thevtx.tracks_end(), tt.trackBaseRef()) != thevtx.tracks_end()) {
229     GlobalPoint linP(Basic3DVector<float> (thevtx.position()));
230     KalmanVertexUpdator<5>::RefCountedLinearizedTrackState linTrack = lTrackFactory.linearizedTrackState(linP, tt);
231     GlobalError err(thevtx.covariance());
232     VertexState vState(linP, err);
233     KalmanVertexUpdator<5>::RefCountedVertexTrack vertexTrack = vTrackFactory.vertexTrack(linTrack, vState);
234    
235     std::vector<KalmanVertexUpdator<5>::RefCountedVertexTrack> initialTracks(1, vertexTrack);
236     CachingVertex<5> cachingVertex(linP, err, initialTracks, thevtx.chi2());
237     const CachingVertex<5> &newCachingVertex = updator.remove(cachingVertex,vertexTrack);
238    
239     if (newCachingVertex.isValid()) {
240     const TransientVertex &tvtx = newCachingVertex;
241     thevtx = tvtx;
242     }
243     }
244    
245     if (find(thevtxbs.tracks_begin(), thevtxbs.tracks_end(), tt.trackBaseRef()) != thevtxbs.tracks_end()) {
246     GlobalPoint linP(Basic3DVector<float> (thevtxbs.position()));
247     KalmanVertexUpdator<5>::RefCountedLinearizedTrackState linTrack = lTrackFactory.linearizedTrackState(linP, tt);
248     GlobalError err(thevtxbs.covariance());
249     VertexState vState(linP, err);
250     KalmanVertexUpdator<5>::RefCountedVertexTrack vertexTrack = vTrackFactory.vertexTrack(linTrack, vState);
251    
252     std::vector<KalmanVertexUpdator<5>::RefCountedVertexTrack> initialTracks(1, vertexTrack);
253     CachingVertex<5> cachingVertex(linP, err, initialTracks, thevtxbs.chi2());
254     const CachingVertex<5> &newCachingVertex = updator.remove(cachingVertex,vertexTrack);
255    
256     if (newCachingVertex.isValid()) {
257     const TransientVertex &tvtx = newCachingVertex;
258     thevtxbs = tvtx;
259     }
260     }
261    
262     //preserve sign of transverse impact parameter (cross-product definition from track, not lifetime-signing)
263     const double thesign = ( (-iM->track()->dxy(thevtx.position())) >=0 ) ? 1. : -1.;
264     const double thesignbs = ( (-iM->track()->dxy(thevtxbs.position())) >=0 ) ? 1. : -1.;
265    
266     const std::pair<bool,Measurement1D> &d0pv = IPTools::absoluteTransverseImpactParameter(tt,thevtx);
267 bendavid 1.27 if (d0pv.first) {
268 bendavid 1.37 outMuon->SetD0PV(thesign*d0pv.second.value());
269 bendavid 1.27 outMuon->SetD0PVErr(d0pv.second.error());
270     }
271 bendavid 1.28 else {
272     outMuon->SetD0PV(-99.0);
273     }
274 bendavid 1.27
275 bendavid 1.37 const std::pair<bool,Measurement1D> &ip3dpv = IPTools::absoluteImpactParameter3D(tt,thevtx);
276 bendavid 1.27 if (ip3dpv.first) {
277 bendavid 1.37 outMuon->SetIp3dPV(thesign*ip3dpv.second.value());
278 bendavid 1.27 outMuon->SetIp3dPVErr(ip3dpv.second.error());
279     }
280 bendavid 1.28 else {
281     outMuon->SetIp3dPV(-99.0);
282     }
283 bendavid 1.27
284 bendavid 1.37 const std::pair<bool,Measurement1D> &d0pvbs = IPTools::absoluteTransverseImpactParameter(tt,thevtxbs);
285 bendavid 1.27 if (d0pvbs.first) {
286 bendavid 1.37 outMuon->SetD0PVBS(thesignbs*d0pvbs.second.value());
287 bendavid 1.27 outMuon->SetD0PVBSErr(d0pvbs.second.error());
288     }
289 bendavid 1.28 else {
290     outMuon->SetD0PVBS(-99.0);
291     }
292 bendavid 1.27
293 bendavid 1.37 const std::pair<bool,Measurement1D> &ip3dpvbs = IPTools::absoluteImpactParameter3D(tt,thevtxbs);
294 bendavid 1.27 if (ip3dpvbs.first) {
295 bendavid 1.37 outMuon->SetIp3dPVBS(thesignbs*ip3dpvbs.second.value());
296 bendavid 1.27 outMuon->SetIp3dPVBSErr(ip3dpvbs.second.error());
297     }
298 bendavid 1.28 else {
299     outMuon->SetIp3dPVBS(-99.0);
300     }
301    
302     //compute compatibility with PV using taking into account also the case where muon track
303     //was included in the vertex fit
304     if (iM->track()->extra().isAvailable()) {
305    
306     const std::pair<bool,double> &pvCompat = kalmanEstimator.estimate(pvCol->at(0),tt);
307     if (pvCompat.first) {
308     outMuon->SetPVCompatibility(pvCompat.second);
309     }
310     else {
311     outMuon->SetPVCompatibility(-99.0);
312     }
313    
314     const std::pair<bool,double> &pvbsCompat = kalmanEstimator.estimate(pvBSCol->at(0),tt);
315     if (pvbsCompat.first) {
316     outMuon->SetPVBSCompatibility(pvbsCompat.second);
317     }
318     else {
319     outMuon->SetPVBSCompatibility(-99.0);
320     }
321     }
322 bendavid 1.27
323     }
324 bendavid 1.31
325 loizides 1.14 outMuon->SetNChambers (iM->numberOfChambers());
326 pharris 1.11 outMuon->SetStationMask(iM->stationMask(reco::Muon::SegmentAndTrackArbitration));
327 ceballos 1.33 outMuon->SetNMatches (iM->numberOfMatches());
328 loizides 1.14 for(int i0 = 0; i0 < 4; i0++) {
329 loizides 1.20 // DTs
330 pharris 1.11 outMuon->SetDX(i0, iM->dX(i0+1,1));
331     outMuon->SetDY(i0, iM->dY(i0+1,1));
332     outMuon->SetPullX(i0, iM->pullX(i0+1,1));
333     outMuon->SetPullY(i0, iM->pullY(i0+1,1));
334     outMuon->SetTrackDist(i0, iM->trackDist(i0+1,1));
335     outMuon->SetTrackDistErr(i0, iM->trackDistErr(i0+1,1));
336 pharris 1.34 outMuon->SetNSegments(i0, NumberOfSegments(&(*iM),i0+1,1));
337 loizides 1.20 // CSCs
338 pharris 1.11 outMuon->SetDX(4+i0, iM->dX (i0+1,2));
339     outMuon->SetDY(4+i0, iM->dY (i0+1,2));
340     outMuon->SetPullX(4+i0, iM->pullX (i0+1,2));
341     outMuon->SetPullY(4+i0, iM->pullY (i0+1,2));
342     outMuon->SetTrackDist(4+i0, iM->trackDist(i0+1,2));
343     outMuon->SetTrackDistErr(4+i0,iM->trackDistErr(i0+1,2));
344 pharris 1.34 outMuon->SetNSegments(4+i0, NumberOfSegments(&(*iM),i0+1,2));
345 pharris 1.11 }
346 bendavid 1.19
347 bendavid 1.32 reco::MuonRef theRef(hMuonProduct, iM - inMuons.begin());
348     // fill corrected expected inner hits
349 bendavid 1.36 if (iM->innerTrack().isNonnull()) {
350     outMuon->SetCorrectedNExpectedHitsInner(iM->innerTrack()->trackerExpectedHitsInner().numberOfHits());
351 bendavid 1.32 }
352 bendavid 1.36
353 loizides 1.20 // add muon to map
354 bendavid 1.19 edm::Ptr<reco::Muon> thePtr(hMuonProduct, iM - inMuons.begin());
355     muonMap_->Add(thePtr, outMuon);
356 bendavid 1.21
357     if (verbose_>1) {
358     if (!outMuon->HasGlobalTrk() && !outMuon->HasStandaloneTrk()) {
359     printf("mithep::Muon, pt=%5f, eta=%5f, phi=%5f, mass=%5f\n",outMuon->Pt(),outMuon->Eta(),outMuon->Phi(), outMuon->Mass());
360     printf(" reco::Muon, pt=%5f, eta=%5f, phi=%5f, mass=%5f\n",iM->pt(),iM->eta(),iM->phi(),iM->mass());
361     }
362     }
363 bendavid 1.19
364 pharris 1.11 }
365 loizides 1.1 muons_->Trim();
366     }
367 pharris 1.34
368     int FillerMuons::NumberOfSegments(const reco::Muon *iM, int station, int muonSubdetId, reco::Muon::ArbitrationType type ) {
369     if(!iM->isMatchesValid()) return 0;
370     int segments(0);
371    
372     for( std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = iM->matches().begin();
373     chamberMatch != iM->matches().end(); chamberMatch++ )
374     {
375     if(chamberMatch->segmentMatches.empty()) continue;
376     if(!(chamberMatch->station()==station && chamberMatch->detector()==muonSubdetId)) continue;
377     if(type == reco::Muon::NoArbitration) {
378     segments += chamberMatch->segmentMatches.size();
379     continue;
380     }
381     for( std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin();
382     segmentMatch != chamberMatch->segmentMatches.end(); segmentMatch++ )
383     {
384     if(type == reco::Muon::SegmentArbitration)
385 pharris 1.35 if(segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR)) {
386 pharris 1.34 segments++;
387     break;
388     }
389     if(type == reco::Muon::SegmentAndTrackArbitration)
390 pharris 1.35 if(segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
391 pharris 1.34 segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR)) {
392     segments++;
393     break;
394     }
395     if(type == reco::Muon::SegmentAndTrackArbitrationCleaned)
396 pharris 1.35 if(segmentMatch->isMask(reco::MuonSegmentMatch::BestInChamberByDR) &&
397 pharris 1.34 segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByDR) &&
398     segmentMatch->isMask(reco::MuonSegmentMatch::BelongsToTrackByCleaning)) {
399     segments++;
400     break;
401     }
402     if(type > 1<<7)
403     if(segmentMatch->isMask(type)) {
404     segments++;
405     break;
406     }
407     }
408     }
409     return segments;
410     }
411