BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
DecouplingApproximationStrategy Class Referencefinal
Inheritance diagram for DecouplingApproximationStrategy:
Collaboration diagram for DecouplingApproximationStrategy:

Public Member Functions

 DecouplingApproximationStrategy (SimulationOptions sim_params, bool polarized)
 
void init (const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff)
 
double evaluate (const SimulationElement &sim_element) const
 

Protected Attributes

std::vector< FormFactorCoherentSumm_formfactor_wrappers
 
std::unique_ptr< IInterferenceFunctionmP_iff
 
SimulationOptions m_options
 

Private Member Functions

double scalarCalculation (const SimulationElement &sim_element) const override
 
double polarizedCalculation (const SimulationElement &sim_element) const override
 
double evaluateSinglePoint (const SimulationElement &sim_element) const
 
double MCIntegratedEvaluate (const SimulationElement &sim_element) const
 
double evaluate_for_fixed_angles (double *fractions, size_t dim, void *params) const
 
virtual void strategy_specific_post_init ()
 

Private Attributes

bool m_polarized
 
std::unique_ptr< IntegratorMCMiser< IInterferenceFunctionStrategy > > mP_integrator
 

Detailed Description

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

Definition at line 26 of file DecouplingApproximationStrategy.h.

Constructor & Destructor Documentation

◆ DecouplingApproximationStrategy()

DecouplingApproximationStrategy::DecouplingApproximationStrategy ( SimulationOptions  sim_params,
bool  polarized 
)

Definition at line 27 of file DecouplingApproximationStrategy.cpp.

29  : IInterferenceFunctionStrategy(sim_params, polarized)
30 {
31 }
IInterferenceFunctionStrategy(const SimulationOptions &sim_params, bool polarized)

Member Function Documentation

◆ 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 37 of file DecouplingApproximationStrategy.cpp.

38 {
39  double intensity = 0.0;
40  complex_t amplitude = complex_t(0.0, 0.0);
41  auto precomputed_ff = PrecomputeScalarFormFactors(sim_element, m_formfactor_wrappers);
42  for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
43  complex_t ff = precomputed_ff[i];
44  if (std::isnan(ff.real()))
46  "DecouplingApproximationStrategy::scalarCalculation() -> Error! Amplitude is NaN");
47  double fraction = m_formfactor_wrappers[i].relativeAbundance();
48  amplitude += fraction * ff;
49  intensity += fraction * std::norm(ff);
50  }
51  double amplitude_norm = std::norm(amplitude);
52  double itf_function = mP_iff->evaluate(sim_element.getMeanQ());
53  return intensity + amplitude_norm * (itf_function - 1.0);
54 }
std::complex< double > complex_t
Definition: Complex.h:20
std::vector< FormFactorCoherentSum > m_formfactor_wrappers
std::unique_ptr< IInterferenceFunction > mP_iff
kvector_t getMeanQ() const
std::vector< complex_t > PrecomputeScalarFormFactors(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

References SimulationElement::getMeanQ(), IInterferenceFunctionStrategy::m_formfactor_wrappers, IInterferenceFunctionStrategy::mP_iff, and InterferenceFunctionUtils::PrecomputeScalarFormFactors().

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 58 of file DecouplingApproximationStrategy.cpp.

59 {
60  Eigen::Matrix2cd mean_intensity = Eigen::Matrix2cd::Zero();
61  Eigen::Matrix2cd mean_amplitude = Eigen::Matrix2cd::Zero();
62 
63  auto precomputed_ff = PrecomputePolarizedFormFactors(sim_element, m_formfactor_wrappers);
64  const auto& polarization_handler = sim_element.polarizationHandler();
65  for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
66  Eigen::Matrix2cd ff = precomputed_ff[i];
67  if (!ff.allFinite())
69  "DecouplingApproximationStrategy::polarizedCalculation() -> "
70  "Error! Form factor contains NaN or infinite");
71  double fraction = m_formfactor_wrappers[i].relativeAbundance();
72  mean_amplitude += fraction * ff;
73  mean_intensity += fraction * (ff * polarization_handler.getPolarization() * ff.adjoint());
74  }
75  Eigen::Matrix2cd amplitude_matrix = polarization_handler.getAnalyzerOperator() * mean_amplitude
76  * polarization_handler.getPolarization()
77  * mean_amplitude.adjoint();
78  Eigen::Matrix2cd intensity_matrix = polarization_handler.getAnalyzerOperator() * mean_intensity;
79  double amplitude_trace = std::abs(amplitude_matrix.trace());
80  double intensity_trace = std::abs(intensity_matrix.trace());
81  double itf_function = mP_iff->evaluate(sim_element.getMeanQ());
82  return intensity_trace + amplitude_trace * (itf_function - 1.0);
83 }
const PolarizationHandler & polarizationHandler() const
Returns assigned PolarizationHandler.
matrixFFVector_t PrecomputePolarizedFormFactors(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

References SimulationElement::getMeanQ(), IInterferenceFunctionStrategy::m_formfactor_wrappers, IInterferenceFunctionStrategy::mP_iff, SimulationElement::polarizationHandler(), and InterferenceFunctionUtils::PrecomputePolarizedFormFactors().

Here is the call graph for this function:

◆ init()

void IInterferenceFunctionStrategy::init ( const std::vector< FormFactorCoherentSum > &  weighted_formfactors,
const IInterferenceFunction p_iff 
)
inherited

Initializes the object with form factors and an interference function.

Definition at line 32 of file IInterferenceFunctionStrategy.cpp.

35 {
36  if (weighted_formfactors.empty())
38  "IInterferenceFunctionStrategy::init: strategy gets no form factors.");
39  m_formfactor_wrappers = weighted_formfactors;
40  if (p_iff)
41  mP_iff.reset(p_iff->clone());
42  else
43  mP_iff.reset(new InterferenceFunctionNone());
44 
46 }
virtual IInterferenceFunction * clone() const =0
Returns a clone of this ISample object.
Default interference function (i.e.

References IInterferenceFunction::clone(), IInterferenceFunctionStrategy::m_formfactor_wrappers, IInterferenceFunctionStrategy::mP_iff, and IInterferenceFunctionStrategy::strategy_specific_post_init().

Here is the call graph for this function:

◆ evaluate()

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

Calculates the intensity for scalar particles/interactions.

Definition at line 48 of file IInterferenceFunctionStrategy.cpp.

49 {
50  if (m_options.isIntegrate() && (sim_element.getSolidAngle() > 0.0))
51  return MCIntegratedEvaluate(sim_element);
52  return evaluateSinglePoint(sim_element);
53 }
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 getSolidAngle() const
bool isIntegrate() const

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

Here is the call graph for this function:

◆ evaluateSinglePoint()

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

Definition at line 56 of file IInterferenceFunctionStrategy.cpp.

57 {
58  if (!m_polarized)
59  return scalarCalculation(sim_element);
60  else
61  return polarizedCalculation(sim_element);
62 }
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 66 of file IInterferenceFunctionStrategy.cpp.

67 {
68  double min_array[] = {0.0, 0.0};
69  double max_array[] = {1.0, 1.0};
70  return mP_integrator->integrate(min_array, max_array, (void*)&sim_element,
72 }
std::unique_ptr< IntegratorMCMiser< IInterferenceFunctionStrategy > > mP_integrator
size_t getMcPoints() const

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

Referenced by IInterferenceFunctionStrategy::evaluate().

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 74 of file IInterferenceFunctionStrategy.cpp.

76 {
77  double par0 = fractions[0];
78  double par1 = fractions[1];
79 
80  SimulationElement* pars = static_cast<SimulationElement*>(params);
81 
82  SimulationElement sim_element(*pars, par0, par1);
83  return pars->getIntegrationFactor(par0, par1) * evaluateSinglePoint(sim_element);
84 }
Data stucture containing both input and output of a single detector cell.
double getIntegrationFactor(double x, double y) const

References IInterferenceFunctionStrategy::evaluateSinglePoint(), and SimulationElement::getIntegrationFactor().

Here is the call graph for this function:

◆ strategy_specific_post_init()

void IInterferenceFunctionStrategy::strategy_specific_post_init ( )
privatevirtualinherited

Reimplemented in SSCApproximationStrategy.

Definition at line 86 of file IInterferenceFunctionStrategy.cpp.

86 {}

Referenced by IInterferenceFunctionStrategy::init().

Member Data Documentation

◆ m_formfactor_wrappers

◆ mP_iff

◆ m_options

SimulationOptions IInterferenceFunctionStrategy::m_options
protectedinherited

◆ m_polarized

bool IInterferenceFunctionStrategy::m_polarized
privateinherited

◆ mP_integrator

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

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