CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
MuonMCClassifier Class Reference

#include <MuonAnalysis/MuonAssociators/src/MuonMCClassifier.cc>

Inheritance diagram for MuonMCClassifier:
edm::EDProducer edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 MuonMCClassifier (const edm::ParameterSet &)
 
 ~MuonMCClassifier ()
 
- Public Member Functions inherited from edm::EDProducer
 EDProducer ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducer ()
 
- Public Member Functions inherited from edm::ProducerBase
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription
const &)> 
registrationCallback () const
 used by the fwk to register list of products More...
 
virtual ~ProducerBase ()
 
- Public Member Functions inherited from edm::EDConsumerBase
 EDConsumerBase ()
 
ProductHolderIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
std::vector
< ProductHolderIndexAndSkipBit >
const & 
itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesDependentUpon (const std::string &iProcessName, std::vector< const char * > &oModuleLabels) const
 
bool registeredToConsume (ProductHolderIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductHolderIndexHelper const &)
 
virtual ~EDConsumerBase ()
 

Private Member Functions

int convertAndPush (const TrackingParticle &tp, reco::GenParticleCollection &out, const TrackingParticleRef &momRef, const edm::Handle< reco::GenParticleCollection > &genParticles) const
 
int flavour (int pdgId) const
 Returns the flavour given a pdg id code. More...
 
TrackingParticleRef getTpMother (TrackingParticleRef tp)
 
virtual void produce (edm::Event &, const edm::EventSetup &) override
 
template<typename T >
void writeValueMap (edm::Event &iEvent, const edm::Handle< edm::View< reco::Muon > > &handle, const std::vector< T > &values, const std::string &label) const
 Write a ValueMap<int> in the event. More...
 

Private Attributes

std::string associatorLabel_
 The Associations. More...
 
double decayAbsZ_
 
double decayRho_
 Cylinder to use to decide if a decay is early or late. More...
 
edm::InputTag genParticles_
 
edm::EDGetTokenT
< reco::GenParticleCollection
genParticlesToken_
 
bool hasMuonCut_
 
bool linkToGenParticles_
 Create a link to the generator level particles. More...
 
StringCutObjectSelector
< pat::Muon
muonCut_
 
edm::EDGetTokenT< edm::View
< reco::Muon > > 
muonsToken_
 The RECO objects. More...
 
edm::EDGetTokenT
< TrackingParticleCollection
trackingParticlesToken_
 The TrackingParticle objects. More...
 
MuonAssociatorByHits::MuonTrackType trackType_
 Track to use. More...
 

Additional Inherited Members

- Public Types inherited from edm::EDProducer
typedef EDProducer ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef
ProductRegistryHelper::TypeLabelList 
TypeLabelList
 
- Static Public Member Functions inherited from edm::EDProducer
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

CLASSIFICATION: For each RECO Muon, match to SIM particle, and then:

In any case, if the TP is not preferentially matched back to the same RECO muon, label as Ghost (flip the classification)

FLAVOUR:

Definition at line 69 of file MuonMCClassifier.cc.

Constructor & Destructor Documentation

MuonMCClassifier::MuonMCClassifier ( const edm::ParameterSet iConfig)
explicit

Definition at line 128 of file MuonMCClassifier.cc.

References edm::hlt::Exception, genParticles_, genParticlesToken_, edm::ParameterSet::getParameter(), MuonAssociatorByHits::GlobalTk, MuonAssociatorByHits::InnerTk, linkToGenParticles_, MuonAssociatorByHits::OuterTk, MuonAssociatorByHits::Segments, AlCaHLTBitMon_QueryRunRegistry::string, and trackType_.

