OscProb
OscProb::PMNS_Maltoni Class Referenceabstract

Implementation of oscillations of neutrinos in matter in a framework with a Taylor expansion. More...

#include <PMNS_Maltoni.h>

Inheritance diagram for OscProb::PMNS_Maltoni:
OscProb::PMNS_Base OscProb::PMNS_Fast OscProb::PMNS_Sterile OscProb::PMNS_Avg OscProb::PMNS_DensityMatrix OscProb::PMNS_Iter OscProb::PMNS_LIV OscProb::PMNS_NSI OscProb::PMNS_NUNM OscProb::PMNS_Deco OscProb::PMNS_OQS OscProb::PMNS_SNSI

Public Member Functions

 PMNS_Maltoni (int numNus)
 Constructor. More...
 
virtual void SetPremModel (OscProb::PremModel &prem)
 
virtual double AvgProb (int flvi, int flvf, double E, double dE)
 
virtual double AvgProb (int flvi, int flvf, double E, double cosT, double dcosT)
 
virtual double AvgProb (int flvi, int flvf, double E, double dE, double cosT, double dcosT)
 
virtual double AvgProbLoE (int flvi, int flvf, double LoE, double dLoE)
 
virtual double AvgProbLoE (int flvi, int flvf, double LoE, double dLoE, double cosT, double dcosT)
 
virtual vectorD AvgProbVector (int flvi, double E, double dE)
 
virtual vectorD AvgProbVectorLoE (int flvi, double LoE, double dLoE)
 
virtual matrixD AvgProbMatrix (int nflvi, int nflvf, double E, double dE)
 
virtual matrixD AvgProbMatrixLoE (int nflvi, int nflvf, double LoE, double dLoE)
 
virtual double ExtrapolationProb (int flvi, int flvf, double E, double dE)
 Compute the probability of flvi going to flvf for an energy E+dE. More...
 
virtual double ExtrapolationProbLoE (int flvi, int flvf, double LoE, double dLoE)
 Compute the probability of flvi going to flvf at LoE+dLoE. More...
 
virtual double ExtrapolationProbCosT (int flvi, int flvf, double cosT, double dcosT)
 Compute the probability of flvi going to flvf for an angle cosT+dcosT. More...
 
virtual void SetIsOscProbAvg (bool isOscProbAvg)
 Set flag for which averaging to use. More...
 
virtual double AvgProb (vectorC nu_in, int flvf, double E, double dE=0)
 Compute the average probability over a bin of energy. More...
 
virtual double AvgProb (int flvi, int flvf, double E, double dE=0)
 Compute the average probability over a bin of energy. More...
 
virtual double AvgProbLoE (vectorC nu_in, int flvf, double LoE, double dLoE=0)
 Compute the average probability over a bin of L/E. More...
 
virtual double AvgProbLoE (int flvi, int flvf, double LoE, double dLoE=0)
 Compute the average probability over a bin of L/E. More...
 
virtual double Prob (vectorC nu_in, int flvf)
 Compute the probability of nu_in going to flvf. More...
 
virtual double Prob (vectorC nu_in, int flvf, double E)
 
virtual double Prob (vectorC nu_in, int flvf, double E, double L)
 
virtual double Prob (int flvi, int flvf)
 Compute the probability of flvi going to flvf. More...
 
virtual double Prob (int flvi, int flvf, double E)
 
virtual double Prob (int flvi, int flvf, double E, double L)
 
virtual vectorD ProbVector (vectorC nu_in)
 
virtual vectorD ProbVector (vectorC nu_in, double E)
 flavours for energy E More...
 
virtual vectorD ProbVector (vectorC nu_in, double E, double L)
 
virtual vectorD ProbVector (int flvi)
 
virtual vectorD ProbVector (int flvi, double E)
 
virtual vectorD ProbVector (int flvi, double E, double L)
 
virtual matrixD ProbMatrix (int nflvi, int nflvf)
 Compute the probability matrix. More...
 
virtual matrixD ProbMatrix (int nflvi, int nflvf, double E)
 Compute the probability matrix for energy E. More...
 
virtual matrixD ProbMatrix (int nflvi, int nflvf, double E, double L)
 
virtual vectorD AvgProbVector (vectorC nu_in, double E, double dE=0)
 
virtual vectorD AvgProbVectorLoE (vectorC nu_in, double LoE, double dLoE=0)
 Compute the average probability vector over a bin of L/E. More...
 
virtual vectorC GetMassEigenstate (int mi)
 Get a neutrino mass eigenstate. More...
 
virtual void SetAngle (int i, int j, double th)
 Set the mixing angle theta_ij. More...
 
virtual void SetDelta (int i, int j, double delta)
 Set the CP phase delta_ij. More...
 
virtual void SetDm (int j, double dm)
 Set the mass-splitting dm_j1 in eV^2. More...
 
virtual double GetAngle (int i, int j)
 Get the mixing angle theta_ij. More...
 
virtual double GetDelta (int i, int j)
 Get the CP phase delta_ij. More...
 
virtual double GetDm (int j)
 Get the mass-splitting dm_j1 in eV^2. More...
 
virtual double GetDmEff (int j)
 Get the effective mass-splitting dm_j1 in eV^2. More...
 
virtual void SetStdPars ()
 Set PDG 3-flavor parameters. More...
 
virtual void SetEnergy (double E)
 Set the neutrino energy in GeV. More...
 
virtual void SetIsNuBar (bool isNuBar)
 Set the anti-neutrino flag. More...
 
virtual double GetEnergy ()
 Get the neutrino energy in GeV. More...
 
virtual bool GetIsNuBar ()
 Get the anti-neutrino flag. More...
 
virtual void SetPath (NuPath p)
 Set a single path. More...
 
virtual void SetPath (double length, double density, double zoa=0.5, int layer=0)
 Set a single path. More...
 
virtual void SetPath (std::vector< NuPath > paths)
 Set a path sequence. More...
 
virtual void AddPath (NuPath p)
 Add a path to the sequence. More...
 
virtual void AddPath (double length, double density, double zoa=0.5, int layer=0)
 Add a path to the sequence. More...
 
virtual void ClearPath ()
 Clear the path vector. More...
 
virtual void SetLength (double L)
 Set a single path lentgh in km. More...
 
virtual void SetLength (vectorD L)
 Set multiple path lengths. More...
 
virtual void SetDensity (double rho)
 Set single path density in g/cm^3. More...
 
virtual void SetDensity (vectorD rho)
 Set multiple path densities. More...
 
virtual void SetZoA (double zoa)
 Set Z/A value for single path. More...
 
virtual void SetZoA (vectorD zoa)
 Set multiple path Z/A values. More...
 
virtual void SetLayers (std::vector< int > lay)
 Set multiple path layer indices. More...
 
virtual void SetStdPath ()
 Set standard neutrino path. More...
 
virtual std::vector< NuPathGetPath ()
 Get the neutrino path sequence. More...
 
virtual vectorD GetSamplePoints (double LoE, double dLoE)
 Compute the sample points for a bin of L/E with width dLoE. More...
 
virtual void SetUseCache (bool u=true)
 Set caching on/off. More...
 
virtual void ClearCache ()
 Clear the cache. More...
 
virtual void SetMaxCache (int mc=1e6)
 Set max cache size. More...
 
virtual void SetAvgProbPrec (double prec)
 Set the AvgProb precision. More...
 

Protected Member Functions

virtual vectorD GetSamplePointsAvgClass (double LoE, double dLoE)
 Compute the sample points fo a bin of L/E with width dLoE. More...
 
virtual vectorD GetSamplePointsAvgClass (double E, double cosT, double dcosT)
 Compute the sample points for a bin of cosT with width dcosT. More...
 
virtual matrixC GetSamplePointsAvgClass (double InvE, double dInvE, double cosT, double dcosT)
 
virtual void UpdateHam ()=0
 Build the full Hamiltonian. More...
 
virtual void InitializeTaylorsVectors ()
 Initialize all member vectors with zeros. More...
 
virtual void SetwidthBin (double dE, double dcosT)
 Set bin's widths for energy and angle. More...
 
virtual void SetCosT (double cosT)
 Set neutrino angle. More...
 
virtual void BuildKE (double L)
 build K matrix for the inverse of energy in mass basis More...
 
virtual void BuildKcosT ()
 build K matrix for angle in flavor basis More...
 
virtual double LnDerivative ()
 Compute the derivation of one layer's length. More...
 
virtual void PropagatePathTaylor (NuPath p)
 Propagate neutrino through a single path. More...
 
virtual void PropagateTaylor ()
 Propagate neutrino through full path. More...
 
virtual void rotateS ()
 Rotate the S matrix. More...
 
virtual void rotateK ()
 Rotate one K matrix. More...
 
virtual void MultiplicationRuleS ()
 Product between two S matrices. More...
 
virtual void MultiplicationRuleK (Eigen::MatrixXcd &K)
 Product between two K matrices. More...
 
void SolveK (Eigen::MatrixXcd &K, vectorD &lambda, matrixC &V)
 Solve the K matrix for eigenvectors and eigenvalues. More...
 
template<typename T >
void TemplateSolver (Eigen::MatrixXcd &K, vectorD &lambda, matrixC &V)
 Auxiliary function to choose eigensystem method. More...
 
virtual double AvgFormula (int flvi, int flvf, double dbin, vectorD flambda, matrixC fV)
 Formula for the average probability over a bin of width dbin. More...
 
virtual double AvgFormulaExtrapolation (int flvi, int flvf, double dE, vectorD flambda, matrixC fV)
 Formula for the extrapolation of probability. More...
 
virtual double AvgAlgo (int flvi, int flvf, double LoE, double dLoE, double L)
 
virtual double AvgAlgo (int flvi, int flvf, double InvE, double dInvE, double cosT, double dcosT)
 
virtual double AvgAlgoCosT (int flvi, int flvf, double E, double cosT, double dcosT)
 
virtual double AlgorithmDensityMatrix (int flvi, int flvf)
 Algorithm for the transformations on the density matrix. More...
 
virtual void RotateDensityM (bool to_basis, matrixC V)
 Apply rotation to the density matrix. More...
 
virtual void HadamardProduct (vectorD lambda, double dbin)
 Apply an Hadamard Product to the density matrix. More...
 
virtual void InitializeVectors ()
 
virtual bool TryCache ()
 Try to find a cached eigensystem. More...
 
virtual void FillCache ()
 Cache the current eigensystem. More...
 
virtual void SetCurPath (NuPath p)
 Set the path currently in use by the class. More...
 
virtual void SetAtt (double att, int idx)
 Set one of the path attributes. More...
 
virtual void SetAtt (vectorD att, int idx)
 Set all values of a path attribute. More...
 
virtual void RotateH (int i, int j, matrixC &Ham)
 Rotate the Hamiltonian by theta_ij and delta_ij. More...
 
virtual void RotateState (int i, int j)
 Rotate the neutrino state by theta_ij and delta_ij. More...
 
virtual void BuildHms ()
 Build the matrix of masses squared. More...
 
virtual void SolveHam ()=0
 
virtual void ResetToFlavour (int flv)
 Reset neutrino state to pure flavour flv. More...
 
virtual void SetPureState (vectorC nu_in)
 Set the initial state from a pure state. More...
 
virtual void PropagatePath (NuPath p)
 Propagate neutrino through a single path. More...
 
virtual void Propagate ()
 Propagate neutrino through full path. More...
 
virtual double P (int flv)
 Return the probability of final state in flavour flv. More...
 
virtual vectorD GetProbVector ()
 
virtual std::vector< int > GetSortedIndices (const vectorD x)
 Get indices that sort a vector. More...
 
virtual vectorD ConvertEtoLoE (double E, double dE)
 

Protected Attributes

double fcosT
 Cosine of zenith angle. More...
 
double fdInvE
 Bin's width for the inverse of energy. More...
 
double fdcosT
 Bin's width for zenith angle. More...
 
vectorD flambdaInvE
 Eigenvectors of K_invE. More...
 
vectorD flambdaCosT
 Eigenvectors of K_cosTheta. More...
 
matrixC fVInvE
 Eigenvalues of K_invE. More...
 
Eigen::MatrixXcd fKInvE
 K matrix for the inverse of energy for the entire path. More...
 
Eigen::MatrixXcd fKcosT
 K matrix for neutrino angle for the entire path. More...
 
matrixC fevolutionMatrixS
 
matrixC fVcosT
 Eigenvalues of K_cosTheta. More...
 
matrixC fSflavor
 S matrix for one layer. More...
 
matrixC fKmass
 K matrix in mass basis for one layer. More...
 
matrixC fKflavor
 K matrix in flavor basis for one layer. More...
 
matrixC fdensityMatrix
 The neutrino density matrix state. More...
 
int fLayer
 Layer index. More...
 
int fdl
 Length derivative. More...
 
double fDetRadius
 Detector radius. More...
 
double fminRsq
 Minimum square radius. More...
 
OscProb::PremModel fPrem
 Earth model used. More...
 
Eigen::MatrixXcd fHam
 The full Hamiltonian. More...
 
bool fIsOscProbAvg
 Flag to call OscProb default or Maltoni average. More...
 
int fNumNus
 Number of neutrino flavours. More...
 
vectorD fDm
 m^2_i - m^2_1 in vacuum More...
 
matrixD fTheta
 theta[i][j] mixing angle More...
 
matrixD fDelta
 delta[i][j] CP violating phase More...
 
vectorC fNuState
 The neutrino current state. More...
 
matrixC fHms
 matrix H*2E in eV^2 More...
 
vectorC fPhases
 Buffer for oscillation phases. More...
 
vectorC fBuffer
 Buffer for neutrino state tranformations. More...
 
vectorD fEval
 Eigenvalues of the Hamiltonian. More...
 
matrixC fEvec
 Eigenvectors of the Hamiltonian. More...
 
double fEnergy
 Neutrino energy. More...
 
bool fIsNuBar
 Anti-neutrino flag. More...
 
std::vector< NuPathfNuPaths
 Vector of neutrino paths. More...
 
NuPath fPath
 Current neutrino path. More...
 
bool fBuiltHms
 Tag to avoid rebuilding Hms. More...
 
bool fGotES
 Tag to avoid recalculating eigensystem. More...
 
bool fUseCache
 Flag for whether to use caching. More...
 
double fCachePrec
 Precision of cache matching. More...
 
int fMaxCache
 Maximum cache size. More...
 
double fAvgProbPrec
 AvgProb precision. More...
 
std::unordered_set< EigenPointfMixCache
 Caching set of eigensystems. More...
 
EigenPoint fProbe
 EigenpPoint to try. More...
 

Static Protected Attributes

static const complexD zero
 zero in complex More...
 
static const complexD one
 one in complex More...
 
static const double kKm2eV = 1.0 / 1.973269788e-10
 km to eV^-1 More...
 
static const double kK2
 mol/GeV^2/cm^3 to eV More...
 
static const double kGeV2eV = 1.0e+09
 GeV to eV. More...
 
static const double kNA = 6.022140857e23
 Avogadro constant. More...
 
static const double kGf = 1.1663787e-05
 G_F in units of GeV^-2. More...
 

Detailed Description

This class expands the PMNS_Base class including the use of a Taylor expansion to calculate the average on bins faster.

The model assumes a first order expansion over energy or direction for both dynamical variables at the same time or for only one.

This version is limited to classes where the vacuum Hamiltonian is inversely proportional to energy and the matter potential is independent of energy.

Reference: https://doi.org/10.48550/arXiv.2308.00037

See also
PMNS_Base
Author
mloup.nosp@m.@apc.nosp@m..in2p.nosp@m.3.fr rogan.nosp@m..cla.nosp@m.rk@uc.nosp@m.louv.nosp@m.ain.b.nosp@m.e

Definition at line 34 of file PMNS_Maltoni.h.

Constructor & Destructor Documentation

◆ PMNS_Maltoni()

PMNS_Maltoni::PMNS_Maltoni ( int  numNus)

Constructor.

See also
PMNS_Base::PMNS_Base

Definition at line 23 of file PMNS_Maltoni.cxx.

23 : PMNS_Base(numNus)
24{
25 fPrem.LoadModel("");
27 SetwidthBin(0, 0);
28 SetAvgProbPrec(1e-4);
29 SetIsOscProbAvg(false);
30}
PMNS_Base(int numNus=3)
Constructor.
Definition: PMNS_Base.cxx:47
virtual void SetAvgProbPrec(double prec)
Set the AvgProb precision.
Definition: PMNS_Base.cxx:1962
virtual void SetIsOscProbAvg(bool isOscProbAvg)
Set flag for which averaging to use.
virtual void InitializeTaylorsVectors()
Initialize all member vectors with zeros.
OscProb::PremModel fPrem
Earth model used.
Definition: PMNS_Maltoni.h:215
virtual void SetwidthBin(double dE, double dcosT)
Set bin's widths for energy and angle.
virtual void LoadModel(std::string filename)
Load an earth model from a file.
Definition: PremModel.cxx:181

References fPrem, InitializeTaylorsVectors(), OscProb::PremModel::LoadModel(), OscProb::PMNS_Base::SetAvgProbPrec(), SetIsOscProbAvg(), and SetwidthBin().

Member Function Documentation

◆ AddPath() [1/2]

void PMNS_Base::AddPath ( double  length,
double  density,
double  zoa = 0.5,
int  layer = 0 
)
virtualinherited

Add a path to the sequence defining attributes directly.

Parameters
length- The length of the path segment in km
density- The density of the path segment in g/cm^3
zoa- The effective Z/A of the path segment
layer- An index to identify the layer type (e.g. earth inner core)

Definition at line 317 of file PMNS_Base.cxx.

318{
319 AddPath(NuPath(length, density, zoa, layer));
320}
virtual void AddPath(NuPath p)
Add a path to the sequence.
Definition: PMNS_Base.cxx:307
A struct representing a neutrino path segment.
Definition: NuPath.h:34

References OscProb::PMNS_Base::AddPath().

◆ AddPath() [2/2]

void PMNS_Base::AddPath ( NuPath  p)
virtualinherited

Add a path to the sequence.

Parameters
p- A neutrino path segment

Definition at line 307 of file PMNS_Base.cxx.

307{ fNuPaths.push_back(p); }
std::vector< NuPath > fNuPaths
Vector of neutrino paths.
Definition: PMNS_Base.h:295

References OscProb::PMNS_Base::fNuPaths.

Referenced by OscProb::PMNS_Base::AddPath(), OscProb::PMNS_Base::SetAtt(), OscProb::PMNS_Base::SetPath(), and SetTestPath().

◆ AlgorithmDensityMatrix()

double PMNS_Maltoni::AlgorithmDensityMatrix ( int  flvi,
int  flvf 
)
protectedvirtual

Algorithm for the transformations on the density matrix

Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
Returns
Average neutrino oscillation probability

Definition at line 1099 of file PMNS_Maltoni.cxx.

1100{
1101 fdensityMatrix[flvi][flvi] = 1;
1102
1103 RotateDensityM(true, fVcosT);
1105 RotateDensityM(false, fVcosT);
1106
1107 RotateDensityM(true, fVInvE);
1109 RotateDensityM(false, fVInvE);
1110
1112
1113 return real(fdensityMatrix[flvf][flvf]);
1114}
static const double kGeV2eV
GeV to eV.
Definition: PMNS_Base.h:217
virtual void HadamardProduct(vectorD lambda, double dbin)
Apply an Hadamard Product to the density matrix.
matrixC fVInvE
Eigenvalues of K_invE.
Definition: PMNS_Maltoni.h:191
vectorD flambdaInvE
Eigenvectors of K_invE.
Definition: PMNS_Maltoni.h:189
double fdInvE
Bin's width for the inverse of energy.
Definition: PMNS_Maltoni.h:186
vectorD flambdaCosT
Eigenvectors of K_cosTheta.
Definition: PMNS_Maltoni.h:190
double fdcosT
Bin's width for zenith angle.
Definition: PMNS_Maltoni.h:187
virtual void RotateDensityM(bool to_basis, matrixC V)
Apply rotation to the density matrix.
matrixC fdensityMatrix
The neutrino density matrix state.
Definition: PMNS_Maltoni.h:206
matrixC fVcosT
Eigenvalues of K_cosTheta.
Definition: PMNS_Maltoni.h:201

References fdcosT, fdensityMatrix, fdInvE, fevolutionMatrixS, flambdaCosT, flambdaInvE, fVcosT, fVInvE, HadamardProduct(), OscProb::PMNS_Base::kGeV2eV, and RotateDensityM().

Referenced by AvgAlgo().

◆ AvgAlgo() [1/2]

double PMNS_Maltoni::AvgAlgo ( int  flvi,
int  flvf,
double  InvE,
double  dInvE,
double  cosT,
double  dcosT 
)
protectedvirtual

