diff --git a/core/include/Data/SpectrogramSeries.h b/core/include/Data/SpectrogramSeries.h new file mode 100644 index 0000000..a58bc74 --- /dev/null +++ b/core/include/Data/SpectrogramSeries.h @@ -0,0 +1,33 @@ +#ifndef SCIQLOP_SPECTROGRAMSERIES_H +#define SCIQLOP_SPECTROGRAMSERIES_H + +#include "CoreGlobal.h" + +#include + +/** + * @brief The SpectrogramSeries class is the implementation for a data series representing a + * spectrogram. + * + * It defines values on a x-axis and a y-axis. + */ +class SCIQLOP_CORE_EXPORT SpectrogramSeries : public DataSeries<2> { +public: + /// Ctor + explicit SpectrogramSeries(std::vector xAxisData, std::vector yAxisData, + std::vector valuesData, const Unit &xAxisUnit, + const Unit &yAxisUnit, const Unit &valuesUnit); + + /// Ctor directly with the y-axis + explicit SpectrogramSeries(std::shared_ptr > xAxisData, const Unit &xAxisUnit, + std::shared_ptr > valuesData, const Unit &valuesUnit, + OptionalAxis yAxis); + + /// @sa DataSeries::clone() + std::unique_ptr clone() const override; + + /// @sa DataSeries::subDataSeries() + std::shared_ptr subDataSeries(const SqpRange &range) override; +}; + +#endif // SCIQLOP_SPECTROGRAMSERIES_H diff --git a/core/meson.build b/core/meson.build index 0271485..2256757 100644 --- a/core/meson.build +++ b/core/meson.build @@ -23,6 +23,7 @@ core_sources = [ 'src/Common/StringUtils.cpp', 'src/Common/MimeTypesDef.cpp', 'src/Data/ScalarSeries.cpp', + 'src/Data/SpectrogramSeries.cpp', 'src/Data/DataSeriesIterator.cpp', 'src/Data/ArrayDataIterator.cpp', 'src/Data/VectorSeries.cpp', diff --git a/core/src/Data/SpectrogramSeries.cpp b/core/src/Data/SpectrogramSeries.cpp new file mode 100644 index 0000000..2d91860 --- /dev/null +++ b/core/src/Data/SpectrogramSeries.cpp @@ -0,0 +1,45 @@ +#include + +SpectrogramSeries::SpectrogramSeries(std::vector xAxisData, std::vector yAxisData, + std::vector valuesData, const Unit &xAxisUnit, + const Unit &yAxisUnit, const Unit &valuesUnit) + : SpectrogramSeries{ + std::make_shared >(std::move(xAxisData)), xAxisUnit, + std::make_shared >(std::move(valuesData), yAxisData.size()), valuesUnit, + OptionalAxis{std::make_shared >(std::move(yAxisData)), yAxisUnit}} +{ +} + +SpectrogramSeries::SpectrogramSeries(std::shared_ptr > xAxisData, + const Unit &xAxisUnit, + std::shared_ptr > valuesData, + const Unit &valuesUnit, OptionalAxis yAxis) + : DataSeries{std::move(xAxisData), xAxisUnit, std::move(valuesData), valuesUnit, + std::move(yAxis)} +{ +} + +std::unique_ptr SpectrogramSeries::clone() const +{ + return std::make_unique(*this); +} + +std::shared_ptr SpectrogramSeries::subDataSeries(const SqpRange &range) +{ + auto subXAxisData = std::vector(); + auto subValuesData = QVector(); // Uses QVector to append easily values to it + this->lockRead(); + auto bounds = xAxisRange(range.m_TStart, range.m_TEnd); + for (auto it = bounds.first; it != bounds.second; ++it) { + subXAxisData.push_back(it->x()); + subValuesData.append(it->values()); + } + + auto yAxis = this->yAxis(); + this->unlock(); + + return std::make_shared( + std::make_shared >(std::move(subXAxisData)), this->xAxisUnit(), + std::make_shared >(subValuesData.toStdVector(), yAxis.size()), + this->valuesUnit(), std::move(yAxis)); +}