9 #include <boost/serialization/array_wrapper.hpp> 10 #pragma GCC diagnostic push 11 #pragma GCC diagnostic ignored "-Wmisleading-indentation" 12 #include <boost/numeric/ublas/vector.hpp> 13 #include <boost/numeric/ublas/matrix.hpp> 14 #pragma GCC diagnostic pop 25 namespace ublas = boost::numeric::ublas;
26 typedef std::complex<long double>
val_t;
27 typedef ublas::bounded_array<val_t, kNumFlavours>
alloc_t;
29 typedef ublas::bounded_matrix<val_t, kNumFlavours, kNumFlavours>
ComplexMat;
31 typedef ublas::unit_vector<val_t, alloc_t>
UnitVec;
32 const ublas::zero_matrix<val_t, alloc_t>
kZeroMat(kNumFlavours, kNumFlavours);
33 const ublas::identity_matrix<val_t, alloc_t>
kIdentity(kNumFlavours);
51 std::complex<long double>
phase;
112 d->
phase = std::polar((
long double)1, -(
long double)delta);
152 const std::vector<long double>& mSq,
167 H(
a,
b) += U(
a,
i)*mSq[
i]/(2*
E)*std::conj(U(
b,
i));
185 const long double GF = 1.368e-4;
189 H(0, 0) =
sqrt(2)*GF*Ne;
192 H(1, 2) = H(2, 1) = emutau*
sqrt(2)*GF*Ne;
208 ComplexMat
m = m2/65536;
222 const std::complex<long double>
i = std::complex<long double>(0, 1);
231 m(
i,
j) = std::conj(
m(
i,
j));
236 const int af =
abs(from);
237 const int at =
abs(to);
238 assert(af == 12 || af == 14 || af == 16);
239 assert(at == 12 || at == 14 || at == 16);
242 if(af*at < 0)
return 0;
248 ComplexVec initState =
UnitVec(kNumFlavours, 1);
249 if(af == 12) initState =
UnitVec(kNumFlavours, 0);
250 if(af == 16) initState =
UnitVec(kNumFlavours, 2);
252 std::vector<long double> mSq;
262 if(from < 0) H += -1*Hm;
else H += Hm;
266 if(at == 12)
return std::norm(finalState(0));
267 if(at == 14)
return std::norm(finalState(1));
268 if(at == 16)
return std::norm(finalState(2));
270 assert(0 &&
"Not reached");
ComplexMat MatrixExp(const ComplexMat &m2)
virtual ~OscCalcGeneral()
More generic (but probably slower) oscillation calculations.
virtual double P(int from, int to, double E) override
E in GeV; flavors as PDG codes (so, neg==>antinu)
ComplexMat MatterHamiltonianComponent(long double Ne, long double emutau)
ComplexMat VacuumHamiltonian(const ComplexMat &U, const std::vector< long double > &mSq, long double E)
void conjugate_elements(ComplexMat &m)
ublas::unit_vector< val_t, alloc_t > UnitVec
std::complex< long double > phase
TMD5 * GetParamsHashDefault(const std::string &txt) const
This is only a safe implementation if your calculator only depends on these eight parameters...
virtual void SetTh13(const double &th13) override
virtual void SetTh12(const double &th12) override
static constexpr double L
ublas::bounded_matrix< val_t, kNumFlavours, kNumFlavours > ComplexMat
virtual void SetTh23(const double &th23) override
void SetNSIEpsilonMuTau(double emutau)
std::complex< long double > val_t
T prod(const std::vector< T > &v)
virtual TMD5 * GetParamsHash() const override
Use to check two calculators are in the same state.
Oscillation probability calculators.
double GetNSIEpsilonMuTau() const
const ublas::zero_matrix< val_t, alloc_t > kZeroMat(kNumFlavours, kNumFlavours)
const unsigned int kNumFlavours
static constexpr Double_t m2
virtual void SetdCP(const double &dCP) override
assert(nhit_max >=nhit_nbins)
ublas::c_vector< val_t, kNumFlavours > ComplexVec
const ublas::identity_matrix< val_t, alloc_t > kIdentity(kNumFlavours)
ComplexVec EvolveState(ComplexVec A, const ComplexMat &H, long double L)
ublas::bounded_array< val_t, kNumFlavours > alloc_t
virtual IOscCalcAdjustable * Copy() const override
ComplexMat GetPMNS(OscCalcGeneral::Priv *d)