CTL  0.6.1
Computed Tomography Library
Public Types | Public Member Functions | Static Public Member Functions | List of all members
CTL::XYDataSeries Class Reference

The XYDataSeries class is container for a series of data points, each representing x and y value pairs. More...

#include <xydataseries.h>

Inheritance diagram for CTL::XYDataSeries:
Inheritance graph
[legend]
Collaboration diagram for CTL::XYDataSeries:
Collaboration graph
[legend]

Public Types

enum  Sampling { Linear, Exponential }
 

Public Member Functions

 XYDataSeries (QList< QPointF > &&dataSeries)
 
 XYDataSeries (const QList< QPointF > &dataSeries)
 
 XYDataSeries (const QVector< float > &x, const QVector< float > &y)
 
 XYDataSeries (const std::vector< float > &x, const std::vector< float > &y)
 
void append (const QPointF &sample)
 
void append (float x, float y)
 
void append (const QList< QPointF > &series)
 
void remove (uint idx)
 
void remove (const QPointF &sample)
 
QList< QPointF > & data ()
 
void normalizeByMaxAbsVal ()
 
void normalizeByMaxVal ()
 
void scaleValues (float factor)
 
const QList< QPointF > & data () const
 
- Public Member Functions inherited from CTL::PointSeriesBase
const QList< QPointF > & data () const
 
float max () const
 
float min () const
 
uint nbSamples () const
 
uint size () const
 
float sum () const
 
float sum (const std::vector< float > &weights) const
 
float weightedSum (const std::vector< float > &weights) const
 
float samplingPoint (uint sampleNb) const
 
std::vector< float > samplingPoints () const
 
Range< float > samplingRange () const
 
float value (uint sampleNb) const
 
std::vector< float > values () const
 
Range< float > valueRange () const
 

Static Public Member Functions

static XYDataSeries sampledFromModel (const AbstractDataModel &dataModel, const QVector< float > &samplingPoints)
 
static XYDataSeries sampledFromModel (std::shared_ptr< AbstractDataModel > dataModel, const QVector< float > &samplingPoints)
 
static XYDataSeries sampledFromModel (const AbstractDataModel &dataModel, const std::vector< float > &samplingPoints)
 
static XYDataSeries sampledFromModel (std::shared_ptr< AbstractDataModel > dataModel, const std::vector< float > &samplingPoints)
 
static XYDataSeries sampledFromModel (const AbstractDataModel &dataModel, SamplingRange samplingRange, uint nbSamples, Sampling samplingPattern=Linear)
 
static XYDataSeries sampledFromModel (std::shared_ptr< AbstractDataModel > dataModel, SamplingRange samplingRange, uint nbSamples, Sampling samplingPattern=Linear)
 
static XYDataSeries sampledFromModel (const AbstractDataModel &dataModel, float from, float to, uint nbSamples, Sampling samplingPattern=Linear)
 
static XYDataSeries sampledFromModel (std::shared_ptr< AbstractDataModel > dataModel, float from, float to, uint nbSamples, Sampling samplingPattern=Linear)
 

Additional Inherited Members

- Protected Member Functions inherited from CTL::PointSeriesBase
 PointSeriesBase (const QList< QPointF > &pointSeries)
 
 PointSeriesBase (QList< QPointF > &&pointSeries)
 
void normalizeByMaxAbsVal ()
 
void normalizeByMaxVal ()
 
void scaleValues (float factor)
 
- Protected Attributes inherited from CTL::PointSeriesBase
QList< QPointF > _data
 

Detailed Description

The XYDataSeries class is container for a series of data points, each representing x and y value pairs.

This class is a sub-class of PointSeriesBase that provides full manipulation possibilities on the managed data. Data points can be added to the series using append() and removed from it through remove(). Data can also be scaled and normalized.

An XYDataSeries can also be generated by sampling data from an AbstractDataModel sub-class using one of various factory methods sampledFromModel().

Examples:

