111 #ifndef ROOT_TMVA_Tools
127 : Configurable( theOption ),
128 fDataSetManager(
NULL ),
133 fCalculateError(kFALSE),
135 fMvaEventErrorUpper( 0 ),
138 fDataSetManager =
new DataSetManager( fDataInputHandler );
139 fDataSetManager->AddDataSetInfo(fDataSetInfo);
140 fLogger =
new MsgLogger(
this);
141 SetConfigName( GetName() );
153 fDataSetManager(
NULL ),
160 fMvaEventErrorUpper( 0 ),
172 for (std::vector<TString>::iterator ivar = inputVars.begin(); ivar != inputVars.end(); ivar++)
183 fDataSetManager(
NULL ),
190 fMvaEventErrorUpper( 0 ),
202 for (std::vector<std::string>::iterator ivar = inputVars.begin(); ivar != inputVars.end(); ivar++)
213 fDataSetManager(
NULL ),
220 fMvaEventErrorUpper( 0 ),
241 fDataSetManager(
NULL ),
248 fMvaEventErrorUpper( 0 ),
269 if (
gTools().CheckForSilentOption( GetOptions() ))
Log().InhibitOutput();
271 DeclareOptionRef( fVerbose,
"V",
"Verbose flag" );
272 DeclareOptionRef( fColor,
"Color",
"Color flag (default True)" );
273 DeclareOptionRef( fSilent,
"Silent",
"Boolean silent flag (default False)" );
274 DeclareOptionRef( fCalculateError,
"Error",
"Calculates errors (default False)" );
282 delete fDataSetManager;
304 DataInfo().AddVariable( expression,
"",
"", 0, 0,
'F',
kFALSE ,(
void*)datalink );
311 Log() <<
kFATAL <<
"Reader::AddVariable( const TString& expression, Int_t* datalink ), this function is deprecated, please provide all variables to the reader as floats" <<
Endl;
313 Log() <<
kFATAL <<
"Reader::AddVariable( const TString& expression, Int_t* datalink ), this function is deprecated, please provide all variables to the reader as floats" <<
Endl;
314 DataInfo().AddVariable(expression,
"",
"", 0, 0,
'I',
kFALSE, (
void*)datalink );
322 DataInfo().AddSpectator( expression,
"",
"", 0, 0,
'F',
kFALSE ,(
void*)datalink );
330 DataInfo().AddSpectator(expression,
"",
"", 0, 0,
'I',
kFALSE, (
void*)datalink );
338 std::ifstream fin( filename );
340 Log() <<
kFATAL <<
"<BookMVA> fatal error: "
341 <<
"unable to open input weight file: " << filename <<
Endl;
347 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,29,0)
358 fin.getline(buf,512);
363 TString methodType = fullMethodName(0,fullMethodName.
Index(
"::"));
364 if (methodType.
Contains(
" ")) methodType = methodType(methodType.
Last(
' ')+1,methodType.
Length());
374 if (fMethodMap.find( methodTag ) != fMethodMap.end())
375 Log() <<
kFATAL <<
"<BookMVA> method tag \"" << methodTag <<
"\" already exists!" <<
Endl;
377 TString methodType(GetMethodTypeFromFile(weightfile));
379 Log() <<
kINFO <<
"Booking \"" << methodTag <<
"\" of type \"" << methodType <<
"\" from " << weightfile <<
"." <<
Endl;
386 Log() <<
kFATAL <<
"Method with type kCategory cannot be casted to MethodCategory. /Reader" <<
Endl;
390 return fMethodMap[methodTag] = method;
399 DataInfo(), weightfile );
403 if (method==0)
return im;
408 Log() <<
kERROR <<
"Method with type kCategory cannot be casted to MethodCategory. /Reader" <<
Endl;
434 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,26,00)
442 if(!method)
return 0;
447 Log() <<
kFATAL <<
"Method with type kCategory cannot be casted to MethodCategory. /Reader" <<
Endl;
468 Log() <<
kFATAL <<
"Method Reader::BookMVA(TMVA::Types::EMVA methodType = " << methodType
469 <<
", const char* xmlstr = " << xmlstr
470 <<
" ) is not available for ROOT versions prior to 5.26/00." <<
Endl;
482 IMethod* imeth = FindMVA( methodTag );
484 if(meth==0)
return 0;
487 Event* tmpEvent=
new Event(inputVec, DataInfo().GetNVariables());
488 for (
UInt_t i=0; i<inputVec.size(); i++){
490 Log() <<
kERROR << i <<
"-th variable of the event is NaN --> return MVA value -999, \n that's all I can do, please fix or remove this event." <<
Endl;
513 if(fTmpEvalVec.size() != inputVec.size())
514 fTmpEvalVec.resize(inputVec.size());
516 for (
UInt_t idx=0; idx!=inputVec.size(); idx++ )
517 fTmpEvalVec[idx]=inputVec[idx];
519 return EvaluateMVA( fTmpEvalVec, methodTag, aux );
529 std::map<TString, IMethod*>::iterator it = fMethodMap.find( methodTag );
530 if (it == fMethodMap.end()) {
531 Log() <<
kINFO <<
"<EvaluateMVA> unknown classifier in map; "
532 <<
"you looked for \"" << methodTag <<
"\" within available methods: " <<
Endl;
533 for (it = fMethodMap.begin(); it!=fMethodMap.end(); it++)
Log() <<
" --> " << it->first <<
Endl;
537 else method = it->second;
549 Log() <<
kERROR << i <<
"-th variable of the event is NaN --> return MVA value -999, \n that's all I can do, please fix or remove this event." <<
Endl;
553 return this->EvaluateMVA( kl, aux );
569 return method->
GetMvaValue( (fCalculateError?&fMvaEventError:0),
570 (fCalculateError?&fMvaEventErrorUpper:0) );
580 std::map<TString, IMethod*>::iterator it = fMethodMap.find( methodTag );
581 if (it == fMethodMap.end()) {
582 Log() <<
kINFO <<
"<EvaluateMVA> unknown method in map; "
583 <<
"you looked for \"" << methodTag <<
"\" within available methods: " <<
Endl;
584 for (it = fMethodMap.begin(); it!=fMethodMap.end(); it++)
Log() <<
" --> " << it->first <<
Endl;
587 else method = it->second;
598 Log() <<
kERROR << i <<
"-th variable of the event is NaN, \n regression values might evaluate to .. what do I know. \n sorry this warning is all I can do, please fix or remove this event." <<
Endl;
602 return this->EvaluateRegression( kl, aux );
615 Log() <<
kERROR << i <<
"-th variable of the event is NaN, \n regression values might evaluate to .. what do I know. \n sorry this warning is all I can do, please fix or remove this event." <<
Endl;
628 return EvaluateRegression(methodTag, aux).at(tgtNumber);
630 catch (std::out_of_range e) {
631 Log() <<
kWARNING <<
"Regression could not be evaluated for target-number " << tgtNumber <<
Endl;
645 std::map<TString, IMethod*>::iterator it = fMethodMap.find( methodTag );
646 if (it == fMethodMap.end()) {
647 Log() <<
kINFO <<
"<EvaluateMVA> unknown method in map; "
648 <<
"you looked for \"" << methodTag <<
"\" within available methods: " <<
Endl;
649 for (it = fMethodMap.begin(); it!=fMethodMap.end(); it++)
Log() <<
" --> " << it->first <<
Endl;
652 else method = it->second;
664 Log() <<
kERROR << i <<
"-th variable of the event is NaN, \n regression values might evaluate to .. what do I know. \n sorry this warning is all I can do, please fix or remove this event." <<
Endl;
668 return this->EvaluateMulticlass( kl, aux );
681 Log() <<
kERROR << i <<
"-th variable of the event is NaN, \n regression values might evaluate to .. what do I know. \n sorry this warning is all I can do, please fix or remove this event." <<
Endl;
694 return EvaluateMulticlass(methodTag, aux).at(clsNumber);
696 catch (std::out_of_range e) {
697 Log() <<
kWARNING <<
"Multiclass could not be evaluated for class-number " << clsNumber <<
Endl;
708 std::map<TString, IMethod*>::iterator it = fMethodMap.find( methodTag );
709 if (it != fMethodMap.end())
return it->second;
710 Log() <<
kERROR <<
"Method " << methodTag <<
" not found!" <<
Endl;
720 return dynamic_cast<MethodCuts*
>(FindMVA(methodTag));
729 std::map<TString, IMethod*>::iterator it = fMethodMap.find( methodTag );
730 if (it == fMethodMap.end()) {
731 for (it = fMethodMap.begin(); it!=fMethodMap.end(); it++)
Log() <<
"M" << it->first <<
Endl;
732 Log() <<
kFATAL <<
"<EvaluateMVA> unknown classifier in map: " << method <<
"; "
733 <<
"you looked for " << methodTag<<
" while the available methods are : " <<
Endl;
735 else method = it->second;
744 Log() <<
kERROR << i <<
"-th variable of the event is NaN --> return MVA value -999, \n that's all I can do, please fix or remove this event." <<
Endl;
749 if (mvaVal == -9999999) mvaVal = kl->
GetMvaValue();
751 return kl->
GetProba( mvaVal, ap_sig );
760 std::map<TString, IMethod*>::iterator it = fMethodMap.find( methodTag );
761 if (it == fMethodMap.end()) {
762 for (it = fMethodMap.begin(); it!=fMethodMap.end(); it++)
Log() <<
"M" << it->first <<
Endl;
763 Log() <<
kFATAL <<
"<EvaluateMVA> unknown classifier in map: \"" << method <<
"\"; "
764 <<
"you looked for \"" << methodTag<<
"\" while the available methods are : " <<
Endl;
766 else method = it->second;
775 Log() <<
kERROR << i <<
"-th variable of the event is NaN --> return MVA value -999, \n that's all I can do, please fix or remove this event." <<
Endl;
780 if (mvaVal == -9999999) mvaVal = kl->
GetMvaValue();
794 size_t ipos = 0,
f = 0;
795 while (
f != varNames.length()) {
796 f = varNames.find(
':', ipos );
797 if (
f > varNames.length())
f = varNames.length();
798 std::string subs = varNames.substr( ipos,
f-ipos ); ipos =
f+1;
799 DataInfo().AddVariable( subs.c_str() );
812 for (
int i=0; i< n+1 ; i++) {
813 format.
Append(varNames(i));
814 if (varNames(i) ==
':' || i == n) {
818 DataInfo().AddVariable( format_obj );
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
Ssiz_t Last(char c) const
Find last occurrence of a character c.
virtual const std::vector< Float_t > & GetMulticlassValues()
const DataSetInfo & DataInfo() const
MsgLogger & Endl(MsgLogger &ml)
virtual Double_t GetMvaValue(Double_t *errLower=0, Double_t *errUpper=0)=0
virtual ~Reader(void)
destructor
void AddVariable(const TString &expression, Float_t *)
Add a float variable or expression to the reader.
TString & ReplaceAll(const TString &s1, const TString &s2)
void SetTestSignalEfficiency(Double_t effS)
const std::vector< Float_t > & EvaluateRegression(const TString &methodTag, Double_t aux=0)
evaluates MVA for given set of input variables
const std::vector< Float_t > & GetRegressionValues(const TMVA::Event *const ev)
static const char * filename()
Double_t GetRarity(const TString &methodTag, Double_t mvaVal=-9999999)
evaluates the MVA's rarity
static std::string format(double x, double y, int digits, int width)
void FreeDoc(XMLDocPointer_t xmldoc)
frees allocated document data and deletes document itself
const TString & GetMethodName() const
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
void DecodeVarNames(const std::string &varNames)
decodes "name1:name2:..." form
static Types & Instance()
the the single instance of "Types" if existin already, or create it (Signleton)
TString GetMethodTypeFromFile(const TString &filename)
read the method type from the file
DataInputHandler fDataInputHandler
void Init(TClassEdit::TInterpreterLookupHelper *helper)
void DeclareOptions()
declaration of configuration options
void ReadStateFromFile()
Function to write options and weights to file.
ClassImp(TMVA::Reader) TMVA
constructor
TString & Append(const char *cs)
virtual void ParseOptions()
options parser
virtual const char * GetName() const
Returns name of object.
void SetupMethod()
setup of methods
IMethod * BookMVA(const TString &methodTag, const TString &weightfile)
read method name from weight file
Types::EMVA GetMethodType() const
virtual Double_t GetProba(const Event *ev)
DataSetManager * fDataSetManager
UInt_t GetNVariables() const
accessor to the number of variables
void ReadStateFromXMLString(const char *xmlstr)
for reading from memory
std::string GetMethodName(TCppMethod_t)
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
DataSetInfo & AddDataSetInfo(DataSetInfo &dsi)
stores a copy of the dataset info object
const Event * GetEvent() const
DataSetManager * fDataSetManager
Reader(const TString &theOption="", Bool_t verbose=0)
XMLDocPointer_t ParseFile(const char *filename, Int_t maxbuf=100000)
Parses content of file and tries to produce xml structures.
virtual void CheckSetup()
check may be overridden by derived class (sometimes, eg, fitters are used which can only be implement...
void AddSpectator(const TString &expression, Float_t *)
Add a float spectator or expression to the reader.
RooCmdArg Verbose(Bool_t flag=kTRUE)
Double_t EvaluateMVA(const std::vector< Float_t > &, const TString &methodTag, Double_t aux=0)
Evaluate a std::vector of input data for a given method The parameter aux is obligatory for th...
void Init(void)
default initialisation (no member variables) default initialisation (no member variables) ...
void SetUseColor(Bool_t uc)
void SetConfigName(const char *n)
Abstract ClassifierFactory template that handles arbitrary types.
IMethod * FindMVA(const TString &methodTag)
return pointer to method with tag "methodTag"
virtual void DeclareCompatibilityOptions()
options that are used ONLY for the READER to ensure backward compatibility they are hence without any...
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
XMLNodePointer_t DocGetRootElement(XMLDocPointer_t xmldoc)
returns root node of document
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 ...
virtual Double_t GetRarity(Double_t mvaVal, Types::ESBType reftype=Types::kBackground) const
compute rarity: R(x) = Integrate_[-oo..x] { PDF(x') dx' } where PDF(x) is the PDF of the classifier's...
TString GetMethodTypeName() const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Double_t GetProba(const TString &methodTag, Double_t ap_sig=0.5, Double_t mvaVal=-9999999)
evaluates probability of MVA for given set of input variables
const std::vector< Float_t > & EvaluateMulticlass(const TString &methodTag, Double_t aux=0)
evaluates MVA for given set of input variables
void Resize(Ssiz_t n)
Resize the string. Truncate or add blanks as necessary.
MethodCuts * FindCutsMVA(const TString &methodTag)
special function for Cuts to avoid dynamic_casts in ROOT macros, which are not properly handled by CI...