BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
SimDataPair Class Reference

Description

Holds pair of simulation/experimental data to fit.

Definition at line 30 of file SimDataPair.h.

Collaboration diagram for SimDataPair:
[legend]

Public Member Functions

 SimDataPair (SimDataPair &&other)
 
 SimDataPair (simulation_builder_t builder, const Datafield &raw_data, std::unique_ptr< Datafield > &&raw_stdv, double user_weight=1.0)
 
 SimDataPair (simulation_builder_t builder, const Datafield &raw_data, std::unique_ptr< Datafield > &&raw_stdv, std::unique_ptr< Datafield > &&user_weights)
 
 ~SimDataPair ()
 
SimulationResult absoluteDifference () const
 Returns the absolute difference between simulated and experimental data cut to the ROI area. More...
 
bool containsUncertainties () const
 
void execSimulation (const mumufit::Parameters &params)
 
std::vector< double > experimental_array () const
 Returns the flattened experimental data cut to the ROI area. More...
 
SimulationResult experimentalData () const
 Returns the experimental data cut to the ROI area. More...
 
SimulationResult relativeDifference () const
 Returns the relative difference between simulated and experimental data cut to the ROI area. More...
 
std::vector< double > simulation_array () const
 Returns the flattened simulated intensities cut to the ROI area. More...
 
SimulationResult simulationResult () const
 Returns the result of last computed simulation. More...
 
SimulationResult uncertainties () const
 Returns the data uncertainties cut to the ROI area If no uncertainties present, returns zero-filled SimulationResult. More...
 
std::vector< double > uncertainties_array () const
 Returns the flattened experimental uncertainties cut to the ROI area. If no uncertainties are available, Returns a zero-filled array sized to the ROI area. More...
 
std::vector< double > user_weights_array () const
 Returns a flat array of user weights cut to the ROI area. More...
 
SimulationResult userWeights () const
 Returns the user uncertainties cut to the ROI area. More...
 

Private Member Functions

void validate () const
 

Private Attributes

SimulationResult m_exp_data
 Experimental data cut to the ROI. Masked areas are nullified. More...
 
std::unique_ptr< Datafieldm_raw_data
 Raw experimental data as obtained from the user. More...
 
std::unique_ptr< Datafieldm_raw_uncertainties
 Data uncertainties as provided by the user. More...
 
std::unique_ptr< Datafieldm_raw_user_weights
 User-defined weights. More...
 
SimulationResult m_sim_data
 Current simulation results. Masked areas are nullified. More...
 
simulation_builder_t m_simulation_builder
 ISimulation builder from the user to construct simulation for given set of parameters. More...
 
SimulationResult m_uncertainties
 Weights from experimental data uncertainties. Masked areas are nullified. More...
 
SimulationResult m_user_weights
 Manually defined (user) weights. Masked areas are nullified. More...
 

Constructor & Destructor Documentation

◆ SimDataPair() [1/3]

SimDataPair::SimDataPair ( simulation_builder_t  builder,
const Datafield raw_data,
std::unique_ptr< Datafield > &&  raw_stdv,
double  user_weight = 1.0 
)

Definition at line 90 of file SimDataPair.cpp.

92  : m_simulation_builder(std::move(builder))
93  , m_raw_data(raw_data.clone())
94  , m_raw_uncertainties(std::move(raw_stdv))
95 {
96  m_raw_user_weights = initUserWeights(*m_raw_data, user_weight);
97  validate();
98 }
Datafield * clone() const
Definition: Datafield.cpp:48
void validate() const
std::unique_ptr< Datafield > m_raw_data
Raw experimental data as obtained from the user.
Definition: SimDataPair.h:97
std::unique_ptr< Datafield > m_raw_uncertainties
Data uncertainties as provided by the user.
Definition: SimDataPair.h:99
std::unique_ptr< Datafield > m_raw_user_weights
User-defined weights.
Definition: SimDataPair.h:101
simulation_builder_t m_simulation_builder
ISimulation builder from the user to construct simulation for given set of parameters.
Definition: SimDataPair.h:85

References m_raw_data, m_raw_user_weights, and validate().

Here is the call graph for this function:

◆ SimDataPair() [2/3]

SimDataPair::SimDataPair ( simulation_builder_t  builder,
const Datafield raw_data,
std::unique_ptr< Datafield > &&  raw_stdv,
std::unique_ptr< Datafield > &&  user_weights 
)

Definition at line 100 of file SimDataPair.cpp.

103  : m_simulation_builder(std::move(builder))
104  , m_raw_data(raw_data.clone())
105  , m_raw_uncertainties(std::move(raw_stdv))
106  , m_raw_user_weights(std::move(user_weights))
107 {
108  if (!m_raw_user_weights)
109  m_raw_user_weights = initUserWeights(*m_raw_data, 1.0);
110  validate();
111 }

References m_raw_data, m_raw_user_weights, and validate().

Here is the call graph for this function:

◆ SimDataPair() [3/3]

SimDataPair::SimDataPair ( SimDataPair &&  other)

Definition at line 113 of file SimDataPair.cpp.

114  : m_simulation_builder(std::move(other.m_simulation_builder))
115  , m_sim_data(std::move(other.m_sim_data))
116  , m_exp_data(std::move(other.m_exp_data))
117  , m_uncertainties(std::move(other.m_uncertainties))
118  , m_user_weights(std::move(other.m_user_weights))
119  , m_raw_data(std::move(other.m_raw_data))
120  , m_raw_uncertainties(std::move(other.m_raw_uncertainties))
121  , m_raw_user_weights(std::move(other.m_raw_user_weights))
122 {
123  validate();
124 }
SimulationResult m_sim_data
Current simulation results. Masked areas are nullified.
Definition: SimDataPair.h:88
SimulationResult m_uncertainties
Weights from experimental data uncertainties. Masked areas are nullified.
Definition: SimDataPair.h:92
SimulationResult m_exp_data
Experimental data cut to the ROI. Masked areas are nullified.
Definition: SimDataPair.h:90
SimulationResult m_user_weights
Manually defined (user) weights. Masked areas are nullified.
Definition: SimDataPair.h:94

References validate().

Here is the call graph for this function:

◆ ~SimDataPair()

SimDataPair::~SimDataPair ( )
default

Member Function Documentation

◆ absoluteDifference()

SimulationResult SimDataPair::absoluteDifference ( ) const

Returns the absolute difference between simulated and experimental data cut to the ROI area.

Definition at line 207 of file SimDataPair.cpp.

208 {
209  if (m_sim_data.empty() || m_exp_data.empty())
210  throwInitializationException("absoluteDifference");
211 
212  SimulationResult result = m_sim_data;
213  for (size_t i = 0, size = result.size(); i < size; ++i)
214  result[i] = Numeric::GetAbsoluteDifference(result[i], m_exp_data[i]);
215 
216  return result;
217 }
Wrapper around Datafield that also provides unit conversions.
bool empty() const
size_t size() const
double GetAbsoluteDifference(double a, double b)
Returns the absolute value of the difference between a and b.
Definition: Numeric.cpp:23

References SimulationResult::empty(), Numeric::GetAbsoluteDifference(), m_exp_data, m_sim_data, and SimulationResult::size().

Referenced by FitObjective::absoluteDifference().

Here is the call graph for this function:

◆ containsUncertainties()

bool SimDataPair::containsUncertainties ( ) const

Definition at line 159 of file SimDataPair.cpp.

160 {
161  return static_cast<bool>(m_raw_uncertainties);
162 }

References m_raw_uncertainties.

Referenced by FitObjective::allPairsHaveUncertainties(), ObjectiveMetric::compute(), FitObjective::containsUncertainties(), and execSimulation().

◆ execSimulation()

void SimDataPair::execSimulation ( const mumufit::Parameters params)

Definition at line 128 of file SimDataPair.cpp.

129 {
130  std::unique_ptr<ISimulation> simulation = m_simulation_builder(params);
131  ASSERT(simulation);
132  m_sim_data = simulation->simulate();
133 
135  return;
136 
137  if (m_sim_data.empty())
138  throwInitializationException("initResultArrays");
139 
140  auto* const sim2d = dynamic_cast<ISimulation2D*>(simulation.get());
141  if (sim2d) {
142  m_exp_data = convertData(*sim2d, *m_raw_data);
143  m_user_weights = convertData(*sim2d, *m_raw_user_weights);
144  } else {
145  const ICoordSystem& converter = m_sim_data.converter();
146  m_exp_data = SimulationResult(*m_raw_data, converter);
148  }
149 
150  if (sim2d && containsUncertainties())
151  m_uncertainties = convertData(*sim2d, *m_raw_uncertainties);
152  else {
153  const ICoordSystem& converter = m_sim_data.converter();
154  auto dummy_array = std::make_unique<Datafield>(converter.defaultAxes());
155  m_uncertainties = SimulationResult(*dummy_array, converter);
156  }
157 }
#define ASSERT(condition)
Definition: Assert.h:45
Interface to provide axis translations to different units for simulation output.
Definition: ICoordSystem.h:40
std::vector< IAxis * > defaultAxes() const
Abstract base class of simulations that generate 2D patterns.
Definition: ISimulation2D.h:34
bool containsUncertainties() const
const ICoordSystem & converter() const
Returns underlying unit converter.