// create an empty series and manually fill with values
XYDataSeries series;
series.append(0.0f, 42.0f);
series.append(1.0f, 66.6f);
series.append(4.2f, 13.37f);
qInfo() << series.data();
// output: (QPointF(0,42), QPointF(1,66.6), QPointF(4.2,13.37))
// sample from a data model
GaussianModel1D gaussian;
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, -2.0f, 2.0f, 5);
qInfo() << sampledSeries.data();
// output: (QPointF(-2,0.053991), QPointF(-1,0.241971), QPointF(0,0.398942), QPointF(1,0.241971), QPointF(2,0.053991))

If the gui_widgets_charts.pri module is available, data from XYDataSeries objects can easily be visualized with a gui::LineSeriesView.

Example:

// sample data from a Gaussian model
GaussianModel1D gaussian;
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, -2.0f, 2.0f, 50);
// visualize
gui::LineSeriesView::plot(sampledSeries); // or simply: gui::plot(sampledSeries);
Resulting visualization from the example above.

Constructor & Destructor Documentation

◆ XYDataSeries() [1/4]

CTL::XYDataSeries::XYDataSeries ( QList< QPointF > &&  dataSeries)

Constructs an XYDataSeries object and sets its data to dataSeries.

◆ XYDataSeries() [2/4]

CTL::XYDataSeries::XYDataSeries ( const QList< QPointF > &  dataSeries)

Constructs an XYDataSeries object and sets its data to dataSeries.

◆ XYDataSeries() [3/4]

CTL::XYDataSeries::XYDataSeries ( const QVector< float > &  x,
const QVector< float > &  y 
)

Constructs an XYDataSeries object and sets its data to the (x,y)-tuples formed by x and y. x and y must have the same size; throws an exception otherwise.

Example:

QVector<float> x(5), y(5);
std::iota(x.begin(), x.end(), 0.0f);
std::generate(y.begin(), y.end(), std::mt19937());
// create a series from x and y
XYDataSeries series(x, y);
qInfo() << series.data();
// output: (QPointF(0,3.49921e+09), QPointF(1,5.81869e+08), QPointF(2,3.89035e+09), QPointF(3,3.58633e+09), QPointF(4,5.45404e+08))

◆ XYDataSeries() [4/4]

CTL::XYDataSeries::XYDataSeries ( const std::vector< float > &  x,
const std::vector< float > &  y 
)

Constructs an XYDataSeries object and sets its data to the (x,y)-tuples formed by x and y. x and y must have the same size; throws an exception otherwise.

Example:

std::vector<float> x(5), y(5);
std::iota(x.begin(), x.end(), 0.0f);
std::generate(y.begin(), y.end(), std::mt19937());
// create a series from x and y
XYDataSeries series(x, y);
qInfo() << series.data();
// output: (QPointF(0,3.49921e+09), QPointF(1,5.81869e+08), QPointF(2,3.89035e+09), QPointF(3,3.58633e+09), QPointF(4,5.45404e+08))

Member Function Documentation

◆ append() [1/3]

void CTL::XYDataSeries::append ( const QPointF &  sample)

Appends the (x,y)-tuple sample to this series.

◆ append() [2/3]

void CTL::XYDataSeries::append ( float  x,
float  y 
)

Appends the (x,y)-tuple to this series.

◆ append() [3/3]

void CTL::XYDataSeries::append ( const QList< QPointF > &  series)

Appends all points from series to this series.

◆ data() [1/2]

const QList< QPointF > & CTL::PointSeriesBase::data

Returns a reference-to-const to the data managed by this instance.

◆ data() [2/2]

QList< QPointF > & CTL::XYDataSeries::data ( )

Returns a (modifiable) reference to the data of this series.

◆ remove() [1/2]

void CTL::XYDataSeries::remove ( uint  idx)

Removes the data point at index position idx. \ idx must be a valid index position in the series.

◆ remove() [2/2]

void CTL::XYDataSeries::remove ( const QPointF &  sample)

