CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MVAComputer.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_MVAComputer_MVAComputer_h
2 #define PhysicsTools_MVAComputer_MVAComputer_h
3 // -*- C++ -*-
4 //
5 // Package: MVAComputer
6 // Class : MVAComputer
7 //
8 
9 //
10 // Author: Christophe Saout <christophe.saout@cern.ch>
11 // Created: Sat Apr 24 15:18 CEST 2007
12 //
13 
14 #include <iostream>
15 #include <vector>
16 #include <memory>
17 
22 
23 namespace PhysicsTools {
24 
39 class MVAComputer {
40  public:
43 
45  MVAComputer(Calibration::MVAComputer *calib, bool owned = false);
46 
47  ~MVAComputer();
48 
50  template<typename Iterator_t>
51  double eval(Iterator_t first, Iterator_t last) const;
52 
53  template<typename Iterator_t>
54  double deriv(Iterator_t first, Iterator_t last) const;
55 
57  template<typename Container_t>
58  inline double eval(const Container_t &values) const
59  {
60  typedef typename Container_t::const_iterator Iterator_t;
61  return this->template eval<Iterator_t>(
62  values.begin(), values.end());
63  }
64 
65  template<typename Container_t>
66  inline double deriv(Container_t &values) const
67  {
68  typedef typename Container_t::iterator Iterator_t;
69  return this->template deriv<Iterator_t>(
70  values.begin(), values.end());
71  }
72 
73  /* various methods for standalone use of calibration files */
74 
77 
79  static Calibration::MVAComputer *readCalibration(std::istream &is);
80 
82  static void writeCalibration(const char *filename,
83  const Calibration::MVAComputer *calib);
84 
86  static void writeCalibration(std::ostream &os,
87  const Calibration::MVAComputer *calib);
88 
90  MVAComputer(const char *filename);
91 
93  MVAComputer(std::istream &is);
94 
98  struct InputVar {
101 
103  unsigned int index;
104 
106  unsigned int multiplicity;
107 
108  bool operator < (AtomicId id) const
109  { return var.getName() < id; }
110 
111  bool operator < (const InputVar &other) const
112  { return var.getName() < other.var.getName(); }
113  };
114 
118  struct Processor {
119  inline Processor(VarProcessor *processor,
120  unsigned int nOutput) :
121  processor(processor), nOutput(nOutput) {}
122 
123  inline Processor(const Processor &orig)
124  { processor = orig.processor; nOutput = orig.nOutput; }
125 
126  inline Processor &operator = (const Processor &orig)
127  { processor = orig.processor; nOutput = orig.nOutput; return *this; }
128 
130  mutable std::auto_ptr<VarProcessor> processor;
131 
133  unsigned int nOutput;
134  };
135 
136  struct EvalContext {
137  EvalContext(double *values, int *conf, unsigned int n) :
138  values_(values), conf_(conf), n_(n) {}
139 
140  inline void eval(const VarProcessor *proc, int *outConf,
141  double *output, int *loop,
143  unsigned int offset, unsigned int out) const
144  { proc->eval(values_, conf_, output, outConf, loop, ctx, offset); }
145 
146  inline double output(unsigned int output) const
147  { return values_[conf_[output]]; }
148 
149  inline double *values() const { return values_; }
150  inline int *conf() const { return conf_; }
151  inline unsigned int n() const { return n_; }
152 
153  double *values_;
154  int *conf_;
155  unsigned int n_;
156  };
157 
158  struct DerivContext {
159  DerivContext() : n_(0) {}
160 
161  void eval(const VarProcessor *proc, int *outConf,
162  double *output, int *loop,
164  unsigned int offset, unsigned int out) const;
165 
166  double output(unsigned int output,
167  std::vector<double> &derivs) const;
168 
169  inline double *values() const { return &values_.front(); }
170  inline int *conf() const { return &conf_.front(); }
171  inline unsigned int n() const { return n_; }
172 
173  mutable std::vector<double> values_;
174  mutable std::vector<double> deriv_;
175  mutable std::vector<int> conf_;
176  unsigned int n_;
177  };
178 
179  private:
181  void setup(const Calibration::MVAComputer *calib);
182 
184  int getVariableId(AtomicId name) const;
185 
187  template<class T> void evalInternal(T &ctx) const;
188 
190  std::vector<InputVar> inputVariables;
191 
193  std::vector<Processor> varProcessors;
194 
196  unsigned int nVars;
197 
199  unsigned int output;
200 
202  std::auto_ptr<Calibration::MVAComputer> owned;
203 };
204 
205 } // namespace PhysicsTools
206 
207 #include "PhysicsTools/MVAComputer/interface/MVAComputer.icc"
208 
209 #endif // PhysicsTools_MVAComputer_MVAComputer_h
double eval(Iterator_t first, Iterator_t last) const
evaluate variables given by a range of iterators given by first and last
input variable configuration object
Definition: MVAComputer.h:98
TrainProcessor *const proc
Definition: MVATrainer.cc:101
unsigned int nOutput
number of output variables
Definition: MVAComputer.h:133
void eval(const VarProcessor *proc, int *outConf, double *output, int *loop, VarProcessor::LoopCtx &ctx, unsigned int offset, unsigned int out) const
Definition: MVAComputer.h:140
EvalContext(double *values, int *conf, unsigned int n)
Definition: MVAComputer.h:137
unsigned int multiplicity
number of times each appearance of that variable can appear while computing the discriminator ...
Definition: MVAComputer.h:106
Class describing an input variable.
Definition: Variable.h:33
int loop
CMSSW
std::vector< InputVar > inputVariables
vector of input variables
Definition: MVAComputer.h:190
std::auto_ptr< Calibration::MVAComputer > owned
in case calibration object is owned by the MVAComputer
Definition: MVAComputer.h:202
static Calibration::MVAComputer * readCalibration(const char *filename)
read calibration object from plain file
Definition: MVAComputer.cc:232
Cheap generic unique keyword identifier class.
Definition: AtomicId.h:31
unsigned int nVars
total number of variables to expect while computing discriminator
Definition: MVAComputer.h:196
unsigned int output
index of the variable in the &quot;conf&quot; array to return as result
Definition: MVAComputer.h:199
int getVariableId(AtomicId name) const
map variable identifier name to the numerical position in the array
Definition: MVAComputer.cc:146
MVATrainerComputer * calib
Definition: MVATrainer.cc:64
bool operator<(const FedChannelConnection &, const FedChannelConnection &)
Main interface class to the generic discriminator computer framework.
Definition: MVAComputer.h:39
const AtomicId getName() const
Definition: Variable.h:143
static void writeCalibration(const char *filename, const Calibration::MVAComputer *calib)
write calibration object to file
Definition: MVAComputer.cc:276
double deriv(Iterator_t first, Iterator_t last) const
double output(unsigned int output) const
Definition: MVAComputer.h:146
double eval(const Container_t &values) const
evaluate variables in iterable container values
Definition: MVAComputer.h:58
tuple conf
Definition: dbtoconf.py:185
variable processor container
Definition: MVAComputer.h:118
tuple out
Definition: dbtoconf.py:99
MVAComputer(const Calibration::MVAComputer *calib)
construct a discriminator computer from a const calibation object
Definition: MVAComputer.cc:37
std::vector< Processor > varProcessors
vector of variable processors
Definition: MVAComputer.h:193
Processor(VarProcessor *processor, unsigned int nOutput)
Definition: MVAComputer.h:119
void evalInternal(T &ctx) const
evaluate discriminator from flattened variable array
Definition: MVAComputer.cc:158
tuple filename
Definition: lut2db_cfg.py:20
Hold context information for looping processors.
Definition: VarProcessor.h:98
unsigned int index
variable index in fixed-position evaluation array
Definition: MVAComputer.h:103
Variable var
generic variable information (name, ...)
Definition: MVAComputer.h:100
std::auto_ptr< VarProcessor > processor
owned variable processor instance
Definition: MVAComputer.h:130
long double T
Processor(const Processor &orig)
Definition: MVAComputer.h:123
double deriv(Container_t &values) const
Definition: MVAComputer.h:66
Common base class for variable processors.
Definition: VarProcessor.h:36
void setup(const Calibration::MVAComputer *calib)
construct processors from calibration and setup variables
Definition: MVAComputer.cc:63
void eval(double *input, int *conf, double *output, int *outConf, int *loop, LoopCtx &loopCtx, unsigned int offset) const
run the processor evaluation pass on this processor
Definition: VarProcessor.h:117