49 std::string factoryOptions(
"!V:!Silent:Transformations=I;D;P;G,D:AnalysisType=Classification" );
50 TString fname =
"./tmva_example_multiple_background.root";
53 input = TFile::Open( fname );
55 TTree *signal = (TTree*)input->Get(
"TreeS");
56 TTree *background0 = (TTree*)input->Get(
"TreeB0");
57 TTree *background1 = (TTree*)input->Get(
"TreeB1");
58 TTree *background2 = (TTree*)input->Get(
"TreeB2");
61 Double_t signalWeight = 1.0;
62 Double_t background0Weight = 1.0;
63 Double_t background1Weight = 1.0;
64 Double_t background2Weight = 1.0;
67 TString outfileName(
"TMVASignalBackground0.root" );
68 TFile* outputFile = TFile::Open( outfileName,
"RECREATE" );
74 TMVA::Factory *factory =
new TMVA::Factory(
"TMVAMultiBkg0", outputFile, factoryOptions );
75 TMVA::DataLoader *dataloader=
new TMVA::DataLoader(
"datasetBkg0");
77 dataloader->AddVariable(
"var1",
"Variable 1",
"",
'F' );
78 dataloader->AddVariable(
"var2",
"Variable 2",
"",
'F' );
79 dataloader->AddVariable(
"var3",
"Variable 3",
"units",
'F' );
80 dataloader->AddVariable(
"var4",
"Variable 4",
"units",
'F' );
82 dataloader->AddSignalTree ( signal, signalWeight );
83 dataloader->AddBackgroundTree( background0, background0Weight );
90 dataloader->PrepareTrainingAndTestTree( mycuts, mycutb,
91 "nTrain_Signal=0:nTrain_Background=0:SplitMode=Random:NormMode=NumEvents:!V" );
94 factory->BookMethod( dataloader, TMVA::Types::kBDT,
"BDTG",
95 "!H:!V:NTrees=1000:BoostType=Grad:Shrinkage=0.30:UseBaggedBoost:BaggedSampleFraction=0.6:SeparationType=GiniIndex:nCuts=20:MaxDepth=2" );
96 factory->TrainAllMethods();
97 factory->TestAllMethods();
98 factory->EvaluateAllMethods();
110 outfileName =
"TMVASignalBackground1.root";
111 outputFile = TFile::Open( outfileName,
"RECREATE" );
112 dataloader=
new TMVA::DataLoader(
"datasetBkg1");
114 factory =
new TMVA::Factory(
"TMVAMultiBkg1", outputFile, factoryOptions );
115 dataloader->AddVariable(
"var1",
"Variable 1",
"",
'F' );
116 dataloader->AddVariable(
"var2",
"Variable 2",
"",
'F' );
117 dataloader->AddVariable(
"var3",
"Variable 3",
"units",
'F' );
118 dataloader->AddVariable(
"var4",
"Variable 4",
"units",
'F' );
120 dataloader->AddSignalTree ( signal, signalWeight );
121 dataloader->AddBackgroundTree( background1, background1Weight );
126 dataloader->PrepareTrainingAndTestTree( mycuts, mycutb,
127 "nTrain_Signal=0:nTrain_Background=0:SplitMode=Random:NormMode=NumEvents:!V" );
130 factory->BookMethod( dataloader, TMVA::Types::kBDT,
"BDTG",
131 "!H:!V:NTrees=1000:BoostType=Grad:Shrinkage=0.30:UseBaggedBoost:BaggedSampleFraction=0.6:SeparationType=GiniIndex:nCuts=20:MaxDepth=2" );
132 factory->TrainAllMethods();
133 factory->TestAllMethods();
134 factory->EvaluateAllMethods();
145 outfileName =
"TMVASignalBackground2.root";
146 outputFile = TFile::Open( outfileName,
"RECREATE" );
148 factory =
new TMVA::Factory(
"TMVAMultiBkg2", outputFile, factoryOptions );
149 dataloader=
new TMVA::DataLoader(
"datasetBkg2");
151 dataloader->AddVariable(
"var1",
"Variable 1",
"",
'F' );
152 dataloader->AddVariable(
"var2",
"Variable 2",
"",
'F' );
153 dataloader->AddVariable(
"var3",
"Variable 3",
"units",
'F' );
154 dataloader->AddVariable(
"var4",
"Variable 4",
"units",
'F' );
156 dataloader->AddSignalTree ( signal, signalWeight );
157 dataloader->AddBackgroundTree( background2, background2Weight );
162 dataloader->PrepareTrainingAndTestTree( mycuts, mycutb,
163 "nTrain_Signal=0:nTrain_Background=0:SplitMode=Random:NormMode=NumEvents:!V" );
166 factory->BookMethod( dataloader, TMVA::Types::kBDT,
"BDTG",
167 "!H:!V:NTrees=1000:BoostType=Grad:Shrinkage=0.30:UseBaggedBoost:BaggedSampleFraction=0.5:SeparationType=GiniIndex:nCuts=20:MaxDepth=2" );
168 factory->TrainAllMethods();
169 factory->TestAllMethods();
170 factory->EvaluateAllMethods();
188 void ApplicationCreateCombinedTree(){
191 TString outfileName(
"tmva_example_multiple_backgrounds__applied.root" );
192 TFile* outputFile = TFile::Open( outfileName,
"RECREATE" );
193 TTree* outputTree =
new TTree(
"multiBkg",
"multiple backgrounds tree");
198 Float_t weight = 1.f;
200 Float_t classifier0, classifier1, classifier2;
202 outputTree->Branch(
"classID", &classID,
"classID/I");
203 outputTree->Branch(
"var1", &var1,
"var1/F");
204 outputTree->Branch(
"var2", &var2,
"var2/F");
205 outputTree->Branch(
"var3", &var3,
"var3/F");
206 outputTree->Branch(
"var4", &var4,
"var4/F");
207 outputTree->Branch(
"weight", &weight,
"weight/F");
208 outputTree->Branch(
"cls0", &classifier0,
"cls0/F");
209 outputTree->Branch(
"cls1", &classifier1,
"cls1/F");
210 outputTree->Branch(
"cls2", &classifier2,
"cls2/F");
214 TMVA::Reader *reader0 =
new TMVA::Reader(
"!Color:!Silent" );
215 TMVA::Reader *reader1 =
new TMVA::Reader(
"!Color:!Silent" );
216 TMVA::Reader *reader2 =
new TMVA::Reader(
"!Color:!Silent" );
218 reader0->AddVariable(
"var1", &var1 );
219 reader0->AddVariable(
"var2", &var2 );
220 reader0->AddVariable(
"var3", &var3 );
221 reader0->AddVariable(
"var4", &var4 );
223 reader1->AddVariable(
"var1", &var1 );
224 reader1->AddVariable(
"var2", &var2 );
225 reader1->AddVariable(
"var3", &var3 );
226 reader1->AddVariable(
"var4", &var4 );
228 reader2->AddVariable(
"var1", &var1 );
229 reader2->AddVariable(
"var2", &var2 );
230 reader2->AddVariable(
"var3", &var3 );
231 reader2->AddVariable(
"var4", &var4 );
234 TString method =
"BDT method";
235 reader0->BookMVA(
"BDT method",
"datasetBkg0/weights/TMVAMultiBkg0_BDTG.weights.xml" );
236 reader1->BookMVA(
"BDT method",
"datasetBkg1/weights/TMVAMultiBkg1_BDTG.weights.xml" );
237 reader2->BookMVA(
"BDT method",
"datasetBkg2/weights/TMVAMultiBkg2_BDTG.weights.xml" );
241 TString fname =
"./tmva_example_multiple_background.root";
242 input = TFile::Open( fname );
244 TTree* theTree = NULL;
247 for(
int treeNumber = 0; treeNumber < 4; ++treeNumber ) {
248 if( treeNumber == 0 ){
249 theTree = (TTree*)input->Get(
"TreeS");
250 std::cout <<
"--- Select signal sample" << std::endl;
254 }
else if( treeNumber == 1 ){
255 theTree = (TTree*)input->Get(
"TreeB0");
256 std::cout <<
"--- Select background 0 sample" << std::endl;
260 }
else if( treeNumber == 2 ){
261 theTree = (TTree*)input->Get(
"TreeB1");
262 std::cout <<
"--- Select background 1 sample" << std::endl;
266 }
else if( treeNumber == 3 ){
267 theTree = (TTree*)input->Get(
"TreeB2");
268 std::cout <<
"--- Select background 2 sample" << std::endl;
275 theTree->SetBranchAddress(
"var1", &var1 );
276 theTree->SetBranchAddress(
"var2", &var2 );
277 theTree->SetBranchAddress(
"var3", &var3 );
278 theTree->SetBranchAddress(
"var4", &var4 );
281 std::cout <<
"--- Processing: " << theTree->GetEntries() <<
" events" << std::endl;
284 Int_t nEvent = theTree->GetEntries();
286 for (Long64_t ievt=0; ievt<nEvent; ievt++) {
289 std::cout <<
"--- ... Processing event: " << ievt << std::endl;
292 theTree->GetEntry(ievt);
295 classifier0 = reader0->EvaluateMVA( method );
296 classifier1 = reader1->EvaluateMVA( method );
297 classifier2 = reader2->EvaluateMVA( method );
305 std::cout <<
"--- End of event loop: "; sw.Print();
317 std::cout <<
"--- Created root file: \"" << outfileName.Data() <<
"\" containing the MVA output histograms" << std::endl;
323 std::cout <<
"==> Application of readers is done! combined tree created" << std::endl << std::endl;
334 class MyFitness :
public IFitterTarget {
337 MyFitness( TChain* _chain ) : IFitterTarget() {
340 hSignal =
new TH1F(
"hsignal",
"hsignal",100,-1,1);
341 hFP =
new TH1F(
"hfp",
"hfp",100,-1,1);
342 hTP =
new TH1F(
"htp",
"htp",100,-1,1);
344 TString cutsAndWeightSignal =
"weight*(classID==0)";
345 nSignal = chain->Draw(
"Entry$/Entries$>>hsignal",cutsAndWeightSignal,
"goff");
346 weightsSignal = hSignal->Integral();
351 Double_t EstimatorFunction( std::vector<Double_t> & factors ){
353 TString cutsAndWeightTruePositive = Form(
"weight*((classID==0) && cls0>%f && cls1>%f && cls2>%f )",factors.at(0), factors.at(1), factors.at(2));
354 TString cutsAndWeightFalsePositive = Form(
"weight*((classID >0) && cls0>%f && cls1>%f && cls2>%f )",factors.at(0), factors.at(1), factors.at(2));
357 Float_t nTP = chain->Draw(
"Entry$/Entries$>>htp",cutsAndWeightTruePositive,
"goff");
358 Float_t nFP = chain->Draw(
"Entry$/Entries$>>hfp",cutsAndWeightFalsePositive,
"goff");
360 weightsTruePositive = hTP->Integral();
361 weightsFalsePositive = hFP->Integral();
364 if( weightsSignal > 0 )
365 efficiency = weightsTruePositive/weightsSignal;
368 if( weightsTruePositive+weightsFalsePositive > 0 )
369 purity = weightsTruePositive/(weightsTruePositive+weightsFalsePositive);
371 Float_t effTimesPur = efficiency*purity;
373 Float_t toMinimize = std::numeric_limits<float>::max();
374 if( effTimesPur > 0 )
375 toMinimize = 1./(effTimesPur);
384 std::cout << std::endl;
385 std::cout <<
"======================" << std::endl
386 <<
"Efficiency : " << efficiency << std::endl
387 <<
"Purity : " << purity << std::endl << std::endl
388 <<
"True positive weights : " << weightsTruePositive << std::endl
389 <<
"False positive weights: " << weightsFalsePositive << std::endl
390 <<
"Signal weights : " << weightsSignal << std::endl;
397 Float_t weightsTruePositive;
398 Float_t weightsFalsePositive;
399 Float_t weightsSignal;
421 void MaximizeSignificance(){
425 vector<Interval*> ranges;
426 ranges.push_back(
new Interval(-1,1) );
427 ranges.push_back(
new Interval(-1,1) );
428 ranges.push_back(
new Interval(-1,1) );
430 std::cout <<
"Classifier ranges (defined by the user)" << std::endl;
431 for( std::vector<Interval*>::iterator it = ranges.begin(); it != ranges.end(); it++ ){
432 std::cout <<
" range: " << (*it)->GetMin() <<
" " << (*it)->GetMax() << std::endl;
435 TChain* chain =
new TChain(
"multiBkg");
436 chain->Add(
"tmva_example_multiple_backgrounds__applied.root");
438 IFitterTarget* myFitness =
new MyFitness( chain );
446 const TString name(
"multipleBackgroundGA" );
447 const TString opts(
"PopSize=100:Steps=30" );
449 GeneticFitter mg( *myFitness, name, ranges, opts);
452 std::vector<Double_t> result;
453 Double_t estimator = mg.Run(result);
455 dynamic_cast<MyFitness*
>(myFitness)->Print();
456 std::cout << std::endl;
459 for( std::vector<Double_t>::iterator it = result.begin(); it<result.end(); it++ ){
460 std::cout <<
" cutValue[" << n <<
"] = " << (*it) <<
";"<< std::endl;
470 void TMVAMultipleBackgroundExample()
475 cout <<
"Start Test TMVAGAexample" << endl
476 <<
"========================" << endl
479 TString createDataMacro = gROOT->GetTutorialDir() +
"/tmva/createData.C";
480 gROOT->ProcessLine(TString::Format(
".L %s",createDataMacro.Data()));
481 gROOT->ProcessLine(
"create_MultipleBackground(200)");
485 cout <<
"========================" << endl;
486 cout <<
"--- Training" << endl;
490 cout <<
"========================" << endl;
491 cout <<
"--- Application & create combined tree" << endl;
492 ApplicationCreateCombinedTree();
495 cout <<
"========================" << endl;
496 cout <<
"--- maximize significance" << endl;
497 MaximizeSignificance();
500 int main(
int argc,
char** argv ) {
501 TMVAMultipleBackgroundExample();