BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SimDataPair Class Reference
Collaboration diagram for SimDataPair:

Public Member Functions

 SimDataPair (simulation_builder_t builder, const OutputData< double > &data, std::unique_ptr< OutputData< double >> uncertainties, double user_weight=1.0)
 
 SimDataPair (simulation_builder_t builder, const OutputData< double > &data, std::unique_ptr< OutputData< double >> uncertainties, std::unique_ptr< OutputData< double >> user_weights)
 
 SimDataPair (SimDataPair &&other)
 
 ~SimDataPair ()
 
void runSimulation (const Fit::Parameters &params)
 
bool containsUncertainties () const
 
size_t numberOfFitElements () const
 
SimulationResult simulationResult () const
 
SimulationResult experimentalData () const
 
SimulationResult uncertainties () const
 
SimulationResult userWeights () const
 
SimulationResult relativeDifference () const
 
SimulationResult absoluteDifference () const
 
std::vector< double > simulation_array () const
 
std::vector< double > experimental_array () const
 
std::vector< double > uncertainties_array () const
 
std::vector< double > user_weights_array () const
 

Private Member Functions

void initResultArrays ()
 
void validate () const
 

Private Attributes

simulation_builder_t m_simulation_builder
 
std::unique_ptr< Simulationm_simulation
 
SimulationResult m_sim_data
 
SimulationResult m_exp_data
 
SimulationResult m_uncertainties
 
SimulationResult m_user_weights
 
std::unique_ptr< OutputData< double > > m_raw_data
 
std::unique_ptr< OutputData< double > > m_raw_uncertainties
 
std::unique_ptr< OutputData< double > > m_raw_user_weights
 

Detailed Description

Holds pair of simulation/experimental data to fit.

Definition at line 25 of file SimDataPair.h.

Constructor & Destructor Documentation

◆ SimDataPair() [1/3]

SimDataPair::SimDataPair ( simulation_builder_t  builder,
const OutputData< double > &  data,
std::unique_ptr< OutputData< double >>  uncertainties,
double  user_weight = 1.0 
)

Definition at line 39 of file SimDataPair.cpp.

41  : m_simulation_builder(builder), m_raw_data(data.clone()),
43 {
45  validate();
46 }
OutputData * clone() const
Definition: OutputData.h:253
std::unique_ptr< OutputData< double > > m_raw_user_weights
User-defined weights.
Definition: SimDataPair.h:105
SimulationResult uncertainties() const
Returns the data uncertainties cut to the ROI area If no uncertainties present, returns zero-filled S...
void validate() const
std::unique_ptr< OutputData< double > > m_raw_data
Raw experimental data as obtained from the user.
Definition: SimDataPair.h:101
std::unique_ptr< OutputData< double > > m_raw_uncertainties
Data uncertainties as provided by the user.
Definition: SimDataPair.h:103
simulation_builder_t m_simulation_builder
Simulation builder from the user to construct simulation for given set of parameters.
Definition: SimDataPair.h:86
std::unique_ptr< OutputData< double > > initUserWeights(const OutputData< double > &shape, double value)
Definition: SimDataPair.cpp:30

References anonymous_namespace{SimDataPair.cpp}::initUserWeights(), 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 OutputData< double > &  data,
std::unique_ptr< OutputData< double >>  uncertainties,
std::unique_ptr< OutputData< double >>  user_weights 
)

Definition at line 48 of file SimDataPair.cpp.

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))
53 {
54  if (!m_raw_user_weights)
56  validate();
57 }

References anonymous_namespace{SimDataPair.cpp}::initUserWeights(), 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 59 of file SimDataPair.cpp.

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))
66 {
67  validate();
68 }
SimulationResult m_sim_data
Current simulation results. Masked areas are nullified.
Definition: SimDataPair.h:92
std::unique_ptr< Simulation > m_simulation
Current simulation for given set of parameters.
Definition: SimDataPair.h:89
SimulationResult m_uncertainties
Weights from experimental data uncertainties. Masked areas are nullified.
Definition: SimDataPair.h:96
SimulationResult m_exp_data
Experimental data cut to the ROI. Masked areas are nullified.
Definition: SimDataPair.h:94
SimulationResult m_user_weights
Manually defined (user) weights. Masked areas are nullified.
Definition: SimDataPair.h:98

References validate().

Here is the call graph for this function:

◆ ~SimDataPair()

SimDataPair::~SimDataPair ( )
default

Member Function Documentation

◆ runSimulation()

void SimDataPair::runSimulation ( const Fit::Parameters params)

Definition at line 72 of file SimDataPair.cpp.

