88 std::vector<Ranking*>::const_iterator it =
fRanking.begin();
89 for (; it !=
fRanking.end(); ++it)
delete *it;
127 Log() << kWARNING <<
"Variable \"" <<
Variable(ivar).GetExpression()
128 <<
"\" has zero, negative, or NaN RMS^2: "
130 <<
" ==> set to zero. Please check the variable content" <<
Endl;
156 const Event* trEv = ev;
159 trEv = trf->Transform(trEv, (*rClsIt) );
178 const Event* trEv = ev;
179 UInt_t nvars = 0, ntgts = 0, nspcts = 0;
181 if (trf->IsCreated()) {
182 trf->CountVariableTypes( nvars, ntgts, nspcts );
183 if( !(suppressIfNoTargets && ntgts==0) )
184 trEv = trf->InverseTransform(ev, (*rClsIt) );
187 if (rClsIt > rClsBegin)
223 std::vector<Event*> *transformedEvents =
new std::vector<TMVA::Event*>(events.size());
224 for (
UInt_t ievt = 0; ievt<events.size(); ievt++)
225 transformedEvents->at(ievt) =
new Event(*events.at(ievt));
230 if (trf->PrepareTransformation(*transformedEvents)) {
231 for (
UInt_t ievt = 0; ievt<transformedEvents->size(); ievt++) {
232 *(*transformedEvents)[ievt] = *trf->Transform((*transformedEvents)[ievt],(*rClsIt));
245 if (!createNewVector) {
246 for (
UInt_t ievt = 0; ievt<transformedEvents->size(); ievt++)
247 delete (*transformedEvents)[ievt];
248 delete transformedEvents;
249 transformedEvents=NULL;
252 return transformedEvents;
261 UInt_t nevts = events.size();
264 Log() << kFATAL <<
"No events available to find min, max, mean and rms" <<
Endl;
267 const UInt_t nvar = events[0]->GetNVariables();
268 const UInt_t ntgt = events[0]->GetNTargets();
280 varMin[cls] =
new Double_t[nvar+ntgt];
281 varMax[cls] =
new Double_t[nvar+ntgt];
282 for (
UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
283 x0[cls][ivar] = x2[cls][ivar] = 0;
284 varMin[cls][ivar] = DBL_MAX;
285 varMax[cls][ivar] = -DBL_MAX;
289 for (
UInt_t ievt=0; ievt<nevts; ievt++) {
290 const Event* ev = events[ievt];
294 sumOfWeights[cls] += weight;
295 if (
fNumC > 1 ) sumOfWeights[
fNumC-1] += weight;
296 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++ ){
297 UInt_t nloop = ( var_tgt==0?nvar:ntgt );
298 for (
UInt_t ivar=0; ivar<nloop; ivar++) {
301 if (
x < varMin[cls][(var_tgt*nvar)+ivar]) varMin[cls][(var_tgt*nvar)+ivar]=
x;
302 if (
x > varMax[cls][(var_tgt*nvar)+ivar]) varMax[cls][(var_tgt*nvar)+ivar]=
x;
304 x0[cls][(var_tgt*nvar)+ivar] +=
x*weight;
305 x2[cls][(var_tgt*nvar)+ivar] +=
x*
x*weight;
308 if (
x < varMin[
fNumC-1][(var_tgt*nvar)+ivar]) varMin[
fNumC-1][(var_tgt*nvar)+ivar]=
x;
309 if (
x > varMax[
fNumC-1][(var_tgt*nvar)+ivar]) varMax[
fNumC-1][(var_tgt*nvar)+ivar]=
x;
311 x0[
fNumC-1][(var_tgt*nvar)+ivar] +=
x*weight;
312 x2[
fNumC-1][(var_tgt*nvar)+ivar] +=
x*
x*weight;
320 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++ ){
321 UInt_t nloop = ( var_tgt==0?nvar:ntgt );
322 for (
UInt_t ivar=0; ivar<nloop; ivar++) {
324 Double_t mean = x0[cls][(var_tgt*nvar)+ivar]/sumOfWeights[cls];
326 AddStats(cls, (var_tgt*nvar)+ivar, mean, rms, varMin[cls][(var_tgt*nvar)+ivar], varMax[cls][(var_tgt*nvar)+ivar]);
333 UInt_t maxL = 8, maxV = 0;
334 std::vector<UInt_t> vLengths;
335 for (
UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
343 UInt_t clen = maxL + 4*maxV + 11;
349 Log() << std::setw(maxL) <<
"Variable";
350 Log() <<
" " << std::setw(maxV) <<
"Mean";
351 Log() <<
" " << std::setw(maxV) <<
"RMS";
352 Log() <<
" " << std::setw(maxV) <<
"[ Min ";
353 Log() <<
" " << std::setw(maxV) <<
" Max ]"<<
Endl;
354 for (
UInt_t i=0; i<clen; i++)
Log() <<
"-";
359 for (
UInt_t ivar=0; ivar<nvar+ntgt; ivar++) {
361 Log() << std::setw(maxL) <<
Variable(ivar).GetLabel() <<
":";
363 Log() << std::setw(maxL) <<
Target(ivar-nvar).GetLabel() <<
":";
370 for (
UInt_t i=0; i<clen; i++)
Log() <<
"-";
374 delete[] sumOfWeights;
378 delete [] varMin[cls];
379 delete [] varMax[cls];
396 trf->MakeFunction(fout, fncName, part, trCounter++, (*rClsIt) );
401 fout <<
" void InitTransform_"<<i+1<<
"();" << std::endl;
402 fout <<
" void Transform_"<<i+1<<
"( std::vector<double> & iv, int sigOrBgd ) const;" << std::endl;
407 fout <<
"//_______________________________________________________________________" << std::endl;
408 fout <<
"inline void " << fncName <<
"::InitTransform()" << std::endl;
409 fout <<
"{" << std::endl;
411 fout <<
" InitTransform_"<<i+1<<
"();" << std::endl;
412 fout <<
"}" << std::endl;
414 fout <<
"//_______________________________________________________________________" << std::endl;
415 fout <<
"inline void " << fncName <<
"::Transform( std::vector<double>& iv, int sigOrBgd ) const" << std::endl;
416 fout <<
"{" << std::endl;
418 fout <<
" Transform_"<<i+1<<
"( iv, sigOrBgd );" << std::endl;
420 fout <<
"}" << std::endl;
449 xtit +=
" (" +
GetName() +
")";
465 Log() << kDEBUG <<
"Plot event variables for ";
471 if (theDirectory == 0) {
484 std::vector<std::vector<TH1*> > hVars( ncls );
485 std::vector<std::vector<std::vector<TH2F*> > > mycorr( ncls );
486 std::vector<std::vector<std::vector<TProfile*> > > myprof( ncls );
488 for (
Int_t cls = 0; cls < ncls; cls++) {
489 hVars.at(cls).resize ( nvar+ntgt );
490 hVars.at(cls).assign ( nvar+ntgt, 0 );
491 mycorr.at(cls).resize( nvar+ntgt );
492 myprof.at(cls).resize( nvar+ntgt );
493 for (
UInt_t ivar=0; ivar < nvar+ntgt; ivar++) {
494 mycorr.at(cls).at(ivar).resize( nvar+ntgt );
495 myprof.at(cls).at(ivar).resize( nvar+ntgt );
496 mycorr.at(cls).at(ivar).assign( nvar+ntgt, 0 );
497 myprof.at(cls).at(ivar).assign( nvar+ntgt, 0 );
504 if (nvar+ntgt > (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
505 Int_t nhists = (nvar+ntgt)*(nvar+ntgt - 1)/2;
507 Log() << kINFO <<
"<PlotVariables> Will not produce scatter plots ==> " <<
Endl;
509 <<
"| The number of " << nvar <<
" input variables and " << ntgt <<
" target values would require "
510 << nhists <<
" two-dimensional" <<
Endl;
512 <<
"| histograms, which would occupy the computer's memory. Note that this" <<
Endl;
514 <<
"| suppression does not have any consequences for your analysis, other" <<
Endl;
516 <<
"| than not disposing of these scatter plots. You can modify the maximum" <<
Endl;
518 <<
"| number of input variables allowed to generate scatter plots in your" <<
Endl;
519 Log() <<
"| script via the command line:" <<
Endl;
521 <<
"| \"(TMVA::gConfig().GetVariablePlotting()).fMaxNumOfAllowedVariablesForScatterPlots = <some int>;\""
524 Log() << kINFO <<
"Some more output" <<
Endl;
531 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++) {
532 UInt_t nloops = ( var_tgt == 0? nvar:ntgt );
533 for (
UInt_t ivar=0; ivar<nloops; ivar++) {
540 for (
Int_t cls = 0; cls < ncls; cls++) {
545 className += (ntgt == 1 && var_tgt == 1 ?
"_target" :
"");
575 hVars.at(cls).at((var_tgt*nvar)+ivar) =
h;
578 if (nvar+ntgt <= (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
580 for (
UInt_t v_t = 0; v_t < 2; v_t++) {
581 UInt_t nl = ( v_t==0?nvar:ntgt );
582 UInt_t start = ( v_t==0? (var_tgt==0?ivar+1:0):(var_tgt==0?nl:ivar+1) );
595 className.
Data(), transfType.
Data() ),
597 className.
Data(), transfType.
Data() ),
598 nbins2D, rxmin , rxmax,
599 nbins2D, rymin , rymax );
603 mycorr.at(cls).at((var_tgt*nvar)+ivar).at((v_t*nvar)+j) = h2;
611 className.
Data(), transfType.
Data() ), nbins1D,
617 myprof.at(cls).at((var_tgt*nvar)+ivar).at((v_t*nvar)+j) = p;
625 UInt_t nevts = events.size();
628 std::vector<Double_t> xregmean ( nvar+1, 0 );
629 std::vector<Double_t> x2regmean( nvar+1, 0 );
630 std::vector<Double_t> xCregmean( nvar+1, 0 );
633 for (
UInt_t ievt=0; ievt<nevts; ievt++) {
635 const Event* ev = events[ievt];
643 xregmean[nvar] += valr;
644 x2regmean[nvar] += valr*valr;
645 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
647 xregmean[ivar] += vali;
648 x2regmean[ivar] += vali*vali;
649 xCregmean[ivar] += vali*valr;
654 for (
UInt_t var_tgt = 0; var_tgt < 2; var_tgt++) {
655 UInt_t nloops = ( var_tgt == 0? nvar:ntgt );
656 for (
UInt_t ivar=0; ivar<nloops; ivar++) {
660 hVars.at(cls).at( ( var_tgt*nvar )+ivar)->Fill( vali, weight );
663 if (nvar+ntgt <= (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
665 for (
UInt_t v_t = 0; v_t < 2; v_t++) {
666 UInt_t nl = ( v_t==0 ? nvar : ntgt );
667 UInt_t start = ( v_t==0 ? (var_tgt==0?ivar+1:0) : (var_tgt==0?nl:ivar+1) );
670 mycorr.at(cls).at( ( var_tgt*nvar )+ivar).at( ( v_t*nvar )+j)->Fill( vali, valj, weight );
671 myprof.at(cls).at( ( var_tgt*nvar )+ivar).at( ( v_t*nvar )+j)->Fill( vali, valj, weight );
681 for (
UInt_t ivar=0; ivar<=nvar; ivar++) {
682 xregmean[ivar] /= nevts;
683 x2regmean[ivar] = x2regmean[ivar]/nevts - xregmean[ivar]*xregmean[ivar];
685 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
686 xCregmean[ivar] = xCregmean[ivar]/nevts - xregmean[ivar]*xregmean[nvar];
687 xCregmean[ivar] /=
TMath::Sqrt( x2regmean[ivar]*x2regmean[nvar] );
691 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
696 if (nvar+ntgt <= (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
700 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
701 TH2F*
h1 = mycorr.at(0).at( nvar ).at( ivar );
708 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
709 TH2F* h2 = mycorr.at(0).at( nvar ).at( ivar );
716 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
731 for (
UInt_t i=0; i<nvar; i++) {
733 hVars.at(
fDataSetInfo.GetClassInfo(
"Background")->GetNumber()).at(i) );
744 if (theDirectory == 0) {
750 outputDir +=
"_" +
TString(trf->GetShortName());
752 TString uniqueOutputDir = outputDir;
755 while( (o =
fRootBaseDir->FindObject(uniqueOutputDir)) !=
nullptr ){
757 Log() << kINFO <<
"A " << o->
ClassName() <<
" with name " << o->
GetName() <<
" already exists in "
758 <<
fRootBaseDir->GetPath() <<
", I will try with "<<uniqueOutputDir<<
"." <<
Endl;
770 Log() << kVERBOSE <<
"Create and switch to directory " << localDir->
GetPath() <<
Endl;
776 for (
UInt_t i=0; i<nvar+ntgt; i++) {
777 for (
Int_t cls = 0; cls < ncls; cls++) {
778 if (hVars.at(cls).at(i) != 0) {
779 hVars.at(cls).at(i)->Write();
780 hVars.at(cls).at(i)->SetDirectory(
nullptr);
781 delete hVars.at(cls).at(i);
787 if (nvar+ntgt <= (
UInt_t)
gConfig().GetVariablePlotting().fMaxNumOfAllowedVariablesForScatterPlots) {
789 localDir = localDir->
mkdir(
"CorrelationPlots" );
791 Log() << kDEBUG <<
"Create scatter and profile plots in target-file directory: " <<
Endl;
795 for (
UInt_t i=0; i<nvar+ntgt; i++) {
796 for (
UInt_t j=i+1; j<nvar+ntgt; j++) {
797 for (
Int_t cls = 0; cls < ncls; cls++) {
798 if (mycorr.at(cls).at(i).at(j) != 0 ) {
799 mycorr.at(cls).at(i).at(j)->Write();
800 mycorr.at(cls).at(i).at(j)->SetDirectory(
nullptr);
801 delete mycorr.at(cls).at(i).at(j);
803 if (myprof.at(cls).at(i).at(j) != 0) {
804 myprof.at(cls).at(i).at(j)->Write();
805 myprof.at(cls).at(i).at(j)->SetDirectory(
nullptr);
806 delete myprof.at(cls).at(i).at(j);
812 if (theDirectory != 0 ) theDirectory->
cd();
844 o <<
"NTransformtations " <<
fTransformations.GetSize() << std::endl << std::endl;
849 o <<
"#TR -*-*-*-*-*-*-* transformation " << i++ <<
": " << trf->GetName() <<
" -*-*-*-*-*-*-*-" << std::endl;
850 trf->WriteTransformationToStream(o);
853 if (ci == 0 ) clsName =
"AllClasses";
855 o <<
"ReferenceClass " << clsName << std::endl;
877 Log() << kFATAL <<
"Read transformations not implemented" <<
Endl;
893 if (trfname ==
"Decorrelation" ) {
896 else if (trfname ==
"PCA" ) {
899 else if (trfname ==
"Gauss" ) {
902 else if (trfname ==
"Uniform" ) {
905 else if (trfname ==
"Normalize" ) {
908 else if (trfname ==
"Rearrange" ) {
911 else if (trfname !=
"None") {
914 Log() << kFATAL <<
"<ReadFromXML> Variable transform '"
915 << trfname <<
"' unknown." <<
Endl;
929 Log() << kINFO <<
"Ranking input variables (method unspecific)..." <<
Endl;
930 std::vector<Ranking*>::const_iterator it =
fRanking.begin();
931 for (; it !=
fRanking.end(); ++it) (*it)->Print();
946 Log() << kWARNING <<
"Inconsistent variable state when reading the mean value. " <<
Endl;
949 Log() << kWARNING <<
"Inconsistent variable state when reading the mean value. Value 0 given back" <<
Endl;
965 Log() << kWARNING <<
"Inconsistent variable state when reading the RMS value. " <<
Endl;
968 Log() << kWARNING <<
"Inconsistent variable state when reading the RMS value. Value 0 given back" <<
Endl;
984 Log() << kWARNING <<
"Inconsistent variable state when reading the minimum value. " <<
Endl;
987 Log() << kWARNING <<
"Inconsistent variable state when reading the minimum value. Value 0 given back" <<
Endl;
1003 Log() << kWARNING <<
"Inconsistent variable state when reading the maximum value. " <<
Endl;
1006 Log() << kWARNING <<
"Inconsistent variable state when reading the maximum value. Value 0 given back" <<
Endl;
int Int_t
Signed integer 4 bytes (int).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
float Float_t
Float 4 bytes (float).
const Bool_t kIterBackward
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Describe directory structure in memory.
virtual const char * GetPath() const
Returns the full path of the directory.
virtual Bool_t cd()
Change current directory to "this" directory.
virtual TDirectory * mkdir(const char *name, const char *title="", Bool_t returnExistingDirectory=kFALSE)
Create a sub-directory "a" or a hierarchy of sub-directories "a/b/c/...".
1-D histogram with a float per channel (see TH1 documentation)
TH1 is the base class of all histogram classes in ROOT.
2-D histogram with a float per channel (see TH1 documentation)
Class that contains all the information of a class.
VariablePlotting & GetVariablePlotting()
Class that contains all the data information.
UInt_t GetNVariables() const
UInt_t GetNClasses() const
UInt_t GetNTargets() const
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
Double_t GetWeight() const
return the event weight - depending on whether the flag IgnoreNegWeightsInTraining is or not.
Float_t GetTarget(UInt_t itgt) const
ostringstream derivative to redirect and format output
void SetSource(const std::string &source)
Ranking for variables in method (implementation).
Class for type info of MVA input variable.
const TString & GetInternalName() const
const TString & GetUnit() const
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
const char * Data() const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
MsgLogger & Endl(MsgLogger &ml)
Int_t Nint(T x)
Round to nearest integer. Rounds half integers to the nearest even integer.
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.