Algorithm for the compute of the average probability over a bin of 1oE and cosT

Algorithm for computing the average probability over a bin of 1oE and cosT

Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
InvE- The neutrino 1/E value in the bin center in GeV-1
dInvE- The 1/E bin width in GeV-1
cosT- The cosine of the neutrino angle
dcosT- The cosT bin width
Returns
Average neutrino oscillation probability

Definition at line 1065 of file PMNS_Maltoni.cxx.

1067{
1068 fPrem.FillPath(cosT);
1070
1071 // reset K et S et Ve et lambdaE
1073
1074 SetEnergy(1 / InvE);
1075 SetCosT(cosT);
1076 SetwidthBin(dInvE, dcosT);
1077
1078 fminRsq = pow(fDetRadius * sqrt(1 - cosT * cosT), 2);
1079
1080 // Propagate -> get S and K matrix (on the whole path)
1082
1083 // DiagolK -> get VE and lambdaE
1086
1087 return AlgorithmDensityMatrix(flvi, flvf);
1088}
virtual std::vector< NuPath > GetNuPath()
virtual void SetEnergy(double E)
Set the neutrino energy in GeV.
Definition: PMNS_Base.cxx:226
virtual void SetPath(NuPath p)
Set a single path.
Definition: PMNS_Base.cxx:330
virtual double AlgorithmDensityMatrix(int flvi, int flvf)
Algorithm for the transformations on the density matrix.
Eigen::MatrixXcd fKcosT
K matrix for neutrino angle for the entire path.
Definition: PMNS_Maltoni.h:196
Eigen::MatrixXcd fKInvE
K matrix for the inverse of energy for the entire path.
Definition: PMNS_Maltoni.h:194
virtual void PropagateTaylor()
Propagate neutrino through full path.
virtual void SetCosT(double cosT)
Set neutrino angle.
double fminRsq
Minimum square radius.
Definition: PMNS_Maltoni.h:212
void SolveK(Eigen::MatrixXcd &K, vectorD &lambda, matrixC &V)
Solve the K matrix for eigenvectors and eigenvalues.
double fDetRadius
Detector radius.
Definition: PMNS_Maltoni.h:211
int FillPath(double cosT, double phi=0)
Fill the path sequence in a vector.
Definition: PremModel.cxx:347

References AlgorithmDensityMatrix(), fDetRadius, OscProb::PremModel::FillPath(), fKcosT, fKInvE, flambdaCosT, flambdaInvE, fminRsq, fPrem, fVcosT, fVInvE, OscProb::EarthModelBase::GetNuPath(), InitializeTaylorsVectors(), PropagateTaylor(), SetCosT(), OscProb::PMNS_Base::SetEnergy(), OscProb::PMNS_Base::SetPath(), SetwidthBin(), and SolveK().

◆ AvgAlgo() [2/2]

double PMNS_Maltoni::AvgAlgo ( int  flvi,
int  flvf,
double  LoE,
double  dLoE,
double  L 
)
protectedvirtual

Algorithm for the compute of the average probability over a bin of LoE

Algorithm for the compute of the average probability over a bin of LoE

Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
L- The length of the path in km
Returns
Average neutrino oscillation probability

Definition at line 594 of file PMNS_Maltoni.cxx.

596{
597 // Set width bin as 1/E
598 double d1oE = dLoE / L;
599
600 // reset K et S et Ve et lambdaE
602
603 SetEnergy(L / LoE);
604 SetwidthBin(d1oE, 0);
605
606 // Propagate -> get S and K matrix (on the whole path)
608
609 // DiagolK -> get VE and lambdaE
611
612 // return fct avr proba
613 return AvgFormula(flvi, flvf, d1oE / kGeV2eV, flambdaInvE, fVInvE);
614}
virtual double AvgFormula(int flvi, int flvf, double dbin, vectorD flambda, matrixC fV)
Formula for the average probability over a bin of width dbin.

References AvgFormula(), fKInvE, flambdaInvE, fVInvE, InitializeTaylorsVectors(), OscProb::PMNS_Base::kGeV2eV, PropagateTaylor(), OscProb::PMNS_Base::SetEnergy(), SetwidthBin(), and SolveK().

Referenced by AvgProbLoE(), AvgProbMatrixLoE(), and AvgProbVectorLoE().

◆ AvgAlgoCosT()

double PMNS_Maltoni::AvgAlgoCosT ( int  flvi,
int  flvf,
double  E,
double  cosT,
double  dcosT 
)
protectedvirtual

Algorithm for the compute of the average probability over a bin of cosT

Algorithm for the compute of the average probability over a bin of cosT

Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
cosT- The cosine of the neutrino angle
dcosT- The cosT bin width
Returns
Average neutrino oscillation probability

Definition at line 913 of file PMNS_Maltoni.cxx.

915{
916 // reset K et S et Ve et lambdaE
918
919 SetEnergy(E);
920 SetCosT(cosT);
921 SetwidthBin(0, dcosT);
922
923 fPrem.FillPath(cosT);
925
926 fminRsq = pow(fDetRadius * sqrt(1 - cosT * cosT), 2);
927
928 // Propagate -> get S and K matrix (on the whole path)
930
931 // DiagolK -> get VE and lambdaE
933 // Compute average
934 return AvgFormula(flvi, flvf, fdcosT, flambdaCosT, fVcosT);
935}

References AvgFormula(), fdcosT, fDetRadius, OscProb::PremModel::FillPath(), fKcosT, flambdaCosT, fminRsq, fPrem, fVcosT, OscProb::EarthModelBase::GetNuPath(), InitializeTaylorsVectors(), PropagateTaylor(), SetCosT(), OscProb::PMNS_Base::SetEnergy(), OscProb::PMNS_Base::SetPath(), SetwidthBin(), and SolveK().

◆ AvgFormula()

double PMNS_Maltoni::AvgFormula ( int  flvi,
int  flvf,
double  dbin,
vectorD  lambda,
matrixC  V 
)
protectedvirtual

Formula for the average probability of flvi going to flvf over a bin of width dbin using the Maltoni method.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
dbin- The width of the bin
lambda- The eigenvalues of K
V- The eigenvectors of K
Returns
Average neutrino oscillation probability

Definition at line 450 of file PMNS_Maltoni.cxx.

452{
453 vectorC SV = vectorC(fNumNus, 0);
454
455 for (int i = 0; i < fNumNus; i++) {
456 for (int k = 0; k < fNumNus; k++) {
457 SV[i] += fevolutionMatrixS[flvf][k] * V[k][i];
458 }
459 }
460
461 complexD buffer[fNumNus];
462
463 for (int n = 0; n < fNumNus; n++) { buffer[n] = SV[n] * conj(V[flvi][n]); }
464
465 complexD sinc[fNumNus][fNumNus];
466 for (int j = 0; j < fNumNus; j++) {
467 sinc[j][j] = 1;
468 for (int i = 0; i < j; i++) {
469 double arg = (lambda[i] - lambda[j]) * dbin / 2;
470 sinc[i][j] = sin(arg) / arg;
471 sinc[j][i] = sinc[i][j];
472 }
473 }
474
475 complexD P = 0;
476
477 for (int j = 0; j < fNumNus; j++) {
478 for (int i = 0; i < fNumNus; i++) {
479 P += buffer[i] * conj(buffer[j]) * sinc[j][i];
480 }
481 }
482
483 return real(P);
484}
virtual double P(int flv)
Return the probability of final state in flavour flv.
Definition: PMNS_Base.cxx:1058
int fNumNus
Number of neutrino flavours.
Definition: PMNS_Base.h:277
std::complex< double > complexD
Definition: Definitions.h:21
std::vector< complexD > vectorC
Definition: Definitions.h:22

References fevolutionMatrixS, OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::P().

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), AvgProbMatrixLoE(), and AvgProbVectorLoE().

◆ AvgFormulaExtrapolation()

double PMNS_Maltoni::AvgFormulaExtrapolation ( int  flvi,
int  flvf,
double  dE,
vectorD  lambda,
matrixC  V 
)
protectedvirtual

Fomula for the propability for flvi going to flvf for an energy E+dE using the Maltoni method from a reference energy E.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
dE- The energy variation in GeV
lambda- The eigenvalues of K
V- The eigenvectors of K
Returns
Neutrino oscillation probability

Definition at line 1289 of file PMNS_Maltoni.cxx.

1291{
1292 vectorC SV = vectorC(fNumNus, 0);
1293
1294 for (int i = 0; i < fNumNus; i++) {
1295 for (int k = 0; k < fNumNus; k++) {
1296 SV[i] += fevolutionMatrixS[flvf][k] * V[k][i];
1297 }
1298 }
1299
1300 complexD buffer[fNumNus];
1301 for (int n = 0; n < fNumNus; n++) { buffer[n] = SV[n] * conj(V[flvi][n]); }
1302
1303 complexD expo[fNumNus][fNumNus];
1304
1305 for (int j = 0; j < fNumNus; j++) {
1306 for (int i = 0; i < fNumNus; i++) {
1307 double arg = (lambda[j] - lambda[i]) * dE;
1308 expo[j][i] = exp(complexD(0.0, arg));
1309 }
1310 }
1311
1312 complexD P = 0;
1313
1314 for (int j = 0; j < fNumNus; j++) {
1315 for (int i = 0; i < fNumNus; i++) {
1316 P += buffer[i] * conj(buffer[j]) * expo[j][i];
1317 }
1318 }
1319
1320 return real(P);
1321}

References fevolutionMatrixS, OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::P().

Referenced by ExtrapolationProb(), ExtrapolationProbCosT(), and ExtrapolationProbLoE().

◆ AvgProb() [1/5]

double PMNS_Maltoni::AvgProb ( int  flvi,
int  flvf,
double  E,
double  cosT,
double  dcosT 
)
virtual

Compute the average probability over a bin of cosTheta with a Taylor expansion

Compute the average probability of flvi going to flvf over a bin of angle cost with width dcosT using the Maltoni method.

IMPORTANT: The PremModel object used must be set by this class using the function SetPremModel.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
cosT- The cosine of the neutrino angle
dcosT- The cosT bin width
Returns
Average neutrino oscillation probability

Definition at line 876 of file PMNS_Maltoni.cxx.

878{
879 // reset K et S et Ve et lambdaE
881
882 SetEnergy(E);
883 SetCosT(cosT);
884 SetwidthBin(0, dcosT);
885
886 fPrem.FillPath(cosT);
888
889 fminRsq = pow(fDetRadius * sqrt(1 - cosT * cosT), 2);
890
891 // Propagate -> get S and K matrix (on the whole path)
893
894 // DiagolK -> get VE and lambdaE
896
897 // Compute average
898 return AvgFormula(flvi, flvf, fdcosT, flambdaCosT, fVcosT);
899}

References AvgFormula(), fdcosT, fDetRadius, OscProb::PremModel::FillPath(), fKcosT, flambdaCosT, fminRsq, fPrem, fVcosT, OscProb::EarthModelBase::GetNuPath(), InitializeTaylorsVectors(), PropagateTaylor(), SetCosT(), OscProb::PMNS_Base::SetEnergy(), OscProb::PMNS_Base::SetPath(), SetwidthBin(), and SolveK().

◆ AvgProb() [2/5]

double PMNS_Maltoni::AvgProb ( int  flvi,
int  flvf,
double  E,
double  dE 
)
virtual

Compute the average probability over a bin of energy with a Taylor expansion

Compute the average probability of flvi going to flvf over a bin of energy E with width dE using the Maltoni method.

This gets transformed into L/E, since the oscillation terms have arguments linear in 1/E and not E.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
dE- The energy bin width in GeV
Returns
Average neutrino oscillation probability

Reimplemented from OscProb::PMNS_Base.

Definition at line 507 of file PMNS_Maltoni.cxx.

508{
509 if (fIsOscProbAvg == true) return PMNS_Base::AvgProb(flvi, flvf, E, dE);
510
511 // Do nothing if energy not positive
512 if (E <= 0) return 0;
513
514 if (fNuPaths.empty()) return 0;
515
516 // Don't average zero width
517 if (dE <= 0) return Prob(flvi, flvf, E);
518
519 vectorD LoEbin = ConvertEtoLoE(E, dE);
520
521 // Compute average in LoE
522 return AvgProbLoE(flvi, flvf, LoEbin[0], LoEbin[1]);
523}
virtual vectorD ConvertEtoLoE(double E, double dE)
Definition: PMNS_Base.cxx:1516
virtual double AvgProb(vectorC nu_in, int flvf, double E, double dE=0)
Compute the average probability over a bin of energy.
Definition: PMNS_Base.cxx:1568
virtual double Prob(vectorC nu_in, int flvf)
Compute the probability of nu_in going to flvf.
Definition: PMNS_Base.cxx:1114
virtual double AvgProbLoE(int flvi, int flvf, double LoE, double dLoE)
bool fIsOscProbAvg
Flag to call OscProb default or Maltoni average.
Definition: PMNS_Maltoni.h:219
std::vector< double > vectorD
Definition: Definitions.h:18

References OscProb::PMNS_Base::AvgProb(), AvgProbLoE(), OscProb::PMNS_Base::ConvertEtoLoE(), fIsOscProbAvg, OscProb::PMNS_Base::fNuPaths, and OscProb::PMNS_Base::Prob().

Referenced by AvgProb(), and AvgProbLoE().

◆ AvgProb() [3/5]

double PMNS_Maltoni::AvgProb ( int  flvi,
int  flvf,
double  E,
double  dE,
double  cosT,
double  dcosT 
)
virtual

Compute the average probabilit over a bin of cosTheta and energy with a Taylor expansion

Compute the average probability of flvi going to flvf over a bin of energy E and angle cosT with width dE and dcosT using the Maltoni method.

IMPORTANT: The PremModel object used must be set by this class using the function SetPremModel.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
dE- The energy bin width in GeV
cosT- The cosine of the neutrino angle
dcosT- The cosT bin width
Returns
Average neutrino oscillation probability

Definition at line 961 of file PMNS_Maltoni.cxx.

963{
964 if (E <= 0) return 0;
965 if (cosT > 0) return 0;
966
967 if (fNuPaths.empty()) return 0;
968 // Don't average zero width
969 if (dE <= 0 && dcosT == 0) return Prob(flvi, flvf, E);
970 if (dE <= 0) return AvgProb(flvi, flvf, E, cosT, dcosT);
971 if (dcosT == 0) return AvgProb(flvi, flvf, E, dE);
972
973 vectorD Ebin = ConvertEtoLoE(E, dE);
974
975 // Compute average in LoE
976 return AvgProbLoE(flvi, flvf, Ebin[0], Ebin[1], cosT, dcosT);
977}
virtual double AvgProb(int flvi, int flvf, double E, double dE)

References AvgProb(), AvgProbLoE(), OscProb::PMNS_Base::ConvertEtoLoE(), OscProb::PMNS_Base::fNuPaths, and OscProb::PMNS_Base::Prob().

◆ AvgProb() [4/5]

double PMNS_Base::AvgProb ( int  flvi,
int  flvf,
double  E,
double  dE = 0 
)
virtual

Compute the average probability of flvi going to flvf over a bin of energy E with width dE.

This gets transformed into L/E, since the oscillation terms have arguments linear in L/E and not E.

This function works best for single paths. In multiple paths the accuracy may be somewhat worse. If needed, average over smaller energy ranges.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in the bin center in GeV
dE- The energy bin width in GeV
Returns
Average neutrino oscillation probability

Reimplemented from OscProb::PMNS_Base.

Definition at line 98 of file PMNS_Base.cxx.

1501{
1502 ResetToFlavour(flvi);
1503
1504 return AvgProb(fNuState, flvf, E, dE);
1505}
vectorC fNuState
The neutrino current state.
Definition: PMNS_Base.h:283
virtual void ResetToFlavour(int flv)
Reset neutrino state to pure flavour flv.
Definition: PMNS_Base.cxx:1034

◆ AvgProb() [5/5]

double PMNS_Base::AvgProb ( vectorC  nu_in,
int  flvf,
double  E,
double  dE = 0 
)
virtual

Compute the average probability of nu_in going to flvf over a bin of energy E with width dE.

This gets transformed into L/E, since the oscillation terms have arguments linear in L/E and not E.

This function works best for single paths. In multiple paths the accuracy may be somewhat worse. If needed, average over smaller energy ranges.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nu_in- The neutrino initial state in flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in the bin center in GeV
dE- The energy bin width in GeV
Returns
Average neutrino oscillation probability

Reimplemented from OscProb::PMNS_Base.

Definition at line 88 of file PMNS_Base.cxx.

1569{
1570 // Do nothing if energy is not positive
1571 if (E <= 0) return 0;
1572
1573 if (fNuPaths.empty()) return 0;
1574
1575 // Don't average zero width
1576 if (dE <= 0) return Prob(nu_in, flvf, E);
1577
1578 vectorD LoEbin = ConvertEtoLoE(E, dE);
1579
1580 // Compute average in LoE
1581 return AvgProbLoE(nu_in, flvf, LoEbin[0], LoEbin[1]);
1582}

◆ AvgProbLoE() [1/4]

double PMNS_Maltoni::AvgProbLoE ( int  flvi,
int  flvf,
double  LoE,
double  dLoE 
)
virtual

Compute the average probability over a bin of LoE with a Taylor expansion

Compute the average probability of flvi going to flvf over a bin of energy L/E with width dLoE using the Maltoni method.

The probabilities are weighted by (L/E)^-2 so that event density is flat in energy. This avoids giving too much weight to low energies. Better approximations would be achieved if we used an interpolated event density.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
Returns
Average neutrino oscillation probability

Reimplemented from OscProb::PMNS_Base.

Definition at line 548 of file PMNS_Maltoni.cxx.

549{
550 if (fIsOscProbAvg == true)
551 return PMNS_Base::AvgProbLoE(flvi, flvf, LoE, dLoE);
552
553 if (LoE <= 0) return 0;
554
555 if (fNuPaths.empty()) return 0;
556
557 // Don't average zero width
558 if (dLoE <= 0) return Prob(flvi, flvf, fPath.length / LoE);
559
560 // Get sample points for this bin
561 vectorD samples = GetSamplePointsAvgClass(LoE, dLoE);
562
563 double avgprob = 0;
564 double L = fPath.length;
565 double sumw = 0;
566
567 // Loop over all sample points
568 for (int j = 1; j < int(samples.size()); j++) {
569 // Set (L/E)^-2 weights
570 double w = 1. / pow(samples[j], 2);
571
572 avgprob += w * AvgAlgo(flvi, flvf, samples[j], samples[0], L);
573
574 // Increment sum of weights
575 sumw += w;
576 }
577
578 // Return weighted average of probabilities
579 return avgprob / sumw;
580}
virtual double AvgProbLoE(vectorC nu_in, int flvf, double LoE, double dLoE=0)
Compute the average probability over a bin of L/E.
Definition: PMNS_Base.cxx:1643
NuPath fPath
Current neutrino path.
Definition: PMNS_Base.h:296
virtual double AvgAlgo(int flvi, int flvf, double LoE, double dLoE, double L)
virtual vectorD GetSamplePointsAvgClass(double LoE, double dLoE)
Compute the sample points fo a bin of L/E with width dLoE.
double length
The length of the path segment in km.
Definition: NuPath.h:78

References AvgAlgo(), OscProb::PMNS_Base::AvgProbLoE(), fIsOscProbAvg, OscProb::PMNS_Base::fNuPaths, OscProb::PMNS_Base::fPath, GetSamplePointsAvgClass(), OscProb::NuPath::length, and OscProb::PMNS_Base::Prob().

Referenced by AvgProb(), and AvgProbLoE().

◆ AvgProbLoE() [2/4]

double PMNS_Maltoni::AvgProbLoE ( int  flvi,
int  flvf,
double  LoE,
double  dLoE,
double  cosT,
double  dcosT 
)
virtual

Compute the average probability over a bin of cosTheta and LoE with a Taylor expansion

Compute the average probability of flvi going to flvf over a bin of energy L/E and cosT with width dLoE and dcosT using the Maltoni method.

The probabilities are weighted by (L/E)^-2 so that event density is flat in energy. This avoids giving too much weight to low energies. Better approximations would be achieved if we used an interpolated event density.

IMPORTANT: The PremModel object used must be set by this class using the function SetPremModel.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
cosT- The cosine of the neutrino angle
dcosT- The cosT bin width
Returns
Average neutrino oscillation probability

chg ici

Definition at line 1008 of file PMNS_Maltoni.cxx.

