52 ClassImp(TMVA::PDEFoamTarget);
57 TMVA::PDEFoamTarget::PDEFoamTarget()
72 TMVA::PDEFoamTarget::PDEFoamTarget(
const TString& name, UInt_t target)
81 TMVA::PDEFoamTarget::PDEFoamTarget(
const PDEFoamTarget &from)
83 , fTarget(from.fTarget)
85 Log() << kFATAL <<
"COPY CONSTRUCTOR NOT IMPLEMENTED" << Endl;
93 void TMVA::PDEFoamTarget::FillFoamCells(
const Event* ev, Float_t wt)
96 std::vector<Float_t> values = ev->GetValues();
97 std::vector<Float_t> tvalues = VarTransform(values);
98 std::vector<Float_t> targets = ev->GetTargets();
99 PDEFoamCell *cell = FindCell(tvalues);
103 SetCellElement(cell, 0, GetCellElement(cell, 0) + wt);
104 SetCellElement(cell, 1, GetCellElement(cell, 1) + wt * targets.at(fTarget));
112 void TMVA::PDEFoamTarget::Finalize()
115 for (Long_t iCell = 0; iCell <= fLastCe; iCell++) {
116 if (!(fCells[iCell]->GetStat()))
119 Double_t n_ev = GetCellElement(fCells[iCell], 0);
120 Double_t tar = GetCellElement(fCells[iCell], 1);
123 SetCellElement(fCells[iCell], 0, tar / n_ev);
124 SetCellElement(fCells[iCell], 1, tar / TMath::Sqrt(n_ev));
126 SetCellElement(fCells[iCell], 0, 0.0);
127 SetCellElement(fCells[iCell], 1, -1);
136 Bool_t TMVA::PDEFoamTarget::CellValueIsUndefined(PDEFoamCell* cell)
138 return GetCellValue(cell, kValueError) == -1;
150 Float_t TMVA::PDEFoamTarget::GetCellValue(
const std::vector<Float_t> &xvec, ECellValue cv, PDEFoamKernelBase *kernel)
152 std::vector<Float_t> txvec(VarTransform(xvec));
153 PDEFoamCell *cell = FindCell(txvec);
155 if (!CellValueIsUndefined(cell)) {
158 return GetCellValue(cell, cv);
160 return kernel->Estimate(
this, txvec, cv);
163 return GetAverageNeighborsValue(txvec, kValue);
175 Float_t TMVA::PDEFoamTarget::GetAverageNeighborsValue(std::vector<Float_t> &txvec,
178 const Float_t xoffset = 1.e-6;
182 PDEFoamCell *cell = FindCell(txvec);
183 PDEFoamVect cellSize(GetTotDim());
184 PDEFoamVect cellPosi(GetTotDim());
185 cell->GetHcub(cellPosi, cellSize);
188 for (Int_t dim = 0; dim < GetTotDim(); dim++) {
189 std::vector<Float_t> ntxvec(txvec);
190 PDEFoamCell* left_cell = 0;
191 PDEFoamCell* right_cell = 0;
194 ntxvec[dim] = cellPosi[dim] - xoffset;
195 left_cell = FindCell(ntxvec);
196 if (!CellValueIsUndefined(left_cell)) {
198 result += GetCellValue(left_cell, cv);
202 ntxvec[dim] = cellPosi[dim] + cellSize[dim] + xoffset;
203 right_cell = FindCell(ntxvec);
204 if (!CellValueIsUndefined(right_cell)) {
206 result += GetCellValue(right_cell, cv);
210 if (norm > 0) result /= norm;