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

Public Member Functions

 SSCApproximationStrategy (SimulationOptions sim_params, double kappa, 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

void strategy_specific_post_init () override
 
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
 

Private Attributes

SSCAHelper m_helper
 
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 size-spacing correlation approximation.

Definition at line 26 of file SSCApproximationStrategy.h.

Constructor & Destructor Documentation

◆ SSCApproximationStrategy()

SSCApproximationStrategy::SSCApproximationStrategy ( SimulationOptions  sim_params,
double  kappa,
bool  polarized 
)

Definition at line 23 of file SSCApproximationStrategy.cpp.

25  : IInterferenceFunctionStrategy(sim_params, polarized), m_helper(kappa)
26 {
27 }
IInterferenceFunctionStrategy(const SimulationOptions &sim_params, bool polarized)

Member Function Documentation

◆ strategy_specific_post_init()

void SSCApproximationStrategy::strategy_specific_post_init ( )
overrideprivatevirtual

Reimplemented from IInterferenceFunctionStrategy.

Definition at line 29 of file SSCApproximationStrategy.cpp.

30 {
32 }
std::vector< FormFactorCoherentSum > m_formfactor_wrappers
void init(const std::vector< FormFactorCoherentSum > &ff_wrappers)
Definition: SSCAHelper.cpp:22

References SSCAHelper::init(), IInterferenceFunctionStrategy::m_formfactor_wrappers, and m_helper.

Here is the call graph for this function:

◆ scalarCalculation()

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

Returns the total 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 SSCApproximationStrategy.cpp.

38 {
39  double qp = sim_element.getMeanQ().magxy();
40  double diffuse_intensity = 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  double fraction = m_formfactor_wrappers[i].relativeAbundance();
45  diffuse_intensity += fraction * std::norm(ff);
46  }
47  complex_t mean_ff_norm =
51  double iff = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real();
52  double dw_factor = mP_iff->DWfactor(sim_element.getMeanQ());
53  return diffuse_intensity + dw_factor * iff;
54 }
std::complex< double > complex_t
Definition: Complex.h:20
double magxy() const
Returns distance from z axis.
std::unique_ptr< IInterferenceFunction > mP_iff
complex_t getMeanFormfactorNorm(double qp, const std::vector< complex_t > &precomputed_ff, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
Definition: SSCAHelper.cpp:57
complex_t getCharacteristicDistribution(double qp, const IInterferenceFunction *p_iff) const
Definition: SSCAHelper.cpp:41
complex_t getCharacteristicSizeCoupling(double qp, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
Definition: SSCAHelper.cpp:29
kvector_t getMeanQ() const
std::vector< complex_t > PrecomputeScalarFormFactors(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

References SSCAHelper::getCharacteristicDistribution(), SSCAHelper::getCharacteristicSizeCoupling(), SSCAHelper::getMeanFormfactorNorm(), SimulationElement::getMeanQ(), IInterferenceFunctionStrategy::m_formfactor_wrappers, m_helper, BasicVector3D< T >::magxy(), IInterferenceFunctionStrategy::mP_iff, and InterferenceFunctionUtils::PrecomputeScalarFormFactors().

Here is the call graph for this function:

◆ polarizedCalculation()

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

This is the polarized version.

Implements IInterferenceFunctionStrategy.

Definition at line 57 of file SSCApproximationStrategy.cpp.

58 {
59  double qp = sim_element.getMeanQ().magxy();
60  Eigen::Matrix2cd diffuse_matrix = Eigen::Matrix2cd::Zero();
61  auto precomputed_ff = PrecomputePolarizedFormFactors(sim_element, m_formfactor_wrappers);
62  const auto& polarization_handler = sim_element.polarizationHandler();
63  for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
64  Eigen::Matrix2cd ff = precomputed_ff[i];
65  double fraction = m_formfactor_wrappers[i].relativeAbundance();
66  diffuse_matrix += fraction * (ff * polarization_handler.getPolarization() * ff.adjoint());
67  }
68  Eigen::Matrix2cd mff_orig, mff_conj; // original and conjugated mean formfactor
69  m_helper.getMeanFormfactors(qp, mff_orig, mff_conj, precomputed_ff, m_formfactor_wrappers);
72  Eigen::Matrix2cd interference_matrix = (2.0 * omega / (1.0 - p2kappa * omega))
73  * polarization_handler.getAnalyzerOperator() * mff_orig
74  * polarization_handler.getPolarization() * mff_conj;
75  Eigen::Matrix2cd diffuse_matrix2 = polarization_handler.getAnalyzerOperator() * diffuse_matrix;
76  double interference_trace = std::abs(interference_matrix.trace());
77  double diffuse_trace = std::abs(diffuse_matrix2.trace());
78  double dw_factor = mP_iff->DWfactor(sim_element.getMeanQ());
79  return diffuse_trace + dw_factor * interference_trace;
80 }
void getMeanFormfactors(double qp, Eigen::Matrix2cd &ff_orig, Eigen::Matrix2cd &ff_conj, const InterferenceFunctionUtils::matrixFFVector_t &precomputed_ff, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
Definition: SSCAHelper.cpp:71
const PolarizationHandler & polarizationHandler() const
Returns assigned PolarizationHandler.
matrixFFVector_t PrecomputePolarizedFormFactors(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

References SSCAHelper::getCharacteristicDistribution(), SSCAHelper::getCharacteristicSizeCoupling(), SSCAHelper::getMeanFormfactors(), SimulationElement::getMeanQ(), IInterferenceFunctionStrategy::m_formfactor_wrappers, m_helper, BasicVector3D< T >::magxy(), 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:

Member Data Documentation

◆ m_helper

SSCAHelper SSCApproximationStrategy::m_helper
private

◆ 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: