This post assumes some knowledge of the physics of neutrinos. I have made a thorough review of neutrino oscillations available elsewhere. Here we will have a brief look at neutrino oscillations in matter, the MSW effect, assuming only an interaction between electron and muon neutrinos. I have seen nothing but poor visualisations of the MSW effect in the literature, which is the motivation for this post.

The general survival probability of electron neutrinos, the probability that electron neutrinos does not change into muon neutrinos, in matter is \[P_{\nu_e\rightarrow\nu_e} = \frac{1}{2}+\left(\frac{1}{2}-P_f\right)\cos2\theta\cos2\tilde{\theta}\]
\[P_f = e^{-\frac{\pi}{2}\gamma}\] and \[\gamma = 2.554\times 10^3\frac{\sin^22\theta}{\cos2\theta}\frac{1}{x}\] where
\[x = \frac{A}{\Delta m^2}\] and the mixing parameter \[A = 2\sqrt{2}G_F En_e.\]

Plotting the survival probability of electron neutrinos as a function of the mixing parameter $x$ and the mixing angle $\sin^22\theta$ reveals the MSW triangle related to the MSW effect.

Inside the triangle we find an area with a high conversion rate of electron neutrinos to muon neutrinos. For small mixing angles the electron neutrinos have a high probability of surviving outside the triangle. At very high mixing angles the survival probability approaches $0.5$ as expected since $\sin^22\theta=1$ corresponds to a mixing angle of $\pi/4$ which is the angle of maximum mixing.

2023 update

I received interest in reproducing the figure above, so I found the code I originally used to create it. The figure can be reproduced using the Python code below.

import numpy as np
import matplotlib.pyplot as plt

# Set the resolution of the figure
# Larger values give higher resolution but take longer to compute
# Try starting with smaller values
sinsteps = 1000  # x direction
xsteps = 1000  # y direction

sintt = 10**np.linspace(-3.7, 0, sinsteps)  # Mixing angle
Rsun = 6.96342e8  # Radius of the Sun [m]
hbar = 6.58211928e-16  # Planck constant [eV*s]
c = 2.99792e8  # Speed of light [m/s]

# Calculate survival probability for different mixing angles and mixing parameters
P = np.zeros([xsteps, sinsteps])
ydata = []
for i in sintt:
    costotheta = np.cos(np.arcsin(np.sqrt(i)))
    index = -1
    for x in 10**np.linspace(-1, 6, xsteps):
        if np.shape(ydata)[0] < xsteps:
        costothetatilde = (-x + costotheta) / np.sqrt((x - costotheta)**2 + i)
        gamma = Rsun / (2 * x * 10.5) * i / costotheta * (1.52e-5 / 1e6) * 1 / (hbar * c)
        Pf = np.exp(-np.pi * .5 * gamma)
        Pv = .5 + (.5 - Pf) * costotheta * costothetatilde
        P[index,s] = Pv
        index -= 1

# Turn the results into a heatmap
X, Y = np.meshgrid(sintt, ydata[::-1])
plt.pcolor(X, Y, P, cmap="jet")

# Styling the figure
plt.colorbar().set_label(r'Survival probability, $\nu_e\rightarrow\nu_e$')
plt.axis([sintt[0], sintt[-1], .1, 1e6])
plt.title('The MSW triangle')
plt.ylabel(r'$A/\Delta m^2$')
plt.savefig('triangle.png', bbox_inches='tight', dpi=400)