128  :
130  hasMuonCut_(iConfig.existsAs<std::string>("muonPreselection")),
131  muonCut_(hasMuonCut_ ? iConfig.getParameter<std::string>("muonPreselection") : ""),
132  trackingParticlesToken_(consumes<TrackingParticleCollection>(iConfig.getParameter<edm::InputTag>("trackingParticles"))),
133  associatorLabel_(iConfig.getParameter< std::string >("associatorLabel")),
134  decayRho_(iConfig.getParameter<double>("decayRho")),
135  decayAbsZ_(iConfig.getParameter<double>("decayAbsZ")),
136  linkToGenParticles_(iConfig.getParameter<bool>("linkToGenParticles")),
137  genParticles_(linkToGenParticles_ ? iConfig.getParameter<edm::InputTag>("genParticles") : edm::InputTag("NONE"))
138 {
139  std::string trackType = iConfig.getParameter< std::string >("trackType");
140  if (trackType == "inner") trackType_ = MuonAssociatorByHits::InnerTk;
141  else if (trackType == "outer") trackType_ = MuonAssociatorByHits::OuterTk;
142  else if (trackType == "global") trackType_ = MuonAssociatorByHits::GlobalTk;
143  else if (trackType == "segments") trackType_ = MuonAssociatorByHits::Segments;
144  else throw cms::Exception("Configuration") << "Track type '" << trackType << "' not supported.\n";
145  if (linkToGenParticles_) {
146  genParticlesToken_ = consumes<reco::GenParticleCollection>(genParticles_);
147  }
148 
149  produces<edm::ValueMap<int> >();
150  produces<edm::ValueMap<int> >("ext");
151  produces<edm::ValueMap<int> >("flav");
152  produces<edm::ValueMap<int> >("hitsPdgId");
153  produces<edm::ValueMap<int> >("momPdgId");
154  produces<edm::ValueMap<int> >("momFlav");
155  produces<edm::ValueMap<int> >("momStatus");
156  produces<edm::ValueMap<int> >("gmomPdgId");
157  produces<edm::ValueMap<int> >("gmomFlav");
158  produces<edm::ValueMap<int> >("hmomFlav"); // heaviest mother flavour
159  produces<edm::ValueMap<int> >("tpId");
160  produces<edm::ValueMap<float> >("prodRho");
161  produces<edm::ValueMap<float> >("prodZ");
162  produces<edm::ValueMap<float> >("momRho");
163  produces<edm::ValueMap<float> >("momZ");
164  produces<edm::ValueMap<float> >("tpAssoQuality");
165  if (linkToGenParticles_) {
166  produces<reco::GenParticleCollection>("secondaries");
167  produces<edm::Association<reco::GenParticleCollection> >("toPrimaries");
168  produces<edm::Association<reco::GenParticleCollection> >("toSecondaries");
169  }
170 }
edm::InputTag genParticles_
bool linkToGenParticles_
Create a link to the generator level particles.
T getParameter(std::string const &) const
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::string associatorLabel_
The Associations.
edm::EDGetTokenT< reco::GenParticleCollection > genParticlesToken_
MuonAssociatorByHits::MuonTrackType trackType_
Track to use.
double decayRho_
Cylinder to use to decide if a decay is early or late.
edm::EDGetTokenT< edm::View< reco::Muon > > muonsToken_
The RECO objects.
edm::EDGetTokenT< TrackingParticleCollection > trackingParticlesToken_
The TrackingParticle objects.
StringCutObjectSelector< pat::Muon > muonCut_
MuonMCClassifier::~MuonMCClassifier ( )

Definition at line 172 of file MuonMCClassifier.cc.

173 {
174 }

Member Function Documentation

int MuonMCClassifier::convertAndPush ( const TrackingParticle tp,
reco::GenParticleCollection out,
const TrackingParticleRef momRef,
const edm::Handle< reco::GenParticleCollection > &  genParticles 
) const
private

Convert TrackingParticle into GenParticle, save into output collection, if mother is primary set reference to it, return index in output collection

Definition at line 481 of file MuonMCClassifier.cc.

References TrackingParticle::charge(), edm::hlt::Exception, genParticles_, edm::HandleBase::id(), edm::Ref< C, T, F >::id(), edm::Ref< C, T, F >::isNonnull(), TrackingParticle::p4(), TrackingParticle::pdgId(), TrackingParticle::status(), and TrackingParticle::vertex().

Referenced by produce().

484  {
485  out.push_back(reco::GenParticle(tp.charge(), tp.p4(), tp.vertex(), tp.pdgId(), tp.status(), true));
486  if (simMom.isNonnull() && !simMom->genParticles().empty()) {
487  if (genParticles.id() != simMom->genParticles().id()) {
488  throw cms::Exception("Configuration") << "Product ID mismatch between the genParticle collection (" << genParticles_ << ", id " << genParticles.id() << ") and the references in the TrackingParticles (id " << simMom->genParticles().id() << ")\n";
489  }
490  out.back().addMother(simMom->genParticles()[0]);
491  }
492  return out.size()-1;
493 }
edm::InputTag genParticles_
ProductID id() const
Definition: HandleBase.cc:15
int pdgId() const
PDG ID.
Point vertex() const
Parent vertex position.
int status() const
Status word.
tuple out
Definition: dbtoconf.py:99
const LorentzVector & p4() const
Four-momentum Lorentz vector. Note this is taken from the first SimTrack only.
int charge() const
Electric charge. Note this is taken from the first SimTrack only.
ProductIndex id() const
Definition: ProductID.h:38
int MuonMCClassifier::flavour ( int  pdgId) const
private

