-
Notifications
You must be signed in to change notification settings - Fork 1
/
NeutrinoMassFuncs.py
211 lines (166 loc) · 6.15 KB
/
NeutrinoMassFuncs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#================================NeutrinoMassFuncs.py==================================#
# Created by Yanina Biondi 2019
# This file contains neutrino oscillation parameters from V41 nu-Fit http://www.nu-fit.org/sites/default/files/v41.tbl-parameters.pdf no SK atmospheric data
# Description of the parameters
'''
:param m1: Mass of the m1 eigenstate
:param s12sq: sin^2 theta12
:param s13sq: sin^2 theta13
:param s23sq: sin^2 theta23
:param dm21sq: Delta m21 squared
:param dm32sq: Delta m32 squared
:param phi2: First Majorana phase
:param phi3: Second Majorana phase
:param hierarchy: Positive for normal, negative for inverted
:returns: mbb in the same units as m1
suffix 3s stands for 3 sigma, while L and H stands for lower and upper limit.
suffix IO stands for Inverted Ordering
'''
#==============================================================================#
import numpy as np
class EffectiveMajoranaMass:
"""
A class that represents the neutrino oscillation parameters
...
Attributes
----------
s12sq : double
sin^2 theta12
s13sq : double
sin^2 theta13
s23sq : double
sin^2 theta23
dm21sq : double
Delta m21 squared
dm32sq : double
Delta m32 squared
Methods
-------
calculateEffectiveMajoranaMass(m1, phi2, phi3):
Compute the effective Majorana mass for given parameters.
EffectiveMajoranaMassRange(m1, step=0.001):
Calculates the effective Majorana mass range for a given m1 lightest neutrino mass
findEffectiveMajoranaMassRegion(region = np.logspace(-5,0,100)
Finds the curve of effective Majorana mass for a lightest neutrino mass in region.
"""
def __init__(self, s12sq, s23sq , s13sq , dm21sq, dm32sq, hierarchy):
self.hierarchy = hierarchy
self.s12sq = s12sq
self.s13sq = s13sq
self.s23sq = s23sq
self.dm21sq = dm21sq
self.dm32sq = dm32sq
def calculateEffectiveMajoranaMass(self, m1, phi2, phi3):
"""
Compute the effective Majorana mass for given parameters.
Parameters
----------
m1 : double
lightest neutrino
phi2: double
First Majorana phase
phi3: double
Second Majorana phase
Returns
-------
mbb : double
Effective Majorana mass
"""
t12 = np.arcsin(np.sqrt(self.s12sq))
t13 = np.arcsin(np.sqrt(self.s13sq))
t23 = np.arcsin(np.sqrt(self.s23sq))
if self.hierarchy > 0:
m2 = np.sqrt(np.square(m1) + self.dm21sq)
m3 = np.sqrt(np.square(m2) + self.dm32sq)
else:
# m3 is the lighest!
m2 = np.sqrt(np.square(m1) + self.dm32sq)
m3 = np.sqrt(np.square(m2) + self.dm21sq)
m1, m3 = m3, m1
mbb = np.abs(np.square(np.cos(t13)) * np.square(np.cos(t12)) * m1 +
np.square(np.cos(t13)) * self.s12sq * m2 * np.exp(1j * phi2) +
self.s13sq * m3 * np.exp(1j * phi3))
return mbb
def EffectiveMajoranaMassRange(self, m1, step=0.01):
"""
Compute range of efective Majorana mass for the lightest neutrino of mass m1.
Parameters
----------
m1 : double
lightest neutrino
step: double, optional
Granularity of points to scan for Majorana phases
Returns
-------
(np.min(mbbs), np.max(mbbs)) : tuple
Lowest and highest values of effective Majorana mass given the lightest neutrino mass m1
"""
phis = np.arange(0, 2 * np.pi, step)
# Create a grid of mbbs with phi2 and phi3 taking on all combinations
mbbs = self.calculateEffectiveMajoranaMass(m1, phis, phis[:,np.newaxis])
return (np.min(mbbs), np.max(mbbs))
def findEffectiveMajoranaMassRegion(self, region = np.logspace(-5,0,100)):
"""
Compute range of efective Majorana mass for the lightest neutrino of mass m1.
Parameters
----------
region : array of len 100, optional
Values of lightest neutrino mass to obtain the effective Majorana mass
Returns
-------
g : tuple
Effective Majorana mass curves of dim (100, 2)
"""
# Values of m_lightest to evaluate [eV]
# Loop over m_lightests to find the mbb range for each
y = []
for m in region:
r = self.EffectiveMajoranaMassRange(m)
y.append(r)
# Invert to get a tuple of (lower bounds, upper bounds)
y = np.array(list(zip(*y)))
g = np.zeros((2*len(region),2))
for i in range(len(region)):
g[i,0] = region[i]
g[i,1] = y[0][i]
g[len(region)+i,0] = region[-i-1]
g[len(region)+i,1] = y[1][-i-1]
return g
#===== Normal Ordering =====#
s12sqNO = 0.310
s23sqNO = 0.558
s13sqNO = 0.02241
dm21sqNO = 7.39e-5
dm32sqNO = 2.528e-3
OscParametersNO = EffectiveMajoranaMass(s12sqNO,s23sqNO,s13sqNO,dm21sqNO,dm32sqNO, 1)
s12sqNO3sL= 0.275
s23sqNO3sL= 0.427
s13sqNO3sL= 0.02046
dm21sqNO3sL= 6.79e-5
dm32sqNO3sL= 2.432e-3
OscParametersNOL = EffectiveMajoranaMass(s12sqNO3sL, s23sqNO3sL, s13sqNO3sL, dm21sqNO3sL, dm32sqNO3sL,1)
s12sqNO3sH = 0.350
s23sqNO3sH = 0.609
s13sqNO3sH = 0.02440
dm21sqNO3sH = 8.01e-5
dm32sqNO3sH = 2.618e-3
OscParametersNOH = EffectiveMajoranaMass(s12sqNO3sH, s23sqNO3sH, s13sqNO3sH, dm21sqNO3sH, dm32sqNO3sH,1)
#===== Inverted Ordering =====#
s12sqIO = 0.310
s23sqIO = 0.563
s13sqIO = 0.02261
dm21sqIO = 7.39e-5
dm32sqIO = 2.509e-3
OscParametersIO = EffectiveMajoranaMass(s12sqIO,s23sqIO,s13sqIO,dm21sqIO,dm32sqIO, -1)
s12sqIO3sL= 0.275
s23sqIO3sL= 0.430
s13sqIO3sL= 0.02066
dm21sqIO3sL= 6.79e-5
dm32sqIO3sL= 2.603e-3
OscParametersIOL = EffectiveMajoranaMass(s12sqIO3sL, s23sqIO3sL, s13sqIO3sL, dm21sqIO3sL, dm32sqIO3sL, -1)
s12sqIO3sH = 0.350
s23sqIO3sH = 0.612
s13sqIO3sH = 0.02461
dm21sqIO3sH = 8.01e-5
dm32sqIO3sH = 2.416e-3
OscParametersIOH = EffectiveMajoranaMass(s12sqIO3sH, s23sqIO3sH, s13sqIO3sH, dm21sqIO3sH, dm32sqIO3sH, -1)