1010{
1011 if (LoE <= 0) return 0;
1012 if (cosT > 0) return 0;
1013
1014 // if (fNuPaths.empty()) return 0;
1015
1016 // Don't average zero width
1017 if (dLoE <= 0 && dcosT == 0) return Prob(flvi, flvf, fPath.length / LoE);
1018 if (dLoE <= 0)
1019 return AvgProb(flvi, flvf, fPath.length / LoE, cosT, dcosT);
1020 if (dcosT == 0) return AvgProbLoE(flvi, flvf, LoE, dLoE);
1021
1022 // Make sample with 1oE and not LoE
1024 dLoE / fPath.length, cosT, dcosT);
1025
1026 int rows = samples.size();
1027 int cols = samples[0].size();
1028
1029 double avgprob = 0;
1030 double sumw = 0;
1031
1032 // Loop over all sample points
1033 for (int k = 1; k < int(rows); k++) {
1034 for (int l = 1; l < int(cols); l++) {
1035 // Set (L/E)^-2 weights
1036 double w = 1. / pow(real(samples[k][l]), 2);
1037
1038 avgprob +=
1039 w * AvgAlgo(flvi, flvf, real(samples[k][l]), real(samples[0][0]),
1040 imag(samples[k][l]), imag(samples[0][0]));
1041
1042 // Increment sum of weights
1043 sumw += w;
1044 }
1045 }
1046
1047 // Return average of probabilities
1048 return avgprob / ((sumw));
1049}
std::vector< vectorC > matrixC
Definition: Definitions.h:23

References AvgAlgo(), AvgProb(), AvgProbLoE(), OscProb::PMNS_Base::fPath, GetSamplePointsAvgClass(), OscProb::NuPath::length, and OscProb::PMNS_Base::Prob().

◆ AvgProbLoE() [3/4]

double PMNS_Base::AvgProbLoE ( int  flvi,
int  flvf,
double  LoE,
double  dLoE = 0 
)
virtual

Compute the average probability of flvi going to flvf over a bin of L/E with width dLoE.

The probabilities are weighted by (L/E)^-2 so that event density is flat in energy. This avoids giving too much weight to low energies. Better approximations would be achieved if we used an interpolated event density.

This function works best for single paths. In multiple paths the accuracy may be somewhat worse. If needed, average over smaller L/E ranges.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
Returns
Average neutrino oscillation probability

Reimplemented from OscProb::PMNS_Base.

Definition at line 102 of file PMNS_Base.cxx.

1611{
1612 ResetToFlavour(flvi);
1613
1614 return AvgProbLoE(fNuState, flvf, LoE, dLoE);
1615}

◆ AvgProbLoE() [4/4]

double PMNS_Base::AvgProbLoE ( vectorC  nu_in,
int  flvf,
double  LoE,
double  dLoE = 0 
)
virtual

Compute the average probability of nu_in going to flvf over a bin of L/E with width dLoE.

The probabilities are weighted by (L/E)^-2 so that event density is flat in energy. This avoids giving too much weight to low energies. Better approximations would be achieved if we used an interpolated event density.

This function works best for single paths. In multiple paths the accuracy may be somewhat worse. If needed, average over smaller L/E ranges.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nu_in- The neutrino intial state in flavour basis.
flvf- The neutrino final flavour.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
Returns
Average neutrino oscillation probability

Reimplemented from OscProb::PMNS_Base.

Definition at line 92 of file PMNS_Base.cxx.

1644{
1645 // Do nothing if L/E is not positive
1646 if (LoE <= 0) return 0;
1647
1648 if (fNuPaths.empty()) return 0;
1649
1650 // Make sure fPath is set
1651 // Use average if multiple paths
1653
1654 // Set the energy at bin center
1655 SetEnergy(fPath.length / LoE);
1656
1657 // Don't average zero width
1658 if (dLoE <= 0) return Prob(nu_in, flvf);
1659
1660 // Get sample points for this bin
1661 vectorD samples = GetSamplePoints(LoE, dLoE);
1662
1663 // Variables to fill sample
1664 // probabilities and weights
1665 double sumw = 0;
1666 double prob = 0;
1667 double length = fPath.length;
1668
1669 // Loop over all sample points
1670 for (int j = 0; j < int(samples.size()); j++) {
1671 // Set (L/E)^-2 weights
1672 double w = 1. / pow(samples[j], 2);
1673
1674 // Add weighted probability
1675 prob += w * Prob(nu_in, flvf, length / samples[j]);
1676
1677 // Increment sum of weights
1678 sumw += w;
1679 }
1680
1681 // Return weighted average of probabilities
1682 return prob / sumw;
1683}
virtual void SetCurPath(NuPath p)
Set the path currently in use by the class.
Definition: PMNS_Base.cxx:274
virtual vectorD GetSamplePoints(double LoE, double dLoE)
Compute the sample points for a bin of L/E with width dLoE.
Definition: PMNS_Base.cxx:1985
NuPath AvgPath(NuPath &p1, NuPath &p2)
Get the average of two paths.
Definition: NuPath.cxx:27

◆ AvgProbMatrix()

matrixD PMNS_Maltoni::AvgProbMatrix ( int  nflvi,
int  nflvf,
double  E,
double  dE 
)
virtual

Compute the average probability matrix over a bin of energy using a Taylor expansion

Compute the average probability matrix for nflvi and nflvf over a bin of energy E with width dE using the Maltoni method.

Parameters
nflvi- The number of initial flavours in the matrix.
nflvf- The number of final flavours in the matrix.
E- The neutrino energy in the bin center in GeV
dE- The energy bin width in GeV
Returns
Average neutrino oscillation probabilities

Reimplemented from OscProb::PMNS_Base.

Definition at line 767 of file PMNS_Maltoni.cxx.

768{
769 if (fIsOscProbAvg == true)
770 return PMNS_Base::AvgProbMatrix(nflvi, nflvf, E, dE);
771
772 matrixD probs(nflvi, vectorD(nflvf, 0));
773
774 // Do nothing if energy is not positive
775 if (E <= 0) return probs;
776
777 if (fNuPaths.empty()) return probs;
778
779 // Don't average zero width
780 if (dE <= 0) return ProbMatrix(nflvi, nflvf, E);
781
782 vectorD LoEbin = ConvertEtoLoE(E, dE);
783
784 // Compute average in LoE
785 return AvgProbMatrixLoE(nflvi, nflvf, LoEbin[0], LoEbin[1]);
786}
virtual matrixD AvgProbMatrix(int nflvi, int nflvf, double E, double dE=0)
Definition: PMNS_Base.cxx:1861
virtual matrixD ProbMatrix(int nflvi, int nflvf)
Compute the probability matrix.
Definition: PMNS_Base.cxx:1387
virtual matrixD AvgProbMatrixLoE(int nflvi, int nflvf, double LoE, double dLoE)
std::vector< vectorD > matrixD
Definition: Definitions.h:19

References OscProb::PMNS_Base::AvgProbMatrix(), AvgProbMatrixLoE(), OscProb::PMNS_Base::ConvertEtoLoE(), fIsOscProbAvg, OscProb::PMNS_Base::fNuPaths, and OscProb::PMNS_Base::ProbMatrix().

◆ AvgProbMatrixLoE()

matrixD PMNS_Maltoni::AvgProbMatrixLoE ( int  nflvi,
int  nflvf,
double  LoE,
double  dLoE 
)
virtual

Compute the average probability matrix over a bin of L/E using a Taylor expansion

Compute the average probability matrix for nflvi and nflvf over a bin of L/E with width dLoE using the Maltoni method.

Parameters
nflvi- The number of initial flavours in the matrix.
nflvf- The number of final flavours in the matrix.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
Returns
Average neutrino oscillation probabilities

Reimplemented from OscProb::PMNS_Base.

Definition at line 800 of file PMNS_Maltoni.cxx.

802{
803 if (fIsOscProbAvg == true)
804 return PMNS_Base::AvgProbMatrixLoE(nflvi, nflvf, LoE, dLoE);
805
806 matrixD probs(nflvi, vectorD(nflvf, 0));
807
808 if (LoE <= 0) return probs;
809
810 if (fNuPaths.empty()) return probs;
811
812 double L = fPath.length;
813
814 // Don't average zero width
815 if (dLoE <= 0) return ProbMatrix(nflvi, nflvf, L / LoE);
816
817 // Get sample points for this bin
818 vectorD samples = GetSamplePointsAvgClass(LoE, dLoE);
819
820 double sumw = 0;
821
822 // Loop over all sample points
823 for (int j = 1; j < int(samples.size()); j++) {
824 // Set (L/E)^-2 weights
825 double w = 1. / pow(samples[j], 2);
826
827 for (int flvi = 0; flvi < nflvi; flvi++) {
828 for (int flvf = 0; flvf < nflvf; flvf++) {
829 // if (!TryCacheK())
830 if (flvi == 0 && flvf == 0)
831 probs[flvi][flvf] +=
832 w * AvgAlgo(flvi, flvf, samples[j], samples[0], L);
833 else
834 probs[flvi][flvf] +=
835 w * AvgFormula(flvi, flvf, fdInvE / kGeV2eV, flambdaInvE, fVInvE);
836 }
837 }
838
839 // Increment sum of weights
840 sumw += w;
841 }
842
843 for (int flvi = 0; flvi < nflvi; flvi++) {
844 for (int flvf = 0; flvf < nflvf; flvf++) {
845 // Divide by total sampling weight
846 probs[flvi][flvf] /= sumw;
847 }
848 }
849
850 // Return weighted average of probabilities
851 return probs;
852}
virtual matrixD AvgProbMatrixLoE(int nflvi, int nflvf, double LoE, double dLoE=0)
Compute the average probability matrix over a bin of L/E.
Definition: PMNS_Base.cxx:1900

References AvgAlgo(), AvgFormula(), OscProb::PMNS_Base::AvgProbMatrixLoE(), fdInvE, fIsOscProbAvg, flambdaInvE, OscProb::PMNS_Base::fNuPaths, OscProb::PMNS_Base::fPath, fVInvE, GetSamplePointsAvgClass(), OscProb::PMNS_Base::kGeV2eV, OscProb::NuPath::length, and OscProb::PMNS_Base::ProbMatrix().

Referenced by AvgProbMatrix().

◆ AvgProbVector() [1/2]

vectorD PMNS_Maltoni::AvgProbVector ( int  flvi,
double  E,
double  dE 
)
virtual

Compute the average probability vector over a bin of energy using a Taylor expansion

Compute the average probability of flvi going to any flavour over a bin of energy E with width dE using the Maltoni method.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
E- The neutrino energy in GeV
dE- The energy bin width in GeV
Returns
Average probability for all outgoing flavours

Reimplemented from OscProb::PMNS_Base.

Definition at line 671 of file PMNS_Maltoni.cxx.

672{
673 if (fIsOscProbAvg == true) return PMNS_Base::AvgProbVector(flvi, E, dE);
674
675 vectorD probs(fNumNus, 0);
676
677 // Do nothing if energy is not positive
678 if (E <= 0) return probs;
679
680 if (fNuPaths.empty()) return probs;
681
682 // Don't average zero width
683 if (dE <= 0) return ProbVector(flvi, E);
684
685 vectorD LoEbin = ConvertEtoLoE(E, dE);
686
687 // Compute average in LoE
688 return AvgProbVectorLoE(flvi, LoEbin[0], LoEbin[1]);
689}
virtual vectorD AvgProbVector(vectorC nu_in, double E, double dE=0)
Definition: PMNS_Base.cxx:1753
virtual vectorD ProbVector(vectorC nu_in)
Definition: PMNS_Base.cxx:1250
virtual vectorD AvgProbVectorLoE(int flvi, double LoE, double dLoE)

References OscProb::PMNS_Base::AvgProbVector(), AvgProbVectorLoE(), OscProb::PMNS_Base::ConvertEtoLoE(), fIsOscProbAvg, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuPaths, and OscProb::PMNS_Base::ProbVector().

◆ AvgProbVector() [2/2]

vectorD PMNS_Base::AvgProbVector ( vectorC  nu_in,
double  E,
double  dE = 0 
)
virtualinherited

Compute the average probability vector over a bin of energy

Compute the average probability of nu_in going to all flavours over a bin of energy E with width dE.

This gets transformed into L/E, since the oscillation terms have arguments linear in L/E and not E.

This function works best for single paths. In multiple paths the accuracy may be somewhat worse. If needed, average over smaller energy ranges.

Parameters
nu_in- The neutrino initial state in flavour.
E- The neutrino energy in the bin center in GeV
dE- The energy bin width in GeV
Returns
Average neutrino oscillation probabilities

Definition at line 1753 of file PMNS_Base.cxx.

1754{
1755 vectorD probs(fNumNus, 0);
1756
1757 // Do nothing if energy is not positive
1758 if (E <= 0) return probs;
1759
1760 if (fNuPaths.empty()) return probs;
1761
1762 // Don't average zero width
1763 if (dE <= 0) return ProbVector(nu_in, E);
1764
1765 vectorD LoEbin = ConvertEtoLoE(E, dE);
1766
1767 // Compute average in LoE
1768 return AvgProbVectorLoE(nu_in, LoEbin[0], LoEbin[1]);
1769}
virtual vectorD AvgProbVectorLoE(vectorC nu_in, double LoE, double dLoE=0)
Compute the average probability vector over a bin of L/E.
Definition: PMNS_Base.cxx:1791

References OscProb::PMNS_Base::AvgProbVectorLoE(), OscProb::PMNS_Base::ConvertEtoLoE(), OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuPaths, and OscProb::PMNS_Base::ProbVector().

Referenced by AvgProbVector(), and OscProb::PMNS_Base::AvgProbVector().

◆ AvgProbVectorLoE() [1/2]

vectorD PMNS_Maltoni::AvgProbVectorLoE ( int  flvi,
double  LoE,
double  dLoE 
)
virtual

Compute the average probability vector over a bin of L/E using a Taylor expansion

Compute the average probability of flvi going to any flavour over a bin of L/E with width dLoE using the Maltoni method.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
Returns
Average probability for all outgoing flavours

Reimplemented from OscProb::PMNS_Base.

Definition at line 708 of file PMNS_Maltoni.cxx.

709{
710 if (fIsOscProbAvg == true)
711 return PMNS_Base::AvgProbVectorLoE(flvi, LoE, dLoE);
712
713 vectorD probs(fNumNus, 0);
714
715 if (LoE <= 0) return probs;
716
717 if (fNuPaths.empty()) return probs;
718
719 double L = fPath.length;
720
721 // Don't average zero width
722 if (dLoE <= 0) return ProbVector(flvi, L / LoE);
723
724 // Get sample points for this bin
725 vectorD samples = GetSamplePointsAvgClass(LoE, dLoE);
726
727 double sumw = 0;
728
729 // Loop over all sample points
730 for (int j = 1; j < int(samples.size()); j++) {
731 // Set (L/E)^-2 weights
732 double w = 1. / pow(samples[j], 2);
733
734 for (int flvf = 0; flvf < fNumNus; flvf++) {
735 if (flvf == 0)
736 probs[flvf] += w * AvgAlgo(flvi, flvf, samples[j], samples[0], L);
737 else
738 probs[flvf] +=
739 w * AvgFormula(flvi, flvf, fdInvE / kGeV2eV, flambdaInvE, fVInvE);
740 }
741
742 // Increment sum of weights
743 sumw += w;
744 }
745
746 for (int flvf = 0; flvf < fNumNus; flvf++) {
747 // Divide by total sampling weight
748 probs[flvf] /= sumw;
749 }
750
751 // Return weighted average of probabilities
752 return probs;
753}

References AvgAlgo(), AvgFormula(), OscProb::PMNS_Base::AvgProbVectorLoE(), fdInvE, fIsOscProbAvg, flambdaInvE, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuPaths, OscProb::PMNS_Base::fPath, fVInvE, GetSamplePointsAvgClass(), OscProb::PMNS_Base::kGeV2eV, OscProb::NuPath::length, and OscProb::PMNS_Base::ProbVector().

Referenced by AvgProbVector().

◆ AvgProbVectorLoE() [2/2]

vectorD PMNS_Base::AvgProbVectorLoE ( vectorC  nu_in,
double  LoE,
double  dLoE = 0 
)
virtualinherited

Compute the average probability of nu_in going to all flavours over a bin of L/E with width dLoE.

The probabilities are weighted by (L/E)^-2 so that event density is flat in energy. This avoids giving too much weight to low energies. Better approximations would be achieved if we used an interpolated event density.

This function works best for single paths. In multiple paths the accuracy may be somewhat worse. If needed, average over smaller L/E ranges.

Parameters
nu_in- The neutrino intial state in flavour basis.
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
Returns
Average neutrino oscillation probabilities

Definition at line 1791 of file PMNS_Base.cxx.

1792{
1793 vectorD probs(fNumNus, 0);
1794
1795 // Do nothing if L/E is not positive
1796 if (LoE <= 0) return probs;
1797
1798 if (fNuPaths.empty()) return probs;
1799
1800 // Make sure fPath is set
1801 // Use average if multiple paths
1803
1804 // Set the energy at bin center
1805 SetEnergy(fPath.length / LoE);
1806
1807 // Don't average zero width
1808 if (dLoE <= 0) return ProbVector(nu_in);
1809
1810 // Get sample points for this bin
1811 vectorD samples = GetSamplePoints(LoE, dLoE);
1812
1813 // Variables to fill sample
1814 // probabilities and weights
1815 double sumw = 0;
1816 double length = fPath.length;
1817
1818 // Loop over all sample points
1819 for (int j = 0; j < int(samples.size()); j++) {
1820 // Set (L/E)^-2 weights
1821 double w = 1. / pow(samples[j], 2);
1822
1823 vectorD sample_probs = ProbVector(nu_in, length / samples[j]);
1824
1825 for (int i = 0; i < fNumNus; i++) {
1826 // Add weighted probability
1827 probs[i] += w * sample_probs[i];
1828 }
1829 // Increment sum of weights
1830 sumw += w;
1831 }
1832
1833 for (int i = 0; i < fNumNus; i++) {
1834 // Divide by total sampling weight
1835 probs[i] /= sumw;
1836 }
1837
1838 // Return weighted average of probabilities
1839 return probs;
1840}

References OscProb::AvgPath(), OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuPaths, OscProb::PMNS_Base::fPath, OscProb::PMNS_Base::GetSamplePoints(), OscProb::NuPath::length, OscProb::PMNS_Base::ProbVector(), OscProb::PMNS_Base::SetCurPath(), and OscProb::PMNS_Base::SetEnergy().

Referenced by OscProb::PMNS_Base::AvgProbVector(), AvgProbVectorLoE(), and OscProb::PMNS_Base::AvgProbVectorLoE().

◆ BuildHms()

void PMNS_Base::BuildHms ( )
protectedvirtualinherited

Build Hms = H*2E, where H is the Hamiltonian in vacuum on flavour basis and E is the neutrino energy in eV. Hms is effectively the matrix of masses squared.

This is a hermitian matrix, so only the upper triangular part needs to be filled

The construction of the Hamiltonian avoids computing terms that are simply zero. This has a big impact in the computation time.

Reimplemented in OscProb::PMNS_Decay, OscProb::PMNS_OQS, and OscProb::PMNS_SNSI.

Definition at line 955 of file PMNS_Base.cxx.

956{
957 // Check if anything changed
958 if (fBuiltHms) return;
959
960 // Tag to recompute eigensystem
961 fGotES = false;
962
963 for (int j = 0; j < fNumNus; j++) {
964 // Set mass splitting
965 fHms[j][j] = fDm[j];
966 // Reset off-diagonal elements
967 for (int i = 0; i < j; i++) { fHms[i][j] = 0; }
968 // Rotate j neutrinos
969 for (int i = 0; i < j; i++) { RotateH(i, j, fHms); }
970 }
971
972 ClearCache();
973
974 // Tag as built
975 fBuiltHms = true;
976}
virtual void RotateH(int i, int j, matrixC &Ham)
Rotate the Hamiltonian by theta_ij and delta_ij.
Definition: PMNS_Base.cxx:822
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
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
virtual void ClearCache()
Clear the cache.
Definition: PMNS_Base.cxx:111

References OscProb::PMNS_Base::ClearCache(), OscProb::PMNS_Base::fBuiltHms, OscProb::PMNS_Base::fDm, OscProb::PMNS_Base::fGotES, OscProb::PMNS_Base::fHms, OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::RotateH().

Referenced by OscProb::PMNS_OQS::BuildHms(), OscProb::PMNS_Sterile::SolveHam(), and OscProb::PMNS_Fast::SolveHamMatter().

◆ BuildKcosT()

void PMNS_Maltoni::BuildKcosT ( )
protectedvirtual

Build K matrix for the zenith angle in flavor basis.

Definition at line 111 of file PMNS_Maltoni.cxx.

