Blame view

modules/analytic.py 4.74 KB
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
1
from constants import *
d88319ae   Thomas Fitoussi   Update analysis 2...
2
from numpy import sqrt, abs, cos, sin, arcsin, searchsorted, loadtxt, log, array, select, exp
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
188a8c6a   Thomas Fitoussi   Update analysis 2...
9
B_default=1e-15 #Gauss
8ffbee93   Thomas Fitoussi   Analytic expressi...
10
11
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

fb95bd3d   Thomas Fitoussi   Add time delay ve...
15
def Analytic_delay_vs_theta(theta,fileId):
30f3bf5d   Thomas Fitoussi   Adapt reading of ...
16
   Esource,distSource=ReadProfile(fileId,[1,2]) #GeV #Mpc 
188a8c6a   Thomas Fitoussi   Update analysis 2...
17
   lgg = lambda_gg(Esource*1e3)[0]
65135318   Thomas Fitoussi   Reset modules
18
   E0_source = Esource*1e-3 #TeV
65135318   Thomas Fitoussi   Reset modules
19
20
   delta_ic = arcsin(distSource/lgg*sin(theta))
   Dic0=Dic(E0_source/2)
188a8c6a   Thomas Fitoussi   Update analysis 2...
21
   c_delta_t = (lgg*(1-cos(delta_ic)) - distSource*(1-cos(theta)))
fb95bd3d   Thomas Fitoussi   Add time delay ve...
22
23
   return c_delta_t *Mpc/c # sec.

188a8c6a   Thomas Fitoussi   Update analysis 2...
24
25
26
27
28
29
30
31
32
def Analytic_observables_vs_energy(Egamma, fileId):
   B,Eg0,Ds,zs=ReadProfile(fileId,[0,1,2,3]) #Gauss #GeV #Mpc 
   Ee0=Eg0*1e3/2 #GeV
   lgg = lambda_gg(Eg0*1e3,zs)[1]
   RL0=RL(Ee0,B,zs)
   Dic0=Dic(Ee0,zs)
   E_e = Ee(Egamma,zs)
   delta = Dic0/(2*RL0)*((Ee0/E_e)**2 -1)
   theta = arcsin(lgg/Ds*sin(delta))
d88319ae   Thomas Fitoussi   Update analysis 2...
33
   c_delta_t = lgg*(1-cos(delta)) - Ds*(1-cos(theta)) #+Dic(E_e,zs)
3c65fe50   Thomas Fitoussi   Modification in t...
34
   return abs(theta)/degre, c_delta_t *Mpc/c # sec.
f4246390   Thomas Fitoussi   Improve angular d...
35

8ffbee93   Thomas Fitoussi   Analytic expressi...
36
# Compton accumulation
a44230b7   Thomas Fitoussi   Improve approxima...
37
38
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...
39
40

# Compton scattering
a44230b7   Thomas Fitoussi   Improve approxima...
41
42
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...
43

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

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

a44230b7   Thomas Fitoussi   Improve approxima...
50
51
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...
52

8ffbee93   Thomas Fitoussi   Analytic expressi...
53
54
55
56
def tIC():
   return lambdaIC()/(c*yr/Mpc) #yr

# Larmor radius
188a8c6a   Thomas Fitoussi   Update analysis 2...
57
58
def RL(Ee=Ee_default,B=B_default,z=0):
   return (Ee/erg_to_GeV)/(e*B) /(1+z) /Mpc #Mpc
8ffbee93   Thomas Fitoussi   Analytic expressi...
59
60

# Magnetic deflection
188a8c6a   Thomas Fitoussi   Update analysis 2...
61
def delta(Ee=Ee_default,B=B_default,lambda_B=lambda_B_default,z=0):
7f9b17ff   Thomas Fitoussi   Add notebook chec...
62
   Ee=array(Ee)
188a8c6a   Thomas Fitoussi   Update analysis 2...
63
64
65
66
67
68
69
70
   D_ic=Dic(Ee,z)
   condlist=[lambda_B>=D_ic,lambda_B<D_ic]
   delta=[D_ic/RL(Ee,B),sqrt(D_ic*lambda_B)/RL(Ee,B)]
   return select(condlist,delta)

def Delta(Ee=Ee_default,B=B_default,lambda_B=lambda_B_default,z=0,Esource=1e5):
   lgg=lambda_gg(Esource)[0]
   Dsource=distance(z)[1]
3c65fe50   Thomas Fitoussi   Modification in t...
71
   return arcsin(lgg/Dsource*delta(Ee,B,lambda_B,z))/degre
188a8c6a   Thomas Fitoussi   Update analysis 2...
72
73
74
75
76
77
78
79

def Dt(Ee=Ee_default,B=B_default,lambda_B=lambda_B_default,z=0,Esource=1e5):
   lgg=lambda_gg(Esource)[0]
   return lgg/2*delta(Ee,B,lambda_B,z)**2 /c *Mpc/yr

#synchrotron radiation
def Esc(Ee=Ee_default,B=B_default): # eV
   return (3*hb*e*c)/(2*m**3*c**6) * B*(Ee/erg_to_GeV)**2 *erg_to_GeV*1e9
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
   # Bilinear interpolation 
   z_tab = [0,0.5,1,2,3]
188a8c6a   Thomas Fitoussi   Update analysis 2...
91
   E_tab = loadtxt("Results/lambda_e.dat",unpack=True,usecols=[0])*me*1e-6
a44230b7   Thomas Fitoussi   Improve approxima...
92
93
94
95
96
97
98
99
100
101
102
103
104
105
   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])
188a8c6a   Thomas Fitoussi   Update analysis 2...
106
   lambda_e = loadtxt("Results/lambda_e.dat",unpack=True,usecols=[i1+1,i2+1,i1+6,i2+6])
a44230b7   Thomas Fitoussi   Improve approxima...
107
108
109
110
111
112
113
114
115
116
117
   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

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
188a8c6a   Thomas Fitoussi   Update analysis 2...
147
148
149
   return 6.9*(Egamma/0.2)**(-0.9)

def PSF_Taylor2011(E): # E in GeV -> PSF in degre
3c65fe50   Thomas Fitoussi   Modification in t...
150
   return 1.7 * E**(-0.74) * (1+(E/15)**2)**0.37