BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
IInterferenceFunctionStrategy Class Referenceabstract

Base class of all interference function strategy classes. More...

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

Public Member Functions

 IInterferenceFunctionStrategy (const std::vector< FormFactorCoherentSum > &weighted_formfactors, const SimulationOptions &sim_params, bool polarized)
 
virtual ~IInterferenceFunctionStrategy ()
 
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...
 
virtual double polarizedCalculation (const SimulationElement &sim_element) const =0
 Evaluates the intensity in the polarized case. More...
 
virtual double scalarCalculation (const SimulationElement &sim_element) const =0
 Evaluates the intensity in the scalar case. More...
 

Private Attributes

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

Detailed Description

Base class of all interference function strategy classes.

Provides an 'evaluate' function that computes the total scattering intensity from a decorated layer, taking into account a specific inter-particle interference function. This function uses the low-level functions scalarCalculation and polarizedCalculation that are to be overriden in the derived classes. Inheritance is used to support different approximation schemes (DecouplingApproximationStrategy, SSCApproximationStrategy).

Instantiation of child classes takes place in LayoutStrategyBuilder::createStrategy, which is called from ParticleLayoutComputation::eval.

Definition at line 46 of file IInterferenceFunctionStrategy.h.

Constructor & Destructor Documentation

◆ IInterferenceFunctionStrategy()

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

Definition at line 21 of file IInterferenceFunctionStrategy.cpp.

24  : m_weighted_formfactors(weighted_formfactors)
25  , m_options(sim_params)
27  , m_integrator(
29 {
31 }
#define ASSERT(condition)
Definition: Assert.h:31
std::unique_ptr< IntegratorMCMiser< IInterferenceFunctionStrategy > > m_integrator
double evaluate_for_fixed_angles(double *fractions, size_t dim, void *params) const
std::vector< FormFactorCoherentSum > m_weighted_formfactors
P_integrator_miser< T > make_integrator_miser(const T *object, miser_integrand< T > mem_function, size_t dim)
Template function to create an integrator object.
matrixFFVector_t polarized(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

References ASSERT, and m_weighted_formfactors.

◆ ~IInterferenceFunctionStrategy()

IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy ( )
virtualdefault

Member Function Documentation

◆ evaluate()

double IInterferenceFunctionStrategy::evaluate ( const SimulationElement sim_element) const

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 evaluateSinglePoint(), SimulationOptions::isIntegrate(), m_options, 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
private

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 evaluateSinglePoint(), SimulationElement::integrationFactor(), and SimulationElement::pointElement().

Here is the call graph for this function:

◆ evaluateSinglePoint()

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

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 m_polarized, polarizedCalculation(), and scalarCalculation().

Referenced by evaluate(), and evaluate_for_fixed_angles().

Here is the call graph for this function:

◆ MCIntegratedEvaluate()

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

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 }
size_t getMcPoints() const

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

Referenced by evaluate().

Here is the call graph for this function:

◆ polarizedCalculation()

virtual double IInterferenceFunctionStrategy::polarizedCalculation ( const SimulationElement sim_element) const
privatepure virtual

Evaluates the intensity in the polarized case.

Implemented in SSCApproximationStrategy, and DecouplingApproximationStrategy.

Referenced by evaluateSinglePoint().

◆ scalarCalculation()

virtual double IInterferenceFunctionStrategy::scalarCalculation ( const SimulationElement sim_element) const
privatepure virtual

Evaluates the intensity in the scalar case.

Implemented in SSCApproximationStrategy, and DecouplingApproximationStrategy.

Referenced by evaluateSinglePoint().

Member Data Documentation

◆ m_integrator

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

Definition at line 71 of file IInterferenceFunctionStrategy.h.

Referenced by MCIntegratedEvaluate().

◆ m_options

const SimulationOptions IInterferenceFunctionStrategy::m_options
protected

Definition at line 57 of file IInterferenceFunctionStrategy.h.

Referenced by evaluate(), and MCIntegratedEvaluate().

◆ m_polarized

bool IInterferenceFunctionStrategy::m_polarized
private

Definition at line 68 of file IInterferenceFunctionStrategy.h.

Referenced by evaluateSinglePoint().

◆ m_weighted_formfactors


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