49 return m_ff->theFF(wavevectors);
55 const C3& ki = wavevectors.
getKi();
56 const complex_t kiz = inFlux->getScalarKz();
57 const C3 k_i_T{ki.x(), ki.y(), -kiz};
58 const C3 k_i_R{ki.x(), ki.y(), +kiz};
61 const C3& kf = wavevectors.
getKf();
62 const complex_t kfz = outFlux->getScalarKz();
63 const C3 k_f_T{kf.x(), kf.y(), +kfz};
64 const C3 k_f_R{kf.x(), kf.y(), -kfz};
74 const complex_t T_in = inFlux->getScalarT();
75 const complex_t R_in = inFlux->getScalarR();
76 const complex_t T_out = outFlux->getScalarT();
77 const complex_t R_out = outFlux->getScalarR();
86 const complex_t term_S = T_in * T_out *
m_ff->theFF(q_TT);
87 const complex_t term_RS = R_in * T_out *
m_ff->theFF(q_RT);
88 const complex_t term_SR = T_in * R_out *
m_ff->theFF(q_TR);
89 const complex_t term_RSR = R_in * R_out *
m_ff->theFF(q_RR);
91 return term_S + term_RS + term_SR + term_RSR;
101 return {-o.
c, +o.
a, -o.
d, +o.
b};
109 const complex_t kix = wavevectors.
getKi().x();
110 const complex_t kiy = wavevectors.
getKi().y();
111 const Spinor& kiz = inFlux->getKz();
112 const C3 ki_1R{kix, kiy, +kiz.
u};
113 const C3 ki_1T{kix, kiy, -kiz.
u};
114 const C3 ki_2R{kix, kiy, +kiz.
v};
115 const C3 ki_2T{kix, kiy, -kiz.
v};
117 const complex_t kfx = wavevectors.
getKf().x();
118 const complex_t kfy = wavevectors.
getKf().y();
119 const Spinor& kfz = outFlux->getKz();
120 const C3 kf_1R{kfx, kfy, -kfz.
u};
121 const C3 kf_1T{kfx, kfy, +kfz.
u};
122 const C3 kf_2R{kfx, kfy, -kfz.
v};
123 const C3 kf_2T{kfx, kfy, +kfz.
v};
146 ff_BA =
m_ff->thePolFF({ki_1T, kf_1T, wavelength});
148 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->T1plus()),
149 -
DotProduct(outFlux->T1min(), ff_BA * inFlux->T1min()),
150 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->T1min()));
152 ff_BA =
m_ff->thePolFF({ki_1R, kf_1T, wavelength});
154 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->R1plus()),
155 -
DotProduct(outFlux->T1min(), ff_BA * inFlux->R1min()),
156 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->R1min()));
158 ff_BA =
m_ff->thePolFF({ki_1T, kf_1R, wavelength});
160 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->T1plus()),
161 -
DotProduct(outFlux->R1min(), ff_BA * inFlux->T1min()),
162 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->T1min()));
164 ff_BA =
m_ff->thePolFF({ki_1R, kf_1R, wavelength});
166 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->R1plus()),
167 -
DotProduct(outFlux->R1min(), ff_BA * inFlux->R1min()),
168 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->R1min()));
171 ff_BA =
m_ff->thePolFF({ki_1T, kf_2T, wavelength});
173 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->T1plus()),
174 -
DotProduct(outFlux->T2min(), ff_BA * inFlux->T1min()),
175 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->T1min()));
177 ff_BA =
m_ff->thePolFF({ki_1R, kf_2T, wavelength});
179 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->R1plus()),
180 -
DotProduct(outFlux->T2min(), ff_BA * inFlux->R1min()),
181 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->R1min()));
183 ff_BA =
m_ff->thePolFF({ki_1T, kf_2R, wavelength});
185 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->T1plus()),
186 -
DotProduct(outFlux->R2min(), ff_BA * inFlux->T1min()),
187 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->T1min()));
189 ff_BA =
m_ff->thePolFF({ki_1R, kf_2R, wavelength});
191 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->R1plus()),
192 -
DotProduct(outFlux->R2min(), ff_BA * inFlux->R1min()),
193 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->R1min()));
196 ff_BA =
m_ff->thePolFF({ki_2T, kf_1T, wavelength});
198 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->T2plus()),
199 -
DotProduct(outFlux->T1min(), ff_BA * inFlux->T2min()),
200 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->T2min()));
202 ff_BA =
m_ff->thePolFF({ki_2R, kf_1T, wavelength});
204 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->R2plus()),
205 -
DotProduct(outFlux->T1min(), ff_BA * inFlux->R2min()),
206 +
DotProduct(outFlux->T1plus(), ff_BA * inFlux->R2min()));
208 ff_BA =
m_ff->thePolFF({ki_2T, kf_1R, wavelength});
210 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->T2plus()),
211 -
DotProduct(outFlux->R1min(), ff_BA * inFlux->T2min()),
212 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->T2min()));
214 ff_BA =
m_ff->thePolFF({ki_2R, kf_1R, wavelength});
216 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->R2plus()),
217 -
DotProduct(outFlux->R1min(), ff_BA * inFlux->R2min()),
218 +
DotProduct(outFlux->R1plus(), ff_BA * inFlux->R2min()));
221 ff_BA =
m_ff->thePolFF({ki_2T, kf_2T, wavelength});
223 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->T2plus()),
224 -
DotProduct(outFlux->T2min(), ff_BA * inFlux->T2min()),
225 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->T2min()));
227 ff_BA =
m_ff->thePolFF({ki_2R, kf_2T, wavelength});
229 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->R2plus()),
230 -
DotProduct(outFlux->T2min(), ff_BA * inFlux->R2min()),
231 +
DotProduct(outFlux->T2plus(), ff_BA * inFlux->R2min()));
233 ff_BA =
m_ff->thePolFF({ki_2T, kf_2R, wavelength});
235 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->T2plus()),
236 -
DotProduct(outFlux->R2min(), ff_BA * inFlux->T2min()),
237 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->T2min()));
239 ff_BA =
m_ff->thePolFF({ki_2R, kf_2R, wavelength});
241 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->R2plus()),
242 -
DotProduct(outFlux->R2min(), ff_BA * inFlux->R2min()),
243 +
DotProduct(outFlux->R2plus(), ff_BA * inFlux->R2min()));
245 return M11_S + M11_RS + M11_SR + M11_RSR + M12_S + M12_RS + M12_SR + M12_RSR + M21_S + M21_RS
246 + M21_SR + M21_RSR + M22_S + M22_RS + M22_SR + M22_RSR;
Defines the macro ASSERT.
#define ASSERT(condition)
Defines class DiffuseElement.
Defines and implements interface IReParticle.
Defines class MatrixFlux.
Defines class ScalarFlux.
complex_t DotProduct(const Spinor &r, const Spinor &t)
Data stucture containing both input and output of a single detector cell.
const IFlux * fluxIn(size_t i_layer) const
const IFlux * fluxOut(size_t i_layer) const
WavevectorInfo wavevectorInfo() const
Abstract base class for reprocessed particles.
Specular reflection and transmission coefficients in a layer in case of magnetic interactions between...
Specular reflection and transmission coefficients in a layer in case of scalar interactions between t...
const std::optional< size_t > m_i_layer
SpinMatrix coherentPolFF(const DiffuseElement &ele) const
Returns the coherent sum of the four DWBA terms for polarized scattering.
SumDWBA(const IReParticle &ff, size_t i_layer)
const std::unique_ptr< const IReParticle > m_ff
complex_t coherentFF(const DiffuseElement &ele) const
Returns the coherent sum of the four DWBA terms for scalar scattering.
Holds all wavevector information relevant for calculating form factors.
double vacuumLambda() const