CMS 3D CMS Logo

TauDiscriminationProducerBase.cc
Go to the documentation of this file.
2 
3 #include <string>
4 
5 using namespace reco;
6 
7 // default constructor; must not be called
8 template<class TauType, class TauDiscriminator>
10 {
11  throw cms::Exception("TauDiscriminationProducerBase") << " -- default ctor called; derived classes must call " <<
12  "TauDiscriminationProducerBase(const ParameterSet&)";
13 }
14 
15 //--- standard constructor from PSet
16 template<class TauType, class TauDiscriminator>
18  : moduleLabel_(iConfig.getParameter<std::string>("@module_label"))
19 {
20  // tau collection to discriminate
21  TauProducer_ = iConfig.getParameter<edm::InputTag>(getProducerString<TauType>());
22  Tau_token= consumes<TauCollection>(TauProducer_);
23 
24  // prediscriminant operator
25  // require the tau to pass the following prediscriminants
26  const edm::ParameterSet& prediscriminantConfig = iConfig.getParameter<edm::ParameterSet>("Prediscriminants");
27 
28  // determine boolean operator used on the prediscriminants
29  std::string pdBoolOperator = prediscriminantConfig.getParameter<std::string>("BooleanOperator");
30  // convert string to lowercase
31  transform(pdBoolOperator.begin(), pdBoolOperator.end(), pdBoolOperator.begin(), ::tolower);
32 
33  if( pdBoolOperator == "and" )
34  {
35  andPrediscriminants_ = 0x1; //use chars instead of bools so we can do a bitwise trick later
36  }
37  else if ( pdBoolOperator == "or" )
38  {
40  }
41  else
42  {
43  throw cms::Exception("TauDiscriminationProducerBase") << "PrediscriminantBooleanOperator defined incorrectly, options are: AND,OR";
44  }
45 
46  // get the list of prediscriminants
47  std::vector<std::string> prediscriminantsNames = prediscriminantConfig.getParameterNamesForType<edm::ParameterSet>();
48 
49  for( std::vector<std::string>::const_iterator iDisc = prediscriminantsNames.begin();
50  iDisc != prediscriminantsNames.end(); ++iDisc )
51  {
52  const edm::ParameterSet& iPredisc = prediscriminantConfig.getParameter<edm::ParameterSet>(*iDisc);
53  const edm::InputTag& label = iPredisc.getParameter<edm::InputTag>("Producer");
54  double cut = iPredisc.getParameter<double>("cut");
55 
56  TauDiscInfo thisDiscriminator;
57  thisDiscriminator.label = label;
58  thisDiscriminator.cut = cut;
59  thisDiscriminator.disc_token = consumes<TauDiscriminator>(label);
60  prediscriminants_.push_back(thisDiscriminator);
61  }
62 
64 
65  // register product
66  produces<TauDiscriminator>();
67 }
68 
69 template<class TauType, class TauDiscriminator>
71 {
72  tauIndex_=0;
73  // setup function - does nothing in base, but can be overridden to retrieve PV or other stuff
74  beginEvent(event, eventSetup);
75 
76  // retrieve the tau collection to discriminate
78  event.getByToken(Tau_token, taus);
79 
80  edm::ProductID tauProductID = taus.id();
81 
82  // output product
83  auto output = std::make_unique<TauDiscriminator>(TauRefProd(taus));
84 
85  size_t nTaus = taus->size();
86 
87  // load prediscriminators
88  size_t nPrediscriminants = prediscriminants_.size();
89  for( size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc )
90  {
91  prediscriminants_[iDisc].fill(event);
92 
93  // Check to make sure the product is correct for the discriminator.
94  // If not, throw a more informative exception.
95  edm::ProductID discKeyId =
96  prediscriminants_[iDisc].handle->keyProduct().id();
97  if (tauProductID != discKeyId) {
98  throw cms::Exception("MisconfiguredPrediscriminant")
99  << "The tau collection with input tag " << TauProducer_
100  << " has product ID: " << tauProductID
101  << " but the pre-discriminator with input tag "
102  << prediscriminants_[iDisc].label
103  << " is keyed with product ID: " << discKeyId << std::endl;
104  }
105  }
106 
107  // loop over taus
108  for( size_t iTau = 0; iTau < nTaus; ++iTau )
109  {
110  // get reference to tau
111  TauRef tauRef(taus, iTau);
112 
113  bool passesPrediscriminants = ( andPrediscriminants_ ? 1 : 0 );
114  // check tau passes prediscriminants
115  for( size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc )
116  {
117  // current discriminant result for this tau
118  double discResult = (*prediscriminants_[iDisc].handle)[tauRef];
119  uint8_t thisPasses = ( discResult > prediscriminants_[iDisc].cut ) ? 1 : 0;
120 
121  // if we are using the AND option, as soon as one fails,
122  // the result is FAIL and we can quit looping.
123  // if we are using the OR option as soon as one passes,
124  // the result is pass and we can quit looping
125 
126  // truth table
127  // | result (thisPasses)
128  // | F | T
129  //-----------------------------------
130  // AND(T) | res=fails | continue
131  // | break |
132  //-----------------------------------
133  // OR (F) | continue | res=passes
134  // | | break
135 
136  if( thisPasses ^ andPrediscriminants_ ) //XOR
137  {
138  passesPrediscriminants = ( andPrediscriminants_ ? 0 : 1 ); //NOR
139  break;
140  }
141  }
142 
144  if( passesPrediscriminants )
145  {
146  // this tau passes the prereqs, call our implemented discrimination function
147  result = discriminate(tauRef); ++tauIndex_;
148  }
149 
150  // store the result of this tau into our new discriminator
151  output->setValue(iTau, result);
152  }
153  event.put(std::move(output));
154 
155  // function to put additional information into the event - does nothing in base, but can be overridden in derived classes
156  endEvent(event);
157 }
158 
159 // template specialiazation to get the correct (Calo/PF)TauProducer names
160 template<> std::string getProducerString<PFTau>() { return "PFTauProducer"; }
161 template<> std::string getProducerString<CaloTau>() { return "CaloTauProducer"; }
162 template<> std::string getProducerString<pat::Tau>() { return "PATTauProducer"; }
163 
164 // compile our desired types and make available to linker
T getParameter(std::string const &) const
edm::RefProd< TauCollection > TauRefProd
ProductID id() const
Definition: HandleBase.cc:15
std::string getProducerString< CaloTau >()
std::vector< TauDiscInfo > prediscriminants_
void produce(edm::Event &, const edm::EventSetup &)
virtual void endEvent(edm::Event &evt)
edm::EDGetTokenT< TauCollection > Tau_token
virtual double discriminate(const TauRef &tau) const =0
fixed size matrix
std::string getProducerString< PFTau >()
virtual void beginEvent(const edm::Event &evt, const edm::EventSetup &evtSetup)
def move(src, dest)
Definition: eostools.py:510
Definition: event.py:1