CMS 3D CMS Logo

PATTauProducer.cc
Go to the documentation of this file.
2 
8 
16 
21 
22 
25 
26 #include <vector>
27 #include <memory>
28 
29 using namespace pat;
30 
32  isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false) ,
33  useUserData_(iConfig.exists("userData"))
34 {
35  // initialize the configurables
36  baseTauToken_ = consumes<edm::View<reco::BaseTau> >(iConfig.getParameter<edm::InputTag>( "tauSource" ));
37  tauTransverseImpactParameterSrc_ = iConfig.getParameter<edm::InputTag>( "tauTransverseImpactParameterSource" );
38  tauTransverseImpactParameterToken_ = consumes<PFTauTIPAssociationByRef>( tauTransverseImpactParameterSrc_);
39  pfTauToken_ = consumes<reco::PFTauCollection>(iConfig.getParameter<edm::InputTag>( "tauSource" ));
40  caloTauToken_ = mayConsume<reco::CaloTauCollection>(iConfig.getParameter<edm::InputTag>( "tauSource" ));
41  embedIsolationTracks_ = iConfig.getParameter<bool>( "embedIsolationTracks" );
42  embedLeadTrack_ = iConfig.getParameter<bool>( "embedLeadTrack" );
43  embedSignalTracks_ = iConfig.getParameter<bool>( "embedSignalTracks" );
44  embedLeadPFCand_ = iConfig.getParameter<bool>( "embedLeadPFCand" );
45  embedLeadPFChargedHadrCand_ = iConfig.getParameter<bool>( "embedLeadPFChargedHadrCand" );
46  embedLeadPFNeutralCand_ = iConfig.getParameter<bool>( "embedLeadPFNeutralCand" );
47  embedSignalPFCands_ = iConfig.getParameter<bool>( "embedSignalPFCands" );
48  embedSignalPFChargedHadrCands_ = iConfig.getParameter<bool>( "embedSignalPFChargedHadrCands" );
49  embedSignalPFNeutralHadrCands_ = iConfig.getParameter<bool>( "embedSignalPFNeutralHadrCands" );
50  embedSignalPFGammaCands_ = iConfig.getParameter<bool>( "embedSignalPFGammaCands" );
51  embedIsolationPFCands_ = iConfig.getParameter<bool>( "embedIsolationPFCands" );
52  embedIsolationPFChargedHadrCands_ = iConfig.getParameter<bool>( "embedIsolationPFChargedHadrCands" );
53  embedIsolationPFNeutralHadrCands_ = iConfig.getParameter<bool>( "embedIsolationPFNeutralHadrCands" );
54  embedIsolationPFGammaCands_ = iConfig.getParameter<bool>( "embedIsolationPFGammaCands" );
55  addGenMatch_ = iConfig.getParameter<bool>( "addGenMatch" );
56  if (addGenMatch_) {
57  embedGenMatch_ = iConfig.getParameter<bool>( "embedGenMatch" );
58  if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
60  }
61  else {
62  genMatchTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "genParticleMatch" ), [this](edm::InputTag const & tag){return consumes<edm::Association<reco::GenParticleCollection> >(tag);});
63  }
64  }
65  addGenJetMatch_ = iConfig.getParameter<bool>( "addGenJetMatch" );
66  if(addGenJetMatch_) {
67  embedGenJetMatch_ = iConfig.getParameter<bool>( "embedGenJetMatch" );
68  genJetMatchToken_ = consumes<edm::Association<reco::GenJetCollection> >(iConfig.getParameter<edm::InputTag>( "genJetMatch" ));
69  }
70  addTauJetCorrFactors_ = iConfig.getParameter<bool>( "addTauJetCorrFactors" );
71  tauJetCorrFactorsTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "tauJetCorrFactorsSource" ), [this](edm::InputTag const & tag){return mayConsume<edm::ValueMap<TauJetCorrFactors> >(tag);});
72  // tau ID configurables
73  addTauID_ = iConfig.getParameter<bool>( "addTauID" );
74  if ( addTauID_ ) {
75  // read the different tau ID names
76  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("tauIDSources");
77  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
78  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
79  tauIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
80  }
81  // but in any case at least once
82  if (tauIDSrcs_.empty()) throw cms::Exception("Configuration") <<
83  "PATTauProducer: id addTauID is true, you must specify either:\n" <<
84  "\tPSet tauIDSources = { \n" <<
85  "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
86  "\t}\n";
87  }
88  caloTauIDTokens_ = edm::vector_transform(tauIDSrcs_, [this](NameTag const & tag){return mayConsume<reco::CaloTauDiscriminator>(tag.second);});
89  pfTauIDTokens_ = edm::vector_transform(tauIDSrcs_, [this](NameTag const & tag){return mayConsume<reco::PFTauDiscriminator>(tag.second);});
90  // IsoDeposit configurables
91  if (iConfig.exists("isoDeposits")) {
92  edm::ParameterSet depconf = iConfig.getParameter<edm::ParameterSet>("isoDeposits");
93  if ( depconf.exists("tracker") ) isoDepositLabels_.push_back(std::make_pair(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker")));
94  if ( depconf.exists("ecal") ) isoDepositLabels_.push_back(std::make_pair(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal")));
95  if ( depconf.exists("hcal") ) isoDepositLabels_.push_back(std::make_pair(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal")));
96  if ( depconf.exists("pfAllParticles") ) isoDepositLabels_.push_back(std::make_pair(pat::PfAllParticleIso, depconf.getParameter<edm::InputTag>("pfAllParticles")));
97  if ( depconf.exists("pfChargedHadron") ) isoDepositLabels_.push_back(std::make_pair(pat::PfChargedHadronIso, depconf.getParameter<edm::InputTag>("pfChargedHadron")));
98  if ( depconf.exists("pfNeutralHadron") ) isoDepositLabels_.push_back(std::make_pair(pat::PfNeutralHadronIso,depconf.getParameter<edm::InputTag>("pfNeutralHadron")));
99  if ( depconf.exists("pfGamma") ) isoDepositLabels_.push_back(std::make_pair(pat::PfGammaIso, depconf.getParameter<edm::InputTag>("pfGamma")));
100 
101  if ( depconf.exists("user") ) {
102  std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
103  std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
104  int key = UserBaseIso;
105  for ( ; it != ed; ++it, ++key) {
106  isoDepositLabels_.push_back(std::make_pair(IsolationKeys(key), *it));
107  }
108  }
109  }
110  isoDepositTokens_ = edm::vector_transform(isoDepositLabels_, [this](std::pair<IsolationKeys,edm::InputTag> const & label){return consumes<edm::ValueMap<IsoDeposit> >(label.second);});
111  // Efficiency configurables
112  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
113  if (addEfficiencies_) {
115  }
116  // Resolution configurables
117  addResolutions_ = iConfig.getParameter<bool>("addResolutions");
118  if (addResolutions_) {
120  }
121  // Check to see if the user wants to add user data
122  if ( useUserData_ ) {
124  }
125  // produces vector of taus
126  produces<std::vector<Tau> >();
127 }
128 
130 {
131 }
132 
134 {
135  // switch off embedding (in unschedules mode)
136  if (iEvent.isRealData()){
137  addGenMatch_ = false;
138  embedGenMatch_ = false;
139  addGenJetMatch_ = false;
140  }
141 
142  // Get the collection of taus from the event
144  try {
145  iEvent.getByToken(baseTauToken_, anyTaus);
146  } catch (const edm::Exception &e) {
147  edm::LogWarning("DataSource") << "WARNING! No Tau collection found. This missing input will not block the job. Instead, an empty tau collection is being be produced.";
148  auto patTaus = std::make_unique<std::vector<Tau>>();
149  iEvent.put(std::move(patTaus));
150  return;
151  }
152 
153  if (isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
154 
156  if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
157 
158  std::vector<edm::Handle<edm::ValueMap<IsoDeposit> > > deposits(isoDepositTokens_.size());
159  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
160  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
161  }
162 
163  // prepare the MC matching
164  std::vector<edm::Handle<edm::Association<reco::GenParticleCollection> > >genMatches(genMatchTokens_.size());
165  if (addGenMatch_) {
166  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
167  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
168  }
169  }
170 
172  if (addGenJetMatch_) iEvent.getByToken(genJetMatchToken_, genJetMatch);
173 
174  // read in the jet correction factors ValueMap
175  std::vector<edm::ValueMap<TauJetCorrFactors> > tauJetCorrs;
176  if (addTauJetCorrFactors_) {
177  for ( size_t i = 0; i < tauJetCorrFactorsTokens_.size(); ++i ) {
179  iEvent.getByToken(tauJetCorrFactorsTokens_[i], tauJetCorr);
180  tauJetCorrs.push_back( *tauJetCorr );
181  }
182  }
183 
184  auto patTaus = std::make_unique<std::vector<Tau>>();
185 
186  bool first=true; // this is introduced to issue warnings only for the first tau-jet
187  for (size_t idx = 0, ntaus = anyTaus->size(); idx < ntaus; ++idx) {
188  edm::RefToBase<reco::BaseTau> tausRef = anyTaus->refAt(idx);
189  edm::Ptr<reco::BaseTau> tausPtr = anyTaus->ptrAt(idx);
190 
191  Tau aTau(tausRef);
192  if (embedLeadTrack_) aTau.embedLeadTrack();
195  if (embedLeadPFCand_) {
196  if (aTau.isPFTau() )
197  aTau.embedLeadPFCand();
198  else
199  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
200  }
202  if (aTau.isPFTau() )
204  else
205  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
206  }
208  if (aTau.isPFTau() )
209  aTau.embedLeadPFNeutralCand();
210  else
211  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
212  }
213  if (embedSignalPFCands_) {
214  if (aTau.isPFTau() )
215  aTau.embedSignalPFCands();
216  else
217  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
218  }
220  if (aTau.isPFTau() )
222  else
223  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
224  }
226  if (aTau.isPFTau() )
228  else
229  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
230  }
232  if (aTau.isPFTau() )
234  else
235  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
236  }
238  if (aTau.isPFTau() )
239  aTau.embedIsolationPFCands();
240  else
241  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
242  }
244  if (aTau.isPFTau() )
246  else
247  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
248  }
250  if (aTau.isPFTau() )
252  else
253  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
254  }
256  if (aTau.isPFTau() )
258  else
259  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
260  }
261 
262  if (addTauJetCorrFactors_) {
263  // add additional JetCorrs to the jet
264  for ( unsigned int i=0; i<tauJetCorrs.size(); ++i ) {
265  const TauJetCorrFactors& tauJetCorr = tauJetCorrs[i][tausRef];
266  // uncomment for debugging
267  // tauJetCorr.print();
268  aTau.addJECFactors(tauJetCorr);
269  }
270  std::vector<std::string> levels = tauJetCorrs[0][tausRef].correctionLabels();
271  if(std::find(levels.begin(), levels.end(), "L2L3Residual")!=levels.end()){
272  aTau.initializeJEC(tauJetCorrs[0][tausRef].jecLevel("L2L3Residual"));
273  }
274  else if(std::find(levels.begin(), levels.end(), "L3Absolute")!=levels.end()){
275  aTau.initializeJEC(tauJetCorrs[0][tausRef].jecLevel("L3Absolute"));
276  }
277  else{
278  aTau.initializeJEC(tauJetCorrs[0][tausRef].jecLevel("Uncorrected"));
279  if(first){
280  edm::LogWarning("L3Absolute not found")
281  << "L2L3Residual and L3Absolute are not part of the correction applied jetCorrFactors \n"
282  << "of module " << tauJetCorrs[0][tausRef].jecSet() << " jets will remain"
283  << " uncorrected.";
284  first=false;
285  }
286  }
287  }
288 
289  // store the match to the generated final state muons
290  if (addGenMatch_) {
291  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
292  reco::GenParticleRef genTau = (*genMatches[i])[tausRef];
293  aTau.addGenParticleRef(genTau);
294  }
295  if (embedGenMatch_) aTau.embedGenParticle();
296  }
297 
298  // store the match to the visible part of the generated tau
299  if (addGenJetMatch_) {
300  reco::GenJetRef genJetTau = (*genJetMatch)[tausRef];
301  if (genJetTau.isNonnull() && genJetTau.isAvailable() ) {
302  aTau.setGenJet( genJetTau );
303  } // leave empty if no match found
304  }
305 
306  // prepare ID extraction
307  if ( addTauID_ ) {
308  std::vector<pat::Tau::IdPair> ids(tauIDSrcs_.size());
309  for ( size_t i = 0; i < tauIDSrcs_.size(); ++i ) {
310  if ( typeid(*tausRef) == typeid(reco::PFTau) ) {
311  //std::cout << "filling PFTauDiscriminator '" << tauIDSrcs_[i].first << "' into pat::Tau object..." << std::endl;
312  edm::Handle<reco::PFTauCollection> pfTauCollection;
313  iEvent.getByToken(pfTauToken_, pfTauCollection);
314 
316  iEvent.getByToken(pfTauIDTokens_[i], pfTauIdDiscr);
317 
318  ids[i].first = tauIDSrcs_[i].first;
319  ids[i].second = getTauIdDiscriminator(pfTauCollection, idx, pfTauIdDiscr);
320  } else if ( typeid(*tausRef) == typeid(reco::CaloTau) ) {
321  //std::cout << "filling CaloTauDiscriminator '" << tauIDSrcs_[i].first << "' into pat::Tau object..." << std::endl;
322  edm::Handle<reco::CaloTauCollection> caloTauCollection;
323  iEvent.getByToken(caloTauToken_, caloTauCollection);
324 
326  iEvent.getByToken(caloTauIDTokens_[i], caloTauIdDiscr);
327 
328  ids[i].first = tauIDSrcs_[i].first;
329  ids[i].second = getTauIdDiscriminator(caloTauCollection, idx, caloTauIdDiscr);
330  } else {
331  throw cms::Exception("Type Mismatch") <<
332  "PATTauProducer: unsupported datatype '" << typeid(*tausRef).name() << "' for tauSource\n";
333  }
334  }
335 
336  aTau.setTauIDs(ids);
337  }
338 
339  // extraction of reconstructed tau decay mode
340  // (only available for PFTaus)
341  if ( aTau.isPFTau() ) {
343  iEvent.getByToken(pfTauToken_, pfTaus);
344  reco::PFTauRef pfTauRef(pfTaus, idx);
345 
346  aTau.setDecayMode(pfTauRef->decayMode());
347  }
348 
349  // extraction of variables needed to rerun MVA isolation and anti-electron discriminator on MiniAOD
350  if( aTau.isPFTau() ) {
352  iEvent.getByToken(pfTauToken_, pfTaus);
353  reco::PFTauRef pfTauRef(pfTaus, idx);
354  pat::tau::TauPFEssential& aTauPFEssential = aTau.pfEssential_[0];
355  float ecalEnergy = 0;
356  float hcalEnergy = 0;
357  float sumPhiTimesEnergy = 0.;
358  float sumEtaTimesEnergy = 0.;
359  float sumEnergy = 0.;
360  float leadChargedCandPt = -99;
361  float leadChargedCandEtaAtEcalEntrance = -99;
362  const std::vector<reco::PFCandidatePtr>& signalCands = pfTauRef->signalPFCands();
363  for(std::vector<reco::PFCandidatePtr>::const_iterator it = signalCands.begin(); it != signalCands.end(); ++it) {
364  const reco::PFCandidatePtr& icand = *it;
365  ecalEnergy += icand->ecalEnergy();
366  hcalEnergy += icand->hcalEnergy();
367  sumPhiTimesEnergy += icand->positionAtECALEntrance().phi()*icand->energy();
368  sumEtaTimesEnergy += icand->positionAtECALEntrance().eta()*icand->energy();
369  sumEnergy += icand->energy();
370  const reco::Track* track = 0;
371  if ( icand->trackRef().isNonnull() ) track = icand->trackRef().get();
372  else if ( icand->muonRef().isNonnull() && icand->muonRef()->innerTrack().isNonnull() ) track = icand->muonRef()->innerTrack().get();
373  else if ( icand->muonRef().isNonnull() && icand->muonRef()->globalTrack().isNonnull() ) track = icand->muonRef()->globalTrack().get();
374  else if ( icand->muonRef().isNonnull() && icand->muonRef()->outerTrack().isNonnull() ) track = icand->muonRef()->outerTrack().get();
375  else if ( icand->gsfTrackRef().isNonnull() ) track = icand->gsfTrackRef().get();
376  if( track ) {
377  if( track->pt() > leadChargedCandPt ) {
378  leadChargedCandEtaAtEcalEntrance = icand->positionAtECALEntrance().eta();
379  leadChargedCandPt = track->pt();
380  }
381  }
382  }
383  aTauPFEssential.ecalEnergy_ = ecalEnergy;
384  aTauPFEssential.hcalEnergy_ = hcalEnergy;
385  aTauPFEssential.ptLeadChargedCand_ = leadChargedCandPt;
386  aTauPFEssential.etaAtEcalEntranceLeadChargedCand_ = leadChargedCandEtaAtEcalEntrance;
387  if (sumEnergy != 0.) {
388  aTauPFEssential.phiAtEcalEntrance_ = sumPhiTimesEnergy/sumEnergy;
389  aTauPFEssential.etaAtEcalEntrance_ = sumEtaTimesEnergy/sumEnergy;
390  }
391  else {
392  aTauPFEssential.phiAtEcalEntrance_ = -99.;
393  aTauPFEssential.etaAtEcalEntrance_ = -99.;
394  }
395  float leadingTrackNormChi2 = 0;
396  float ecalEnergyLeadChargedHadrCand = -99.;
397  float hcalEnergyLeadChargedHadrCand = -99.;
398  float emFraction = -1.;
399  float myHCALenergy = 0.;
400  float myECALenergy = 0.;
401  const reco::PFCandidatePtr& leadingPFCharged = pfTauRef->leadPFChargedHadrCand();
402  if(leadingPFCharged.isNonnull()) {
403  ecalEnergyLeadChargedHadrCand = leadingPFCharged->ecalEnergy();
404  hcalEnergyLeadChargedHadrCand = leadingPFCharged->hcalEnergy();
405  reco::TrackRef trackRef = leadingPFCharged->trackRef();
406  if( trackRef.isNonnull() ) {
407  leadingTrackNormChi2 = trackRef->normalizedChi2();
408  for( std::vector<reco::PFCandidatePtr>::const_iterator tauIt = pfTauRef->isolationPFCands().begin(); tauIt!=pfTauRef->isolationPFCands().end(); ++tauIt ){
409  myHCALenergy += (*tauIt)->hcalEnergy();
410  myECALenergy += (*tauIt)->ecalEnergy();
411  }
412  for( std::vector<reco::PFCandidatePtr>::const_iterator tauIt = pfTauRef->signalPFCands().begin(); tauIt!=pfTauRef->signalPFCands().end(); ++tauIt ){
413  myHCALenergy += (*tauIt)->hcalEnergy();
414  myECALenergy += (*tauIt)->ecalEnergy();
415  }
416  if( myHCALenergy + myECALenergy != 0. ) {
417  emFraction = myECALenergy/( myHCALenergy + myECALenergy);
418  }
419  }
420  }
421  aTauPFEssential.emFraction_ = emFraction;
422  aTauPFEssential.leadingTrackNormChi2_ = leadingTrackNormChi2;
423  aTauPFEssential.ecalEnergyLeadChargedHadrCand_ = ecalEnergyLeadChargedHadrCand;
424  aTauPFEssential.hcalEnergyLeadChargedHadrCand_ = hcalEnergyLeadChargedHadrCand;
425  // extraction of tau lifetime information
427  edm::Handle<PFTauTIPAssociationByRef> tauLifetimeInfos;
428  iEvent.getByToken(tauTransverseImpactParameterToken_, tauLifetimeInfos);
429  const reco::PFTauTransverseImpactParameter& tauLifetimeInfo = *(*tauLifetimeInfos)[pfTauRef];
430  pat::tau::TauPFEssential& aTauPFEssential = aTau.pfEssential_[0];
431  aTauPFEssential.dxy_PCA_ = tauLifetimeInfo.dxy_PCA();
432  aTauPFEssential.dxy_ = tauLifetimeInfo.dxy();
433  aTauPFEssential.dxy_error_ = tauLifetimeInfo.dxy_error();
434  aTauPFEssential.hasSV_ = tauLifetimeInfo.hasSecondaryVertex();
435  aTauPFEssential.flightLength_ = tauLifetimeInfo.flightLength();
436  aTauPFEssential.flightLengthSig_ = tauLifetimeInfo.flightLengthSig();
437  aTauPFEssential.ip3d_ = tauLifetimeInfo.ip3d();
438  aTauPFEssential.ip3d_error_ = tauLifetimeInfo.ip3d_error();
439  }
440  }
441 
442  // Isolation
443  if (isolator_.enabled()) {
445  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
446  // better to loop backwards, so the vector is resized less times
447  for ( IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(),
448  ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
449  aTau.setIsolation(it->first, it->second);
450  }
451  }
452 
453  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
454  aTau.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[tausRef]);
455  }
456 
457  if (efficiencyLoader_.enabled()) {
458  efficiencyLoader_.setEfficiencies( aTau, tausRef );
459  }
460 
461  if (resolutionLoader_.enabled()) {
463  }
464 
465  if ( useUserData_ ) {
466  userDataHelper_.add( aTau, iEvent, iSetup );
467  }
468 
469  patTaus->push_back(aTau);
470  }
471 
472  // sort taus in pT
473  std::sort(patTaus->begin(), patTaus->end(), pTTauComparator_);
474 
475  // put genEvt object in Event
476  iEvent.put(std::move(patTaus));
477 
478  // clean up
480 }
481 
482 template <typename TauCollectionType, typename TauDiscrType>
483 float PATTauProducer::getTauIdDiscriminator(const edm::Handle<TauCollectionType>& tauCollection, size_t tauIdx, const edm::Handle<TauDiscrType>& tauIdDiscr)
484 {
485  edm::Ref<TauCollectionType> tauRef(tauCollection, tauIdx);
486  return (*tauIdDiscr)[tauRef];
487 }
488 
489 // ParameterSet description for module
491 {
493  iDesc.setComment("PAT tau producer module");
494 
495  // input source
496  iDesc.add<edm::InputTag>("tauSource", edm::InputTag())->setComment("input collection");
497 
498  // embedding
499  iDesc.add<bool>("embedIsolationTracks", false)->setComment("embed external isolation tracks");
500  iDesc.add<bool>("embedLeadTrack", false)->setComment("embed external leading track");
501  iDesc.add<bool>("embedLeadTracks", false)->setComment("embed external signal tracks");
502 
503  // MC matching configurables
504  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
505  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
506  std::vector<edm::InputTag> emptySourceVector;
507  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
508  edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
509  )->setComment("input with MC match information");
510 
511  // MC jet matching variables
512  iDesc.add<bool>("addGenJetMatch", true)->setComment("add MC jet matching");
513  iDesc.add<bool>("embedGenJetMatch", false)->setComment("embed MC jet matched jet information");
514  iDesc.add<edm::InputTag>("genJetMatch", edm::InputTag("tauGenJetMatch"));
515 
516 
518 
519  // tau ID configurables
520  iDesc.add<bool>("addTauID", true)->setComment("add tau ID variables");
521  edm::ParameterSetDescription tauIDSourcesPSet;
522  tauIDSourcesPSet.setAllowAnything();
523  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("tauIDSource", edm::InputTag(), true) xor
524  edm::ParameterDescription<edm::ParameterSetDescription>("tauIDSources", tauIDSourcesPSet, true)
525  )->setComment("input with electron ID variables");
526 
527  // IsoDeposit configurables
528  edm::ParameterSetDescription isoDepositsPSet;
529  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
530  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
531  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
532  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
533  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadron");
534  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadron");
535  isoDepositsPSet.addOptional<edm::InputTag>("pfGamma");
536  isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
537  iDesc.addOptional("isoDeposits", isoDepositsPSet);
538 
539  // Efficiency configurables
540  edm::ParameterSetDescription efficienciesPSet;
541  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
542  iDesc.add("efficiencies", efficienciesPSet);
543  iDesc.add<bool>("addEfficiencies", false);
544 
545  // Check to see if the user wants to add user data
546  edm::ParameterSetDescription userDataPSet;
548  iDesc.addOptional("userData", userDataPSet);
549 
550  edm::ParameterSetDescription isolationPSet;
551  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
552  iDesc.add("userIsolation", isolationPSet);
553 
554 }
555 
557 
559 
560 
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
bool isAvailable() const
Definition: Ref.h:577
T getParameter(std::string const &) const
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
void newEvent(const edm::Event &event)
To be called for each new event, reads in the ValueMaps for efficiencies.
std::pair< std::string, edm::InputTag > NameTag
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:253
void setIsolation(IsolationKeys key, float value)
Definition: Lepton.h:99
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
void embedIsolationPFCands()
method to store the isolation candidates internally
static const HistoName names[]
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
void embedIsolationPFGammaCands()
method to store the isolation gamma candidates internally
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:460
void setAllowAnything()
allow any parameter label/value pairs
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:159
pat::helper::EfficiencyLoader efficiencyLoader_
void embedLeadTrack()
method to store the leading track internally
bool exists(std::string const &parameterName) const
checks if a parameter exists
void embedSignalPFChargedHadrCands()
method to store the signal charged hadrons candidates internally
pat::helper::KinResolutionsLoader resolutionLoader_
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
float getTauIdDiscriminator(const edm::Handle< TauCollectionType > &, size_t, const edm::Handle< TauDiscrType > &)
void setDecayMode(int)
set decay mode
void setTauIDs(const std::vector< IdPair > &ids)
Definition: Tau.h:384
IsolationKeys
Enum defining isolation keys.
Definition: Isolation.h:9
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
bool isRealData() const
Definition: EventBase.h:64
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
Definition: Lepton.h:176
bool embedIsolationPFChargedHadrCands_
Definition: HeavyIon.h:7
static void fillDescription(edm::ParameterSetDescription &iDesc)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:194
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:50
void setComment(std::string const &value)
void embedSignalPFCands()
method to store the signal candidates internally
int iEvent
Definition: GenABIO.cc:230
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
edm::EDGetTokenT< PFTauTIPAssociationByRef > tauTransverseImpactParameterToken_
pat::helper::MultiIsolator isolator_
void embedGenParticle()
Definition: PATObject.h:694
edm::EDGetTokenT< edm::View< reco::BaseTau > > baseTauToken_
void newEvent(const edm::Event &event, const edm::EventSetup &setup)
To be called for each new event, reads in the EventSetup object.
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
bool embedIsolationPFNeutralHadrCands_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double pt() const
track transverse momentum
Definition: TrackBase.h:621
edm::EDGetTokenT< reco::CaloTauCollection > caloTauToken_
pat::PATUserDataHelper< pat::Tau > userDataHelper_
genJetMatch
switch on/off embedding of matched genJet&#39;s
bool embedSignalPFNeutralHadrCands_
std::vector< pat::tau::TauPFEssential > pfEssential_
Definition: Tau.h:533
void embedIsolationPFNeutralHadrCands()
method to store the isolation neutral hadrons candidates internally
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void embedLeadPFChargedHadrCand()
method to store the leading charged hadron candidate internally
void embedIsolationPFChargedHadrCands()
method to store the isolation charged hadrons candidates internally
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:168
void setGenJet(const reco::GenJetRef &ref)
set the matched GenJet
Definition: Tau.py:1
void embedLeadPFNeutralCand()
method to store the leading neutral candidate internally
std::vector< edm::EDGetTokenT< reco::CaloTauDiscriminator > > caloTauIDTokens_
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:678
std::vector< edm::EDGetTokenT< edm::ValueMap< TauJetCorrFactors > > > tauJetCorrFactorsTokens_
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
edm::InputTag tauTransverseImpactParameterSrc_
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
edm::EDGetTokenT< edm::Association< reco::GenJetCollection > > genJetMatchToken_
std::string const & label() const
Definition: InputTag.h:36
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void initializeJEC(unsigned int level, const unsigned int set=0)
initialize the jet to a given JEC level during creation starting from Uncorrected ...
void embedSignalPFNeutralHadrCands()
method to store the signal neutral hadrons candidates internally
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:16
void addJECFactors(const TauJetCorrFactors &jec)
add more sets of energy correction factors
Definition: Tau.h:449
PATTauProducer(const edm::ParameterSet &iConfig)
HLT enums.
void embedSignalTracks()
method to store the signal tracks internally
bool isPFTau() const
Returns true if this pat::Tau was made from a reco::PFTau.
Definition: Tau.h:157
void embedSignalPFGammaCands()
method to store the signal gamma candidates internally
std::vector< std::pair< pat::IsolationKeys, edm::InputTag > > isoDepositLabels_
bool embedSignalPFChargedHadrCands_
std::vector< edm::EDGetTokenT< reco::PFTauDiscriminator > > pfTauIDTokens_
void embedIsolationTracks()
method to store the isolation tracks internally
std::vector< NameTag > tauIDSrcs_
edm::EDGetTokenT< reco::PFTauCollection > pfTauToken_
def move(src, dest)
Definition: eostools.py:510
GreaterByPt< Tau > pTTauComparator_
levels
correction levels
Produces pat::Tau&#39;s.
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:82
void embedLeadPFCand()