References ASSERT, containsUncertainties(), SimulationResult::converter(), ICoordSystem::defaultAxes(), SimulationResult::empty(), m_exp_data, m_raw_data, m_raw_uncertainties, m_raw_user_weights, m_sim_data, m_simulation_builder, m_uncertainties, and m_user_weights.

Here is the call graph for this function:

◆ experimental_array()

std::vector< double > SimDataPair::experimental_array ( ) const

Returns the flattened experimental data cut to the ROI area.

Definition at line 219 of file SimDataPair.cpp.

220 {
221  if (m_exp_data.empty())
222  throwInitializationException("experimental_array");
223  return m_exp_data.datafield()->flatVector();
224 }
std::vector< double > flatVector() const
Returns copy of raw data vector.
Definition: Datafield.cpp:119
Datafield * datafield(Coords units=Coords::UNDEFINED) const

References SimulationResult::datafield(), SimulationResult::empty(), Datafield::flatVector(), and m_exp_data.

Referenced by ObjectiveMetric::compute(), and FitObjective::experimental_array().

Here is the call graph for this function:

◆ experimentalData()

SimulationResult SimDataPair::experimentalData ( ) const

Returns the experimental data cut to the ROI area.

Definition at line 171 of file SimDataPair.cpp.

172 {
173  if (m_exp_data.empty())
174  throwInitializationException("experimentalData");
175  return m_exp_data;
176 }

References SimulationResult::empty(), and m_exp_data.

Referenced by RQ4Metric::compute(), and FitObjective::experimentalData().

Here is the call graph for this function:

◆ relativeDifference()

SimulationResult SimDataPair::relativeDifference ( ) const

Returns the relative difference between simulated and experimental data cut to the ROI area.

Returns relative difference between simulation and experimental data.

Definition at line 195 of file SimDataPair.cpp.

196 {
197  if (m_sim_data.empty() || m_exp_data.empty())
198  throwInitializationException("relativeDifference");
199 
200  SimulationResult result = m_sim_data;
201  for (size_t i = 0, size = result.size(); i < size; ++i)
202  result[i] = Numeric::relativeDifference(result[i], m_exp_data[i]);
203 
204  return result;
205 }
double relativeDifference(double a, double b)
Returns the safe relative difference, which is 2(|a-b|)/(|a|+|b|) except in special cases.
Definition: Numeric.cpp:29

References SimulationResult::empty(), m_exp_data, m_sim_data, Numeric::relativeDifference(), and SimulationResult::size().

Referenced by FitObjective::relativeDifference().

Here is the call graph for this function:

◆ simulation_array()

std::vector< double > SimDataPair::simulation_array ( ) const

Returns the flattened simulated intensities cut to the ROI area.

Definition at line 226 of file SimDataPair.cpp.

227 {
228  if (m_sim_data.empty())
229  throwInitializationException("simulation_array");
230  return m_sim_data.datafield()->flatVector();
231 }

References SimulationResult::datafield(), SimulationResult::empty(), Datafield::flatVector(), and m_sim_data.

Referenced by ObjectiveMetric::compute(), and FitObjective::simulation_array().

Here is the call graph for this function:

◆ simulationResult()

SimulationResult SimDataPair::simulationResult ( ) const

Returns the result of last computed simulation.

Definition at line 164 of file SimDataPair.cpp.

165 {
166  if (m_sim_data.empty())
167  throwInitializationException("simulationResult");
168  return m_sim_data;
169 }

References SimulationResult::empty(), and m_sim_data.

Referenced by RQ4Metric::compute(), and FitObjective::simulationResult().

Here is the call graph for this function:

◆ uncertainties()

SimulationResult SimDataPair::uncertainties ( ) const

Returns the data uncertainties cut to the ROI area If no uncertainties present, returns zero-filled SimulationResult.

Definition at line 178 of file SimDataPair.cpp.

179 {
180  if (m_uncertainties.empty())
181  throwInitializationException("uncertainties");
182  return m_uncertainties;
183 }

References SimulationResult::empty(), and m_uncertainties.

Referenced by FitObjective::uncertaintyData().

Here is the call graph for this function:

◆ uncertainties_array()

std::vector< double > SimDataPair::uncertainties_array ( ) const

Returns the flattened experimental uncertainties cut to the ROI area. If no uncertainties are available, Returns a zero-filled array sized to the ROI area.