Removes the data point sample from the series. Does nothing if this series contains no such point. If sample is contained multiple times, all occurrences are removed.

◆ sampledFromModel() [1/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( const AbstractDataModel dataModel,
const QVector< float > &  samplingPoints 
)
static

Creates an XYDataSeries by sampling values from dataModel at each position specified in samplingPoints.

Example:

GaussianModel1D gaussian;
// define the sampling points and sample the series
auto samplingPts = QVector<float>( { -0.42f, 1.337f, 6.66f } );
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, samplingPts);
qInfo() << sampledSeries.data();
// output: (QPointF(-0.42,0.365263), QPointF(1.337,0.163209), QPointF(6.66,9.31567e-11))

◆ sampledFromModel() [2/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( std::shared_ptr< AbstractDataModel dataModel,
const QVector< float > &  samplingPoints 
)
static

Creates an XYDataSeries by sampling values from dataModel at each position specified in samplingPoints.

Example:

auto gaussian = std::make_shared<GaussianModel1D>();
// define the sampling points and sample the series
auto samplingPts = QVector<float>( { -0.42f, 1.337f, 6.66f } );
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, samplingPts);
qInfo() << sampledSeries.data();
// output: (QPointF(-0.42,0.365263), QPointF(1.337,0.163209), QPointF(6.66,9.31567e-11))

◆ sampledFromModel() [3/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( const AbstractDataModel dataModel,
const std::vector< float > &  samplingPoints 
)
static

Creates an XYDataSeries by sampling values from dataModel at each position specified in samplingPoints.

Example:

GaussianModel1D gaussian;
// define the sampling points and sample the series
auto samplingPts = std::vector<float>( { -0.42f, 1.337f, 6.66f } );
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, samplingPts);
qInfo() << sampledSeries.data();
// output: (QPointF(-0.42,0.365263), QPointF(1.337,0.163209), QPointF(6.66,9.31567e-11))

◆ sampledFromModel() [4/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( std::shared_ptr< AbstractDataModel dataModel,
const std::vector< float > &  samplingPoints 
)
static

Creates an XYDataSeries by sampling values from dataModel at each position specified in samplingPoints.

Example:

auto gaussian = std::make_shared<GaussianModel1D>();
// define the sampling points and sample the series
auto samplingPts = std::vector<float>( { -0.42f, 1.337f, 6.66f } );
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, samplingPts);
qInfo() << sampledSeries.data();
// output: (QPointF(-0.42,0.365263), QPointF(1.337,0.163209), QPointF(6.66,9.31567e-11))

◆ sampledFromModel() [5/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( const AbstractDataModel dataModel,
SamplingRange  samplingRange,
uint  nbSamples,
Sampling  samplingPattern = Linear 
)
static

Creates an XYDataSeries by sampling values from dataModel at nbSamples points covering the range specified by samplingRange. Sampling points will be distributed across the range according to the flag specified by samplingPattern. This can be either Linear or Exponential, resulting in a linear (i.e. equidistant samples) pattern or sampling points with exponentially increasing distances, respectively.

Example:

GaussianModel1D gaussian;
// define a sampling range from -2 to 2
auto range = SamplingRange(-2.0f, 2.0f);
// sample 5 (equidistantly spaced) points from the model
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, range, 5);
qInfo() << sampledSeries.data();
// output: (QPointF(-2,0.053991), QPointF(-1,0.241971), QPointF(0,0.398942), QPointF(1,0.241971), QPointF(2,0.053991))

◆ sampledFromModel() [6/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( std::shared_ptr< AbstractDataModel dataModel,
SamplingRange  samplingRange,
uint  nbSamples,
Sampling  samplingPattern = Linear 
)
static

Creates an XYDataSeries by sampling values from dataModel at nbSamples points covering the range specified by samplingRange. Sampling points will be distributed across the range according to the flag specified by samplingPattern. This can be either Linear or Exponential, resulting in a linear (i.e. equidistant samples) pattern or sampling points with exponentially increasing distances, respectively.

Example:

auto gaussian = std::make_shared<GaussianModel1D>();
// define a sampling range from -2 to 2
auto range = SamplingRange(-2.0f, 2.0f);
// sample 5 (equidistantly spaced) points from the model
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, range, 5);
qInfo() << sampledSeries.data();
// output: (QPointF(-2,0.053991), QPointF(-1,0.241971), QPointF(0,0.398942), QPointF(1,0.241971), QPointF(2,0.053991))