112{
113 UpdateHam();
114
115 double dL = LnDerivative() * kKm2eV;
116
117 for (int j = 0; j < fNumNus; j++) {
118 for (int i = 0; i <= j; i++) {
119 fKflavor[i][j] = dL * fHam(i, j);
120
121 if (i != j) { fKflavor[j][i] = conj(fKflavor[i][j]); }
122 }
123 }
124}
static const double kKm2eV
km to eV^-1
Definition: PMNS_Base.h:215
Eigen::MatrixXcd fHam
The full Hamiltonian.
Definition: PMNS_Maltoni.h:217
virtual void UpdateHam()=0
Build the full Hamiltonian.
virtual double LnDerivative()
Compute the derivation of one layer's length.
matrixC fKflavor
K matrix in flavor basis for one layer.
Definition: PMNS_Maltoni.h:204

References fHam, fKflavor, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::kKm2eV, LnDerivative(), and UpdateHam().

Referenced by PropagatePathTaylor().

◆ BuildKE()

void PMNS_Maltoni::BuildKE ( double  L)
protectedvirtual

Build K matrix for the inverse of energy in mass basis.

The variable for which a Taylor expansion is done here is not directly the energy but the inverse of it. This change of variable allow to express the hamiltonien as linear with respect to this new variable.

Parameters
L- The length of the layer in km

Definition at line 136 of file PMNS_Maltoni.cxx.

137{
138 double lenghtEV = L * kKm2eV; // L in eV-1
139 double bufK = lenghtEV * 0.5; // L/2 in eV-1
140
141 complexD buffer[fNumNus];
142
143 for (int i = 0; i < fNumNus; i++) {
144 complexD Hms_kl;
145
146 for (int l = 0; l < fNumNus; l++) {
147 buffer[l] = 0;
148
149 for (int k = 0; k < fNumNus; k++) {
150 if (k <= l)
151 Hms_kl = fHms[k][l];
152 else
153 Hms_kl = conj(fHms[l][k]);
154
155 if (fIsNuBar && k != l) Hms_kl = conj(Hms_kl);
156
157 buffer[l] += conj(fEvec[k][i]) * Hms_kl;
158 }
159 }
160
161 for (int j = 0; j <= i; j++) {
162 fKmass[i][j] = 0;
163
164 for (int l = 0; l < fNumNus; l++) {
165 fKmass[i][j] += buffer[l] * fEvec[l][j];
166 }
167
168 complexD C;
169
170 if (i == j) { C = complexD(1, 0); }
171 else {
172 double arg = (fEval[i] - fEval[j]) * lenghtEV;
173
174 C = (complexD(cos(arg), sin(arg)) - complexD(1, 0.0)) /
175 complexD(0.0, arg);
176 }
177
178 fKmass[i][j] *= bufK * C;
179
180 if (i != j) fKmass[j][i] = conj(fKmass[i][j]);
181 }
182 }
183}
bool fIsNuBar
Anti-neutrino flag.
Definition: PMNS_Base.h:293
matrixC fEvec
Eigenvectors of the Hamiltonian.
Definition: PMNS_Base.h:290
vectorD fEval
Eigenvalues of the Hamiltonian.
Definition: PMNS_Base.h:289
matrixC fKmass
K matrix in mass basis for one layer.
Definition: PMNS_Maltoni.h:203

References OscProb::PMNS_Base::fEval, OscProb::PMNS_Base::fEvec, OscProb::PMNS_Base::fHms, OscProb::PMNS_Base::fIsNuBar, fKmass, OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::kKm2eV.

Referenced by PropagatePathTaylor().

◆ ClearCache()

void PMNS_Base::ClearCache ( )
virtualinherited

Clear the cache

Definition at line 111 of file PMNS_Base.cxx.

112{
113 fMixCache.clear();
114
115 // Set some better hash table parameters
116 fMixCache.max_load_factor(0.25);
117 fMixCache.reserve(512);
118}
std::unordered_set< EigenPoint > fMixCache
Caching set of eigensystems.
Definition: PMNS_Base.h:307

References OscProb::PMNS_Base::fMixCache.

Referenced by OscProb::PMNS_Base::BuildHms(), OscProb::PMNS_Base::PMNS_Base(), OscProb::PMNS_NUNM::SetAlpha(), OscProb::PMNS_LIV::SetaT(), OscProb::PMNS_NSI::SetCoupByIndex(), OscProb::PMNS_LIV::SetcT(), OscProb::PMNS_NSI::SetEps(), and OscProb::PMNS_NUNM::SetFracVnc().

◆ ClearPath()

void PMNS_Base::ClearPath ( )
virtualinherited

Clear the path vector.

Definition at line 287 of file PMNS_Base.cxx.

287{ fNuPaths.clear(); }

References OscProb::PMNS_Base::fNuPaths.

Referenced by OscProb::PMNS_Base::SetAtt(), and OscProb::PMNS_Base::SetPath().

◆ ConvertEtoLoE()

vectorD PMNS_Base::ConvertEtoLoE ( double  E,
double  dE 
)
protectedvirtualinherited

Convert a bin of energy into a bin of L/E

Parameters
E- energy bin center in GeV
dE- energy bin width in GeV
Returns
The L/E bin center and width in km/GeV

Definition at line 1516 of file PMNS_Base.cxx.

1517{
1518 // Make sure fPath is set
1519 // Use average if multiple paths
1521
1522 // Define L/E variables
1523 vectorD LoEbin(2);
1524
1525 // Set a minimum energy
1526 double minE = 0.1 * E;
1527
1528 // Transform range to L/E
1529 // Full range if low edge > minE
1530 if (E - dE / 2 > minE) {
1531 LoEbin[0] =
1532 0.5 * (fPath.length / (E - dE / 2) + fPath.length / (E + dE / 2));
1533 LoEbin[1] = fPath.length / (E - dE / 2) - fPath.length / (E + dE / 2);
1534 }
1535 // Else start at minE
1536 else {
1537 LoEbin[0] = 0.5 * (fPath.length / minE + fPath.length / (E + dE / 2));
1538 LoEbin[1] = fPath.length / minE - fPath.length / (E + dE / 2);
1539 }
1540
1541 return LoEbin;
1542}

References OscProb::AvgPath(), OscProb::PMNS_Base::fNuPaths, OscProb::PMNS_Base::fPath, OscProb::NuPath::length, and OscProb::PMNS_Base::SetCurPath().

Referenced by AvgProb(), OscProb::PMNS_Base::AvgProb(), AvgProbMatrix(), OscProb::PMNS_Base::AvgProbMatrix(), AvgProbVector(), and OscProb::PMNS_Base::AvgProbVector().

◆ ExtrapolationProb()

double PMNS_Maltoni::ExtrapolationProb ( int  flvi,
int  flvf,
double  E,
double  dE 
)
virtual

Compute the propability for flvi going to flvf for an energy E+dE using the Maltoni method from a reference energy E.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The reference energy in GeV
dE- The energy variation in GeV
Returns
Neutrino oscillation probability

Definition at line 1341 of file PMNS_Maltoni.cxx.

1342{
1343 // reset K et S et Ve et lambdaE
1345
1346 SetEnergy(E);
1347 SetwidthBin(1 / (E + dE) - 1 / E, 0);
1348
1349 // Propagate -> get S and K matrix (on the whole path)
1351
1352 // DiagolK -> get VE and lambdaE
1354
1355 return AvgFormulaExtrapolation(flvi, flvf, fdInvE / kGeV2eV, flambdaInvE,
1356 fVInvE);
1357}
virtual double AvgFormulaExtrapolation(int flvi, int flvf, double dE, vectorD flambda, matrixC fV)
Formula for the extrapolation of probability.

References AvgFormulaExtrapolation(), fdInvE, fKInvE, flambdaInvE, fVInvE, InitializeTaylorsVectors(), OscProb::PMNS_Base::kGeV2eV, PropagateTaylor(), OscProb::PMNS_Base::SetEnergy(), SetwidthBin(), and SolveK().

◆ ExtrapolationProbCosT()

double PMNS_Maltoni::ExtrapolationProbCosT ( int  flvi,
int  flvf,
double  cosT,
double  dcosT 
)
virtual

Compute the propability for flvi going to flvf for an angle cosT+dcosT using the Maltoni method from a reference angle cosT.

IMPORTANT: The PremModel object used must be set by this class using the function SetPremModel.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
cosT- The reference angle
dcosT- The angle variation
Returns
Neutrino oscillation probability

Definition at line 1420 of file PMNS_Maltoni.cxx.

1422{
1423 fPrem.FillPath(cosT);
1425
1426 // reset K et S et Ve et lambdaE
1428
1429 // SetEnergy(E);
1430 SetCosT(cosT);
1431 SetwidthBin(0, dcosT);
1432
1433 fminRsq = pow(fDetRadius * sqrt(1 - cosT * cosT), 2);
1434
1435 // Propagate -> get S and K matrix (on the whole path)
1437
1438 // DiagolK -> get VE and lambdaE
1440
1441 return AvgFormulaExtrapolation(flvi, flvf, fdcosT, flambdaCosT, fVcosT);
1442}

References AvgFormulaExtrapolation(), fdcosT, fDetRadius, OscProb::PremModel::FillPath(), fKcosT, flambdaCosT, fminRsq, fPrem, fVcosT, OscProb::EarthModelBase::GetNuPath(), InitializeTaylorsVectors(), PropagateTaylor(), SetCosT(), OscProb::PMNS_Base::SetPath(), SetwidthBin(), and SolveK().

◆ ExtrapolationProbLoE()

double PMNS_Maltoni::ExtrapolationProbLoE ( int  flvi,
int  flvf,
double  LoE,
double  dLoE 
)
virtual

Compute the propability for flvi going to flvf for an energy LoE+dLoE using the Maltoni method from a reference value LoE.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
LoE- The reference energy in GeV
dLoE- The energy variation in GeV
Returns
Neutrino oscillation probability

Definition at line 1377 of file PMNS_Maltoni.cxx.

1379{
1380 // reset K et S et Ve et lambdaE
1382
1384 double L = fPath.length;
1385
1386 SetEnergy(L / LoE);
1387 SetwidthBin(dLoE / L, 0);
1388
1389 // Propagate -> get S and K matrix (on the whole path)
1391
1392 // DiagolK -> get VE and lambdaE
1394
1395 return AvgFormulaExtrapolation(flvi, flvf, dLoE * kGeV2eV / L, flambdaInvE,
1396 fVInvE);
1397}

References AvgFormulaExtrapolation(), OscProb::AvgPath(), fKInvE, flambdaInvE, OscProb::PMNS_Base::fNuPaths, OscProb::PMNS_Base::fPath, fVInvE, InitializeTaylorsVectors(), OscProb::PMNS_Base::kGeV2eV, OscProb::NuPath::length, PropagateTaylor(), OscProb::PMNS_Base::SetCurPath(), OscProb::PMNS_Base::SetEnergy(), SetwidthBin(), and SolveK().

◆ FillCache()

void PMNS_Base::FillCache ( )
protectedvirtualinherited

If using caching, save the eigensystem in memory

Reimplemented in OscProb::PMNS_LIV, and OscProb::PMNS_SNSI.

Definition at line 157 of file PMNS_Base.cxx.

158{
159 if (fUseCache) {
160 if (fMixCache.size() > fMaxCache) { fMixCache.erase(fMixCache.begin()); }
162 for (int i = 0; i < fNumNus; i++) {
163 fProbe.fEval[i] = fEval[i];
164 for (int j = 0; j < fNumNus; j++) { fProbe.fEvec[i][j] = fEvec[i][j]; }
165 }
166 fMixCache.insert(fProbe);
167 }
168}
double fEnergy
Neutrino energy.
Definition: PMNS_Base.h:292
int fMaxCache
Maximum cache size.
Definition: PMNS_Base.h:303
EigenPoint fProbe
EigenpPoint to try.
Definition: PMNS_Base.h:308
bool fUseCache
Flag for whether to use caching.
Definition: PMNS_Base.h:301
vectorD fEval
Eigenvalues to be cached.
Definition: EigenPoint.h:38
void SetVars(double e=0, NuPath p=NuPath(0, 0), bool n=false)
Set eigensystem parameters.
Definition: EigenPoint.cxx:39
matrixC fEvec
Eigenvectors to be cached.
Definition: EigenPoint.h:39

References OscProb::PMNS_Base::fEnergy, OscProb::EigenPoint::fEval, OscProb::PMNS_Base::fEval, OscProb::EigenPoint::fEvec, OscProb::PMNS_Base::fEvec, OscProb::PMNS_Base::fIsNuBar, OscProb::PMNS_Base::fMaxCache, OscProb::PMNS_Base::fMixCache, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fPath, OscProb::PMNS_Base::fProbe, OscProb::PMNS_Base::fUseCache, and OscProb::EigenPoint::SetVars().

Referenced by OscProb::PMNS_Sterile::SolveHam(), and OscProb::PMNS_Fast::SolveHamMatter().

◆ GetAngle()

double PMNS_Base::GetAngle ( int  i,
int  j 
)
virtualinherited

Get the mixing angle theta_ij in radians.

Requires that i<j. Will notify you if input is wrong. If i>j, will assume reverse order and swap i and j.

Parameters
i,j- the indices of theta_ij

Definition at line 570 of file PMNS_Base.cxx.

571{
572 if (i > j) {
573 cerr << "WARNING: First argument should be smaller than second argument"
574 << endl
575 << " Setting reverse order (Theta" << j << i << "). " << endl;
576 int temp = i;
577 i = j;
578 j = temp;
579 }
580 if (i < 1 || i > fNumNus - 1 || j < 2 || j > fNumNus) {
581 cerr << "ERROR: Theta" << i << j << " not valid for " << fNumNus
582 << " neutrinos. Returning zero." << endl;
583 return 0;
584 }
585
586 return fTheta[i - 1][j - 1];
587}
matrixD fTheta
theta[i][j] mixing angle
Definition: PMNS_Base.h:280

References OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::fTheta.

◆ GetDelta()

double PMNS_Base::GetDelta ( int  i,
int  j 
)
virtualinherited

Get the CP phase delta_ij in radians.

Requires that i+1<j. Will notify you if input is wrong. If i>j, will assume reverse order and swap i and j.

Parameters
i,j- the indices of delta_ij

Definition at line 638 of file PMNS_Base.cxx.

639{
640 if (i > j) {
641 cerr << "WARNING: First argument should be smaller than second argument"
642 << endl
643 << " Setting reverse order (Delta" << j << i << "). " << endl;
644 int temp = i;
645 i = j;
646 j = temp;
647 }
648 if (i < 1 || i > fNumNus - 1 || j < 2 || j > fNumNus) {
649 cerr << "ERROR: Delta" << i << j << " not valid for " << fNumNus
650 << " neutrinos. Returning zero." << endl;
651 return 0;
652 }
653 if (i + 1 == j) {
654 cerr << "WARNING: Rotation " << i << j << " is real. Returning zero."
655 << endl;
656 return 0;
657 }
658
659 return fDelta[i - 1][j - 1];
660}
matrixD fDelta
delta[i][j] CP violating phase
Definition: PMNS_Base.h:281

References OscProb::PMNS_Base::fDelta, and OscProb::PMNS_Base::fNumNus.

◆ GetDm()

double PMNS_Base::GetDm ( int  j)
virtualinherited

Get the mass-splitting dm_j1 = (m_j^2 - m_1^2) in eV^2

Requires that j>1. Will notify you if input is wrong.

Parameters
j- the index of dm_j1

Definition at line 696 of file PMNS_Base.cxx.

697{
698 if (j < 2 || j > fNumNus) {
699 cerr << "ERROR: Dm" << j << "1 not valid for " << fNumNus
700 << " neutrinos. Returning zero." << endl;
701 return 0;
702 }
703
704 return fDm[j - 1];
705}

References OscProb::PMNS_Base::fDm, and OscProb::PMNS_Base::fNumNus.

◆ GetDmEff()

double PMNS_Base::GetDmEff ( int  j)
virtualinherited

Get the effective mass-splitting dm_j1 in matter in eV^2

Requires that j>1. Will notify you if input is wrong.

Parameters
j- the index of dm_j1

Definition at line 732 of file PMNS_Base.cxx.

733{
734 if (j < 2 || j > fNumNus) {
735 cerr << "ERROR: Dm_" << j << "1 not valid for " << fNumNus
736 << " neutrinos. Returning zero." << endl;
737 return 0;
738 }
739
740 // Solve the Hamiltonian to update eigenvalues
741 SolveHam();
742
743 // Sort eigenvalues in same order as vacuum Dm^2
744 vectorI dm_idx = GetSortedIndices(fDm);
745 vectorD dm_idx_double(dm_idx.begin(), dm_idx.end());
746 dm_idx = GetSortedIndices(dm_idx_double);
748
749 // Return difference in eigenvalues * 2E
750 return (fEval[ev_idx[dm_idx[j - 1]]] - fEval[ev_idx[dm_idx[0]]]) * 2 *
752}
virtual void SolveHam()=0
virtual std::vector< int > GetSortedIndices(const vectorD x)
Get indices that sort a vector.
Definition: PMNS_Base.cxx:715
std::vector< int > vectorI
Definition: Definitions.h:16

References OscProb::PMNS_Base::fDm, OscProb::PMNS_Base::fEnergy, OscProb::PMNS_Base::fEval, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::GetSortedIndices(), OscProb::PMNS_Base::kGeV2eV, and OscProb::PMNS_Base::SolveHam().

◆ GetEnergy()

double PMNS_Base::GetEnergy ( )
virtualinherited

Get the neutrino energy in GeV.

Definition at line 255 of file PMNS_Base.cxx.

255{ return fEnergy; }

References OscProb::PMNS_Base::fEnergy.

◆ GetIsNuBar()

bool PMNS_Base::GetIsNuBar ( )
virtualinherited

Get the anti-neutrino flag.

Definition at line 261 of file PMNS_Base.cxx.

261{ return fIsNuBar; }

References OscProb::PMNS_Base::fIsNuBar.

◆ GetMassEigenstate()

vectorC PMNS_Base::GetMassEigenstate ( int  mi)
virtualinherited

Get the neutrino mass eigenstate in vacuum

States are:

  0 = m_1, 1 = m_2, 2 = m_3, etc.
Parameters
mi- the mass eigenstate index
Returns
The mass eigenstate

Definition at line 795 of file PMNS_Base.cxx.

796{
797 vectorC oldState = fNuState;
798
799 ResetToFlavour(mi);
800
801 for (int j = 0; j < fNumNus; j++) {
802 for (int i = 0; i < j; i++) { RotateState(i, j); }
803 }
804
805 vectorC newState = fNuState;
806 fNuState = oldState;
807
808 return newState;
809}
virtual void RotateState(int i, int j)
Rotate the neutrino state by theta_ij and delta_ij.
Definition: PMNS_Base.cxx:760

References OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuState, OscProb::PMNS_Base::ResetToFlavour(), and OscProb::PMNS_Base::RotateState().

◆ GetPath()

vector< NuPath > PMNS_Base::GetPath ( )
virtualinherited

Get the vector of neutrino paths.

Definition at line 300 of file PMNS_Base.cxx.

300{ return fNuPaths; }

References OscProb::PMNS_Base::fNuPaths.

◆ GetProbVector()

vectorD PMNS_Base::GetProbVector ( )
protectedvirtualinherited

Return vector of probabilities from final state

Get the vector of probabilities for current state

Returns
Neutrino oscillation probabilities

Definition at line 1233 of file PMNS_Base.cxx.

1234{
1235 vectorD probs(fNumNus);
1236
1237 for (int i = 0; i < probs.size(); i++) { probs[i] = P(i); }
1238
1239 return probs;
1240}

References OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::P().

Referenced by OscProb::PMNS_Base::ProbVector().

◆ GetSamplePoints()

vectorD PMNS_Base::GetSamplePoints ( double  LoE,
double  dLoE 
)
virtualinherited

Compute the sample points for a bin of L/E with width dLoE

This is used for averaging the probability over a bin of L/E. It should be a private function, but I'm keeping it public for now for debugging purposes. The number of sample points seems too high for most purposes. The number of subdivisions needs to be optimized.

Parameters
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV

Definition at line 1985 of file PMNS_Base.cxx.

