def plot_probability_3nu_vs_energy_compare(output_format='pdf', output_path='./fig/'): r"""Generates and saves a plot of 3nu probabilities vs. energy. Generates and saves a plot of three-neutrino probabilities vs. energy for oscillations in vacuum, matter, with NSI, and with CPT-odd LIV. This is the same plot that is included in the paper. Parameters ---------- output_format : str, optional File extension of the plot to save (e.g., 'pdf', 'png', 'jpg'). output_path : str, optional File path where to save the plot. Returns ------- None The plot is generated and saved. """ # Baseline (DUNE) l = 1.3e3 * CONV_KM_TO_INV_EV # [eV^{-1}] # Neutrino energies log10_energy_nu_min = log10(5.e-1) # [GeV] log10_energy_nu_max = log10(3.e1) # [GeV] log10_energy_nu_npts = 400 log10_energy_nu = np.linspace(log10_energy_nu_min, log10_energy_nu_max, log10_energy_nu_npts) energy_nu = [10.**x for x in log10_energy_nu] # [GeV] # Plot formatting mpl.rcParams['xtick.labelsize'] = 28 mpl.rcParams['ytick.labelsize'] = 28 mpl.rcParams['legend.fontsize'] = 21 mpl.rcParams['legend.borderpad'] = 0.4 mpl.rcParams['axes.labelpad'] = 10 mpl.rcParams['ps.fonttype'] = 42 mpl.rcParams['pdf.fonttype'] = 42 fig, axes = plt.subplots(3, 1, figsize=[8, 15]) fig.subplots_adjust(hspace=0.05, wspace=0.05) h_vacuum_energy_indep = \ hamiltonians3nu.hamiltonian_3nu_vacuum_energy_independent( S12_NO_BF, S23_NO_BF, S13_NO_BF, DCP_NO_BF, D21_NO_BF, D31_NO_BF) prob_vacuum = [oscprob3nu.probabilities_3nu( \ np.multiply(1./x/1.e9, h_vacuum_energy_indep), l) \ for x in energy_nu] # Uncomment to compare to the probability computed with the standard # ocillation formula in vacuum # U = hamiltonians3nu.pmns_mixing_matrix( S12_NO_BF, # S23_NO_BF, # S13_NO_BF, # DCP_NO_BF) # prob_vacuum_std = [hamiltonians3nu.probabilities_3nu_vacuum_std( \ # U, D21_BF, D31_BF, x, l/CONV_KM_TO_INV_EV) \ # for x in energy_nu] prob_matter = [oscprob3nu.probabilities_3nu( \ hamiltonians3nu.hamiltonian_3nu_matter( \ h_vacuum_energy_indep, x*1.e9, VCC_EARTH_CRUST), l) for x in energy_nu] # eps = eps_ee, eps_em, eps_et, eps_mm, eps_mt, eps_tt prob_nsi = [oscprob3nu.probabilities_3nu( \ hamiltonians3nu.hamiltonian_3nu_nsi( \ h_vacuum_energy_indep, x*1.e9, VCC_EARTH_CRUST, EPS_3), l) for x in energy_nu] prob_liv = [oscprob3nu.probabilities_3nu( \ hamiltonians3nu.hamiltonian_3nu_liv( \ h_vacuum_energy_indep, x*1.e9, SXI12, SXI23, SXI13, DXICP, B1, B2, B3, LAMBDA), l) for x in energy_nu] # Pee, Pem, Pet, Pme, Pmm, Pmt, Pte, Ptm, Ptt for i, ax in enumerate(np.array(axes).reshape((1, 3))[0]): if (i == 0): # Pee p_vacuum = [x[0] for x in prob_vacuum] # p_vacuum_std = [x[0] for x in prob_vacuum_std] p_matter = [x[0] for x in prob_matter] p_nsi = [x[0] for x in prob_nsi] p_liv = [x[0] for x in prob_liv] ylabel = r'$P_{\nu_e \to \nu_e}$' elif (i == 1): # Pme p_vacuum = [x[3] for x in prob_vacuum] # p_vacuum_std = [x[3] for x in prob_vacuum_std] p_matter = [x[3] for x in prob_matter] p_nsi = [x[3] for x in prob_nsi] p_liv = [x[3] for x in prob_liv] ylabel = r'$P_{\nu_\mu \to \nu_e}$' elif (i == 2): # Pmm p_vacuum = [x[4] for x in prob_vacuum] # p_vacuum_std = [x[4] for x in prob_vacuum_std] p_matter = [x[4] for x in prob_matter] p_nsi = [x[4] for x in prob_nsi] p_liv = [x[4] for x in prob_liv] ylabel = r'$P_{\nu_\mu \to \nu_\mu}$' ax.set_xlabel(r'Neutrino energy [GeV]', fontsize=27) ax.set_ylabel(ylabel, fontsize=27) ax.plot(energy_nu, p_vacuum, color='C0', ls='-', lw=3.0, zorder=1, label=r'Vacuum') # ax.plot(energy_nu, p_vacuum_std, color='k', ls='-', lw=3.0, zorder=1, # label=r'Vacuum std.') ax.plot(energy_nu, p_matter, color='C1', ls='--', lw=3.0, zorder=1, label=r'Matter') ax.plot(energy_nu, p_nsi, color='C2', ls=':', lw=3.0, zorder=1, label=r'NSI') ax.plot(energy_nu, p_liv, color='C3', ls='-.', lw=3.0, zorder=1, label=r'CPT-odd LIV') ax.tick_params('both', length=10, width=2, which='major') ax.tick_params('both', length=5, width=1, which='minor') ax.tick_params(axis='both', which='major', pad=10, direction='in') ax.tick_params(axis='both', which='minor', pad=10, direction='in') ax.tick_params(axis='x', which='minor', bottom=True) ax.tick_params(axis='x', which='minor', top=True) ax.tick_params(axis='y', which='minor', left=True) ax.tick_params(axis='y', which='minor', right=True) ax.tick_params(bottom=True, top=True, left=True, right=True) ax.set_xlim([10.**log10_energy_nu_min, 10.**log10_energy_nu_max]) ax.set_xscale('log') if (i == 0): ax.set_xticklabels([]) ax_yticks_major = np.array([0.85, 0.90, 0.95, 1.00]) ax.set_yticks(ax_yticks_major, minor=False) ax_yticks_minor = np.array([ 0.86, 0.87, 0.88, 0.89, 0.91, 0.92, 0.93, 0.94, 0.96, 0.97, 0.98, 0.99 ]) ax.set_yticks(ax_yticks_minor, minor=True) ax.set_ylim([0.85, 1.00]) ax.legend(loc='lower right', ncol=1, frameon=False, columnspacing=1.) elif (i == 1): ax.set_xticklabels([]) ax_yticks_major = np.array([0.00, 0.05, 0.10]) ax.set_yticks(ax_yticks_major, minor=False) ax_yticks_minor = np.array( [0.01, 0.02, 0.03, 0.04, 0.06, 0.07, 0.08, 0.09, 0.11, 0.12]) ax.set_yticks(ax_yticks_minor, minor=True) ax.set_ylim([0.00, 0.12]) elif (i == 2): ax_yticks_major = np.array([0.00, 0.25, 0.50, 0.75]) ax.set_yticks(ax_yticks_major, minor=False) ax_yticks_minor = np.array([ 0.05, 0.10, 0.15, 0.20, 0.30, 0.35, 0.40, 0.45, 0.55, 0.60, 0.65, 0.70, 0.80, 0.85, 0.90, 0.95 ]) ax.set_yticks(ax_yticks_minor, minor=True) ax.set_ylim([0.0, 1.0]) pylab.savefig(output_path + 'prob_3nu_vs_energy_compare.' + output_format, bbox_inches='tight', dpi=300) return
import sys sys.path.append('../src') import numpy as np import oscprob3nu import hamiltonians3nu from globaldefs import * energy = 1.e9 # Neutrino energy [eV] baseline = 1.3e3 # Baseline [km] h_vacuum_energy_indep = \ hamiltonians3nu.hamiltonian_3nu_vacuum_energy_independent( S12_NO_BF, S23_NO_BF, S13_NO_BF, DCP_NO_BF, D21_NO_BF, D31_NO_BF) # Units of VCC_EARTH_CRUST: [eV] h_matter = hamiltonians3nu.hamiltonian_3nu_matter(h_vacuum_energy_indep, energy, VCC_EARTH_CRUST) Pee, Pem, Pet, Pme, Pmm, Pmt, Pte, Ptm, Ptt = \ oscprob3nu.probabilities_3nu(h_matter, baseline*CONV_KM_TO_INV_EV) print("Pee = %6.5f, Pem = %6.5f, Pet = %6.5f" % (Pee, Pem, Pet)) print("Pme = %6.5f, Pmm = %6.5f, Pmt = %6.5f" % (Pme, Pmm, Pmt)) print("Pte = %6.5f, Ptm = %6.5f, Ptt = %6.5f" % (Pte, Ptm, Ptt))
import oscprob3nu_plot from globaldefs import * baseline = 53 # Baseline [km] f=open("plotvJ_SI.txt","w+") #v for vacuum J for JUNO for energy in np.arange(1000000, 8000000, 1000): # Neutrino energy [eV] # Use the NuFit 4.0 best-fit values of the mixing parameters pulled from # globaldefs. NO means "normal ordering"; change NO to IO if you want # to use inverted ordering. h_vacuum_energy_indep = \ hamiltonians3nu.hamiltonian_3nu_vacuum_energy_independent( S12_NO_BF, S23_NO_BF, S13_NO_BF, DCP_NO_BF, D21_NO_BF, D31_NO_BF, compute_matrix_multiplication=True) h_vacuum = np.multiply(1./energy, h_vacuum_energy_indep) # CONV_KM_TO_INV_EV is pulled from globaldefs; it converts km to eV^{-1} Pee, Pem, Pet, Pme, Pmm, Pmt, Pte, Ptm, Ptt = \ oscprob3nu.probabilities_3nu( h_vacuum, baseline*CONV_KM_TO_INV_EV) #print("Pee = %6.5f, Pem = %6.5f, Pet = %6.5f" % (Pee, Pem, Pet)) #print("Pme = %6.5f, Pmm = %6.5f, Pmt = %6.5f" % (Pme, Pmm, Pmt)) #print("Pte = %6.5f, Ptm = %6.5f, Ptt = %6.5f" % (Pte, Ptm, Ptt)) f.write("%f %f \n" % (energy, 1-Pee))