Returns the flavour given a pdg id code.

Definition at line 465 of file MuonMCClassifier.cc.

References funct::abs().

Referenced by cuy.graphElement::__init__(), and produce().

465  {
466  int flav = abs(pdgId);
467  // for quarks, leptons and bosons except gluons, take their pdgId
468  // muons and taus have themselves as flavour
469  if (flav <= 37 && flav != 21) return flav;
470  // look for barions
471  int bflav = ((flav / 1000) % 10);
472  if (bflav != 0) return bflav;
473  // look for mesons
474  int mflav = ((flav / 100) % 10);
475  if (mflav != 0) return mflav;
476  return 0;
477 }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
TrackingParticleRef MuonMCClassifier::getTpMother ( TrackingParticleRef  tp)
inlineprivate

Definition at line 111 of file MuonMCClassifier.cc.

References edm::Ref< C, T, F >::isNonnull().

Referenced by produce().

111  {
112  if (tp.isNonnull() && tp->parentVertex().isNonnull() && !tp->parentVertex()->sourceTracks().empty()) {
113  return tp->parentVertex()->sourceTracks()[0];
114  } else {
115  return TrackingParticleRef();
116  }
117  }
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
edm::Ref< TrackingParticleCollection > TrackingParticleRef
void MuonMCClassifier::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivatevirtual

Implements edm::EDProducer.

Definition at line 177 of file MuonMCClassifier.cc.

References funct::abs(), MuonAssociatorByHits::associateMuons(), associatorLabel_, edm::RefToBaseVector< T >::begin(), convertAndPush(), decayAbsZ_, decayRho_, edm::RefToBaseVector< T >::end(), edm::hlt::Exception, edm::helper::Filler< Map >::fill(), spr::find(), flavour(), EgammaValidation_cff::genp, genParticleCandidates2GenParticles_cfi::genParticles, genParticles_, genParticlesToken_, edm::EventSetup::get(), edm::Event::getByToken(), getTpMother(), MuonAssociatorByHits::GlobalTk, hasMuonCut_, i, edm::HandleBase::id(), edm::Ref< C, T, F >::id(), edm::helper::Filler< Map >::insert(), reco::Muon::isGlobalMuon(), edm::Ref< C, T, F >::isNonnull(), edm::Ref< C, T, F >::key(), linkToGenParticles_, match(), RPCpg::mu, muonCut_, patZpeak::muons, muonsToken_, n, MuonAssociatorByHits::OuterTk, edm::ESHandle< class >::product(), edm::RefToBaseVector< T >::push_back(), edm::RefVector< C, T, F >::push_back(), edm::Event::put(), trackingTruthProducerFastSim_cfi::trackingParticles, trackingParticlesToken_, trackType_, and writeValueMap().

