Skip to content

BNLIF/nuosc

 
 

Repository files navigation

libnuosc++ - A library for calculating 3 neutrino oscillation probabilities.

Installation:

See the INSTALL file.

Introduction:

This library provides various methods to calculate 3 neutrino oscillation probabilities with and with out matter effects as well as the possibility for a nonzero Dirac CP phase. Anti neutrinos are also handled.

It does this by solving the evolution equation:

d(nu)/dx = [-i/(2E) U M^2 Udagger -iV] nu(x)

where U is the (potentially complex) mixing matrix, M^2 is diag(0,dm^2_21,dm^2_31) and V = diag(A,0,0) is the matter effect term. In the case of anti neutrinos the sign of A and of the CP phase is inverted.

There are three classes of calculations with regards to matter effects: vacuum oscillations in the absence of matter, oscillations through constant density matter and a spherically symmetric earth matter density profile from the Preliminary Reference Earth Model (PREM) (see hep-ph/0002149 and http://solid_earth.ou.edu/prem.html).

For each of these three classes there are two methods of calculation. A direct matrix transform method and a stepped method. The matrix transform involves analytically solving the evolution equation (see hep-ph/9910546). This solution is exact for the case of constant density (and of course vacuum).

The second method is to step the evolution equation down the neutrino baseline. This is done with an 5th order adaptive Runge-Kutta stepper. Stepping in inherently non-exact, but the precision can be controlled to arbitrary tightness at the cost of running time. For the vacuum or constant density cases the matrix methods are obviously preferable. In these cases, the step methods were developed for checking, debugging and building up to the last class of calculation.

Since the earth density profile is not constant there is no analytical solution so one must resort to some kind of approximation or to suffer the running time needed for a full stepping of the evolution equation. The approximation available is on based on the PREM with simplifying assumptions. First, it assumes each earth shell to have a constant density equal to the average over the neutrino track through that shell. Second, when calculating the average the density as a function of radius is assumed to be linear.

Implementation notes:

An important note about the CP phase convention is in doc/cp-phase-convention/README.org.

The main interface are the functions in nuosc_prob.h. There are 6 probability calculators covering the 3 matter effect possibilities (vacuum, constant and PREM) times the 2 calculation methods (matrix and step). They are named like:

nuosc_prob_[matter-type]_[calculation-type]()

With matter-type as vacuum, constant or prem and calculation-type as matrix or step.

They take a ComplexVector (see matrix.h) holding the amplitude of the initial neutrino, the oscilation parameters (bunded in OscParam, see OscParam.h) as well as an energy and baseline. Additionally, the “constant” functions take a “density”.

The internal library units are uniform throughout:

dm^2
eV^2
angle
radians
length
cm
energy
eV
density
g/cm^3

See below for notes regarding units on the command line interfaces.

A note on anti-neutrinos: CP symetry is broken in that the matter potential and the CP phase changes sign between neutrino and anti-neutrino cases. In the code this is handled inside by the OscParam object via OscParam::set_antineutrino(). This unfortunately mixes the idea of oscillation parameters (which are fundamental) with the particular neutrino which is being evolved. When asking OscParam for a matrix via get_mixing_matrix() or get_matter_matrix() one will have this -1 applied if using anti neutrinos. However, the angle returned via get_deltacp() will NOT. When using these two matrices for the evolution equation solution, one does not need to worry about nu/antinu issues. This is how nuosc_prob.cc functions behave.

Command line interface.

There exists two command line programs, “genprob” (now obsolete) and the newer “nuosc” (in main/) which give access to all these calculations. The former is deprecated in favor of the latter.

Simply running it w/out any args will produce a usage summary or run with “nuosc -h” to get a detailed explanation of the command line flags.

shell> nuosc -h
Option summary:
usage: nuosc [-n|--neutrino <initial neutrino number>]
             [-e|--energy <energy range description>]
             [-b|--baseline <baseline range description>]
             [-m|--mixing <mixing angle description>]
             [-s|--sol <delta m^2_solar (dm^2_21)>]
             [-a|--atm <delta m^2_atm (dm^2_31)>] [-d|--delta <CP phase>]
             [-D|--density <density description>]
             [-c|--calculation <calculation description] [-h|--help] 

Options details:
[-n|--neutrino <initial neutrino number>]
	Sets the initial neutrino e,mu,tau = 1,2,3; anti *= -1
	Default is 2 (mu)

[-e|--energy <energy range description>]
	Describe the energy range.  Can be one of:
		Linear energy range:      "lin:start,stop,step"
		Logarithmic energy range: "log:start,stop,step"
		A single energy value:    "one:energy"
	Linear energy units are in GeV,
	Logarithmic values give 10^start GeV - 10^stop GeV,
	Default is "one:1"

[-b|--baseline <baseline range description>]
	Describe the baseline range.  Can be one of:
		Linear disance range:       "lin:start,stop,step"
		Logarithmic distance range: "log:start,stop,step"
		A single distance value:    "one:distance"
		Zenith angle:               "zen:start,stop,step[,depth]"
		cos(Zenith angle):          "cos:start,stop,step[,depth]"
	Distance units are km, angle units are degrees.
	Logarithmic values give 10^start km - 10^stop km,
	The "depth" value for zenith related gives detector depth (def=0),
	Default is "one:1".

[-m|--mixing <mixing angle description>]
	Set the mixing angles description.  Can be one of:
		Angles:        "ang:theta_12,theta_23,theta_13"
		Sin^2(2theta): "sin:sin^2(2t_12),sin^2(2t_23),sin^2(2t_13)"
	Angle units are in degrees, default "sin:0.8,1.0,0.1"

[-s|--sol <delta m^2_solar (dm^2_21)>]
	Set the solar delta-m^2 (dm^2_21).
	Units are eV^2, default is 5.0e-5 eV^2

[-a|--atm <delta m^2_atm (dm^2_31)>]
	Set the atmospheric delta-m^2 (dm^2_31).
	Units are eV^2, default is 2.5e-3 eV^2

[-d|--delta <CP phase>]
	Set the CP phase angle.
	Units are degrees, default is 0 degrees

[-D|--density <density description>]
	Set the density description.  Can be one of:
		Constant density: "con:density"
		PREM density:     "prem"
		Lookup table:     "lut:filename"
	Density is in g/cc.
	The lookup text file has columns of bin centered position and density
	Default is "con:0.0"

[-c|--calculation <calculation description]
	Set the calculation description.  Can be one of:
		Matrix method: "matrix"
		Full stepping: "step"
	Default is "matrix"

[-h|--help]
	Print this message

The ouput is

	<energy> <baseline> <P(nux->nue)> <P(nux->numu)> <P(nux->nutau)>

Notes:

  • The units are different ([angle]=degrees, [energy]=GeV,

[distance]=km) than the underlying code uses and are given in the help message.

  • Although defaults are given for all options, one must specify at

least one argument to actually do a calculation.

  • The faster “matrix” method only works on constant matter densities.

If a calculation is done with varying densities, an density averaged along the baseline is used. In the case of PREM, each major section (crust, mantle, core) is separately averaged.

About

libnuosc++ - A library for calculating 3 neutrino oscillation probabilities.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 74.8%
  • Python 20.9%
  • Shell 2.0%
  • C 1.9%
  • Makefile 0.4%