40 #ifndef ROOT_TMVA_Config
43 #ifndef ROOT_TMVA_DataSet
46 #ifndef ROOT_TMVA_Event
49 #ifndef ROOT_TMVA_MsgLogger
52 #ifndef ROOT_TMVA_Ranking
55 #ifndef ROOT_TMVA_Tools
58 #ifndef ROOT_TMVA_TransformationHandler
61 #ifndef ROOT_TMVA_VariableTransformBase
77 fCallerName (callerName),
93 std::vector<Ranking*>::const_iterator it = fRanking.begin();
94 for (; it != fRanking.end(); it++)
delete *it;
96 fTransformations.SetOwner();
105 fLogger->SetSource(
TString(
"TFHandler_" + fCallerName).
Data() );
114 fTransformations.Add(trf);
115 fTransformationsReferenceClasses.push_back( cls );
124 Log() <<
kWARNING <<
"Variable \"" << Variable(ivar).GetExpression()
125 <<
"\" has zero or negative RMS^2 "
126 <<
"==> set to zero. Please check the variable content" <<
Endl;
131 fVariableStats.at(k).at(ivar) = stat;
140 for (
UInt_t i = 0; i < fTransformationsReferenceClasses.size(); i++) {
141 fTransformationsReferenceClasses.at( i ) = cls;
151 std::vector<Int_t>::const_iterator rClsIt = fTransformationsReferenceClasses.begin();
152 const Event* trEv = ev;
154 if (rClsIt == fTransformationsReferenceClasses.end())
Log() <<
kFATAL<<
"invalid read in TransformationHandler::Transform " <<
Endl;
155 trEv = trf->Transform(trEv, (*rClsIt) );
165 if (fTransformationsReferenceClasses.empty()){
171 std::vector< Int_t >::const_iterator rClsIt = fTransformationsReferenceClasses.end();
173 const Event* trEv = ev;
174 UInt_t nvars = 0, ntgts = 0, nspcts = 0;
176 if (trf->IsCreated()) {
177 trf->CountVariableTypes( nvars, ntgts, nspcts );
178 if( !(suppressIfNoTargets && ntgts==0) )
179 trEv = trf->InverseTransform(ev, (*rClsIt) );
210 if (fTransformations.GetEntries() <= 0)
217 std::vector<Event*> *transformedEvents =
new std::vector<TMVA::Event*>(events.size());
218 for (
UInt_t ievt = 0; ievt<events.size(); ievt++)
219 transformedEvents->at(ievt) =
new Event(*events.at(ievt));
222 std::vector< Int_t >::iterator rClsIt = fTransformationsReferenceClasses.begin();
224 if (trf->PrepareTransformation(*transformedEvents)) {
225 for (
UInt_t ievt = 0; ievt<transformedEvents->size(); ievt++) {
226 *(*transformedEvents)[ievt] = *trf->Transform((*transformedEvents)[ievt],(*rClsIt));
232 CalcStats(*transformedEvents);
235 PlotVariables(*transformedEvents);
239 if (!createNewVector) {
240 for (
UInt_t ievt = 0; ievt<transformedEvents->size(); ievt++)
241 delete (*transformedEvents)[ievt];
242 delete transformedEvents;
243 transformedEvents=
NULL;
246 return transformedEvents;
256 UInt_t nevts = events.size();
259 Log() <<
kFATAL <<
"No events available to find min, max, mean and rms" <<
Endl;
262 const UInt_t nvar = events[0]->GetNVariables();
263 const UInt_t ntgt = events[0]->GetNTargets();
271 for (
Int_t cls=0; cls<fNumC; cls++) {
275 varMin[cls] =
new Double_t[nvar+ntgt];
276 varMax[cls] =
new Double_t[nvar+ntgt];
277 for (
UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
278 x0[cls][ivar] = x2[cls][ivar] = 0;
279 varMin[cls][ivar] = DBL_MAX;
280 varMax[cls][ivar] = -DBL_MAX;
284 for (
UInt_t ievt=0; ievt<nevts; ievt++) {
285 const Event* ev = events[ievt];
289 sumOfWeights[cls] += weight;
290 if (fNumC > 1 ) sumOfWeights[fNumC-1] += weight;
291 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++ ){
292 UInt_t nloop = ( var_tgt==0?nvar:ntgt );
293 for (
UInt_t ivar=0; ivar<nloop; ivar++) {
296 if (x < varMin[cls][(var_tgt*nvar)+ivar]) varMin[cls][(var_tgt*nvar)+ivar]=
x;
297 if (x > varMax[cls][(var_tgt*nvar)+ivar]) varMax[cls][(var_tgt*nvar)+ivar]=
x;
299 x0[cls][(var_tgt*nvar)+ivar] += x*weight;
300 x2[cls][(var_tgt*nvar)+ivar] += x*x*weight;
303 if (x < varMin[fNumC-1][(var_tgt*nvar)+ivar]) varMin[fNumC-1][(var_tgt*nvar)+ivar]=
x;
304 if (x > varMax[fNumC-1][(var_tgt*nvar)+ivar]) varMax[fNumC-1][(var_tgt*nvar)+ivar]=
x;
306 x0[fNumC-1][(var_tgt*nvar)+ivar] += x*weight;
307 x2[fNumC-1][(var_tgt*nvar)+ivar] += x*x*weight;
315 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++ ){
316 UInt_t nloop = ( var_tgt==0?nvar:ntgt );
317 for (
UInt_t ivar=0; ivar<nloop; ivar++) {
318 for (
Int_t cls = 0; cls < fNumC; cls++) {
319 Double_t mean = x0[cls][(var_tgt*nvar)+ivar]/sumOfWeights[cls];
321 AddStats(cls, (var_tgt*nvar)+ivar, mean, rms, varMin[cls][(var_tgt*nvar)+ivar], varMax[cls][(var_tgt*nvar)+ivar]);
328 UInt_t maxL = 8, maxV = 0;
329 std::vector<UInt_t> vLengths;
330 for (
UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
338 UInt_t clen = maxL + 4*maxV + 11;
339 for (
UInt_t i=0; i<clen; i++)
Log() <<
"-";
342 Log() << std::setw(maxL) <<
"Variable";
343 Log() <<
" " << std::setw(maxV) <<
"Mean";
344 Log() <<
" " << std::setw(maxV) <<
"RMS";
345 Log() <<
" " << std::setw(maxV) <<
"[ Min ";
346 Log() <<
" " << std::setw(maxV) <<
" Max ]" <<
Endl;;
347 for (
UInt_t i=0; i<clen; i++)
Log() <<
"-";
352 for (
UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
354 Log() << std::setw(maxL) << Variable(ivar).GetLabel() <<
":";
356 Log() << std::setw(maxL) << Target(ivar-nvar).GetLabel() <<
":";
357 Log() << std::setw(maxV) <<
Form( format.
Data(), GetMean(ivar) );
358 Log() << std::setw(maxV) <<
Form( format.
Data(), GetRMS(ivar) );
359 Log() <<
" [" << std::setw(maxV) <<
Form( format.
Data(), GetMin(ivar) );
360 Log() << std::setw(maxV) <<
Form( format.
Data(), GetMax(ivar) ) <<
" ]";
363 for (
UInt_t i=0; i<clen; i++)
Log() <<
"-";
367 delete[] sumOfWeights;
368 for (
Int_t cls=0; cls<fNumC; cls++) {
371 delete [] varMin[cls];
372 delete [] varMax[cls];
386 std::vector< Int_t >::const_iterator rClsIt = fTransformationsReferenceClasses.begin();
389 trf->MakeFunction(fout, fncName, part, trCounter++, (*rClsIt) );
393 for (
Int_t i=0; i<fTransformations.GetSize(); i++) {
394 fout <<
" void InitTransform_"<<i+1<<
"();" << std::endl;
395 fout <<
" void Transform_"<<i+1<<
"( std::vector<double> & iv, int sigOrBgd ) const;" << std::endl;
400 fout <<
"//_______________________________________________________________________" << std::endl;
401 fout <<
"inline void " << fncName <<
"::InitTransform()" << std::endl;
402 fout <<
"{" << std::endl;
403 for (
Int_t i=0; i<fTransformations.GetSize(); i++)
404 fout <<
" InitTransform_"<<i+1<<
"();" << std::endl;
405 fout <<
"}" << std::endl;
407 fout <<
"//_______________________________________________________________________" << std::endl;
408 fout <<
"inline void " << fncName <<
"::Transform( std::vector<double>& iv, int sigOrBgd ) const" << std::endl;
409 fout <<
"{" << std::endl;
410 for (
Int_t i=0; i<fTransformations.GetSize(); i++)
411 fout <<
" Transform_"<<i+1<<
"( iv, sigOrBgd );" << std::endl;
413 fout <<
"}" << std::endl;
439 if (fTransformations.GetSize() >= 1) {
440 if (fTransformations.GetSize() > 1 ||
442 xtit +=
" (" + GetName() +
")";
456 if (fRootBaseDir==0 && theDirectory == 0)
return;
458 Log() <<
kINFO <<
"Plot event variables for ";
460 else Log() << GetName() <<
Endl;
464 if (theDirectory == 0) {
466 transfType += GetName();
471 const UInt_t nvar = fDataSetInfo.GetNVariables();
472 const UInt_t ntgt = fDataSetInfo.GetNTargets();
473 const Int_t ncls = fDataSetInfo.GetNClasses();
477 std::vector<std::vector<TH1*> > hVars( ncls );
478 std::vector<std::vector<std::vector<TH2F*> > > mycorr( ncls );
479 std::vector<std::vector<std::vector<TProfile*> > > myprof( ncls );
481 for (
Int_t cls = 0; cls < ncls; cls++) {
482 hVars.at(cls).resize ( nvar+ntgt );
483 hVars.at(cls).assign ( nvar+ntgt, 0 );
484 mycorr.at(cls).resize( nvar+ntgt );
485 myprof.at(cls).resize( nvar+ntgt );
486 for (
UInt_t ivar=0; ivar < nvar+ntgt; ivar++) {
487 mycorr.at(cls).at(ivar).resize( nvar+ntgt );
488 myprof.at(cls).at(ivar).resize( nvar+ntgt );
489 mycorr.at(cls).at(ivar).assign( nvar+ntgt, 0 );
490 myprof.at(cls).at(ivar).assign( nvar+ntgt, 0 );
497 if (nvar+ntgt > (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
498 Int_t nhists = (nvar+ntgt)*(nvar+ntgt - 1)/2;
500 Log() <<
kINFO <<
"<PlotVariables> Will not produce scatter plots ==> " <<
Endl;
502 <<
"| The number of " << nvar <<
" input variables and " << ntgt <<
" target values would require "
503 << nhists <<
" two-dimensional" <<
Endl;
505 <<
"| histograms, which would occupy the computer's memory. Note that this" <<
Endl;
507 <<
"| suppression does not have any consequences for your analysis, other" <<
Endl;
509 <<
"| than not disposing of these scatter plots. You can modify the maximum" <<
Endl;
511 <<
"| number of input variables allowed to generate scatter plots in your" <<
Endl;
512 Log() <<
"| script via the command line:" <<
Endl;
514 <<
"| \"(TMVA::gConfig().GetVariablePlotting()).fMaxNumOfAllowedVariablesForScatterPlots = <some int>;\""
524 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++) {
525 UInt_t nloops = ( var_tgt == 0? nvar:ntgt );
526 for (
UInt_t ivar=0; ivar<nloops; ivar++) {
527 const VariableInfo& info = ( var_tgt == 0 ? Variable( ivar ) : Target(ivar) );
530 Double_t mean = fVariableStats.at(fNumC-1).at( ( var_tgt*nvar )+ivar).fMean;
531 Double_t rms = fVariableStats.at(fNumC-1).at( ( var_tgt*nvar )+ivar).fRMS;
533 for (
Int_t cls = 0; cls < ncls; cls++) {
535 TString className = fDataSetInfo.GetClassInfo(cls)->GetName();
538 className += (ntgt == 1 && var_tgt == 1 ?
"_target" :
"");
557 if (xmin >= xmax) xmax = xmin*1.1;
558 if (xmin >= xmax) xmax = xmin + 1;
560 xmax += (xmax -
xmin)/nbins1D;
568 hVars.at(cls).at((var_tgt*nvar)+ivar) =
h;
571 if (nvar+ntgt <= (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
573 for (
UInt_t v_t = 0; v_t < 2; v_t++) {
574 UInt_t nl = ( v_t==0?nvar:ntgt );
575 UInt_t start = ( v_t==0? (var_tgt==0?ivar+1:0):(var_tgt==0?nl:ivar+1) );
576 for (
UInt_t j=start; j<nl; j++) {
578 const VariableInfo& infoj = ( v_t == 0 ? Variable( j ) : Target(j) );
581 Double_t rxmin = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+ivar).fMin;
582 Double_t rxmax = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+ivar).fMax;
583 Double_t rymin = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+j).fMin;
584 Double_t rymax = fVariableStats.at(fNumC-1).at( ( v_t*nvar )+j).fMax;
588 className.
Data(), transfType.
Data() ),
590 className.
Data(), transfType.
Data() ),
591 nbins2D, rxmin , rxmax,
592 nbins2D, rymin , rymax );
596 mycorr.at(cls).at((var_tgt*nvar)+ivar).at((v_t*nvar)+j) = h2;
602 Form(
"profile %s versus %s (%s)%s",
604 className.
Data(), transfType.
Data() ), nbins1D,
610 myprof.at(cls).at((var_tgt*nvar)+ivar).at((v_t*nvar)+j) = p;
618 UInt_t nevts = events.size();
621 std::vector<Double_t> xregmean ( nvar+1, 0 );
622 std::vector<Double_t> x2regmean( nvar+1, 0 );
623 std::vector<Double_t> xCregmean( nvar+1, 0 );
626 for (
UInt_t ievt=0; ievt<nevts; ievt++) {
628 const Event* ev = events[ievt];
636 xregmean[nvar] += valr;
637 x2regmean[nvar] += valr*valr;
638 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
640 xregmean[ivar] += vali;
641 x2regmean[ivar] += vali*vali;
642 xCregmean[ivar] += vali*valr;
647 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++) {
648 UInt_t nloops = ( var_tgt == 0? nvar:ntgt );
649 for (
UInt_t ivar=0; ivar<nloops; ivar++) {
653 hVars.at(cls).at( ( var_tgt*nvar )+ivar)->Fill( vali, weight );
656 if (nvar+ntgt <= (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
658 for (
UInt_t v_t = 0; v_t < 2; v_t++) {
659 UInt_t nl = ( v_t==0 ? nvar : ntgt );
660 UInt_t start = ( v_t==0 ? (var_tgt==0?ivar+1:0) : (var_tgt==0?nl:ivar+1) );
661 for (
UInt_t j=start; j<nl; j++) {
663 mycorr.at(cls).at( ( var_tgt*nvar )+ivar).at( ( v_t*nvar )+j)->Fill( vali, valj, weight );
664 myprof.at(cls).at( ( var_tgt*nvar )+ivar).at( ( v_t*nvar )+j)->Fill( vali, valj, weight );
674 for (
UInt_t ivar=0; ivar<=nvar; ivar++) {
675 xregmean[ivar] /= nevts;
676 x2regmean[ivar] = x2regmean[ivar]/nevts - xregmean[ivar]*xregmean[ivar];
678 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
679 xCregmean[ivar] = xCregmean[ivar]/nevts - xregmean[ivar]*xregmean[nvar];
680 xCregmean[ivar] /=
TMath::Sqrt( x2regmean[ivar]*x2regmean[nvar] );
683 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"|Correlation with target|" ) );
684 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
686 fRanking.back()->AddRank(
Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), abscor ) );
692 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Mutual information" ) );
693 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
694 TH2F*
h1 = mycorr.at(0).at( nvar ).at( ivar );
696 fRanking.back()->AddRank(
Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), mi ) );
700 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Correlation Ratio" ) );
701 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
702 TH2F* h2 = mycorr.at(0).at( nvar ).at( ivar );
704 fRanking.back()->AddRank(
Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), cr ) );
708 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Correlation Ratio (T)" ) );
709 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
712 fRanking.back()->AddRank(
Rank( fDataSetInfo.GetVariableInfo(ivar).GetLabel(), cr ) );
719 else if (fDataSetInfo.GetNClasses() == 2
720 && fDataSetInfo.GetClassInfo(
"Signal") !=
NULL
721 && fDataSetInfo.GetClassInfo(
"Background") !=
NULL
723 fRanking.push_back(
new Ranking( GetName() +
"Transformation",
"Separation" ) );
724 for (
UInt_t i=0; i<nvar; i++) {
726 hVars.at(fDataSetInfo.GetClassInfo(
"Background")->GetNumber()).
at(i) );
727 fRanking.back()->AddRank(
Rank( hVars.at(fDataSetInfo.GetClassInfo(
"Signal")->GetNumber()).
at(i)->
GetTitle(),
737 if (theDirectory == 0) {
743 outputDir +=
"_" +
TString(trf->GetShortName());
745 TString uniqueOutputDir = outputDir;
748 while( (o = fRootBaseDir->
FindObject(uniqueOutputDir)) != 0 ){
749 uniqueOutputDir = outputDir+
Form(
"_%d",counter);
751 << fRootBaseDir->GetPath() <<
", I will try with "<<uniqueOutputDir<<
"." <<
Endl;
760 localDir = fRootBaseDir->
mkdir( uniqueOutputDir );
769 for (
UInt_t i=0; i<nvar+ntgt; i++) {
770 for (
Int_t cls = 0; cls < ncls; cls++) {
771 if (hVars.at(cls).at(i) != 0) {
772 hVars.at(cls).at(i)->Write();
773 hVars.at(cls).at(i)->SetDirectory(0);
774 delete hVars.at(cls).at(i);
780 if (nvar+ntgt <= (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
782 localDir = localDir->
mkdir(
"CorrelationPlots" );
784 Log() <<
kINFO <<
"Create scatter and profile plots in target-file directory: " <<
Endl;
788 for (
UInt_t i=0; i<nvar+ntgt; i++) {
789 for (
UInt_t j=i+1; j<nvar+ntgt; j++) {
790 for (
Int_t cls = 0; cls < ncls; cls++) {
791 if (mycorr.at(cls).at(i).at(j) != 0 ) {
792 mycorr.at(cls).at(i).at(j)->Write();
793 mycorr.at(cls).at(i).at(j)->SetDirectory(0);
794 delete mycorr.at(cls).at(i).at(j);
796 if (myprof.at(cls).at(i).at(j) != 0) {
797 myprof.at(cls).at(i).at(j)->Write();
798 myprof.at(cls).at(i).at(j)->SetDirectory(0);
799 delete myprof.at(cls).at(i).at(j);
805 if (theDirectory != 0 ) theDirectory->
cd();
806 else fRootBaseDir->cd();
835 std::vector< Int_t >::const_iterator rClsIt = fTransformationsReferenceClasses.begin();
837 o <<
"NTransformtations " << fTransformations.GetSize() << std::endl << std::endl;
842 o <<
"#TR -*-*-*-*-*-*-* transformation " << i++ <<
": " << trf->
GetName() <<
" -*-*-*-*-*-*-*-" << std::endl;
843 trf->WriteTransformationToStream(o);
844 ci = fDataSetInfo.GetClassInfo( (*rClsIt) );
846 if (ci == 0 ) clsName =
"AllClasses";
848 o <<
"ReferenceClass " << clsName << std::endl;
862 gTools().
AddAttr( trfs,
"NTransformations", fTransformations.GetSize() );
873 Log() <<
kFATAL <<
"Read transformations not implemented" <<
Endl;
889 if (trfname ==
"Decorrelation" ) {
892 else if (trfname ==
"PCA" ) {
895 else if (trfname ==
"Gauss" ) {
898 else if (trfname ==
"Uniform" ) {
901 else if (trfname ==
"Normalize" ) {
904 else if (trfname ==
"Rearrange" ) {
907 else if (trfname !=
"None") {
910 Log() <<
kFATAL <<
"<ReadFromXML> Variable transform '"
911 << trfname <<
"' unknown." <<
Endl;
914 AddTransformation( newtrf, idxCls );
925 Log() <<
kINFO <<
"Ranking input variables (method unspecific)..." <<
Endl;
926 std::vector<Ranking*>::const_iterator it = fRanking.begin();
927 for (; it != fRanking.end(); it++) (*it)->
Print();
935 return fVariableStats.at(cls).at(ivar).fMean;
939 return fVariableStats.at(fNumC-1).at(ivar).fMean;
942 Log() <<
kWARNING <<
"Inconsistent variable state when reading the mean value. " <<
Endl;
945 Log() <<
kWARNING <<
"Inconsistent variable state when reading the mean value. Value 0 given back" <<
Endl;
955 return fVariableStats.at(cls).at(ivar).fRMS;
959 return fVariableStats.at(fNumC-1).at(ivar).fRMS;
962 Log() <<
kWARNING <<
"Inconsistent variable state when reading the RMS value. " <<
Endl;
965 Log() <<
kWARNING <<
"Inconsistent variable state when reading the RMS value. Value 0 given back" <<
Endl;
974 return fVariableStats.at(cls).at(ivar).fMin;
978 return fVariableStats.at(fNumC-1).at(ivar).fMin;
981 Log() <<
kWARNING <<
"Inconsistent variable state when reading the minimum value. " <<
Endl;
984 Log() <<
kWARNING <<
"Inconsistent variable state when reading the minimum value. Value 0 given back" <<
Endl;
993 return fVariableStats.at(cls).at(ivar).fMax;
997 return fVariableStats.at(fNumC-1).at(ivar).fMax;
1000 Log() <<
kWARNING <<
"Inconsistent variable state when reading the maximum value. " <<
Endl;
1003 Log() <<
kWARNING <<
"Inconsistent variable state when reading the maximum value. Value 0 given back" <<
Endl;
Int_t fMaxNumOfAllowedVariablesForScatterPlots
static Vc_ALWAYS_INLINE int_v min(const int_v &x, const int_v &y)
MsgLogger & Endl(MsgLogger &ml)
UInt_t GetNClasses() const
UInt_t GetNTargets() const
Short_t Min(Short_t a, Short_t b)
virtual TDirectory * mkdir(const char *name, const char *title="")
Create a sub-directory and return a pointer to the created directory.
static std::string format(double x, double y, int digits, int width)
Double_t GetWeight() const
return the event weight - depending on whether the flag IgnoreNegWeightsInTraining is or not...
UInt_t GetNVariables() const
virtual const char * GetPath() const
Returns the full path of the directory.
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
const TString & GetInternalName() const
const char * Data() const
static const double x2[5]
std::vector< std::vector< double > > Data
virtual void Print(Option_t *option="") const
This method must be overridden when a class wants to print itself.
const TString & GetTitle() const
const TString & GetUnit() const
2-D histogram with a float per channel (see TH1 documentation)}
virtual const char * ClassName() const
Returns name of class to which the object belongs.
char * Form(const char *fmt,...)
const TString & GetName() const
virtual const char * GetName() const
Returns name of object.
virtual const char * GetName() const
Returns name of object.
Describe directory structure in memory.
static Vc_ALWAYS_INLINE int_v max(const int_v &x, const int_v &y)
Mother of all ROOT objects.
Float_t GetTarget(UInt_t itgt) const
void SetSource(const std::string &source)
virtual Bool_t cd(const char *path=0)
Change current directory to "this" directory.
Short_t Max(Short_t a, Short_t b)
Double_t Sqrt(Double_t x)
const Bool_t kIterBackward
virtual const char * GetTitle() const
Returns title of object.
virtual void SetTitle(const char *title="")
Change (i.e. set) the title of the TNamed.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
VariablePlotting & GetVariablePlotting()