22 double meanRadius(
const std::vector<std::unique_ptr<const CoherentFFSum>>& weighted_formfactors)
25 for (
const auto& ffw : weighted_formfactors)
26 result += ffw->relativeAbundance() * ffw->radialExtension();
34 const std::vector<std::unique_ptr<const CoherentFFSum>>& weighted_formfactors,
40 , m_mean_radius(meanRadius(weighted_formfactors))
49 const double qp = ele.
meanQ().magxy();
50 double diffuse_intensity = 0.0;
51 complex_t ff_orig = 0., ff_conj = 0.;
53 complex_t
ff = ffw->summedFF(ele);
54 double fraction = ffw->relativeAbundance();
55 diffuse_intensity += fraction * std::norm(
ff);
56 double radial_extension = ffw->radialExtension();
59 ff_orig += prefac *
ff;
60 ff_conj += prefac * std::conj(
ff);
62 const complex_t mean_ff_norm = ff_orig * ff_conj;
64 const complex_t omega =
m_iff->FTPDF(qp);
65 const double iff = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real();
66 const double dw_factor =
m_iff->DWfactor(ele.
meanQ());
67 return diffuse_intensity + dw_factor * iff;
73 const double qp = ele.
meanQ().magxy();
75 const auto& polarization_handler = ele.
polMatrices();
80 const double fraction = ffw->relativeAbundance();
81 diffuse_matrix += fraction * (
ff * polarization_handler.polarizerMatrix() *
ff.adjoint());
82 const double radial_extension = ffw->radialExtension();
83 const complex_t prefac =
85 ff_orig += prefac *
ff;
86 ff_conj += prefac *
ff.adjoint();
89 const complex_t omega =
m_iff->FTPDF(qp);
90 const SpinMatrix interference_matrix = (2.0 * omega / (1.0 - p2kappa * omega))
91 * polarization_handler.analyzerMatrix() * ff_orig
92 * polarization_handler.polarizerMatrix() * ff_conj;
93 const SpinMatrix diffuse_matrix2 = polarization_handler.analyzerMatrix() * diffuse_matrix;
94 const double interference_trace = std::abs(interference_matrix.
trace());
95 const double diffuse_trace = std::abs(diffuse_matrix2.
trace());
96 const double dw_factor =
m_iff->DWfactor(ele.
meanQ());
97 return diffuse_trace + dw_factor * interference_trace;
101 double qp,
const std::vector<std::unique_ptr<const CoherentFFSum>>& ff_wrappers)
const
103 complex_t result = 0;
104 for (
const auto& ffw : ff_wrappers)
105 result += ffw->relativeAbundance()
Defines class CoherentFFSum.
Defines class DiffuseElement.
Defines class InterferenceRadialParaCrystal.
Defines class SSCAStrategy.
Data stucture containing both input and output of a single detector cell.
const PolMatrices & polMatrices() const
Returns polarizer and analyzer matrices.
Abstract base class of DecouplingApproximationStrategy, SSCAStrategy. Provides function 'evaluate' th...
const std::vector< std::unique_ptr< const CoherentFFSum > > & m_weighted_formfactors
Interference function of radial paracrystal.
complex_t getCharacteristicSizeCoupling(double qp, const std::vector< std::unique_ptr< const CoherentFFSum >> &ff_wrappers) const
double polarizedCalculation(const DiffuseElement &ele) const override
This is the polarized version.
SSCAStrategy(const std::vector< std::unique_ptr< const CoherentFFSum >> &weighted_formfactors, const InterferenceRadialParaCrystal *iff, SimulationOptions sim_params, bool polarized, double kappa)
complex_t calculatePositionOffsetPhase(double qp, double radial_extension) const
const std::unique_ptr< InterferenceRadialParaCrystal > m_iff
const double m_mean_radius
double scalarCalculation(const DiffuseElement &ele) const override
Returns the total scattering intensity for given kf and for one particle layout (implied by the given...
Collect the different options for simulation.SimulationOptions.