23 [[noreturn]]
void throwInitializationException(std::string method)
26 ss <<
"Error in SimDataPair::" << method <<
": Trying access non-initialized data\n";
27 throw std::runtime_error(ss.str());
30 std::unique_ptr<OutputData<double>> initUserWeights(
const OutputData<double>& shape,
double value)
32 auto result = std::make_unique<OutputData<double>>();
33 result->copyShapeFrom(shape);
34 result->setAllTo(value);
41 : m_simulation_builder(builder), m_raw_data(data.clone()),
42 m_raw_uncertainties(std::move(uncertainties))
44 m_raw_user_weights = initUserWeights(*m_raw_data, user_weight);
51 : m_simulation_builder(builder), m_raw_data(data.clone()),
52 m_raw_uncertainties(std::move(uncertainties)), m_raw_user_weights(std::move(user_weights))
54 if (!m_raw_user_weights)
55 m_raw_user_weights = initUserWeights(*m_raw_data, 1.0);
60 : m_simulation_builder(std::move(other.m_simulation_builder)),
61 m_simulation(std::move(other.m_simulation)), m_sim_data(std::move(other.m_sim_data)),
62 m_exp_data(std::move(other.m_exp_data)), m_uncertainties(std::move(other.m_uncertainties)),
63 m_user_weights(std::move(other.m_user_weights)), m_raw_data(std::move(other.m_raw_data)),
64 m_raw_uncertainties(std::move(other.m_raw_uncertainties)),
65 m_raw_user_weights(std::move(other.m_raw_user_weights))
70 SimDataPair::~SimDataPair() =
default;
74 m_simulation = m_simulation_builder(params);
75 m_simulation->runSimulation();
76 m_sim_data = m_simulation->result();
81 bool SimDataPair::containsUncertainties()
const
83 return static_cast<bool>(m_raw_uncertainties);
88 return m_simulation ? m_simulation->intensityMapSize() : 0;
93 if (m_sim_data.empty())
94 throwInitializationException(
"simulationResult");
100 if (m_exp_data.empty())
101 throwInitializationException(
"experimentalData");
107 if (m_uncertainties.empty())
108 throwInitializationException(
"uncertainties");
109 return m_uncertainties;
115 if (m_user_weights.empty())
116 throwInitializationException(
"userWeights");
117 return m_user_weights;
124 if (m_sim_data.size() == 0 || m_exp_data.size() == 0)
125 throwInitializationException(
"relativeDifference");
128 for (
size_t i = 0, size = result.size(); i < size; ++i)
136 if (m_sim_data.size() == 0 || m_exp_data.size() == 0)
137 throwInitializationException(
"absoluteDifference");
140 for (
size_t i = 0, size = result.size(); i < size; ++i)
148 if (m_exp_data.empty())
149 throwInitializationException(
"experimental_array");
150 return m_exp_data.data()->getRawDataVector();
155 if (m_sim_data.empty())
156 throwInitializationException(
"simulation_array");
157 return m_sim_data.data()->getRawDataVector();
162 if (m_uncertainties.empty())
163 throwInitializationException(
"uncertainties_array");
164 return m_uncertainties.data()->getRawDataVector();
169 if (m_user_weights.empty())
170 throwInitializationException(
"user_weights_array");
171 return m_user_weights.data()->getRawDataVector();
174 void SimDataPair::initResultArrays()
176 if (m_exp_data.size() != 0 && m_uncertainties.size() != 0 && m_user_weights.size() != 0)
179 if (!m_simulation || m_sim_data.size() == 0)
180 throwInitializationException(
"initResultArrays");
182 m_exp_data = m_simulation->convertData(*m_raw_data,
true);
184 if (containsUncertainties()) {
185 m_uncertainties = m_simulation->convertData(*m_raw_uncertainties,
true);
188 std::unique_ptr<OutputData<double>> dummy_array =
193 m_user_weights = m_simulation->convertData(*m_raw_user_weights,
true);
196 void SimDataPair::validate()
const
198 if (!m_simulation_builder)
199 throw std::runtime_error(
"Error in SimDataPair: simulation builder is empty");
202 throw std::runtime_error(
"Error in SimDataPair: passed experimental data array is empty");
204 if (m_raw_uncertainties && !m_raw_uncertainties->hasSameShape(*m_raw_data))
205 throw std::runtime_error(
206 "Error in SimDataPair: experimental data and uncertainties have different shape.");
208 if (!m_raw_user_weights || !m_raw_user_weights->hasSameShape(*m_raw_data))
209 throw std::runtime_error(
210 "Error in SimDataPair: user weights are not initialized or have invalid shape");
Defines class IntensityDataFunctions.
Defines constants and "almost equal" in namespace Numeric.
Defines class SimDataPair.
Defines class Simulation.
Declares utilities for unit converters.
A collection of fit parameters.
Interface to provide axis translations to different units for simulation output.
Holds pair of simulation/experimental data to fit.
SimulationResult userWeights() const
Returns the user uncertainties cut to the ROI area.
std::vector< double > experimental_array() const
Returns the flattened experimental data cut to the ROI area.
SimulationResult absoluteDifference() const
Returns the absolute difference between simulated and experimental data cut to the ROI area.
std::vector< double > user_weights_array() const
Returns a flat array of user weights cut to the ROI area.
std::vector< double > uncertainties_array() const
Returns the flattened experimental uncertainties cut to the ROI area.
std::vector< double > simulation_array() const
Returns the flattened simulated intensities cut to the ROI area.
SimulationResult uncertainties() const
Returns the data uncertainties cut to the ROI area If no uncertainties present, returns zero-filled S...
SimulationResult experimentalData() const
Returns the experimental data cut to the ROI area.
size_t numberOfFitElements() const
Returns the number of elements in the fit area.
SimulationResult relativeDifference() const
Returns the relative difference between simulated and experimental data cut to the ROI area.
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Wrapper around OutputData<double> that also provides unit conversions.
const IUnitConverter & converter() const
Returns underlying unit converter.
double GetRelativeDifference(double a, double b)
Returns the safe relative difference, which is 2(|a-b|)/(|a|+|b|) except in special cases.
double GetAbsoluteDifference(double a, double b)
Returns the absolute value of the difference between a and b.
std::unique_ptr< OutputData< double > > createOutputData(const IUnitConverter &converter, Axes::Units units)
Returns zero-valued output data array in specified units.