73 {
75  m_simulation->runSimulation();
76  m_sim_data = m_simulation->result();
77 
79 }
void initResultArrays()

References initResultArrays(), m_sim_data, m_simulation, and m_simulation_builder.

Here is the call graph for this function:

◆ containsUncertainties()

bool SimDataPair::containsUncertainties ( ) const

◆ numberOfFitElements()

size_t SimDataPair::numberOfFitElements ( ) const

Returns the number of elements in the fit area.

Definition at line 86 of file SimDataPair.cpp.

87 {
88  return m_simulation ? m_simulation->intensityMapSize() : 0;
89 }

References m_simulation.

◆ simulationResult()

SimulationResult SimDataPair::simulationResult ( ) const

Returns the result of last computed simulation.

Definition at line 91 of file SimDataPair.cpp.

92 {
93  if (m_sim_data.empty())
94  throwInitializationException("simulationResult");
95  return m_sim_data;
96 }
bool empty() const
void throwInitializationException(std::string method)
Definition: SimDataPair.cpp:23

References SimulationResult::empty(), m_sim_data, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

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

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 98 of file SimDataPair.cpp.

99 {
100  if (m_exp_data.empty())
101  throwInitializationException("experimentalData");
102  return m_exp_data;
103 }

References SimulationResult::empty(), m_exp_data, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

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

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 105 of file SimDataPair.cpp.

106 {
107  if (m_uncertainties.empty())
108  throwInitializationException("uncertainties");
109  return m_uncertainties;
110 }

References SimulationResult::empty(), m_uncertainties, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

Referenced by FitObjective::uncertaintyData().

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 113 of file SimDataPair.cpp.

114 {
115  if (m_user_weights.empty())
116  throwInitializationException("userWeights");
117  return m_user_weights;
118 }

References SimulationResult::empty(), m_user_weights, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

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 122 of file SimDataPair.cpp.

123 {
124  if (m_sim_data.size() == 0 || m_exp_data.size() == 0)
125  throwInitializationException("relativeDifference");
126 
127  SimulationResult result = m_sim_data;
128  for (size_t i = 0, size = result.size(); i < size; ++i)
129  result[i] = Numeric::GetRelativeDifference(result[i], m_exp_data[i]);
130 
131  return result;
132 }
Wrapper around OutputData<double> that also provides unit conversions.
size_t size() const
double GetRelativeDifference(double a, double b)
Returns the safe relative difference, which is 2(|a-b|)/(|a|+|b|) except in special cases.
Definition: Numeric.cpp:32

References Numeric::GetRelativeDifference(), m_exp_data, m_sim_data, SimulationResult::size(), and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

Referenced by FitObjective::relativeDifference().

Here is the call graph for this function:

◆ absoluteDifference()

SimulationResult SimDataPair::absoluteDifference ( ) const

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

Definition at line 134 of file SimDataPair.cpp.

135 {
136  if (m_sim_data.size() == 0 || m_exp_data.size() == 0)
137  throwInitializationException("absoluteDifference");
138 
139  SimulationResult result = m_sim_data;
140  for (size_t i = 0, size = result.size(); i < size; ++i)
141  result[i] = Numeric::GetAbsoluteDifference(result[i], m_exp_data[i]);
142 
143  return result;
144 }
double GetAbsoluteDifference(double a, double b)
Returns the absolute value of the difference between a and b.
Definition: Numeric.cpp:26

References Numeric::GetAbsoluteDifference(), m_exp_data, m_sim_data, SimulationResult::size(), and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

Referenced by FitObjective::absoluteDifference().

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 153 of file SimDataPair.cpp.

154 {
155  if (m_sim_data.empty())
156  throwInitializationException("simulation_array");
157  return m_sim_data.data()->getRawDataVector();
158 }
std::unique_ptr< OutputData< double > > data(Axes::Units units=Axes::Units::DEFAULT) const

References SimulationResult::data(), SimulationResult::empty(), m_sim_data, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

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

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 146 of file SimDataPair.cpp.

147 {
148  if (m_exp_data.empty())
149  throwInitializationException("experimental_array");
150  return m_exp_data.data()->getRawDataVector();
151 }

References SimulationResult::data(), SimulationResult::empty(), m_exp_data, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

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

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 160 of file SimDataPair.cpp.

161 {
162  if (m_uncertainties.empty())
163  throwInitializationException("uncertainties_array");
164  return m_uncertainties.data()->getRawDataVector();
165 }

References SimulationResult::data(), SimulationResult::empty(), m_uncertainties, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

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 167 of file SimDataPair.cpp.