1986{
1987 // Solve Hamiltonian to get eigenvalues
1988 SolveHam();
1989
1990 // Define conversion factor [km/GeV -> 1/(4 eV^2)]
1991 const double k1267 = kKm2eV / (4 * kGeV2eV);
1992
1993 // Get list of all effective Dm^2
1994 vectorD effDm;
1995
1996 for (int i = 0; i < fNumNus - 1; i++) {
1997 for (int j = i + 1; j < fNumNus; j++) {
1998 effDm.push_back(2 * kGeV2eV * fEnergy * fabs(fEval[j] - fEval[i]));
1999 }
2000 }
2001
2002 int numDm = effDm.size();
2003
2004 // Sort the effective Dm^2 list
2005 sort(effDm.begin(), effDm.end());
2006
2007 // Set a number of sub-divisions to achieve "good" accuracy
2008 // This needs to be studied better
2009 int n_div = ceil(200 * pow(dLoE / LoE, 0.8) / sqrt(fAvgProbPrec / 1e-4));
2010 // int n_div = 1;
2011
2012 // A vector to store sample points
2013 vectorD allSamples;
2014
2015 // Loop over sub-divisions
2016 for (int k = 0; k < n_div; k++) {
2017 // Define sub-division center and width
2018 double bctr = LoE - dLoE / 2 + (k + 0.5) * dLoE / n_div;
2019 double bwdt = dLoE / n_div;
2020
2021 // Make a vector of L/E sample values
2022 // Initialized in the sub-division center
2023 vectorD samples;
2024 samples.push_back(bctr);
2025
2026 // Loop over all Dm^2 to average each frequency
2027 // This will recursively sample points in smaller
2028 // bins so that all relevant frequencies are used
2029 for (int i = 0; i < numDm; i++) {
2030 // Copy the list of sample L/E values
2031 vectorD prev = samples;
2032
2033 // Redefine bin width to lie within full sub-division
2034 double Width =
2035 2 * min(prev[0] - (bctr - bwdt / 2), (bctr + bwdt / 2) - prev[0]);
2036
2037 // Compute oscillation argument sorted from lowest to highest
2038 const double arg = k1267 * effDm[i] * Width;
2039
2040 // Skip small oscillation values.
2041 // If it's the last one, lower the tolerance
2042 if (i < numDm - 1) {
2043 if (arg < 0.9) continue;
2044 }
2045 else {
2046 if (arg < 0.1) continue;
2047 }
2048
2049 // Reset samples to redefine them
2050 samples.clear();
2051
2052 // Loop over previous samples
2053 for (int j = 0; j < int(prev.size()); j++) {
2054 // Compute new sample points around old samples
2055 // This is based on a oscillatory quadrature rule
2056 double sample = (1 / sqrt(3)) * (Width / 2);
2057 if (arg != 0) sample = acos(sin(arg) / arg) / arg * (Width / 2);
2058
2059 // Add samples above and below center
2060 samples.push_back(prev[j] - sample);
2061 samples.push_back(prev[j] + sample);
2062 }
2063
2064 } // End of loop over Dm^2
2065
2066 // Add sub-division samples to the end of allSamples vector
2067 allSamples.insert(allSamples.end(), samples.begin(), samples.end());
2068
2069 } // End of loop over sub-divisions
2070
2071 // Return all sample points
2072 return allSamples;
2073}
double fAvgProbPrec
AvgProb precision.
Definition: PMNS_Base.h:305

References OscProb::PMNS_Base::fAvgProbPrec, OscProb::PMNS_Base::fEnergy, OscProb::PMNS_Base::fEval, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::kGeV2eV, OscProb::PMNS_Base::kKm2eV, and OscProb::PMNS_Base::SolveHam().

Referenced by OscProb::PMNS_Base::AvgProbLoE(), OscProb::PMNS_Base::AvgProbMatrixLoE(), and OscProb::PMNS_Base::AvgProbVectorLoE().

◆ GetSamplePointsAvgClass() [1/3]

vectorD PMNS_Maltoni::GetSamplePointsAvgClass ( double  E,
double  cosT,
double  dcosT 
)
protectedvirtual

Compute the sample points for a bin of cosTheta with width dcosTheta

This is used to increase the precision of the average probability over a bin of cosT, calculated using the Maltoni method.

Parameters
E- The neutrino Energy value GeV
cosT- The neutrino cosT value in the bin center
dcosT- The cosT bin width
Returns
Vector of sample cosT points

Definition at line 1243 of file PMNS_Maltoni.cxx.

1245{
1246 // Set a number of sub-divisions to achieve "good" accuracy
1247 // This needs to be studied better
1248 int n_div = ceil(35 * pow(E, -0.4) * pow(abs(dcosT / cosT), 0.8) /
1249 sqrt(fAvgProbPrec / 1e-4));
1250
1251 // A vector to store sample points
1252 vectorD Samples;
1253
1254 // Define sub-division width
1255 Samples.push_back(dcosT / n_div);
1256
1257 // Loop over sub-divisions
1258 for (int k = 0; k < n_div; k++) {
1259 // Define sub-division center
1260 double bctr = cosT - dcosT / 2 + (k + 0.5) * dcosT / n_div;
1261
1262 Samples.push_back(bctr);
1263
1264 } // End of loop over sub-divisions
1265
1266 // Return sample points
1267 return Samples;
1268}

References OscProb::PMNS_Base::fAvgProbPrec.

◆ GetSamplePointsAvgClass() [2/3]

matrixC PMNS_Maltoni::GetSamplePointsAvgClass ( double  InvE,
double  dInvE,
double  cosT,
double  dcosT 
)
protectedvirtual

Compute the sample points for a bin of E and cosT with width dE and dcosT

Compute the sample points for a bin of 1oE and cosTheta with width d1oE and dcosTheta

This is used to increase the precision of the average probability over a bin of L/E and cosT, calculated using the Maltoni method.

Parameters
InvE- The neutrino 1/E value in the bin center in GeV-1
dInvE- The 1/E bin width in GeV-1
cosT- The neutrino cosT value in the bin center
dcosT- The cosT bin width
Returns
Matrix of sample InvE and cosT points

Definition at line 1131 of file PMNS_Maltoni.cxx.

1133{
1134 // Set a number of sub-divisions to achieve "good" accuracy
1135 // This needs to be studied better
1136 int n_divCosT = ceil(380 * pow(InvE, 0.5) * pow(abs(dcosT / cosT), 0.8) /
1137 sqrt(fAvgProbPrec / 1e-4));
1138 int n_divE = ceil(260 * pow(dInvE / InvE, 0.8) * pow(InvE, 0.6) /
1139 sqrt(fAvgProbPrec / 1e-4));
1140
1141 // A matrix to store sample points
1142 matrixC Samples = matrixC(n_divE + 1, vectorC(n_divCosT + 1, 0));
1143
1144 // Define sub-division width
1145 Samples[0][0] = complexD(dInvE / n_divE, dcosT / n_divCosT);
1146
1147 // Loop over sub-divisions
1148 for (int k = 0; k < n_divE; k++) {
1149 // Define sub-division center for energy
1150 double bctr_InvE = InvE - dInvE / 2 + (k + 0.5) * dInvE / n_divE;
1151
1152 for (int l = 0; l < n_divCosT; l++) {
1153 // Define sub-division center for angle
1154 double bctr_CosT = cosT - dcosT / 2 + (l + 0.5) * dcosT / n_divCosT;
1155
1156 Samples[k + 1][l + 1] = complexD(bctr_InvE, bctr_CosT);
1157 }
1158
1159 } // End of loop over sub-divisions
1160
1161 // Return sample points
1162 return Samples;
1163}

References OscProb::PMNS_Base::fAvgProbPrec.

◆ GetSamplePointsAvgClass() [3/3]

vectorD PMNS_Maltoni::GetSamplePointsAvgClass ( double  LoE,
double  dLoE 
)
protectedvirtual

Compute the sample points for a bin of L/E with width dLoE.

This is used to increase the precision of the average probability over a bin of L/E, calculated using the Maltoni method.

Parameters
LoE- The neutrino L/E value in the bin center in km/GeV
dLoE- The L/E bin width in km/GeV
Returns
Vector of sample L/E points

Definition at line 628 of file PMNS_Maltoni.cxx.

629{
630 // Set a number of sub-divisions to achieve "good" accuracy
631 // This needs to be studied better
632 int n_div = ceil(3 * pow(dLoE / LoE, 0.8) * pow(LoE, 0.3) /
633 sqrt(fAvgProbPrec / 1e-4));
634
635 // A vector to store sample points
636 vectorD Samples;
637
638 // Define sub-division width
639 Samples.push_back(dLoE / n_div);
640
641 // Loop over sub-divisions
642 for (int k = 0; k < n_div; k++) {
643 // Define sub-division center
644 double bctr = LoE - dLoE / 2 + (k + 0.5) * dLoE / n_div;
645
646 Samples.push_back(bctr);
647
648 } // End of loop over sub-divisions
649
650 // Return sample points
651 return Samples;
652}

References OscProb::PMNS_Base::fAvgProbPrec.

Referenced by AvgProbLoE(), AvgProbMatrixLoE(), and AvgProbVectorLoE().

◆ GetSortedIndices()

vectorI PMNS_Base::GetSortedIndices ( const vectorD  x)
protectedvirtualinherited

Get the indices of the sorted x vector

Parameters
x- input vector
Returns
The vector of sorted indices

Definition at line 715 of file PMNS_Base.cxx.

716{
717 vectorI idx(x.size(), 0);
718 for (int i = 0; i < x.size(); i++) idx[i] = i;
719 sort(idx.begin(), idx.end(), IdxCompare(x));
720
721 return idx;
722}
An index sorting comparator.
Definition: PMNS_Base.h:312

Referenced by OscProb::PMNS_Base::GetDmEff().

◆ HadamardProduct()

void PMNS_Maltoni::HadamardProduct ( vectorD  lambda,
double  dbin 
)
protectedvirtual

Apply an Hadamard Product to the density matrix

Parameters
lambda- Eigenvalues of the K matrix
dbin- Width of the bin

Definition at line 1209 of file PMNS_Maltoni.cxx.

1210{
1211 matrixC sinc = matrixC(fNumNus, vectorC(fNumNus, 0));
1212 for (int j = 0; j < fNumNus; j++) {
1213 for (int i = 0; i < j; i++) {
1214 double arg = (lambda[i] - lambda[j]) * dbin;
1215 sinc[i][j] = sin(arg) / arg;
1216
1217 sinc[j][i] = sinc[i][j];
1218 }
1219 }
1220
1221 for (int i = 0; i < fNumNus; i++) { sinc[i][i] = 1; }
1222
1223 for (int j = 0; j < fNumNus; j++) {
1224 for (int i = 0; i < fNumNus; i++) {
1225 fdensityMatrix[i][j] = fdensityMatrix[i][j] * sinc[i][j];
1226 }
1227 }
1228}

References fdensityMatrix, and OscProb::PMNS_Base::fNumNus.

Referenced by AlgorithmDensityMatrix().

◆ InitializeTaylorsVectors()

void PMNS_Maltoni::InitializeTaylorsVectors ( )
protectedvirtual

Set vector sizes and initialize elements to zero. Initialize diagonal elements of S to one

Definition at line 37 of file PMNS_Maltoni.cxx.

38{
40
43 fKInvE = Eigen::MatrixXcd::Zero(fNumNus, fNumNus);
44
47 fKcosT = Eigen::MatrixXcd::Zero(fNumNus, fNumNus);
48
50
54
55 for (int i = 0; i < fNumNus; i++) { fevolutionMatrixS[i][i] = 1; }
56
57 fLayer = fPrem.GetPremLayers().size() - 1;
58
59 fdl = -1;
60
62}
int fdl
Length derivative.
Definition: PMNS_Maltoni.h:210
int fLayer
Layer index.
Definition: PMNS_Maltoni.h:209
matrixC fSflavor
S matrix for one layer.
Definition: PMNS_Maltoni.h:202
virtual double GetDetRadius()
Definition: PremModel.cxx:429
virtual std::vector< PremLayer > GetPremLayers()
Definition: PremModel.cxx:145

References fdensityMatrix, fDetRadius, fdl, fevolutionMatrixS, fKcosT, fKflavor, fKInvE, fKmass, flambdaCosT, flambdaInvE, fLayer, OscProb::PMNS_Base::fNumNus, fPrem, fSflavor, fVcosT, fVInvE, OscProb::PremModel::GetDetRadius(), and OscProb::PremModel::GetPremLayers().

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), ExtrapolationProb(), ExtrapolationProbCosT(), ExtrapolationProbLoE(), and PMNS_Maltoni().

◆ InitializeVectors()

void PMNS_Base::InitializeVectors ( )
protectedvirtualinherited

Initialize all member vectors with zeros

Set vector sizes and initialize elements to zero.

Definition at line 79 of file PMNS_Base.cxx.

80{
81 fDm = vectorD(fNumNus, 0);
84
87
90
91 fEval = vectorD(fNumNus, 0);
93}
static const complexD zero
zero in complex
Definition: PMNS_Base.h:211
vectorC fBuffer
Buffer for neutrino state tranformations.
Definition: PMNS_Base.h:287
vectorC fPhases
Buffer for oscillation phases.
Definition: PMNS_Base.h:286

Referenced by OscProb::PMNS_Base::PMNS_Base().

◆ LnDerivative()

double PMNS_Maltoni::LnDerivative ( )
protectedvirtual

Compute the derivative of one layer's length depending on the angle

Definition at line 189 of file PMNS_Maltoni.cxx.

190{
191 double dL = 0;
192
193 double L1 = pow(fPrem.GetPremLayers()[fLayer].radius, 2) - fminRsq;
194
195 double L2 = -fminRsq;
196 if (fLayer > 0) L2 += pow(fPrem.GetPremLayers()[fLayer - 1].radius, 2);
197
198 bool ismin = (L2 <= 0 && fcosT < 0);
199
200 if (ismin)
201 dL = 2 * pow(fDetRadius, 2) * fcosT * pow(L1, -0.5);
202 else
203 dL = pow(fDetRadius, 2) * fcosT * (pow(L1, -0.5) - pow(L2, -0.5));
204
205 if (ismin) fdl = 1;
206
207 fLayer += fdl;
208
209 return dL;
210}
double fcosT
Cosine of zenith angle.
Definition: PMNS_Maltoni.h:184

References fcosT, fDetRadius, fdl, fLayer, fminRsq, fPrem, and OscProb::PremModel::GetPremLayers().

Referenced by BuildKcosT().

◆ MultiplicationRuleK()

void PMNS_Maltoni::MultiplicationRuleK ( Eigen::MatrixXcd &  K)
protectedvirtual

Product between two K matrices.

This is used to calculate the matrix K corresponding to the propagation between the beginning of the path and the end of the current layer.

The matrix fKflavor correspond to the propagation between the beginning and the end of the layer.

Parameters
K- The current K matrix

Definition at line 305 of file PMNS_Maltoni.cxx.

306{
307 for (int i = 0; i < fNumNus; i++) {
308 complexD buffer[fNumNus];
309
310 for (int l = 0; l < fNumNus; l++) {
311 for (int k = 0; k < fNumNus; k++) {
312 buffer[l] += conj(fevolutionMatrixS[k][i]) * fKflavor[k][l];
313 }
314 }
315
316 for (int j = 0; j <= i; j++) {
317 for (int l = 0; l < fNumNus; l++) {
318 K(i, j) += buffer[l] * fevolutionMatrixS[l][j];
319 }
320
321 if (i != j) { K(j, i) = conj(K(i, j)); }
322 }
323 }
324}

References fevolutionMatrixS, fKflavor, and OscProb::PMNS_Base::fNumNus.

Referenced by PropagatePathTaylor().

◆ MultiplicationRuleS()

void PMNS_Maltoni::MultiplicationRuleS ( )
protectedvirtual

Product between two S matrices.

This is used to calculate the matrix S corresponding to the propagation between the beginning of the path and the end of the current layer.

The matrix fevolutionMatrixS represent the propagation between the beginning of the path and the beginning of the current layer. This matrix is updated after every layer with this function. The matrix fSflavor represent the propagation between the beginning and the end of the layer.

Definition at line 276 of file PMNS_Maltoni.cxx.

277{
278 complexD save[fNumNus];
279
280 for (int j = 0; j < fNumNus; j++) {
281 for (int n = 0; n < fNumNus; n++) { save[n] = fevolutionMatrixS[n][j]; }
282
283 for (int i = 0; i < fNumNus; i++) {
284 fevolutionMatrixS[i][j] = 0;
285
286 for (int k = 0; k < fNumNus; k++) {
287 fevolutionMatrixS[i][j] += fSflavor[i][k] * save[k];
288 }
289 }
290 }
291}

References fevolutionMatrixS, OscProb::PMNS_Base::fNumNus, and fSflavor.

Referenced by PropagatePathTaylor().

◆ P()

double PMNS_Base::P ( int  flv)
protectedvirtualinherited

Compute oscillation probability of flavour flv from current state

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flv- The neutrino final flavour.
Returns
Neutrino oscillation probability

Reimplemented in OscProb::PMNS_DensityMatrix.

Definition at line 1058 of file PMNS_Base.cxx.

1059{
1060 assert(flv >= 0 && flv < fNumNus);
1061 return norm(fNuState[flv]);
1062}

References OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::fNuState.

Referenced by AvgFormula(), AvgFormulaExtrapolation(), OscProb::PMNS_Base::GetProbVector(), and OscProb::PMNS_Base::Prob().

◆ Prob() [1/6]

double PMNS_Base::Prob ( int  flvi,
int  flvf 
)
virtualinherited

Compute the probability of flvi going to flvf.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
Returns
Neutrino oscillation probability

Definition at line 1091 of file PMNS_Base.cxx.

1092{
1093 ResetToFlavour(flvi);
1094
1095 Propagate();
1096
1097 return P(flvf);
1098}
virtual void Propagate()
Propagate neutrino through full path.
Definition: PMNS_Base.cxx:1018

References OscProb::PMNS_Base::P(), OscProb::PMNS_Base::Propagate(), and OscProb::PMNS_Base::ResetToFlavour().

◆ Prob() [2/6]

double PMNS_Base::Prob ( int  flvi,
int  flvf,
double  E 
)
virtualinherited

Compute the probability of flvi going to flvf for energy E

Compute the probability of flvi going to flvf for a given energy in GeV.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
Returns
Neutrino oscillation probability

Definition at line 1160 of file PMNS_Base.cxx.

1161{
1162 SetEnergy(E);
1163
1164 return Prob(flvi, flvf);
1165}

References OscProb::PMNS_Base::Prob(), and OscProb::PMNS_Base::SetEnergy().

◆ Prob() [3/6]

double PMNS_Base::Prob ( int  flvi,
int  flvf,
double  E,
double  L 
)
virtualinherited

Compute the probability of flvi going to flvf for energy E and distance L

Compute the probability of flvi going to flvf for a given energy in GeV and distance in km in a single path.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost.

Don't use this if you want to propagate over multiple path segments.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
L- The neutrino path length in km
Returns
Neutrino oscillation probability

Definition at line 1219 of file PMNS_Base.cxx.

1220{
1221 SetEnergy(E);
1222 SetLength(L);
1223
1224 return Prob(flvi, flvf);
1225}
virtual void SetLength(double L)
Set a single path lentgh in km.
Definition: PMNS_Base.cxx:391

References OscProb::PMNS_Base::Prob(), OscProb::PMNS_Base::SetEnergy(), and OscProb::PMNS_Base::SetLength().

◆ Prob() [4/6]

double PMNS_Base::Prob ( vectorC  nu_in,
int  flvf 
)
virtualinherited

Compute the probability of nu_in going to flvf.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nu_in- The neutrino initial state in flavour basis.
flvf- The neutrino final flavour.
Returns
Neutrino oscillation probability

Definition at line 1114 of file PMNS_Base.cxx.

1115{
1116 SetPureState(nu_in);
1117
1118 Propagate();
1119
1120 return P(flvf);
1121}
virtual void SetPureState(vectorC nu_in)
Set the initial state from a pure state.
Definition: PMNS_Base.cxx:1070

References OscProb::PMNS_Base::P(), OscProb::PMNS_Base::Propagate(), and OscProb::PMNS_Base::SetPureState().

Referenced by AvgProb(), OscProb::PMNS_Base::AvgProb(), AvgProbLoE(), OscProb::PMNS_Base::AvgProbLoE(), and OscProb::PMNS_Base::Prob().

◆ Prob() [5/6]

double PMNS_Base::Prob ( vectorC  nu_in,
int  flvf,
double  E 
)
virtualinherited

Compute the probability of nu_in going to flvf for energy E

Compute the probability of nu_in going to flvf for a given energy in GeV.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nu_in- The neutrino initial state in flavour basis.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
Returns
Neutrino oscillation probability

Definition at line 1138 of file PMNS_Base.cxx.

1139{
1140 SetEnergy(E);
1141
1142 return Prob(nu_in, flvf);
1143}

References OscProb::PMNS_Base::Prob(), and OscProb::PMNS_Base::SetEnergy().

◆ Prob() [6/6]

double PMNS_Base::Prob ( vectorC  nu_in,
int  flvf,
double  E,
double  L 
)
virtualinherited

Compute the probability of nu_in going to flvf for energy E and distance L

Compute the probability of nu_in going to flvf for a given energy in GeV and distance in km in a single path.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost.

Don't use this if you want to propagate over multiple path segments.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nu_in- The neutrino initial state in flavour basis.
flvf- The neutrino final flavour.
E- The neutrino energy in GeV
L- The neutrino path length in km
Returns
Neutrino oscillation probability

