@@ -42,7 +42,8 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
4242 propagatorToMuonSystem (cfg)
4343 {
4444 std::sort (selectedMuonTriggerObjects.begin (), selectedMuonTriggerObjects.end ());
45- std::vector<std::string>::iterator tempIt = std::unique (selectedMuonTriggerObjects.begin (), selectedMuonTriggerObjects.end ());
45+ std::vector<std::string>::iterator tempIt = std::unique (
46+ selectedMuonTriggerObjects.begin (), selectedMuonTriggerObjects.end ());
4647 selectedMuonTriggerObjects.resize (tempIt - selectedMuonTriggerObjects.begin ());
4748
4849 muonMetadata = new KMuonMetadata ();
@@ -98,10 +99,14 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
9899 pfIsoVetoCone = pset.getParameter <double >(" pfIsoVetoCone" );
99100 pfIsoVetoMinPt = pset.getParameter <double >(" pfIsoVetoMinPt" );
100101
102+ edm::InputTag VertexCollectionSource = pset.getParameter <edm::InputTag>(" vertexcollection" );
103+ cEvent->getByLabel (VertexCollectionSource, VertexHandle);
104+
101105 // Continue normally
102106 KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>::fillProduct (in, out, name, tag, pset);
103107 }
104108
109+ // / fill muon from DataFormats/MuonReco/interface/Muon.h
105110 virtual void fillSingle (const SingleInputType &in, SingleOutputType &out)
106111 {
107112 out.flavour = KLepton::MUON;
@@ -114,35 +119,51 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
114119 KTrackProducer::fillTrack (*in.track (), out.track );
115120 if (in.globalTrack ().isNonnull ())
116121 KTrackProducer::fillTrack (*in.globalTrack (), out.globalTrack );
117- if (in.innerTrack ().isNonnull ())
118- KTrackProducer::fillTrack (*in.innerTrack (), out.innerTrack );
119- if (in.outerTrack ().isNonnull ())
120- KTrackProducer::fillTrack (*in.outerTrack (), out.outerTrack );
121- if (in.bestTrack ())
122- KTrackProducer::fillTrack (*in.bestTrack (), out.bestTrack );
123122
123+ edm::View<reco::Vertex> vertices = *VertexHandle;
124+ reco::Vertex vtx = vertices.at (0 );
125+ if (in.muonBestTrack ().isNonnull ()) // && &vtx != NULL) TODO
126+ {
127+ // / ID var from the bestTrack which is not saved entirely
128+ out.dxy = 0 ; // dxy from vertex using IPTools like PAT
129+ out.dz = in.bestTrack ()->dz (vtx.position ());
130+ }
131+ // propagated values of eta and phi
132+ out.eta_propagated = -1000 .;
133+ out.phi_propagated = -1000 .;
134+ if (in.innerTrack ().isNonnull () && !noPropagation)
135+ {
136+ TrajectoryStateOnSurface prop = propagatorToMuonSystem.extrapolate (in);
137+ if (prop.isValid ())
138+ {
139+ out.eta_propagated = prop.globalPosition ().eta ();
140+ out.phi_propagated = prop.globalPosition ().phi ();
141+ }
142+ }
124143
125- // Charge, ...
126- out.charge = in.charge ();
144+ // Charge, muon system information
145+ assert (in.charge () == 1 || in.charge () == -1 );
146+ out.leptonInfo |= (in.charge () > 0 ) ? KLeptonChargeMask : 0 ;
127147 out.nChambers = in.numberOfChambers ();
128148 out.nMatches = in.numberOfMatches ();
129- out.caloComp = in.caloCompatibility ();
130- out.segComp = muon::segmentCompatibility (in);
149+ out.nMatchedStations = in.numberOfMatchedStations ();
150+ out.caloCompatibility = muon::caloCompatibility (in);
151+ out.segmentCompatibility = muon::segmentCompatibility (in);
131152
132- assert (in.type () <= 255 );
153+ assert (in.type () < 256 );
133154 out.type = in.type ();
134155
135- // muon ID selection, described in AN-2008/098
136- // http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/doxygen/CMSSW_3_3_6/doc/html/dd/de0/MuonSelectors_8cc-source.html#l00005
156+ // muon ID selection
157+ // DataFormats/MuonReco/src/MuonSelectors.cc
137158 std::bitset<32 > tmpBits;
138159 for (size_t i = 0 ; i < 16 ; ++i)
139- tmpBits.set (i, muon::isGoodMuon (in, (muon::SelectionType)i));
140- out.isGoodMuon = (unsigned int )tmpBits.to_ulong ();
160+ tmpBits.set (i, muon::isGoodMuon (in, (muon::SelectionType) i));
161+ out.isGoodMuonBits = (unsigned int ) tmpBits.to_ulong ();
141162
142- // Isolation
163+ // / Isolation
164+ // source?
143165 edm::RefToBase<reco::Muon> muonref (edm::Ref<edm::View<reco::Muon> >(handle, this ->nCursor ));
144166 reco::IsoDeposit muonIsoDepositPF = (*isoDepsPF)[muonref];
145-
146167 reco::isodeposit::Direction dir = reco::isodeposit::Direction (in.eta (), in.phi ());
147168 reco::isodeposit::ConeVeto pf_cone_veto (dir, pfIsoVetoCone);
148169 reco::isodeposit::ThresholdVeto pf_threshold_veto (pfIsoVetoMinPt);
@@ -151,31 +172,48 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
151172 vetosPF.push_back (&pf_cone_veto);
152173 vetosPF.push_back (&pf_threshold_veto);
153174
154- out.ecalIso03 = in.isolationR03 ().emEt ;
155- out.hcalIso03 = in.isolationR03 ().hadEt ;
156- out.trackIso03 = in.isolationR03 ().sumPt ;
157-
158- out.pfIso04 = muonIsoDepositPF.depositWithin (0.4 , vetosPF);
159-
160- out.ecalIso05 = in.isolationR05 ().emEt ;
161- out.hcalIso05 = in.isolationR05 ().hadEt ;
162- out.trackIso05 = in.isolationR05 ().sumPt ;
163-
164- out.eta_propagated = -1000 .;
165- out.phi_propagated = -1000 .;
166-
167- // propagated values
168- if (in.innerTrack ().isNonnull () && !noPropagation)
169- {
170- TrajectoryStateOnSurface prop = propagatorToMuonSystem.extrapolate (in);
171- if (prop.isValid ())
172- {
173- out.eta_propagated = prop.globalPosition ().eta ();
174- out.phi_propagated = prop.globalPosition ().phi ();
175- }
176- }
175+ // / isolation results
176+ out.trackIso03 = in.isolationR03 ().sumPt ;
177+ out.pfIso03 = muonIsoDepositPF.depositWithin (0.3 , vetosPF);
178+ // out.pfIso04 = muonIsoDepositPF.depositWithin(0.4, vetosPF);
179+
180+ // / isolation variables for pfIso04
181+ // / DataFormats/MuonReco/interface/MuonPFIsolation.h
182+ out.sumChargedHadronPt = in.pfIsolationR04 ().sumChargedHadronPt ;
183+ out.sumChargedParticlePt = in.pfIsolationR04 ().sumChargedParticlePt ;
184+ out.sumNeutralHadronEt = in.pfIsolationR04 ().sumNeutralHadronEt ;
185+ out.sumPhotonEt = in.pfIsolationR04 ().sumPhotonEt ;
186+ out.sumPUPt = in.pfIsolationR04 ().sumPUPt ;
187+ out.sumNeutralHadronEtHighThreshold = in.pfIsolationR04 ().sumNeutralHadronEtHighThreshold ;
188+ out.sumPhotonEtHighThreshold = in.pfIsolationR04 ().sumPhotonEtHighThreshold ;
189+
190+ // / highpt ID variables
191+ /* * needed variables according to
192+ https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideMuonId#New_HighPT_Version_recommended
193+ not in new CMSSW versions
194+
195+ reco::TrackRef cktTrack = muon::improvedMuonBestTrack(const reco::Muon & recoMu, muon::improvedTuneP);
196+ dxy_high = cktTrack->db...
197+ dz_high = 0;
198+ pt_high = cktTrack->pt();
199+ pte_high = cktTrack->ptError();
200+ */
177201
178202 out.hltMatch = getHLTInfo (out.p4 );
203+
204+ // / precomputed muon IDs
205+ /* * https://hypernews.cern.ch/HyperNews/CMS/get/muon/868.html
206+ https://twiki.cern.ch/twiki/bin/view/CMSPublic/SWGuideMuonId#Baseline_muon_selections_for_201
207+ DataFormats/MuonReco/src/MuonSelectors.cc
208+ automatically use muon::improvedTuneP default as in CMSSW
209+ last update: 2014-10-03
210+ */
211+ out.ids = KLeptonId::ANY;
212+ out.ids |= (muon::isLooseMuon (in) << KLeptonId::LOOSE);
213+ out.ids |= (muon::isTightMuon (in, vtx) << KLeptonId::TIGHT);
214+ out.ids |= (muon::isSoftMuon (in, vtx) << KLeptonId::SOFT);
215+ out.ids |= (muon::isHighPtMuon (in, vtx, reco::improvedTuneP) << KLeptonId::HIGHPT); // a
216+ assert ((out.ids & 148 ) == 0 ); // 148 = 0b10010100, these bits should be zero
179217 }
180218
181219private:
@@ -185,10 +223,9 @@ class KMuonProducer : public KBaseMultiLVProducer<edm::View<reco::Muon>, KMuons>
185223 std::vector<std::string> selectedMuonTriggerObjects;
186224 bool noPropagation;
187225 PropagateToMuon propagatorToMuonSystem;
188- edm::Handle< edm::ValueMap<reco::IsoDeposit> > isoDepsPF;
189-
190- edm::Handle< trigger::TriggerEvent > triggerEventHandle;
191-
226+ edm::Handle<edm::ValueMap<reco::IsoDeposit> > isoDepsPF;
227+ edm::Handle<trigger::TriggerEvent> triggerEventHandle;
228+ edm::Handle<edm::View<reco::Vertex> > VertexHandle;
192229 KMuonMetadata *muonMetadata;
193230
194231 std::map<std::string, int > muonTriggerObjectBitMap;
0 commit comments