ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerMuons.cc
Revision: 1.41
Committed: Fri May 20 16:52:37 2011 UTC (13 years, 11 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025b, Mit_025a, Mit_025, Mit_025pre2, Mit_024b, Mit_025pre1, Mit_024a, Mit_024, Mit_023, Mit_022a, Mit_022, Mit_021
Changes since 1.40: +51 -70 lines
Log Message:
Add muon kink and electron,muon unbiased ip variables

File Contents

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