178 {
179  edm::LogVerbatim("MuonMCClassifier") <<"\n sono in MuonMCClassifier !";
180 
182  iEvent.getByToken(muonsToken_, muons);
183 
185  iEvent.getByToken(trackingParticlesToken_, trackingParticles);
186 
188  if (linkToGenParticles_) {
189  iEvent.getByToken(genParticlesToken_, genParticles);
190  }
191 
192  edm::ESHandle<TrackAssociatorBase> associatorBase;
193  iSetup.get<TrackAssociatorRecord>().get(associatorLabel_, associatorBase);
194  const MuonAssociatorByHits * assoByHits = dynamic_cast<const MuonAssociatorByHits *>(associatorBase.product());
195  if (assoByHits == 0) throw cms::Exception("Configuration") << "The Track Associator with label '" << associatorLabel_ << "' is not a MuonAssociatorByHits.\n";
196 
199  edm::LogVerbatim("MuonMCClassifier") <<"\n ***************************************************************** ";
200  edm::LogVerbatim("MuonMCClassifier") << " RECO MUON association, type: "<< trackType_;
201  edm::LogVerbatim("MuonMCClassifier") << " ***************************************************************** \n";
202 
204  if (!hasMuonCut_) {
205  // all muons
206  selMuons = muons->refVector();
207  } else {
208  // filter, fill refvectors, associate
209  // I pass through pat::Muon so that I can access muon id selectors
210  for (size_t i = 0, n = muons->size(); i < n; ++i) {
211  edm::RefToBase<reco::Muon> rmu = muons->refAt(i);
212  if (muonCut_(pat::Muon(rmu))) selMuons.push_back(rmu);
213  }
214  }
215 
217  for (size_t i = 0, n = trackingParticles->size(); i < n; ++i) {
218  allTPs.push_back(TrackingParticleRef(trackingParticles,i));
219  }
220 
221  assoByHits->associateMuons(recSimColl, simRecColl, selMuons, trackType_, allTPs, &iEvent, &iSetup);
222 
223  // for global muons without hits on muon detectors, look at the linked standalone muon
227  edm::LogVerbatim("MuonMCClassifier") <<"\n ***************************************************************** ";
228  edm::LogVerbatim("MuonMCClassifier") << " STANDALONE (UpdAtVtx) MUON association ";
229  edm::LogVerbatim("MuonMCClassifier") << " ***************************************************************** \n";
230  assoByHits->associateMuons(UpdSTA_recSimColl, UpdSTA_simRecColl, selMuons, MuonAssociatorByHits::OuterTk,
231  allTPs, &iEvent, &iSetup);
232  }
233 
234  typedef MuonAssociatorByHits::MuonToSimCollection::const_iterator r2s_it;
235  typedef MuonAssociatorByHits::SimToMuonCollection::const_iterator s2r_it;
236 
237  size_t nmu = muons->size();
238  edm::LogVerbatim("MuonMCClassifier") <<"\n There are "<<nmu<<" reco::Muons.";
239 
240  std::vector<int> classif(nmu, 0), ext(nmu, 0);
241  std::vector<int> hitsPdgId(nmu, 0), momPdgId(nmu, 0), gmomPdgId(nmu, 0), momStatus(nmu, 0);
242  std::vector<int> flav(nmu, 0), momFlav(nmu, 0), gmomFlav(nmu, 0), hmomFlav(nmu, 0);
243  std::vector<int> tpId(nmu, -1);
244  std::vector<float> prodRho(nmu, 0.0), prodZ(nmu, 0.0), momRho(nmu, 0.0), momZ(nmu, 0.0);
245  std::vector<float> tpAssoQuality(nmu, -1);
246 
247  std::auto_ptr<reco::GenParticleCollection> secondaries; // output collection of secondary muons
248  std::map<TrackingParticleRef, int> tpToSecondaries; // map from tp to (index+1) in output collection
249  std::vector<int> muToPrimary(nmu, -1), muToSecondary(nmu, -1); // map from input into (index) in output, -1 for null
250  if (linkToGenParticles_) secondaries.reset(new reco::GenParticleCollection());
251 
252  for(size_t i = 0; i < nmu; ++i) {
253  edm::LogVerbatim("MuonMCClassifier") <<"\n reco::Muons # "<<i;
254  edm::RefToBase<reco::Muon> mu = muons->refAt(i);
255  if (hasMuonCut_ && (std::find(selMuons.begin(), selMuons.end(), mu) == selMuons.end()) ) {
256  edm::LogVerbatim("MuonMCClassifier") <<"\t muon didn't pass the selection. classified as -99 and skipped";
257  classif[i] = -99; continue;
258  }
259 
261  edm::RefToBase<reco::Muon> muMatchBack;
262  r2s_it match = recSimColl.find(mu);
263  s2r_it matchback;
264  if (match != recSimColl.end()) {
265  edm::LogVerbatim("MuonMCClassifier") <<"\t RtS matched Ok...";
266  // match->second is vector, front is first element, first is the ref (second would be the quality)
267  tp = match->second.front().first;
268  tpId[i] = tp.isNonnull() ? tp.key() : -1; // we check, even if null refs should not appear here at all
269  tpAssoQuality[i] = match->second.front().second;
270  s2r_it matchback = simRecColl.find(tp);
271  if (matchback != simRecColl.end()) {
272  muMatchBack = matchback->second.front().first;
273  } else {
274  edm::LogWarning("MuonMCClassifier") << "\n***WARNING: This I do NOT understand: why no match back? *** \n";
275  }
276  } else if ((trackType_ == MuonAssociatorByHits::GlobalTk) &&
277  mu->isGlobalMuon()) {
278  // perform a second attempt, matching with the standalone muon
279  r2s_it matchSta = UpdSTA_recSimColl.find(mu);
280  if (matchSta != UpdSTA_recSimColl.end()) {
281  edm::LogVerbatim("MuonMCClassifier") <<"\t RtS matched Ok... from the UpdSTA_recSimColl ";
282  tp = matchSta->second.front().first;
283  tpId[i] = tp.isNonnull() ? tp.key() : -1; // we check, even if null refs should not appear here at all
284  tpAssoQuality[i] = matchSta->second.front().second;
285  s2r_it matchback = UpdSTA_simRecColl.find(tp);
286  if (matchback != UpdSTA_simRecColl.end()) {
287  muMatchBack = matchback->second.front().first;
288  } else {
289  edm::LogWarning("MuonMCClassifier") << "\n***WARNING: This I do NOT understand: why no match back in UpdSTA? *** \n";
290  }
291  }
292  }
293  if (tp.isNonnull()) {
294  bool isGhost = muMatchBack != mu;
295  if (isGhost) edm::LogVerbatim("MuonMCClassifier") <<"\t This seems a GHOST ! classif[i] will be < 0";
296 
297  hitsPdgId[i] = tp->pdgId();
298  prodRho[i] = tp->vertex().Rho();
299  prodZ[i] = tp->vertex().Z();
300  edm::LogVerbatim("MuonMCClassifier") <<"\t TP pdgId = "<<hitsPdgId[i] << ", vertex rho = " << prodRho[i] << ", z = " << prodZ[i];
301 
302  // Try to extract mother and grand mother of this muon.
303  // Unfortunately, SIM and GEN histories require diffent code :-(
304  if (!tp->genParticles().empty()) { // Muon is in GEN
305  reco::GenParticleRef genp = tp->genParticles()[0];
306  reco::GenParticleRef genMom = genp->numberOfMothers() > 0 ? genp->motherRef() : reco::GenParticleRef();
307  if (genMom.isNonnull()) {
308  momPdgId[i] = genMom->pdgId();
309  momStatus[i] = genMom->status();
310  momRho[i] = genMom->vertex().Rho(); momZ[i] = genMom->vz();
311  edm::LogVerbatim("MuonMCClassifier") << "\t Particle pdgId = "<<hitsPdgId[i] << " produced at rho = " << prodRho[i] << ", z = " << prodZ[i] << ", has GEN mother pdgId = " << momPdgId[i];
312  reco::GenParticleRef genGMom = genMom->numberOfMothers() > 0 ? genMom->motherRef() : reco::GenParticleRef();
313  if (genGMom.isNonnull()) {
314  gmomPdgId[i] = genGMom->pdgId();
315  edm::LogVerbatim("MuonMCClassifier") << "\t\t mother prod. vertex rho = " << momRho[i] << ", z = " << momZ[i] << ", grand-mom pdgId = " << gmomPdgId[i];
316  }
317  // in this case, we might want to know the heaviest mom flavour
318  for (reco::GenParticleRef nMom = genMom;
319  nMom.isNonnull() && abs(nMom->pdgId()) >= 100; // stop when we're no longer looking at hadrons or mesons
320  nMom = nMom->numberOfMothers() > 0 ? nMom->motherRef() : reco::GenParticleRef()) {
321  int flav = flavour(nMom->pdgId());
322  if (hmomFlav[i] < flav) hmomFlav[i] = flav;
323  edm::LogVerbatim("MuonMCClassifier") << "\t\t backtracking flavour: mom pdgId = "<<nMom->pdgId()<< ", flavour = " << flav << ", heaviest so far = " << hmomFlav[i];
324  }
325  }
326  } else { // Muon is in SIM Only
327  TrackingParticleRef simMom = getTpMother(tp);
328  if (simMom.isNonnull()) {
329  momPdgId[i] = simMom->pdgId();
330  momRho[i] = simMom->vertex().Rho();
331  momZ[i] = simMom->vertex().Z();
332  edm::LogVerbatim("MuonMCClassifier") << "\t Particle pdgId = "<<hitsPdgId[i] << " produced at rho = " << prodRho[i] << ", z = " << prodZ[i] <<
333  ", has SIM mother pdgId = " << momPdgId[i] << " produced at rho = " << simMom->vertex().Rho() << ", z = " << simMom->vertex().Z();
334  if (!simMom->genParticles().empty()) {
335  momStatus[i] = simMom->genParticles()[0]->status();
336  reco::GenParticleRef genGMom = (simMom->genParticles()[0]->numberOfMothers() > 0 ? simMom->genParticles()[0]->motherRef() : reco::GenParticleRef());
337  if (genGMom.isNonnull()) gmomPdgId[i] = genGMom->pdgId();
338  edm::LogVerbatim("MuonMCClassifier") << "\t\t SIM mother is in GEN (status " << momStatus[i] << "), grand-mom id = " << gmomPdgId[i];
339  } else {
340  momStatus[i] = -1;
341  TrackingParticleRef simGMom = getTpMother(simMom);
342  if (simGMom.isNonnull()) gmomPdgId[i] = simGMom->pdgId();
343  edm::LogVerbatim("MuonMCClassifier") << "\t\t SIM mother is in SIM only, grand-mom id = " << gmomPdgId[i];
344  }
345  } else {
346  edm::LogVerbatim("MuonMCClassifier") << "\t Particle pdgId = "<<hitsPdgId[i] << " produced at rho = " << prodRho[i] << ", z = " << prodZ[i] << ", has NO mother!";
347  }
348  }
349  momFlav[i] = flavour(momPdgId[i]);
350  gmomFlav[i] = flavour(gmomPdgId[i]);
351 
352  // Check first IF this is a muon at all
353  if (abs(tp->pdgId()) != 13) {
354  classif[i] = isGhost ? -1 : 1;
355  ext[i] = isGhost ? -1 : 1;
356  edm::LogVerbatim("MuonMCClassifier") <<"\t This is not a muon. Sorry. classif[i] = " << classif[i];
357  continue;
358  }
359 
360  // Is this SIM muon also a GEN muon, with a mother?
361  if (!tp->genParticles().empty() && (momPdgId[i] != 0)) {
362  if (abs(momPdgId[i]) < 100 && (abs(momPdgId[i]) != 15)) {
363  classif[i] = isGhost ? -4 : 4;
364  flav[i] = (abs(momPdgId[i]) == 15 ? 15 : 13);
365  edm::LogVerbatim("MuonMCClassifier") <<"\t This seems PRIMARY MUON ! classif[i] = " << classif[i];
366  ext[i] = 10;
367  } else if (momFlav[i] == 4 || momFlav[i] == 5 || momFlav[i] == 15) {
368  classif[i] = isGhost ? -3 : 3;
369  flav[i] = momFlav[i];
370  if (momFlav[i] == 15) ext[i] = 9; // tau->mu
371  else if (momFlav[i] == 5) ext[i] = 8; // b->mu
372  else if (hmomFlav[i] == 5) ext[i] = 7; // b->c->mu
373  else ext[i] = 6; // c->mu
374  edm::LogVerbatim("MuonMCClassifier") <<"\t This seems HEAVY FLAVOUR ! classif[i] = " << classif[i];
375  } else {
376  classif[i] = isGhost ? -2 : 2;
377  flav[i] = momFlav[i];
378  edm::LogVerbatim("MuonMCClassifier") <<"\t This seems LIGHT FLAVOUR ! classif[i] = " << classif[i];
379  }
380  } else {
381  classif[i] = isGhost ? -2 : 2;
382  flav[i] = momFlav[i];
383  edm::LogVerbatim("MuonMCClassifier") <<"\t This seems LIGHT FLAVOUR ! classif[i] = " << classif[i];
384  }
385  // extended classification
386  if (momPdgId[i] == 0) ext[i] = 2; // if it has no mom, it's not a primary particle so it won't be in ppMuX
387  else if (abs(momPdgId[i]) < 100) ext[i] = (momFlav[i] == 15 ? 9 : 10); // primary mu, or tau->mu
388  else if (momFlav[i] == 5) ext[i] = 8; // b->mu
389  else if (momFlav[i] == 4) ext[i] = (hmomFlav[i] == 5 ? 7 : 6); // b->c->mu and c->mu
390  else if (momStatus[i] != -1) { // primary light particle
391  int id = abs(momPdgId[i]);
392  if (id != /*pi+*/211 && id != /*K+*/321 && id != 130 /*K0L*/) ext[i] = 5; // other light particle, possibly short-lived
393  else if (prodRho[i] < decayRho_ && abs(prodZ[i]) < decayAbsZ_) ext[i] = 4; // decay a la ppMuX (primary pi/K within a cylinder)
394  else ext[i] = 3; // late decay that wouldn't be in ppMuX
395  } else ext[i] = 2; // decay of non-primary particle, would not be in ppMuX
396  if (isGhost) ext[i] = -ext[i];
397 
398  if (linkToGenParticles_ && abs(ext[i]) >= 2) {
399  // Link to the genParticle if possible, but not decays in flight (in ppMuX they're in GEN block, but they have wrong parameters)
400  if (!tp->genParticles().empty() && abs(ext[i]) >= 5) {
401  if (genParticles.id() != tp->genParticles().id()) {
402  throw cms::Exception("Configuration") << "Product ID mismatch between the genParticle collection (" << genParticles_ << ", id " << genParticles.id() << ") and the references in the TrackingParticles (id " << tp->genParticles().id() << ")\n";
403  }
404  muToPrimary[i] = tp->genParticles()[0].key();
405  } else {
406  // Don't put the same trackingParticle twice!
407  int &indexPlus1 = tpToSecondaries[tp]; // will create a 0 if the tp is not in the list already
408  if (indexPlus1 == 0) indexPlus1 = convertAndPush(*tp, *secondaries, getTpMother(tp), genParticles) + 1;
409  muToSecondary[i] = indexPlus1 - 1;
410  }
411  }
412  edm::LogVerbatim("MuonMCClassifier") <<"\t Extended classification code = " << ext[i];
413  }
414  }
415 
416  writeValueMap(iEvent, muons, classif, "");
417  writeValueMap(iEvent, muons, ext, "ext");
418  writeValueMap(iEvent, muons, flav, "flav");
419  writeValueMap(iEvent, muons, tpId, "tpId");
420  writeValueMap(iEvent, muons, hitsPdgId, "hitsPdgId");
421  writeValueMap(iEvent, muons, momPdgId, "momPdgId");
422  writeValueMap(iEvent, muons, momStatus, "momStatus");
423  writeValueMap(iEvent, muons, momFlav, "momFlav");
424  writeValueMap(iEvent, muons, gmomPdgId, "gmomPdgId");
425  writeValueMap(iEvent, muons, gmomFlav, "gmomFlav");
426  writeValueMap(iEvent, muons, hmomFlav, "hmomFlav");
427  writeValueMap(iEvent, muons, prodRho, "prodRho");
428  writeValueMap(iEvent, muons, prodZ, "prodZ");
429  writeValueMap(iEvent, muons, momRho, "momRho");
430  writeValueMap(iEvent, muons, momZ, "momZ");
431  writeValueMap(iEvent, muons, tpAssoQuality, "tpAssoQuality");
432 
433  if (linkToGenParticles_) {
434  edm::OrphanHandle<reco::GenParticleCollection> secHandle = iEvent.put(secondaries, "secondaries");
435  edm::RefProd<reco::GenParticleCollection> priRP(genParticles);
437  std::auto_ptr<edm::Association<reco::GenParticleCollection> > outPri(new edm::Association<reco::GenParticleCollection>(priRP));
438  std::auto_ptr<edm::Association<reco::GenParticleCollection> > outSec(new edm::Association<reco::GenParticleCollection>(secRP));
439  edm::Association<reco::GenParticleCollection>::Filler fillPri(*outPri), fillSec(*outSec);
440  fillPri.insert(muons, muToPrimary.begin(), muToPrimary.end());
441  fillSec.insert(muons, muToSecondary.begin(), muToSecondary.end());
442  fillPri.fill(); fillSec.fill();
443  iEvent.put(outPri, "toPrimaries");
444  iEvent.put(outSec, "toSecondaries");
445  }
446 }
edm::InputTag genParticles_
bool linkToGenParticles_
Create a link to the generator level particles.
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
int i
Definition: DBlmapReader.cc:9
ProductID id() const
Definition: HandleBase.cc:15
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
void associateMuons(MuonToSimCollection &recoToSim, SimToMuonCollection &simToReco, const edm::RefToBaseVector< reco::Muon > &, MuonTrackType, const edm::RefVector< TrackingParticleCollection > &, const edm::Event *event=0, const edm::EventSetup *setup=0) const
edm::Ref< GenParticleCollection > GenParticleRef
persistent reference to a GenParticle
const_iterator end() const
bool isGlobalMuon() const
Definition: Muon.h:218
int convertAndPush(const TrackingParticle &tp, reco::GenParticleCollection &out, const TrackingParticleRef &momRef, const edm::Handle< reco::GenParticleCollection > &genParticles) const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
std::map< TrackingParticleRef, std::vector< std::pair< edm::RefToBase< reco::Muon >, double > > > SimToMuonCollection
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
TrackingParticleRef getTpMother(TrackingParticleRef tp)
const int mu
Definition: Constants.h:22
std::string associatorLabel_
The Associations.
tuple genp
produce generated paricles in acceptance #
edm::EDGetTokenT< reco::GenParticleCollection > genParticlesToken_
MuonAssociatorByHits::MuonTrackType trackType_
Track to use.
const T & get() const
Definition: EventSetup.h:55
key_type key() const
Accessor for product key.
Definition: Ref.h:266
T const * product() const
Definition: ESHandle.h:62
void writeValueMap(edm::Event &iEvent, const edm::Handle< edm::View< reco::Muon > > &handle, const std::vector< T > &values, const std::string &label) const
Write a ValueMap&lt;int&gt; in the event.
const_iterator begin() const
double decayRho_
Cylinder to use to decide if a decay is early or late.
edm::EDGetTokenT< edm::View< reco::Muon > > muonsToken_
The RECO objects.
tuple muons
Definition: patZpeak.py:38
void push_back(const RefToBase< T > &)
void push_back(value_type const &ref)
Add a Ref&lt;C, T&gt; to the RefVector.
Definition: RefVector.h:64
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:6
ProductID id() const
Accessor for product ID.
Definition: Ref.h:256
int flavour(int pdgId) const
Returns the flavour given a pdg id code.
Analysis-level muon class.
Definition: Muon.h:50
std::map< edm::RefToBase< reco::Muon >, std::vector< std::pair< TrackingParticleRef, double > >, RefToBaseSort > MuonToSimCollection
edm::Ref< TrackingParticleCollection > TrackingParticleRef
edm::EDGetTokenT< TrackingParticleCollection > trackingParticlesToken_
The TrackingParticle objects.
StringCutObjectSelector< pat::Muon > muonCut_
template<typename T >
void MuonMCClassifier::writeValueMap ( edm::Event iEvent,
const edm::Handle< edm::View< reco::Muon > > &  handle,
const std::vector< T > &  values,
const std::string &  label 
) const
private

