Commit fb95bd3d6aeb1ad2cee4d9fb4b5a58a7d11e5375

Authored by Thomas Fitoussi
1 parent f4246390
Exists in master

Add time delay versus energy and versus arrival angle

EBL-spectrums.py
@@ -16,40 +16,40 @@ lamb,lambdaI = np.loadtxt("EBL_files/lambdaI_Dominguez.dat",unpack=True,usecols= @@ -16,40 +16,40 @@ lamb,lambdaI = np.loadtxt("EBL_files/lambdaI_Dominguez.dat",unpack=True,usecols=
16 hv = h*c/(lamb*1e-4) # erg 16 hv = h*c/(lamb*1e-4) # erg
17 density = 1e-6*(4*pi/c)*lambdaI/(hv**2) /(erg_to_GeV*1e9) *(1+z)**3 17 density = 1e-6*(4*pi/c)*lambdaI/(hv**2) /(erg_to_GeV*1e9) *(1+z)**3
18 hv = hv *(erg_to_GeV*1e9) 18 hv = hv *(erg_to_GeV*1e9)
19 -ax.plot(hv,density,"--b",label="Dominguez and Al") 19 +ax.plot(hv,density*hv**2,"--b",label="Dominguez and Al")
20 20
21 # ==== Kneiske and Doll - "best fit" ==== 21 # ==== Kneiske and Doll - "best fit" ====
22 hv,density = np.loadtxt("EBL_files/n_bestfit10.dat",unpack=True,usecols=[0,1]) 22 hv,density = np.loadtxt("EBL_files/n_bestfit10.dat",unpack=True,usecols=[0,1])
23 -ax.plot(hv,density,"--r",label="Kneiske and Doll - 'best fit'") 23 +ax.plot(hv,density*hv**2,"--r",label="Kneiske and Doll - 'best fit'")
24 24
25 # ==== Kneiske and Doll - "lower limit" ==== 25 # ==== Kneiske and Doll - "lower limit" ====
26 hv,density = np.loadtxt("EBL_files/n_lowerlimit10.dat",unpack=True,usecols=[0,179]) 26 hv,density = np.loadtxt("EBL_files/n_lowerlimit10.dat",unpack=True,usecols=[0,179])
27 #hv,density =np.loadtxt("EBL_files/n_lowerlimit10.dat",unpack=True,usecols=[0,1]) 27 #hv,density =np.loadtxt("EBL_files/n_lowerlimit10.dat",unpack=True,usecols=[0,1])
28 density=density*(1+z)**3 28 density=density*(1+z)**3
29 -ax.plot(hv,density,"--g",label="Kneiske and Doll - 'lower limit'") 29 +ax.plot(hv,density*hv**2,"--g",label="Kneiske and Doll - 'lower limit'")
30 30
31 # ==== Fransceschini ==== 31 # ==== Fransceschini ====
32 hv,density = np.loadtxt("EBL_files/n_Fra.dat",unpack=True,usecols=[0,11]) 32 hv,density = np.loadtxt("EBL_files/n_Fra.dat",unpack=True,usecols=[0,11])
33 #hv,density = np.loadtxt("EBL_files/n_Fra.dat",unpack=True,usecols=[0,1]) 33 #hv,density = np.loadtxt("EBL_files/n_Fra.dat",unpack=True,usecols=[0,1])
34 density=density*(1+z)**3 34 density=density*(1+z)**3
35 -ax.plot(hv,density,"--c",label="Fraceschini") 35 +ax.plot(hv,density*hv**2,"--c",label="Fraceschini")
36 36
37 # ==== Finke ==== 37 # ==== Finke ====
38 hv,density = np.loadtxt("EBL_files/n_Finke.dat",unpack=True,usecols=[0,201]) 38 hv,density = np.loadtxt("EBL_files/n_Finke.dat",unpack=True,usecols=[0,201])
39 #hv,density = np.loadtxt("EBL_files/n_Finke.dat",unpack=True,usecols=[0,1]) 39 #hv,density = np.loadtxt("EBL_files/n_Finke.dat",unpack=True,usecols=[0,1])
40 density=density*(1+z)**3 40 density=density*(1+z)**3
41 -ax.plot(hv,density,"--m",label="Finke and Al") 41 +ax.plot(hv,density*hv**2,"--m",label="Finke and Al")
42 42
43 # ==== Gilmore ==== 43 # ==== Gilmore ====
44 hv,density = np.loadtxt("EBL_files/n_Gil.dat",unpack=True,usecols=[0,14]) 44 hv,density = np.loadtxt("EBL_files/n_Gil.dat",unpack=True,usecols=[0,14])
45 #hv,density = np.loadtxt("EBL_files/n_Gil.dat",unpack=True,usecols=[0,1]) 45 #hv,density = np.loadtxt("EBL_files/n_Gil.dat",unpack=True,usecols=[0,1])
46 -ax.plot(hv,density,"--y",label="Gilmore and Al") 46 +ax.plot(hv,density*hv**2,"--y",label="Gilmore and Al")
47 47
48 ax.set_xscale('log') 48 ax.set_xscale('log')
49 ax.set_yscale('log') 49 ax.set_yscale('log')
50 ax.grid(b=True,which='major') 50 ax.grid(b=True,which='major')
51 ax.legend(loc="best",title="z = %.0f"%z) 51 ax.legend(loc="best",title="z = %.0f"%z)
52 ax.set_xlabel("energy [eV]") 52 ax.set_xlabel("energy [eV]")
53 -ax.set_ylabel("$n_{EBL}$ [$cm^{-3} eV^{-1}$]") 53 +ax.set_ylabel("$n_{EBL}$ [$eV.cm^{-3}$]")
54 54
55 plt.show() 55 plt.show()
Modules/Analytic.py
@@ -4,6 +4,7 @@ from Read import ReadE_source, ReadD_source, ReadEGMF @@ -4,6 +4,7 @@ from Read import ReadE_source, ReadD_source, ReadEGMF
4 4
5 # Value for analytic expression 5 # Value for analytic expression
6 Ee_default=1e3 #GeV 6 Ee_default=1e3 #GeV
  7 +Egamma_default=1 #GeV
7 B_default=1e-17 #Gauss 8 B_default=1e-17 #Gauss
8 lambda_B_default=0.3 #Mpc 9 lambda_B_default=0.3 #Mpc
9 10
@@ -21,12 +22,24 @@ def Analytic_theta(E_ic,fileId): @@ -21,12 +22,24 @@ def Analytic_theta(E_ic,fileId):
21 delta=Dic0/(2*RL0)*((Esource/2)**2 /Ee2 -1) 22 delta=Dic0/(2*RL0)*((Esource/2)**2 /Ee2 -1)
22 return abs(arcsin(delta_to_theta*sin(delta))*degre) 23 return abs(arcsin(delta_to_theta*sin(delta))*degre)
23 24
24 -def Analytic_delay(theta, E0_source, distSource):  
25 - delta_ic = arcsin(lambda_gg(E0_source)/distSource*theta/degre)  
26 - #c_delta_t = lambda_gg(E0_source)*(1-cos(delta_ic))-distSource*(1-cos(theta))  
27 - #return abs(c_delta_t*Mpc/c)  
28 - coef = lambda_gg(E0_source)/(2*c/Mpc)  
29 - return coef*delta_ic#**2 25 +def Analytic_delay_vs_theta(theta,fileId):
  26 + E0_source = ReadE_source(fileId)*1e-3 #TeV
  27 + distSource = ReadD_source(fileId)
  28 + delta_ic = arcsin(distSource/lambda_gg(E0_source)*sin(theta/degre))
  29 + c_delta_t = lambda_gg(E0_source)*(1-cos(delta_ic)) - distSource*(1-cos(theta/degre))
  30 + return c_delta_t *Mpc/c # sec.
  31 +
  32 +def Analytic_delay_vs_Egamma(Egamma, fileId):
  33 + Esource=ReadE_source(fileId) #GeV
  34 + Dsource=ReadD_source(fileId) #Mpc
  35 + B=ReadEGMF(fileId) #Gauss
  36 + RL0=RL(Esource/2,B)
  37 + Dic0=Dic(Esource/2)
  38 + Ee2 = Ee(Egamma)**2
  39 + delta_ic = Dic0/(2*RL0)*((Esource/2)**2 /Ee2 -1)
  40 + theta = arcsin(lambda_gg(Esource)/Dsource*sin(delta_ic/degre))
  41 + c_delta_t = lambda_gg(Esource)*(1-cos(delta_ic)) - Dsource*(1-cos(theta/degre))
  42 + return c_delta_t *Mpc/c # sec.
30 43
31 # Compton accumulation 44 # Compton accumulation
32 def ECompton_threshold(Compton_threshold = 0.005): 45 def ECompton_threshold(Compton_threshold = 0.005):
@@ -42,6 +55,9 @@ def lambdaIC(): @@ -42,6 +55,9 @@ def lambdaIC():
42 def Eic(Ee=Ee_default): 55 def Eic(Ee=Ee_default):
43 return 4*Ecmb*Ee**2/(3*me**2)*1e3 #GeV 56 return 4*Ecmb*Ee**2/(3*me**2)*1e3 #GeV
44 57
  58 +def Ee(Egamma=Egamma_default):
  59 + return sqrt((3*me**2)/(4*Ecmb)*1e-3 *Egamma) #GeV
  60 +
45 def tIC(): 61 def tIC():
46 return lambdaIC()/(c*yr/Mpc) #yr 62 return lambdaIC()/(c*yr/Mpc) #yr
47 63
@@ -66,6 +82,6 @@ def Ethreshold_ic(Ee=Ee_default,B=B_default): @@ -66,6 +82,6 @@ def Ethreshold_ic(Ee=Ee_default,B=B_default):
66 def Ethreshold_gg(): 82 def Ethreshold_gg():
67 return (me)**2/Eebl *1e-3 #GeV 83 return (me)**2/Eebl *1e-3 #GeV
68 84
69 -def lambda_gg(Egamma=1e3): # Egamma (GeV)  
70 - return 0.8 /(Egamma*1e-3) *1e3#Mpc (from Durrer and Neronov 2013) 85 +def lambda_gg(Egamma=1): # Egamma (GeV)
  86 + return 800. /(Egamma)#Mpc (from Durrer and Neronov 2013)
71 87
Modules/Analytic.pyc
No preview for this file type
Modules/Angle.py
@@ -44,11 +44,12 @@ def angle_vs_energy(fileName): @@ -44,11 +44,12 @@ def angle_vs_energy(fileName):
44 nbBins = 40 44 nbBins = 40
45 45
46 energy =log10(energy) 46 energy =log10(energy)
47 - angle,ener =histogram(energy,nbBins,weights=weight*theta) 47 + angle,ener =histogram(energy,nbBins,weights=theta*weight)
48 nb,ener =histogram(energy,nbBins,weights=weight) 48 nb,ener =histogram(energy,nbBins,weights=weight)
49 ener = 10**ener 49 ener = 10**ener
50 enercenter=(ener[1:nbBins+1]+ener[0:nbBins])/2 50 enercenter=(ener[1:nbBins+1]+ener[0:nbBins])/2
51 - angle = angle/nb 51 + maxflux = ReadNphot_source(fileName)
  52 + angle = angle/(nb*maxflux)
52 53
53 return enercenter, angle 54 return enercenter, angle
54 55
Modules/Angle.pyc
No preview for this file type
Modules/Spectrum.pyc
No preview for this file type
Modules/Timing.py
@@ -2,10 +2,10 @@ from numpy import histogram, log10, shape, sqrt, arccos @@ -2,10 +2,10 @@ from numpy import histogram, log10, shape, sqrt, arccos
2 from matplotlib.pyplot import figure, show 2 from matplotlib.pyplot import figure, show
3 from scipy.integrate import quad 3 from scipy.integrate import quad
4 from Read import ReadTime, ReadWeight, ReadGeneration, ReadE_source, ReadD_source 4 from Read import ReadTime, ReadWeight, ReadGeneration, ReadE_source, ReadD_source
5 -from Read import ReadNphot_source,ReadPosition,ReadMomentum,ReadNbLeptonsProd 5 +from Read import ReadNphot_source,ReadPosition,ReadMomentum,ReadNbLeptonsProd,ReadEnergy
6 from Constants import yr, degre 6 from Constants import yr, degre
7 from Integrand import comobileTime 7 from Integrand import comobileTime
8 -from Analytic import Analytic_delay 8 +from Analytic import Analytic_delay_vs_theta,Analytic_delay_vs_Egamma
9 9
10 def timing(fileId,gen=-1): 10 def timing(fileId,gen=-1):
11 ''' 11 '''
@@ -93,8 +93,10 @@ def delay_vs_angle(fileId,gen=-1): @@ -93,8 +93,10 @@ def delay_vs_angle(fileId,gen=-1):
93 ''' 93 '''
94 position = ReadPosition(fileId) 94 position = ReadPosition(fileId)
95 momentum = ReadMomentum(fileId) 95 momentum = ReadMomentum(fileId)
  96 + energy = ReadEnergy(fileId)
96 weight = ReadWeight(fileId) 97 weight = ReadWeight(fileId)
97 time=ReadTime(fileId) 98 time=ReadTime(fileId)
  99 + generation = ReadGeneration(fileId)
98 100
99 hyp=sqrt(position[0]**2+position[1]**2+position[2]**2) 101 hyp=sqrt(position[0]**2+position[1]**2+position[2]**2)
100 position /= hyp 102 position /= hyp
@@ -103,21 +105,20 @@ def delay_vs_angle(fileId,gen=-1): @@ -103,21 +105,20 @@ def delay_vs_angle(fileId,gen=-1):
103 costheta=position[0]*momentum[0]+position[1]*momentum[1]+position[2]*momentum[2] 105 costheta=position[0]*momentum[0]+position[1]*momentum[1]+position[2]*momentum[2]
104 106
105 if gen != -1 : 107 if gen != -1 :
106 - generation = ReadGeneration(fileId)  
107 - cond=(abs(costheta)<=1) & (generation==gen) & (time>0) 108 + cond=(abs(costheta)<=1) & (generation==gen) & (time>0) & (energy>1)
108 else: 109 else:
109 - cond=(abs(costheta)<=1) & (time>0) 110 + cond=(abs(costheta)<=1) & (time>0) & (energy>1)
110 111
111 prop = float(shape(time[time<0])[0])/shape(time)[0] 112 prop = float(shape(time[time<0])[0])/shape(time)[0]
  113 + print "gen", int(gen), "->", shape(time[time<0])[0], "negative time events among ",shape(time)[0], "~", prop
112 theta = arccos(costheta[cond])*degre 114 theta = arccos(costheta[cond])*degre
113 weight= weight[cond] 115 weight= weight[cond]
114 time=time[cond]*yr 116 time=time[cond]*yr
115 - print "gen", int(gen), "->", shape(time)[0], "events", "negative time:",shape(time[time<0])[0], "~", prop  
116 cond=(theta!=0) 117 cond=(theta!=0)
117 - return theta[cond], time[cond], weight[cond] 118 + return theta[cond], time[cond], weight[cond], generation[cond]
118 119
119 def delay_vs_angle_histo(fileId,gen=-1): 120 def delay_vs_angle_histo(fileId,gen=-1):
120 - theta, time, weight = delay_vs_angle(fileId,gen) 121 + theta, time, weight, generation = delay_vs_angle(fileId,gen)
121 nbBins = 100 122 nbBins = 100
122 123
123 theta=log10(theta) 124 theta=log10(theta)
@@ -138,22 +139,17 @@ def drawDelay_vs_angle(fileId): @@ -138,22 +139,17 @@ def drawDelay_vs_angle(fileId):
138 fig = figure() 139 fig = figure()
139 ax = fig.add_subplot(111) 140 ax = fig.add_subplot(111)
140 141
141 - Nmax = ReadNphot_source(fileId)  
142 -  
143 - for gen in list(set(ReadGeneration(fileId))):  
144 - angle,delay,weight = delay_vs_angle(fileId,gen)  
145 - ax.plot(angle,delay/weight/Nmax,".",label="gen="+str(int(gen)))  
146 -  
147 - #angle,delay = delay_vs_angle_histo(fileId,gen)  
148 - #ax.plot(angle,delay,linestyle="steps-mid",label="gen="+str(int(gen))) 142 + angle,delay,weight,generation = delay_vs_angle(fileId)
  143 + #for gen in list(set(generation)):
  144 + for gen in [2]:
  145 + cond= (generation==gen)
  146 + ax.plot(angle[cond],delay[cond]/weight[cond],".",label="gen="+str(int(gen)))
149 147
150 angle,delay = delay_vs_angle_histo(fileId) 148 angle,delay = delay_vs_angle_histo(fileId)
151 - ax.plot(angle,delay/Nmax,color='k',linestyle="steps-mid",label="gen=all") 149 + #ax.plot(angle,delay,color='k',linestyle="steps-mid",label="gen=all")
152 150
153 - Esource = ReadE_source(fileId)  
154 - dSource = ReadD_source(fileId)  
155 - yfit = Analytic_delay(angle,Esource,dSource)  
156 - ax.plot(angle,yfit,'--k',linewidth=2) 151 + delay_fit = Analytic_delay_vs_theta(angle,fileId)
  152 + ax.plot(angle,delay_fit,'--r',linewidth=2)
157 153
158 ax.set_xscale('log') 154 ax.set_xscale('log')
159 ax.set_yscale('log') 155 ax.set_yscale('log')
@@ -163,3 +159,68 @@ def drawDelay_vs_angle(fileId): @@ -163,3 +159,68 @@ def drawDelay_vs_angle(fileId):
163 ax.set_ylabel("Time delay [s]") 159 ax.set_ylabel("Time delay [s]")
164 160
165 show() 161 show()
  162 +
  163 +######## delay versus angle ###############
  164 +def delay_vs_energy(fileId,gen=-1):
  165 + '''
  166 + Compute time delay versus arrival angle
  167 + Input: directory name
  168 + Input (optional): generation (default = all)
  169 + Output: arrival angle [degre], time delay [sec]
  170 + '''
  171 + energy = ReadEnergy(fileId)
  172 + weight = ReadWeight(fileId)
  173 + time=ReadTime(fileId)
  174 + generation = ReadGeneration(fileId)
  175 +
  176 + if gen != -1 :
  177 + cond= (generation==gen) & (time>0) & (energy>1)
  178 + else:
  179 + cond= (time>0) & (energy>1)
  180 +
  181 + prop = float(shape(time[time<0])[0])/shape(time)[0]
  182 + print "gen", int(gen), "->", shape(time[time<0])[0], "negative time events among ",shape(time)[0], "~", prop
  183 + return energy[cond], time[cond]*yr, weight[cond], generation[cond]
  184 +
  185 +def delay_vs_energy_histo(fileId,gen=-1):
  186 + energy, time, weight, generation = delay_vs_energy(fileId,gen)
  187 + nbBins = 100
  188 +
  189 + energy=log10(energy)
  190 + dt,dE=histogram(energy,nbBins,weights=time)
  191 + dN,dE=histogram(energy,nbBins,weights=weight)
  192 + dE=10**dE
  193 + Ecenter=(dE[1:nbBins+1]+dE[0:nbBins])/2
  194 + timing = dt/dN
  195 +
  196 + return Ecenter, timing
  197 +
  198 +def drawDelay_vs_energy(fileId):
  199 + '''
  200 + Plot angle versus time delay, generation by generation
  201 + Input: directory name
  202 + Output: graph of angle versus time delay, generation by generation
  203 + '''
  204 + fig = figure()
  205 + ax = fig.add_subplot(111)
  206 +
  207 + energy,delay,weight,generation = delay_vs_energy(fileId)
  208 + #for gen in list(set(generation)):
  209 + for gen in [2]:
  210 + cond= (generation==gen)
  211 + ax.plot(energy[cond],delay[cond]/weight[cond],".",label="gen="+str(int(gen)))
  212 +
  213 + energy,delay = delay_vs_energy_histo(fileId)
  214 + #ax.plot(energy,delay,color='k',linestyle="steps-mid",label="gen=all")
  215 +
  216 + delay_fit = Analytic_delay_vs_Egamma(energy,fileId)
  217 + ax.plot(energy,delay_fit,'--r',linewidth=2)
  218 +
  219 + ax.set_xscale('log')
  220 + ax.set_yscale('log')
  221 + ax.grid(b=True,which='major')
  222 + ax.legend(loc="best")
  223 + ax.set_xlabel("E [GeV]")
  224 + ax.set_ylabel("Time delay [s]")
  225 +
  226 + show()
Modules/Timing.pyc
No preview for this file type