Definition at line 1189 of file PMNS_Base.cxx.

1190{
1191 SetEnergy(E);
1192 SetLength(L);
1193
1194 return Prob(nu_in, flvf);
1195}

References OscProb::PMNS_Base::Prob(), OscProb::PMNS_Base::SetEnergy(), and OscProb::PMNS_Base::SetLength().

◆ ProbMatrix() [1/3]

matrixD PMNS_Base::ProbMatrix ( int  nflvi,
int  nflvf 
)
virtualinherited

Compute the probability matrix for the first nflvi and nflvf states.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nflvi- The number of initial flavours in the matrix.
nflvf- The number of final flavours in the matrix.
Returns
Neutrino oscillation probabilities

Reimplemented in OscProb::PMNS_DensityMatrix, OscProb::PMNS_DensityMatrix, OscProb::PMNS_NUNM, and OscProb::PMNS_OQS.

Definition at line 1387 of file PMNS_Base.cxx.

1388{
1389 assert(nflvi <= fNumNus && nflvi >= 0);
1390 assert(nflvf <= fNumNus && nflvf >= 0);
1391
1392 // Output probabilities
1393 matrixD probs(nflvi, vectorD(nflvf));
1394
1395 // List of states
1396 matrixC allstates(nflvi, vectorC(fNumNus));
1397
1398 // Reset all initial states
1399 for (int i = 0; i < nflvi; i++) {
1400 ResetToFlavour(i);
1401 allstates[i] = fNuState;
1402 }
1403
1404 // Propagate all states in parallel
1405 for (int i = 0; i < int(fNuPaths.size()); i++) {
1406 for (int flvi = 0; flvi < nflvi; flvi++) {
1407 fNuState = allstates[flvi];
1409 allstates[flvi] = fNuState;
1410 }
1411 }
1412
1413 // Get all probabilities
1414 for (int flvi = 0; flvi < nflvi; flvi++) {
1415 for (int flvj = 0; flvj < nflvf; flvj++) {
1416 probs[flvi][flvj] = norm(allstates[flvi][flvj]);
1417 }
1418 }
1419
1420 return probs;
1421}
virtual void PropagatePath(NuPath p)
Propagate neutrino through a single path.
Definition: PMNS_Base.cxx:983

References OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuPaths, OscProb::PMNS_Base::fNuState, OscProb::PMNS_Base::PropagatePath(), and OscProb::PMNS_Base::ResetToFlavour().

Referenced by AvgProbMatrix(), OscProb::PMNS_Base::AvgProbMatrix(), AvgProbMatrixLoE(), OscProb::PMNS_Base::AvgProbMatrixLoE(), and OscProb::PMNS_Base::ProbMatrix().

◆ ProbMatrix() [2/3]

matrixD PMNS_Base::ProbMatrix ( int  nflvi,
int  nflvf,
double  E 
)
virtualinherited

Compute the probability matrix for the first nflvi and nflvf states for a given energy in GeV.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nflvi- The number of initial flavours in the matrix.
nflvf- The number of final flavours in the matrix.
E- The neutrino energy in GeV
Returns
Neutrino oscillation probabilities

Reimplemented in OscProb::PMNS_DensityMatrix.

Definition at line 1439 of file PMNS_Base.cxx.

1440{
1441 SetEnergy(E);
1442
1443 return ProbMatrix(nflvi, nflvf);
1444}

References OscProb::PMNS_Base::ProbMatrix(), and OscProb::PMNS_Base::SetEnergy().

◆ ProbMatrix() [3/3]

matrixD PMNS_Base::ProbMatrix ( int  nflvi,
int  nflvf,
double  E,
double  L 
)
virtualinherited

Compute the probability matrix for energy E and distance L

Compute the probability matrix for the first nflvi and nflvf states for a given energy in GeV and distance in km in a single path.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost.

Don't use this if you want to propagate over multiple path segments.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
nflvi- The number of initial flavours in the matrix.
nflvf- The number of final flavours in the matrix.
E- The neutrino energy in GeV
L- The neutrino path length in km
Returns
Neutrino oscillation probabilities

Reimplemented in OscProb::PMNS_DensityMatrix.

Definition at line 1468 of file PMNS_Base.cxx.

1469{
1470 SetEnergy(E);
1471 SetLength(L);
1472
1473 return ProbMatrix(nflvi, nflvf);
1474}

References OscProb::PMNS_Base::ProbMatrix(), OscProb::PMNS_Base::SetEnergy(), and OscProb::PMNS_Base::SetLength().

◆ ProbVector() [1/6]

vectorD PMNS_Base::ProbVector ( int  flvi)
virtualinherited

Compute the probabilities of flvi going to all flavours

Compute the probability of flvi going to all flavours.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
Returns
Neutrino oscillation probabilities

Definition at line 1272 of file PMNS_Base.cxx.

1273{
1274 ResetToFlavour(flvi);
1275
1276 Propagate();
1277
1278 return GetProbVector();
1279}
virtual vectorD GetProbVector()
Definition: PMNS_Base.cxx:1233

References OscProb::PMNS_Base::GetProbVector(), OscProb::PMNS_Base::Propagate(), and OscProb::PMNS_Base::ResetToFlavour().

◆ ProbVector() [2/6]

vectorD PMNS_Base::ProbVector ( int  flvi,
double  E 
)
virtualinherited

Compute the probabilities of flvi going to all flavours for energy E

Compute the probability of flvi going to all flavours for a given energy in GeV.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
E- The neutrino energy in GeV
Returns
Neutrino oscillation probability

Definition at line 1313 of file PMNS_Base.cxx.

1314{
1315 SetEnergy(E);
1316
1317 return ProbVector(flvi);
1318}

References OscProb::PMNS_Base::ProbVector(), and OscProb::PMNS_Base::SetEnergy().

◆ ProbVector() [3/6]

vectorD PMNS_Base::ProbVector ( int  flvi,
double  E,
double  L 
)
virtualinherited

Compute the probabilities of flvi going to all flavours for energy E and distance L

Compute the probability of flvi going to all flavours for a given energy in GeV and distance in km in a single path.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost.

Don't use this if you want to propagate over multiple path segments.

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flvi- The neutrino starting flavour.
E- The neutrino energy in GeV
L- The neutrino path length in km
Returns
Neutrino oscillation probability

Definition at line 1365 of file PMNS_Base.cxx.

1366{
1367 SetEnergy(E);
1368 SetLength(L);
1369
1370 return ProbVector(flvi);
1371}

References OscProb::PMNS_Base::ProbVector(), OscProb::PMNS_Base::SetEnergy(), and OscProb::PMNS_Base::SetLength().

◆ ProbVector() [4/6]

vectorD PMNS_Base::ProbVector ( vectorC  nu_in)
virtualinherited

Compute the probabilities of nu_in going to all flavours

Compute the probability of nu_in going to all flavours.

Parameters
nu_in- The neutrino initial state in flavour basis.
Returns
Neutrino oscillation probabilities

Definition at line 1250 of file PMNS_Base.cxx.

1251{
1252 SetPureState(nu_in);
1253
1254 Propagate();
1255
1256 return GetProbVector();
1257}

References OscProb::PMNS_Base::GetProbVector(), OscProb::PMNS_Base::Propagate(), and OscProb::PMNS_Base::SetPureState().

Referenced by AvgProbVector(), OscProb::PMNS_Base::AvgProbVector(), AvgProbVectorLoE(), OscProb::PMNS_Base::AvgProbVectorLoE(), and OscProb::PMNS_Base::ProbVector().

◆ ProbVector() [5/6]

vectorD PMNS_Base::ProbVector ( vectorC  nu_in,
double  E 
)
virtualinherited

Compute the probabilities of nu_in going to all

Compute the probability of nu_in going to all flavours for a given energy in GeV.

Parameters
nu_in- The neutrino initial state in flavour basis.
E- The neutrino energy in GeV
Returns
Neutrino oscillation probabilities

Definition at line 1291 of file PMNS_Base.cxx.

1292{
1293 SetEnergy(E);
1294
1295 return ProbVector(nu_in);
1296}

References OscProb::PMNS_Base::ProbVector(), and OscProb::PMNS_Base::SetEnergy().

◆ ProbVector() [6/6]

vectorD PMNS_Base::ProbVector ( vectorC  nu_in,
double  E,
double  L 
)
virtualinherited

Compute the probabilities of nu_in going to all flavours for energy E and distance L

Compute the probability of nu_in going to all flavours for a given energy in GeV and distance in km in a single path.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost.

Don't use this if you want to propagate over multiple path segments.

Parameters
nu_in- The neutrino initial state in flavour basis.
E- The neutrino energy in GeV
L- The neutrino path length in km
Returns
Neutrino oscillation probabilities

Definition at line 1336 of file PMNS_Base.cxx.

1337{
1338 SetEnergy(E);
1339 SetLength(L);
1340
1341 return ProbVector(nu_in);
1342}

References OscProb::PMNS_Base::ProbVector(), OscProb::PMNS_Base::SetEnergy(), and OscProb::PMNS_Base::SetLength().

◆ Propagate()

void PMNS_Base::Propagate ( )
protectedvirtualinherited

Propagate neutrino state through full path

Reimplemented in OscProb::PMNS_NUNM, and OscProb::PMNS_OQS.

Definition at line 1018 of file PMNS_Base.cxx.

1019{
1020 for (int i = 0; i < int(fNuPaths.size()); i++) { PropagatePath(fNuPaths[i]); }
1021}

References OscProb::PMNS_Base::fNuPaths, and OscProb::PMNS_Base::PropagatePath().

Referenced by OscProb::PMNS_Base::Prob(), OscProb::PMNS_Base::ProbVector(), OscProb::PMNS_NUNM::Propagate(), and OscProb::PMNS_OQS::Propagate().

◆ PropagatePath()

void PMNS_Base::PropagatePath ( NuPath  p)
protectedvirtualinherited

Propagate the current neutrino state through a given path

Parameters
p- A neutrino path segment

Reimplemented in OscProb::PMNS_Decay, OscProb::PMNS_Deco, OscProb::PMNS_Iter, OscProb::PMNS_NUNM, OscProb::PMNS_OQS, and OscProb::PMNS_DensityMatrix.

Definition at line 983 of file PMNS_Base.cxx.

984{
985 // Set the neutrino path
986 SetCurPath(p);
987
988 // Solve for eigensystem
989 SolveHam();
990
991 double LengthIneV = kKm2eV * p.length;
992 for (int i = 0; i < fNumNus; i++) {
993 double arg = fEval[i] * LengthIneV;
994 fPhases[i] = complexD(cos(arg), -sin(arg));
995 }
996
997 for (int i = 0; i < fNumNus; i++) {
998 fBuffer[i] = 0;
999 for (int j = 0; j < fNumNus; j++) {
1000 fBuffer[i] += conj(fEvec[j][i]) * fNuState[j];
1001 }
1002 fBuffer[i] *= fPhases[i];
1003 }
1004
1005 // Propagate neutrino state
1006 for (int i = 0; i < fNumNus; i++) {
1007 fNuState[i] = 0;
1008 for (int j = 0; j < fNumNus; j++) {
1009 fNuState[i] += fEvec[i][j] * fBuffer[j];
1010 }
1011 }
1012}

References OscProb::PMNS_Base::fBuffer, OscProb::PMNS_Base::fEval, OscProb::PMNS_Base::fEvec, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuState, OscProb::PMNS_Base::fPhases, OscProb::PMNS_Base::kKm2eV, OscProb::NuPath::length, OscProb::PMNS_Base::SetCurPath(), and OscProb::PMNS_Base::SolveHam().

Referenced by OscProb::PMNS_Base::ProbMatrix(), OscProb::PMNS_Base::Propagate(), OscProb::PMNS_Iter::PropagatePath(), and OscProb::PMNS_NUNM::PropagatePath().

◆ PropagatePathTaylor()

void PMNS_Maltoni::PropagatePathTaylor ( NuPath  p)
protectedvirtual

Propagate the current neutrino state through a given path

Parameters
p- A neutrino path segment

Definition at line 343 of file PMNS_Maltoni.cxx.

344{
345 // Set the neutrino path
346 SetCurPath(p);
347
348 // Solve for eigensystem
349 SolveHam();
350
351 // Get the evolution matrix in mass basis
352 double LengthIneV = kKm2eV * p.length;
353 for (int i = 0; i < fNumNus; i++) {
354 double arg = fEval[i] * LengthIneV;
355 fPhases[i] = complexD(cos(arg), -sin(arg));
356 }
357
358 // Rotate S in flavor basis
359 rotateS();
360
361 // if avg on E
362 if (fdInvE != 0) {
363 // Build KE in mass basis
364 BuildKE(p.length);
365
366 // Rotate KE in flavor basis
367 rotateK();
368
369 // Multiply this layer K's with the previous path K's
371 }
372 // if avg on cosT
373 if (fdcosT != 0) {
374 // Build KcosT in mass basis
375 BuildKcosT();
376
377 // Multiply this layer K's with the previous path K's
379 }
380
381 // Multiply this layer S's with the previous path S's
383}
virtual void MultiplicationRuleS()
Product between two S matrices.
virtual void rotateK()
Rotate one K matrix.
virtual void BuildKcosT()
build K matrix for angle in flavor basis
virtual void rotateS()
Rotate the S matrix.
virtual void BuildKE(double L)
build K matrix for the inverse of energy in mass basis
virtual void MultiplicationRuleK(Eigen::MatrixXcd &K)
Product between two K matrices.

References BuildKcosT(), BuildKE(), fdcosT, fdInvE, OscProb::PMNS_Base::fEval, fKcosT, fKInvE, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fPhases, OscProb::PMNS_Base::kKm2eV, OscProb::NuPath::length, MultiplicationRuleK(), MultiplicationRuleS(), rotateK(), rotateS(), OscProb::PMNS_Base::SetCurPath(), and OscProb::PMNS_Base::SolveHam().

Referenced by PropagateTaylor().

◆ PropagateTaylor()

void PMNS_Maltoni::PropagateTaylor ( )
protectedvirtual

Propagate neutrino state through full path

Definition at line 330 of file PMNS_Maltoni.cxx.

331{
332 for (int i = 0; i < int(fNuPaths.size()); i++) {
334 }
335}
virtual void PropagatePathTaylor(NuPath p)
Propagate neutrino through a single path.

References OscProb::PMNS_Base::fNuPaths, and PropagatePathTaylor().

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), ExtrapolationProb(), ExtrapolationProbCosT(), and ExtrapolationProbLoE().

◆ ResetToFlavour()

void PMNS_Base::ResetToFlavour ( int  flv)
protectedvirtualinherited

Reset the neutrino state back to a pure flavour where it starts

Flavours are:

  0 = nue, 1 = numu, 2 = nutau
  3 = sterile_1, 4 = sterile_2, etc.
Parameters
flv- The neutrino starting flavour.

Reimplemented in OscProb::PMNS_DensityMatrix.

Definition at line 1034 of file PMNS_Base.cxx.

1035{
1036 assert(flv >= 0 && flv < fNumNus);
1037 for (int i = 0; i < fNumNus; ++i) {
1038 if (i == flv)
1039 fNuState[i] = one;
1040 else
1041 fNuState[i] = zero;
1042 }
1043}
static const complexD one
one in complex
Definition: PMNS_Base.h:212

References OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fNuState, OscProb::PMNS_Base::one, and OscProb::PMNS_Base::zero.

Referenced by OscProb::PMNS_Base::AvgProb(), OscProb::PMNS_Base::AvgProbLoE(), OscProb::PMNS_Base::AvgProbVector(), OscProb::PMNS_Base::AvgProbVectorLoE(), OscProb::PMNS_Base::GetMassEigenstate(), OscProb::PMNS_Base::PMNS_Base(), OscProb::PMNS_Base::Prob(), OscProb::PMNS_Base::ProbMatrix(), OscProb::PMNS_NUNM::ProbMatrix(), OscProb::PMNS_Base::ProbVector(), and OscProb::PMNS_DensityMatrix::ResetToFlavour().

◆ RotateDensityM()

void PMNS_Maltoni::RotateDensityM ( bool  to_basis,
matrixC  V 
)
protectedvirtual

Apply rotation to the density matrix from or to the basis where V is diagonal

Parameters
to_basis- Rotation from (false) or to (true)
V- The matrix used for the denisty matrix rotation.

Definition at line 1173 of file PMNS_Maltoni.cxx.

1174{
1175 matrixC Buffer = matrixC(fNumNus, vectorC(fNumNus, 0));
1176
1177 for (int i = 0; i < fNumNus; i++) {
1178 for (int j = 0; j < fNumNus; j++) {
1179 for (int k = 0; k < fNumNus; k++) {
1180 if (to_basis)
1181 Buffer[i][j] += fdensityMatrix[i][k] * V[k][j];
1182 else
1183 Buffer[i][j] += fdensityMatrix[i][k] * conj(V[j][k]);
1184 }
1185 }
1186 }
1187
1188 for (int i = 0; i < fNumNus; i++) {
1189 for (int j = i; j < fNumNus; j++) {
1190 fdensityMatrix[i][j] = 0;
1191 for (int k = 0; k < fNumNus; k++) {
1192 if (to_basis)
1193 fdensityMatrix[i][j] += conj(V[k][i]) * Buffer[k][j];
1194 else
1195 fdensityMatrix[i][j] += V[i][k] * Buffer[k][j];
1196 }
1197 if (j > i) fdensityMatrix[j][i] = conj(fdensityMatrix[i][j]);
1198 }
1199 }
1200}

References fdensityMatrix, and OscProb::PMNS_Base::fNumNus.

Referenced by AlgorithmDensityMatrix().

◆ RotateH()

void PMNS_Base::RotateH ( int  i,
int  j,
matrixC Ham 
)
protectedvirtualinherited

Rotate the Hamiltonian by the angle theta_ij and phase delta_ij.

The rotations assume all off-diagonal elements with i > j are zero. This is correct if the order of rotations is chosen appropriately and it speeds up computation by skipping null terms

Parameters
i,j- the indices of the rotation ij
Ham- the Hamiltonian to be rotated

Definition at line 822 of file PMNS_Base.cxx.

823{
824 // Do nothing if angle is zero
825 if (fTheta[i][j] == 0) return;
826
827 double fSinBuffer = sin(fTheta[i][j]);
828 double fCosBuffer = cos(fTheta[i][j]);
829
830 double fHmsBufferD;
831 complexD fHmsBufferC;
832
833 // With Delta
834 if (i + 1 < j) {
835 complexD fExpBuffer = complexD(cos(fDelta[i][j]), -sin(fDelta[i][j]));
836
837 // General case
838 if (i > 0) {
839 // Top columns
840 for (int k = 0; k < i; k++) {
841 fHmsBufferC = Ham[k][i];
842
843 Ham[k][i] *= fCosBuffer;
844 Ham[k][i] += Ham[k][j] * fSinBuffer * conj(fExpBuffer);
845
846 Ham[k][j] *= fCosBuffer;
847 Ham[k][j] -= fHmsBufferC * fSinBuffer * fExpBuffer;
848 }
849
850 // Middle row and column
851 for (int k = i + 1; k < j; k++) {
852 fHmsBufferC = Ham[k][j];
853
854 Ham[k][j] *= fCosBuffer;
855 Ham[k][j] -= conj(Ham[i][k]) * fSinBuffer * fExpBuffer;
856
857 Ham[i][k] *= fCosBuffer;
858 Ham[i][k] += fSinBuffer * fExpBuffer * conj(fHmsBufferC);
859 }
860
861 // Nodes ij
862 fHmsBufferC = Ham[i][i];
863 fHmsBufferD = real(Ham[j][j]);
864
865 Ham[i][i] *= fCosBuffer * fCosBuffer;
866 Ham[i][i] +=
867 2 * fSinBuffer * fCosBuffer * real(Ham[i][j] * conj(fExpBuffer));
868 Ham[i][i] += fSinBuffer * Ham[j][j] * fSinBuffer;
869
870 Ham[j][j] *= fCosBuffer * fCosBuffer;
871 Ham[j][j] += fSinBuffer * fHmsBufferC * fSinBuffer;
872 Ham[j][j] -=
873 2 * fSinBuffer * fCosBuffer * real(Ham[i][j] * conj(fExpBuffer));
874
875 Ham[i][j] -= 2 * fSinBuffer * real(Ham[i][j] * conj(fExpBuffer)) *
876 fSinBuffer * fExpBuffer;
877 Ham[i][j] +=
878 fSinBuffer * fCosBuffer * (fHmsBufferD - fHmsBufferC) * fExpBuffer;
879 }
880 // First rotation on j (No top columns)
881 else {
882 // Middle rows and columns
883 for (int k = i + 1; k < j; k++) {
884 Ham[k][j] = -conj(Ham[i][k]) * fSinBuffer * fExpBuffer;
885
886 Ham[i][k] *= fCosBuffer;
887 }
888
889 // Nodes ij
890 fHmsBufferD = real(Ham[i][i]);
891
892 Ham[i][j] =
893 fSinBuffer * fCosBuffer * (Ham[j][j] - fHmsBufferD) * fExpBuffer;
894
895 Ham[i][i] *= fCosBuffer * fCosBuffer;
896 Ham[i][i] += fSinBuffer * Ham[j][j] * fSinBuffer;
897
898 Ham[j][j] *= fCosBuffer * fCosBuffer;
899 Ham[j][j] += fSinBuffer * fHmsBufferD * fSinBuffer;
900 }
901 }
902 // Without Delta (No middle rows or columns: j = i+1)
903 else {
904 // General case
905 if (i > 0) {
906 // Top columns
907 for (int k = 0; k < i; k++) {
908 fHmsBufferC = Ham[k][i];
909
910 Ham[k][i] *= fCosBuffer;
911 Ham[k][i] += Ham[k][j] * fSinBuffer;
912
913 Ham[k][j] *= fCosBuffer;
914 Ham[k][j] -= fHmsBufferC * fSinBuffer;
915 }
916
917 // Nodes ij
918 fHmsBufferC = Ham[i][i];
919 fHmsBufferD = real(Ham[j][j]);
920
921 Ham[i][i] *= fCosBuffer * fCosBuffer;
922 Ham[i][i] += 2 * fSinBuffer * fCosBuffer * real(Ham[i][j]);
923 Ham[i][i] += fSinBuffer * Ham[j][j] * fSinBuffer;
924
925 Ham[j][j] *= fCosBuffer * fCosBuffer;
926 Ham[j][j] += fSinBuffer * fHmsBufferC * fSinBuffer;
927 Ham[j][j] -= 2 * fSinBuffer * fCosBuffer * real(Ham[i][j]);
928
929 Ham[i][j] -= 2 * fSinBuffer * real(Ham[i][j]) * fSinBuffer;
930 Ham[i][j] += fSinBuffer * fCosBuffer * (fHmsBufferD - fHmsBufferC);
931 }
932 // First rotation (theta12)
933 else {
934 Ham[i][j] = fSinBuffer * fCosBuffer * Ham[j][j];
935
936 Ham[i][i] = fSinBuffer * Ham[j][j] * fSinBuffer;
937
938 Ham[j][j] *= fCosBuffer * fCosBuffer;
939 }
940 }
941}