Write a ValueMap<int> in the event.

Definition at line 450 of file MuonMCClassifier.cc.

References edm::helper::Filler< Map >::fill(), patZpeak::handle, edm::helper::Filler< Map >::insert(), and edm::Event::put().

Referenced by produce().

454 {
455  using namespace edm;
456  using namespace std;
457  auto_ptr<ValueMap<T> > valMap(new ValueMap<T>());
458  typename edm::ValueMap<T>::Filler filler(*valMap);
459  filler.insert(handle, values.begin(), values.end());
460  filler.fill();
461  iEvent.put(valMap, label);
462 }
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116

Member Data Documentation

std::string MuonMCClassifier::associatorLabel_
private

The Associations.

Definition at line 91 of file MuonMCClassifier.cc.

Referenced by produce().

double MuonMCClassifier::decayAbsZ_
private

Definition at line 94 of file MuonMCClassifier.cc.

Referenced by produce().

double MuonMCClassifier::decayRho_
private

Cylinder to use to decide if a decay is early or late.

Definition at line 94 of file MuonMCClassifier.cc.

Referenced by produce().

edm::InputTag MuonMCClassifier::genParticles_
private

Definition at line 98 of file MuonMCClassifier.cc.

Referenced by convertAndPush(), MuonMCClassifier(), and produce().