168 {
169  if (m_user_weights.empty())
170  throwInitializationException("user_weights_array");
171  return m_user_weights.data()->getRawDataVector();
172 }

References SimulationResult::data(), SimulationResult::empty(), m_user_weights, and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

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

Here is the call graph for this function:

◆ initResultArrays()

void SimDataPair::initResultArrays ( )
private

Definition at line 174 of file SimDataPair.cpp.

175 {
176  if (m_exp_data.size() != 0 && m_uncertainties.size() != 0 && m_user_weights.size() != 0)
177  return;
178 
179  if (!m_simulation || m_sim_data.size() == 0)
180  throwInitializationException("initResultArrays");
181 
182  m_exp_data = m_simulation->convertData(*m_raw_data, true);
183 
184  if (containsUncertainties()) {
185  m_uncertainties = m_simulation->convertData(*m_raw_uncertainties, true);
186  } else {
187  const IUnitConverter& converter = m_sim_data.converter();
188  std::unique_ptr<OutputData<double>> dummy_array =
189  UnitConverterUtils::createOutputData(converter, converter.defaultUnits());
190  m_uncertainties = SimulationResult(*dummy_array, converter);
191  }
192 
193  m_user_weights = m_simulation->convertData(*m_raw_user_weights, true);
194 }
Interface to provide axis translations to different units for simulation output.
virtual Axes::Units defaultUnits() const =0
bool containsUncertainties() const
Definition: SimDataPair.cpp:81
const IUnitConverter & converter() const
Returns underlying unit converter.
std::unique_ptr< OutputData< double > > createOutputData(const IUnitConverter &converter, Axes::Units units)
Returns zero-valued output data array in specified units.

References containsUncertainties(), SimulationResult::converter(), UnitConverterUtils::createOutputData(), IUnitConverter::defaultUnits(), m_exp_data, m_raw_data, m_raw_uncertainties, m_raw_user_weights, m_sim_data, m_simulation, m_uncertainties, m_user_weights, SimulationResult::size(), and anonymous_namespace{SimDataPair.cpp}::throwInitializationException().

Referenced by runSimulation().

Here is the call graph for this function:

◆ validate()

void SimDataPair::validate ( ) const
private

Definition at line 196 of file SimDataPair.cpp.

197 {
199  throw std::runtime_error("Error in SimDataPair: simulation builder is empty");
200 
201  if (!m_raw_data)
202  throw std::runtime_error("Error in SimDataPair: passed experimental data array is empty");
203 
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.");
207 
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");
211 }

References m_raw_data, m_raw_uncertainties, m_raw_user_weights, and m_simulation_builder.

Referenced by SimDataPair().

Member Data Documentation

◆ m_simulation_builder

simulation_builder_t SimDataPair::m_simulation_builder
private

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

Definition at line 86 of file SimDataPair.h.

Referenced by runSimulation(), and validate().

◆ m_simulation

std::unique_ptr<Simulation> SimDataPair::m_simulation
private

Current simulation for given set of parameters.

Definition at line 89 of file SimDataPair.h.

Referenced by initResultArrays(), numberOfFitElements(), and runSimulation().

◆ m_sim_data

SimulationResult SimDataPair::m_sim_data
private

Current simulation results. Masked areas are nullified.

Definition at line 92 of file SimDataPair.h.

Referenced by absoluteDifference(), initResultArrays(), relativeDifference(), runSimulation(), simulation_array(), and simulationResult().

◆ m_exp_data

SimulationResult SimDataPair::m_exp_data
private

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

Definition at line 94 of file SimDataPair.h.

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

◆ m_uncertainties

SimulationResult SimDataPair::m_uncertainties
private

Weights from experimental data uncertainties. Masked areas are nullified.

Definition at line 96 of file SimDataPair.h.

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

◆ m_user_weights

SimulationResult SimDataPair::m_user_weights
private

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

Definition at line 98 of file SimDataPair.h.

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

◆ m_raw_data

std::unique_ptr<OutputData<double> > SimDataPair::m_raw_data
private

Raw experimental data as obtained from the user.

Definition at line 101 of file SimDataPair.h.

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

◆ m_raw_uncertainties

std::unique_ptr<OutputData<double> > SimDataPair::m_raw_uncertainties
private

Data uncertainties as provided by the user.

Definition at line 103 of file SimDataPair.h.

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

◆ m_raw_user_weights

std::unique_ptr<OutputData<double> > SimDataPair::m_raw_user_weights
private

User-defined weights.

Definition at line 105 of file SimDataPair.h.

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


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