23 const std::vector<FormFactorCoherentSum>& weighted_formfactors,
37 double intensity = 0.0;
40 const complex_t ff = ffw.evaluate(sim_element);
41 if (std::isnan(ff.real()))
42 throw std::runtime_error(
43 "DecouplingApproximationStrategy::scalarCalculation() -> Error! Amplitude is NaN");
44 double fraction = ffw.relativeAbundance();
45 amplitude += fraction * ff;
46 intensity += fraction * std::norm(ff);
48 const double amplitude_norm = std::norm(amplitude);
49 const double coherence_factor =
m_iff->evaluate(sim_element.
meanQ());
50 return intensity + amplitude_norm * (coherence_factor - 1.0);
57 Eigen::Matrix2cd mean_intensity = Eigen::Matrix2cd::Zero();
58 Eigen::Matrix2cd mean_amplitude = Eigen::Matrix2cd::Zero();
62 const Eigen::Matrix2cd ff = ffw.evaluatePol(sim_element);
64 throw std::runtime_error(
"DecouplingApproximationStrategy::polarizedCalculation() -> "
65 "Error! Form factor contains NaN or infinite");
66 const double fraction = ffw.relativeAbundance();
67 mean_amplitude += fraction * ff;
68 mean_intensity += fraction * (ff * polarization_handler.getPolarization() * ff.adjoint());
70 const Eigen::Matrix2cd amplitude_matrix =
71 polarization_handler.getAnalyzerOperator() * mean_amplitude
72 * polarization_handler.getPolarization() * mean_amplitude.adjoint();
73 const Eigen::Matrix2cd intensity_matrix =
74 polarization_handler.getAnalyzerOperator() * mean_intensity;
75 const double amplitude_trace = std::abs(amplitude_matrix.trace());
76 const double intensity_trace = std::abs(intensity_matrix.trace());
77 const double coherence_factor =
m_iff->evaluate(sim_element.
meanQ());
78 return intensity_trace + amplitude_trace * (coherence_factor - 1.0);
std::complex< double > complex_t
Defines class DecouplingApproximationStrategy.
Defines functions in namespace Math.
Defines class InterferenceFunctionNone.
Defines class RealParameter.
Defines class SimulationElement.
double scalarCalculation(const SimulationElement &sim_element) const override
Returns the total incoherent and coherent scattering intensity for given kf and for one particle layo...
DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *iff, SimulationOptions sim_params, bool polarized)
double polarizedCalculation(const SimulationElement &sim_element) const override
This is the polarized version.
std::unique_ptr< IInterferenceFunction > m_iff
Base class of all interference function strategy classes.
std::vector< FormFactorCoherentSum > m_weighted_formfactors
Abstract base class of interference functions.
Default interference function (i.e.
Data stucture containing both input and output of a single detector cell.
const PolarizationHandler & polarizationHandler() const
Returns assigned PolarizationHandler.
Collect the different options for simulation.