BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
ICoordSystem.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Device/Coord/ICoordSystem.cpp
6 //! @brief Implements ICoordSystem class.
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 
16 #include "Base/Util/Assert.h"
17 #include "Device/Coord/AxisNames.h"
18 #include "Device/Data/Datafield.h"
19 #include <sstream>
20 
21 ICoordSystem::~ICoordSystem() = default;
22 
23 std::vector<IAxis*> ICoordSystem::defaultAxes() const
24 {
25  return convertedAxes(defaultUnits());
26 }
27 
28 std::vector<IAxis*> ICoordSystem::convertedAxes(Coords units) const
29 {
30  std::vector<IAxis*> result;
31  for (size_t i = 0; i < rank(); ++i)
32  result.emplace_back(createConvertedAxis(i, units));
33  return result;
34 }
35 
36 std::string ICoordSystem::axisName(size_t i_axis, const Coords units) const
37 {
38  const auto& name_maps = createNameMaps();
39  ASSERT(i_axis < name_maps.size());
40  const auto& name_map = name_maps[i_axis];
41  const auto& it = name_map.find(units == Coords::UNDEFINED ? defaultUnits() : units);
42  ASSERT(it != name_map.cend());
43  return it->second;
44 }
45 
47 {
48  std::vector<IAxis*> axes;
49  for (size_t i = 0; i < rank(); ++i)
50  axes.emplace_back(createConvertedAxis(i, units));
51 
52  Datafield* result = new Datafield(axes);
53 
54  result->setVector(data.flatVector());
55  return result;
56 }
57 
58 void ICoordSystem::throwUnitsError(std::string method, std::vector<Coords> available) const
59 {
60  std::stringstream ss;
61  ss << "Unit type error in " << method
62  << ": unknown or unsupported unit type. Available units "
63  "are:\n";
64  for (auto unit : available)
65  ss << axisUnitLabel.at(unit) << "\n";
66  throw std::runtime_error(ss.str());
67 }
68 
70 {
71  return units == Coords::UNDEFINED ? defaultUnits() : units;
72 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:45
Defines axisUnitLabel and maps in namespace AxisNames.
const std::map< Coords, const char * > axisUnitLabel
Definition: AxisNames.h:28
Defines and implements templated class Datafield.
Defines interface ICoordSystem and possible axis units.
Stores radiation power per bin.
Definition: Datafield.h:30
void setVector(const std::vector< double > &data_vector)
Sets new values to raw data vector.
Definition: Datafield.cpp:69
std::vector< double > flatVector() const
Returns copy of raw data vector.
Definition: Datafield.cpp:119
std::vector< IAxis * > defaultAxes() const
Coords substituteDefaultUnits(Coords units) const
virtual Datafield * createConvertedData(const Datafield &data, Coords units) const
Creates Datafield array in converter units.
virtual IAxis * createConvertedAxis(size_t i_axis, Coords units) const =0
~ICoordSystem() override
virtual std::vector< std::map< Coords, std::string > > createNameMaps() const =0
virtual Coords defaultUnits() const =0
std::string axisName(size_t i_axis, Coords units=Coords::UNDEFINED) const
void throwUnitsError(std::string method, std::vector< Coords > available) const
std::vector< IAxis * > convertedAxes(Coords units) const
virtual size_t rank() const =0
Coords
Definition: Tags.h:20