103 fDataSetManager(
NULL)
112 std::vector<TTreeFormula*>::iterator formIt = fCatFormulas.begin();
113 std::vector<TTreeFormula*>::iterator lastF = fCatFormulas.end();
114 for(;formIt!=lastF; ++formIt)
delete *formIt;
124 std::vector<IMethod*>::iterator itrMethod = fMethods.begin();
127 for(; itrMethod != fMethods.end(); ++itrMethod ) {
128 if ( !(*itrMethod)->HasAnalysisType(type, numberClasses, numberTargets) )
152 Log() << kINFO <<
"Adding sub-classifier: " << addedMethodName <<
"::" << theTitle <<
Endl;
154 DataSetInfo& dsi = CreateCategoryDSI(theCut, theVariables, theTitle);
159 if(method==0)
return 0;
187 fMethods.push_back(method);
188 fCategoryCuts.push_back(theCut);
189 fVars.push_back(theVariables);
194 fCategorySpecIdx.push_back(newSpectatorIndex);
211 TString dsiName=theTitle+
"_dsi";
217 fDataSetManager->AddDataSetInfo(*dsi);
220 std::vector<VariableInfo>::iterator itrVarInfo;
232 std::vector<UInt_t> varMap;
236 std::vector<TString>::iterator itrVariables;
240 for (itrVariables = variables.begin(); itrVariables != variables.end(); itrVariables++) {
245 if((*itrVariables==itrVarInfo->GetLabel()) ) {
249 varMap.push_back(counter);
257 if((*itrVariables==itrVarInfo->GetLabel()) ) {
261 varMap.push_back(counter);
269 Log() << kFATAL <<
"The variable " << itrVariables->Data() <<
" was not found and could not be added " <<
Endl;
275 if (theVariables==
"") {
283 fVarMaps.push_back(varMap);
289 for (
UInt_t i=0; i<nClasses; i++) {
293 dsi->
AddCut(theCut,className);
322 std::vector<VariableInfo>::const_iterator viIt;
327 for (viIt = vars.begin(); viIt != vars.end(); ++viIt)
328 if( viIt->GetExternalLink() == 0 ) {
329 hasAllExternalLinks =
kFALSE;
332 for (viIt = specs.begin(); viIt != specs.end(); ++viIt)
333 if( viIt->GetExternalLink() == 0 ) {
334 hasAllExternalLinks =
kFALSE;
338 if(!hasAllExternalLinks)
return;
347 fCatTree->SetCircular(1);
350 for (viIt = vars.begin(); viIt != vars.end(); ++viIt) {
354 for (viIt = specs.begin(); viIt != specs.end(); ++viIt) {
360 for(
UInt_t cat=0; cat!=fCategoryCuts.size(); ++cat) {
361 fCatFormulas.push_back(
new TTreeFormula(
Form(
"Category_%i",cat), fCategoryCuts[cat].GetTitle(), fCatTree));
376 Log() << kINFO <<
"Train all sub-classifiers for "
380 if (fMethods.empty()) {
381 Log() << kINFO <<
"...nothing found to train" <<
Endl;
385 std::vector<IMethod*>::iterator itrMethod;
388 for (itrMethod = fMethods.begin(); itrMethod != fMethods.end(); ++itrMethod ) {
401 itrMethod = fMethods.erase( itrMethod );
409 Log() << kINFO <<
"Training finished" <<
Endl;
414 <<
" not trained (training tree has less entries ["
416 <<
"] than required [" << MinNoTrainingEvents <<
"]" <<
Endl;
418 Log() << kERROR <<
" w/o training/test events for that category, I better stop here and let you fix " <<
Endl;
419 Log() << kFATAL <<
"that one first, otherwise things get too messy later ... " <<
Endl;
427 Log() << kINFO <<
"Begin ranking of input variables..." <<
Endl;
428 for (itrMethod = fMethods.begin(); itrMethod != fMethods.end(); itrMethod++) {
431 const Ranking* ranking = (*itrMethod)->CreateRanking();
435 Log() << kINFO <<
"No variable ranking supplied by classifier: "
451 std::vector<IMethod*>::iterator itrMethod;
454 for (
UInt_t i=0; i<fMethods.size(); i++) {
480 Log() << kINFO <<
"Recreating sub-classifiers from XML-file " <<
Endl;
483 for (
UInt_t i=0; i<nSubMethods; i++) {
489 methodType = fullMethodName(0,fullMethodName.
Index(
"::"));
490 if (methodType.
Contains(
" ")) methodType = methodType(methodType.
Last(
' ')+1,methodType.
Length());
493 titleLength = fullMethodName.
Length()-fullMethodName.
Index(
"::")-2;
494 methodTitle = fullMethodName(fullMethodName.
Index(
"::")+2,titleLength);
497 DataSetInfo& dsi = CreateCategoryDSI(
TCut(theCutString), theVariables, methodTitle);
503 Log() << kFATAL <<
"Could not create sub-method " << method <<
" from XML." <<
Endl;
508 fMethods.push_back(method);
509 fCategoryCuts.push_back(
TCut(theCutString));
510 fVars.push_back(theVariables);
514 UInt_t spectatorIdx = 10000;
519 std::vector<VariableInfo>::iterator itrVarInfo;
522 for (itrVarInfo = spectators.begin(); itrVarInfo != spectators.end(); ++itrVarInfo, ++counter) {
523 if((specName==itrVarInfo->GetLabel()) || (specName==itrVarInfo->GetExpression())) {
524 spectatorIdx=counter;
525 fCategorySpecIdx.push_back(spectatorIdx);
533 InitCircularTree(DataInfo());
555 Log() <<
"This method allows to define different categories of events. The" <<
Endl;
556 Log() <<
"categories are defined via cuts on the variables. For each" <<
Endl;
557 Log() <<
"category, a different classifier and set of variables can be" <<
Endl;
558 Log() <<
"specified. The categories which are defined for this method must" <<
Endl;
559 Log() <<
"be disjoint." <<
Endl;
578 if (methodIdx>=fCatFormulas.size()) {
579 Log() << kFATAL <<
"Large method index " << methodIdx <<
", number of category formulas = "
580 << fCatFormulas.size() <<
Endl;
589 if (methodIdx>=fCategorySpecIdx.size()) {
590 Log() << kFATAL <<
"Unknown method index " << methodIdx <<
" maximum allowed index="
591 << fCategorySpecIdx.size() <<
Endl;
593 UInt_t spectatorIdx = fCategorySpecIdx[methodIdx];
595 Bool_t pass = (specVal>0.5);
605 if (fMethods.empty())
return 0;
608 const Event* ev = GetEvent();
611 Int_t suitableCutsN = 0;
613 for (
UInt_t i=0; i<fMethods.size(); ++i) {
614 if (PassesCut(ev, i)) {
620 if (suitableCutsN == 0) {
621 Log() << kWARNING <<
"Event does not lie within the cut of any sub-classifier." <<
Endl;
625 if (suitableCutsN > 1) {
626 Log() << kFATAL <<
"The defined categories are not disjoint." <<
Endl;
632 Double_t mvaValue =
dynamic_cast<MethodBase*
>(fMethods[methodToUse])->GetMvaValue(ev,err,errUpper);
648 const Event* ev = GetEvent();
651 Int_t suitableCutsN = 0;
653 for (
UInt_t i=0; i<fMethods.size(); ++i) {
654 if (PassesCut(ev, i)) {
660 if (suitableCutsN == 0) {
661 Log() << kWARNING <<
"Event does not lie within the cut of any sub-classifier." <<
Endl;
665 if (suitableCutsN > 1) {
666 Log() << kFATAL <<
"The defined categories are not disjoint." <<
Endl;
671 Log() << kFATAL <<
"method not found in Category Regression method" <<
Endl;
IMethod * Create(const std::string &name, const TString &job, const TString &title, DataSetInfo &dsi, const TString &option)
creates the method if needed based on the method name using the creator function the factory has stor...
static ClassifierFactory & Instance()
access to the ClassifierFactory singleton creates the instance if needed
void SetModelPersistence(Bool_t status)
virtual const char * GetTitle() const
Returns title of object.
std::string GetName(const std::string &scope_name)
void Init()
initialize the method
Ssiz_t Last(char c) const
Find last occurrence of a character c.
TMVA::IMethod * AddMethod(const TCut &, const TString &theVariables, Types::EMVA theMethod, const TString &theTitle, const TString &theOptions)
adds sub-classifier for a category
MsgLogger & Endl(MsgLogger &ml)
Singleton class for Global types used by TMVA.
VariableInfo & AddTarget(const TString &expression, const TString &title, const TString &unit, Double_t min, Double_t max, Bool_t normalized=kTRUE, void *external=0)
add a variable (can be a complex expression) to the set of variables used in the MV analysis ...
void AddWeightsXMLTo(void *parent) const
create XML description of Category classifier
const TString GetWeightExpression(Int_t i) const
void ReadStateFromXML(void *parent)
std::vector< VariableInfo > & GetSpectatorInfos()
void SetVariableArrangement(std::vector< UInt_t > *const m) const
set the variable arrangement
void SetCut(const TCut &cut, const TString &className)
set the cut for the classes
void InitCircularTree(const DataSetInfo &dsi)
initialize the circular tree
Float_t GetSpectator(UInt_t ivar) const
return spectator content
const TString & GetExpression() const
const char * GetName() const
static Types & Instance()
the the single instance of "Types" if existing already, or create it (Singleton)
UInt_t GetNClasses() const
void SetMethodBaseDir(TDirectory *methodDir)
UInt_t GetNTargets() const
Virtual base Class for all MVA method.
const std::vector< Float_t > & GetRegressionValues(const TMVA::Event *const ev)
virtual const std::vector< Float_t > & GetRegressionValues()
Ranking for variables in method (implementation)
virtual ~MethodCategory(void)
destructor
void AddCut(const TCut &cut, const TString &className)
set the cut for the classes
void SetSilentFile(Bool_t status)
virtual Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets)=0
void GetHelpMessage() const
Get help message text.
const TString & GetMethodName() const
const char * Data() const
void DeclareOptions()
options for this method
Virtual base class for combining several TMVA method.
TDirectory * GetRootDir() const
const TString & GetNormalization() const
std::vector< std::vector< double > > Data
virtual void ParseOptions()
options parser
void SetupMethod()
setup of methods
Class that contains all the data information.
std::vector< VariableInfo > & GetTargetInfos()
A specialized string object used for TTree selections.
MethodCategory(const TString &jobName, const TString &methodTitle, DataSetInfo &theData, const TString &theOption="")
standard constructor
const Int_t MinNoTrainingEvents
void SetSplitOptions(const TString &so)
const Ranking * CreateRanking()
no ranking
std::string GetMethodName(TCppMethod_t)
TMVA::DataSetInfo & CreateCategoryDSI(const TCut &, const TString &, const TString &)
create a DataSetInfo object for a sub-classifier
ClassInfo * GetClassInfo(Int_t clNum) const
void SetWeightExpression(const TString &exp, const TString &className="")
set the weight expressions for the classes if class name is specified, set only for this class if cla...
char * Form(const char *fmt,...)
void Train(void)
train all sub-classifiers
virtual const char * GetName() const
Returns name of object.
const TCut & GetCut(Int_t i) const
Class for categorizing the phase space.
const TString & GetSplitOptions() const
virtual void CheckSetup()
check may be overridden by derived class (sometimes, eg, fitters are used which can only be implement...
Describe directory structure in memory.
void SetFile(TFile *file)
DataSetInfo & DataInfo() const
virtual Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t)
check whether method category has analysis type the method type has to be the same for all sub-method...
ClassInfo * AddClass(const TString &className)
void ProcessSetup()
process all options the "CheckForUnusedOptions" is done in an independent call, since it may be overr...
Double_t GetMvaValue(Double_t *err=0, Double_t *errUpper=0)
returns the mva value of the right sub-classifier
Interface for all concrete MVA method implementations.
void * GetExternalLink() const
#define REGISTER_METHOD(CLASS)
for example
VariableInfo & AddSpectator(const TString &expression, const TString &title, const TString &unit, Double_t min, Double_t max, char type= 'F', Bool_t normalized=kTRUE, void *external=0)
add a spectator (can be a complex expression) to the set of spectator variables used in the MV analys...
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void SetWeightFileDir(TString fileDir)
set directory of weight file
virtual TDirectory * GetDirectory(const char *namecycle, Bool_t printError=false, const char *funcname="GetDirectory")
Find a directory using apath.
VariableInfo & AddVariable(const TString &expression, const TString &title="", const TString &unit="", Double_t min=0, Double_t max=0, char varType='F', Bool_t normalized=kTRUE, void *external=0)
add a variable (can be a complex expression) to the set of variables used in the MV analysis ...
void DisableWriting(Bool_t setter)
Long64_t GetNTrainingEvents() const
A TTree object has a header with a name and a title.
void ReadWeightsFromXML(void *wghtnode)
read weights of sub-classifiers of MethodCategory from xml weight file
Bool_t PassesCut(const Event *ev, UInt_t methodIdx)
virtual void Print() const
get maximum length of variable names
Class for type info of MVA input variable.
TString GetMethodTypeName() const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
double norm(double *x, double *p)
void WriteStateToXML(void *parent) const
general method used in writing the header of the weight files where the used variables, variable transformation type etc.
void SetNormalization(const TString &norm)
void SetRootDir(TDirectory *d)
virtual const std::vector< Float_t > & GetRegressionValues()
returns the mva value of the right sub-classifier
std::vector< VariableInfo > & GetVariableInfos()
void variables(TString dataset, TString fin="TMVA.root", TString dirName="InputVariables_Id", TString title="TMVA Input Variables", Bool_t isRegression=kFALSE, Bool_t useTMVAStyle=kTRUE)
virtual void SetAnalysisType(Types::EAnalysisType type)
void ProcessOptions()
process user options