Commit df6c71a9 authored by Joachim Pouderoux's avatar Joachim Pouderoux

Fix and enhance bag plots.

Fix the way how the bags are computed. They are now performed at
50 and 99% of the distribution.
Functional bag plots also create a median serie which is the
median line of all input series. Outliers series are also
tagged with an "_outlier" extension in their name.

Change-Id: I990428c9b79278be9be725491232b3e9d69190b0
parent ce692f85
......@@ -25,26 +25,26 @@
#include "vtkTable.h"
const double densities[] = {
-0.42, -0.349997, -0.289995, -0.229993, -0.16999, -0.119988, -0.079985, -0.0499825, -0.01998, -0.0099775, 2.5e-005, -0.0099725, -0.01997, -0.0499675, -0.079965, -0.119963, -0.16996, -0.229958, -0.289955, -0.349953,
-0.34995, -0.279948, -0.209945, -0.149943, -0.08994, -0.0299375, 0.010065, 0.0500675, 0.07007, 0.0900725, 0.090075, 0.0900775, 0.07008, 0.0500825, 0.010085, -0.0299125, -0.08991, -0.149908, -0.209905, -0.279903,
-0.2899, -0.209897, -0.139895, -0.0698925, 0.00011, 0.0501125, 0.100115, 0.140118, 0.17012, 0.190123, 0.190125, 0.190128, 0.17013, 0.140133, 0.100135, 0.0501375, 0.00014, -0.0698575, -0.139855, -0.209853,
-0.22985, -0.149847, -0.069845, 0.0101575, 0.07016, 0.130163, 0.190165, 0.230168, 0.27017, 0.290173, 0.300175, 0.290177, 0.27018, 0.230183, 0.190185, 0.130188, 0.07019, 0.0101925, -0.069805, -0.149803,
-0.1698, -0.0897975, 0.000205, 0.0702075, 0.15021, 0.210213, 0.270215, 0.320217, 0.36022, 0.390223, 0.400225, 0.390228, 0.36023, 0.320233, 0.270235, 0.210237, 0.15024, 0.0702425, 0.000245, -0.0897525,
-0.11975, -0.0297475, 0.050255, 0.130258, 0.21026, 0.290262, 0.350265, 0.410267, 0.46027, 0.490273, 0.500275, 0.490277, 0.46028, 0.410282, 0.350285, 0.290287, 0.21029, 0.130293, 0.050295, -0.0297025,
-0.0797, 0.0103025, 0.100305, 0.190307, 0.27031, 0.350312, 0.430315, 0.500317, 0.55032, 0.580322, 0.600325, 0.580328, 0.55033, 0.500332, 0.430335, 0.350337, 0.27034, 0.190343, 0.100345, 0.0103475,
-0.04965, 0.0503525, 0.140355, 0.230358, 0.32036, 0.410362, 0.500365, 0.570367, 0.63037, 0.680373, 0.700375, 0.680378, 0.63038, 0.570382, 0.500385, 0.410387, 0.32039, 0.230393, 0.140395, 0.0503975,
-0.0196, 0.0704025, 0.170405, 0.270408, 0.36041, 0.460413, 0.550415, 0.630417, 0.71042, 0.770423, 0.800425, 0.770428, 0.71043, 0.630432, 0.550435, 0.460438, 0.36044, 0.270443, 0.170445, 0.0704475,
-0.00955, 0.0904525, 0.190455, 0.290457, 0.39046, 0.490462, 0.580465, 0.680468, 0.77047, 0.850472, 0.900475, 0.850478, 0.77048, 0.680483, 0.580485, 0.490487, 0.39049, 0.290492, 0.190495, 0.0904975,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.5e-005, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0.010065, 0.0500675, 0.07007, 0.0900725, 0.090075, 0.0900775, 0.07008, 0.0500825, 0.010085, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0.00011, 0.0501125, 0.100115, 0.140118, 0.17012, 0.190123, 0.190125, 0.190128, 0.17013, 0.140133, 0.100135, 0.0501375, 0.00014, 0, 0, 0,
0, 0, 0, 0.0101575, 0.07016, 0.130163, 0.190165, 0.230168, 0.27017, 0.290173, 0.300175, 0.290177, 0.27018, 0.230183, 0.190185, 0.130188, 0.07019, 0.0101925, 0, 0,
0, 0, 0.000205, 0.0702075, 0.15021, 0.210213, 0.270215, 0.320217, 0.36022, 0.390223, 0.400225, 0.390228, 0.36023, 0.320233, 0.270235, 0.210237, 0.15024, 0.0702425, 0.000245, 0,
0, 0, 0.050255, 0.130258, 0.21026, 0.290262, 0.350265, 0.410267, 0.46027, 0.490273, 0.500275, 0.490277, 0.46028, 0.410282, 0.350285, 0.290287, 0.21029, 0.130293, 0.050295, 0,
0, 0.0103025, 0.100305, 0.190307, 0.27031, 0.350312, 0.430315, 0.500317, 0.55032, 0.580322, 0.600325, 0.580328, 0.55033, 0.500332, 0.430335, 0.350337, 0.27034, 0.190343, 0.100345, 0.0103475,
0, 0.0503525, 0.140355, 0.230358, 0.32036, 0.410362, 0.500365, 0.570367, 0.63037, 0.680373, 0.700375, 0.680378, 0.63038, 0.570382, 0.500385, 0.410387, 0.32039, 0.230393, 0.140395, 0.0503975,
0, 0.0704025, 0.170405, 0.270408, 0.36041, 0.460413, 0.550415, 0.630417, 0.71042, 0.770423, 0.800425, 0.770428, 0.71043, 0.630432, 0.550435, 0.460438, 0.36044, 0.270443, 0.170445, 0.0704475,
0, 0.0904525, 0.190455, 0.290457, 0.39046, 0.490462, 0.580465, 0.680468, 0.77047, 0.850472, 0.900475, 0.850478, 0.77048, 0.680483, 0.580485, 0.490487, 0.39049, 0.290492, 0.190495, 0.0904975,
0.0005, 0.0905025, 0.190505, 0.300507, 0.40051, 0.500513, 0.600515, 0.700517, 0.80052, 0.900523, 1.00053, 0.900528, 0.80053, 0.700533, 0.600535, 0.500537, 0.40054, 0.300542, 0.190545, 0.0905475,
-0.00945, 0.0905525, 0.190555, 0.290557, 0.39056, 0.490563, 0.580565, 0.680568, 0.77057, 0.850572, 0.900575, 0.850577, 0.77058, 0.680583, 0.580585, 0.490588, 0.39059, 0.290592, 0.190595, 0.0905975,
-0.0194, 0.0706025, 0.170605, 0.270608, 0.36061, 0.460613, 0.550615, 0.630618, 0.71062, 0.770622, 0.800625, 0.770628, 0.71063, 0.630633, 0.550635, 0.460638, 0.36064, 0.270643, 0.170645, 0.0706475,
-0.04935, 0.0506525, 0.140655, 0.230658, 0.32066, 0.410662, 0.500665, 0.570667, 0.63067, 0.680673, 0.700675, 0.680678, 0.63068, 0.570682, 0.500685, 0.410687, 0.32069, 0.230693, 0.140695, 0.0506975,
-0.0793, 0.0107025, 0.100705, 0.190708, 0.27071, 0.350712, 0.430715, 0.500718, 0.55072, 0.580722, 0.600725, 0.580727, 0.55073, 0.500733, 0.430735, 0.350737, 0.27074, 0.190743, 0.100745, 0.0107475,
-0.11925, -0.0292475, 0.050755, 0.130758, 0.21076, 0.290762, 0.350765, 0.410767, 0.46077, 0.490773, 0.500775, 0.490777, 0.46078, 0.410782, 0.350785, 0.290787, 0.21079, 0.130793, 0.050795, -0.0292025,
-0.1692, -0.0891975, 0.000805, 0.0708075, 0.15081, 0.210812, 0.270815, 0.320818, 0.36082, 0.390823, 0.400825, 0.390827, 0.36083, 0.320833, 0.270835, 0.210837, 0.15084, 0.0708425, 0.000845, -0.0891525,
-0.22915, -0.149147, -0.069145, 0.0108575, 0.07086, 0.130862, 0.190865, 0.230868, 0.27087, 0.290872, 0.300875, 0.290877, 0.27088, 0.230883, 0.190885, 0.130888, 0.07089, 0.0108925, -0.069105, -0.149103,
-0.2891, -0.209097, -0.139095, -0.0690925, 0.00091, 0.0509125, 0.100915, 0.140918, 0.17092, 0.190922, 0.190925, 0.190928, 0.17093, 0.140933, 0.100935, 0.0509375, 0.00094, -0.0690575, -0.139055, -0.209053,
-0.34905, -0.279048, -0.209045, -0.149042, -0.08904, -0.0290375, 0.010965, 0.0509675, 0.07097, 0.0909725, 0.090975, 0.0909775, 0.07098, 0.0509825, 0.010985, -0.0290125, -0.08901, -0.149007, -0.209005, -0.279003,
0, 0.0905525, 0.190555, 0.290557, 0.39056, 0.490563, 0.580565, 0.680568, 0.77057, 0.850572, 0.900575, 0.850577, 0.77058, 0.680583, 0.580585, 0.490588, 0.39059, 0.290592, 0.190595, 0.0905975,
0, 0.0706025, 0.170605, 0.270608, 0.36061, 0.460613, 0.550615, 0.630618, 0.71062, 0.770622, 0.800625, 0.770628, 0.71063, 0.630633, 0.550635, 0.460638, 0.36064, 0.270643, 0.170645, 0.0706475,
0, 0.0506525, 0.140655, 0.230658, 0.32066, 0.410662, 0.500665, 0.570667, 0.63067, 0.680673, 0.700675, 0.680678, 0.63068, 0.570682, 0.500685, 0.410687, 0.32069, 0.230693, 0.140695, 0.0506975,
0, 0.0107025, 0.100705, 0.190708, 0.27071, 0.350712, 0.430715, 0.500718, 0.55072, 0.580722, 0.600725, 0.580727, 0.55073, 0.500733, 0.430735, 0.350737, 0.27074, 0.190743, 0.100745, 0.0107475,
0, 0, 0.050755, 0.130758, 0.21076, 0.290762, 0.350765, 0.410767, 0.46077, 0.490773, 0.500775, 0.490777, 0.46078, 0.410782, 0.350785, 0.290787, 0.21079, 0.130793, 0.050795, 0,
0, 0, 0.000805, 0.0708075, 0.15081, 0.210812, 0.270815, 0.320818, 0.36082, 0.390823, 0.400825, 0.390827, 0.36083, 0.320833, 0.270835, 0.210837, 0.15084, 0.0708425, 0.000845, 0,
0, 0, 0, 0.0108575, 0.07086, 0.130862, 0.190865, 0.230868, 0.27087, 0.290872, 0.300875, 0.290877, 0.27088, 0.230883, 0.190885, 0.130888, 0.07089, 0.0108925, 0, 0,
0, 0, 0, 0, 0.00091, 0.0509125, 0.100915, 0.140918, 0.17092, 0.190922, 0.190925, 0.190928, 0.17093, 0.140933, 0.100935, 0.0509375, 0.00094, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0.010965, 0.0509675, 0.07097, 0.0909725, 0.090975, 0.0909775, 0.07098, 0.0509825, 0.010985, 0, 0, 0, 0, 0,
};
//----------------------------------------------------------------------------
int TestBagPlot(int, char * [])
......@@ -85,11 +85,6 @@ int TestBagPlot(int, char * [])
{
table->SetValue(i + j * numDataI, 0, i); //X
table->SetValue(i + j * numDataI, 1, j); //Y
//double dx = (numDataI / 2. - i) / (numDataI / 2.);
//double dy = (numDataJ / 2. - j) / (numDataJ / 2.);
//double d = 1. - sqrt(dx * dx + dy * dy);
//d = floor(d * 100.) / 100.; // to avoid conflicts
//d += (i + j * numDataI) / (double)(1000. * numDataI * numDataJ);
double d = densities[i + j * numDataI];
table->SetValue(i + j * numDataI, 2, d); // Density
}
......
c1d6e4f60c9b8ccc9e8ae6b9cf7fb040
4e320f7efda9ccf279c8d668de7ebd95
......@@ -27,8 +27,10 @@
#include "vtkStringArray.h"
#include "vtkTable.h"
#include "vtkTimeStamp.h"
#include "vtkMath.h"
#include <algorithm>
#include <sstream>
//-----------------------------------------------------------------------------
vtkStandardNewMacro(vtkPlotBag);
......@@ -40,7 +42,7 @@ vtkPlotBag::vtkPlotBag()
{
this->MedianPoints = vtkPoints2D::New();
this->Q3Points = vtkPoints2D::New();
this->TooltipDefaultLabelFormat = "%l (%x, %y): %z";
this->TooltipDefaultLabelFormat = "%C, %l (%x, %y): %z";
this->Brush->SetColor(255, 0, 0);
this->Brush->SetOpacity(255);
this->Pen->SetColor(0, 0, 0);
......@@ -101,15 +103,16 @@ void vtkPlotBag::Update()
}
//-----------------------------------------------------------------------------
class ArraySorter
class DensityVal
{
public:
ArraySorter(vtkDataArray* arr) : Array(arr) {}
bool operator()(const vtkIdType& a, const vtkIdType& b)
DensityVal(double d, vtkIdType cid) : Density(d), Id(cid) {}
bool operator<(const DensityVal& b) const
{
return this->Array->GetTuple1(a) > this->Array->GetTuple1(b);
return this->Density > b.Density;
}
vtkDataArray* Array;
double Density;
vtkIdType Id;
};
//-----------------------------------------------------------------------------
......@@ -122,34 +125,43 @@ void vtkPlotBag::UpdateTableCache(vtkDataArray* density)
{
return;
}
vtkIdType nbPoints = density->GetNumberOfTuples();
vtkDataArray* d = density;
vtkPoints2D* points = this->Points;
// Sort the density array
std::vector<vtkIdType> ids;
ids.resize(nbPoints);
for (vtkIdType i = 0; i < nbPoints; i++)
vtkIdType nbPoints = d->GetNumberOfTuples();
// Fetch and sort arrays according their density
std::vector<DensityVal> ids;
ids.reserve(nbPoints);
for (int i = 0; i < nbPoints; i++)
{
ids[i] = i;
ids.push_back(DensityVal(d->GetTuple1(i), i));
}
// Sort array by density
ArraySorter arraySorter(density);
std::sort(ids.begin(), ids.end(), arraySorter);
std::sort(ids.begin(), ids.end());
vtkNew<vtkPointsProjectedHull> q3Points;
q3Points->Allocate(nbPoints);
vtkNew<vtkPointsProjectedHull> medianPoints;
medianPoints->Allocate(nbPoints);
// Compute total density sum
double densitySum = 0.0;
for (vtkIdType i = 0; i < nbPoints; i++)
{
densitySum += d->GetTuple1(i);
}
double sum = 0.0;
for (vtkIdType i = 0; i < nbPoints; i++)
{
double x[3];
this->Points->GetPoint(ids[i], x);
if (i < static_cast<vtkIdType>(nbPoints * 0.5))
points->GetPoint(ids[i].Id, x);
sum += ids[i].Density;
if (sum < 0.5 * densitySum)
{
medianPoints->InsertNextPoint(x);
}
if (i < static_cast<vtkIdType>(nbPoints * 0.75))
if (sum < 0.99 * densitySum)
{
q3Points->InsertNextPoint(x);
}
......@@ -347,6 +359,23 @@ vtkStdString vtkPlotBag::GetTooltipLabel(const vtkVector2d &plotPos,
// GetLabel() is GetLabel(0) in this implementation
tooltipLabel += this->GetLabel();
break;
case 'c':
{
std::stringstream ss;
ss << seriesIndex;
tooltipLabel += ss.str();
}
break;
case 'C':
{
vtkAbstractArray *colName = vtkAbstractArray::SafeDownCast(
this->GetInput()->GetColumnByName("ColName"));
std::stringstream ss;
ss << (!colName ? "?" :
colName->GetVariantValue(seriesIndex).ToString());
tooltipLabel += ss.str();
}
break;
default: // If no match, insert the entire format tag
tooltipLabel += "%";
tooltipLabel += format[i];
......@@ -380,7 +409,6 @@ void vtkPlotBag::SetInputData(vtkTable *table)
void vtkPlotBag::SetInputData(vtkTable *table, const vtkStdString &yColumn,
const vtkStdString &densityColumn)
{
vtkDebugMacro(<< "Setting input, Y column = \"" << yColumn.c_str() << "\", "
<< "Density column = \"" << densityColumn.c_str() << "\"");
......
......@@ -21,6 +21,7 @@
#include "vtkContext2D.h"
#include "vtkContextMapper2D.h"
#include "vtkDoubleArray.h"
#include "vtkIdTypeArray.h"
#include "vtkLookupTable.h"
#include "vtkObjectFactory.h"
#include "vtkPen.h"
......
......@@ -37,15 +37,15 @@ const double densities[] = {
0.289692,
0.36827,
0.398942,
0.36827,
0.289692,
0.194186,
0.110921,
0.053991,
0.0223945,
0.00791545,
0.00238409,
0.000611902
0.368271,
0.2896921,
0.1941861,
0.1109211,
0.0539911,
0.02239451,
0.007915451,
0.002384091,
0.0006119021
};
//----------------------------------------------------------------------------
......@@ -77,9 +77,6 @@ int TestExtractFunctionalBagPlot(int , char * [])
}
}
cout << "\n## Input data table:\n";
table->Dump();
// Create a density table
vtkNew<vtkDoubleArray> density;
......@@ -91,11 +88,8 @@ int TestExtractFunctionalBagPlot(int , char * [])
varName->SetNumberOfValues(numCols);
for (int j = 0; j < numCols; j++)
{
//double x = j * 8. / static_cast<double>(numCols) - 4.;
//double d = (1. / sqrt(vtkMath::Pi() * 2.)) * exp(-(x*x) / 2.);
double d = densities[j];
density->SetValue(j, d);
varName->SetValue(j, table->GetColumn(j)->GetName());
}
......@@ -103,15 +97,10 @@ int TestExtractFunctionalBagPlot(int , char * [])
inTableDensity->AddColumn(density.GetPointer());
inTableDensity->AddColumn(varName.GetPointer());
cout << "\n## Input density table:\n";
inTableDensity->Dump();
vtkNew<vtkExtractFunctionalBagPlot> ebp;
// First verify that absence of input does not cause trouble
cout << "## Verifying that absence of input does not cause trouble... ";
ebp->Update();
cout << "done.\n";
ebp->SetInputData(0, table.GetPointer());
ebp->SetInputData(1, inTableDensity.GetPointer());
......@@ -121,9 +110,7 @@ int TestExtractFunctionalBagPlot(int , char * [])
vtkDataObject::FIELD_ASSOCIATION_ROWS, "ColName");
ebp->Update();
cout << "\n## Results:" << endl;
vtkTable* outBPTable = ebp->GetOutput();
outBPTable->Dump();
vtkDoubleArray* q3Points =
vtkDoubleArray::SafeDownCast(outBPTable->GetColumnByName("Q3Points"));
......@@ -132,6 +119,7 @@ int TestExtractFunctionalBagPlot(int , char * [])
if (!q3Points || !q2Points)
{
outBPTable->Dump();
cout << "## Failure: Missing Q3Points or QMedPoints columns!" << endl;
return EXIT_FAILURE;
}
......@@ -139,6 +127,7 @@ int TestExtractFunctionalBagPlot(int , char * [])
if (q3Points->GetNumberOfTuples() != numPoints ||
q2Points->GetNumberOfTuples() != numPoints)
{
outBPTable->Dump();
cout << "## Failure: Bad number of tuples in Q3Points or QMedPoints columns!" << endl;
return EXIT_FAILURE;
}
......@@ -146,6 +135,7 @@ int TestExtractFunctionalBagPlot(int , char * [])
if (q3Points->GetNumberOfComponents() != 2 ||
q2Points->GetNumberOfComponents() != 2)
{
outBPTable->Dump();
cout << "## Failure: Q3Points or QMedPoints does not have 2 components!" << endl;
return EXIT_FAILURE;
}
......@@ -156,11 +146,11 @@ int TestExtractFunctionalBagPlot(int , char * [])
double q2v[2];
q2Points->GetTuple(19, q2v);
if (q3v[0] != 38 || q3v[1] != 323 || q2v[0] != 95 || q2v[1] != 285)
if (q3v[0] != 95 || q3v[1] != 304 || q2v[0] != 171 || q2v[1] != 209)
{
outBPTable->Dump();
cout << "## Failure: bad values found in Q3Points or QMedPoints" << endl;
return EXIT_FAILURE;
}
cout << "## Success!" << endl;
return EXIT_SUCCESS;
}
......@@ -25,6 +25,7 @@
#include "vtkTable.h"
#include <algorithm>
#include <set>
#include <vector>
vtkStandardNewMacro(vtkExtractFunctionalBagPlot);
......@@ -100,48 +101,68 @@ int vtkExtractFunctionalBagPlot::RequestData(vtkInformation* /*request*/,
}
vtkIdType nbPoints = varName->GetNumberOfValues();
// Sort the density array
std::vector<vtkIdType> ids;
ids.resize(nbPoints);
for (vtkIdType i = 0; i < nbPoints; i++)
{
ids[i] = i;
}
// Fetch and sort arrays according their density
std::vector<DensityVal> varNames;
for (int i = 0; i < varName->GetNumberOfValues(); i++)
varNames.reserve(nbPoints);
for (int i = 0; i < nbPoints; i++)
{
varNames.push_back(
DensityVal(density->GetValue(i),
inTable->GetColumnByName(varName->GetValue(i))));
varNames.push_back(DensityVal(density->GetValue(i),
inTable->GetColumnByName(varName->GetValue(i))));
}
std::sort(varNames.begin(), varNames.end());
std::vector<vtkAbstractArray*> medianLines;
std::vector<vtkAbstractArray*> q3Lines;
std::set<vtkAbstractArray*> outliersSeries;
// Compute total density sum
double densitySum = 0.0;
for (vtkIdType i = 0; i < nbPoints; i++)
{
densitySum += density->GetTuple1(i);
}
size_t nbVarNames = varNames.size();
for (size_t i = 0; i < nbVarNames; i++)
double sum = 0.0;
for (vtkIdType i = 0; i < nbPoints; i++)
{
if (i <= static_cast<size_t>(nbPoints * 0.5))
sum += varNames[i].Density;
if (sum < 0.5 * densitySum)
{
medianLines.push_back(varNames[i].Array);
}
if (i <= static_cast<size_t>(nbPoints * 0.75))
if (sum < 0.99 * densitySum)
{
q3Lines.push_back(varNames[i].Array);
}
else
{
break;
outliersSeries.insert(varNames[i].Array);
}
}
// Generate the quad strip arrays
vtkIdType nbRows = inTable->GetNumberOfRows();
vtkIdType nbCols = inTable->GetNumberOfColumns();
// Generate the median line
vtkNew<vtkDoubleArray> qMedPoints;
qMedPoints->SetName("QMedianLine");
qMedPoints->SetNumberOfComponents(1);
qMedPoints->SetNumberOfTuples(nbRows);
std::vector<double> vals;
vals.resize(nbCols);
for (vtkIdType i = 0; i < nbRows; i++)
{
for (vtkIdType j = 0; j < nbCols; j++)
{
vals[j] = inTable->GetValue(i, j).ToDouble();
}
std::sort(vals.begin(), vals.end());
qMedPoints->SetTuple1(i, vals[nbCols / 2]);
}
// Generate the quad strip arrays
vtkNew<vtkDoubleArray> q3Points;
q3Points->SetName("Q3Points");
q3Points->SetNumberOfComponents(2);
......@@ -180,11 +201,25 @@ int vtkExtractFunctionalBagPlot::RequestData(vtkInformation* /*request*/,
// Add the 2 "bag" columns into the output table
outTable->AddColumn(q3Points.GetPointer());
outTable->AddColumn(q2Points.GetPointer());
outTable->AddColumn(qMedPoints.GetPointer());
// Then append the input columns
for (vtkIdType i = 0; i < inNbColumns; i++)
{
outTable->AddColumn(inTable->GetColumn(i));
vtkAbstractArray* arr = inTable->GetColumn(i);
if (outliersSeries.find(arr) != outliersSeries.end())
{
vtkAbstractArray* arrCopy = arr->NewInstance();
arrCopy->DeepCopy(arr);
std::string name = std::string(arr->GetName()) + "_outlier";
arrCopy->SetName(name.c_str());
outTable->AddColumn(arrCopy);
arrCopy->Delete();
}
else
{
outTable->AddColumn(arr);
}
}
return 1;
......
......@@ -167,32 +167,12 @@ void vtkHighestDensityRegionsStatistics::Learn(vtkTable* inData,
outObservations->SetNumberOfComponents(1);
outObservations->SetNumberOfTuples(inObservations->GetNumberOfTuples());
double sum = this->ComputeHDR(inObservations.GetPointer(), outObservations);
this->ComputeHDR(inObservations.GetPointer(), outObservations);
std::stringstream ss;
ss <<"HDR (" << inputColX->GetName() << "," << inputColY->GetName() << ")";
outObservations->SetName(ss.str().c_str());
outputColumns->AddColumn(outObservations);
if (sum != 0.0)
{
sum = 1.0 / sum;
// Creation of the hdr array.
vtkNew<vtkDoubleArray> normalizedHDR;
std::stringstream sst;
sst << "Normalized " << outObservations->GetName();
normalizedHDR->SetName(sst.str().c_str());
normalizedHDR->SetNumberOfComponents(1);
vtkIdType nbObservations = outObservations->GetNumberOfTuples();
normalizedHDR->SetNumberOfTuples(nbObservations);
for (vtkIdType j = 0; j < nbObservations; j++)
{
normalizedHDR->SetTuple1(j, sum * outObservations->GetTuple1(j));
}
outputColumns->AddColumn(normalizedHDR.GetPointer());
}
arrX->Delete();
arrY->Delete();
outObservations->Delete();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment