96using std::numeric_limits, std::nothrow, std::map;
117 fFoamType(kSeparate),
124 fFillFoamWithOrigWeights(
kFALSE),
125 fDTSeparation(kFoam),
156 fFoamType(kSeparate),
163 fFillFoamWithOrigWeights(
kFALSE),
164 fDTSeparation(kFoam),
172 Log() << kFATAL <<
"Name too long " <<
name.Data() <<
Endl;
184 delete fVariableNames;
186 if (fDistr)
delete fDistr;
187 if (fPseRan)
delete fPseRan;
188 if (fXmin) {
delete [] fXmin; fXmin=0; }
189 if (fXmax) {
delete [] fXmax; fXmax=0; }
193 for(
Int_t i=0; i<fNCells; i++)
delete fCells[i];
223 , fFoamType(kSeparate)
230 , fFillFoamWithOrigWeights(
kFALSE)
231 , fDTSeparation(kFoam)
238 Log() << kFATAL <<
"COPY CONSTRUCTOR NOT IMPLEMENTED" <<
Endl;
251 Log() << kFATAL <<
"<SetDim>: Dimension is zero or negative!" <<
Endl;
254 if (fXmin)
delete [] fXmin;
255 if (fXmax)
delete [] fXmax;
266 Log() << kFATAL <<
"<SetXmin>: Dimension out of bounds!" <<
Endl;
277 Log() << kFATAL <<
"<SetXmax>: Dimension out of bounds!" <<
Endl;
295 if(fPseRan==0) Log() << kFATAL <<
"Random number generator not set" <<
Endl;
296 if(fDistr==0) Log() << kFATAL <<
"Distribution function not set" <<
Endl;
297 if(fDim==0) Log() << kFATAL <<
"Zero dimension not allowed" <<
Endl;
304 if(fRvec==0) Log() << kFATAL <<
"Cannot initialize buffer fRvec" <<
Endl;
308 if(fAlpha==0) Log() << kFATAL <<
"Cannot initialize buffer fAlpha" <<
Endl;
313 fInhiDiv =
new Int_t[fDim];
314 for(
Int_t i=0; i<fDim; i++) fInhiDiv[i]=0;
318 fMaskDiv =
new Int_t[fDim];
319 for(
Int_t i=0; i<fDim; i++) fMaskDiv[i]=1;
323 for(
Int_t i=0; i<fDim; i++){
330 ((
TH1D*)(*fHistEdg)[i])->Sumw2();
358 for(
Int_t i=0; i<fNCells; i++)
delete fCells[i];
364 Log() << kFATAL <<
"not enough memory to create " << fNCells
367 for(
Int_t i=0; i<fNCells; i++){
369 fCells[i]->SetSerial(i);
379 Explore( fCells[
iCell] );
390 if (fLastCe==fNCells){
391 Log() << kFATAL <<
"Too many cells" <<
Endl;
395 cell = fCells[fLastCe];
397 cell->Fill(status, parent, 0, 0);
478 for (i=0;i<fDim;i++) ((
TH1D *)(*fHistEdg)[i])->Reset();
492 for (k=0; k<fDim; k++) {
507 if (
nevEff >= fNBin*fEvPerBin)
break;
517 Log() << kFATAL <<
"No events were found during exploration of "
518 <<
"root cell. Please check PDEFoam parameters nSampl "
519 <<
"and VolFrac." <<
Endl;
521 Log() << kWARNING <<
"Negative number of events found during "
522 <<
"exploration of root cell" <<
Endl;
527 for (k=0; k<fDim;k++){
529 if ( fInhiDiv[k]==1) fMaskDiv[k] =0;
551 for (parent =
cell->GetPare(); parent!=0; parent = parent->
GetPare()){
582 if( fMaskDiv[
kProj]) {
599 if ( (
xUp-
xLo) < std::numeric_limits<double>::epsilon())
sswIn=0.;
601 if ( (1.0-
xUp+
xLo) < std::numeric_limits<double>::epsilon())
sswOut=0.;
629 Log() << kFATAL <<
"Something wrong with kBest" <<
Endl;
639 fPseRan->RndmArray(fDim,fRvec);
640 for(
Int_t k=0; k<fDim; k++) fAlpha[k] = fRvec[k];
660 for(i=0; i<=fLastCe; i++) {
661 if( fCells[i]->GetStat() == 1 ) {
663 driv = fCells[i]->GetDriv();
664 if (
driv < std::numeric_limits<float>::epsilon())
669 if (
xDiv <= std::numeric_limits<Double_t>::epsilon() ||
670 xDiv >= 1.0 - std::numeric_limits<Double_t>::epsilon())
674 if (GetMaxDepth() > 0)
679 bCutNmin = GetCellElement(fCells[i], 0) > GetNmin();
691 Log() << kVERBOSE <<
"Warning: No cell with more than "
692 << GetNmin() <<
" events found!" <<
Endl;
694 Log() << kVERBOSE <<
"Warning: Maximum depth reached: "
695 << GetMaxDepth() <<
Endl;
697 Log() << kWARNING <<
"<PDEFoam::PeekMax>: no more candidate cells (drivMax>0) found for further splitting." <<
Endl;
718 if(fLastCe+1 >= fNCells) Log() << kFATAL <<
"Buffer limit is reached, fLastCe=fnBuf" <<
Endl;
733 cell->SetDau0((fCells[
d1]));
734 cell->SetDau1((fCells[
d2]));
736 Explore( (fCells[
d1]) );
737 Explore( (fCells[
d2]) );
752 std::vector<Double_t> xvec;
753 xvec.reserve(GetTotDim());
768 fTimer->Init(fNCells);
773 while ( (fLastCe+2) < fNCells ) {
777 Log() << kVERBOSE <<
"Break: "<< fLastCe+1 <<
" cells created" <<
Endl;
780 delete fCells[
jCell];
788 if ( Divide(
newCell )==0)
break;
793 Log() << kVERBOSE << GetNActiveCells() <<
" active cells created" <<
Endl;
803 if(fDim==0) Log() << kFATAL <<
"SetInhiDiv: fDim=0" <<
Endl;
805 fInhiDiv =
new Int_t[ fDim ];
806 for(
Int_t i=0; i<fDim; i++) fInhiDiv[i]=0;
812 Log() << kFATAL <<
"Wrong iDim" <<
Endl;
828 if (level==1) Log() << kVERBOSE <<
"Performing consistency checks for created foam" <<
Endl;
832 if( ((
cell->GetDau0()==0) && (
cell->GetDau1()!=0) ) ||
833 ((
cell->GetDau1()==0) && (
cell->GetDau0()!=0) ) ) {
835 if (level==1) Log() << kFATAL <<
"ERROR: Cell's no %d has only one daughter " <<
iCell <<
Endl;
837 if( (
cell->GetDau0()==0) && (
cell->GetDau1()==0) && (
cell->GetStat()==0) ) {
839 if (level==1) Log() << kFATAL <<
"ERROR: Cell's no %d has no daughter and is inactive " <<
iCell <<
Endl;
841 if( (
cell->GetDau0()!=0) && (
cell->GetDau1()!=0) && (
cell->GetStat()==1) ) {
843 if (level==1) Log() << kFATAL <<
"ERROR: Cell's no %d has two daughters and is active " <<
iCell <<
Endl;
847 if( (
cell->GetPare())!=fCells[0] ) {
848 if ( (
cell !=
cell->GetPare()->GetDau0()) && (
cell !=
cell->GetPare()->GetDau1()) ) {
850 if (level==1) Log() << kFATAL <<
"ERROR: Cell's no %d parent not pointing to this cell " <<
iCell <<
Endl;
855 if(
cell->GetDau0()!=0) {
856 if(
cell != (
cell->GetDau0())->GetPare()) {
858 if (level==1) Log() << kFATAL <<
"ERROR: Cell's no %d daughter 0 not pointing to this cell " <<
iCell <<
Endl;
861 if(
cell->GetDau1()!=0) {
862 if(
cell != (
cell->GetDau1())->GetPare()) {
864 if (level==1) Log() << kFATAL <<
"ERROR: Cell's no %d daughter 1 not pointing to this cell " <<
iCell <<
Endl;
867 if(
cell->GetVolume()<1E-50) {
869 if(level==1) Log() << kFATAL <<
"ERROR: Cell no. " <<
iCell <<
" has Volume of <1E-50" <<
Endl;
876 if( (
cell->GetStat()==1) && (
cell->GetVolume()<1E-11) ) {
878 if(level==1) Log() << kFATAL <<
"ERROR: Cell no. " <<
iCell <<
" is active but Volume is 0 " <<
Endl;
883 Log() << kVERBOSE <<
"Check has found " <<
errors <<
" errors and " <<
warnings <<
" warnings." <<
Endl;
886 Info(
"CheckAll",
"Check - found total %d errors \n",
errors);
897 Log() << kWARNING <<
"<PrintCell(iCell=" <<
iCell
898 <<
")>: cell number " <<
iCell <<
" out of bounds!"
908 Log() <<
"Cell[" <<
iCell <<
"]={ ";
909 Log() <<
" " << fCells[
iCell] <<
" " <<
Endl;
910 Log() <<
" Xdiv[abs. coord.]="
913 Log() <<
" Abs. coord. = (";
915 Log() <<
"dim[" <<
idim <<
"]={"
922 Log() <<
")" <<
Endl;
925 Log() <<
"Elements: [";
928 for (
Int_t i=0; i<
vec->GetNrows(); i++){
929 if (i>0) Log() <<
", ";
930 Log() << GetCellElement(fCells[
iCell], i);
934 Log() <<
"]" <<
Endl;
957 std::vector<Float_t> values =
ev->GetValues();
958 std::vector<Float_t>
tvalues = VarTransform(values);
963 SetCellElement(
cell, 0, GetCellElement(
cell, 0) +
wt);
964 SetCellElement(
cell, 1, GetCellElement(
cell, 1) +
wt*
wt);
974 Log() << kVERBOSE <<
"Delete cell elements" <<
Endl;
1017 std::vector<Float_t>
txvec(VarTransform(xvec));
1019 return GetCellValue(FindCell(
txvec),
cv);
1045 std::map<Int_t,Float_t>
txvec;
1046 for (std::map<Int_t,Float_t>::const_iterator it=xvec.begin(); it!=xvec.end(); ++it)
1047 txvec.insert(std::pair<Int_t, Float_t>(it->first, VarTransform(it->first, it->second)));
1050 std::vector<PDEFoamCell*>
cells = FindCells(
txvec);
1086 while (
cell->GetStat()!=1) {
1123 while (
cell->GetStat()!=1) {
1127 map<Int_t, Float_t>::const_iterator it =
txvec.find(
idim);
1172 std::vector<PDEFoamCell*>
cells(0);
1198 std::vector<PDEFoamCell*>
cells(0);
1220 if ( GetTotDim()!=1 )
1221 Log() << kFATAL <<
"<Draw1Dim>: function can only be used for 1-dimensional foams!"
1229 if (!
h1) Log() << kFATAL <<
"ERROR: Can not create histo" <<
hname <<
Endl;
1234 std::vector<Float_t>
txvec;
1241 val = GetCellValue(FindCell(
txvec), cell_value);
1275 Log() << kFATAL <<
"<Project2>: wrong dimensions given: "
1282 Log() << kWARNING <<
"Warning: number of bins too big: " <<
nbin
1283 <<
" Using 1000 bins for each dimension instead." <<
Endl;
1285 }
else if (
nbin<1) {
1286 Log() << kWARNING <<
"Wrong bin number: " <<
nbin
1287 <<
"; set nbin=50" <<
Endl;
1299 if (!
h1) Log() << kFATAL <<
"ERROR: Can not create histo" <<
hname <<
Endl;
1307 std::map<Int_t, Float_t>
txvec;
1313 std::vector<TMVA::PDEFoamCell*>
cells = FindCells(
txvec);
1318 for (std::vector<TMVA::PDEFoamCell*>::const_iterator it =
cells.
begin();
1325 std::vector<Float_t>
tvec;
1326 for (
Int_t i=0; i<GetTotDim(); ++i) {
1336 sum_cv += GetCellValue(FindCell(
tvec), cell_value);
1361 return GetCellElement(
cell, 0);
1364 return GetCellElement(
cell, 1);
1366 case kValueDensity: {
1369 if (volume > numeric_limits<double>::epsilon()) {
1370 return GetCellValue(
cell, kValue)/volume;
1374 Log() << kWARNING <<
"<GetCellDensity(cell)>: ERROR: cell volume"
1375 <<
" negative or zero!"
1376 <<
" ==> return cell density 0!"
1377 <<
" cell volume=" << volume
1378 <<
" cell entries=" << GetCellValue(
cell, kValue) <<
Endl;
1380 Log() << kWARNING <<
"<GetCellDensity(cell)>: WARNING: cell volume"
1381 <<
" close to zero!"
1382 <<
" cell volume: " << volume <<
Endl;
1389 return cell->GetIntg();
1392 return cell->GetDriv();
1395 if (
cell->GetIntg() != 0)
1396 return cell->GetDriv()/
cell->GetIntg();
1401 return cell->GetVolume();
1404 Log() << kFATAL <<
"<GetCellValue>: unknown cell value" <<
Endl;
1446 Log() << kFATAL <<
"<SetCellElement> ERROR: cell element is not a TVectorD*" <<
Endl;
1462 Log() << kINFO <<
"Elapsed time: " + fTimer->GetElapsedTime()
1470 if (fLastCe%
modulo == 0) fTimer->DrawProgressBar( fLastCe );
1513 if (GetTotDim() != 2)
1514 Log() << kFATAL <<
"RootPlot2dim() can only be used with "
1515 <<
"two-dimensional foams!" <<
Endl;
1518 ECellValue cell_value = kValue;
1522 cell_value = kValue;
1523 }
else if (opt.
Contains(
"rms_ov_mean")){
1524 cell_value = kRmsOvMean;
1541 outfile <<
"TColor *graycolors[100];" << std::endl;
1542 outfile <<
"for (Int_t i=0.; i<100; i++)" << std::endl;
1543 outfile <<
" graycolors[i]=new TColor(1000+i, 1-(Float_t)i/100.,1-(Float_t)i/100.,1-(Float_t)i/100.);"<< std::endl;
1546 outfile <<
"cMap = new TCanvas(\"" << fName <<
"\",\"Cell Map for "
1547 << fName <<
"\",600,600);" << std::endl;
1549 outfile<<
"TBox*a=new TBox();"<<std::endl;
1550 outfile<<
"a->SetFillStyle(0);"<<std::endl;
1551 outfile<<
"a->SetLineWidth(4);"<<std::endl;
1552 outfile<<
"TBox *b1=new TBox();"<<std::endl;
1553 outfile<<
"TText*t=new TText();"<<std::endl;
1555 outfile << (
colors ?
"gStyle->SetPalette(1, 0);" :
"gStyle->SetPalette(0);")
1557 outfile <<
"b1->SetFillStyle(1001);"<<std::endl;
1558 outfile<<
"TBox *b2=new TBox();"<<std::endl;
1559 outfile <<
"b2->SetFillStyle(0);"<<std::endl;
1562 outfile <<
"b1->SetFillStyle(0);"<<std::endl;
1575 if ( fCells[
iCell]->GetStat() == 1) {
1583 outfile <<
"// observed minimum and maximum of distribution: " << std::endl;
1584 outfile <<
"// Float_t zmin = "<< zmin <<
";" << std::endl;
1585 outfile <<
"// Float_t zmax = "<< zmax <<
";" << std::endl;
1588 outfile <<
"// used minimum and maximum of distribution (taking into account log scale if applicable): " << std::endl;
1589 outfile <<
"Float_t zmin = "<< zmin <<
";" << std::endl;
1590 outfile <<
"Float_t zmax = "<< zmax <<
";" << std::endl;
1601 outfile <<
"// =========== Rectangular cells ==========="<< std::endl;
1603 if ( fCells[
iCell]->GetStat() == 1) {
1622 outfile <<
"b1->SetFillColor(" << color <<
");" << std::endl;
1626 outfile<<
"b1->DrawBox("<<
x1<<
","<<
y1<<
","<<
x2<<
","<<
y2<<
");"<<std::endl;
1628 outfile<<
"b2->DrawBox("<<
x1<<
","<<
y1<<
","<<
x2<<
","<<
y2<<
");"<<std::endl;
1632 outfile<<
"t->SetTextColor(4);"<<std::endl;
1634 outfile<<
"t->SetTextSize(0.025);"<<std::endl;
1635 else if(fLastCe<251)
1636 outfile<<
"t->SetTextSize(0.015);"<<std::endl;
1638 outfile<<
"t->SetTextSize(0.008);"<<std::endl;
1641 outfile<<
"t->DrawText("<<
x<<
","<<
y<<
","<<
"\""<<
iCell<<
"\""<<
");"<<std::endl;
1645 outfile<<
"// ============== End Rectangles ==========="<< std::endl;
1658 GetDistr()->FillBinarySearchTree(
ev);
1667 if(fDistr)
delete fDistr;
static const Float_t kVlow
static const Float_t kHigh
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t wmin
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t wmax
Option_t Option_t TPoint TPoint const char y1
R__EXTERN TStyle * gStyle
TVectorT< Double_t > TVectorD
const_iterator begin() const
const_iterator end() const
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
1-D histogram with a double per channel (see TH1 documentation)
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
virtual Int_t GetNbinsY() const
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
virtual Int_t GetNbinsX() const
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
static Bool_t AddDirectoryStatus()
Static function: cannot be inlined on Windows/NT.
2-D histogram with a double per channel (see TH1 documentation)
ostringstream derivative to redirect and format output
PDEFoamCell * GetPare() const
void SetDriv(Double_t Driv)
void SetIntg(Double_t Intg)
This class is the abstract kernel interface for PDEFoam.
Implementation of PDEFoam.
Double_t GetCellElement(const PDEFoamCell *cell, UInt_t i) const
Returns cell element i of cell 'cell'.
void DeleteBinarySearchTree()
Delete the foam's density estimator, which contains the binary search tree.
void MakeAlpha()
Internal subprogram used by Create.
TObjArray * fVariableNames
collection of all variable names
virtual Float_t GetCellValue(const std::vector< Float_t > &xvec, ECellValue cv, PDEFoamKernelBase *)
This function finds the cell, which corresponds to the given untransformed event vector 'xvec' and re...
void OutputGrow(Bool_t finished=false)
Overridden function of PDEFoam to avoid native foam output.
void SetCellElement(PDEFoamCell *cell, UInt_t i, Double_t value)
Set cell element i of cell to value.
Int_t Divide(PDEFoamCell *)
Internal subprogram used by Create.
void PrintCell(Long_t iCell=0)
Prints geometry of and elements of 'iCell', as well as relations to parent and daughter cells.
void ResetCellElements()
Remove the cell elements from all cells.
void Grow()
Internal subprogram used by Create.
TH1D * Draw1Dim(ECellValue cell_value, Int_t nbin, PDEFoamKernelBase *kernel=nullptr)
Draws 1-dimensional foam (= histogram)
Double_t Eval(Double_t *xRand, Double_t &event_density)
Internal subprogram.
void PrintCells()
Prints geometry of ALL cells of the FOAM.
void SetXmax(Int_t idim, Double_t wmax)
set upper foam bound in dimension idim
virtual ~PDEFoam()
Default destructor.
PDEFoam()
Default constructor for streamer, user should not use it.
virtual TH2D * Project2(Int_t idim1, Int_t idim2, ECellValue cell_value=kValue, PDEFoamKernelBase *kernel=nullptr, UInt_t nbin=50)
Project foam variable idim1 and variable idim2 to histogram.
virtual Bool_t CellValueIsUndefined(PDEFoamCell *)
Returns true, if the value of the given cell is undefined.
virtual void FillFoamCells(const Event *ev, Float_t wt)
This function fills a weight 'wt' into the PDEFoam cell, which corresponds to the given event 'ev'.
void Create()
Basic initialization of FOAM invoked by the user.
void SetInhiDiv(Int_t, Int_t)
This can be called before Create, after setting kDim It defines which variables are excluded in the p...
void InitCells()
Internal subprogram used by Create.
PDEFoamCell * FindCell(const std::vector< Float_t > &) const
Find cell that contains 'xvec' (in foam coordinates [0,1]).
void FillBinarySearchTree(const Event *ev)
Insert event to internal foam's density estimator PDEFoamDensityBase.
virtual void Explore(PDEFoamCell *Cell)
Internal subprogram used by Create.
void SetXmin(Int_t idim, Double_t wmin)
set lower foam bound in dimension idim
std::vector< TMVA::PDEFoamCell * > FindCells(const std::vector< Float_t > &) const
Find all cells, that contain txvec.
void Varedu(Double_t[5], Int_t &, Double_t &, Double_t &)
Internal subprogram used by Create.
Int_t CellFill(Int_t, PDEFoamCell *)
Internal subprogram used by Create.
Long_t PeekMax()
Internal subprogram used by Create.
void RootPlot2dim(const TString &filename, TString opt, Bool_t createCanvas=kTRUE, Bool_t colors=kTRUE)
Debugging tool which plots the cells of a 2-dimensional PDEFoam as rectangles in C++ format readable ...
void CheckAll(Int_t)
User utility, miscellaneous and debug.
void SetDim(Int_t kDim)
Sets dimension of cubical space.
Timing information for training and evaluation of MVA methods.
Mother of all ROOT objects.
virtual void Print(Option_t *option="") const
This method must be overridden when a class wants to print itself.
Random number generator class based on M.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void SetPalette(Int_t ncolors=kBird, Int_t *colors=nullptr, Float_t alpha=1.)
See TColor::SetPalette.
Int_t GetColorPalette(Int_t i) const
Return color number i in current palette.
Int_t GetNumberOfColors() const
Return number of colors in the color palette.
MsgLogger & Endl(MsgLogger &ml)
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.