64 #pragma warning ( disable : 4355 )
71 : fOptions ( theOption ),
72 fLooseOptionCheckingEnabled (
kTRUE ),
73 fLastDeclaredOption ( 0 ),
74 fConfigName (
"Configurable" ),
75 fConfigDescription (
"No description" ),
76 fReferenceFile (
"None" ),
77 fLogger ( new MsgLogger(this) )
79 fListOfOptions.SetOwner();
100 while (splitOpt.
Length()>0) {
108 splitOpt = splitOpt(splitOpt.
First(
':')+1,splitOpt.
Length());
131 TString optionsWithoutTilde(fOptions);
140 SplitOptions(fOptions, loo);
144 std::map<TString, std::vector<std::pair<Int_t, TString> > > arrayTypeOptions;
173 if (decOpt==0 && optname.
Contains(
'[')) {
178 std::stringstream str(st.
Data());
188 <<
" was previously set to " << decOpt->
GetValue() <<
Endl;
199 Log() <<
kFATAL <<
"Index " << idx <<
" too large for option " << decOpt->
TheName()
206 <<
" is not an array, but you specified an index" <<
Endl;
212 <<
" does not have predefined value: \"" << optval <<
"\"" <<
Endl;
229 if (predOptName == optname) optionExists =
kTRUE;
231 if (predOptName == optname)
break;
236 decOpt->
SetValue( hasNotSign ?
"0" :
"1" );
240 if (optionExists && hasNotSign) {
241 Log() <<
kFATAL <<
"Negating a non-boolean variable " << optname
242 <<
", please check the opions for method: " << GetName() <<
Endl;
248 if (!paramParsed && LooseOptionCheckingEnabled()) {
253 if (decOpt->HasPreDefinedVal() && decOpt->IsPreDefinedVal(s) ) {
254 paramParsed = decOpt->SetValue(s);
260 if (fOptions!=
"") fOptions +=
":";
261 if (paramParsed || preserveTilde) fOptions +=
'~';
262 if (preserveNotSign) fOptions +=
'!';
268 if (
gConfig().WriteOptionsReference()) WriteOptionsReferenceToFile();
281 SplitOptions(theOpt, loo);
289 if (unusedOptions !=
"") unusedOptions +=
':';
293 if (unusedOptions !=
"") {
295 <<
"The following options were specified, but could not be interpreted: \'"
296 << unusedOptions <<
"\', please check!" <<
Endl;
330 o << prefix <<
"# Set by User:" << std::endl;
332 if (opt->IsSet()) { o << prefix; opt->Print(o); o << std::endl; }
334 o << prefix <<
"# Default:" << std::endl;
336 if (!opt->IsSet()) { o << prefix; opt->Print(o); o << std::endl; }
337 o << prefix <<
"##" << std::endl;
350 if (opt->IsArrayOpt()) {
351 std::stringstream s(
"");
353 for(
Int_t i=0; i<opt->GetArraySize(); i++) {
355 s << std::scientific << opt->GetValue(i);
363 if (opt->IsArrayOpt()) {
366 gTools().
AddAttr(optnode,
"modified", (opt->IsSet()?
"Yes":
"No") );
378 if (fOptions.Length()!=0) fOptions +=
":";
381 std::stringstream s(
"");
383 if (
gTools().HasAttr(opt,
"size")) {
387 for(
UInt_t i=0; i<size; i++) {
389 s << std::scientific << optName <<
"[" << i <<
"]=" << values[i];
393 s << std::scientific << optName <<
"=" << optValue;
395 fOptions += s.str().c_str();
407 fReferenceFile = dir +
"/" + GetConfigName() +
"_optionsRef.txt";
408 std::ofstream o( fReferenceFile );
410 Log() <<
kFATAL <<
"<WriteOptionsToInfoFile> Unable to open output file: " << fReferenceFile <<
Endl;
414 o <<
"# List of options:" << std::endl;
415 o <<
"# Configurable: " << GetConfigName() << std::endl;
416 o <<
"# Description: " << GetConfigDescription() << std::endl;
419 o << std::endl <<
"# ------------------------------------------------" << std::endl;
423 Log() <<
kVERBOSE <<
"Wrote options reference file: \"" << fReferenceFile <<
"\"" <<
Endl;
437 istr.getline(buf,512);
439 while (istr.good() && !istr.eof() && !(buf[0]==
'#' && buf[1]==
'#')) {
441 while (*p==
' ' || *p==
'\t') p++;
442 if (*p==
'#' || *p==
'\0') {
443 istr.getline(buf,512);
446 std::stringstream sstr(buf);
447 sstr >> stropt >> strval;
450 if (fOptions.Length()!=0) fOptions +=
":";
453 istr.getline(buf,512);
TString fOptionsReferenceFileDir
void AddOptionsXMLTo(void *parent) const
write options to XML file
MsgLogger & Endl(MsgLogger &ml)
void ReadOptionsFromXML(void *node)
Collectable string class.
void ReadOptionsFromStream(std::istream &istr)
read option back from the weight file
TString & ReplaceAll(const TString &s1, const TString &s2)
void CheckForUnusedOptions() const
checks for unused options in option string
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
std::vector< double > values
virtual ~Configurable()
default destructur
virtual int MakeDirectory(const char *name)
Make a directory.
virtual Bool_t IsArrayOpt() const =0
void ToLower()
Change string to lower-case.
void SplitOptions(const TString &theOpt, TList &loo) const
splits the option string at ':' and fills the list 'loo' with the primitive strings ...
virtual TString GetValue(Int_t i=-1) const =0
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
void WriteOptionsToStream(std::ostream &o, const TString &prefix) const
write options to output stream (e.g. in writing the MVA weight files
const char * Data() const
virtual void ParseOptions()
options parser
virtual Bool_t SetValue(const TString &vs, Int_t i=-1)
set value for option
void PrintOptions() const
prints out the options set in the options string and the defaults
R__EXTERN TSystem * gSystem
virtual const char * TheName() const
void WriteOptionsReferenceToFile()
write complete options to output stream
TSubString Strip(EStripType s=kTrailing, char c= ' ') const
Return a substring of self stripped at beginning and/or end.
Configurable(const TString &theOption="")
virtual Bool_t HasPreDefinedVal() const =0
virtual Int_t GetArraySize() const =0
TString & Remove(Ssiz_t pos)
void ResetSetFlag()
resets the IsSet falg for all declare options to be called before options are read from stream ...
virtual Bool_t IsPreDefinedVal(const TString &) const =0
virtual void Add(TObject *obj)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void Reset()
Reset list iterator.
TString()
TString default ctor.
ClassImp(TMVA::Configurable) TMVA
constructor
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
virtual const char * GetName() const
Returns name of object.
Ssiz_t First(char c) const
Find first occurrence of a character c.