BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
DecouplingApproximationStrategy Class Reference

Strategy class to compute the total scattering from a particle layout in the decoupling approximation. More...

Inheritance diagram for DecouplingApproximationStrategy:
[legend]
Collaboration diagram for DecouplingApproximationStrategy:
[legend]

Public Member Functions

 DecouplingApproximationStrategy (const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *iff, SimulationOptions sim_params, bool polarized)
 
double evaluate (const SimulationElement &sim_element) const
 Calculates the intensity for scalar particles/interactions. More...
 

Protected Attributes

const SimulationOptions m_options
 
std::vector< FormFactorCoherentSumm_weighted_formfactors
 

Private Member Functions

double evaluate_for_fixed_angles (double *fractions, size_t dim, void *params) const
 
double evaluateSinglePoint (const SimulationElement &sim_element) const
 
double MCIntegratedEvaluate (const SimulationElement &sim_element) const
 Performs a Monte Carlo integration over the bin for the evaluation of the intensity. More...
 
double polarizedCalculation (const SimulationElement &sim_element) const override
 This is the polarized version. More...
 
double scalarCalculation (const SimulationElement &sim_element) const override
 Returns the total incoherent and coherent scattering intensity for given kf and for one particle layout (implied by the given particle form factors). More...
 

Private Attributes

std::unique_ptr< IInterferenceFunctionm_iff
 
std::unique_ptr< IntegratorMCMiser< IInterferenceFunctionStrategy > > m_integrator
 
bool m_polarized
 

Detailed Description

Strategy class to compute the total scattering from a particle layout in the decoupling approximation.

Definition at line 31 of file DecouplingApproximationStrategy.h.

Constructor & Destructor Documentation

◆ DecouplingApproximationStrategy()

DecouplingApproximationStrategy::DecouplingApproximationStrategy ( const std::vector< FormFactorCoherentSum > &  weighted_formfactors,
const IInterferenceFunction iff,
SimulationOptions  sim_params,
bool  polarized 
)

Definition at line 22 of file DecouplingApproximationStrategy.cpp.