References OscProb::PMNS_Base::fDelta, and OscProb::PMNS_Base::fTheta.

Referenced by OscProb::PMNS_Base::BuildHms(), OscProb::PMNS_Decay::BuildHms(), and OscProb::PMNS_SNSI::BuildHms().

◆ rotateK()

void PMNS_Maltoni::rotateK ( )
protectedvirtual

Rotate the K matrix from mass to flavor basis

Definition at line 238 of file PMNS_Maltoni.cxx.

239{
240 complexD buffer[fNumNus];
241
242 for (int j = 0; j < fNumNus; j++) {
243 for (int k = 0; k < fNumNus; k++) {
244 buffer[k] = 0;
245
246 for (int l = 0; l < fNumNus; l++) {
247 buffer[k] += fKmass[k][l] * conj(fEvec[j][l]);
248 }
249 }
250
251 for (int i = 0; i <= j; i++) {
252 fKflavor[i][j] = 0;
253
254 for (int k = 0; k < fNumNus; k++) {
255 fKflavor[i][j] += fEvec[i][k] * buffer[k];
256 }
257
258 if (i != j) { fKflavor[j][i] = conj(fKflavor[i][j]); }
259 }
260 }
261}

References OscProb::PMNS_Base::fEvec, fKflavor, fKmass, and OscProb::PMNS_Base::fNumNus.

Referenced by PropagatePathTaylor().

◆ rotateS()

void PMNS_Maltoni::rotateS ( )
protectedvirtual

Rotate the S matrix for the current layer from mass to flavor basis

Definition at line 216 of file PMNS_Maltoni.cxx.

217{
218 complexD buffer[fNumNus];
219
220 for (int j = 0; j < fNumNus; j++) {
221 for (int k = 0; k < fNumNus; k++) {
222 buffer[k] = fPhases[k] * conj(fEvec[j][k]);
223 }
224
225 for (int i = 0; i < fNumNus; i++) {
226 fSflavor[i][j] = 0;
227 for (int k = 0; k < fNumNus; k++) {
228 fSflavor[i][j] += fEvec[i][k] * buffer[k];
229 }
230 }
231 }
232}

References OscProb::PMNS_Base::fEvec, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fPhases, and fSflavor.

Referenced by PropagatePathTaylor().

◆ RotateState()

void PMNS_Base::RotateState ( int  i,
int  j 
)
protectedvirtualinherited

Rotate the neutrino state by the angle theta_ij and phase delta_ij.

Parameters
i,j- the indices of the rotation ij

Definition at line 760 of file PMNS_Base.cxx.

761{
762 // Do nothing if angle is zero
763 if (fTheta[i][j] == 0) return;
764
765 double sij = sin(fTheta[i][j]);
766 double cij = cos(fTheta[i][j]);
767
768 complexD buffer;
769
770 if (i + 1 == j || fDelta[i][j] == 0) {
771 buffer = cij * fNuState[i] + sij * fNuState[j];
772 fNuState[j] = cij * fNuState[j] - sij * fNuState[i];
773 }
774 else {
775 complexD eij = complexD(cos(fDelta[i][j]), -sin(fDelta[i][j]));
776 buffer = cij * fNuState[i] + sij * eij * fNuState[j];
777 fNuState[j] = cij * fNuState[j] - sij * conj(eij) * fNuState[i];
778 }
779
780 fNuState[i] = buffer;
781}

References OscProb::PMNS_Base::fDelta, OscProb::PMNS_Base::fNuState, and OscProb::PMNS_Base::fTheta.

Referenced by OscProb::PMNS_Base::GetMassEigenstate().

◆ SetAngle()

void PMNS_Base::SetAngle ( int  i,
int  j,
double  th 
)
virtualinherited

Set the mixing angle theta_ij in radians.

Requires that i<j. Will notify you if input is wrong. If i>j, will assume reverse order and swap i and j.

This will check if value is changing to keep track of whether the hamiltonian needs to be rebuilt.

Parameters
i,j- the indices of theta_ij
th- the value of theta_ij

Definition at line 539 of file PMNS_Base.cxx.

540{
541 if (i > j) {
542 cerr << "WARNING: First argument should be smaller than second argument"
543 << endl
544 << " Setting reverse order (Theta" << j << i << "). " << endl;
545 int temp = i;
546 i = j;
547 j = temp;
548 }
549 if (i < 1 || i > fNumNus - 1 || j < 2 || j > fNumNus) {
550 cerr << "ERROR: Theta" << i << j << " not valid for " << fNumNus
551 << " neutrinos. Doing nothing." << endl;
552 return;
553 }
554
555 // Check if value is actually changing
556 fBuiltHms *= (fTheta[i - 1][j - 1] == th);
557
558 fTheta[i - 1][j - 1] = th;
559}

References OscProb::PMNS_Base::fBuiltHms, OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::fTheta.

Referenced by GetSterile(), OscProb::PMNS_Decay::SetMix(), OscProb::PMNS_Fast::SetMix(), SetNominalPars(), and OscProb::PMNS_Base::SetStdPars().

◆ SetAtt() [1/2]

void PMNS_Base::SetAtt ( double  att,
int  idx 
)
protectedvirtualinherited

Set some single path attribute.

An auxiliary function to set individual attributes in a single path.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost. Use with care.

Parameters
att- The value of the attribute
idx- The index of the attribute (0,1,2,3) = (L, Rho, Z/A, Layer)

Definition at line 364 of file PMNS_Base.cxx.

365{
366 if (fNuPaths.size() != 1) {
367 cerr << "WARNING: Clearing path vector and starting new single path."
368 << endl
369 << "To avoid possible issues, use the SetPath function." << endl;
370
371 SetStdPath();
372 }
373
374 switch (idx) {
375 case 0: fNuPaths[0].length = att; break;
376 case 1: fNuPaths[0].density = att; break;
377 case 2: fNuPaths[0].zoa = att; break;
378 case 3: fNuPaths[0].layer = att; break;
379 }
380}
virtual void SetStdPath()
Set standard neutrino path.
Definition: PMNS_Base.cxx:205

References OscProb::PMNS_Base::fNuPaths, and OscProb::PMNS_Base::SetStdPath().

Referenced by OscProb::PMNS_Base::SetDensity(), OscProb::PMNS_Base::SetLayers(), OscProb::PMNS_Base::SetLength(), and OscProb::PMNS_Base::SetZoA().

◆ SetAtt() [2/2]

void PMNS_Base::SetAtt ( vectorD  att,
int  idx 
)
protectedvirtualinherited

Set all values of a path attribute.

An auxiliary function to set individual attributes in a path sequence.

If the path sequence is of a different size, a new path sequence will be created and the previous sequence will be lost. Use with care.

Parameters
att- The values of the attribute
idx- The index of the attribute (0,1,2,3) = (L, Rho, Z/A, Layer)

Definition at line 427 of file PMNS_Base.cxx.

428{
429 // Get the sizes of the attribute and
430 // path sequence vectors
431 int nA = att.size();
432 int nP = fNuPaths.size();
433
434 // If the vector sizes are equal, update this attribute
435 if (nA == nP) {
436 for (int i = 0; i < nP; i++) {
437 switch (idx) {
438 case 0: fNuPaths[i].length = att[i]; break;
439 case 1: fNuPaths[i].density = att[i]; break;
440 case 2: fNuPaths[i].zoa = att[i]; break;
441 case 3: fNuPaths[i].layer = att[i]; break;
442 }
443 }
444 }
445 // If the vector sizes differ, create a new path sequence
446 // and set value for this attribute. Other attributes will
447 // be taken from default single path.
448 else {
449 cerr << "WARNING: New vector size. Starting new path vector." << endl
450 << "To avoid possible issues, use the SetPath function." << endl;
451
452 // Start a new standard path just
453 // to set default values
454 SetStdPath();
455
456 // Create a path segment with default values
457 NuPath p = fNuPaths[0];
458
459 // Clear the path sequence
460 ClearPath();
461
462 // Set this particular attribute's value
463 // and add the path segment to the sequence
464 for (int i = 0; i < nA; i++) {
465 switch (idx) {
466 case 0: p.length = att[i]; break;
467 case 1: p.density = att[i]; break;
468 case 2: p.zoa = att[i]; break;
469 case 3: p.layer = att[i]; break;
470 }
471
472 AddPath(p);
473 }
474 }
475}
virtual void ClearPath()
Clear the path vector.
Definition: PMNS_Base.cxx:287
int layer
An index to identify the matter type.
Definition: NuPath.h:81
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

References OscProb::PMNS_Base::AddPath(), OscProb::PMNS_Base::ClearPath(), OscProb::NuPath::density, OscProb::PMNS_Base::fNuPaths, OscProb::NuPath::layer, OscProb::NuPath::length, OscProb::PMNS_Base::SetStdPath(), and OscProb::NuPath::zoa.

◆ SetAvgProbPrec()

void PMNS_Base::SetAvgProbPrec ( double  prec)
virtualinherited

Set the precision for the AvgProb method

Parameters
prec- AvgProb precision

Definition at line 1962 of file PMNS_Base.cxx.

1963{
1964 if (prec < 1e-8) {
1965 cerr << "WARNING: Cannot set AvgProb precision lower that 1e-8."
1966 << "Setting to 1e-8." << endl;
1967 prec = 1e-8;
1968 }
1969 fAvgProbPrec = prec;
1970}

References OscProb::PMNS_Base::fAvgProbPrec.

Referenced by OscProb::PMNS_Base::PMNS_Base(), and PMNS_Maltoni().

◆ SetCosT()

void PMNS_Maltoni::SetCosT ( double  cosT)
protectedvirtual

Set neutrino zenith angle.

Parameters
cosT- The cosine of the zenith angle

Definition at line 92 of file PMNS_Maltoni.cxx.

92{ fcosT = cosT; }

References fcosT.

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), and ExtrapolationProbCosT().

◆ SetCurPath()

void PMNS_Base::SetCurPath ( NuPath  p)
protectedvirtualinherited

Set the path currentlyin use by the class.

This will be used to know what path to propagate through next.

It will also check if values are changing to keep track of whether the eigensystem needs to be recomputed.

Parameters
p- A neutrino path segment

Definition at line 274 of file PMNS_Base.cxx.

275{
276 // Check if relevant value are actually changing
277 fGotES *= (fPath.density == p.density);
278 fGotES *= (fPath.zoa == p.zoa);
279
280 fPath = p;
281}

References OscProb::NuPath::density, OscProb::PMNS_Base::fGotES, OscProb::PMNS_Base::fPath, and OscProb::NuPath::zoa.

Referenced by OscProb::PMNS_Base::AvgProbLoE(), OscProb::PMNS_Base::AvgProbMatrixLoE(), OscProb::PMNS_Base::AvgProbVectorLoE(), OscProb::PMNS_OQS::BuildHVMB(), OscProb::PMNS_Base::ConvertEtoLoE(), ExtrapolationProbLoE(), OscProb::PMNS_Base::PropagatePath(), OscProb::PMNS_Decay::PropagatePath(), OscProb::PMNS_Deco::PropagatePath(), and PropagatePathTaylor().

◆ SetDelta()

void PMNS_Base::SetDelta ( int  i,
int  j,
double  delta 
)
virtualinherited

Set the CP phase delta_ij in radians.

Requires that i+1<j. Will notify you if input is wrong. If i>j, will assume reverse order and swap i and j.

This will check if value is changing to keep track of whether the hamiltonian needs to be rebuilt.

Parameters
i,j- the indices of delta_ij
delta- the value of delta_ij

Definition at line 602 of file PMNS_Base.cxx.

603{
604 if (i > j) {
605 cerr << "WARNING: First argument should be smaller than second argument"
606 << endl
607 << " Setting reverse order (Delta" << j << i << "). " << endl;
608 int temp = i;
609 i = j;
610 j = temp;
611 }
612 if (i < 1 || i > fNumNus - 1 || j < 2 || j > fNumNus) {
613 cerr << "ERROR: Delta" << i << j << " not valid for " << fNumNus
614 << " neutrinos. Doing nothing." << endl;
615 return;
616 }
617 if (i + 1 == j) {
618 cerr << "WARNING: Rotation " << i << j << " is real. Doing nothing."
619 << endl;
620 return;
621 }
622
623 // Check if value is actually changing
624 fBuiltHms *= (fDelta[i - 1][j - 1] == delta);
625
626 fDelta[i - 1][j - 1] = delta;
627}

References OscProb::PMNS_Base::fBuiltHms, OscProb::PMNS_Base::fDelta, and OscProb::PMNS_Base::fNumNus.

Referenced by OscProb::PMNS_Decay::SetMix(), OscProb::PMNS_Fast::SetMix(), and SetNominalPars().

◆ SetDensity() [1/2]

void PMNS_Base::SetDensity ( double  rho)
virtualinherited

Set single path density.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost. Use with care.

Parameters
rho- The density of the path segment in g/cm^3

Definition at line 402 of file PMNS_Base.cxx.

402{ SetAtt(rho, 1); }
virtual void SetAtt(double att, int idx)
Set one of the path attributes.
Definition: PMNS_Base.cxx:364

References OscProb::PMNS_Base::SetAtt().

◆ SetDensity() [2/2]

void PMNS_Base::SetDensity ( vectorD  rho)
virtualinherited

Set multiple path densities.

If the path sequence is of a different size, a new path sequence will be created and the previous sequence will be lost. Use with care.

Parameters
rho- The densities of the path segments in g/cm^3

Definition at line 497 of file PMNS_Base.cxx.

497{ SetAtt(rho, 1); }

References OscProb::PMNS_Base::SetAtt().

◆ SetDm()

void PMNS_Base::SetDm ( int  j,
double  dm 
)
virtualinherited

Set the mass-splitting dm_j1 = (m_j^2 - m_1^2) in eV^2

Requires that j>1. Will notify you if input is wrong.

This will check if value is changing to keep track of whether the hamiltonian needs to be rebuilt.

Parameters
j- the index of dm_j1
dm- the value of dm_j1

Definition at line 674 of file PMNS_Base.cxx.

675{
676 if (j < 2 || j > fNumNus) {
677 cerr << "ERROR: Dm" << j << "1 not valid for " << fNumNus
678 << " neutrinos. Doing nothing." << endl;
679 return;
680 }
681
682 // Check if value is actually changing
683 fBuiltHms *= (fDm[j - 1] == dm);
684
685 fDm[j - 1] = dm;
686}

References OscProb::PMNS_Base::fBuiltHms, OscProb::PMNS_Base::fDm, and OscProb::PMNS_Base::fNumNus.

Referenced by GetSterile(), OscProb::PMNS_Decay::SetDeltaMsqrs(), OscProb::PMNS_Fast::SetDeltaMsqrs(), SetNominalPars(), and OscProb::PMNS_Base::SetStdPars().

◆ SetEnergy()

void PMNS_Base::SetEnergy ( double  E)
virtualinherited

Set neutrino energy in GeV.

This will check if value is changing to keep track of whether the eigensystem needs to be recomputed.

Parameters
E- The neutrino energy in GeV

Definition at line 226 of file PMNS_Base.cxx.

227{
228 // Check if value is actually changing
229 fGotES *= (fEnergy == E);
230
231 fEnergy = E;
232}

References OscProb::PMNS_Base::fEnergy, and OscProb::PMNS_Base::fGotES.

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), OscProb::PMNS_Base::AvgProbLoE(), OscProb::PMNS_Base::AvgProbMatrixLoE(), OscProb::PMNS_Base::AvgProbVectorLoE(), ExtrapolationProb(), ExtrapolationProbLoE(), OscProb::PMNS_Base::PMNS_Base(), OscProb::PMNS_Base::Prob(), OscProb::PMNS_Base::ProbMatrix(), and OscProb::PMNS_Base::ProbVector().

◆ SetIsNuBar()

void PMNS_Base::SetIsNuBar ( bool  isNuBar)
virtualinherited

Set anti-neutrino flag.

This will check if value is changing to keep track of whether the eigensystem needs to be recomputed.

Parameters
isNuBar- Set to true for anti-neutrino and false for neutrino.

Reimplemented in OscProb::PMNS_Decay, OscProb::PMNS_Iter, and OscProb::PMNS_OQS.

Definition at line 243 of file PMNS_Base.cxx.

244{
245 // Check if value is actually changing
246 fGotES *= (fIsNuBar == isNuBar);
247
248 fIsNuBar = isNuBar;
249}

References OscProb::PMNS_Base::fGotES, and OscProb::PMNS_Base::fIsNuBar.

Referenced by CheckProb(), OscProb::PMNS_Base::PMNS_Base(), SaveTestFile(), and OscProb::PMNS_OQS::SetIsNuBar().

◆ SetIsOscProbAvg()

void PMNS_Maltoni::SetIsOscProbAvg ( bool  isOscProbAvg)
virtual

Set method used for averaging.

Parameters
isOscProbAvg- OscProb (true) or Maltoni (false)

Reimplemented in OscProb::PMNS_DensityMatrix, OscProb::PMNS_LIV, OscProb::PMNS_NUNM, and OscProb::PMNS_SNSI.

Definition at line 70 of file PMNS_Maltoni.cxx.

71{
72 fIsOscProbAvg = isOscProbAvg;
73}

References fIsOscProbAvg.

Referenced by PMNS_Maltoni().

◆ SetLayers()

void PMNS_Base::SetLayers ( std::vector< int >  lay)
virtualinherited

Set multiple path layer indices.

If the path sequence is of a different size, a new path sequence will be created and the previous sequence will be lost. Use with care.

Parameters
lay- Indices to identify the layer types (e.g. earth inner core)

Definition at line 519 of file PMNS_Base.cxx.

520{
521 vectorD lay_double(lay.begin(), lay.end());
522
523 SetAtt(lay_double, 3);
524}

References OscProb::PMNS_Base::SetAtt().

◆ SetLength() [1/2]

void PMNS_Base::SetLength ( double  L)
virtualinherited

Set the length for a single path.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost. Use with care.

Parameters
L- The length of the path segment in km

Definition at line 391 of file PMNS_Base.cxx.

391{ SetAtt(L, 0); }

References OscProb::PMNS_Base::SetAtt().

Referenced by OscProb::PMNS_Base::Prob(), OscProb::PMNS_Base::ProbMatrix(), and OscProb::PMNS_Base::ProbVector().

