Blame view

modules/analytic.py 4.59 KB
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
1
from constants import *
7f9b17ff   Thomas Fitoussi   Add notebook chec...
2
from numpy import sqrt, abs, cos, sin, arcsin, searchsorted, loadtxt, log, array, select
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
3
4
from scipy.integrate import quad
from read import ReadProfile,resultdir
7030f150   Thomas Fitoussi   Full reorganisati...
5

8ffbee93   Thomas Fitoussi   Analytic expressi...
6
7
# Value for analytic expression
Ee_default=1e3 #GeV
fb95bd3d   Thomas Fitoussi   Add time delay ve...
8
Egamma_default=1 #GeV
8ffbee93   Thomas Fitoussi   Analytic expressi...
9
10
11
B_default=1e-17 #Gauss
lambda_B_default=0.3 #Mpc

7030f150   Thomas Fitoussi   Full reorganisati...
12
def Analytic_flux(E_ic):
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
13
   return  me*1e3/4*sqrt(3e9/Ecmb)*1e-9*E_ic**(-3/2.) #GeV
7030f150   Thomas Fitoussi   Full reorganisati...
14

30f3bf5d   Thomas Fitoussi   Adapt reading of ...
15
16
17
18
def Analytic_theta_vs_energy(E_ic,fileId):
   B,Esource,Dsource=ReadProfile(fileId,[0,1,2]) #Gauss #GeV #Mpc 
   Esource=1e5
   #delta_to_theta=lambda_gg(Esource)/Dsource
a44230b7   Thomas Fitoussi   Improve approxima...
19
   delta_to_theta=1.9440974051313842/Dsource
8ffbee93   Thomas Fitoussi   Analytic expressi...
20
21
   RL0=RL(Esource/2,B)
   Dic0=Dic(Esource/2)
484df032   Thomas Fitoussi   Correction on the...
22
23
   delta=Dic0/(2*RL0)*((Esource/(2*Ee(E_ic)))**2 -1)
   return abs(arcsin(delta_to_theta*sin(delta)))*degre
8ffbee93   Thomas Fitoussi   Analytic expressi...
24

fb95bd3d   Thomas Fitoussi   Add time delay ve...
25
def Analytic_delay_vs_theta(theta,fileId):
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
26
   Esource,distSource=ReadProfile(fileId,[1,2]) #GeV #Mpc 
4d96d628   Thomas Fitoussi   orrection in "ana...
27
   lgg = lambda_gg(Esource)[0]
65135318   Thomas Fitoussi   Reset modules
28
   E0_source = Esource*1e-3 #TeV
65135318   Thomas Fitoussi   Reset modules
29
30
   delta_ic = arcsin(distSource/lgg*sin(theta))
   Dic0=Dic(E0_source/2)
4d96d628   Thomas Fitoussi   orrection in "ana...
31
   c_delta_t = (lgg*(1-cos(delta_ic)) - distSource*(1-cos(theta)))*log(lgg/theta)
fb95bd3d   Thomas Fitoussi   Add time delay ve...
32
33
   return c_delta_t *Mpc/c # sec.

30f3bf5d   Thomas Fitoussi   Adapt reading of ...
34
35
def Analytic_delay_vs_energy(Egamma, fileId):
   B,Esource,Dsource=ReadProfile(fileId,[0,1,2]) #Gauss #GeV #Mpc 
fb95bd3d   Thomas Fitoussi   Add time delay ve...
36
37
   RL0=RL(Esource/2,B)
   Dic0=Dic(Esource/2)
65135318   Thomas Fitoussi   Reset modules
38
   E_e = Ee(Egamma)
4d96d628   Thomas Fitoussi   orrection in "ana...
39
40
   lgg = lambda_gg(Esource)[0]
   #lgg=1.9440974051313842
65135318   Thomas Fitoussi   Reset modules
41
   delta_ic = Dic0/(2*RL0)*((Esource/2/E_e)**2 -1)
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
42
   theta = arcsin(lgg/Dsource*sin(delta_ic))
4d96d628   Thomas Fitoussi   orrection in "ana...
43
   c_delta_t = (lgg*(1-cos(delta_ic)) - Dsource*(1-cos(theta)))*log(lgg/theta)
fb95bd3d   Thomas Fitoussi   Add time delay ve...
44
   return c_delta_t *Mpc/c # sec.
f4246390   Thomas Fitoussi   Improve angular d...
45

8ffbee93   Thomas Fitoussi   Analytic expressi...
46
# Compton accumulation
a44230b7   Thomas Fitoussi   Improve approxima...
47
48
def ECompton_threshold(Compton_threshold = 0.005,z=0):
   return Compton_threshold/(4/3*Ecmb*(1+z)/me*1e-3) *me*1e-6 #GeV
8ffbee93   Thomas Fitoussi   Analytic expressi...
49
50

# Compton scattering
a44230b7   Thomas Fitoussi   Improve approxima...
51
52
def Dic(Ee=Ee_default,z=0): # Ee (GeV)
   return 3*(me*1e3)**2/(4*sigmaT*Ee*1e9*rhoCMB*(1+z)**4) /Mpc #Mpc
8ffbee93   Thomas Fitoussi   Analytic expressi...
53

a44230b7   Thomas Fitoussi   Improve approxima...
54
55
def lambdaIC(z=0):
   return 1/(sigmaT*Mpc*nCMB*(1+z)**3) #Mpc
8ffbee93   Thomas Fitoussi   Analytic expressi...
56

a44230b7   Thomas Fitoussi   Improve approxima...
57
58
def Eic(Ee=Ee_default,z=0):
   return 4*Ecmb*(1+z) *Ee**2/(3*me**2)*1e3 #GeV 
