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

Public Member Functions

 IInterferenceFunctionStrategy (const SimulationOptions &sim_params, bool polarized)
 
virtual ~IInterferenceFunctionStrategy ()
 
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 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 ()
 
virtual double scalarCalculation (const SimulationElement &sim_element) const =0
 
virtual double polarizedCalculation (const SimulationElement &sim_element) const =0
 

Private Attributes

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

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 41 of file IInterferenceFunctionStrategy.h.

Constructor & Destructor Documentation

◆ IInterferenceFunctionStrategy()

IInterferenceFunctionStrategy::IInterferenceFunctionStrategy ( const SimulationOptions sim_params,
bool  polarized 
)

Definition at line 22 of file IInterferenceFunctionStrategy.cpp.

24  : mP_iff(nullptr), m_options(sim_params), m_polarized(polarized),
27 {
28 }
double evaluate_for_fixed_angles(double *fractions, size_t dim, void *params) const
std::unique_ptr< IntegratorMCMiser< IInterferenceFunctionStrategy > > mP_integrator
std::unique_ptr< IInterferenceFunction > mP_iff
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.

◆ ~IInterferenceFunctionStrategy()

IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy ( )
virtualdefault

Member Function Documentation

◆ init()

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

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 }
std::vector< FormFactorCoherentSum > m_formfactor_wrappers
virtual IInterferenceFunction * clone() const =0
Returns a clone of this ISample object.
Default interference function (i.e.

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

Here is the call graph for this function:

◆ evaluate()

double IInterferenceFunctionStrategy::evaluate ( const SimulationElement sim_element) const

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 evaluateSinglePoint(), SimulationElement::getSolidAngle(), SimulationOptions::isIntegrate(), m_options, and MCIntegratedEvaluate().

Here is the call graph for this function:

◆ evaluateSinglePoint()

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

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

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

Referenced by 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
private

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

Here is the call graph for this function:

◆ strategy_specific_post_init()

void IInterferenceFunctionStrategy::strategy_specific_post_init ( )
privatevirtual

Reimplemented in SSCApproximationStrategy.

Definition at line 86 of file IInterferenceFunctionStrategy.cpp.

86 {}

Referenced by init().

◆ 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().

◆ 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().

Member Data Documentation

◆ m_formfactor_wrappers

◆ mP_iff

◆ m_options

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 69 of file IInterferenceFunctionStrategy.h.

Referenced by evaluateSinglePoint().

◆ mP_integrator

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

Definition at line 72 of file IInterferenceFunctionStrategy.h.

Referenced by MCIntegratedEvaluate().


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