##// END OF EJS Templates
Implements validation of variable's data (1)...
Implements validation of variable's data (1) Creates helper used to validate data, depending on the server set at compile time

File last commit:

r923:e65d7f08d776
r1231:077a4fb03e91
Show More
CosinusProvider.cpp
291 lines | 10.7 KiB | text/x-c | CppLexer
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128 #include "CosinusProvider.h"
Alexandre Leroux
Handles parametric frequency
r780 #include "MockDefs.h"
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128
#include <Data/DataProviderParameters.h>
#include <Data/ScalarSeries.h>
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 #include <Data/SpectrogramSeries.h>
Alexandre Leroux
Generates vectors (2)...
r783 #include <Data/VectorSeries.h>
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128
Add cmath header missing
r135 #include <cmath>
Alexandre Leroux
Introduces NaN and zero values in data of the mock spectrogram...
r923 #include <set>
Add cmath header missing
r135
Add DownloadProgress emission for mock plugin
r428 #include <QFuture>
Add current progression for thread fix
r364 #include <QThread>
Add DownloadProgress emission for mock plugin
r428 #include <QtConcurrent/QtConcurrent>
Fix the cosinus bug....
r298
The cosinus provider can now handle data request
r231 Q_LOGGING_CATEGORY(LOG_CosinusProvider, "CosinusProvider")
Alexandre Leroux
Generates vectors (1)...
r782 namespace {
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 /// Number of bands generated for a spectrogram
const auto SPECTROGRAM_NUMBER_BANDS = 30;
Alexandre Leroux
Introduces NaN and zero values in data of the mock spectrogram...
r923 /// Bands for which to generate NaN values for a spectrogram
const auto SPECTROGRAM_NAN_BANDS = std::set<int>{1, 3, 10, 20};
/// Bands for which to generate zeros for a spectrogram
const auto SPECTROGRAM_ZERO_BANDS = std::set<int>{2, 15, 19, 29};
Alexandre Leroux
Generates vectors (1)...
r782 /// Abstract cosinus type
struct ICosinusType {
virtual ~ICosinusType() = default;
/// @return the number of components generated for the type
virtual int componentCount() const = 0;
/// @return the data series created for the type
virtual std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 std::vector<double> valuesData) const = 0;
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r898 /// Generates values (one value per component)
/// @param x the x-axis data used to generate values
/// @param values the vector in which to insert the generated values
/// @param dataIndex the index of insertion of the generated values
///
virtual void generateValues(double x, std::vector<double> &values, int dataIndex) const = 0;
Alexandre Leroux
Generates vectors (1)...
r782 };
Alexandre Leroux
Generates vectors (2)...
r783 struct ScalarCosinus : public ICosinusType {
int componentCount() const override { return 1; }
std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 std::vector<double> valuesData) const override
Alexandre Leroux
Generates vectors (2)...
r783 {
return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData),
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 Unit{QStringLiteral("t"), true}, Unit{});
Alexandre Leroux
Generates vectors (2)...
r783 }
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r898
void generateValues(double x, std::vector<double> &values, int dataIndex) const override
{
values[dataIndex] = std::cos(x);
}
Alexandre Leroux
Generates vectors (2)...
r783 };
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899
struct SpectrogramCosinus : public ICosinusType {
/// Ctor with y-axis
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 explicit SpectrogramCosinus(std::vector<double> yAxisData, Unit yAxisUnit, Unit valuesUnit)
: m_YAxisData{std::move(yAxisData)},
m_YAxisUnit{std::move(yAxisUnit)},
m_ValuesUnit{std::move(valuesUnit)}
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 {
}
int componentCount() const override { return m_YAxisData.size(); }
std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 std::vector<double> valuesData) const override
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 {
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 return std::make_shared<SpectrogramSeries>(
std::move(xAxisData), m_YAxisData, std::move(valuesData),
Unit{QStringLiteral("t"), true}, m_YAxisUnit, m_ValuesUnit);
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 }
void generateValues(double x, std::vector<double> &values, int dataIndex) const override
{
Alexandre Leroux
Implements methods for generating spectrograms in the plugin
r900 auto componentCount = this->componentCount();
for (int i = 0; i < componentCount; ++i) {
auto y = m_YAxisData[i];
Alexandre Leroux
Introduces NaN and zero values in data of the mock spectrogram...
r923
double value;
if (SPECTROGRAM_ZERO_BANDS.find(y) != SPECTROGRAM_ZERO_BANDS.end()) {
value = 0.;
}
else if (SPECTROGRAM_NAN_BANDS.find(y) != SPECTROGRAM_NAN_BANDS.end()) {
value = std::numeric_limits<double>::quiet_NaN();
}
else {
// Generates value for non NaN/zero bands
auto r = 3 * std::sqrt(x * x + y * y) + 1e-2;
value = 2 * x * (std::cos(r + 2) / r - std::sin(r + 2) / r);
}
Alexandre Leroux
Implements methods for generating spectrograms in the plugin
r900
values[componentCount * dataIndex + i] = value;
}
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 }
std::vector<double> m_YAxisData;
Unit m_YAxisUnit;
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 Unit m_ValuesUnit;
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 };
Alexandre Leroux
Generates vectors (2)...
r783 struct VectorCosinus : public ICosinusType {
int componentCount() const override { return 3; }
std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 std::vector<double> valuesData) const override
Alexandre Leroux
Generates vectors (2)...
r783 {
return std::make_shared<VectorSeries>(std::move(xAxisData), std::move(valuesData),
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 Unit{QStringLiteral("t"), true}, Unit{});
Alexandre Leroux
Generates vectors (2)...
r783 }
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r898
void generateValues(double x, std::vector<double> &values, int dataIndex) const override
{
// Generates value for each component: cos(x), cos(x)/2, cos(x)/3
auto xValue = std::cos(x);
auto componentCount = this->componentCount();
for (auto i = 0; i < componentCount; ++i) {
values[componentCount * dataIndex + i] = xValue / (i + 1);
}
}
Alexandre Leroux
Generates vectors (2)...
r783 };
Alexandre Leroux
Generates vectors (3)...
r784 /// Converts string to cosinus type
/// @return the cosinus type if the string could be converted, nullptr otherwise
std::unique_ptr<ICosinusType> cosinusType(const QString &type) noexcept
{
if (type.compare(QStringLiteral("scalar"), Qt::CaseInsensitive) == 0) {
return std::make_unique<ScalarCosinus>();
}
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 else if (type.compare(QStringLiteral("spectrogram"), Qt::CaseInsensitive) == 0) {
// Generates default y-axis data for spectrogram [0., 1., 2., ...]
std::vector<double> yAxisData(SPECTROGRAM_NUMBER_BANDS);
std::iota(yAxisData.begin(), yAxisData.end(), 0.);
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 return std::make_unique<SpectrogramCosinus>(std::move(yAxisData), Unit{"eV"},
Unit{"eV/(cm^2-s-sr-eV)"});
Alexandre Leroux
Initializes spectrogram management in the plugin...
r899 }
Alexandre Leroux
Generates vectors (3)...
r784 else if (type.compare(QStringLiteral("vector"), Qt::CaseInsensitive) == 0) {
return std::make_unique<VectorCosinus>();
}
else {
return nullptr;
}
}
Alexandre Leroux
Generates vectors (1)...
r782 } // namespace
Alexandre Leroux
Generates and registers clone provider
r712 std::shared_ptr<IDataProvider> CosinusProvider::clone() const
{
// No copy is made in clone
return std::make_shared<CosinusProvider>();
}
Implementation of V5 acquisition
r539 std::shared_ptr<IDataSeries> CosinusProvider::retrieveData(QUuid acqIdentifier,
Alexandre Leroux
Updates cosinus provider to handle metadata
r779 const SqpRange &dataRangeRequested,
const QVariantHash &data)
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128 {
Add DownloadProgress emission for mock plugin
r428 // TODO: Add Mutex
Fix the cosinus bug....
r298 auto dataIndex = 0;
The cosinus provider can now handle data request
r231
Alexandre Leroux
Generates vectors (3)...
r784 // Retrieves cosinus type
auto typeVariant = data.value(COSINUS_TYPE_KEY, COSINUS_TYPE_DEFAULT_VALUE);
if (!typeVariant.canConvert<QString>()) {
qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: invalid type");
return nullptr;
}
auto type = cosinusType(typeVariant.toString());
if (!type) {
qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: unknown type");
return nullptr;
}
Alexandre Leroux
Handles parametric frequency
r780 // Retrieves frequency
auto freqVariant = data.value(COSINUS_FREQUENCY_KEY, COSINUS_FREQUENCY_DEFAULT_VALUE);
if (!freqVariant.canConvert<double>()) {
qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: invalid frequency");
return nullptr;
}
The cosinus provider can now handle data request
r231 // Gets the timerange from the parameters
Alexandre Leroux
Handles parametric frequency
r780 double freq = freqVariant.toDouble();
double start = std::ceil(dataRangeRequested.m_TStart * freq);
double end = std::floor(dataRangeRequested.m_TEnd * freq);
The cosinus provider can now handle data request
r231
// We assure that timerange is valid
if (end < start) {
std::swap(start, end);
}
Alexandre Leroux
Implements unit test (3)...
r745 // Generates scalar series containing cosinus values (one value per second, end value is
// included)
auto dataCount = end - start + 1;
The cosinus provider can now handle data request
r231
Alexandre Leroux
Generates vectors (4)...
r785 // Number of components (depending on the cosinus type)
auto componentCount = type->componentCount();
Alexandre Leroux
Uses std::vector instead of QVector in ArrayData (1)...
r694 auto xAxisData = std::vector<double>{};
Alexandre Leroux
Updates cosinus provider...
r452 xAxisData.resize(dataCount);
Alexandre Leroux
Uses std::vector instead of QVector in ArrayData (1)...
r694 auto valuesData = std::vector<double>{};
Alexandre Leroux
Generates vectors (4)...
r785 valuesData.resize(dataCount * componentCount);
Add DownloadProgress emission for mock plugin
r428
int progress = 0;
Alexandre Leroux
Updates cosinus provider...
r452 auto progressEnd = dataCount;
Alexandre Leroux
Implements unit test (3)...
r745 for (auto time = start; time <= end; ++time, ++dataIndex) {
Implementation of V5 acquisition
r539 auto it = m_VariableToEnableProvider.find(acqIdentifier);
Add DownloadProgress emission for mock plugin
r428 if (it != m_VariableToEnableProvider.end() && it.value()) {
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r898 const auto x = time / freq;
Alexandre Leroux
Updates cosinus provider...
r452
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r898 xAxisData[dataIndex] = x;
Alexandre Leroux
Generates vectors (4)...
r785
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r898 // Generates values (depending on the type)
type->generateValues(x, valuesData, dataIndex);
Add DownloadProgress emission for mock plugin
r428
// progression
int currentProgress = (time - start) * 100.0 / progressEnd;
if (currentProgress != progress) {
progress = currentProgress;
Implementation of V5 acquisition
r539 emit dataProvidedProgress(acqIdentifier, progress);
Improve cosinus tests with:...
r811 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::retrieveData"
<< QThread::currentThread()->objectName()
<< progress;
Implementation of progression
r750 // NOTE: Try to use multithread if possible
Add DownloadProgress emission for mock plugin
r428 }
}
else {
if (!it.value()) {
qCDebug(LOG_CosinusProvider())
<< "CosinusProvider::retrieveData: ARRET De l'acquisition detecté"
<< end - time;
}
}
The cosinus provider can now handle data request
r231 }
Implementation of progression
r750 if (progress != 100) {
// We can close progression beacause all data has been retrieved
emit dataProvidedProgress(acqIdentifier, 100);
}
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r915 return type->createDataSeries(std::move(xAxisData), std::move(valuesData));
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128 }
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310
Implementation of V5 acquisition
r539 void CosinusProvider::requestDataLoading(QUuid acqIdentifier,
const DataProviderParameters &parameters)
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 {
Add DownloadProgress emission for mock plugin
r428 // TODO: Add Mutex
Implementation of V5 acquisition
r539 m_VariableToEnableProvider[acqIdentifier] = true;
Initialisation of the graph range at creation in a new graphe, or inside...
r548 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::requestDataLoading"
Change info to debug on thread display log
r367 << QThread::currentThread()->objectName();
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 // NOTE: Try to use multithread if possible
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r408 const auto times = parameters.m_Times;
Add DownloadProgress emission for mock plugin
r428
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r408 for (const auto &dateTime : qAsConst(times)) {
Implementation of V5 acquisition
r539 if (m_VariableToEnableProvider[acqIdentifier]) {
Alexandre Leroux
Updates cosinus provider to handle metadata
r779 auto scalarSeries = this->retrieveData(acqIdentifier, dateTime, parameters.m_Data);
Implementation of V5 acquisition
r539 emit dataProvided(acqIdentifier, scalarSeries, dateTime);
Add DownloadProgress emission for mock plugin
r428 }
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 }
}
Implement of the abort download process
r422
Implementation of V5 acquisition
r539 void CosinusProvider::requestDataAborting(QUuid acqIdentifier)
Implement of the abort download process
r422 {
Implementation of V5 acquisition
r539 qCDebug(LOG_CosinusProvider()) << "CosinusProvider::requestDataAborting" << acqIdentifier
Remove abort button validity when the progress is finished (eg. == 0)
r432 << QThread::currentThread()->objectName();
Implementation of V5 acquisition
r539 auto it = m_VariableToEnableProvider.find(acqIdentifier);
Add DownloadProgress emission for mock plugin
r428 if (it != m_VariableToEnableProvider.end()) {
it.value() = false;
}
else {
Improve acquisition robustness
r823 qCDebug(LOG_CosinusProvider())
Add DownloadProgress emission for mock plugin
r428 << tr("Aborting progression of inexistant identifier detected !!!");
}
Implement of the abort download process
r422 }
Improve cosinus tests with:...
r811
std::shared_ptr<IDataSeries> CosinusProvider::provideDataSeries(const SqpRange &dataRangeRequested,
const QVariantHash &data)
{
auto uid = QUuid::createUuid();
m_VariableToEnableProvider[uid] = true;
auto dataSeries = this->retrieveData(uid, dataRangeRequested, data);
m_VariableToEnableProvider.remove(uid);
return dataSeries;
}