222 lines
6.4 KiB
C++
222 lines
6.4 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkExtractHistogram.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkExtractHistogram
|
|
* @brief Extract histogram data (binned values) from any
|
|
* dataset
|
|
*
|
|
* vtkExtractHistogram accepts any vtkDataSet as input and produces a
|
|
* vtkTable containing histogram data as output. The output vtkTable
|
|
* will contains a vtkDoubleArray named "bin_extents" which contains
|
|
* the boundaries between each histogram bin, and a vtkUnsignedLongArray
|
|
* named "bin_values" which will contain the value for each bin.
|
|
*/
|
|
|
|
#ifndef vtkExtractHistogram_h
|
|
#define vtkExtractHistogram_h
|
|
|
|
#include <memory> // for std::unique_ptr
|
|
|
|
#include "vtkFiltersStatisticsModule.h" // For export macro
|
|
#include "vtkTableAlgorithm.h"
|
|
|
|
class vtkDoubleArray;
|
|
class vtkFieldData;
|
|
class vtkIntArray;
|
|
class vtkExtractHistogramInternal;
|
|
|
|
class VTKFILTERSSTATISTICS_EXPORT vtkExtractHistogram : public vtkTableAlgorithm
|
|
{
|
|
public:
|
|
static vtkExtractHistogram* New();
|
|
vtkTypeMacro(vtkExtractHistogram, vtkTableAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Controls which input data component should be binned, for input arrays
|
|
* with more-than-one component. Setting this to the number of components
|
|
* will compute the histogram of the magnitude (L2 norm) of the tuple.
|
|
* Default is 0.
|
|
*/
|
|
vtkSetClampMacro(Component, int, 0, VTK_INT_MAX);
|
|
vtkGetMacro(Component, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Controls the number of bins N in the output histogram data.
|
|
* Default is 10.
|
|
*/
|
|
vtkSetClampMacro(BinCount, int, 1, VTK_INT_MAX);
|
|
vtkGetMacro(BinCount, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set if first and last bins must be centered around the min and max
|
|
* data. This is only used when UseCustomBinRanges is set to false.
|
|
* Default is false.
|
|
*/
|
|
vtkSetMacro(CenterBinsAroundMinAndMax, bool);
|
|
vtkGetMacro(CenterBinsAroundMinAndMax, bool);
|
|
vtkBooleanMacro(CenterBinsAroundMinAndMax, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set custom bin range to use. These are used only when
|
|
* UseCustomBinRanges is set to true.
|
|
* Default is [0, 100].
|
|
*/
|
|
vtkSetVector2Macro(CustomBinRanges, double);
|
|
vtkGetVector2Macro(CustomBinRanges, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When set to true, CustomBinRanges will be used instead of using the full
|
|
* range for the selected array.
|
|
* Default is false.
|
|
*/
|
|
vtkSetMacro(UseCustomBinRanges, bool);
|
|
vtkGetMacro(UseCustomBinRanges, bool);
|
|
vtkBooleanMacro(UseCustomBinRanges, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* This option controls whether the algorithm calculates averages
|
|
* of variables other than the primary variable that fall into each
|
|
* bin.
|
|
* Default is false.
|
|
*/
|
|
vtkSetMacro(CalculateAverages, bool);
|
|
vtkGetMacro(CalculateAverages, bool);
|
|
vtkBooleanMacro(CalculateAverages, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the name of the bin extents array.
|
|
* Default is "bin_extents".
|
|
*/
|
|
vtkSetStringMacro(BinExtentsArrayName);
|
|
vtkGetStringMacro(BinExtentsArrayName);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the name of the bin values array.
|
|
* Default is "bin_values".
|
|
*/
|
|
vtkSetStringMacro(BinValuesArrayName);
|
|
vtkGetStringMacro(BinValuesArrayName);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* If this option is set then the bin values will be normalized so that the sum of the bin values
|
|
* adds up to 1.0.
|
|
* Default is false.
|
|
*/
|
|
vtkSetMacro(Normalize, bool);
|
|
vtkBooleanMacro(Normalize, bool);
|
|
vtkGetMacro(Normalize, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* If this option is set to true then the output table will contain an additional column with
|
|
* accumulated bin values.
|
|
* Default is false.
|
|
*/
|
|
vtkSetMacro(Accumulation, bool);
|
|
vtkBooleanMacro(Accumulation, bool);
|
|
vtkGetMacro(Accumulation, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the name of the optional bin accumulation array.
|
|
* Default is "bin_accumulation".
|
|
*/
|
|
vtkSetStringMacro(BinAccumulationArrayName);
|
|
vtkGetStringMacro(BinAccumulationArrayName);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get the bin range which was used to create the bin extents.
|
|
*/
|
|
vtkGetVector2Macro(BinRange, double);
|
|
//@}
|
|
|
|
protected:
|
|
vtkExtractHistogram();
|
|
~vtkExtractHistogram() override;
|
|
|
|
/**
|
|
* Returns the data range for the input array to process.
|
|
* This method is not called with this->UseCustomBinRanges is true.
|
|
* Returns true is range could be determined correctly, otherwise returns
|
|
* false and range is set to {VTK_DOUBLE_MAX, VTK_DOUBLE_MIN}. When returning
|
|
* true, the actual data range is returned (without any extra padding).
|
|
*/
|
|
virtual bool GetInputArrayRange(vtkInformationVector** inputVector, double range[2]);
|
|
|
|
int FillInputPortInformation(int port, vtkInformation* info) override;
|
|
|
|
int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
|
|
vtkInformationVector* outputVector) override;
|
|
|
|
// Initialize the bin_extents using the data range for the selected
|
|
// array.
|
|
virtual bool InitializeBinExtents(vtkInformationVector** inputVector, vtkDoubleArray* binExtents);
|
|
|
|
void BinAnArray(
|
|
vtkDataArray* dataArray, vtkIntArray* binValues, double min, double max, vtkFieldData* field);
|
|
|
|
void FillBinExtents(vtkDoubleArray* binExtents);
|
|
|
|
void NormalizeBins(vtkTable* outputData);
|
|
|
|
void AccumulateBins(vtkTable* outputData);
|
|
|
|
double CustomBinRanges[2] = { 0, 100 };
|
|
double BinRange[2] = { VTK_DOUBLE_MAX, -VTK_DOUBLE_MAX };
|
|
bool CenterBinsAroundMinAndMax = false;
|
|
bool UseCustomBinRanges = false;
|
|
int Component = 0;
|
|
int BinCount = 10;
|
|
bool CalculateAverages = false;
|
|
char* BinExtentsArrayName = nullptr;
|
|
char* BinValuesArrayName = nullptr;
|
|
char* BinAccumulationArrayName = nullptr;
|
|
bool Normalize = false;
|
|
bool Accumulation = false;
|
|
|
|
std::unique_ptr<vtkExtractHistogramInternal> Internal;
|
|
|
|
private:
|
|
void operator=(const vtkExtractHistogram&) = delete;
|
|
vtkExtractHistogram(const vtkExtractHistogram&) = delete;
|
|
|
|
int GetInputFieldAssociation();
|
|
vtkFieldData* GetInputFieldData(vtkDataObject* input);
|
|
};
|
|
|
|
#endif
|