CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RecoTauDiscriminantFromDiscriminator.cc
Go to the documentation of this file.
1 /*
2  * RecoTauDiscriminantFromDiscriminator
3  *
4  * Makes a discriminator function from a PFRecoTauDiscriminator stored in the
5  * event.
6  *
7  * Author: Evan K. Friis (UC Davis)
8  *
9  */
10 
11 #include <boost/foreach.hpp>
12 #include <sstream>
16 
17 namespace reco { namespace tau {
18 
20  public:
22  const edm::ParameterSet& pset);
23  void beginEvent();
24  std::vector<double> operator()(const reco::PFTauRef& tau) const;
25  private:
26  typedef std::pair<edm::InputTag, edm::Handle<reco::PFTauDiscriminator> > DiscInfo;
27  std::vector<DiscInfo> discriminators_;
28 };
29 
32  if (pset.existsAs<edm::InputTag>("discSrc")) {
33  discriminators_.push_back(std::make_pair(
34  pset.getParameter<edm::InputTag>("discSrc"),
36  } else {
37  // Get multiple discriminators. This supports the case when the MVAHelper
38  // class might be dealing with multiple tau collections (training)
39  std::vector<edm::InputTag> discriminators =
40  pset.getParameter<std::vector<edm::InputTag> >("discSrc");
41  BOOST_FOREACH(const edm::InputTag& tag, discriminators) {
42  discriminators_.push_back(std::make_pair(
44  }
45  }
46 }
47 
48 // Called by base class at the beginning of every event
50  BOOST_FOREACH(DiscInfo& discInfo, discriminators_) {
51  evt()->getByLabel(discInfo.first, discInfo.second);
52  }
53 }
54 
56  const reco::PFTauRef& tau) const {
57  edm::ProductID tauProdId = tau.id();
58  for (size_t i = 0; i < discriminators_.size(); ++i) {
59  // Check if the discriminator actually exists
60  if (!discriminators_[i].second.isValid())
61  continue;
62  const reco::PFTauDiscriminator& disc = *(discriminators_[i].second);
63  if (tauProdId == disc.keyProduct().id())
64  return std::vector<double>(1, (disc)[tau]);
65  }
66  // Can only reach this point if not appropriate discriminator is defined for
67  // the passed tau.
68  std::stringstream error;
69  error << "Couldn't find a PFTauDiscriminator usable with given tau."
70  << std::endl << " Input tau has product id: " << tau.id() << std::endl;
71  for (size_t i = 0; i < discriminators_.size(); ++i ) {
72  error << "disc: " << discriminators_[i].first;
73  error << " isValid: " << discriminators_[i].second.isValid();
74  if (discriminators_[i].second.isValid()) {
75  error << " product: " << discriminators_[i].second->keyProduct().id();
76  }
77  error << std::endl;
78  }
79  edm::LogError("BadDiscriminatorConfiguration") << error.str();
80  return std::vector<double>(1,-999);
81 }
82 
83 }} // end namespace reco::tau
84 
88  "RecoTauDiscriminantFromDiscriminator");
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:181
std::vector< double > operator()(const reco::PFTauRef &tau) const
U second(std::pair< T, U > const &p)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:355
KeyRefProd const & keyProduct() const
std::pair< edm::InputTag, edm::Handle< reco::PFTauDiscriminator > > DiscInfo
#define DEFINE_EDM_PLUGIN(factory, type, name)
ProductID id() const
Accessor for product ID.
Definition: Ref.h:255