◆ sampledFromModel() [7/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( const AbstractDataModel dataModel,
float  from,
float  to,
uint  nbSamples,
Sampling  samplingPattern = Linear 
)
static

Creates an XYDataSeries by sampling values from dataModel at nbSamples points covering the range [from, to]. Sampling points will be distributed across the range according to the flag specified by samplingPattern. This can be either Linear or Exponential, resulting in a linear (i.e. equidistant samples) pattern or sampling points with exponentially increasing distances, respectively.

Example:

GaussianModel1D gaussian;
// sample 5 values in the range from -2 to 2 (equidistantly spaced)
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, -2.0f, 2.0f, 5);
qInfo() << sampledSeries.data();
// output: (QPointF(-2,0.053991), QPointF(-1,0.241971), QPointF(0,0.398942), QPointF(1,0.241971), QPointF(2,0.053991))

◆ sampledFromModel() [8/8]

XYDataSeries CTL::XYDataSeries::sampledFromModel ( std::shared_ptr< AbstractDataModel dataModel,
float  from,
float  to,
uint  nbSamples,
Sampling  samplingPattern = Linear 
)
static

Creates an XYDataSeries by sampling values from dataModel at nbSamples points covering the range [from, to]. Sampling points will be distributed across the range according to the flag specified by samplingPattern. This can be either Linear or Exponential, resulting in a linear (i.e. equidistant samples) pattern or sampling points with exponentially increasing distances, respectively.

Example:

auto gaussian = std::make_shared<GaussianModel1D>();
// sample 5 values in the range from -2 to 2 (equidistantly spaced)
auto sampledSeries = XYDataSeries::sampledFromModel(gaussian, -2.0f, 2.0f, 5);
qInfo() << sampledSeries.data();
// output: (QPointF(-2,0.053991), QPointF(-1,0.241971), QPointF(0,0.398942), QPointF(1,0.241971), QPointF(2,0.053991))

◆ scaleValues()

void CTL::PointSeriesBase::scaleValues

Normalizes the series by dividing all values (i.e. 'y' part) by the maximum absolute value.

Example:

auto x = std::vector<float>(6);
std::iota(x.begin(), x.end(), 0.0f);
auto y = std::vector<float>(6);
std::iota(y.begin(), y.end(), -3.0f);
auto series = XYDataSeries(x, y);
qInfo() << series.values();
// output: std::vector(-3, -2, -1, 0, 1, 2)
series.normalizeByMaxAbsVal();
qInfo() << series.values();
// output: std::vector(-1, -0.666667, -0.333333, 0, 0.333333, 0.666667)
/
void PointSeriesBase::normalizeByMaxAbsVal()
{
auto maxEl = std::max_element(_data.begin(), _data.end(),
[] (const QPointF& a, const QPointF& b) {
return qAbs(a.y()) < qAbs(b.y()); });
scaleValues(1.0f / qAbs(maxEl->y()));
}

.

Example:

auto x = std::vector<float>(6);
std::iota(x.begin(), x.end(), 0.0f);
auto y = std::vector<float>(6);
std::iota(y.begin(), y.end(), -3.0f);
auto series = XYDataSeries(x, y);
qInfo() << series.values();
// output: std::vector(-3, -2, -1, 0, 1, 2)
series.normalizeByMaxVal();
qInfo() << series.values();
// output: std::vector(-1.5, -1, -0.5, 0, 0.5, 1)
/
void PointSeriesBase::normalizeByMaxVal()
{
scaleValues(1.0f / max());
}

The documentation for this class was generated from the following files: