OscProb
PMNS_SNSI.cxx
Go to the documentation of this file.
1
2//
3// Implementation of oscillations of neutrinos with scalar NSI
4// three-neutrino framework.
5//
6// jcoelho@apc.in2p3.fr and urahaman@km3net.de
8
9#include "PMNS_SNSI.h"
10
11using namespace OscProb;
12
13//.............................................................................
19PMNS_SNSI::PMNS_SNSI() : PMNS_NSI() { SetLowestMass(0); }
20
21//.............................................................................
26
27//.............................................................................
34{
35 // Check if value is actually changing
36 fBuiltHms *= (fM == m);
37
38 fM = m;
39}
40
41//.............................................................................
47double PMNS_SNSI::GetLowestMass() { return fM; }
48
49//.............................................................................
56{
57 // Check if anything changed
58 if (fBuiltHms) return;
59
60 // Tag to recompute eigensystem
61 fGotES = false;
62
63 // Start with m1 = fM
64 double m1 = fM;
65 // Make sure all masses are larger than fM
66 for (int i = 1; i < fNumNus; i++) {
67 if (fDm[i] + m1 * m1 < fM * fM) m1 = sqrt(fabs(fM * fM - fDm[i]));
68 }
69
70 // Build M - m1
71 fHms[0][0] = 0;
72 for (int j = 1; j < fNumNus; j++) {
73 // Set mass difference m_j - m_1
74 fHms[j][j] = sqrt(fabs(fDm[j] + m1 * m1)) - m1;
75 // Reset off-diagonal elements
76 for (int i = 0; i < j; i++) { fHms[i][j] = 0; }
77 // Rotate j neutrinos
78 for (int i = 0; i < j; i++) { RotateH(i, j, fHms); }
79 }
80
81 // Add back m1
82 for (int i = 0; i < fNumNus; i++) { fHms[i][i] += m1; }
83
84 // Tag as built
85 fBuiltHms = true;
86}
87
88//.............................................................................
94void HermitianSquare(complexD (&A)[3][3])
95{
96 complexD tmp[3][3];
97 for (int i = 0; i < 3; i++) {
98 for (int j = i; j < 3; j++) {
99 tmp[i][j] = A[i][j];
100 if (i < j) tmp[j][i] = conj(A[i][j]);
101 A[i][j] = 0;
102 }
103 }
104
105 for (int i = 0; i < 3; i++) {
106 for (int j = i; j < 3; j++) {
107 for (int k = 0; k < 3; k++) { A[i][j] += tmp[i][k] * tmp[k][j]; }
108 }
109 }
110}
111
112//.............................................................................
121{
122 double sqrtlv = sqrt(2 * kGeV2eV * fEnergy); // sqrt(2*E) in eV^1/2
123
124 // Effective density of fermions in eV * MeV^2
125 double nsiCoup = 1e6 * kK2 * fPath.density * GetZoACoup();
126
127 // Add the dM matrix
128 for (int i = 0; i < fNumNus; i++) {
129 for (int j = i; j < fNumNus; j++) {
130 fHam[i][j] = (fHms[i][j] + nsiCoup * fEps[i][j]) / sqrtlv;
131 if (fIsNuBar) fHam[i][j] = conj(fHam[i][j]);
132 }
133 }
134
135 // Square fHam
137
138 // Add matter potential in eV
139 double kr2GNe = kK2 * M_SQRT2 * kGf * fPath.density * fPath.zoa;
140
141 if (!fIsNuBar)
142 fHam[0][0] += kr2GNe;
143 else
144 fHam[0][0] -= kr2GNe;
145}
146
void HermitianSquare(complexD(&A)[3][3])
Definition: PMNS_SNSI.cxx:94
bool fIsNuBar
Anti-neutrino flag.
Definition: PMNS_Base.h:293
int fNumNus
Number of neutrino flavours.
Definition: PMNS_Base.h:277
double fEnergy
Neutrino energy.
Definition: PMNS_Base.h:292
virtual void RotateH(int i, int j, matrixC &Ham)
Rotate the Hamiltonian by theta_ij and delta_ij.
Definition: PMNS_Base.cxx:822
static const double kK2
mol/GeV^2/cm^3 to eV
Definition: PMNS_Base.h:216
matrixC fHms
matrix H*2E in eV^2
Definition: PMNS_Base.h:284
bool fGotES
Tag to avoid recalculating eigensystem.
Definition: PMNS_Base.h:299
static const double kGf
G_F in units of GeV^-2.
Definition: PMNS_Base.h:220
NuPath fPath
Current neutrino path.
Definition: PMNS_Base.h:296
bool fBuiltHms
Tag to avoid rebuilding Hms.
Definition: PMNS_Base.h:298
vectorD fDm
m^2_i - m^2_1 in vacuum
Definition: PMNS_Base.h:279
static const double kGeV2eV
GeV to eV.
Definition: PMNS_Base.h:217
complexD fHam[3][3]
The full hamiltonian.
Definition: PMNS_Fast.h:62
Implementation of oscillations of neutrinos in matter in a three-neutrino framework with NSI.
Definition: PMNS_NSI.h:28
virtual double GetZoACoup()
Get effective Z/A coupling.
Definition: PMNS_NSI.cxx:341
complexD fEps[3][3]
Stores each NSI parameter.
Definition: PMNS_NSI.h:76
virtual ~PMNS_SNSI()
Destructor.
Definition: PMNS_SNSI.cxx:25
virtual void BuildHms()
Definition: PMNS_SNSI.cxx:55
double fM
Lightest neutrino mass.
Definition: PMNS_SNSI.h:41
virtual void UpdateHam()
Build the full Hamiltonian.
Definition: PMNS_SNSI.cxx:120
virtual void SetLowestMass(double m)
Set lightest neutrino mass.
Definition: PMNS_SNSI.cxx:33
virtual double GetLowestMass()
Get lightest neutrino mass.
Definition: PMNS_SNSI.cxx:47
Some useful general definitions.
Definition: Absorption.h:6
std::complex< double > complexD
Definition: Definitions.h:21
double density
The density of the path segment in g/cm^3.
Definition: NuPath.h:79
double zoa
The effective Z/A value of the path segment.
Definition: NuPath.h:80