◆ SetLength() [2/2]

void PMNS_Base::SetLength ( vectorD  L)
virtualinherited

Set multiple path lengths.

If the path sequence is of a different size, a new path sequence will be created and the previous sequence will be lost. Use with care.

Parameters
L- The lengths of the path segments in km

Definition at line 486 of file PMNS_Base.cxx.

486{ SetAtt(L, 0); }

References OscProb::PMNS_Base::SetAtt().

◆ SetMaxCache()

void PMNS_Base::SetMaxCache ( int  mc = 1e6)
virtualinherited

Set maximum number of cached eigensystems. Finding eigensystems can become slow and take up memory. This protects the cache from becoming too large.

Parameters
mc- Max cache size (default: 1e6)

Definition at line 128 of file PMNS_Base.cxx.

128{ fMaxCache = mc; }

References OscProb::PMNS_Base::fMaxCache.

◆ SetPath() [1/3]

void PMNS_Base::SetPath ( double  length,
double  density,
double  zoa = 0.5,
int  layer = 0 
)
virtualinherited

Set a single path defining attributes directly.

This destroys the current path sequence and creates a new first path.

Parameters
length- The length of the path segment in km
density- The density of the path segment in g/cm^3
zoa- The effective Z/A of the path segment
layer- An index to identify the layer type (e.g. earth inner core)

Definition at line 347 of file PMNS_Base.cxx.

348{
349 SetPath(NuPath(length, density, zoa, layer));
350}

References OscProb::PMNS_Base::SetPath().

◆ SetPath() [2/3]

void PMNS_Base::SetPath ( NuPath  p)
virtualinherited

Set a single path.

This destroys the current path sequence and creates a new first path.

Parameters
p- A neutrino path segment

Definition at line 330 of file PMNS_Base.cxx.

331{
332 ClearPath();
333 AddPath(p);
334}

References OscProb::PMNS_Base::AddPath(), and OscProb::PMNS_Base::ClearPath().

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), ExtrapolationProbCosT(), OscProb::PMNS_Base::SetPath(), OscProb::PMNS_Base::SetStdPath(), and SetTestPath().

◆ SetPath() [3/3]

void PMNS_Base::SetPath ( std::vector< NuPath paths)
virtualinherited

Set vector of neutrino paths.

Parameters
paths- A sequence of neutrino paths

Definition at line 294 of file PMNS_Base.cxx.

294{ fNuPaths = paths; }

References OscProb::PMNS_Base::fNuPaths.

◆ SetPremModel()

void PMNS_Maltoni::SetPremModel ( OscProb::PremModel prem)
virtual

Set the earth model to be used.

This is done to get access to the PremLayer list to be used in the LnDerivative() function.

Parameters
prem- The earth model used

Definition at line 84 of file PMNS_Maltoni.cxx.

84{ fPrem = prem; }

References fPrem.

◆ SetPureState()

void PMNS_Base::SetPureState ( vectorC  nu_in)
protectedvirtualinherited

Set the initial state from a pure state

Parameters
nu_in- The neutrino initial state in flavour basis.

Reimplemented in OscProb::PMNS_DensityMatrix.

Definition at line 1070 of file PMNS_Base.cxx.

1071{
1072 assert(nu_in.size() == fNumNus);
1073
1074 fNuState = nu_in;
1075}

References OscProb::PMNS_Base::fNumNus, and OscProb::PMNS_Base::fNuState.

Referenced by OscProb::PMNS_Base::Prob(), and OscProb::PMNS_Base::ProbVector().

◆ SetStdPars()

void PMNS_Base::SetStdPars ( )
virtualinherited

Set standard oscillation parameters from PDG 2015.

For two neutrinos, Dm is set to the muon disappearance effective mass-splitting and mixing angle.

Definition at line 177 of file PMNS_Base.cxx.

178{
179 if (fNumNus > 2) {
180 // PDG values for 3 neutrinos
181 // Also applicable for 3+N neutrinos
182 SetAngle(1, 2, asin(sqrt(0.304)));
183 SetAngle(1, 3, asin(sqrt(0.0219)));
184 SetAngle(2, 3, asin(sqrt(0.514)));
185 SetDm(2, 7.53e-5);
186 SetDm(3, 2.52e-3);
187 }
188 else if (fNumNus == 2) {
189 // Effective muon disappearance values
190 // for two-flavour approximation
191 SetAngle(1, 2, 0.788);
192 SetDm(2, 2.47e-3);
193 }
194}
virtual void SetDm(int j, double dm)
Set the mass-splitting dm_j1 in eV^2.
Definition: PMNS_Base.cxx:674
virtual void SetAngle(int i, int j, double th)
Set the mixing angle theta_ij.
Definition: PMNS_Base.cxx:539

References OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::SetAngle(), and OscProb::PMNS_Base::SetDm().

Referenced by OscProb::PMNS_Base::PMNS_Base().

◆ SetStdPath()

void PMNS_Base::SetStdPath ( )
virtualinherited

Set standard single path.

Length is 1000 km, so ~2 GeV peak energy.

Density is approximate from CRUST2.0 (~2.8 g/cm^3). Z/A is set to a round 0.5.

Definition at line 205 of file PMNS_Base.cxx.

206{
207 NuPath p;
208
209 p.length = 1000; // 1000 km default
210 p.density = 2.8; // Crust density
211 p.zoa = 0.5; // Crust Z/A
212 p.layer = 0; // Single layer
213
214 SetPath(p);
215}

References OscProb::NuPath::density, OscProb::NuPath::layer, OscProb::NuPath::length, OscProb::PMNS_Base::SetPath(), and OscProb::NuPath::zoa.

Referenced by OscProb::PMNS_Base::PMNS_Base(), OscProb::PMNS_LIV::PMNS_LIV(), OscProb::PMNS_NSI::PMNS_NSI(), OscProb::PMNS_NUNM::PMNS_NUNM(), and OscProb::PMNS_Base::SetAtt().

◆ SetUseCache()

void PMNS_Base::SetUseCache ( bool  u = true)
virtualinherited

Turn on/off caching of eigensystems. This can save a lot of CPU time by avoiding recomputing eigensystems if we've already seen them recently. Especially useful when running over multiple earth layers and even more if multiple baselines will be computed, e.g. for atmospheric neutrinos.

Parameters
u- flag to set caching on (default: true)

Definition at line 105 of file PMNS_Base.cxx.

105{ fUseCache = u; }

References OscProb::PMNS_Base::fUseCache.

Referenced by OscProb::PMNS_Base::PMNS_Base().

◆ SetwidthBin()

void PMNS_Maltoni::SetwidthBin ( double  dE,
double  dcosT 
)
protectedvirtual

Set bin widths.

Parameters
dE- The width of the energy bin in GeV
dcosT- The width of the cos(theta_z) bin

Definition at line 101 of file PMNS_Maltoni.cxx.

102{
103 fdInvE = dE;
104 fdcosT = dcosT;
105}

References fdcosT, and fdInvE.

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), ExtrapolationProb(), ExtrapolationProbCosT(), ExtrapolationProbLoE(), and PMNS_Maltoni().

◆ SetZoA() [1/2]

void PMNS_Base::SetZoA ( double  zoa)
virtualinherited

Set single path Z/A.

If the path sequence is not a single path, a new single path will be created and the previous sequence will be lost. Use with care.

Parameters
zoa- The effective Z/A of the path segment

Definition at line 413 of file PMNS_Base.cxx.

413{ SetAtt(zoa, 2); }

References OscProb::PMNS_Base::SetAtt().

◆ SetZoA() [2/2]

void PMNS_Base::SetZoA ( vectorD  zoa)
virtualinherited

Set multiple path Z/A values.

If the path sequence is of a different size, a new path sequence will be created and the previous sequence will be lost. Use with care.

Parameters
zoa- The effective Z/A of the path segments

Definition at line 508 of file PMNS_Base.cxx.

508{ SetAtt(zoa, 2); }

References OscProb::PMNS_Base::SetAtt().

◆ SolveHam()

virtual void OscProb::PMNS_Base::SolveHam ( )
protectedpure virtualinherited

Solve the full Hamiltonian

Not implemented in base class. Solve the full Hamiltonian for eigenvectors and eigenvalues

Implemented in OscProb::PMNS_Decay, OscProb::PMNS_Fast, OscProb::PMNS_Iter, OscProb::PMNS_LIV, and OscProb::PMNS_Sterile.

Referenced by OscProb::PMNS_Base::GetDmEff(), OscProb::PMNS_Base::GetSamplePoints(), OscProb::PMNS_Base::PropagatePath(), and PropagatePathTaylor().

◆ SolveK()

void PMNS_Maltoni::SolveK ( Eigen::MatrixXcd &  K,
vectorD lambda,
matrixC V 
)
protected

Solve one K matrix for eigenvectors and eigenvalues.

This is using the Eigen methods appropriate for each matrix size.

Parameters
K- The K matrix
lambda- The eigenvalues of K
V- The eigenvectors of K

Definition at line 395 of file PMNS_Maltoni.cxx.

396{
397 if (fNumNus == 4) TemplateSolver<Eigen::Matrix4cd>(K, lambda, V);
398 if (fNumNus == 3) TemplateSolver<Eigen::Matrix3cd>(K, lambda, V);
399 if (fNumNus == 2)
400 TemplateSolver<Eigen::Matrix2cd>(K, lambda, V);
401 else
402 TemplateSolver<Eigen::MatrixXcd>(K, lambda, V);
403}

References OscProb::PMNS_Base::fNumNus.

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), ExtrapolationProb(), ExtrapolationProbCosT(), and ExtrapolationProbLoE().

◆ TemplateSolver()

template<typename T >
void PMNS_Maltoni::TemplateSolver ( Eigen::MatrixXcd &  K,
vectorD lambda,
matrixC V 
)
protected

Auxiliary function to convert a generic Xcd matrix into a specific size so Eigen can optimize the eigensolver method used.

Parameters
K- The K matrix
lambda- The eigenvalues of K
V- The eigenvectors of K

Definition at line 415 of file PMNS_Maltoni.cxx.

417{
418 Eigen::Ref<T> R(K);
419
420 Eigen::SelfAdjointEigenSolver<T> eigensolver(R);
421
422 // Fill flambdaInvE and fVInvE vectors from GLoBES arrays
423 for (int i = 0; i < fNumNus; i++) {
424 lambda[i] = eigensolver.eigenvalues()(i);
425 for (int j = 0; j < fNumNus; j++) {
426 V[i][j] = eigensolver.eigenvectors()(i, j);
427 }
428 }
429}

References OscProb::PMNS_Base::fNumNus.

◆ TryCache()

bool PMNS_Base::TryCache ( )
protectedvirtualinherited

Try to find a cached version of this eigensystem.

Definition at line 134 of file PMNS_Base.cxx.

135{
136 if (fUseCache && !fMixCache.empty()) {
138
139 unordered_set<EigenPoint>::iterator it = fMixCache.find(fProbe);
140
141 if (it != fMixCache.end()) {
142 for (int i = 0; i < fNumNus; i++) {
143 fEval[i] = (*it).fEval[i] * (*it).fEnergy / fEnergy;
144 for (int j = 0; j < fNumNus; j++) { fEvec[i][j] = (*it).fEvec[i][j]; }
145 }
146 return true;
147 }
148 }
149
150 return false;
151}

References OscProb::PMNS_Base::fEnergy, OscProb::PMNS_Base::fEval, OscProb::PMNS_Base::fEvec, OscProb::PMNS_Base::fIsNuBar, OscProb::PMNS_Base::fMixCache, OscProb::PMNS_Base::fNumNus, OscProb::PMNS_Base::fPath, OscProb::PMNS_Base::fProbe, OscProb::PMNS_Base::fUseCache, and OscProb::EigenPoint::SetVars().

Referenced by OscProb::PMNS_Sterile::SolveHam(), and OscProb::PMNS_Fast::SolveHamMatter().

◆ UpdateHam()

virtual void OscProb::PMNS_Maltoni::UpdateHam ( )
protectedpure virtual

Member Data Documentation

◆ fAvgProbPrec

double OscProb::PMNS_Base::fAvgProbPrec
protectedinherited

◆ fBuffer

vectorC OscProb::PMNS_Base::fBuffer
protectedinherited

◆ fBuiltHms

◆ fCachePrec

double OscProb::PMNS_Base::fCachePrec
protectedinherited

Definition at line 302 of file PMNS_Base.h.

◆ fcosT

double OscProb::PMNS_Maltoni::fcosT
protected

Definition at line 184 of file PMNS_Maltoni.h.

Referenced by LnDerivative(), and SetCosT().

◆ fdcosT

double OscProb::PMNS_Maltoni::fdcosT
protected

◆ fDelta

◆ fdensityMatrix

matrixC OscProb::PMNS_Maltoni::fdensityMatrix
protected

◆ fDetRadius

double OscProb::PMNS_Maltoni::fDetRadius
protected

◆ fdInvE

double OscProb::PMNS_Maltoni::fdInvE
protected

◆ fdl

int OscProb::PMNS_Maltoni::fdl
protected

Definition at line 210 of file PMNS_Maltoni.h.

Referenced by InitializeTaylorsVectors(), and LnDerivative().

◆ fDm

◆ fEnergy

◆ fEval

◆ fEvec

◆ fevolutionMatrixS

matrixC OscProb::PMNS_Maltoni::fevolutionMatrixS
protected

Evolution matrix S for reference energy and angle for the entire path

Definition at line 200 of file PMNS_Maltoni.h.

Referenced by AlgorithmDensityMatrix(), AvgFormula(), AvgFormulaExtrapolation(), InitializeTaylorsVectors(), MultiplicationRuleK(), and MultiplicationRuleS().

◆ fGotES

◆ fHam

Eigen::MatrixXcd OscProb::PMNS_Maltoni::fHam
protected

Definition at line 217 of file PMNS_Maltoni.h.

Referenced by BuildKcosT().

◆ fHms

◆ fIsNuBar

◆ fIsOscProbAvg

◆ fKcosT

Eigen::MatrixXcd OscProb::PMNS_Maltoni::fKcosT
protected

◆ fKflavor

matrixC OscProb::PMNS_Maltoni::fKflavor
protected

Definition at line 204 of file PMNS_Maltoni.h.

Referenced by BuildKcosT(), InitializeTaylorsVectors(), MultiplicationRuleK(), and rotateK().

◆ fKInvE

Eigen::MatrixXcd OscProb::PMNS_Maltoni::fKInvE
protected

◆ fKmass

matrixC OscProb::PMNS_Maltoni::fKmass
protected

Definition at line 203 of file PMNS_Maltoni.h.

Referenced by BuildKE(), InitializeTaylorsVectors(), and rotateK().

◆ flambdaCosT

vectorD OscProb::PMNS_Maltoni::flambdaCosT
protected

◆ flambdaInvE

vectorD OscProb::PMNS_Maltoni::flambdaInvE
protected

◆ fLayer

int OscProb::PMNS_Maltoni::fLayer
protected

Definition at line 209 of file PMNS_Maltoni.h.

Referenced by InitializeTaylorsVectors(), and LnDerivative().

◆ fMaxCache

int OscProb::PMNS_Base::fMaxCache
protectedinherited

Definition at line 303 of file PMNS_Base.h.

Referenced by OscProb::PMNS_Base::FillCache(), and OscProb::PMNS_Base::SetMaxCache().

◆ fminRsq

double OscProb::PMNS_Maltoni::fminRsq
protected

Definition at line 212 of file PMNS_Maltoni.h.

Referenced by AvgAlgo(), AvgAlgoCosT(), AvgProb(), ExtrapolationProbCosT(), and LnDerivative().

◆ fMixCache

std::unordered_set<EigenPoint> OscProb::PMNS_Base::fMixCache
protectedinherited

◆ fNumNus

int OscProb::PMNS_Base::fNumNus
protectedinherited

Definition at line 277 of file PMNS_Base.h.

Referenced by OscProb::PMNS_NUNM::ApplyAlphaDagger(), AvgFormula(), AvgFormulaExtrapolation(), AvgProbVector(), OscProb::PMNS_Base::AvgProbVector(), AvgProbVectorLoE(), OscProb::PMNS_Base::AvgProbVectorLoE(), OscProb::PMNS_Base::BuildHms(), OscProb::PMNS_Decay::BuildHms(), OscProb::PMNS_SNSI::BuildHms(), BuildKcosT(), BuildKE(), OscProb::PMNS_Base::FillCache(), OscProb::PMNS_NUNM::GetAlpha(), OscProb::PMNS_Base::GetAngle(), OscProb::PMNS_LIV::GetaT(), OscProb::PMNS_LIV::GetcT(), OscProb::PMNS_Base::GetDelta(), OscProb::PMNS_Base::GetDm(), OscProb::PMNS_Base::GetDmEff(), OscProb::PMNS_NSI::GetEps(), OscProb::PMNS_Base::GetMassEigenstate(), OscProb::PMNS_Base::GetProbVector(), OscProb::PMNS_Base::GetSamplePoints(), HadamardProduct(), InitializeTaylorsVectors(), MultiplicationRuleK(), MultiplicationRuleS(), OscProb::PMNS_Base::P(), OscProb::PMNS_DensityMatrix::P(), OscProb::PMNS_Base::PMNS_Base(), OscProb::PMNS_Decay::PMNS_Decay(), OscProb::PMNS_Base::ProbMatrix(), OscProb::PMNS_NUNM::ProbMatrix(), OscProb::PMNS_OQS::ProbMatrix(), OscProb::PMNS_DensityMatrix::ProbMatrix(), OscProb::PMNS_Base::PropagatePath(), OscProb::PMNS_Decay::PropagatePath(), OscProb::PMNS_Deco::PropagatePath(), OscProb::PMNS_Iter::PropagatePath(), PropagatePathTaylor(), OscProb::PMNS_Base::ResetToFlavour(), OscProb::PMNS_DensityMatrix::ResetToFlavour(), RotateDensityM(), rotateK(), rotateS(), OscProb::PMNS_DensityMatrix::RotateState(), OscProb::PMNS_NUNM::SetAlpha(), OscProb::PMNS_Base::SetAngle(), OscProb::PMNS_LIV::SetaT(), OscProb::PMNS_LIV::SetcT(), OscProb::PMNS_Base::SetDelta(), OscProb::PMNS_Base::SetDm(), OscProb::PMNS_NSI::SetEps(), OscProb::PMNS_DensityMatrix::SetInitialRho(), OscProb::PMNS_Base::SetPureState(), OscProb::PMNS_DensityMatrix::SetPureState(), OscProb::PMNS_Base::SetStdPars(), OscProb::PMNS_Sterile::SolveEigenSystem(), OscProb::PMNS_Iter::SolveHam(), OscProb::PMNS_Sterile::SolveHam(), OscProb::PMNS_Fast::SolveHamMatter(), SolveK(), TemplateSolver(), OscProb::PMNS_Base::TryCache(), OscProb::PMNS_Decay::UpdateHam(), OscProb::PMNS_Fast::UpdateHam(), OscProb::PMNS_LIV::UpdateHam(), OscProb::PMNS_NSI::UpdateHam(), OscProb::PMNS_NUNM::UpdateHam(), OscProb::PMNS_SNSI::UpdateHam(), and OscProb::PMNS_Sterile::UpdateHam().

◆ fNuPaths

◆ fNuState

◆ fPath

◆ fPhases

vectorC OscProb::PMNS_Base::fPhases
protectedinherited

Definition at line 286 of file PMNS_Base.h.

Referenced by OscProb::PMNS_Base::PropagatePath(), PropagatePathTaylor(), and rotateS().

◆ fPrem

OscProb::PremModel OscProb::PMNS_Maltoni::fPrem
protected

◆ fProbe

EigenPoint OscProb::PMNS_Base::fProbe
protectedinherited

Definition at line 308 of file PMNS_Base.h.

Referenced by OscProb::PMNS_Base::FillCache(), and OscProb::PMNS_Base::TryCache().

◆ fSflavor

matrixC OscProb::PMNS_Maltoni::fSflavor
protected

Definition at line 202 of file PMNS_Maltoni.h.

Referenced by InitializeTaylorsVectors(), MultiplicationRuleS(), and rotateS().

◆ fTheta

◆ fUseCache

bool OscProb::PMNS_Base::fUseCache
protectedinherited

◆ fVcosT

matrixC OscProb::PMNS_Maltoni::fVcosT
protected

◆ fVInvE

◆ kGeV2eV

◆ kGf

◆ kK2

◆ kKm2eV

◆ kNA

const double PMNS_Base::kNA = 6.022140857e23
staticprotectedinherited

Definition at line 218 of file PMNS_Base.h.

◆ one

const complexD PMNS_Base::one
staticprotectedinherited

◆ zero


The documentation for this class was generated from the following files: