OscProb
PMNS_NSI.cxx
Go to the documentation of this file.
1
2//
3// Implementation of oscillations of neutrinos in matter in a
4// three-neutrino framework with NSI.
5//
6// This class inherits from the PMNS_Fast class
7//
8// jcoelho\@apc.in2p3.fr
10
11#include <iostream>
12
13#include "PMNS_NSI.h"
14
15using namespace OscProb;
16
17using namespace std;
18
19//.............................................................................
25PMNS_NSI::PMNS_NSI() : PMNS_Fast(), fEps()
26{
27 SetStdPath();
28 SetNSI(0., 0., 0., 0., 0., 0., 0., 0., 0.);
29 SetFermCoup(1, 0, 0);
30}
31
32//.............................................................................
37
38//.............................................................................
55void PMNS_NSI::SetNSI(double eps_ee, double eps_emu, double eps_etau,
56 double eps_mumu, double eps_mutau, double eps_tautau,
57 double delta_emu, double delta_etau, double delta_mutau)
58{
59 SetEps(0, 0, eps_ee, 0);
60 SetEps(1, 1, eps_mumu, 0);
61 SetEps(2, 2, eps_tautau, 0);
62
63 SetEps(0, 1, eps_emu, delta_emu);
64 SetEps(0, 2, eps_etau, delta_etau);
65 SetEps(1, 2, eps_mutau, delta_mutau);
66}
67
68//.............................................................................
86void PMNS_NSI::SetEps(int flvi, int flvj, double val, double phase)
87{
88 if (flvi > flvj) {
89 cerr << "WARNING: First argument should be smaller or equal to second "
90 "argument"
91 << endl
92 << "Setting reverse order (Eps_" << flvj << flvi << "). " << endl;
93 int temp = flvi;
94 flvi = flvj;
95 flvj = temp;
96 }
97 if (flvi < 0 || flvi > 2 || flvj < flvi || flvj > 2) {
98 cerr << "WARNING: Eps_" << flvi << flvj << " not valid for " << fNumNus
99 << " neutrinos. Doing nothing." << endl;
100 return;
101 }
102
103 complexD h = val;
104
105 if (flvi != flvj) h *= complexD(cos(phase), sin(phase));
106
107 bool isSame = (fEps[flvi][flvj] == h);
108
109 if (!isSame) ClearCache();
110
111 fGotES *= isSame;
112
113 fEps[flvi][flvj] = h;
114}
115
116//.............................................................................
129complexD PMNS_NSI::GetEps(int flvi, int flvj)
130{
131 if (flvi > flvj) {
132 cerr << "WARNING: First argument should be smaller or equal to second "
133 "argument"
134 << endl
135 << "Setting reverse order (Eps_" << flvj << flvi << "). " << endl;
136 int temp = flvi;
137 flvi = flvj;
138 flvj = temp;
139 }
140 if (flvi < 0 || flvi > 2 || flvj < flvi || flvj > 2) {
141 cerr << "WARNING: Eps_" << flvi << flvj << " not valid for " << fNumNus
142 << " neutrinos. Returning 0." << endl;
143 return zero;
144 }
145
146 return fEps[flvi][flvj];
147}
148
149//.............................................................................
158void PMNS_NSI::SetEps_ee(double a) { SetEps(0, 0, a, 0); }
159
160//.............................................................................
169void PMNS_NSI::SetEps_mumu(double a) { SetEps(1, 1, a, 0); }
170
171//.............................................................................
180void PMNS_NSI::SetEps_tautau(double a) { SetEps(2, 2, a, 0); }
181
182//.............................................................................
192void PMNS_NSI::SetEps_emu(double a, double phi) { SetEps(0, 1, a, phi); }
193
194//.............................................................................
204void PMNS_NSI::SetEps_etau(double a, double phi) { SetEps(0, 2, a, phi); }
205
206//.............................................................................
216void PMNS_NSI::SetEps_mutau(double a, double phi) { SetEps(1, 2, a, phi); }
217
218//.............................................................................
227{
228 double lv = 2 * kGeV2eV * fEnergy; // 2*E in eV
229
230 double kr2GNe = kK2 * M_SQRT2 * kGf * fPath.density;
231 double kr2GNnsi = kr2GNe;
232
233 kr2GNe *= fPath.zoa; // Std matter potential in eV
234 kr2GNnsi *= GetZoACoup(); // NSI matter potential in eV
235
236 // Finish build Hamiltonian in matter with dimension of eV
237 for (int i = 0; i < fNumNus; i++) {
238 for (int j = i; j < fNumNus; j++) {
239 if (!fIsNuBar)
240 fHam[i][j] = fHms[i][j] / lv + kr2GNnsi * fEps[i][j];
241 else
242 fHam[i][j] = conj(fHms[i][j] / lv - kr2GNnsi * fEps[i][j]);
243 }
244 }
245
246 if (!fIsNuBar)
247 fHam[0][0] += kr2GNe;
248 else
249 fHam[0][0] -= kr2GNe;
250}
251
252//.............................................................................
261void PMNS_NSI::SetCoupByIndex(double c, int i)
262{
263 bool isSame = (fNSIcoup[i] == c);
264
265 if (!isSame) ClearCache();
266
267 fGotES *= isSame;
268
269 fNSIcoup[i] = c;
270}
271
272//.............................................................................
280void PMNS_NSI::SetElecCoup(double e) { SetCoupByIndex(e, 0); }
281
282//.............................................................................
290void PMNS_NSI::SetUpCoup(double u) { SetCoupByIndex(u, 1); }
291
292//.............................................................................
300void PMNS_NSI::SetDownCoup(double d) { SetCoupByIndex(d, 2); }
301
302//.............................................................................
312void PMNS_NSI::SetFermCoup(double e, double u, double d)
313{
314 SetElecCoup(e); // electron coupling
315 SetUpCoup(u); // u-quark coupling
316 SetDownCoup(d); // d-quark coupling
317}
318
319//.............................................................................
323double PMNS_NSI::GetElecCoup() { return fNSIcoup[0]; }
324
325//.............................................................................
329double PMNS_NSI::GetUpCoup() { return fNSIcoup[1]; }
330
331//.............................................................................
335double PMNS_NSI::GetDownCoup() { return fNSIcoup[2]; }
336
337//.............................................................................
342{
343 return fNSIcoup[0] * fPath.zoa // electrons: Z
344 + fNSIcoup[1] * (1 + fPath.zoa) // u-quarks: A + Z
345 + fNSIcoup[2] * (2 - fPath.zoa); // d-quarks: 2A - Z
346}
347
static const complexD zero
zero in complex
Definition: PMNS_Base.h:211
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
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
virtual void ClearCache()
Clear the cache.
Definition: PMNS_Base.cxx:111
static const double kGeV2eV
GeV to eV.
Definition: PMNS_Base.h:217
virtual void SetStdPath()
Set standard neutrino path.
Definition: PMNS_Base.cxx:205
Implementation of oscillations of neutrinos in matter in a three-neutrino framework.
Definition: PMNS_Fast.h:40
complexD fHam[3][3]
The full hamiltonian.
Definition: PMNS_Fast.h:62
virtual void SetEps_ee(double a)
Set eps_ee parameter.
Definition: PMNS_NSI.cxx:158
double fNSIcoup[3]
Relative NSI couplings.
Definition: PMNS_NSI.h:78
virtual void SetCoupByIndex(double c, int i)
Set a given fermion coupling.
Definition: PMNS_NSI.cxx:261
virtual void SetUpCoup(double u)
Set u-quark couling.
Definition: PMNS_NSI.cxx:290
virtual double GetZoACoup()
Get effective Z/A coupling.
Definition: PMNS_NSI.cxx:341
virtual double GetDownCoup()
Get d-quark couling.
Definition: PMNS_NSI.cxx:335
virtual void SetEps_tautau(double a)
Set eps_tautau parameter.
Definition: PMNS_NSI.cxx:180
virtual double GetUpCoup()
Get u-quark couling.
Definition: PMNS_NSI.cxx:329
virtual complexD GetEps(int flvi, int flvj)
Get any given NSI parameter.
Definition: PMNS_NSI.cxx:129
virtual void SetEps_etau(double a, double phi)
Set eps_etau parameter.
Definition: PMNS_NSI.cxx:204
virtual void SetFermCoup(double e, double u, double d)
Set all fermion couplings.
Definition: PMNS_NSI.cxx:312
virtual void SetEps(int flvi, int flvj, double val, double phase)
Set any given NSI parameter.
Definition: PMNS_NSI.cxx:86
virtual void SetElecCoup(double e)
Set electron coupling.
Definition: PMNS_NSI.cxx:280
virtual ~PMNS_NSI()
Destructor.
Definition: PMNS_NSI.cxx:36
virtual void UpdateHam()
Build the full Hamiltonian.
Definition: PMNS_NSI.cxx:226
complexD fEps[3][3]
Stores each NSI parameter.
Definition: PMNS_NSI.h:76
virtual void SetDownCoup(double d)
Set d-quark couling.
Definition: PMNS_NSI.cxx:300
virtual void SetEps_mumu(double a)
Set eps_mumu parameter.
Definition: PMNS_NSI.cxx:169
virtual void SetEps_mutau(double a, double phi)
Set eps_mutau parameter.
Definition: PMNS_NSI.cxx:216
virtual void SetEps_emu(double a, double phi)
Set eps_emu parameter.
Definition: PMNS_NSI.cxx:192
virtual double GetElecCoup()
Get electron coupling.
Definition: PMNS_NSI.cxx:323
void SetNSI(double eps_ee, double eps_emu, double eps_etau, double eps_mumu, double eps_mutau, double eps_tautau, double delta_emu=0, double delta_etau=0, double delta_mutau=0)
Set the NSI parameters all at once.
Definition: PMNS_NSI.cxx:55
Some useful general definitions.
Definition: Absorption.h:6
std::complex< double > complexD
Definition: Definitions.h:21
Definition: EigenPoint.h:44
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