32PMNS_SiderealLIV::PMNS_SiderealLIV()
33 :
PMNS_Fast(), fa{}, fc{}, fN{0.0, 0.0, 0.0}, fTime(0.0), fChi(0.0)
53 cerr <<
"WARNING: First argument should be smaller or equal to second "
56 <<
"Setting reverse order (" << name <<
"_" << flvj << flvi <<
"). "
58 std::swap(flvi, flvj);
60 if (flvi < 0 || flvi > 2 || flvj < flvi || flvj > 2) {
61 cerr <<
"WARNING: " << name <<
"_" << flvi << flvj
62 <<
" not valid for 3 neutrinos. Doing nothing." << endl;
72 const char* paramName)
74 if (coord < 0 || coord > 2) {
75 cerr <<
"WARNING: " << coordName <<
" = " << coord
76 <<
" out of range [0,2] for " << paramName <<
". Doing nothing."
102 fa[flvi][flvj][coord] = val;
127 fc[flvi][flvj][coord1][coord2] = val;
151 return fa[flvi][flvj][coord];
177 return fc[flvi][flvj][coord1][coord2];
189 double chi =
fChi * M_PI / 180.0;
190 double zen = zenith * M_PI / 180.0;
191 double azi = azimuth * M_PI / 180.0;
192 double N0 = cos(chi) * sin(zen) * cos(azi) + sin(chi) * cos(zen);
193 double N1 = sin(zen) * sin(azi);
194 double N2 = -sin(chi) * sin(zen) * cos(azi) + cos(chi) * cos(zen);
235 double latitude = deg + min / 60.0 + sec / 3600.0;
236 fChi = 90.0 - latitude;
256 for (
int i = 0; i <
fNumNus; i++) {
263 fHam[0][0] += kr2GNe;
265 fHam[0][0] -= kr2GNe;
267 for (
int i = 0; i <
fNumNus; i++) {
268 for (
int j = i; j <
fNumNus; j++) {
271 double C0 = -sign *
fa[i][j][2] *
fN[2];
273 double As0 = sign * (
fa[i][j][0] *
fN[1] -
fa[i][j][1] *
fN[0]);
274 double Ac0 = -sign * (
fa[i][j][0] *
fN[0] +
fa[i][j][1] *
fN[1]);
276 double As1 = 2 *
fN[1] *
fN[2] *
fc[i][j][0][2] -
277 2 *
fN[0] *
fN[2] *
fc[i][j][1][2];
278 double Ac1 = -2 *
fN[0] *
fN[2] *
fc[i][j][0][2] -
279 2 *
fN[1] *
fN[2] *
fc[i][j][1][2];
281 double Bs1 =
fN[0] *
fN[1] * (
fc[i][j][0][0] -
fc[i][j][1][1]) -
282 (
fN[0] *
fN[0] -
fN[1] *
fN[1]) *
fc[i][j][0][1];
285 double Bc1 = -0.5 * (
fN[0] *
fN[0] -
fN[1] *
fN[1]) *
286 (
fc[i][j][0][0] -
fc[i][j][1][1]) -
287 2.0 *
fN[0] *
fN[1] *
fc[i][j][0][1];
290 double As = As0 +
fEnergy * As1;
291 double Ac = Ac0 +
fEnergy * Ac1;
300 fHam[i][j] += liv_term;
306 for (
int i = 0; i <
fNumNus; i++) {
307 for (
int j = i + 1; j <
fNumNus; j++) {
fHam[i][j] = conj(
fHam[i][j]); }
bool fIsNuBar
Anti-neutrino flag.
int fNumNus
Number of neutrino flavours.
double fEnergy
Neutrino energy.
static const double kK2
mol/GeV^2/cm^3 to eV
matrixC fHms
matrix H*2E in eV^2
bool fGotES
Tag to avoid recalculating eigensystem.
static const double kGf
G_F in units of GeV^-2.
NuPath fPath
Current neutrino path.
static const double kGeV2eV
GeV to eV.
virtual void SetStdPath()
Set standard neutrino path.
Implementation of oscillations of neutrinos in matter in a three-neutrino framework.
complexD fHam[3][3]
The full hamiltonian.
virtual void SetIsOscProbAvg(bool isOscProbAvg)
Set flag for which averaging to use.
virtual void SetA(int flvi, int flvj, int coord, double val)
virtual double GetC(int flvi, int flvj, int coord1, int coord2)
virtual ~PMNS_SiderealLIV()
Destructor.
virtual void SetColatitude(double chi)
virtual double GetA(int flvi, int flvj, int coord)
static bool ValidateAndOrder(int &flvi, int &flvj, const char *name)
double fc[3][3][3][3]
cT LIVS parameters (mass dimension 4)
double fa[3][3][3]
aT LIVS parameters (mass dimension 3)
static bool ValidateCoord(int coord, const char *coordName, const char *paramName)
virtual double GetColatitude() const
Get the detector colatitude (chi), in degrees.
double fTime
Local sidereal time, in hours.
virtual void SetC(int flvi, int flvj, int coord1, int coord2, double val)
virtual void UpdateHam()
Build the full Hamiltonian.
static constexpr double kOmegaSidereal
Angular sidereal frequency, in rad/h.
double fN[3]
Neutrino directional factors (NX, NY, NZ)
virtual void SetNeutrinoDirection(double zenith, double azimuth)
virtual void SetTimeHours(double hours)
Some useful general definitions.
double density
The density of the path segment in g/cm^3.
double zoa
The effective Z/A value of the path segment.