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

Strategy class to compute the total scattering from a particle layout in the size-spacing correlation approximation. More...

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

Public Member Functions

 SSCApproximationStrategy (const std::vector< FormFactorCoherentSum > &weighted_formfactors, const InterferenceFunctionRadialParaCrystal *iff, SimulationOptions sim_params, bool polarized, double kappa)
 
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

complex_t calculatePositionOffsetPhase (double qp, double radial_extension) const
 
double evaluate_for_fixed_angles (double *fractions, size_t dim, void *params) const
 
double evaluateSinglePoint (const SimulationElement &sim_element) const
 
complex_t getCharacteristicSizeCoupling (double qp, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
 
void init (const std::vector< FormFactorCoherentSum > &ff_wrappers)
 
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 scattering intensity for given kf and for one particle layout (implied by the given particle form factors). More...
 

Private Attributes

std::unique_ptr< InterferenceFunctionRadialParaCrystalm_iff
 
std::unique_ptr< IntegratorMCMiser< IInterferenceFunctionStrategy > > m_integrator
 
double m_kappa
 
double m_mean_radius
 
bool m_polarized
 

Detailed Description

Strategy class to compute the total scattering from a particle layout in the size-spacing correlation approximation.

Definition at line 33 of file SSCApproximationStrategy.h.

Constructor & Destructor Documentation

◆ SSCApproximationStrategy()

SSCApproximationStrategy::SSCApproximationStrategy ( const std::vector< FormFactorCoherentSum > &  weighted_formfactors,
const InterferenceFunctionRadialParaCrystal iff,
SimulationOptions  sim_params,
bool  polarized,
double  kappa 
)

Definition at line 20 of file SSCApproximationStrategy.cpp.

24  : IInterferenceFunctionStrategy(weighted_formfactors, sim_params, polarized)
25  , m_iff(iff->clone())
26  , m_kappa(kappa)
27 {
28  m_mean_radius = 0.0;
29  for (const auto& ffw : m_weighted_formfactors)
30  m_mean_radius += ffw.relativeAbundance() * ffw.radialExtension();
31 }
IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const SimulationOptions &sim_params, bool polarized)
std::vector< FormFactorCoherentSum > m_weighted_formfactors
InterferenceFunctionRadialParaCrystal * clone() const final
Returns a clone of this ISampleNode object.
std::unique_ptr< InterferenceFunctionRadialParaCrystal > m_iff
matrixFFVector_t polarized(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

References m_mean_radius, and IInterferenceFunctionStrategy::m_weighted_formfactors.

Member Function Documentation

◆ calculatePositionOffsetPhase()

complex_t SSCApproximationStrategy::calculatePositionOffsetPhase ( double  qp,
double  radial_extension 
) const
private

Definition at line 100 of file SSCApproximationStrategy.cpp.

102 {
103  return exp_I(m_kappa * qp * (radial_extension - m_mean_radius));
104 }
complex_t exp_I(complex_t z)
Returns exp(I*z), where I is the imaginary unit.
Definition: Complex.h:30

References exp_I(), m_kappa, and m_mean_radius.

Referenced by getCharacteristicSizeCoupling(), polarizedCalculation(), and scalarCalculation().

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

◆ getCharacteristicSizeCoupling()

complex_t SSCApproximationStrategy::getCharacteristicSizeCoupling ( double  qp,
const std::vector< FormFactorCoherentSum > &  ff_wrappers 
) const
private

Definition at line 90 of file SSCApproximationStrategy.cpp.

92 {
93  complex_t result = 0;
94  for (const auto& ffw : ff_wrappers)
95  result +=
96  ffw.relativeAbundance() * calculatePositionOffsetPhase(2.0 * qp, ffw.radialExtension());
97  return result;
98 }
std::complex< double > complex_t
Definition: Complex.h:20
complex_t calculatePositionOffsetPhase(double qp, double radial_extension) const

References calculatePositionOffsetPhase().

Referenced by polarizedCalculation(), and scalarCalculation().

Here is the call graph for this function:

◆ init()

void SSCApproximationStrategy::init ( const std::vector< FormFactorCoherentSum > &  ff_wrappers)
private

◆ 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 SSCApproximationStrategy::polarizedCalculation ( const SimulationElement sim_element) const
overrideprivatevirtual

This is the polarized version.

Implements IInterferenceFunctionStrategy.

Definition at line 60 of file SSCApproximationStrategy.cpp.

61 {
62  const double qp = sim_element.meanQ().magxy();
63  Eigen::Matrix2cd diffuse_matrix = Eigen::Matrix2cd::Zero();
64  const auto& polarization_handler = sim_element.polarizationHandler();
65  Eigen::Matrix2cd ff_orig = Eigen::Matrix2cd::Zero();
66  Eigen::Matrix2cd ff_conj = Eigen::Matrix2cd::Zero();
67  for (const auto& ffw : m_weighted_formfactors) {
68  const Eigen::Matrix2cd ff = ffw.evaluatePol(sim_element);
69  const double fraction = ffw.relativeAbundance();
70  diffuse_matrix += fraction * (ff * polarization_handler.getPolarization() * ff.adjoint());
71  const double radial_extension = ffw.radialExtension();
72  const complex_t prefac =
73  ffw.relativeAbundance() * calculatePositionOffsetPhase(qp, radial_extension);
74  ff_orig += prefac * ff;
75  ff_conj += prefac * ff.adjoint();
76  }
78  const complex_t omega = m_iff->FTPDF(qp);
79  const Eigen::Matrix2cd interference_matrix =
80  (2.0 * omega / (1.0 - p2kappa * omega)) * polarization_handler.getAnalyzerOperator()
81  * ff_orig * polarization_handler.getPolarization() * ff_conj;
82  const Eigen::Matrix2cd diffuse_matrix2 =
83  polarization_handler.getAnalyzerOperator() * diffuse_matrix;
84  const double interference_trace = std::abs(interference_matrix.trace());
85  const double diffuse_trace = std::abs(diffuse_matrix2.trace());
86  const double dw_factor = m_iff->DWfactor(sim_element.meanQ());
87  return diffuse_trace + dw_factor * interference_trace;
88 }
double magxy() const
Returns distance from z axis.
complex_t getCharacteristicSizeCoupling(double qp, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
kvector_t meanQ() const
const PolarizationHandler & polarizationHandler() const
Returns assigned PolarizationHandler.

References calculatePositionOffsetPhase(), getCharacteristicSizeCoupling(), m_iff, IInterferenceFunctionStrategy::m_weighted_formfactors, BasicVector3D< T >::magxy(), SimulationElement::meanQ(), and SimulationElement::polarizationHandler().

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 36 of file SSCApproximationStrategy.cpp.

37 {
38  const double qp = sim_element.meanQ().magxy();
39  double diffuse_intensity = 0.0;
40  complex_t ff_orig = 0., ff_conj = 0.; // original and conjugated mean formfactor
41  for (const auto& ffw : m_weighted_formfactors) {
42  complex_t ff = ffw.evaluate(sim_element);
43  double fraction = ffw.relativeAbundance();
44  diffuse_intensity += fraction * std::norm(ff);
45  double radial_extension = ffw.radialExtension();
46  complex_t prefac =
47  ffw.relativeAbundance() * calculatePositionOffsetPhase(qp, radial_extension);
48  ff_orig += prefac * ff;
49  ff_conj += prefac * std::conj(ff);
50  }
51  const complex_t mean_ff_norm = ff_orig * ff_conj;
53  const complex_t omega = m_iff->FTPDF(qp);
54  const double iff = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real();
55  const double dw_factor = m_iff->DWfactor(sim_element.meanQ());
56  return diffuse_intensity + dw_factor * iff;
57 }

References calculatePositionOffsetPhase(), getCharacteristicSizeCoupling(), m_iff, IInterferenceFunctionStrategy::m_weighted_formfactors, BasicVector3D< T >::magxy(), and SimulationElement::meanQ().

Here is the call graph for this function:

Member Data Documentation

◆ m_iff

std::unique_ptr<InterferenceFunctionRadialParaCrystal> SSCApproximationStrategy::m_iff
private

Definition at line 50 of file SSCApproximationStrategy.h.

Referenced by polarizedCalculation(), and scalarCalculation().

◆ m_integrator

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

◆ m_kappa

double SSCApproximationStrategy::m_kappa
private

Definition at line 51 of file SSCApproximationStrategy.h.

Referenced by calculatePositionOffsetPhase().

◆ m_mean_radius

double SSCApproximationStrategy::m_mean_radius
private

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