Definition at line 233 of file SimDataPair.cpp.

234 {
235  if (m_uncertainties.empty())
236  throwInitializationException("uncertainties_array");
238 }

References SimulationResult::datafield(), SimulationResult::empty(), Datafield::flatVector(), and m_uncertainties.

Referenced by ObjectiveMetric::compute(), and FitObjective::uncertainties().

Here is the call graph for this function:

◆ user_weights_array()

std::vector< double > SimDataPair::user_weights_array ( ) const

Returns a flat array of user weights cut to the ROI area.

Definition at line 240 of file SimDataPair.cpp.

241 {
242  if (m_user_weights.empty())
243  throwInitializationException("user_weights_array");
244  return m_user_weights.datafield()->flatVector();
245 }

References SimulationResult::datafield(), SimulationResult::empty(), Datafield::flatVector(), and m_user_weights.

Referenced by ObjectiveMetric::compute(), RQ4Metric::compute(), and FitObjective::weights_array().

Here is the call graph for this function:

◆ userWeights()

SimulationResult SimDataPair::userWeights ( ) const

Returns the user uncertainties cut to the ROI area.

Definition at line 186 of file SimDataPair.cpp.

187 {
188  if (m_user_weights.empty())
189  throwInitializationException("userWeights");
190  return m_user_weights;
191 }

References SimulationResult::empty(), and m_user_weights.

Here is the call graph for this function:

◆ validate()

void SimDataPair::validate ( ) const
private

Definition at line 247 of file SimDataPair.cpp.

248 {
250  throw std::runtime_error("Error in SimDataPair: simulation builder is empty");
251 
252  if (!m_raw_data)
253  throw std::runtime_error("Error in SimDataPair: passed experimental data array is empty");
254 
255  if (m_raw_uncertainties && !m_raw_uncertainties->hasSameShape(*m_raw_data))
256  throw std::runtime_error(
257  "Error in SimDataPair: experimental data and uncertainties have different shape.");
258 
259  if (!m_raw_user_weights || !m_raw_user_weights->hasSameShape(*m_raw_data))
260  throw std::runtime_error(
261  "Error in SimDataPair: user weights are not initialized or have invalid shape");
262 }

References m_raw_data, m_raw_uncertainties, m_raw_user_weights, and m_simulation_builder.

Referenced by SimDataPair().

Member Data Documentation

◆ m_exp_data

SimulationResult SimDataPair::m_exp_data
private

Experimental data cut to the ROI. Masked areas are nullified.

Definition at line 90 of file SimDataPair.h.

Referenced by absoluteDifference(), execSimulation(), experimental_array(), experimentalData(), and relativeDifference().

◆ m_raw_data

std::unique_ptr<Datafield> SimDataPair::m_raw_data
private

Raw experimental data as obtained from the user.

Definition at line 97 of file SimDataPair.h.

Referenced by SimDataPair(), execSimulation(), and validate().

◆ m_raw_uncertainties

std::unique_ptr<Datafield> SimDataPair::m_raw_uncertainties
private

Data uncertainties as provided by the user.

Definition at line 99 of file SimDataPair.h.

Referenced by containsUncertainties(), execSimulation(), and validate().

◆ m_raw_user_weights

std::unique_ptr<Datafield> SimDataPair::m_raw_user_weights
private

User-defined weights.

Definition at line 101 of file SimDataPair.h.

Referenced by SimDataPair(), execSimulation(), and validate().

◆ m_sim_data

SimulationResult SimDataPair::m_sim_data
private

Current simulation results. Masked areas are nullified.

Definition at line 88 of file SimDataPair.h.

Referenced by absoluteDifference(), execSimulation(), relativeDifference(), simulation_array(), and simulationResult().

◆ m_simulation_builder

simulation_builder_t SimDataPair::m_simulation_builder
private

ISimulation builder from the user to construct simulation for given set of parameters.

Definition at line 85 of file SimDataPair.h.

Referenced by execSimulation(), and validate().

◆ m_uncertainties

SimulationResult SimDataPair::m_uncertainties
private

Weights from experimental data uncertainties. Masked areas are nullified.

Definition at line 92 of file SimDataPair.h.

Referenced by execSimulation(), uncertainties(), and uncertainties_array().

◆ m_user_weights

SimulationResult SimDataPair::m_user_weights
private

Manually defined (user) weights. Masked areas are nullified.

Definition at line 94 of file SimDataPair.h.

Referenced by execSimulation(), user_weights_array(), and userWeights().


The documentation for this class was generated from the following files: