BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
ArrayUtils.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Device/Data/ArrayUtils.cpp
6 //! @brief Implements internal functions
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #include "Device/Data/ArrayUtils.h"
16 #include "Base/Axis/FixedBinAxis.h"
17 #include "Base/Axis/Frame.h"
18 #include <stdexcept>
19 
20 std::pair<size_t, size_t> DataUtils::Array::getShape(const std::vector<std::vector<double>>& data)
21 {
22  size_t nrows = data.size();
23  size_t ncols(0);
24  if (nrows)
25  ncols = data[0].size();
26  for (size_t row = 0; row < nrows; row++)
27  if (data[row].size() != ncols)
28  throw std::runtime_error("Invalid data: not rectangular");
29  return std::make_pair(nrows, ncols);
30 }
31 
32 std::unique_ptr<Datafield> DataUtils::Array::createPField1D(const std::vector<double>& vec)
33 {
34  const size_t N = vec.size();
35  return std::unique_ptr<Datafield>(new Datafield{{
36  new FixedBinAxis("axis0", N, 0.0, (double)N)}, vec});
37 }
38 
39 std::unique_ptr<Datafield>
40 DataUtils::Array::createPField2D(const std::vector<std::vector<double>>& vec)
41 {
42  auto shape = DataUtils::Array::getShape(vec);
43  const size_t nrows = shape.first;
44  const size_t ncols = shape.second;
45 
46  if (nrows == 0 || ncols == 0)
47  throw std::runtime_error(
48  "Error in DataUtils::Array::createDataImpl: input argument contains empty dimensions");
49 
50  auto* frame = new Frame({new FixedBinAxis("axis0", ncols, 0.0, (double)ncols),
51  new FixedBinAxis("axis1", nrows, 0.0, (double)nrows)});
52 
53  std::vector<double> out(frame->size());
54  for (size_t row = 0; row < nrows; ++row) {
55  for (size_t col = 0; col < ncols; ++col) {
56  size_t iout = nrows - row - 1 + col * nrows;
57  out[iout] = vec[row][col];
58  }
59  }
60 
61  return std::make_unique<Datafield>(frame, out);
62 }
63 
64 std::vector<double> DataUtils::Array::createVector1D(const Datafield& data)
65 {
66  if (data.rank() != 1)
67  throw std::runtime_error("DataUtils::Array::createVector1D() -> Error. Not 1D data.");
68 
69  std::vector<double> result = data.flatVector();
70  return result;
71 }
72 
73 std::vector<std::vector<double>> DataUtils::Array::createVector2D(const Datafield& data)
74 {
75  std::vector<std::vector<double>> result;
76 
77  const size_t nrows = data.axis(1).size();
78  const size_t ncols = data.axis(0).size();
79 
80  result.resize(nrows);
81 
82  for (size_t row = 0; row < nrows; ++row) {
83  result[row].resize(ncols, 0.0);
84  for (size_t col = 0; col < ncols; ++col) {
85  size_t globalbin = nrows - row - 1 + col * nrows;
86  result[row][col] = data[globalbin];
87  }
88  }
89 
90  return result;
91 }
Defines various functions to interact from numpy on Python side.
Defines class FixedBinAxis.
Defines and implements templated class Frame.
Stores radiation power per bin.
Definition: Datafield.h:30
const IAxis & axis(size_t k) const
Definition: Datafield.cpp:91
std::vector< double > flatVector() const
Returns copy of raw data vector.
Definition: Datafield.cpp:119
size_t rank() const
Definition: Datafield.cpp:75
Axis with fixed bin size.
Definition: FixedBinAxis.h:23
Holds one or two axes.
Definition: Frame.h:27
virtual size_t size() const =0
Returns the number of bins.
#define N
Definition: mixmax.h:31
std::pair< size_t, size_t > getShape(const std::vector< std::vector< double >> &data)
Returns shape nrows, ncols of 2D array.
Definition: ArrayUtils.cpp:20
std::vector< double > createVector1D(const Datafield &data)
Creates 1D vector from Datafield.
Definition: ArrayUtils.cpp:64
std::vector< std::vector< double > > createVector2D(const Datafield &data)
Creates 2D vector from Datafield.
Definition: ArrayUtils.cpp:73
std::unique_ptr< Datafield > createPField1D(const std::vector< double > &vec)
Definition: ArrayUtils.cpp:32
std::unique_ptr< Datafield > createPField2D(const std::vector< std::vector< double >> &vec)
Definition: ArrayUtils.cpp:40