CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MVAComputer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: PhysicsToolsObjects
4 // Class : MVAComputer
5 //
6 
7 // Implementation:
8 // getProcessor() and addProcessor() methods to add processors to
9 // the discriminator computer calibration object. POOL doesn't support
10 // polymorph pointers, so this is implemented using multiple containers
11 // for each possible sub-class and an index array from which the
12 // array of pointers can be reconstructed.
13 //
14 // Author: Christophe Saout
15 // Created: Sat Apr 24 15:18 CEST 2007
16 //
17 #include <functional>
18 #include <algorithm>
19 #include <typeinfo>
20 #include <iostream>
21 #include <cstring>
22 #include <cstddef>
23 
24 #include <atomic>
25 
28 
30 
31 namespace PhysicsTools {
32 namespace Calibration {
33 
35 {
36  static const char prefix[] = "PhysicsTools::Calibration::";
37  edm::TypeID typeID(typeid(*this));
38  std::string type(typeID.className());
39  if (type.size() <= sizeof prefix - 1 ||
40  type.substr(0, sizeof prefix - 1) != prefix)
41  throw cms::Exception("MVAComputerCalibration")
42  << "getInstanceName failed for "
43  << typeid(*this).name() << "." << std::endl;
44 
45  return type.substr(sizeof prefix - 1);
46 }
47 
48 std::unique_ptr<VarProcessor>
50  return(std::unique_ptr<VarProcessor>(new VarProcessor(*this)));
51 }
52 
53 std::unique_ptr<VarProcessor>
55  return(std::unique_ptr<VarProcessor>(new ProcOptional(*this)));
56 }
57 
58 std::unique_ptr<VarProcessor>
60  return(std::unique_ptr<VarProcessor>(new ProcCount(*this)));
61 }
62 
63 std::unique_ptr<VarProcessor>
65  return(std::unique_ptr<VarProcessor>(new ProcClassed(*this)));
66 }
67 
68 std::unique_ptr<VarProcessor>
70  return(std::unique_ptr<VarProcessor>(new ProcSplitter(*this)));
71 }
72 
73 std::unique_ptr<VarProcessor>
75  return(std::unique_ptr<VarProcessor>(new ProcForeach(*this)));
76 }
77 
78 std::unique_ptr<VarProcessor>
79 ProcSort::clone() const {
80  return(std::unique_ptr<VarProcessor>(new ProcSort(*this)));
81 }
82 
83 std::unique_ptr<VarProcessor>
85  return(std::unique_ptr<VarProcessor>(new ProcCategory(*this)));
86 }
87 
88 std::unique_ptr<VarProcessor>
90  return(std::unique_ptr<VarProcessor>(new ProcNormalize(*this)));
91 }
92 
93 std::unique_ptr<VarProcessor>
95  return(std::unique_ptr<VarProcessor>(new ProcLikelihood(*this)));
96 }
97 
98 std::unique_ptr<VarProcessor>
100  return(std::unique_ptr<VarProcessor>(new ProcLinear(*this)));
101 }
102 
103 std::unique_ptr<VarProcessor>
105  return(std::unique_ptr<VarProcessor>(new ProcMultiply(*this)));
106 }
107 
108 std::unique_ptr<VarProcessor>
110  return(std::unique_ptr<VarProcessor>(new ProcMatrix(*this)));
111 }
112 
113 std::unique_ptr<VarProcessor>
115  return(std::unique_ptr<VarProcessor>(new ProcExternal(*this)));
116 }
117 
118 std::unique_ptr<VarProcessor>
119 ProcMLP::clone() const {
120  return(std::unique_ptr<VarProcessor>(new ProcMLP(*this)));
121 }
122 
124 {
125  return method;
126 }
127 
129 {
130  static std::atomic<MVAComputer::CacheId> nextCacheId{0};
131 
132  return ++nextCacheId;
133 }
134 
136  cacheId(getNextMVAComputerCacheId())
137 {
138 }
139 
141  inputSet(orig.inputSet),
142  output(orig.output),
143  cacheId(orig.cacheId)
144 {
145  for(std::vector<VarProcessor*>::const_iterator iter =
146  orig.processors.begin();
147  iter != orig.processors.end(); ++iter)
148  addProcessor(*iter);
149 }
150 
152 {
153  for(std::vector<VarProcessor*>::iterator iter = processors.begin();
154  iter != processors.end(); ++iter)
155  delete *iter;
156  processors.clear();
157 }
158 
160 {
161  inputSet = orig.inputSet;
162  output = orig.output;
163  cacheId = orig.cacheId;
164 
165  for(std::vector<VarProcessor*>::iterator iter = processors.begin();
166  iter != processors.end(); ++iter)
167  delete *iter;
168  processors.clear();
169 
170  for(std::vector<VarProcessor*>::const_iterator iter =
171  orig.processors.begin();
172  iter != orig.processors.end(); ++iter)
173  addProcessor(*iter);
174 
175  return *this;
176 }
177 
178 std::vector<VarProcessor*> MVAComputer::getProcessors() const
179 {
180  return processors;
181 }
182 
184 {
186  processors.push_back(proc->clone().release());
187 }
188 
190 {
191  static MVAComputerContainer::CacheId nextCacheId = 0;
192  return ++nextCacheId;
193 }
194 
197 {
198 }
199 
201 {
203 
204  entries.push_back(std::make_pair(label, MVAComputer()));
205  return entries.back().second;
206 }
207 
208 namespace {
209  struct Comparator :
210  public std::unary_function<const std::string&, bool> {
211 
212  inline Comparator(const std::string &label) : label(label) {}
213 
214  inline bool
215  operator () (const MVAComputerContainer::Entry &entry) const
216  { return entry.first == label; }
217 
219  };
220 }
221 
223 {
224  std::vector<Entry>::const_iterator pos =
225  std::find_if(entries.begin(), entries.end(),
226  Comparator(label));
227 
228  if (pos == entries.end())
229  throw cms::Exception("MVAComputerCalibration")
230  << "Calibration record " << label
231  << " not found in MVAComputerContainer." << std::endl;
232 
233  return pos->second;
234 }
235 
237 {
238  std::vector<Entry>::const_iterator pos =
239  std::find_if(entries.begin(), entries.end(),
240  Comparator(label));
241  if (pos == entries.end()) return false;
242  return true;
243 }
244 
245 } // namespace Calibration
246 } // namespace PhysicsTools
type
Definition: HCALResponse.h:21
virtual const MVAComputer & find(const std::string &label) const
Definition: MVAComputer.cc:222
virtual std::vector< VarProcessor * > getProcessors() const
Definition: MVAComputer.cc:178
virtual std::string getInstanceName() const
Definition: MVAComputer.cc:34
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:49
TrainProcessor *const proc
Definition: MVATrainer.cc:101
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:99
MVAComputer & operator=(const MVAComputer &orig)
Definition: MVAComputer.cc:159
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:114
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:84
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:79
std::vector< VarProcessor * > processors
Definition: MVAComputer.h:238
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:74
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:94
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:64
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:104
std::pair< std::string, MVAComputer > Entry
Definition: MVAComputer.h:249
virtual std::string getInstanceName() const
Definition: MVAComputer.cc:123
void addProcessor(const VarProcessor *proc)
Definition: MVAComputer.cc:183
static MVAComputer::CacheId getNextMVAComputerCacheId()
Definition: MVAComputer.cc:128
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:54
static MVAComputerContainer::CacheId getNextMVAComputerContainerCacheId()
Definition: MVAComputer.cc:189
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:59
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:89
virtual bool contains(const std::string &label) const
Definition: MVAComputer.cc:236
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:69
std::vector< Variable > inputSet
Definition: MVAComputer.h:234
MVAComputer & add(const std::string &label)
Definition: MVAComputer.cc:200
std::string const & className() const
Definition: TypeID.cc:46
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:119
virtual std::unique_ptr< VarProcessor > clone() const
Definition: MVAComputer.cc:109