##// END OF EJS Templates
Mostly working Spectrograms...
jeandet -
r84:483146a07a5f
parent child
Show More
@@ -1,32 +1,33
1 #!/usr/bin/env python3
1 #!/usr/bin/env python3
2
2
3 from dumper import *
3 from dumper import *
4
4
5 import sys
5 import sys
6 import os
6 import os
7 import numpy as np
7 import numpy as np
8 import datetime
8 import datetime
9 import time
9 import time
10
10
11
11
12 def qdump__DateTimeRange(d , value):
12 def qdump__DateTimeRange(d , value):
13 """
13 """
14
14
15 :param d: DumperBase
15 :param d: DumperBase
16 :param value: Value
16 :param value: Value
17 """
17 """
18 tstart = datetime.datetime.utcfromtimestamp(value['m_TStart'].to('d'))
18 tstart = datetime.datetime.utcfromtimestamp(value['m_TStart'].to('d'))
19 tstop = datetime.datetime.utcfromtimestamp(value['m_TEnd'].to('d'))
19 tstop = datetime.datetime.utcfromtimestamp(value['m_TEnd'].to('d'))
20 delta = str(tstop - tstart)
20 delta = str(tstop - tstart)
21 tstart, tstop = str(tstart), str(tstop)
21 tstart, tstop = str(tstart), str(tstop)
22
22
23 d.putValue(tstart + ' : ' + tstop)
23 d.putValue(tstart + ' : ' + tstop)
24 d.putNumChild(3)
24 d.putNumChild(3)
25 if d.isExpanded():
25 if d.isExpanded():
26 with Children(d, 3):
26 with Children(d, 3):
27 with SubItem(d, "start"):
27 with SubItem(d, "start"):
28 d.putValue(tstart)
28 d.putValue(tstart)
29 with SubItem(d, "stop"):
29 with SubItem(d, "stop"):
30 d.putValue(tstop)
30 d.putValue(tstop)
31 with SubItem(d, "delta"):
31 with SubItem(d, "delta"):
32 d.putValue(delta)
32 d.putValue(delta)
33
@@ -1,1 +1,1
1 Subproject commit f5f4debc597b41ab1849dfc02b6e092bf58c32d2
1 Subproject commit 22e3e4553178230053aac40131b4fdb36c163075
@@ -1,29 +1,37
1 #ifndef CPP_UTILS_H
1 #ifndef CPP_UTILS_H
2 #define CPP_UTILS_H
2 #define CPP_UTILS_H
3
3
4 #include <functional>
5 #include <tuple>
4 #include <type_traits>
6 #include <type_traits>
5
7
6 template< class... >
8 template<class...> using void_t = void;
7 using void_t = void;
8
9
9 #define HAS_METHOD(method)\
10 #define HAS_METHOD(method) \
10 template <class T, class=void>\
11 template<class T, class = void> struct _has_##method : std::false_type \
11 struct _has_##method : std::false_type{};\
12 {}; \
12 \
13 \
13 template <class T>\
14 template<class T> \
14 struct _has_##method<T, void_t<std::is_member_function_pointer<decltype(&T::method)>>>\
15 struct _has_##method< \
15 : std::true_type{};\
16 T, void_t<std::is_member_function_pointer<decltype(&T::method)>>> \
16 \
17 : std::true_type \
17 template< class T>\
18 {}; \
18 static inline constexpr bool has_##method = _has_##method<T>::value;
19 \
20 template<class T> \
21 static inline constexpr bool has_##method = _has_##method<T>::value;
19
22
20 //taken from here https://www.fluentcpp.com/2017/10/27/function-aliases-cpp/
23 // taken from here https://www.fluentcpp.com/2017/10/27/function-aliases-cpp/
21 #define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \
24 #define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \
22 template <typename... Args> \
25 template<typename... Args> \
23 inline auto highLevelF(Args &&... args)->decltype(lowLevelF(std::forward<Args>(args)...)) \
26 inline auto highLevelF(Args&&... args) \
24 { \
27 ->decltype(lowLevelF(std::forward<Args>(args)...)) \
25 return lowLevelF(std::forward<Args>(args)...); \
28 { \
26 }
29 return lowLevelF(std::forward<Args>(args)...); \
30 }
27
31
32 template<typename T> constexpr T diff(const std::pair<T, T>& p)
33 {
34 return p.second - p.first;
35 }
28
36
29 #endif // CPP_UTILS_H
37 #endif // CPP_UTILS_H
@@ -1,35 +1,35
1 #ifndef SCIQLOP_SPECTROGRAMTIMESERIE_H
1 #ifndef SCIQLOP_SPECTROGRAMTIMESERIE_H
2 #define SCIQLOP_SPECTROGRAMTIMESERIE_H
2 #define SCIQLOP_SPECTROGRAMTIMESERIE_H
3
3
4 #include "CoreGlobal.h"
4 #include "CoreGlobal.h"
5
5
6 #include <TimeSeries.h>
6 #include <TimeSeries.h>
7
7
8 class SCIQLOP_CORE_EXPORT SpectrogramTimeSerie
8 class SCIQLOP_CORE_EXPORT SpectrogramTimeSerie
9 : public TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>
9 : public TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>
10 {
10 {
11 public:
11 public:
12 using item_t =
12 using item_t =
13 decltype(std::declval<
13 decltype(std::declval<
14 TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>>()[0]);
14 TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>>()[0]);
15
15
16 using iterator_t = decltype(
16 using iterator_t = decltype(
17 std::declval<TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>>()
17 std::declval<TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>>()
18 .begin());
18 .begin());
19
19
20 SpectrogramTimeSerie() {}
20 SpectrogramTimeSerie() {}
21 SpectrogramTimeSerie(SpectrogramTimeSerie::axis_t& t,
21 SpectrogramTimeSerie(SpectrogramTimeSerie::axis_t&& t,
22 SpectrogramTimeSerie::axis_t& y,
22 SpectrogramTimeSerie::axis_t&& y,
23 SpectrogramTimeSerie::container_type<
23 SpectrogramTimeSerie::container_type<
24 SpectrogramTimeSerie::raw_value_type>& values,
24 SpectrogramTimeSerie::raw_value_type>&& values,
25 std::vector<std::size_t>& shape)
25 std::vector<std::size_t>& shape)
26 : TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>(t, values, shape)
26 : TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>(t, values, shape)
27 {
27 {
28 _axes[1] = y;
28 _axes[1] = y;
29 }
29 }
30
30
31 ~SpectrogramTimeSerie() = default;
31 ~SpectrogramTimeSerie() = default;
32 using TimeSerie::TimeSerie;
32 using TimeSerie::TimeSerie;
33 };
33 };
34
34
35 #endif // SCIQLOP_SPECTROGRAMTIMESERIE_H
35 #endif // SCIQLOP_SPECTROGRAMTIMESERIE_H
@@ -1,41 +1,83
1 #ifndef TIMESERIESUTILS_H
1 #ifndef TIMESERIESUTILS_H
2 #define TIMESERIESUTILS_H
2 #define TIMESERIESUTILS_H
3 #include "MultiComponentTimeSerie.h"
3 #include "MultiComponentTimeSerie.h"
4 #include "ScalarTimeSerie.h"
4 #include "ScalarTimeSerie.h"
5 #include "SpectrogramTimeSerie.h"
5 #include "SpectrogramTimeSerie.h"
6 #include "VectorTimeSerie.h"
6 #include "VectorTimeSerie.h"
7
7
8 #include <TimeSeries.h>
8 #include <TimeSeries.h>
9 #include <cmath>
9 #include <memory>
10 #include <memory>
10
11
11 namespace TimeSeriesUtils
12 namespace TimeSeriesUtils
12 {
13 {
13 template<typename T> TimeSeries::ITimeSerie* copy(T input_ts)
14 template<typename T> TimeSeries::ITimeSerie* copy(T input_ts)
14 {
15 {
15 if constexpr(std::is_base_of_v<TimeSeries::ITimeSerie, T>)
16 if constexpr(std::is_base_of_v<TimeSeries::ITimeSerie, T>)
16 {
17 {
17 if(auto ts = dynamic_cast<VectorTimeSerie*>(input_ts))
18 if(auto ts = dynamic_cast<VectorTimeSerie*>(input_ts))
18 { return new VectorTimeSerie(*ts); }
19 { return new VectorTimeSerie(*ts); }
19 if(auto ts = dynamic_cast<ScalarTimeSerie*>(input_ts))
20 if(auto ts = dynamic_cast<ScalarTimeSerie*>(input_ts))
20 { return new ScalarTimeSerie(*ts); }
21 { return new ScalarTimeSerie(*ts); }
21 if(auto ts = dynamic_cast<MultiComponentTimeSerie*>(input_ts))
22 if(auto ts = dynamic_cast<MultiComponentTimeSerie*>(input_ts))
22 { return new MultiComponentTimeSerie(*ts); }
23 { return new MultiComponentTimeSerie(*ts); }
23 if(auto ts = dynamic_cast<SpectrogramTimeSerie*>(input_ts))
24 if(auto ts = dynamic_cast<SpectrogramTimeSerie*>(input_ts))
24 { return new SpectrogramTimeSerie(*ts); }
25 { return new SpectrogramTimeSerie(*ts); }
25 }
26 }
26 else
27 else
27 {
28 {
28 if(auto ts = std::dynamic_pointer_cast<VectorTimeSerie>(input_ts))
29 if(auto ts = std::dynamic_pointer_cast<VectorTimeSerie>(input_ts))
29 { return new VectorTimeSerie(*ts); }
30 { return new VectorTimeSerie(*ts); }
30 if(auto ts = std::dynamic_pointer_cast<ScalarTimeSerie>(input_ts))
31 if(auto ts = std::dynamic_pointer_cast<ScalarTimeSerie>(input_ts))
31 { return new ScalarTimeSerie(*ts); }
32 { return new ScalarTimeSerie(*ts); }
32 if(auto ts = std::dynamic_pointer_cast<SpectrogramTimeSerie>(input_ts))
33 if(auto ts = std::dynamic_pointer_cast<SpectrogramTimeSerie>(input_ts))
33 { return new SpectrogramTimeSerie(*ts); }
34 { return new SpectrogramTimeSerie(*ts); }
34 if(auto ts = std::dynamic_pointer_cast<MultiComponentTimeSerie>(input_ts))
35 if(auto ts = std::dynamic_pointer_cast<MultiComponentTimeSerie>(input_ts))
35 { return new MultiComponentTimeSerie(*ts); }
36 { return new MultiComponentTimeSerie(*ts); }
36 }
37 }
37 return nullptr;
38 return nullptr;
38 }
39 }
40
41 struct axis_properties
42 {
43 double range;
44 double max_resolution;
45 bool is_log;
46 };
47
48 constexpr auto IsLog = true;
49 constexpr auto IsLinear = false;
50
51 constexpr auto CheckMedian = true;
52 constexpr auto DontCheckMedian = false;
53
54 template<bool is_log, bool check_median>
55 axis_properties axis_analysis(
56 typename std::conditional<is_log, std::vector<double>&,
57 const std::vector<double>&>::type axis)
58 {
59 std::vector<double> axis_diff(axis.size());
60 if constexpr(is_log)
61 {
62 std::transform(std::cbegin(axis), std::cend(axis), std::begin(axis),
63 [](const auto v) { return std::log10(v); });
64 }
65 auto range = *(std::cend(axis) - 1) - *(std::begin(axis));
66 std::adjacent_difference(std::cbegin(axis), std::cend(axis),
67 std::begin(axis_diff));
68 auto min_diff =
69 (*std::min_element(std::cbegin(axis_diff) + 1, std::cend(axis_diff)));
70 if constexpr(check_median)
71 {
72 std::nth_element(std::begin(axis_diff) + 1,
73 std::begin(axis_diff) + axis_diff.size() / 2,
74 std::end(axis_diff));
75 auto median_diff = *(std::begin(axis_diff) + axis_diff.size() / 2);
76 if(median_diff > (4 * min_diff)) min_diff = median_diff;
77 }
78 return {range, min_diff, is_log};
79 }
80
39 } // namespace TimeSeriesUtils
81 } // namespace TimeSeriesUtils
40
82
41 #endif
83 #endif
@@ -1,226 +1,236
1 #include "Variable/Variable2.h"
1 #include "Variable/Variable2.h"
2
2
3 #define PROPERTY_(property, getter, setter, type) \
3 #define PROPERTY_(property, getter, setter, type) \
4 type getter() noexcept \
4 type getter() noexcept \
5 { \
5 { \
6 QReadLocker lock{&m_Lock}; \
6 QReadLocker lock{&m_Lock}; \
7 return property; \
7 return property; \
8 } \
8 } \
9 void setter(const type& getter) noexcept \
9 void setter(const type& getter) noexcept \
10 { \
10 { \
11 QWriteLocker lock{&m_Lock}; \
11 QWriteLocker lock{&m_Lock}; \
12 property = getter; \
12 property = getter; \
13 } \
13 } \
14 type property;
14 type property;
15
15
16 #define V_FW_GETTER_SETTER(getter, setter, type) \
16 #define V_FW_GETTER_SETTER(getter, setter, type) \
17 type Variable2::getter() \
17 type Variable2::getter() \
18 { \
18 { \
19 QReadLocker lock{&this->m_lock}; \
19 QReadLocker lock{&this->m_lock}; \
20 return impl->getter(); \
20 return impl->getter(); \
21 } \
21 } \
22 void Variable2::setter(const type& value) \
22 void Variable2::setter(const type& value) \
23 { \
23 { \
24 { \
24 { \
25 QWriteLocker lock{&this->m_lock}; \
25 QWriteLocker lock{&this->m_lock}; \
26 impl->setter(value); \
26 impl->setter(value); \
27 } \
27 } \
28 emit updated(this->ID()); \
28 emit updated(this->ID()); \
29 }
29 }
30
30
31 static DataSeriesType findDataSeriesType(const QVariantHash& metadata)
31 static DataSeriesType findDataSeriesType(const QVariantHash& metadata)
32 {
32 {
33 auto dataSeriesType = DataSeriesType::NONE;
33 auto dataSeriesType = DataSeriesType::NONE;
34
34
35 // Go through the metadata and stop at the first value that could be converted
35 // Go through the metadata and stop at the first value that could be converted
36 // to DataSeriesType
36 // to DataSeriesType
37 for(auto it = metadata.cbegin(), end = metadata.cend();
37 for(auto it = metadata.cbegin(), end = metadata.cend();
38 it != end && dataSeriesType == DataSeriesType::NONE; ++it)
38 it != end && dataSeriesType == DataSeriesType::NONE; ++it)
39 {
39 {
40 dataSeriesType = DataSeriesTypeUtils::fromString(it.value().toString());
40 dataSeriesType = DataSeriesTypeUtils::fromString(it.value().toString());
41 }
41 }
42
42
43 return dataSeriesType;
43 return dataSeriesType;
44 }
44 }
45
45
46 std::shared_ptr<TimeSeries::ITimeSerie>
46 std::shared_ptr<TimeSeries::ITimeSerie>
47 clone_ts(const std::shared_ptr<TimeSeries::ITimeSerie>& ts)
47 clone_ts(const std::shared_ptr<TimeSeries::ITimeSerie>& ts)
48 {
48 {
49 if(auto scal_ts = std::dynamic_pointer_cast<ScalarTimeSerie>(ts))
49 if(auto scal_ts = std::dynamic_pointer_cast<ScalarTimeSerie>(ts))
50 return std::make_shared<ScalarTimeSerie>(*scal_ts);
50 return std::make_shared<ScalarTimeSerie>(*scal_ts);
51 if(auto scal_ts = std::dynamic_pointer_cast<VectorTimeSerie>(ts))
51 if(auto scal_ts = std::dynamic_pointer_cast<VectorTimeSerie>(ts))
52 return std::make_shared<VectorTimeSerie>(*scal_ts);
52 return std::make_shared<VectorTimeSerie>(*scal_ts);
53 if(auto scal_ts = std::dynamic_pointer_cast<SpectrogramTimeSerie>(ts))
53 if(auto scal_ts = std::dynamic_pointer_cast<SpectrogramTimeSerie>(ts))
54 return std::make_shared<SpectrogramTimeSerie>(*scal_ts);
54 return std::make_shared<SpectrogramTimeSerie>(*scal_ts);
55 return nullptr;
55 return nullptr;
56 }
56 }
57
57
58 struct Variable2::VariablePrivate
58 struct Variable2::VariablePrivate
59 {
59 {
60 VariablePrivate(const QString& name, const QVariantHash& metadata)
60 VariablePrivate(const QString& name, const QVariantHash& metadata)
61 : m_Name{name}, m_Range{INVALID_RANGE}, m_Metadata{metadata}, m_TimeSerie{
61 : m_Name{name}, m_Range{INVALID_RANGE}, m_Metadata{metadata}, m_TimeSerie{
62 nullptr}
62 nullptr}
63 {
63 {
64 switch(findDataSeriesType(metadata))
64 switch(findDataSeriesType(metadata))
65 {
65 {
66 case DataSeriesType::SCALAR:
66 case DataSeriesType::SCALAR:
67 m_TimeSerie = std::make_shared<ScalarTimeSerie>(ScalarTimeSerie{});
67 m_TimeSerie = std::make_shared<ScalarTimeSerie>(ScalarTimeSerie{});
68 break;
68 break;
69 case DataSeriesType::VECTOR:
69 case DataSeriesType::VECTOR:
70 m_TimeSerie = std::make_shared<VectorTimeSerie>(VectorTimeSerie{});
70 m_TimeSerie = std::make_shared<VectorTimeSerie>(VectorTimeSerie{});
71 break;
71 break;
72 case DataSeriesType::SPECTROGRAM:
72 case DataSeriesType::SPECTROGRAM:
73 m_TimeSerie =
73 m_TimeSerie =
74 std::make_shared<SpectrogramTimeSerie>(SpectrogramTimeSerie{});
74 std::make_shared<SpectrogramTimeSerie>(SpectrogramTimeSerie{});
75 break;
75 break;
76 case DataSeriesType::MULTICOMPONENT:
76 case DataSeriesType::MULTICOMPONENT:
77 {
77 {
78 std::size_t count = metadata.value(QString("size"), 0).toInt();
78 std::size_t count = metadata.value(QString("size"), 0).toInt();
79 m_TimeSerie = std::make_shared<MultiComponentTimeSerie>(
79 m_TimeSerie = std::make_shared<MultiComponentTimeSerie>(
80 MultiComponentTimeSerie{{0, count}});
80 MultiComponentTimeSerie{{0, count}});
81 }
81 }
82 break;
82 break;
83 default: break;
83 default: break;
84 }
84 }
85 }
85 }
86
86
87 VariablePrivate(const VariablePrivate& other)
87 VariablePrivate(const VariablePrivate& other)
88 : m_Name{other.m_Name}, m_Range{other.m_Range},
88 : m_Name{other.m_Name}, m_Range{other.m_Range},
89 m_Metadata{other.m_Metadata}, m_RealRange{other.m_RealRange}
89 m_Metadata{other.m_Metadata}, m_RealRange{other.m_RealRange}
90 {
90 {
91 m_TimeSerie = clone_ts(other.m_TimeSerie);
91 m_TimeSerie = clone_ts(other.m_TimeSerie);
92 }
92 }
93
93
94 std::size_t nbPoints()
94 std::size_t nbPoints()
95 {
95 {
96 if(m_TimeSerie) return m_TimeSerie->size();
96 if(m_TimeSerie) return m_TimeSerie->size();
97 return 0;
97 return 0;
98 }
98 }
99 DataSeriesType type() const
99 DataSeriesType type() const
100 {
100 {
101 return DataSeriesTypeUtils::type(m_TimeSerie.get());
101 return DataSeriesTypeUtils::type(m_TimeSerie.get());
102 }
102 }
103
103
104 PROPERTY_(m_Name, name, setName, QString)
104 PROPERTY_(m_Name, name, setName, QString)
105 PROPERTY_(m_Range, range, setRange, DateTimeRange)
105 PROPERTY_(m_Range, range, setRange, DateTimeRange)
106 PROPERTY_(m_Metadata, metadata, setMetadata, QVariantHash)
106 PROPERTY_(m_Metadata, metadata, setMetadata, QVariantHash)
107 PROPERTY_(m_RealRange, realRange, setRealRange, std::optional<DateTimeRange>)
107 PROPERTY_(m_RealRange, realRange, setRealRange, std::optional<DateTimeRange>)
108 std::shared_ptr<TimeSeries::ITimeSerie> dataSeries() { return m_TimeSerie; }
108 std::shared_ptr<TimeSeries::ITimeSerie> dataSeries() { return m_TimeSerie; }
109 void setDataSeries(std::shared_ptr<TimeSeries::ITimeSerie>&& timeSerie)
109 void setDataSeries(std::shared_ptr<TimeSeries::ITimeSerie>&& timeSerie)
110 {
110 {
111 QWriteLocker lock{&m_Lock};
111 QWriteLocker lock{&m_Lock};
112 m_TimeSerie = timeSerie;
112 m_TimeSerie = timeSerie;
113 if(m_TimeSerie) { setRealRange(DateTimeRange(m_TimeSerie->axis_range(0))); }
113 if(m_TimeSerie) { setRealRange(DateTimeRange(m_TimeSerie->axis_range(0))); }
114 else
114 else
115 {
115 {
116 setRealRange(std::nullopt);
116 setRealRange(std::nullopt);
117 }
117 }
118 }
118 }
119 std::shared_ptr<TimeSeries::ITimeSerie> m_TimeSerie;
119 std::shared_ptr<TimeSeries::ITimeSerie> m_TimeSerie;
120 QReadWriteLock m_Lock{QReadWriteLock::Recursive};
120 QReadWriteLock m_Lock{QReadWriteLock::Recursive};
121 };
121 };
122
122
123 Variable2::Variable2(const QString& name, const QVariantHash& metadata)
123 Variable2::Variable2(const QString& name, const QVariantHash& metadata)
124 : impl{spimpl::make_unique_impl<VariablePrivate>(name, metadata)},
124 : impl{spimpl::make_unique_impl<VariablePrivate>(name, metadata)},
125 _uuid{QUuid::createUuid()}
125 _uuid{QUuid::createUuid()}
126 {}
126 {}
127
127
128 Variable2::Variable2(const Variable2& other)
128 Variable2::Variable2(const Variable2& other)
129 : impl{spimpl::make_unique_impl<VariablePrivate>(*other.impl)},
129 : impl{spimpl::make_unique_impl<VariablePrivate>(*other.impl)},
130 _uuid{QUuid::createUuid()} // is a clone but must have a != uuid
130 _uuid{QUuid::createUuid()} // is a clone but must have a != uuid
131 {}
131 {}
132
132
133 std::shared_ptr<Variable2> Variable2::clone() const
133 std::shared_ptr<Variable2> Variable2::clone() const
134 {
134 {
135 return std::make_shared<Variable2>(*this);
135 return std::make_shared<Variable2>(*this);
136 }
136 }
137
137
138 V_FW_GETTER_SETTER(name, setName, QString)
138 V_FW_GETTER_SETTER(name, setName, QString)
139
139
140 DateTimeRange Variable2::range() { return impl->range(); }
140 DateTimeRange Variable2::range() { return impl->range(); }
141
141
142 void Variable2::setRange(const DateTimeRange& range)
142 void Variable2::setRange(const DateTimeRange& range)
143 {
143 {
144 QWriteLocker lock{&m_lock};
144 QWriteLocker lock{&m_lock};
145 impl->setRange(range);
145 impl->setRange(range);
146 }
146 }
147
147
148 std::optional<DateTimeRange> Variable2::realRange()
148 std::optional<DateTimeRange> Variable2::realRange()
149 {
149 {
150 QReadLocker lock{&m_lock};
150 QReadLocker lock{&m_lock};
151 return impl->realRange();
151 return impl->realRange();
152 }
152 }
153
153
154 std::size_t Variable2::nbPoints() { return impl->nbPoints(); }
154 std::size_t Variable2::nbPoints() { return impl->nbPoints(); }
155
155
156 std::shared_ptr<TimeSeries::ITimeSerie> Variable2::data()
156 std::shared_ptr<TimeSeries::ITimeSerie> Variable2::data()
157 {
157 {
158 return impl->dataSeries();
158 return impl->dataSeries();
159 }
159 }
160
160
161 DataSeriesType Variable2::type()
161 DataSeriesType Variable2::type()
162 {
162 {
163 QReadLocker lock{&m_lock};
163 QReadLocker lock{&m_lock};
164 return impl->type();
164 return impl->type();
165 }
165 }
166
166
167 QVariantHash Variable2::metadata() const noexcept { return impl->metadata(); }
167 QVariantHash Variable2::metadata() const noexcept { return impl->metadata(); }
168
168
169 template<typename T>
169 template<typename T>
170 std::shared_ptr<TimeSeries::ITimeSerie>
170 std::shared_ptr<TimeSeries::ITimeSerie>
171 _merge(std::vector<TimeSeries::ITimeSerie*> source, const DateTimeRange& range)
171 _merge(std::vector<TimeSeries::ITimeSerie*> source, const DateTimeRange& range)
172 {
172 {
173 std::sort(std::begin(source), std::end(source),
173 std::sort(std::begin(source), std::end(source),
174 [](TimeSeries::ITimeSerie* a, TimeSeries::ITimeSerie* b) {
174 [](TimeSeries::ITimeSerie* a, TimeSeries::ITimeSerie* b) {
175 if(a->size() && b->size()) return a->t(0) < b->t(0);
175 if(a->size() && b->size()) return a->t(0) < b->t(0);
176 return false;
176 return false;
177 });
177 });
178 std::shared_ptr<TimeSeries::ITimeSerie> dest = std::make_shared<T>();
178 std::shared_ptr<TimeSeries::ITimeSerie> dest = std::make_shared<T>();
179 std::for_each(
179 std::for_each(
180 std::begin(source), std::end(source),
180 std::begin(source), std::end(source),
181 [&dest, &range](TimeSeries::ITimeSerie* serie) {
181 [&dest, &range](TimeSeries::ITimeSerie* serie) {
182 auto& ts = *static_cast<T*>(serie);
182 auto& ts = *static_cast<T*>(serie);
183 auto last_t = range.m_TStart;
183 auto last_t = range.m_TStart;
184 if(dest->size()) last_t = dest->axis(0).back();
184 if(dest->size()) last_t = dest->axis(0).back();
185 if(ts.size())
185 if(ts.size())
186 {
186 {
187 std::copy(std::upper_bound(
187 std::copy(std::upper_bound(
188 std::begin(ts), std::end(ts), last_t,
188 std::begin(ts), std::end(ts), last_t,
189 [](const auto& a, const auto& b) { return a < b.t(); }),
189 [](const auto& a, const auto& b) { return a < b.t(); }),
190 std::lower_bound(
190 std::lower_bound(
191 std::begin(ts), std::end(ts), range.m_TEnd,
191 std::begin(ts), std::end(ts), range.m_TEnd,
192 [](const auto& a, const auto& b) { return a.t() < b; }),
192 [](const auto& a, const auto& b) { return a.t() < b; }),
193 std::back_inserter(*std::dynamic_pointer_cast<T>(dest)));
193 std::back_inserter(*std::dynamic_pointer_cast<T>(dest)));
194 }
194 }
195 });
195 });
196 if(source.size())
197 {
198 const auto& first = *source.begin();
199 for(std::size_t ax_index = 1; ax_index < first->shape().size(); ax_index++)
200 {
201 const auto& ax = first->axis(ax_index);
202 std::copy(std::cbegin(ax), std::cend(ax),
203 std::back_inserter(dest->axis(ax_index)));
204 }
205 }
196 return dest;
206 return dest;
197 }
207 }
198
208
199 std::shared_ptr<TimeSeries::ITimeSerie>
209 std::shared_ptr<TimeSeries::ITimeSerie>
200 merge(const std::vector<TimeSeries::ITimeSerie*>& dataSeries,
210 merge(const std::vector<TimeSeries::ITimeSerie*>& dataSeries,
201 const DateTimeRange& range)
211 const DateTimeRange& range)
202 {
212 {
203 if(dynamic_cast<ScalarTimeSerie*>(dataSeries.front()))
213 if(dynamic_cast<ScalarTimeSerie*>(dataSeries.front()))
204 return _merge<ScalarTimeSerie>(dataSeries, range);
214 return _merge<ScalarTimeSerie>(dataSeries, range);
205 if(dynamic_cast<VectorTimeSerie*>(dataSeries.front()))
215 if(dynamic_cast<VectorTimeSerie*>(dataSeries.front()))
206 return _merge<VectorTimeSerie>(dataSeries, range);
216 return _merge<VectorTimeSerie>(dataSeries, range);
207 if(dynamic_cast<MultiComponentTimeSerie*>(dataSeries.front()))
217 if(dynamic_cast<MultiComponentTimeSerie*>(dataSeries.front()))
208 return _merge<MultiComponentTimeSerie>(dataSeries, range);
218 return _merge<MultiComponentTimeSerie>(dataSeries, range);
209 if(dynamic_cast<SpectrogramTimeSerie*>(dataSeries.front()))
219 if(dynamic_cast<SpectrogramTimeSerie*>(dataSeries.front()))
210 return _merge<SpectrogramTimeSerie>(dataSeries, range);
220 return _merge<SpectrogramTimeSerie>(dataSeries, range);
211 return std::shared_ptr<TimeSeries::ITimeSerie>{};
221 return std::shared_ptr<TimeSeries::ITimeSerie>{};
212 }
222 }
213
223
214 void Variable2::setData(const std::vector<TimeSeries::ITimeSerie*>& dataSeries,
224 void Variable2::setData(const std::vector<TimeSeries::ITimeSerie*>& dataSeries,
215 const DateTimeRange& range, bool notify)
225 const DateTimeRange& range, bool notify)
216 {
226 {
217 if(dataSeries.size())
227 if(dataSeries.size())
218 {
228 {
219 {
229 {
220 QWriteLocker lock{&m_lock};
230 QWriteLocker lock{&m_lock};
221 impl->setDataSeries(merge(dataSeries, range));
231 impl->setDataSeries(merge(dataSeries, range));
222 impl->setRange(range);
232 impl->setRange(range);
223 }
233 }
224 if(notify) emit this->updated(this->ID());
234 if(notify) emit this->updated(this->ID());
225 }
235 }
226 }
236 }
@@ -1,295 +1,299
1 #include "CoreWrappers.h"
1 #include "CoreWrappers.h"
2
2
3 #include "pywrappers_common.h"
3 #include "pywrappers_common.h"
4
4
5 #include <Data/DataSeriesType.h>
5 #include <Data/DataSeriesType.h>
6 #include <Data/IDataProvider.h>
6 #include <Data/IDataProvider.h>
7 #include <Network/Downloader.h>
7 #include <Network/Downloader.h>
8 #include <Time/TimeController.h>
8 #include <Time/TimeController.h>
9 #include <Variable/Variable2.h>
9 #include <Variable/Variable2.h>
10 #include <Variable/VariableController2.h>
10 #include <Variable/VariableController2.h>
11 #include <pybind11/chrono.h>
11 #include <pybind11/chrono.h>
12 #include <pybind11/embed.h>
12 #include <pybind11/embed.h>
13 #include <pybind11/functional.h>
13 #include <pybind11/functional.h>
14 #include <pybind11/numpy.h>
14 #include <pybind11/numpy.h>
15 #include <pybind11/operators.h>
15 #include <pybind11/operators.h>
16 #include <pybind11/pybind11.h>
16 #include <pybind11/pybind11.h>
17 #include <pybind11/stl.h>
17 #include <pybind11/stl.h>
18 #include <pybind11/stl_bind.h>
18 #include <pybind11/stl_bind.h>
19 #include <sstream>
19 #include <sstream>
20 #include <string>
20 #include <string>
21
21
22 namespace py = pybind11;
22 namespace py = pybind11;
23 using namespace std::chrono;
23 using namespace std::chrono;
24
24
25 template<typename T, typename U, bool row_major = true>
25 template<typename T, typename U, bool row_major = true>
26 void copy_vector(py::array_t<double>& t, py::array_t<double>& values, T& dest_t,
26 void copy_vector(py::array_t<double>& t, py::array_t<double>& values, T& dest_t,
27 U& dest_values)
27 U& dest_values)
28 {
28 {
29 auto t_view = t.unchecked<1>();
29 auto t_view = t.unchecked<1>();
30 auto values_view = values.unchecked<2>();
30 auto values_view = values.unchecked<2>();
31 for(std::size_t i = 0; i < t.size(); i++)
31 for(std::size_t i = 0; i < t.size(); i++)
32 {
32 {
33 dest_t[i] = t_view[i];
33 dest_t[i] = t_view[i];
34 dest_values[i] = {values_view(i, 0), values_view(i, 1), values_view(i, 2)};
34 dest_values[i] = {values_view(i, 0), values_view(i, 1), values_view(i, 2)};
35 }
35 }
36 }
36 }
37
37
38 template<typename T, typename U>
38 template<typename T, typename U>
39 void copy_scalar(py::array_t<double>& t, py::array_t<double>& values, T& dest_t,
39 void copy_scalar(py::array_t<double>& t, py::array_t<double>& values, T& dest_t,
40 U& dest_values)
40 U& dest_values)
41 {
41 {
42 auto t_view = t.unchecked<1>();
42 auto t_view = t.unchecked<1>();
43 if(values.ndim() == 1)
43 if(values.ndim() == 1)
44 {
44 {
45 auto values_view = values.unchecked<1>();
45 auto values_view = values.unchecked<1>();
46 for(std::size_t i = 0; i < t.size(); i++)
46 for(std::size_t i = 0; i < t.size(); i++)
47 {
47 {
48 dest_t[i] = t_view[i];
48 dest_t[i] = t_view[i];
49 dest_values[i] = values_view[i];
49 dest_values[i] = values_view[i];
50 }
50 }
51 }
51 }
52 else if(values.ndim() == 2 && values.shape(1) == 1)
52 else if(values.ndim() == 2 && values.shape(1) == 1)
53 {
53 {
54 auto values_view = values.unchecked<2>();
54 auto values_view = values.unchecked<2>();
55 for(std::size_t i = 0; i < t.size(); i++)
55 for(std::size_t i = 0; i < t.size(); i++)
56 {
56 {
57 dest_t[i] = t_view[i];
57 dest_t[i] = t_view[i];
58 dest_values[i] = values_view(i, 0);
58 dest_values[i] = values_view(i, 0);
59 }
59 }
60 }
60 }
61 }
61 }
62 template<typename T, typename U>
62 template<typename T, typename U>
63 void copy_multicomp(py::array_t<double>& t, py::array_t<double>& values,
63 void copy_multicomp(py::array_t<double>& t, py::array_t<double>& values,
64 T& dest_t, U& dest_values)
64 T& dest_t, U& dest_values)
65 {
65 {
66 auto t_view = t.unchecked<1>();
66 auto t_view = t.unchecked<1>();
67 auto values_view = values.unchecked<2>();
67 auto values_view = values.unchecked<2>();
68 const auto width = values.shape(1);
68 const auto width = values.shape(1);
69 for(std::size_t i = 0; i < t.size(); i++)
69 for(std::size_t i = 0; i < t.size(); i++)
70 {
70 {
71 dest_t[i] = t_view[i];
71 dest_t[i] = t_view[i];
72 for(int j = 0; j < width; j++)
72 for(int j = 0; j < width; j++)
73 {
73 {
74 dest_values[i * width + j] = values_view(i, j);
74 dest_values[i * width + j] = values_view(i, j);
75 }
75 }
76 }
76 }
77 }
77 }
78
78
79 template<typename T, typename U>
79 template<typename T, typename U>
80 void copy_spectro(py::array_t<double>& t, py::array_t<double>& y,
80 void copy_spectro(py::array_t<double>& t, py::array_t<double>& y,
81 py::array_t<double>& values, T& dest_t, T& dest_y,
81 py::array_t<double>& values, T& dest_t, T& dest_y,
82 U& dest_values)
82 U& dest_values)
83 {
83 {
84 auto t_view = t.unchecked<1>();
84 auto t_view = t.unchecked<1>();
85 auto y_view = y.unchecked<1>();
85 auto y_view = y.unchecked<1>();
86 auto values_view = values.unchecked<2>();
86 auto values_view = values.unchecked<2>();
87 const auto width = values.shape(1);
87 const auto width = values.shape(1);
88 for(std::size_t i = 0; i < y.size(); i++)
88 for(std::size_t i = 0; i < y.size(); i++)
89 {
89 {
90 dest_y[i] = y_view[i];
90 dest_y[i] = y_view[i];
91 }
91 }
92 for(std::size_t i = 0; i < t.size(); i++)
92 for(std::size_t i = 0; i < t.size(); i++)
93 {
93 {
94 dest_t[i] = t_view[i];
94 dest_t[i] = t_view[i];
95 for(int j = 0; j < width; j++)
95 for(int j = 0; j < width; j++)
96 {
96 {
97 dest_values[i * width + j] = values_view(i, j);
97 dest_values[i * width + j] = values_view(i, j);
98 }
98 }
99 }
99 }
100 }
100 }
101
101
102 PYBIND11_MODULE(pysciqlopcore, m)
102 PYBIND11_MODULE(pysciqlopcore, m)
103 {
103 {
104 pybind11::bind_vector<std::vector<double>>(m, "VectorDouble");
104 pybind11::bind_vector<std::vector<double>>(m, "VectorDouble");
105
105
106 py::enum_<DataSeriesType>(m, "DataSeriesType")
106 py::enum_<DataSeriesType>(m, "DataSeriesType")
107 .value("SCALAR", DataSeriesType::SCALAR)
107 .value("SCALAR", DataSeriesType::SCALAR)
108 .value("SPECTROGRAM", DataSeriesType::SPECTROGRAM)
108 .value("SPECTROGRAM", DataSeriesType::SPECTROGRAM)
109 .value("VECTOR", DataSeriesType::VECTOR)
109 .value("VECTOR", DataSeriesType::VECTOR)
110 .value("MULTICOMPONENT", DataSeriesType::MULTICOMPONENT)
110 .value("MULTICOMPONENT", DataSeriesType::MULTICOMPONENT)
111 .value("NONE", DataSeriesType::NONE)
111 .value("NONE", DataSeriesType::NONE)
112 .export_values();
112 .export_values();
113
113
114 py::class_<Response>(m, "Response")
114 py::class_<Response>(m, "Response")
115 .def("status_code", &Response::status_code);
115 .def("status_code", &Response::status_code);
116
116
117 py::class_<Downloader>(m, "Downloader")
117 py::class_<Downloader>(m, "Downloader")
118 .def_static("get", Downloader::get)
118 .def_static("get", Downloader::get)
119 .def_static("getAsync", Downloader::getAsync)
119 .def_static("getAsync", Downloader::getAsync)
120 .def_static("downloadFinished", Downloader::downloadFinished);
120 .def_static("downloadFinished", Downloader::downloadFinished);
121
121
122 py::class_<IDataProvider, std::shared_ptr<IDataProvider>>(m, "IDataProvider");
122 py::class_<IDataProvider, std::shared_ptr<IDataProvider>>(m, "IDataProvider");
123
123
124 py::class_<TimeSeries::ITimeSerie, std::shared_ptr<TimeSeries::ITimeSerie>>(
124 py::class_<TimeSeries::ITimeSerie, std::shared_ptr<TimeSeries::ITimeSerie>>(
125 m, "ITimeSerie")
125 m, "ITimeSerie")
126 .def_property_readonly(
126 .def_property_readonly(
127 "size", [](const TimeSeries::ITimeSerie& ts) { return ts.size(); })
127 "size", [](const TimeSeries::ITimeSerie& ts) { return ts.size(); })
128 .def("__len__",
128 .def("__len__",
129 [](const TimeSeries::ITimeSerie& ts) { return ts.size(); })
129 [](const TimeSeries::ITimeSerie& ts) { return ts.size(); })
130 .def_property_readonly(
130 .def_property_readonly(
131 "shape", [](const TimeSeries::ITimeSerie& ts) { return ts.shape(); })
131 "shape", [](const TimeSeries::ITimeSerie& ts) { return ts.shape(); })
132 .def_property_readonly(
132 .def_property_readonly(
133 "t",
133 "t",
134 [](TimeSeries::ITimeSerie& ts) -> decltype(ts.axis(0))& {
134 [](TimeSeries::ITimeSerie& ts) -> decltype(ts.axis(0))& {
135 return ts.axis(0);
135 return ts.axis(0);
136 },
136 },
137 py::return_value_policy::reference)
137 py::return_value_policy::reference)
138 .def(
138 .def(
139 "axis",
139 "axis",
140 [](TimeSeries::ITimeSerie& ts, unsigned int index)
140 [](TimeSeries::ITimeSerie& ts, unsigned int index)
141 -> decltype(ts.axis(0))& { return ts.axis(index); },
141 -> decltype(ts.axis(0))& { return ts.axis(index); },
142 py::return_value_policy::reference);
142 py::return_value_policy::reference);
143
143
144 py::class_<ScalarTimeSerie, TimeSeries::ITimeSerie,
144 py::class_<ScalarTimeSerie, TimeSeries::ITimeSerie,
145 std::shared_ptr<ScalarTimeSerie>>(m, "ScalarTimeSerie")
145 std::shared_ptr<ScalarTimeSerie>>(m, "ScalarTimeSerie")
146 .def(py::init<>())
146 .def(py::init<>())
147 .def(py::init<std::size_t>())
147 .def(py::init<std::size_t>())
148 .def(py::init([](py::array_t<double> t, py::array_t<double> values) {
148 .def(py::init([](py::array_t<double> t, py::array_t<double> values) {
149 assert(t.size() == values.size());
149 assert(t.size() == values.size());
150 ScalarTimeSerie::axis_t _t(t.size());
150 ScalarTimeSerie::axis_t _t(t.size());
151 ScalarTimeSerie::axis_t _values(t.size());
151 ScalarTimeSerie::axis_t _values(t.size());
152 copy_scalar(t, values, _t, _values);
152 copy_scalar(t, values, _t, _values);
153 return ScalarTimeSerie(_t, _values);
153 return ScalarTimeSerie(_t, _values);
154 }))
154 }))
155 .def("__getitem__",
155 .def("__getitem__",
156 [](ScalarTimeSerie& ts, std::size_t key) { return ts[key]; })
156 [](ScalarTimeSerie& ts, std::size_t key) { return ts[key]; })
157 .def("__setitem__", [](ScalarTimeSerie& ts, std::size_t key,
157 .def("__setitem__", [](ScalarTimeSerie& ts, std::size_t key,
158 double value) { *(ts.begin() + key) = value; });
158 double value) { *(ts.begin() + key) = value; });
159
159
160 py::class_<VectorTimeSerie::raw_value_type>(m, "vector")
160 py::class_<VectorTimeSerie::raw_value_type>(m, "vector")
161 .def(py::init<>())
161 .def(py::init<>())
162 .def(py::init<double, double, double>())
162 .def(py::init<double, double, double>())
163 .def("__repr__", __repr__<VectorTimeSerie::raw_value_type>)
163 .def("__repr__", __repr__<VectorTimeSerie::raw_value_type>)
164 .def_readwrite("x", &VectorTimeSerie::raw_value_type::x)
164 .def_readwrite("x", &VectorTimeSerie::raw_value_type::x)
165 .def_readwrite("y", &VectorTimeSerie::raw_value_type::y)
165 .def_readwrite("y", &VectorTimeSerie::raw_value_type::y)
166 .def_readwrite("z", &VectorTimeSerie::raw_value_type::z);
166 .def_readwrite("z", &VectorTimeSerie::raw_value_type::z);
167
167
168 py::class_<VectorTimeSerie, TimeSeries::ITimeSerie,
168 py::class_<VectorTimeSerie, TimeSeries::ITimeSerie,
169 std::shared_ptr<VectorTimeSerie>>(m, "VectorTimeSerie")
169 std::shared_ptr<VectorTimeSerie>>(m, "VectorTimeSerie")
170 .def(py::init<>())
170 .def(py::init<>())
171 .def(py::init<std::size_t>())
171 .def(py::init<std::size_t>())
172 .def(py::init([](py::array_t<double> t, py::array_t<double> values) {
172 .def(py::init([](py::array_t<double> t, py::array_t<double> values) {
173 assert(t.size() * 3 == values.size());
173 assert(t.size() * 3 == values.size());
174 VectorTimeSerie::axis_t _t(t.size());
174 VectorTimeSerie::axis_t _t(t.size());
175 VectorTimeSerie::container_type<VectorTimeSerie::raw_value_type>
175 VectorTimeSerie::container_type<VectorTimeSerie::raw_value_type>
176 _values(t.size());
176 _values(t.size());
177 copy_vector(t, values, _t, _values);
177 copy_vector(t, values, _t, _values);
178 return VectorTimeSerie(_t, _values);
178 return VectorTimeSerie(_t, _values);
179 }))
179 }))
180 .def(
180 .def(
181 "__getitem__",
181 "__getitem__",
182 [](VectorTimeSerie& ts, std::size_t key)
182 [](VectorTimeSerie& ts, std::size_t key)
183 -> VectorTimeSerie::raw_value_type& { return ts[key]; },
183 -> VectorTimeSerie::raw_value_type& { return ts[key]; },
184 py::return_value_policy::reference)
184 py::return_value_policy::reference)
185 .def("__setitem__", [](VectorTimeSerie& ts, std::size_t key,
185 .def("__setitem__", [](VectorTimeSerie& ts, std::size_t key,
186 VectorTimeSerie::raw_value_type value) {
186 VectorTimeSerie::raw_value_type value) {
187 *(ts.begin() + key) = value;
187 *(ts.begin() + key) = value;
188 });
188 });
189
189
190 py::class_<MultiComponentTimeSerie::iterator_t>(m,
190 py::class_<MultiComponentTimeSerie::iterator_t>(m,
191 "MultiComponentTimeSerieItem")
191 "MultiComponentTimeSerieItem")
192 .def("__getitem__", [](MultiComponentTimeSerie::iterator_t& self,
192 .def("__getitem__", [](MultiComponentTimeSerie::iterator_t& self,
193 std::size_t key) { return (*self)[key]; })
193 std::size_t key) { return (*self)[key]; })
194 .def("__setitem__",
194 .def("__setitem__",
195 [](MultiComponentTimeSerie::iterator_t& self, std::size_t key,
195 [](MultiComponentTimeSerie::iterator_t& self, std::size_t key,
196 double value) { (*self)[key] = value; });
196 double value) { (*self)[key] = value; });
197
197
198 py::class_<MultiComponentTimeSerie, TimeSeries::ITimeSerie,
198 py::class_<MultiComponentTimeSerie, TimeSeries::ITimeSerie,
199 std::shared_ptr<MultiComponentTimeSerie>>(
199 std::shared_ptr<MultiComponentTimeSerie>>(
200 m, "MultiComponentTimeSerie")
200 m, "MultiComponentTimeSerie")
201 .def(py::init<>())
201 .def(py::init<>())
202 .def(py::init<const std::vector<std::size_t>>())
202 .def(py::init<const std::vector<std::size_t>>())
203 .def(py::init([](py::array_t<double> t, py::array_t<double> values) {
203 .def(py::init([](py::array_t<double> t, py::array_t<double> values) {
204 assert((t.size() < values.size()) |
204 assert((t.size() < values.size()) |
205 (t.size() == 0)); // TODO check geometry
205 (t.size() == 0)); // TODO check geometry
206 MultiComponentTimeSerie::axis_t _t(t.size());
206 MultiComponentTimeSerie::axis_t _t(t.size());
207 MultiComponentTimeSerie::container_type<
207 MultiComponentTimeSerie::container_type<
208 MultiComponentTimeSerie::raw_value_type>
208 MultiComponentTimeSerie::raw_value_type>
209 _values(values.size());
209 _values(values.size());
210 copy_multicomp(t, values, _t, _values);
210 copy_multicomp(t, values, _t, _values);
211 std::vector<std::size_t> shape;
211 std::vector<std::size_t> shape;
212 shape.push_back(values.shape(0));
212 shape.push_back(values.shape(0));
213 shape.push_back(values.shape(1));
213 shape.push_back(values.shape(1));
214 return MultiComponentTimeSerie(_t, _values, shape);
214 return MultiComponentTimeSerie(_t, _values, shape);
215 }))
215 }))
216 .def("__getitem__",
216 .def("__getitem__",
217 [](MultiComponentTimeSerie& ts,
217 [](MultiComponentTimeSerie& ts,
218 std::size_t key) -> MultiComponentTimeSerie::iterator_t {
218 std::size_t key) -> MultiComponentTimeSerie::iterator_t {
219 return ts.begin() + key;
219 return ts.begin() + key;
220 });
220 });
221
221
222 py::class_<SpectrogramTimeSerie::iterator_t>(m, "SpectrogramTimeSerieItem")
222 py::class_<SpectrogramTimeSerie::iterator_t>(m, "SpectrogramTimeSerieItem")
223 .def("__getitem__", [](SpectrogramTimeSerie::iterator_t& self,
223 .def("__getitem__", [](SpectrogramTimeSerie::iterator_t& self,
224 std::size_t key) { return (*self)[key]; })
224 std::size_t key) { return (*self)[key]; })
225 .def("__setitem__",
225 .def("__setitem__",
226 [](SpectrogramTimeSerie::iterator_t& self, std::size_t key,
226 [](SpectrogramTimeSerie::iterator_t& self, std::size_t key,
227 double value) { (*self)[key] = value; });
227 double value) { (*self)[key] = value; });
228
228
229 py::class_<SpectrogramTimeSerie, TimeSeries::ITimeSerie,
229 py::class_<SpectrogramTimeSerie, TimeSeries::ITimeSerie,
230 std::shared_ptr<SpectrogramTimeSerie>>(m, "SpectrogramTimeSerie")
230 std::shared_ptr<SpectrogramTimeSerie>>(m, "SpectrogramTimeSerie")
231 .def(py::init<>())
231 .def(py::init<>())
232 .def(py::init<const std::vector<std::size_t>>())
232 .def(py::init<const std::vector<std::size_t>>())
233 .def(py::init([](py::array_t<double> t, py::array_t<double> y,
233 .def(py::init([](py::array_t<double> t, py::array_t<double> y,
234 py::array_t<double> values) {
234 py::array_t<double> values) {
235 assert(t.size() < values.size()); // TODO check geometry
235 auto t_s = t.size();
236 auto v_s = values.size();
237 assert(t.size() < values.size() or
238 t.size() == 0); // TODO check geometry
236 assert(y.size() == values.shape(1));
239 assert(y.size() == values.shape(1));
237 SpectrogramTimeSerie::axis_t _t(t.size());
240 SpectrogramTimeSerie::axis_t _t(t.size());
238 SpectrogramTimeSerie::axis_t _y(y.size());
241 SpectrogramTimeSerie::axis_t _y(y.size());
239 SpectrogramTimeSerie::container_type<
242 SpectrogramTimeSerie::container_type<
240 SpectrogramTimeSerie::raw_value_type>
243 SpectrogramTimeSerie::raw_value_type>
241 _values(values.size());
244 _values(values.size());
242 copy_spectro(t, y, values, _t, _y, _values);
245 copy_spectro(t, y, values, _t, _y, _values);
243 std::vector<std::size_t> shape;
246 std::vector<std::size_t> shape;
244 shape.push_back(values.shape(0));
247 shape.push_back(values.shape(0));
245 shape.push_back(values.shape(1));
248 shape.push_back(values.shape(1));
246 return SpectrogramTimeSerie(_t, _y, _values, shape);
249 return SpectrogramTimeSerie(std::move(_t), std::move(_y),
250 std::move(_values), shape);
247 }))
251 }))
248 .def("__getitem__",
252 .def("__getitem__",
249 [](SpectrogramTimeSerie& ts,
253 [](SpectrogramTimeSerie& ts,
250 std::size_t key) -> SpectrogramTimeSerie::iterator_t {
254 std::size_t key) -> SpectrogramTimeSerie::iterator_t {
251 return ts.begin() + key;
255 return ts.begin() + key;
252 });
256 });
253
257
254 py::class_<Variable2, std::shared_ptr<Variable2>>(m, "Variable2")
258 py::class_<Variable2, std::shared_ptr<Variable2>>(m, "Variable2")
255 .def(py::init<const QString&>())
259 .def(py::init<const QString&>())
256 .def_property("name", &Variable2::name, &Variable2::setName)
260 .def_property("name", &Variable2::name, &Variable2::setName)
257 .def_property_readonly("range", &Variable2::range)
261 .def_property_readonly("range", &Variable2::range)
258 .def_property_readonly("nbPoints", &Variable2::nbPoints)
262 .def_property_readonly("nbPoints", &Variable2::nbPoints)
259 .def_property_readonly(
263 .def_property_readonly(
260 "data",
264 "data",
261 [](Variable2& var) -> std::shared_ptr<TimeSeries::ITimeSerie> {
265 [](Variable2& var) -> std::shared_ptr<TimeSeries::ITimeSerie> {
262 return var.data();
266 return var.data();
263 })
267 })
264 .def("set_data",
268 .def("set_data",
265 [](Variable2& var, std::vector<TimeSeries::ITimeSerie*> ts_list,
269 [](Variable2& var, std::vector<TimeSeries::ITimeSerie*> ts_list,
266 const DateTimeRange& range) { var.setData(ts_list, range); })
270 const DateTimeRange& range) { var.setData(ts_list, range); })
267 .def("__len__", &Variable2::nbPoints)
271 .def("__len__", &Variable2::nbPoints)
268 .def("__repr__", __repr__<Variable2>);
272 .def("__repr__", __repr__<Variable2>);
269
273
270 py::class_<DateTimeRange>(m, "SqpRange")
274 py::class_<DateTimeRange>(m, "SqpRange")
271 //.def("fromDateTime", &DateTimeRange::fromDateTime,
275 //.def("fromDateTime", &DateTimeRange::fromDateTime,
272 // py::return_value_policy::move)
276 // py::return_value_policy::move)
273 .def(py::init([](double start, double stop) {
277 .def(py::init([](double start, double stop) {
274 return DateTimeRange{start, stop};
278 return DateTimeRange{start, stop};
275 }))
279 }))
276 .def(py::init(
280 .def(py::init(
277 [](system_clock::time_point start, system_clock::time_point stop) {
281 [](system_clock::time_point start, system_clock::time_point stop) {
278 double start_ =
282 double start_ =
279 0.001 *
283 0.001 *
280 duration_cast<milliseconds>(start.time_since_epoch()).count();
284 duration_cast<milliseconds>(start.time_since_epoch()).count();
281 double stop_ =
285 double stop_ =
282 0.001 *
286 0.001 *
283 duration_cast<milliseconds>(stop.time_since_epoch()).count();
287 duration_cast<milliseconds>(stop.time_since_epoch()).count();
284 return DateTimeRange{start_, stop_};
288 return DateTimeRange{start_, stop_};
285 }))
289 }))
286 .def_property_readonly("start",
290 .def_property_readonly("start",
287 [](const DateTimeRange& range) {
291 [](const DateTimeRange& range) {
288 return system_clock::from_time_t(range.m_TStart);
292 return system_clock::from_time_t(range.m_TStart);
289 })
293 })
290 .def_property_readonly("stop",
294 .def_property_readonly("stop",
291 [](const DateTimeRange& range) {
295 [](const DateTimeRange& range) {
292 return system_clock::from_time_t(range.m_TEnd);
296 return system_clock::from_time_t(range.m_TEnd);
293 })
297 })
294 .def("__repr__", __repr__<DateTimeRange>);
298 .def("__repr__", __repr__<DateTimeRange>);
295 }
299 }
General Comments 0
You need to be logged in to leave comments. Login now