1 |
/**********************************************************************************
|
2 |
* Project : TMVA - a Root-integrated toolkit for multivariate data analysis *
|
3 |
* Package : TMVA *
|
4 |
* Exectuable: ClassApplication *
|
5 |
* *
|
6 |
* Test suit for comparison of Reader and standalone class outputs *
|
7 |
**********************************************************************************/
|
8 |
|
9 |
#include <vector>
|
10 |
|
11 |
void ClassApplication( TString myMethodList = "Fisher" )
|
12 |
{
|
13 |
cout << endl;
|
14 |
cout << "==> start ClassApplication" << endl;
|
15 |
const int Nmvas = 16;
|
16 |
|
17 |
const char* bulkname[Nmvas] = { "MLP","MLPBFGS","Fisher","FisherG","Likelihood","LikelihoodD","LikelihoodPCA","LD","HMatrix","FDA_MT","FDA_MC","FDA_GA","BDT","BDTD","BDTG","BDTB"};
|
18 |
|
19 |
bool iuse[Nmvas] = { Nmvas*kFALSE };
|
20 |
|
21 |
// interpret input list
|
22 |
if (myMethodList != "") {
|
23 |
TList* mlist = TMVA::gTools().ParseFormatLine( myMethodList, " :," );
|
24 |
for (int imva=0; imva<Nmvas; imva++) if (mlist->FindObject( bulkname[imva] )) iuse[imva] = kTRUE;
|
25 |
delete mlist;
|
26 |
}
|
27 |
|
28 |
// create a set of variables and declare them to the reader
|
29 |
// - the variable names must corresponds in name and type to
|
30 |
// those given in the weight file(s) that you use
|
31 |
std::vector<std::string> inputVars;
|
32 |
inputVars.push_back( "var1+var2" );
|
33 |
inputVars.push_back( "var1-var2" );
|
34 |
inputVars.push_back( "var3" );
|
35 |
inputVars.push_back( "var4" );
|
36 |
|
37 |
// preload standalone class(es)
|
38 |
string dir = "weights/";
|
39 |
string prefix = "TMVAClassification";
|
40 |
|
41 |
for (int imva=0; imva<Nmvas; imva++) {
|
42 |
if (iuse[imva]) {
|
43 |
TString cfile = dir + prefix + "_" + bulkname[imva] + ".class.C++";
|
44 |
|
45 |
cout << "=== Macro : Loading class file: " << cfile << endl;
|
46 |
|
47 |
// load the classifier's standalone class
|
48 |
gROOT->LoadMacro( cfile );
|
49 |
}
|
50 |
}
|
51 |
cout << "=== Macro : Classifier class loading successfully terminated" << endl;
|
52 |
|
53 |
// define classes
|
54 |
IClassifierReader* classReader[Nmvas] = { Nmvas*0 };
|
55 |
|
56 |
// ... and create them (and some histograms for the output)
|
57 |
int nbin = 100;
|
58 |
TH1* hist[Nmvas];
|
59 |
|
60 |
for (int imva=0; imva<Nmvas; imva++) {
|
61 |
if (iuse[imva]) {
|
62 |
cout << "=== Macro : Testing " << bulkname[imva] << endl;
|
63 |
if (bulkname[imva] == "Likelihood" ) {
|
64 |
classReader[imva] = new ReadLikelihood ( inputVars );
|
65 |
hist[imva] = new TH1F( "MVA_Likelihood", "MVA_Likelihood", nbin, 0, 1 );
|
66 |
}
|
67 |
if (bulkname[imva] == "LikelihoodD" ) {
|
68 |
classReader[imva] = new ReadLikelihoodD ( inputVars );
|
69 |
hist[imva] = new TH1F( "MVA_LikelihoodD", "MVA_LikelihoodD", nbin, 0, 1 );
|
70 |
}
|
71 |
if (bulkname[imva] == "LikelihoodPCA") {
|
72 |
classReader[imva] = new ReadLikelihoodPCA( inputVars );
|
73 |
hist[imva] = new TH1F( "MVA_LikelihoodPCA", "MVA_LikelihoodPCA", nbin, 0, 1 );
|
74 |
}
|
75 |
if (bulkname[imva] == "LikelihoodMIX") {
|
76 |
classReader[imva] = new ReadLikelihoodMIX( inputVars );
|
77 |
hist[imva] = new TH1F( "MVA_LikelihoodMIX", "MVA_LikelihoodMIX", nbin, 0, 1 );
|
78 |
}
|
79 |
if (bulkname[imva] == "HMatrix" ) {
|
80 |
classReader[imva] = new ReadHMatrix ( inputVars );
|
81 |
hist[imva] = new TH1F( "MVA_HMatrix", "MVA_HMatrix", nbin, -0.95, 1.55 );
|
82 |
}
|
83 |
if (bulkname[imva] == "Fisher" ) {
|
84 |
classReader[imva] = new ReadFisher ( inputVars );
|
85 |
hist[imva] = new TH1F( "MVA_Fisher", "MVA_Fisher", nbin, -4, 4 );
|
86 |
}
|
87 |
if (bulkname[imva] == "FisherG" ) {
|
88 |
classReader[imva] = new ReadFisherG ( inputVars );
|
89 |
hist[imva] = new TH1F( "MVA_FisherG", "MVA_FisherG", nbin, -4, 4 );
|
90 |
}
|
91 |
if (bulkname[imva] == "LD" ) {
|
92 |
classReader[imva] = new ReadLD ( inputVars );
|
93 |
hist[imva] = new TH1F( "MVA_LD", "MVA_LD", nbin, -1., 1 );
|
94 |
}
|
95 |
if (bulkname[imva] == "FDA_MT" ) {
|
96 |
classReader[imva] = new ReadFDA_MT ( inputVars );
|
97 |
hist[imva] = new TH1F( "MVA_FDA_MT", "MVA_FDA_MT", nbin, -2.0, 3.0 );
|
98 |
}
|
99 |
if (bulkname[imva] == "FDA_MC" ) {
|
100 |
classReader[imva] = new ReadFDA_MC ( inputVars );
|
101 |
hist[imva] = new TH1F( "MVA_FDA_MC", "MVA_FDA_MC", nbin, -2.0, 3.0 );
|
102 |
}
|
103 |
if (bulkname[imva] == "FDA_GA" ) {
|
104 |
classReader[imva] = new ReadFDA_GA ( inputVars );
|
105 |
hist[imva] = new TH1F( "MVA_FDA_GA", "MVA_FDA_GA", nbin, -2.0, 3.0 );
|
106 |
}
|
107 |
if (bulkname[imva] == "MLP" ) {
|
108 |
classReader[imva] = new ReadMLP ( inputVars );
|
109 |
hist[imva] = new TH1F( "MVA_MLP", "MVA_MLP", nbin, -1.2, 1.2 );
|
110 |
}
|
111 |
if (bulkname[imva] == "MLPBFGS" ) {
|
112 |
classReader[imva] = new ReadMLPBFGS ( inputVars );
|
113 |
hist[imva] = new TH1F( "MVA_MLPBFGS", "MVA_MLPBFGS", nbin, -1.5, 1.5 );
|
114 |
}
|
115 |
if (bulkname[imva] == "BDT" ) {
|
116 |
classReader[imva] = new ReadBDT ( inputVars );
|
117 |
hist[imva] = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -1, 1 );
|
118 |
}
|
119 |
if (bulkname[imva] == "BDTD" ) {
|
120 |
classReader[imva] = new ReadBDTD ( inputVars );
|
121 |
hist[imva] = new TH1F( "MVA_BDTD", "MVA_BDTD", nbin, -1, 1 );
|
122 |
}
|
123 |
if (bulkname[imva] == "BDTG" ) {
|
124 |
classReader[imva] = new ReadBDTG ( inputVars );
|
125 |
hist[imva] = new TH1F( "MVA_BDTG", "MVA_BDTG", nbin, -1, 1 );
|
126 |
}
|
127 |
if (bulkname[imva] == "BDTB" ) {
|
128 |
classReader[imva] = new ReadBDTB ( inputVars );
|
129 |
hist[imva] = new TH1F( "MVA_BDTB", "MVA_BDTB", nbin, -1, 1 );
|
130 |
}
|
131 |
}
|
132 |
}
|
133 |
cout << "=== Macro : Class creation was successful" << endl;
|
134 |
|
135 |
// Prepare input tree (this must be replaced by your data source)
|
136 |
// in this example, there is a toy tree with signal and one with background events
|
137 |
// we'll later on use only the "signal" events for the test in this example.
|
138 |
//
|
139 |
TFile *input(0);
|
140 |
if (!gSystem->AccessPathName("./tmva_example.root")) {
|
141 |
// first we try to find tmva_example.root in the local directory
|
142 |
cout << "=== Macro : Accessing ./tmva_example.root" << endl;
|
143 |
input = TFile::Open("tmva_example.root");
|
144 |
}
|
145 |
|
146 |
if (!input) {
|
147 |
cout << "ERROR: could not open data file" << endl;
|
148 |
exit(1);
|
149 |
}
|
150 |
|
151 |
//
|
152 |
// prepare the tree
|
153 |
// - here the variable names have to corresponds to your tree
|
154 |
// - you can use the same variables as above which is slightly faster,
|
155 |
// but of course you can use different ones and copy the values inside the event loop
|
156 |
//
|
157 |
TTree* theTree = (TTree*)input->Get("TreeS");
|
158 |
cout << "=== Macro : Loop over signal sample" << endl;
|
159 |
|
160 |
// the references to the variables
|
161 |
float var1, var2, var3, var4;
|
162 |
float userVar1, userVar2;
|
163 |
theTree->SetBranchAddress( "var1", &userVar1 );
|
164 |
theTree->SetBranchAddress( "var2", &userVar2 );
|
165 |
theTree->SetBranchAddress( "var3", &var3 );
|
166 |
theTree->SetBranchAddress( "var4", &var4 );
|
167 |
|
168 |
cout << "=== Macro : Processing total of " << theTree->GetEntries() << " events ... " << endl;
|
169 |
|
170 |
std::vector<double>* inputVec = new std::vector<double>( 4 );
|
171 |
for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) {
|
172 |
|
173 |
if (ievt%1000 == 0) cout << "=== Macro : ... processing event: " << ievt << endl;
|
174 |
|
175 |
theTree->GetEntry(ievt);
|
176 |
|
177 |
var1 = userVar1 + userVar2;
|
178 |
var2 = userVar1 - userVar2;
|
179 |
|
180 |
(*inputVec)[0] = var1;
|
181 |
(*inputVec)[1] = var2;
|
182 |
(*inputVec)[2] = var3;
|
183 |
(*inputVec)[3] = var4;
|
184 |
|
185 |
// loop over all booked classifiers
|
186 |
for (int imva=0; imva<Nmvas; imva++) {
|
187 |
|
188 |
if (iuse[imva]) {
|
189 |
|
190 |
// retrive the classifier responses
|
191 |
double retval = classReader[imva]->GetMvaValue( *inputVec );
|
192 |
hist[imva]->Fill( retval, 1.0 );
|
193 |
}
|
194 |
}
|
195 |
}
|
196 |
|
197 |
cout << "=== Macro : Event loop done! " << endl;
|
198 |
|
199 |
TFile *target = new TFile( "ClassApp.root","RECREATE" );
|
200 |
for (int imva=0; imva<Nmvas; imva++) {
|
201 |
if (iuse[imva]) {
|
202 |
hist[imva]->Write();
|
203 |
}
|
204 |
}
|
205 |
cout << "=== Macro : Created target file: " << target->GetName() << endl;
|
206 |
target->Close();
|
207 |
|
208 |
delete target;
|
209 |
delete inputVec;
|
210 |
|
211 |
cout << "==> ClassApplication is done!" << endl << endl;
|
212 |
}
|