##// END OF EJS Templates
Merge pull request 390 from SciQLop-fork develop...
Merge pull request 390 from SciQLop-fork develop Develop

File last commit:

r922:e65d7f08d776
r1157:3d2098c90692 merge
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
r782 #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...
r895 #include <Data/SpectrogramSeries.h>
Alexandre Leroux
Generates vectors (2)...
r785 #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...
r922 #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)...
r784 namespace {
Alexandre Leroux
Initializes spectrogram management in the plugin...
r895 /// 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...
r922 /// 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)...
r784 /// 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
r914 std::vector<double> valuesData) const = 0;
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r894 /// 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)...
r784 };
Alexandre Leroux
Generates vectors (2)...
r785 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
r914 std::vector<double> valuesData) const override
Alexandre Leroux
Generates vectors (2)...
r785 {
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
r914 Unit{QStringLiteral("t"), true}, Unit{});
Alexandre Leroux
Generates vectors (2)...
r785 }
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r894
void generateValues(double x, std::vector<double> &values, int dataIndex) const override
{
values[dataIndex] = std::cos(x);
}
Alexandre Leroux
Generates vectors (2)...
r785 };
Alexandre Leroux
Initializes spectrogram management in the plugin...
r895
struct SpectrogramCosinus : public ICosinusType {
/// Ctor with y-axis
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r914 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...
r895 {
}
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
r914 std::vector<double> valuesData) const override
Alexandre Leroux
Initializes spectrogram management in the plugin...
r895 {
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r914 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...
r895 }
void generateValues(double x, std::vector<double> &values, int dataIndex) const override
{
Alexandre Leroux
Implements methods for generating spectrograms in the plugin
r896 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...
r922
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
r896
values[componentCount * dataIndex + i] = value;
}
Alexandre Leroux
Initializes spectrogram management in the plugin...
r895 }
std::vector<double> m_YAxisData;
Unit m_YAxisUnit;
Alexandre Leroux
Updates generation of spectrogram in the mock plugin to set values' unit
r914 Unit m_ValuesUnit;
Alexandre Leroux
Initializes spectrogram management in the plugin...
r895 };
Alexandre Leroux
Generates vectors (2)...
r785 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
r914 std::vector<double> valuesData) const override
Alexandre Leroux
Generates vectors (2)...
r785 {
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
r914 Unit{QStringLiteral("t"), true}, Unit{});
Alexandre Leroux
Generates vectors (2)...
r785 }
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r894
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)...
r785 };
Alexandre Leroux
Generates vectors (3)...
r786 /// 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...
r895 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
r914 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...
r895 }
Alexandre Leroux
Generates vectors (3)...
r786 else if (type.compare(QStringLiteral("vector"), Qt::CaseInsensitive) == 0) {
return std::make_unique<VectorCosinus>();
}
else {
return nullptr;
}
}
Alexandre Leroux
Generates vectors (1)...
r784 } // 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
r781 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)...
r786 // 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
r782 // 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
r782 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)...
r787 // 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)...
r787 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)
r894 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)
r894 xAxisData[dataIndex] = x;
Alexandre Leroux
Generates vectors (4)...
r787
Alexandre Leroux
MockPlugin: moving the generation of values in each type (scalar, vector, and later spectrogram)
r894 // 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:...
r808 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
r914 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
r781 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
r818 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:...
r808
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;
}