21 const std::vector<FormFactorCoherentSum>& weighted_formfactors,
30 m_mean_radius += ffw.relativeAbundance() * ffw.radialExtension();
39 double diffuse_intensity = 0.0;
43 double fraction = ffw.relativeAbundance();
44 diffuse_intensity += fraction * std::norm(ff);
45 double radial_extension = ffw.radialExtension();
48 ff_orig += prefac * ff;
49 ff_conj += prefac * std::conj(ff);
51 const complex_t mean_ff_norm = ff_orig * ff_conj;
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;
63 Eigen::Matrix2cd diffuse_matrix = Eigen::Matrix2cd::Zero();
65 Eigen::Matrix2cd ff_orig = Eigen::Matrix2cd::Zero();
66 Eigen::Matrix2cd ff_conj = Eigen::Matrix2cd::Zero();
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();
74 ff_orig += prefac * ff;
75 ff_conj += prefac * ff.adjoint();
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;
91 double qp,
const std::vector<FormFactorCoherentSum>& ff_wrappers)
const
94 for (
const auto& ffw : ff_wrappers)
101 double radial_extension)
const
std::complex< double > complex_t
complex_t exp_I(complex_t z)
Returns exp(I*z), where I is the imaginary unit.
Defines class InterferenceFunctionRadialParaCrystal.
Defines class SSCApproximationStrategy.
Defines class SimulationElement.
double magxy() const
Returns distance from z axis.
Base class of all interference function strategy classes.
std::vector< FormFactorCoherentSum > m_weighted_formfactors
Interference function of radial paracrystal.
double polarizedCalculation(const SimulationElement &sim_element) const override
This is the polarized version.
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...
complex_t getCharacteristicSizeCoupling(double qp, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
std::unique_ptr< InterferenceFunctionRadialParaCrystal > m_iff
complex_t calculatePositionOffsetPhase(double qp, double radial_extension) const
SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const InterferenceFunctionRadialParaCrystal *iff, SimulationOptions sim_params, bool polarized, double kappa)
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.