8ffbee93   Thomas Fitoussi   Analytic expressi...
59

a44230b7   Thomas Fitoussi   Improve approxima...
60
61
def Ee(Egamma=Egamma_default,z=0):
   return me*sqrt((3*Egamma*1e-3 )/(4*Ecmb*(1+z))) #GeV 
fb95bd3d   Thomas Fitoussi   Add time delay ve...
62

8ffbee93   Thomas Fitoussi   Analytic expressi...
63
64
65
66
67
68
69
70
71
72
73
74
def tIC():
   return lambdaIC()/(c*yr/Mpc) #yr

# Larmor radius
def RL(Ee=Ee_default,B=B_default):
   return (Ee/erg_to_GeV)/(e*B) /Mpc #Mpc

# Magnetic deflection
def delta(Ee=Ee_default,B=B_default):
   return lambdaIC()/RL(Ee,B)*degre

def Delta(Ee=Ee_default,B=B_default,lambda_B=lambda_B_default):
7f9b17ff   Thomas Fitoussi   Add notebook chec...
75
76
77
78
79
   Ee=array(Ee)
   D_ic=Dic(Ee)
   condlist=[lambda_B>D_ic,lambda_B<D_ic]
   Delta=[Dic(Ee)/RL(Ee,B)*degre,sqrt(Dic(Ee)*lambda_B)/RL(Ee,B)*degre]
   return select(condlist,Delta)
8ffbee93   Thomas Fitoussi   Analytic expressi...
80
81
82
83

# Threshold energy when Dic = RL
def Ethreshold_ic(Ee=Ee_default,B=B_default):
   return Eic(Ee)*Dic(Ee)/RL(Ee,B) # GeV
8ffbee93   Thomas Fitoussi   Analytic expressi...
84

d943e502   Thomas Fitoussi   Update 'analysis'...
85
86
def Ethreshold_gg(epsilon=Eebl):
   return (me)**2/epsilon *1e-3 #GeV
8ffbee93   Thomas Fitoussi   Analytic expressi...
87

30f3bf5d   Thomas Fitoussi   Adapt reading of ...
88
def lambda_gg(Egamma=1e3,z=0): # Egamma (GeV)
a44230b7   Thomas Fitoussi   Improve approxima...
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
   # Bilinear interpolation 
   z_tab = [0,0.5,1,2,3]
   E_tab = loadtxt("lambda_e.dat",unpack=True,usecols=[0])*me*1e-6
   i2 = searchsorted(z_tab,z)
   if z<=0:
      fy=1
      i1=i2
   elif z>3:
      fy=1
      i2-=1
      i1=i2
   else:
      i1 = i2-1
      fy=(z-z_tab[i1])/(z_tab[i2]-z_tab[i1])
   j2 = searchsorted(E_tab,Egamma)
   j1 = j2-1
   fx=(Egamma-E_tab[j1])/(E_tab[j2]-E_tab[j1])
   lambda_e = loadtxt("lambda_e.dat",unpack=True,usecols=[i1+1,i2+1,i1+6,i2+6])
   lambda11 = lambda_e[0,j1]*((1-fx)*(1-fy))
   lambda12 = lambda_e[1,j1]*((1-fx)*fy)
   lambda21 = lambda_e[0,j2]*(fx*(1-fy))
   lambda22 = lambda_e[1,j2]*(fx*fy)
   lambda_proper = lambda11 + lambda12 + lambda21 + lambda22
   lambda11 = lambda_e[2,j1]*((1-fx)*(1-fy))
   lambda12 = lambda_e[3,j1]*((1-fx)*fy)
   lambda21 = lambda_e[2,j2]*(fx*(1-fy))
   lambda22 = lambda_e[3,j2]*(fx*fy)
   lambda_comobile = lambda11 + lambda12 + lambda21 + lambda22
   return lambda_proper, lambda_comobile, 800.e3/Egamma #Mpc (from Durrer and Neronov 2013)
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

def comobileTime(z):
   return -1/(H0*(1+z)*sqrt(omegaM*(1+z)**3+omegaK*(1+z)**2+omegaL))

def distPhoton(z):
   return -c/(H0*a0*sqrt(omegaM*(1+z)**3+omegaK*(1+z)**2+omegaL))

def distLepton(z,E):
   beta = sqrt(1-m**2*c**4/E**2)
   return -beta*c/(H0*a0*sqrt(omegaM*(1+z)**3+omegaK*(1+z)**2+omegaL))

def properIntegrand(z):
   return -c/(H0*(1+z)*sqrt(omegaM*(1+z)**3+omegaK*(1+z)**2+omegaL))

def comobileIntegrand(z):
   return -c/(H0*sqrt(omegaM*(1+z)**3+omegaK*(1+z)**2+omegaL))

def distance(z=0):
   return quad(properIntegrand,z,0)[0]/Mpc, quad(comobileIntegrand,z,0)[0]/Mpc
7f9b17ff   Thomas Fitoussi   Add notebook chec...
137
138
139
140
141
142
143
144
145
146
147

def Ecut(z=0.1): # TeV
   z=array(z)
   z1= 0.045
   z2= 0.1
   condlist=[z<z1,(z>=z1)&(z<z2),z>=z2]
   Ecut=[54*(z/0.001)**(-0.5),3.4*(z/0.06)**(-3),0.35*(z/0.4)**(-0.5)]
   return select(condlist,Ecut)

def Etarget(Egamma=1): # Egamma en TeV, Etarget en eV
    return 6.9*(Egamma/0.2)**(-0.9)