edm::EDGetTokenT<reco::GenParticleCollection> MuonMCClassifier::genParticlesToken_
private

Definition at line 99 of file MuonMCClassifier.cc.

Referenced by MuonMCClassifier(), and produce().

bool MuonMCClassifier::hasMuonCut_
private

A preselection cut for the muon. I pass through pat::Muon so that I can access muon id selectors

Definition at line 81 of file MuonMCClassifier.cc.

Referenced by produce().

bool MuonMCClassifier::linkToGenParticles_
private

Create a link to the generator level particles.

Definition at line 97 of file MuonMCClassifier.cc.

Referenced by MuonMCClassifier(), and produce().

StringCutObjectSelector<pat::Muon> MuonMCClassifier::muonCut_
private

Definition at line 82 of file MuonMCClassifier.cc.

Referenced by produce().

edm::EDGetTokenT<edm::View<reco::Muon> > MuonMCClassifier::muonsToken_
private

The RECO objects.

Definition at line 77 of file MuonMCClassifier.cc.

Referenced by produce().

edm::EDGetTokenT<TrackingParticleCollection> MuonMCClassifier::trackingParticlesToken_
private

The TrackingParticle objects.

Definition at line 88 of file MuonMCClassifier.cc.

Referenced by produce().

MuonAssociatorByHits::MuonTrackType MuonMCClassifier::trackType_
private

Track to use.

Definition at line 85 of file MuonMCClassifier.cc.

Referenced by MuonMCClassifier(), and produce().