CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PATTauProducer.cc
Go to the documentation of this file.
1 //
2 //
3 
5 
11 
19 
24 
25 
28 
29 #include <vector>
30 #include <memory>
31 
32 using namespace pat;
33 
35  isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false) ,
36  useUserData_(iConfig.exists("userData"))
37 {
38  // initialize the configurables
39  baseTauToken_ = consumes<edm::View<reco::BaseTau> >(iConfig.getParameter<edm::InputTag>( "tauSource" ));
40  tauTransverseImpactParameterSrc_ = iConfig.getParameter<edm::InputTag>( "tauTransverseImpactParameterSource" );
41  tauTransverseImpactParameterToken_ = consumes<PFTauTIPAssociationByRef>( tauTransverseImpactParameterSrc_);
42  pfTauToken_ = consumes<reco::PFTauCollection>(iConfig.getParameter<edm::InputTag>( "tauSource" ));
43  caloTauToken_ = mayConsume<reco::CaloTauCollection>(iConfig.getParameter<edm::InputTag>( "tauSource" ));
44  embedIsolationTracks_ = iConfig.getParameter<bool>( "embedIsolationTracks" );
45  embedLeadTrack_ = iConfig.getParameter<bool>( "embedLeadTrack" );
46  embedSignalTracks_ = iConfig.getParameter<bool>( "embedSignalTracks" );
47  embedLeadPFCand_ = iConfig.getParameter<bool>( "embedLeadPFCand" );
48  embedLeadPFChargedHadrCand_ = iConfig.getParameter<bool>( "embedLeadPFChargedHadrCand" );
49  embedLeadPFNeutralCand_ = iConfig.getParameter<bool>( "embedLeadPFNeutralCand" );
50  embedSignalPFCands_ = iConfig.getParameter<bool>( "embedSignalPFCands" );
51  embedSignalPFChargedHadrCands_ = iConfig.getParameter<bool>( "embedSignalPFChargedHadrCands" );
52  embedSignalPFNeutralHadrCands_ = iConfig.getParameter<bool>( "embedSignalPFNeutralHadrCands" );
53  embedSignalPFGammaCands_ = iConfig.getParameter<bool>( "embedSignalPFGammaCands" );
54  embedIsolationPFCands_ = iConfig.getParameter<bool>( "embedIsolationPFCands" );
55  embedIsolationPFChargedHadrCands_ = iConfig.getParameter<bool>( "embedIsolationPFChargedHadrCands" );
56  embedIsolationPFNeutralHadrCands_ = iConfig.getParameter<bool>( "embedIsolationPFNeutralHadrCands" );
57  embedIsolationPFGammaCands_ = iConfig.getParameter<bool>( "embedIsolationPFGammaCands" );
58  addGenMatch_ = iConfig.getParameter<bool>( "addGenMatch" );
59  if (addGenMatch_) {
60  embedGenMatch_ = iConfig.getParameter<bool>( "embedGenMatch" );
61  if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
63  }
64  else {
65  genMatchTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "genParticleMatch" ), [this](edm::InputTag const & tag){return consumes<edm::Association<reco::GenParticleCollection> >(tag);});
66  }
67  }
68  addGenJetMatch_ = iConfig.getParameter<bool>( "addGenJetMatch" );
69  if(addGenJetMatch_) {
70  embedGenJetMatch_ = iConfig.getParameter<bool>( "embedGenJetMatch" );
71  genJetMatchToken_ = consumes<edm::Association<reco::GenJetCollection> >(iConfig.getParameter<edm::InputTag>( "genJetMatch" ));
72  }
73  addTauJetCorrFactors_ = iConfig.getParameter<bool>( "addTauJetCorrFactors" );
74  tauJetCorrFactorsTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "tauJetCorrFactorsSource" ), [this](edm::InputTag const & tag){return mayConsume<edm::ValueMap<TauJetCorrFactors> >(tag);});
75  // tau ID configurables
76  addTauID_ = iConfig.getParameter<bool>( "addTauID" );
77  if ( addTauID_ ) {
78  // it might be a single tau ID
79  if (iConfig.existsAs<edm::InputTag>("tauIDSource")) {
80  tauIDSrcs_.push_back(NameTag("", iConfig.getParameter<edm::InputTag>("tauIDSource")));
81  }
82  // or there might be many of them
83  if (iConfig.existsAs<edm::ParameterSet>("tauIDSources")) {
84  // please don't configure me twice
85  if (!tauIDSrcs_.empty()){
86  throw cms::Exception("Configuration") << "PATTauProducer: you can't specify both 'tauIDSource' and 'tauIDSources'\n";
87  }
88  // read the different tau ID names
89  edm::ParameterSet idps = iConfig.getParameter<edm::ParameterSet>("tauIDSources");
90  std::vector<std::string> names = idps.getParameterNamesForType<edm::InputTag>();
91  for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
92  tauIDSrcs_.push_back(NameTag(*it, idps.getParameter<edm::InputTag>(*it)));
93  }
94  }
95  // but in any case at least once
96  if (tauIDSrcs_.empty()) throw cms::Exception("Configuration") <<
97  "PATTauProducer: id addTauID is true, you must specify either:\n" <<
98  "\tInputTag tauIDSource = <someTag>\n" << "or\n" <<
99  "\tPSet tauIDSources = { \n" <<
100  "\t\tInputTag <someName> = <someTag> // as many as you want \n " <<
101  "\t}\n";
102  }
103  caloTauIDTokens_ = edm::vector_transform(tauIDSrcs_, [this](NameTag const & tag){return mayConsume<reco::CaloTauDiscriminator>(tag.second);});
104  pfTauIDTokens_ = edm::vector_transform(tauIDSrcs_, [this](NameTag const & tag){return mayConsume<reco::PFTauDiscriminator>(tag.second);});
105  // IsoDeposit configurables
106  if (iConfig.exists("isoDeposits")) {
107  edm::ParameterSet depconf = iConfig.getParameter<edm::ParameterSet>("isoDeposits");
108  if ( depconf.exists("tracker") ) isoDepositLabels_.push_back(std::make_pair(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker")));
109  if ( depconf.exists("ecal") ) isoDepositLabels_.push_back(std::make_pair(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal")));
110  if ( depconf.exists("hcal") ) isoDepositLabels_.push_back(std::make_pair(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal")));
111  if ( depconf.exists("pfAllParticles") ) isoDepositLabels_.push_back(std::make_pair(pat::PfAllParticleIso, depconf.getParameter<edm::InputTag>("pfAllParticles")));
112  if ( depconf.exists("pfChargedHadron") ) isoDepositLabels_.push_back(std::make_pair(pat::PfChargedHadronIso, depconf.getParameter<edm::InputTag>("pfChargedHadron")));
113  if ( depconf.exists("pfNeutralHadron") ) isoDepositLabels_.push_back(std::make_pair(pat::PfNeutralHadronIso,depconf.getParameter<edm::InputTag>("pfNeutralHadron")));
114  if ( depconf.exists("pfGamma") ) isoDepositLabels_.push_back(std::make_pair(pat::PfGammaIso, depconf.getParameter<edm::InputTag>("pfGamma")));
115 
116  if ( depconf.exists("user") ) {
117  std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag> >("user");
118  std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
119  int key = UserBaseIso;
120  for ( ; it != ed; ++it, ++key) {
121  isoDepositLabels_.push_back(std::make_pair(IsolationKeys(key), *it));
122  }
123  }
124  }
125  isoDepositTokens_ = edm::vector_transform(isoDepositLabels_, [this](std::pair<IsolationKeys,edm::InputTag> const & label){return consumes<edm::ValueMap<IsoDeposit> >(label.second);});
126  // Efficiency configurables
127  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
128  if (addEfficiencies_) {
129  efficiencyLoader_ = pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"), consumesCollector());
130  }
131  // Resolution configurables
132  addResolutions_ = iConfig.getParameter<bool>("addResolutions");
133  if (addResolutions_) {
134  resolutionLoader_ = pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"));
135  }
136  // Check to see if the user wants to add user data
137  if ( useUserData_ ) {
138  userDataHelper_ = PATUserDataHelper<Tau>(iConfig.getParameter<edm::ParameterSet>("userData"), consumesCollector());
139  }
140  // produces vector of taus
141  produces<std::vector<Tau> >();
142 }
143 
144 PATTauProducer::~PATTauProducer()
145 {
146 }
147 
149 {
150  // switch off embedding (in unschedules mode)
151  if (iEvent.isRealData()){
152  addGenMatch_ = false;
153  embedGenMatch_ = false;
154  addGenJetMatch_ = false;
155  }
156 
157  // Get the collection of taus from the event
159  try {
160  iEvent.getByToken(baseTauToken_, anyTaus);
161  } catch (const edm::Exception &e) {
162  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.";
163  std::auto_ptr<std::vector<Tau> > patTaus(new std::vector<Tau>());
164  iEvent.put(patTaus);
165  return;
166  }
167 
168  if (isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
169 
171  if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
172 
173  std::vector<edm::Handle<edm::ValueMap<IsoDeposit> > > deposits(isoDepositTokens_.size());
174  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
175  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
176  }
177 
178  // prepare the MC matching
179  std::vector<edm::Handle<edm::Association<reco::GenParticleCollection> > >genMatches(genMatchTokens_.size());
180  if (addGenMatch_) {
181  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
182  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
183  }
184  }
185 
187  if (addGenJetMatch_) iEvent.getByToken(genJetMatchToken_, genJetMatch);
188 
189  // read in the jet correction factors ValueMap
190  std::vector<edm::ValueMap<TauJetCorrFactors> > tauJetCorrs;
191  if (addTauJetCorrFactors_) {
192  for ( size_t i = 0; i < tauJetCorrFactorsTokens_.size(); ++i ) {
194  iEvent.getByToken(tauJetCorrFactorsTokens_[i], tauJetCorr);
195  tauJetCorrs.push_back( *tauJetCorr );
196  }
197  }
198 
199  std::auto_ptr<std::vector<Tau> > patTaus(new std::vector<Tau>());
200 
201  bool first=true; // this is introduced to issue warnings only for the first tau-jet
202  for (size_t idx = 0, ntaus = anyTaus->size(); idx < ntaus; ++idx) {
203  edm::RefToBase<reco::BaseTau> tausRef = anyTaus->refAt(idx);
204  edm::Ptr<reco::BaseTau> tausPtr = anyTaus->ptrAt(idx);
205 
206  Tau aTau(tausRef);
207  if (embedLeadTrack_) aTau.embedLeadTrack();
210  if (embedLeadPFCand_) {
211  if (aTau.isPFTau() )
212  aTau.embedLeadPFCand();
213  else
214  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
215  }
217  if (aTau.isPFTau() )
219  else
220  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
221  }
223  if (aTau.isPFTau() )
224  aTau.embedLeadPFNeutralCand();
225  else
226  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
227  }
228  if (embedSignalPFCands_) {
229  if (aTau.isPFTau() )
230  aTau.embedSignalPFCands();
231  else
232  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
233  }
235  if (aTau.isPFTau() )
237  else
238  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
239  }
241  if (aTau.isPFTau() )
243  else
244  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
245  }
247  if (aTau.isPFTau() )
249  else
250  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
251  }
253  if (aTau.isPFTau() )
254  aTau.embedIsolationPFCands();
255  else
256  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
257  }
259  if (aTau.isPFTau() )
261  else
262  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
263  }
265  if (aTau.isPFTau() )
267  else
268  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
269  }
271  if (aTau.isPFTau() )
273  else
274  edm::LogWarning("Type Error") << "Embedding a PFTau-specific information into a pat::Tau which wasn't made from a reco::PFTau is impossible.\n";
275  }
276 
277  if (addTauJetCorrFactors_) {
278  // add additional JetCorrs to the jet
279  for ( unsigned int i=0; i<tauJetCorrs.size(); ++i ) {
280  const TauJetCorrFactors& tauJetCorr = tauJetCorrs[i][tausRef];
281  // uncomment for debugging
282  // tauJetCorr.print();
283  aTau.addJECFactors(tauJetCorr);
284  }
285  std::vector<std::string> levels = tauJetCorrs[0][tausRef].correctionLabels();
286  if(std::find(levels.begin(), levels.end(), "L2L3Residual")!=levels.end()){
287  aTau.initializeJEC(tauJetCorrs[0][tausRef].jecLevel("L2L3Residual"));
288  }
289  else if(std::find(levels.begin(), levels.end(), "L3Absolute")!=levels.end()){
290  aTau.initializeJEC(tauJetCorrs[0][tausRef].jecLevel("L3Absolute"));
291  }
292  else{
293  aTau.initializeJEC(tauJetCorrs[0][tausRef].jecLevel("Uncorrected"));
294  if(first){
295  edm::LogWarning("L3Absolute not found")
296  << "L2L3Residual and L3Absolute are not part of the correction applied jetCorrFactors \n"
297  << "of module " << tauJetCorrs[0][tausRef].jecSet() << " jets will remain"
298  << " uncorrected.";
299  first=false;
300  }
301  }
302  }
303 
304  // store the match to the generated final state muons
305  if (addGenMatch_) {
306  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
307  reco::GenParticleRef genTau = (*genMatches[i])[tausRef];
308  aTau.addGenParticleRef(genTau);
309  }
310  if (embedGenMatch_) aTau.embedGenParticle();
311  }
312 
313  // store the match to the visible part of the generated tau
314  if (addGenJetMatch_) {
315  reco::GenJetRef genJetTau = (*genJetMatch)[tausRef];
316  if (genJetTau.isNonnull() && genJetTau.isAvailable() ) {
317  aTau.setGenJet( genJetTau );
318  } // leave empty if no match found
319  }
320 
321  // prepare ID extraction
322  if ( addTauID_ ) {
323  std::vector<pat::Tau::IdPair> ids(tauIDSrcs_.size());
324  for ( size_t i = 0; i < tauIDSrcs_.size(); ++i ) {
325  if ( typeid(*tausRef) == typeid(reco::PFTau) ) {
326  //std::cout << "filling PFTauDiscriminator '" << tauIDSrcs_[i].first << "' into pat::Tau object..." << std::endl;
327  edm::Handle<reco::PFTauCollection> pfTauCollection;
328  iEvent.getByToken(pfTauToken_, pfTauCollection);
329 
331  iEvent.getByToken(pfTauIDTokens_[i], pfTauIdDiscr);
332 
333  ids[i].first = tauIDSrcs_[i].first;
334  ids[i].second = getTauIdDiscriminator(pfTauCollection, idx, pfTauIdDiscr);
335  } else if ( typeid(*tausRef) == typeid(reco::CaloTau) ) {
336  //std::cout << "filling CaloTauDiscriminator '" << tauIDSrcs_[i].first << "' into pat::Tau object..." << std::endl;
337  edm::Handle<reco::CaloTauCollection> caloTauCollection;
338  iEvent.getByToken(caloTauToken_, caloTauCollection);
339 
341  iEvent.getByToken(caloTauIDTokens_[i], caloTauIdDiscr);
342 
343  ids[i].first = tauIDSrcs_[i].first;
344  ids[i].second = getTauIdDiscriminator(caloTauCollection, idx, caloTauIdDiscr);
345  } else {
346  throw cms::Exception("Type Mismatch") <<
347  "PATTauProducer: unsupported datatype '" << typeid(*tausRef).name() << "' for tauSource\n";
348  }
349  }
350 
351  aTau.setTauIDs(ids);
352  }
353 
354  // extraction of reconstructed tau decay mode
355  // (only available for PFTaus)
356  if ( aTau.isPFTau() ) {
358  iEvent.getByToken(pfTauToken_, pfTaus);
359  reco::PFTauRef pfTauRef(pfTaus, idx);
360 
361  aTau.setDecayMode(pfTauRef->decayMode());
362  }
363 
364  // extraction of tau lifetime information
365  // (only available for PFTaus)
366  if ( aTau.isPFTau() && tauTransverseImpactParameterSrc_.label() != "" ) {
368  iEvent.getByToken(pfTauToken_, pfTaus);
369  reco::PFTauRef pfTauRef(pfTaus, idx);
370  edm::Handle<PFTauTIPAssociationByRef> tauLifetimeInfos;
371  iEvent.getByToken(tauTransverseImpactParameterToken_, tauLifetimeInfos);
372  const reco::PFTauTransverseImpactParameter& tauLifetimeInfo = *(*tauLifetimeInfos)[pfTauRef];
373  pat::tau::TauPFEssential& aTauPFEssential = aTau.pfEssential_[0];
374  aTauPFEssential.dxy_PCA_ = tauLifetimeInfo.dxy_PCA();
375  aTauPFEssential.dxy_ = tauLifetimeInfo.dxy();
376  aTauPFEssential.dxy_error_ = tauLifetimeInfo.dxy_error();
377  // aTauPFEssential.pv_ = tauLifetimeInfo.primaryVertex();
378  // aTauPFEssential.pvPos_ = tauLifetimeInfo.primaryVertexPos();
379  // aTauPFEssential.pvCov_ = tauLifetimeInfo.primaryVertexCov();
380  aTauPFEssential.hasSV_ = tauLifetimeInfo.hasSecondaryVertex();
381  if(tauLifetimeInfo.hasSecondaryVertex()){
382  aTauPFEssential.flightLength_ = tauLifetimeInfo.flightLength();
383  aTauPFEssential.flightLengthSig_ = tauLifetimeInfo.flightLengthSig();
384  // aTauPFEssential.sv_ = tauLifetimeInfo.secondaryVertex();
385  // aTauPFEssential.svPos_ = tauLifetimeInfo.secondaryVertexPos();
386  // aTauPFEssential.svCov_ = tauLifetimeInfo.secondaryVertexCov();
387  }
388  }
389 
390  // Isolation
391  if (isolator_.enabled()) {
393  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
394  // better to loop backwards, so the vector is resized less times
395  for ( IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(),
396  ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
397  aTau.setIsolation(it->first, it->second);
398  }
399  }
400 
401  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
402  aTau.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[tausRef]);
403  }
404 
405  if (efficiencyLoader_.enabled()) {
406  efficiencyLoader_.setEfficiencies( aTau, tausRef );
407  }
408 
409  if (resolutionLoader_.enabled()) {
411  }
412 
413  if ( useUserData_ ) {
414  userDataHelper_.add( aTau, iEvent, iSetup );
415  }
416 
417  patTaus->push_back(aTau);
418  }
419 
420  // sort taus in pT
421  std::sort(patTaus->begin(), patTaus->end(), pTTauComparator_);
422 
423  // put genEvt object in Event
424  iEvent.put(patTaus);
425 
426  // clean up
428 }
429 
430 template <typename TauCollectionType, typename TauDiscrType>
431 float PATTauProducer::getTauIdDiscriminator(const edm::Handle<TauCollectionType>& tauCollection, size_t tauIdx, const edm::Handle<TauDiscrType>& tauIdDiscr)
432 {
433  edm::Ref<TauCollectionType> tauRef(tauCollection, tauIdx);
434  return (*tauIdDiscr)[tauRef];
435 }
436 
437 // ParameterSet description for module
439 {
441  iDesc.setComment("PAT tau producer module");
442 
443  // input source
444  iDesc.add<edm::InputTag>("tauSource", edm::InputTag())->setComment("input collection");
445 
446  // embedding
447  iDesc.add<bool>("embedIsolationTracks", false)->setComment("embed external isolation tracks");
448  iDesc.add<bool>("embedLeadTrack", false)->setComment("embed external leading track");
449  iDesc.add<bool>("embedLeadTracks", false)->setComment("embed external signal tracks");
450 
451  // MC matching configurables
452  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
453  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
454  std::vector<edm::InputTag> emptySourceVector;
455  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
456  edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
457  )->setComment("input with MC match information");
458 
459  // MC jet matching variables
460  iDesc.add<bool>("addGenJetMatch", true)->setComment("add MC jet matching");
461  iDesc.add<bool>("embedGenJetMatch", false)->setComment("embed MC jet matched jet information");
462  iDesc.add<edm::InputTag>("genJetMatch", edm::InputTag("tauGenJetMatch"));
463 
464 
466 
467  // tau ID configurables
468  iDesc.add<bool>("addTauID", true)->setComment("add tau ID variables");
469  edm::ParameterSetDescription tauIDSourcesPSet;
470  tauIDSourcesPSet.setAllowAnything();
471  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("tauIDSource", edm::InputTag(), true) xor
472  edm::ParameterDescription<edm::ParameterSetDescription>("tauIDSources", tauIDSourcesPSet, true)
473  )->setComment("input with electron ID variables");
474 
475  // IsoDeposit configurables
476  edm::ParameterSetDescription isoDepositsPSet;
477  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
478  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
479  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
480  isoDepositsPSet.addOptional<edm::InputTag>("pfAllParticles");
481  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadron");
482  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadron");
483  isoDepositsPSet.addOptional<edm::InputTag>("pfGamma");
484  isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
485  iDesc.addOptional("isoDeposits", isoDepositsPSet);
486 
487  // Efficiency configurables
488  edm::ParameterSetDescription efficienciesPSet;
489  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
490  iDesc.add("efficiencies", efficienciesPSet);
491  iDesc.add<bool>("addEfficiencies", false);
492 
493  // Check to see if the user wants to add user data
494  edm::ParameterSetDescription userDataPSet;
496  iDesc.addOptional("userData", userDataPSet);
497 
498  edm::ParameterSetDescription isolationPSet;
499  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
500  iDesc.add("userIsolation", isolationPSet);
501 
502 }
503 
505 
507 
508 
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
T getParameter(std::string const &) const
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
int i
Definition: DBlmapReader.cc:9
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
void setIsolation(IsolationKeys key, float value)
Definition: Lepton.h:98
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
tuple pfTaus
Definition: pfTaus_cff.py:139
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
static const HistoName names[]
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
void setAllowAnything()
allow any parameter label/value pairs
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void embedLeadPFChargedHadrCand()
method to store the leading charged hadron candidate internally
Definition: Tau.cc:328
pat::helper::EfficiencyLoader efficiencyLoader_
bool exists(std::string const &parameterName) const
checks if a parameter exists
pat::helper::KinResolutionsLoader resolutionLoader_
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
void embedSignalPFGammaCands()
method to store the signal gamma candidates internally
Definition: Tau.cc:380
float getTauIdDiscriminator(const edm::Handle< TauCollectionType > &, size_t, const edm::Handle< TauDiscrType > &)
void embedIsolationPFCands()
method to store the isolation candidates internally
Definition: Tau.cc:391
void embedIsolationPFGammaCands()
method to store the isolation gamma candidates internally
Definition: Tau.cc:422
void setTauIDs(const std::vector< IdPair > &ids)
Definition: Tau.h:356
IsolationKeys
Enum defining isolation keys.
Definition: Isolation.h:9
void embedSignalTracks()
method to store the signal tracks internally
Definition: Tau.cc:202
bool isAvailable() const
Definition: Ref.h:276
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:7
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:60
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:175
bool embedIsolationPFChargedHadrCands_
void initializeJEC(unsigned int level, const unsigned int set=0)
initialize the jet to a given JEC level during creation starting from Uncorrected ...
Definition: Tau.cc:666
static void fillDescription(edm::ParameterSetDescription &iDesc)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:192
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:50
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
void embedSignalPFChargedHadrCands()
method to store the signal charged hadrons candidates internally
Definition: Tau.cc:360
void setComment(std::string const &value)
int iEvent
Definition: GenABIO.cc:230
void embedSignalPFCands()
method to store the signal candidates internally
Definition: Tau.cc:350
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
edm::EDGetTokenT< PFTauTIPAssociationByRef > tauTransverseImpactParameterToken_
pat::helper::MultiIsolator isolator_
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116
void embedGenParticle()
Definition: PATObject.h:677
edm::EDGetTokenT< edm::View< reco::BaseTau > > baseTauToken_
bool embedIsolationPFNeutralHadrCands_
reco::PFTauTransverseImpactParameter::Vector flightLength_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void embedLeadTrack()
method to store the leading track internally
Definition: Tau.cc:192
edm::EDGetTokenT< reco::CaloTauCollection > caloTauToken_
int j
Definition: DBlmapReader.cc:9
pat::PATUserDataHelper< pat::Tau > userDataHelper_
bool embedSignalPFNeutralHadrCands_
std::vector< pat::tau::TauPFEssential > pfEssential_
Definition: Tau.h:505
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool first
Definition: L1TdeRCT.cc:75
Analysis-level tau class.
Definition: Tau.h:56
void embedIsolationPFNeutralHadrCands()
method to store the isolation neutral hadrons candidates internally
Definition: Tau.cc:412
void embedLeadPFNeutralCand()
method to store the leading neutral candidate internally
Definition: Tau.cc:339
std::vector< edm::EDGetTokenT< reco::CaloTauDiscriminator > > caloTauIDTokens_
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:661
std::vector< edm::EDGetTokenT< edm::ValueMap< TauJetCorrFactors > > > tauJetCorrFactorsTokens_
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
edm::InputTag tauTransverseImpactParameterSrc_
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
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.
void embedSignalPFNeutralHadrCands()
method to store the signal neutral hadrons candidates internally
Definition: Tau.cc:370
edm::EDGetTokenT< edm::Association< reco::GenJetCollection > > genJetMatchToken_
std::string const & label() const
Definition: InputTag.h:42
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void setDecayMode(int)
set decay mode
Definition: Tau.cc:310
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:16
void embedIsolationPFChargedHadrCands()
method to store the isolation charged hadrons candidates internally
Definition: Tau.cc:402
void addJECFactors(const TauJetCorrFactors &jec)
add more sets of energy correction factors
Definition: Tau.h:421
PATTauProducer(const edm::ParameterSet &iConfig)
list key
Definition: combine.py:13
bool isPFTau() const
Returns true if this pat::Tau was made from a reco::PFTau.
Definition: Tau.h:158
void setGenJet(const reco::GenJetRef &ref)
set the matched GenJet
Definition: Tau.cc:213
void embedIsolationTracks()
method to store the isolation tracks internally
Definition: Tau.cc:181
volatile std::atomic< bool > shutdown_flag false
std::vector< std::pair< pat::IsolationKeys, edm::InputTag > > isoDepositLabels_
bool embedSignalPFChargedHadrCands_
void newEvent(const edm::Event &event, const edm::EventSetup &setup) const
To be called for each new event, reads in the EventSetup object.
void embedLeadPFCand()
method to store the leading candidate internally
Definition: Tau.cc:317
std::vector< NameTag > tauIDSrcs_
edm::EDGetTokenT< reco::PFTauCollection > pfTauToken_
void newEvent(const edm::Event &event) const
To be called for each new event, reads in the ValueMaps for efficiencies.
GreaterByPt< Tau > pTTauComparator_
reco::PFTauTransverseImpactParameter::Point dxy_PCA_
Produces pat::Tau&#39;s.
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:82