Hi Lorenzo,
What I did :
#ifndef MYMethodBDT_derived_H_
#define MYMethodBDT_derived_H_
class MethodBDT_derived : public TMVA::MethodBDT {
public:
MethodBDT_derived( const TString& jobName, const TString& methodTitle, TMVA::DataSetInfo& theData, const TString& theOption = ""):MethodBDT(jobName,methodTitle,theData, ""){};
std::map<TString,Double_t> OptimizeTuningParameters(TString fomType, TString fitType) ;
};
std::map<TString,Double_t> MethodBDT_derived::OptimizeTuningParameters(TString fomType, TString fitType)
{
// fill all the tuning parameters that should be optimized into a map:
std::map<TString,TMVA::Interval*> tuneParameters;
std::map<TString,Double_t> tunedParameters;
// note: the 3rd parameter in the interval is the "number of bins", NOT the stepsize !!
// the actual VALUES at (at least for the scan, guess also in GA) are always
// read from the middle of the bins. Hence.. the choice of Intervals e.g. for the
// MaxDepth, in order to make nice integer values!!!
// find some reasonable ranges for the optimisation of MinNodeEvents:
tuneParameters.insert(std::pair<TString,TMVA::Interval*>("NTrees", new TMVA::Interval(50,1000,20))); // stepsize 50
tuneParameters.insert(std::pair<TString,TMVA::Interval*>("MaxDepth", new TMVA::Interval(2,4,3))); // stepsize 1
tuneParameters.insert(std::pair<TString,TMVA::Interval*>("MinNodeSize", new TMVA::LogInterval(1,30,30))); //
//tuneParameters.insert(std::pair<TString,TMVA::Interval*>("NodePurityLimit",new TMVA::Interval(.4,.6,3))); // stepsize .1
//tuneParameters.insert(std::pair<TString,TMVA::Interval*>("BaggedSampleFraction",new TMVA::Interval(.4,.9,6))); // stepsize .1
tuneParameters.insert(std::pair<TString,TMVA::Interval*>("AdaBoostBeta", new TMVA::Interval(.2,1.,5)));
Log()<<TMVA::kINFO << " the following BDT parameters will be tuned on the respective *grid*\n"<<TMVA::Endl;
std::map<TString,TMVA::Interval*>::iterator it;
for(it=tuneParameters.begin(); it!= tuneParameters.end(); ++it){
Log() << TMVA::kWARNING << it->first << TMVA::Endl;
std::ostringstream oss;
(it->second)->Print(oss);
Log()<<oss.str();
Log()<<TMVA::Endl;
}
TMVA::OptimizeConfigParameters optimize(this, tuneParameters, fomType, fitType);
tunedParameters=optimize.optimize();
return tunedParameters;
}
#endif
void test()
{
TMVA::Factory *factory = new TMVA::Factory( "TMVAClassification", "AnalysisType=Classification" );
TFile *input_Signal_ACT(0);
TString fname_Signal_ACT = "Signal_ACT.root";
if(!gSystem->AccessPathName( fname_Signal_ACT ))
{
input_Signal_ACT = TFile::Open( fname_Signal_ACT );
}
if (!input_Signal_ACT)
{
std::cout << "ERROR: could not open Signal_ACT file" << std::endl;
exit(1);
}
std::cout << "--- TMVA : Using input file for signal: " << input_Signal_ACT->GetName() << std::endl;
TFile *input_Background(0);
TString fname_Background = "Background.root";
if(!gSystem->AccessPathName( fname_Background ))
{
input_Background = TFile::Open( fname_Background );
}
if (!input_Background)
{
std::cout << "ERROR: could not open Background file" << std::endl;
exit(1);
}
TTree *signalTree = (TTree*)input_Signal_ACT->Get("SR1");
TTree *backgroundTree = (TTree*)input_Background->Get("SR1");
TMVA::DataLoader dataloader{"dataset"};
dataloader.AddVariable( "GammaPt_SR1", "P_{T,#gamma}[GeV]", 'F' );
dataloader.AddVariable( "EleCharge_SR1","e_{charge}", 'F' );
dataloader.AddVariable( "TopMass_SR1", "m_{e #nu b}[GeV]", 'F' );
dataloader.AddVariable( "Dr_e_photon_SR1", "#Delta R_{e,#gamma}", 'F' );
dataloader.AddVariable( "DrTopG_SR1", "#Delta R_{top,#gamma}", 'F' );
dataloader.AddVariable( "Dr_e_Bjet_SR1", "#Delta R_{e,b-jet}", 'F' );
dataloader.AddVariable( "Met_SR1", "Met[GeV]", 'F' );
dataloader.AddVariable( "EleEta_SR1", "#eta_{e}", 'F' );
dataloader.AddVariable( "GammaEta_SR1", "#eta_{#gamma}", 'F' );
dataloader.SetBackgroundWeightExpression("Weight_SR1");
dataloader.AddSignalTree( signalTree);
dataloader.AddBackgroundTree(backgroundTree);
TCut mycuts = "";
TCut mycutb = "";
dataloader.PrepareTrainingAndTestTree( mycuts, mycutb,"nTrain_Signal=0:nTrain_Background=0:SplitMode=Random:NormMode=NumEvents:!V" );
TMVA::MethodBase* method = factory->BookMethod(&dataloader, TMVA::Types::kBDT,"BDT", "BoostType=AdaBoost");
MethodBDT_derived* Mymethod = new MethodBDT_derived("TMVA","BDT",dataloader.GetDataSetInfo(),"BoostType=AdaBoost");
method = Mymethod;
method->OptimizeTuningParameters(/*"ROCIntegral","FitGA"*/);
}
Thanks,
Ali