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();