67 #ifndef IClassifierReader__def 68 #define IClassifierReader__def 70 class IClassifierReader {
75 IClassifierReader() : fStatusIsClean(
true ) {}
76 virtual ~IClassifierReader() {}
79 virtual double GetMvaValue(
const std::vector<double>& inputValues )
const = 0;
82 bool IsStatusClean()
const {
return fStatusIsClean; }
91 class ReadCutsD :
public IClassifierReader {
96 ReadCutsD( std::vector<std::string>& theInputVars )
97 : IClassifierReader(),
98 fClassName(
"ReadCutsD" ),
100 fIsNormalised(
false )
103 const char* inputVars[] = {
"var1+var2",
"var1-var2",
"var3",
"var4" };
106 if (theInputVars.size() <= 0) {
107 std::cout <<
"Problem in class \"" << fClassName <<
"\": empty input vector" << std::endl;
108 fStatusIsClean =
false;
111 if (theInputVars.size() != fNvars) {
112 std::cout <<
"Problem in class \"" << fClassName <<
"\": mismatch in number of input values: " 113 << theInputVars.size() <<
" != " << fNvars << std::endl;
114 fStatusIsClean =
false;
118 for (
size_t ivar = 0; ivar < theInputVars.size(); ivar++) {
119 if (theInputVars[ivar] != inputVars[ivar]) {
120 std::cout <<
"Problem in class \"" << fClassName <<
"\": mismatch in input variable names" << std::endl
121 <<
" for variable [" << ivar <<
"]: " << theInputVars[ivar].c_str() <<
" != " << inputVars[ivar] << std::endl;
122 fStatusIsClean =
false;
127 fVmin[0] = -4.33193111419678;
128 fVmax[0] = 4.13924121856689;
129 fVmin[1] = -3.67709016799927;
130 fVmax[1] = 3.65852665901184;
131 fVmin[2] = -3.82367396354675;
132 fVmax[2] = 3.87669587135315;
133 fVmin[3] = -4.0755443572998;
134 fVmax[3] = 3.28273677825928;
150 virtual ~ReadCutsD() {
157 double GetMvaValue(
const std::vector<double>& inputValues )
const;
166 double fDecTF_1[3][4][4];
167 void InitTransform_1();
168 void Transform_1( std::vector<double> & iv,
int sigOrBgd )
const;
169 void InitTransform();
170 void Transform( std::vector<double> & iv,
int sigOrBgd )
const;
173 const char* fClassName;
176 size_t GetNvar()
const {
return fNvars; }
180 const bool fIsNormalised;
181 bool IsNormalised()
const {
return fIsNormalised; }
184 double NormVariable(
double x,
double xmin,
double xmax )
const {
186 return 2*(x -
xmin)/(xmax - xmin) - 1.0;
194 double GetMvaValue__(
const std::vector<double>& inputValues )
const;
199 inline double ReadCutsD::GetMvaValue(
const std::vector<double>& inputValues )
const 205 if (!IsStatusClean()) {
206 std::cout <<
"Problem in class \"" << fClassName <<
"\": cannot return classifier response" 207 <<
" because status is dirty" << std::endl;
211 if (IsNormalised()) {
213 std::vector<double> iV;
214 iV.reserve(inputValues.size());
216 for (std::vector<double>::const_iterator varIt = inputValues.begin();
217 varIt != inputValues.end(); varIt++, ivar++) {
218 iV.push_back(NormVariable( *varIt, fVmin[ivar], fVmax[ivar] ));
221 retval = GetMvaValue__( iV );
224 std::vector<double> iV;
226 for (std::vector<double>::const_iterator varIt = inputValues.begin();
227 varIt != inputValues.end(); varIt++, ivar++) {
228 iV.push_back(*varIt);
231 retval = GetMvaValue__( iV );
239 inline void ReadCutsD::InitTransform_1()
242 fDecTF_1[0][0][0] = 1.25719213024;
243 fDecTF_1[0][0][1] = 0.0741312801175;
244 fDecTF_1[0][0][2] = -0.129488374563;
245 fDecTF_1[0][0][3] = -1.12729166617;
246 fDecTF_1[0][1][0] = 0.0741312801175;
247 fDecTF_1[0][1][1] = 0.919041474312;
248 fDecTF_1[0][1][2] = 0.150275932861;
249 fDecTF_1[0][1][3] = -0.216647404573;
250 fDecTF_1[0][2][0] = -0.129488374563;
251 fDecTF_1[0][2][1] = 0.150275932861;
252 fDecTF_1[0][2][2] = 1.84972631436;
253 fDecTF_1[0][2][3] = -0.934543246776;
254 fDecTF_1[0][3][0] = -1.12729166617;
255 fDecTF_1[0][3][1] = -0.216647404573;
256 fDecTF_1[0][3][2] = -0.934543246776;
257 fDecTF_1[0][3][3] = 2.99752758195;
258 fDecTF_1[1][0][0] = 1.24281513542;
259 fDecTF_1[1][0][1] = 0.0648152051086;
260 fDecTF_1[1][0][2] = -0.150088956275;
261 fDecTF_1[1][0][3] = -1.09110802363;
262 fDecTF_1[1][1][0] = 0.0648152051086;
263 fDecTF_1[1][1][1] = 0.934140800916;
264 fDecTF_1[1][1][2] = 0.108344126828;
265 fDecTF_1[1][1][3] = -0.218357923054;
266 fDecTF_1[1][2][0] = -0.150088956275;
267 fDecTF_1[1][2][1] = 0.108344126828;
268 fDecTF_1[1][2][2] = 1.79915918204;
269 fDecTF_1[1][2][3] = -0.882003781889;
270 fDecTF_1[1][3][0] = -1.09110802363;
271 fDecTF_1[1][3][1] = -0.218357923054;
272 fDecTF_1[1][3][2] = -0.882003781889;
273 fDecTF_1[1][3][3] = 2.88426088942;
274 fDecTF_1[2][0][0] = 1.11526262065;
275 fDecTF_1[2][0][1] = 0.0356099235628;
276 fDecTF_1[2][0][2] = -0.199971755483;
277 fDecTF_1[2][0][3] = -0.796872057176;
278 fDecTF_1[2][1][0] = 0.0356099235628;
279 fDecTF_1[2][1][1] = 0.916090161623;
280 fDecTF_1[2][1][2] = 0.116419550846;
281 fDecTF_1[2][1][3] = -0.131134389786;
282 fDecTF_1[2][2][0] = -0.199971755483;
283 fDecTF_1[2][2][1] = 0.116419550846;
284 fDecTF_1[2][2][2] = 1.7870036012;
285 fDecTF_1[2][2][3] = -0.785928558579;
286 fDecTF_1[2][3][0] = -0.796872057176;
287 fDecTF_1[2][3][1] = -0.131134389786;
288 fDecTF_1[2][3][2] = -0.785928558579;
289 fDecTF_1[2][3][3] = 2.15508430057;
293 inline void ReadCutsD::Transform_1( std::vector<double>& iv,
int cls)
const 296 if (cls < 0 || cls > 2) {
302 static std::vector<int> indicesGet;
303 static std::vector<int> indicesPut;
305 if ( indicesGet.empty() ) {
306 indicesGet.reserve(fNvars);
307 indicesGet.push_back( 0);
308 indicesGet.push_back( 1);
309 indicesGet.push_back( 2);
310 indicesGet.push_back( 3);
312 if ( indicesPut.empty() ) {
313 indicesPut.reserve(fNvars);
314 indicesPut.push_back( 0);
315 indicesPut.push_back( 1);
316 indicesPut.push_back( 2);
317 indicesPut.push_back( 3);
320 std::vector<double> tv;
321 for (
int i=0; i<4;i++) {
323 for (
int j=0; j<4; j++)
324 v += iv[indicesGet.at(j)] * fDecTF_1[cls][i][j];
327 for (
int i=0; i<4;i++) iv[indicesPut.at(i)] = tv[i];
331 inline void ReadCutsD::InitTransform()
337 inline void ReadCutsD::Transform( std::vector<double>& iv,
int sigOrBgd )
const 339 Transform_1( iv, sigOrBgd );
Type GetType(const std::string &Name)
void Initialize(Bool_t useTMVAStyle=kTRUE)