Is it possible to get cuts from TMVA Rectangular Cuts method?

I am using TMVA Rectangular Cuts method to differentiate between signal and background. My sample space is 2-dimensional ( eTotal and pTotal ).
What if want to draw cuts (for some signal efficiency)? How do I get cuts’ values after training?

You may find information here I guess:
https://github.com/root-project/root/blob/master/documentation/tmva/UsersGuide/TMVAUsersGuide.pdf

I did not see any suggestion how to get cuts after training in that user’s guide. Only application of trained algorithm. Though I could search more accurately.

I think I should use the xml file that was created after the training.
So I used the pugixml library to parse xml files. After installing it (see this post) I wrote a simple program which is intended neither to be full nor perfect but only for illustrate how to get the cuts from TMVA Rectangular Cuts method.
Below I provide program code, my xml file and how to use it README:

CodeAndFile.zip (7.5 KB)

The Cuts method also provides a method GetCuts() which you can use.

TMVA::Factory f("", "");
MethodBase * methodCutsBase = f.BookMethod(TMVA::Types::kCuts, "Cuts", "options");
MethodCuts * methodCuts = dynamic_cast<MethodCuts *>(methodCutsBase);
f.TrainAllMethods();

std::vector<Double_t> cutsMin;
std::vector<Double_t> cutsMax;
Double_t true_effS = methodCuts.GetCuts(effS, cutsMin, cutsMax);

// The rectangular cuts can now be read from the cutsMin and cutsMax vectors.

Hope it helps :slight_smile:

Cheers,
Kim

Thank you. So simple.
It would be useful if this info was in TMVA user’s guide.
Though you declared methodCuts as a pointer so you have to use -> instead of ..

After calling GetCuts method I get the segmentation violation error:

    factory->BookMethod( dataloader, TMVA::Types::kKNN, "kNN", "nkNN=40");
    TMVA::MethodBase* methodCutsBase = factory->BookMethod( dataloader, TMVA::Types::kCuts, "Cuts", "FitMethod=GA:EffMethod=EffSel");
    TMVA::MethodCuts* methodCuts = dynamic_cast<TMVA::MethodCuts* >(methodCutsBase); 
    //Train methods
    factory->TrainAllMethods();
    //Get cuts from Cuts method
    std::vector<Double_t> minCuts, maxCuts;
    Double_t trueEffS = methodCuts->GetCuts( 0.5, minCuts, maxCuts );

Why and how to fix it? Any ideas?

I made a mistake in my previous posting, corrected code below

TMVA::Factory f("...", "...");
f.BookMethod(TMVA::Types::kCuts, "Cuts", "options");
f.TrainAllMethods();

TMVA::IMethod    * methodCutsBase = factory.GetMethod("dataset", "Cuts");
TMVA::MethodCuts * methodCuts     = dynamic_cast<TMVA::MethodCuts *>(methodCutsBase);

std::vector<Double_t> cutsMin;
std::vector<Double_t> cutsMax;
Double_t true_effS = methodCuts->GetCuts(effS, cutsMin, cutsMax);

// One can also use PrintCuts to get a quick overview of the values
methodCuts->PrintCuts(0.5); // arg is signal efficiency

Yes. I think it would be useful for people to read this post. Thank you again.:slightly_smiling_face:

1 Like

That is not a convenient way to get cuts info at the training stage sometimes. Better way is to get that info at the application stage. But there we have to use TMVA::Reader. So it can be done with

TMVA::Reader reader = new TMVA::Reader( "Options" );
...
reader->BookMVA( "Cuts", "path_to_xml" );
...
//Get cuts
TMVA::MethodCuts* methodCuts = reader->FindCutsMVA( "Cuts" );
methodCuts->PrintCuts( effS );

Note that no dynamic casts needed here (though, probably, they all are inside classes).

1 Like