25  : IInterferenceFunctionStrategy(weighted_formfactors, sim_params, polarized)
26  , m_iff(iff ? iff->clone() : new InterferenceFunctionNone())
27 
28 {
29 }
std::unique_ptr< IInterferenceFunction > m_iff
IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const SimulationOptions &sim_params, bool polarized)
virtual IInterferenceFunction * clone() const =0
Returns a clone of this ISampleNode object.
Default interference function (i.e.
matrixFFVector_t polarized(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

Member Function Documentation

◆ evaluate()

double IInterferenceFunctionStrategy::evaluate ( const SimulationElement sim_element) const
inherited

Calculates the intensity for scalar particles/interactions.

Definition at line 35 of file IInterferenceFunctionStrategy.cpp.

36 {
37  if (m_options.isIntegrate() && (sim_element.solidAngle() > 0.0))
38  return MCIntegratedEvaluate(sim_element);
39  return evaluateSinglePoint(sim_element);
40 }
double evaluateSinglePoint(const SimulationElement &sim_element) const
double MCIntegratedEvaluate(const SimulationElement &sim_element) const
Performs a Monte Carlo integration over the bin for the evaluation of the intensity.
double solidAngle() const
bool isIntegrate() const

References IInterferenceFunctionStrategy::evaluateSinglePoint(), SimulationOptions::isIntegrate(), IInterferenceFunctionStrategy::m_options, IInterferenceFunctionStrategy::MCIntegratedEvaluate(), and SimulationElement::solidAngle().

Here is the call graph for this function:

◆ evaluate_for_fixed_angles()

double IInterferenceFunctionStrategy::evaluate_for_fixed_angles ( double *  fractions,
size_t  dim,
void *  params 
) const
privateinherited

Definition at line 60 of file IInterferenceFunctionStrategy.cpp.

62 {
63  double par0 = fractions[0];
64  double par1 = fractions[1];
65 
66  SimulationElement* pars = static_cast<SimulationElement*>(params);
67 
68  SimulationElement sim_element = pars->pointElement(par0, par1);
69  return pars->integrationFactor(par0, par1) * evaluateSinglePoint(sim_element);
70 }
Data stucture containing both input and output of a single detector cell.
SimulationElement pointElement(double x, double y) const
Returns copy of this SimulationElement with k_f given by in-pixel coordinate x,y.
double integrationFactor(double x, double y) const

References IInterferenceFunctionStrategy::evaluateSinglePoint(), SimulationElement::integrationFactor(), and SimulationElement::pointElement().

Here is the call graph for this function:

◆ evaluateSinglePoint()

double IInterferenceFunctionStrategy::evaluateSinglePoint ( const SimulationElement sim_element) const
privateinherited

Definition at line 43 of file IInterferenceFunctionStrategy.cpp.

44 {
45  if (!m_polarized)
46  return scalarCalculation(sim_element);
47  return polarizedCalculation(sim_element);
48 }
virtual double scalarCalculation(const SimulationElement &sim_element) const =0
Evaluates the intensity in the scalar case.
virtual double polarizedCalculation(const SimulationElement &sim_element) const =0
Evaluates the intensity in the polarized case.

References IInterferenceFunctionStrategy::m_polarized, IInterferenceFunctionStrategy::polarizedCalculation(), and IInterferenceFunctionStrategy::scalarCalculation().

Referenced by IInterferenceFunctionStrategy::evaluate(), and IInterferenceFunctionStrategy::evaluate_for_fixed_angles().

Here is the call graph for this function:

◆ MCIntegratedEvaluate()

double IInterferenceFunctionStrategy::MCIntegratedEvaluate ( const SimulationElement sim_element) const
privateinherited

Performs a Monte Carlo integration over the bin for the evaluation of the intensity.

Definition at line 52 of file IInterferenceFunctionStrategy.cpp.

53 {
54  double min_array[] = {0.0, 0.0};
55  double max_array[] = {1.0, 1.0};
56  return m_integrator->integrate(min_array, max_array, (void*)&sim_element,
58 }
std::unique_ptr< IntegratorMCMiser< IInterferenceFunctionStrategy > > m_integrator
size_t getMcPoints() const

References SimulationOptions::getMcPoints(), IInterferenceFunctionStrategy::m_integrator, and IInterferenceFunctionStrategy::m_options.

Referenced by IInterferenceFunctionStrategy::evaluate().

Here is the call graph for this function:

◆ polarizedCalculation()

double DecouplingApproximationStrategy::polarizedCalculation ( const SimulationElement sim_element) const
overrideprivatevirtual

This is the polarized version.

Implements IInterferenceFunctionStrategy.

Definition at line 55 of file DecouplingApproximationStrategy.cpp.

56 {
57  Eigen::Matrix2cd mean_intensity = Eigen::Matrix2cd::Zero();
58  Eigen::Matrix2cd mean_amplitude = Eigen::Matrix2cd::Zero();
59 
60  const auto& polarization_handler = sim_element.polarizationHandler();
61  for (const auto& ffw : m_weighted_formfactors) {
62  const Eigen::Matrix2cd ff = ffw.evaluatePol(sim_element);
63  if (!ff.allFinite())
64  throw std::runtime_error("DecouplingApproximationStrategy::polarizedCalculation() -> "
65  "Error! Form factor contains NaN or infinite");
66  const double fraction = ffw.relativeAbundance();
67  mean_amplitude += fraction * ff;
68  mean_intensity += fraction * (ff * polarization_handler.getPolarization() * ff.adjoint());
69  }
70  const Eigen::Matrix2cd amplitude_matrix =
71  polarization_handler.getAnalyzerOperator() * mean_amplitude
72  * polarization_handler.getPolarization() * mean_amplitude.adjoint();
73  const Eigen::Matrix2cd intensity_matrix =
74  polarization_handler.getAnalyzerOperator() * mean_intensity;
75  const double amplitude_trace = std::abs(amplitude_matrix.trace());
76  const double intensity_trace = std::abs(intensity_matrix.trace());
77  const double coherence_factor = m_iff->evaluate(sim_element.meanQ());
78  return intensity_trace + amplitude_trace * (coherence_factor - 1.0);
79 }
std::vector< FormFactorCoherentSum > m_weighted_formfactors
kvector_t meanQ() const
const PolarizationHandler & polarizationHandler() const
Returns assigned PolarizationHandler.

References m_iff, IInterferenceFunctionStrategy::m_weighted_formfactors, SimulationElement::meanQ(), and SimulationElement::polarizationHandler().

Here is the call graph for this function:

◆ scalarCalculation()

double DecouplingApproximationStrategy::scalarCalculation ( const SimulationElement sim_element) const
overrideprivatevirtual

Returns the total incoherent and coherent scattering intensity for given kf and for one particle layout (implied by the given particle form factors).

This is the scalar version

Implements IInterferenceFunctionStrategy.

Definition at line 35 of file DecouplingApproximationStrategy.cpp.

36 {
37  double intensity = 0.0;
38  complex_t amplitude = complex_t(0.0, 0.0);
39  for (const auto& ffw : m_weighted_formfactors) {
40  const complex_t ff = ffw.evaluate(sim_element);
41  if (std::isnan(ff.real()))
42  throw std::runtime_error(
43  "DecouplingApproximationStrategy::scalarCalculation() -> Error! Amplitude is NaN");
44  double fraction = ffw.relativeAbundance();
45  amplitude += fraction * ff;
46  intensity += fraction * std::norm(ff);
47  }
48  const double amplitude_norm = std::norm(amplitude);
49  const double coherence_factor = m_iff->evaluate(sim_element.meanQ());
50  return intensity + amplitude_norm * (coherence_factor - 1.0);
51 }
std::complex< double > complex_t
Definition: Complex.h:20

References m_iff, IInterferenceFunctionStrategy::m_weighted_formfactors, and SimulationElement::meanQ().

Here is the call graph for this function:

Member Data Documentation

◆ m_iff

std::unique_ptr<IInterferenceFunction> DecouplingApproximationStrategy::m_iff
private

Definition at line 41 of file DecouplingApproximationStrategy.h.

Referenced by polarizedCalculation(), and scalarCalculation().

◆ m_integrator

std::unique_ptr<IntegratorMCMiser<IInterferenceFunctionStrategy> > IInterferenceFunctionStrategy::m_integrator
privateinherited

◆ m_options

const SimulationOptions IInterferenceFunctionStrategy::m_options
protectedinherited

◆ m_polarized

bool IInterferenceFunctionStrategy::m_polarized
privateinherited

◆ m_weighted_formfactors


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