26 #include <tspectrum.h>
30 std::vector<std::vector<double>> FT2DArray(
const std::vector<std::vector<double>>& signal)
33 std::vector<std::vector<double>> result;
34 ft.
fft(signal, result);
44 throw std::runtime_error(
"DataUtils::Data::rotateDataByN90Deg()"
45 " -> Error! Works only on two-dimensional data");
48 return std::unique_ptr<Datafield>(data.
clone());
50 std::unique_ptr<Datafield> output;
51 std::function<void(std::vector<int>&)> index_mapping;
55 const int end_bin_x =
static_cast<int>(data.
axis(0).
size()) - 1;
56 const int end_bin_y =
static_cast<int>(data.
axis(1).
size()) - 1;
57 index_mapping = [end_bin_x, end_bin_y](std::vector<int>& inds) {
58 inds[0] = end_bin_x - inds[0];
59 inds[1] = end_bin_y - inds[1];
64 const size_t rev_axis_i = n % 3;
65 const size_t end_bin = data.
axis(rev_axis_i).
size() - 1;
66 index_mapping = [rev_axis_i, end_bin](std::vector<int>& inds) {
67 const int tm_index = inds[rev_axis_i];
68 inds[rev_axis_i] = inds[rev_axis_i ^ 1];
69 inds[rev_axis_i ^ 1] =
static_cast<int>(end_bin) - tm_index;
73 for (
size_t i = 0, size = data.
size(); i < size; ++i) {
75 index_mapping(axis_inds);
76 size_t iout = output->frame().toGlobalIndex(
77 {
static_cast<unsigned>(axis_inds[0]),
static_cast<unsigned>(axis_inds[1])});
78 (*output)[iout] = data[i];
86 throw std::runtime_error(
"DataUtils::Data::create2DArrayfromDatafield() -> "
87 "Error! Works only on two-dimensional data");
89 std::vector<std::vector<double>> array_2d;
90 std::vector<double> row_vec;
96 for (
size_t row = 0; row < nrows; row++) {
98 for (
size_t col = 0; col < ncols; col++) {
99 row_vec.push_back(data[it]);
102 array_2d.push_back(row_vec);
108 std::unique_ptr<Datafield>
111 size_t nrows = array_2d.size();
112 size_t ncols = array_2d[0].size();
114 auto frame =
new Frame(
117 std::vector<double> out(frame->size());
118 std::vector<unsigned> axes_indices(2);
119 for (
unsigned row = 0; row < nrows; row++) {
120 for (
unsigned col = 0; col < ncols; col++) {
121 axes_indices[0] = row;
122 axes_indices[1] = col;
123 size_t iout = frame->toGlobalIndex(axes_indices);
124 out[iout] = array_2d[row][col];
127 return std::make_unique<Datafield>(frame, out);
133 auto fft_array_2d = FT2DArray(array_2d);
149 const std::string& option,
153 tspectrum::Spectrum2D spec;
154 auto peaks = spec.find_peaks(arr, sigma, option, threshold);
157 std::vector<std::pair<double, double>> result;
159 for (
const auto& p : peaks) {
160 double row_value = p.first;
161 double col_value = p.second;
163 auto xaxis_index =
static_cast<size_t>(col_value);
164 size_t yaxis_index = field.
yAxis().
size() - 1 -
static_cast<size_t>(row_value);
169 double dx = col_value -
static_cast<size_t>(col_value);
170 double dy = -1.0 * (row_value -
static_cast<size_t>(row_value));
175 result.emplace_back(x, y);
Defines various functions to interact from numpy on Python side.
Defines the macro ASSERT.
Defines structs Bin1D, Bin1DCVector.
Defines namespace DataUtils.
Defines and implements templated class Datafield.
Defines class FixedBinAxis.
Defines and implements templated class Frame.
Stores radiation power per bin.
const IAxis & axis(size_t k) const
Datafield * clone() const
const IAxis & yAxis() const
size_t size() const
Returns total size of data buffer (product of bin number in every dimension).
const IAxis & xAxis() const
const Frame & frame() const
Axis with fixed bin size.
std::vector< int > allIndices(size_t i_flat) const
Returns vector of axes indices for given global index.
virtual IAxis * clone() const =0
virtual Bin1D bin(size_t index) const =0
retrieve a 1d bin for the given index
virtual size_t size() const =0
Returns the number of bins.
std::vector< std::vector< double > > createVector2D(const Datafield &data)
Creates 2D vector from Datafield.
std::unique_ptr< Datafield > createPField1D(const std::vector< double > &vec)
std::unique_ptr< Datafield > createPField2D(const std::vector< std::vector< double >> &vec)
Datafield * importArrayToDatafield(const std::vector< double > &vec)
Reads 1D array of doubles to Python, for use in persistence test.
std::unique_ptr< Datafield > vecvecToDatafield(const std::vector< std::vector< double >> &array_2d)
Creates Datafield from a 2D Array.
std::unique_ptr< Datafield > createRearrangedDataSet(const Datafield &data, int n)
Returns new object with input data rotated by n*90 deg counterclockwise (n > 0) or clockwise (n < 0) ...
std::vector< std::pair< double, double > > FindPeaks(const Datafield &hist, double sigma=2, const std::string &option={}, double threshold=0.05)
Returns vector of peak center coordinates, for peaks in given histogram.
std::unique_ptr< Datafield > createFFT(const Datafield &data)
Creates Fourier Transform (Datafield format) of intensity map (Datafield format).
std::vector< std::vector< double > > create2DArrayfromDatafield(const Datafield &data)
Creates a vector of vectors of double (2D Array) from Datafield.