Commit fb95bd3d6aeb1ad2cee4d9fb4b5a58a7d11e5375
1 parent
f4246390
Exists in
master
Add time delay versus energy and versus arrival angle
Showing
8 changed files
with
116 additions
and
38 deletions
Show diff stats
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