import os
import numpy
import matplotlib
from collections import defaultdict
from plotting import plt, RadiationParticleMonitor, MassiveParticleMonitor, EquilibrationMonitor
from particles import Particle
from library.SM import particles as SMP, interactions as SMI
from library.NuMSM import particles as NuP, interactions as NuI
from evolution import Universe
from common import UNITS, Params
folder = os.path.split(__file__)[0]
T_initial = 100. * UNITS.MeV
T_final = 0.0008 * UNITS.MeV
params = Params(T=T_initial,
dy=0.05)
universe = Universe(params=params, folder=folder)
photon = Particle(**SMP.photon)
electron = Particle(**SMP.leptons.electron)
muon = Particle(**SMP.leptons.muon)
neutrino_e = Particle(**SMP.leptons.neutrino_e)
neutrino_mu = Particle(**SMP.leptons.neutrino_mu)
neutrino_tau = Particle(**SMP.leptons.neutrino_tau)
sterile = Particle(**NuP.sterile_neutrino(33.9 * UNITS.MeV))
sterile.decoupling_temperature = T_initial
neutrino_e.decoupling_temperature = 10 * UNITS.MeV
neutrino_mu.decoupling_temperature = 10 * UNITS.MeV
neutrino_tau.decoupling_temperature = 10 * UNITS.MeV
universe.add_particles([
photon,
electron,
muon,
neutrino_e,
neutrino_mu,
neutrino_tau,
sterile,
])
thetas = defaultdict(float, {
'tau': numpy.sqrt(1e-3),
})
universe.interactions += (
SMI.neutrino_interactions(
leptons=[electron],
neutrinos=[neutrino_e, neutrino_mu, neutrino_tau]
) + NuI.sterile_leptons_interactions(
thetas=thetas, sterile=sterile,
neutrinos=[neutrino_e, neutrino_mu, neutrino_tau],
leptons=[electron, muon]
)
)
universe.init_kawano(electron=electron, neutrino=neutrino_e)
universe.graphics.monitor([
(neutrino_e, RadiationParticleMonitor),
(neutrino_mu, RadiationParticleMonitor),
(neutrino_tau, RadiationParticleMonitor),
(sterile, MassiveParticleMonitor),
(sterile, EquilibrationMonitor)
])
universe.evolve(T_final)
plt.figure(9)
plt.title('Figure 9')
plt.xlabel('MeV/T')
plt.ylabel(u'aT')
plt.xscale('log')
plt.xlim(0.5, UNITS.MeV/universe.params.T)
plt.xticks([1, 2, 3, 5, 10, 20])
plt.axes().get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.plot(UNITS.MeV / numpy.array(universe.data['T']), numpy.array(universe.data['aT']) / UNITS.MeV)
plt.show()
plt.savefig(os.path.join(folder, 'figure_9.svg'))
plt.figure(10)
plt.title('Figure 10')
plt.xlabel('Conformal momentum y = pa')
plt.ylabel('f/f_eq')
plt.xlim(0, 20)
Distribution functions arrays
distributions_file = open(os.path.join(folder, 'distributions.txt'), "w")
for neutrino in [neutrino_e, neutrino_mu, neutrino_tau, sterile]:
f = neutrino._distribution
feq = neutrino.equilibrium_distribution()
plt.plot(neutrino.grid.TEMPLATE/UNITS.MeV, f/feq, label=neutrino.name)
numpy.savetxt(distributions_file, (f, feq, f/feq), header=str(neutrino),
footer='-'*80, fmt="%1.5e")
plt.legend()
plt.draw()
plt.show()
plt.savefig(os.path.join(folder, 'figure_10_full.svg'))
plt.xlim(0, 10)
plt.ylim(0.99, 1.06)
plt.draw()
plt.show()
plt.savefig(os.path.join(folder, 'figure_10.svg'))
distributions_file.close()