CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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  std::auto_ptr<TauDiscriminator> output(new 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 
143  double result = prediscriminantFailValue_;
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(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 
163 // compile our desired types and make available to linker
T getParameter(std::string const &) const
edm::RefProd< TauCollection > TauRefProd
Definition: Tau.h:42
ProductID id() const
Definition: HandleBase.cc:15
std::string getProducerString< CaloTau >()
std::vector< TauDiscInfo > prediscriminants_
void produce(edm::Event &, const edm::EventSetup &)
tuple result
Definition: mps_fire.py:84
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
edm::EDGetTokenT< TauCollection > Tau_token
std::string getProducerString< PFTau >()
ProductIndex id() const
Definition: ProductID.h:38
moduleLabel_(iConfig.getParameter< string >("@module_label"))