Commit 074c1729389f8fae1c62b0dbb1f1245a04272783
1 parent
65135318
Exists in
master
Analysis.py used to pre-compute spectrum, timing and radial distribution
computing done for power source spectrum (p= 1, 1.5, 2, 2.5) speed-up graph drawing, no need to recompute each time everything
Showing
11 changed files
with
175 additions
and
91 deletions
Show diff stats
Analysis.py
1 | 1 | #!/bin/python |
2 | 2 | |
3 | 3 | from sys import argv |
4 | -from numpy import shape | |
4 | +from numpy import append,savetxt, shape, array, newaxis, empty | |
5 | +from Modules.Read import ReadEnergy, ReadTime, ReadExtraFile, ReadProfile | |
5 | 6 | from Modules.Spectrum import spectrum |
7 | +from Modules.Angle import radial, angle_vs_energy | |
8 | +from Modules.Timing import timing | |
6 | 9 | |
7 | 10 | def error(error_type): |
8 | 11 | print error_type |
9 | 12 | exit() |
10 | 13 | |
11 | 14 | if shape(argv)[0] < 2: |
12 | - error("not enough arguments (at least 2)") | |
15 | + error("not enough arguments (at least 1)") | |
13 | 16 | |
14 | -# choose what to print | |
15 | -print "What will be printed?" | |
16 | -print " 1. Spectrum" | |
17 | -print " 2. Image" | |
18 | -print " 3. Radial distribution VS energy" | |
19 | -print " 4. Timing distribution VS arrival angle" | |
20 | -selection = raw_input("selection (number): ") | |
17 | +folder = "Results/" | |
21 | 18 | |
22 | -if (selection == "1"): # draw spectrum | |
19 | +for fileId in argv[1:]: | |
20 | + # read files | |
21 | + time = ReadTime(fileId) | |
22 | + energy = ReadEnergy(fileId) | |
23 | + weightini, generation, theta_arrival, Esource = ReadExtraFile(fileId,[2,3,4,5]) | |
24 | + nbPhotonsEmitted=ReadProfile(fileId,[3]) | |
25 | + | |
26 | + Source = [] | |
27 | + Spectrum = [] | |
28 | + Radial = [] | |
29 | + Angle_Energy = [] | |
30 | + Timing = [] | |
31 | + | |
32 | + for powerlaw_index in [1,1.5,2,2.5]: | |
33 | + # apply source spectrum | |
34 | + weight = weightini*(Esource)**(1-powerlaw_index) | |
35 | + | |
36 | + #=============================================================================# | |
37 | + # SPECTRUM (SOURCE AND MEASURED) | |
38 | + #=============================================================================# | |
39 | + nbBins = 100 | |
40 | + # draw source spectrum | |
41 | + Es=array(list(set(Esource))) | |
42 | + Ws= (Es)**(1-powerlaw_index) | |
43 | + Es,Fs = spectrum(Es,Ws,nbBins) | |
44 | + Es=Es[:,newaxis] | |
45 | + Fs=Fs[:,newaxis] | |
46 | + if Source==[]: | |
47 | + Source = Es | |
48 | + Source = append(Source,Fs,axis=1) | |
49 | + else: | |
50 | + Source = append(Source,Fs,axis=1) | |
51 | + | |
52 | + # primary gamma-rays contribution | |
53 | + cond = (generation==0) | |
54 | + ener,flux_0 = spectrum(energy[cond],weight[cond],nbBins) | |
55 | + # full spectrum | |
56 | + ener,flux = spectrum(energy,weight,nbBins) | |
57 | + ener=ener[:,newaxis] | |
58 | + flux=flux[:,newaxis] | |
59 | + flux_0=flux_0[:,newaxis] | |
60 | + if Spectrum==[]: | |
61 | + Spectrum = ener | |
62 | + Spectrum = append(Spectrum,flux,axis=1) | |
63 | + Spectrum = append(Spectrum,flux_0,axis=1) | |
64 | + else: | |
65 | + Spectrum = append(Spectrum,flux,axis=1) | |
66 | + Spectrum = append(Spectrum,flux_0,axis=1) | |
67 | + | |
68 | + #=============================================================================# | |
69 | + # RADIAL DISTRIBUTION AND ANGLE VERSUS ENERGY | |
70 | + #=============================================================================# | |
71 | + nbBins = 100 | |
72 | + ener,angle = angle_vs_energy(theta_arrival,energy,weight,nbPhotonsEmitted) | |
73 | + ener=ener[:,newaxis] | |
74 | + angle=angle[:,newaxis] | |
75 | + if Angle_Energy==[]: | |
76 | + Angle_Energy = ener | |
77 | + Angle_Energy = append(Angle_Energy,angle,axis=1) | |
78 | + else: | |
79 | + Angle_Energy = append(Angle_Energy,angle,axis=1) | |
80 | + | |
81 | + theta,dndtheta2 = radial(theta_arrival,weight,nbPhotonsEmitted) | |
82 | + theta=theta[:,newaxis] | |
83 | + dndtheta2=dndtheta2[:,newaxis] | |
84 | + if Radial==[]: | |
85 | + Radial = theta | |
86 | + Radial = append(Radial,dndtheta2,axis=1) | |
87 | + else: | |
88 | + Radial = append(Radial,dndtheta2,axis=1) | |
89 | + | |
90 | + #=============================================================================# | |
91 | + # TIME DISTRIBUTION AND TIME DELAY VERSUS ANGLE | |
92 | + #=============================================================================# | |
93 | + nbBins = 100 | |
94 | + delta_t,dNdt = timing(time,weight,nbBins) | |
95 | + delta_t=delta_t[:,newaxis] | |
96 | + dNdt=dNdt[:,newaxis] | |
97 | + if Timing==[]: | |
98 | + Timing = delta_t | |
99 | + Timing = append(Timing,dNdt,axis=1) | |
100 | + else: | |
101 | + Timing = append(Timing,dNdt,axis=1) | |
102 | + | |
103 | + savetxt(folder+fileId+"/Spectrum.txt",Spectrum) | |
104 | + savetxt(folder+fileId+"/Source_spectrum.txt",Source) | |
105 | + savetxt(folder+fileId+"/Angle_vs_Energy.txt",Angle_Energy) | |
106 | + savetxt(folder+fileId+"/Radial_distribution.txt",Radial) | |
107 | + savetxt(folder+fileId+"/Timing.txt",Timing) | ... | ... |
Modules/Angle.py
1 | 1 | from numpy import log10, histogram |
2 | 2 | from matplotlib.pyplot import figure, show |
3 | 3 | from matplotlib import gridspec |
4 | -from Read import ReadEnergy, ReadExtraFile, ReadProfile | |
4 | +from Read import ReadRadial, ReadAngleVsEnergy | |
5 | 5 | from Analytic import Analytic_theta |
6 | 6 | from Constants import degre |
7 | 7 | |
... | ... | @@ -23,6 +23,24 @@ def angle_vs_energy(theta,energy,weight,nbPhotonsEmitted=1,nbBins=40): |
23 | 23 | |
24 | 24 | return enercenter, angle |
25 | 25 | |
26 | +def radial(theta,weight,nbPhotonsEmitted=1,nbBins=50,thetamax=90): | |
27 | + ''' | |
28 | + Compute flux versus arrival angle | |
29 | + Input: directory name | |
30 | + Input (optionnal): maximal angle desired (by default full sky) | |
31 | + Output: arrival angle, flux (dn/dtheta) | |
32 | + ''' | |
33 | + | |
34 | + theta=log10(theta) | |
35 | + dn,angle = histogram(theta,nbBins,range=[log10(1e-6),log10(thetamax)],weights=weight) | |
36 | + angle=10**angle | |
37 | + thetacenter = (angle[1:nbBins+1]+angle[0:nbBins])/2 | |
38 | + dtheta = angle[1:nbBins+1]-angle[0:nbBins] | |
39 | + dndtheta = dn/dtheta*thetacenter | |
40 | + dndtheta /= nbPhotonsEmitted | |
41 | + | |
42 | + return thetacenter, dndtheta | |
43 | + | |
26 | 44 | def drawAngle_vs_energy(files): |
27 | 45 | ''' |
28 | 46 | Plot arrival angle versus energy + analytic expression |
... | ... | @@ -33,27 +51,11 @@ def drawAngle_vs_energy(files): |
33 | 51 | ax1 = fig.add_subplot(111) |
34 | 52 | |
35 | 53 | for fileId in files: |
36 | - energy = ReadEnergy(fileId) | |
37 | - weightini, theta_arrival, Esource = ReadExtraFile(fileId,[2,4,5]) | |
38 | - nbPhotonsEmitted=ReadProfile(fileId,[3]) | |
39 | - | |
40 | - # apply source spectrum | |
41 | - powerlaw_index = 1.5 | |
42 | - weight = weightini*(Esource/min(Esource))**(1-powerlaw_index) | |
43 | - ener,angle = angle_vs_energy(theta_arrival,energy,weight,nbPhotonsEmitted) | |
44 | - p=ax1.plot(ener,angle,'-',label="p=%.1f"%powerlaw_index) | |
45 | - | |
46 | - # apply source spectrum | |
47 | - powerlaw_index = 2 | |
48 | - weight = weightini*(Esource/min(Esource))**(1-powerlaw_index) | |
49 | - ener,angle = angle_vs_energy(theta_arrival,energy,weight,nbPhotonsEmitted) | |
50 | - p=ax1.plot(ener,angle,'-',label="p=%.1f"%powerlaw_index) | |
51 | - | |
52 | - # apply source spectrum | |
53 | - powerlaw_index = 2.5 | |
54 | - weight = weightini*(Esource/min(Esource))**(1-powerlaw_index) | |
55 | - ener,angle = angle_vs_energy(theta_arrival,energy,weight,nbPhotonsEmitted) | |
56 | - p=ax1.plot(ener,angle,'-',label="p=%.1f"%powerlaw_index) | |
54 | + i=1 | |
55 | + for powerlaw_index in [1,1.5,2,2.5]: | |
56 | + # apply source spectrum | |
57 | + ener,angle = ReadAngleVsEnergy(fileId,[0,i]) | |
58 | + p=ax1.plot(ener,angle,'-',label="p=%.1f"%powerlaw_index) | |
57 | 59 | |
58 | 60 | yfit = Analytic_theta(ener,fileId) |
59 | 61 | ax1.plot(ener,yfit,'--',color="m",linewidth=2,label="analytic") |
... | ... | @@ -68,42 +70,19 @@ def drawAngle_vs_energy(files): |
68 | 70 | |
69 | 71 | show() |
70 | 72 | |
71 | -def radial(theta,weight,nbPhotonsEmitted=1,nbBins=50,thetamax=90): | |
72 | - ''' | |
73 | - Compute flux versus arrival angle | |
74 | - Input: directory name | |
75 | - Input (optionnal): maximal angle desired (by default full sky) | |
76 | - Output: arrival angle, flux (dn/dtheta) | |
77 | - ''' | |
78 | - | |
79 | - theta=log10(theta) | |
80 | - dn,angle = histogram(theta,nbBins,range=[log10(1e-6),log10(thetamax)],weights=weight) | |
81 | - angle=10**angle | |
82 | - thetacenter = (angle[1:nbBins+1]+angle[0:nbBins])/2 | |
83 | - dtheta = angle[1:nbBins+1]-angle[0:nbBins] | |
84 | - dndtheta = dn/dtheta*thetacenter | |
85 | - dndtheta /= nbPhotonsEmitted | |
86 | - | |
87 | - return thetacenter, dndtheta | |
88 | - | |
89 | -def drawRadial(files,thetamax=90): | |
73 | +def drawRadial(files): | |
90 | 74 | ''' |
91 | 75 | Plot flux versus arrival angle |
92 | 76 | Input: list of directories |
93 | - Input (optionnal): maximal angle desired (by default full sky) | |
94 | 77 | Output: graph of flux versus angle |
95 | 78 | ''' |
96 | 79 | fig = figure() |
97 | 80 | ax = fig.add_subplot(111) |
98 | 81 | |
99 | 82 | for fileId in files: |
100 | - weightini, theta_arrival, Esource = ReadExtraFile(fileId,[2,4,5]) | |
101 | - nbPhotonsEmitted=ReadProfile(fileId,[3]) | |
102 | - | |
103 | - for powerlaw_index in [1.5,2,2.5]: | |
104 | - # apply source spectrum | |
105 | - weight = weightini*(Esource/min(Esource))**(1-powerlaw_index) | |
106 | - theta,dndtheta2=radial(theta_arrival,weight,nbPhotonsEmitted,thetamax) | |
83 | + i=1 | |
84 | + for powerlaw_index in [1,1.5,2,2.5]: | |
85 | + theta,dndtheta2 = ReadRadial(fileId,[0,i]) | |
107 | 86 | ax.plot(theta,dndtheta2,drawstyle='steps-mid',label="p=%.1f"%powerlaw_index) |
108 | 87 | |
109 | 88 | ax.legend(loc="best") | ... | ... |
Modules/Angle.pyc
No preview for this file type
Modules/Generation.py
1 | 1 | from numpy import shape, arange |
2 | 2 | from matplotlib.pyplot import figure, show, hist |
3 | -from Read import ReadGeneration, ReadWeight | |
3 | +from Read import ReadExtraFile | |
4 | 4 | |
5 | 5 | |
6 | 6 | def drawGeneration(files): |
... | ... | @@ -13,8 +13,7 @@ def drawGeneration(files): |
13 | 13 | ax = fig.add_subplot(111) |
14 | 14 | nbBins = 7 |
15 | 15 | for fileId in files: |
16 | - weight = ReadWeight(fileId) | |
17 | - generation = ReadGeneration(fileId) | |
16 | + weight, generation = ReadExtraFile(fileId,[2,3]) | |
18 | 17 | print "file", fileId, "->", shape(generation)[0], "events" |
19 | 18 | hist(generation,nbBins,range=[2,9],log=1,alpha=.5, weights=weight,label=fileId) |
20 | 19 | |
... | ... | @@ -26,3 +25,15 @@ def drawGeneration(files): |
26 | 25 | ax.set_ylabel("Number of events") |
27 | 26 | |
28 | 27 | show() |
28 | + | |
29 | +def GenContribution(fileId): | |
30 | + ''' | |
31 | + compute the contribution to the final events of each | |
32 | + generation | |
33 | + ''' | |
34 | + weight, generation = ReadExtraFile(fileId,[2,3]) | |
35 | + | |
36 | + NbTotEvents = sum(weight) | |
37 | + | |
38 | + for gen in list(set(generation)): | |
39 | + print "Generation", gen, " -> ", sum(weight[generation==gen])/NbTotEvents *100, "\percent" | ... | ... |
Modules/Generation.pyc
No preview for this file type
Modules/Read.py
... | ... | @@ -59,3 +59,18 @@ def ReadElmag(fileName): |
59 | 59 | energy *= 10**(-9) #GeV |
60 | 60 | flux=(fluxGamma+fluxLepton)*1e-9 #GeV normalized to 1 initial photon |
61 | 61 | return energy,flux |
62 | + | |
63 | +def ReadSpectrum(fileName,cols=[0,1,2,3,4,5,6,7,8]): | |
64 | + return loadtxt(resultDirectory+fileName+"/Spectrum.txt",unpack=True,usecols=cols) | |
65 | + | |
66 | +def ReadSourceSpectrum(fileName,cols=[0,1,2,3,4]): | |
67 | + return loadtxt(resultDirectory+fileName+"/Source_spectrum.txt",unpack=True,usecols=cols) | |
68 | + | |
69 | +def ReadAngleVsEnergy(fileName,cols=[0,1,2,3,4]): | |
70 | + return loadtxt(resultDirectory+fileName+"/Angle_vs_Energy.txt",unpack=True,usecols=cols) | |
71 | + | |
72 | +def ReadRadial(fileName,cols=[0,1,2,3,4]): | |
73 | + return loadtxt(resultDirectory+fileName+"/Radial_distribution.txt",unpack=True,usecols=cols) | |
74 | + | |
75 | +def ReadTiming(fileName,cols=[0,1,2,3,4]): | |
76 | + return loadtxt(resultDirectory+fileName+"/Timing.txt",unpack=True,usecols=cols) | ... | ... |
Modules/Read.pyc
No preview for this file type
Modules/Spectrum.py
1 | 1 | from numpy import histogram, log10, sqrt, array |
2 | 2 | from matplotlib.pyplot import figure, show, setp |
3 | 3 | from matplotlib import gridspec |
4 | -from Read import ReadEnergy, ReadExtraFile, ReadProfile | |
4 | +from Read import ReadSpectrum, ReadSourceSpectrum | |
5 | 5 | from Constants import degre |
6 | 6 | from Analytic import Ethreshold_gg |
7 | 7 | |
8 | -def spectrum(energy,weight,nbPhotonsEmitted=1,nbBins=100): | |
8 | +def spectrum(energy,weight,nbBins=100): | |
9 | 9 | ''' |
10 | 10 | Compute flux versus energy |
11 | 11 | Input: events energy and weight (optional: number of bins) |
... | ... | @@ -17,7 +17,7 @@ def spectrum(energy,weight,nbPhotonsEmitted=1,nbBins=100): |
17 | 17 | enercenter=(ener[1:nbBins+1]+ener[0:nbBins])/2 |
18 | 18 | binSize=ener[1:nbBins+1]-ener[0:nbBins] |
19 | 19 | flux = enercenter**2 * flux/binSize |
20 | - flux /= nbPhotonsEmitted | |
20 | + flux /= max(flux) #nbPhotonsEmitted | |
21 | 21 | return enercenter,flux |
22 | 22 | |
23 | 23 | def drawSpectrum(files,PlotAnalytic=False): |
... | ... | @@ -34,23 +34,22 @@ def drawSpectrum(files,PlotAnalytic=False): |
34 | 34 | ax2 = fig.add_subplot(gs[1],sharex=ax1) |
35 | 35 | |
36 | 36 | for fileId in files: |
37 | - # read files | |
38 | - energy = ReadEnergy(fileId) | |
39 | - weightini, generation, theta_arrival, Esource = ReadExtraFile(fileId,[2,3,4,5]) | |
40 | - nbPhotonsEmitted=ReadProfile(fileId,[3]) | |
41 | - | |
42 | - for powerlaw_index in [1.5,2,2.5]: | |
43 | - # apply source spectrum | |
44 | - weight = weightini*(Esource/min(Esource))**(1-powerlaw_index) | |
37 | + i=1 | |
38 | + j=1 | |
39 | + for powerlaw_index in [1,1.5,2,2.5]: | |
40 | + # read files | |
41 | + Es,Fs = ReadSourceSpectrum(fileId,[0,i]) | |
42 | + p = ax1.plot(Es,Fs,drawstyle='--') | |
45 | 43 | # draw full spectrum |
46 | - ener,flux = spectrum(energy,weight,nbPhotonsEmitted) | |
47 | - p = ax1.plot(ener,flux,drawstyle='-',label="p=%.1f"%powerlaw_index) | |
44 | + ener,flux,flux_0 = ReadSpectrum(fileId,[0,j,j+1]) | |
45 | + ax1.plot(ener,flux,color=p[0].get_color(),drawstyle='-',label="p=%.1f"%powerlaw_index) | |
48 | 46 | # primary gamma-rays contribution |
49 | - cond = (generation==0) | |
50 | - ener,flux_cond = spectrum(energy[cond],weight[cond],nbPhotonsEmitted) | |
51 | - ax1.plot(ener,flux_cond,color=p[0].get_color(),linestyle='-.') | |
52 | - contrib=flux_cond/flux | |
47 | + ax1.plot(ener,flux_0,color=p[0].get_color(),linestyle='-.') | |
48 | + contrib=flux_0/flux | |
53 | 49 | ax2.plot(ener,contrib,'-',color=p[0].get_color()) |
50 | + | |
51 | + i+=1 | |
52 | + j+=2 | |
54 | 53 | |
55 | 54 | # add spectrum for Fermi/LAT and CTA (FoV?) |
56 | 55 | ... | ... |
Modules/Spectrum.pyc
No preview for this file type
Modules/Timing.py
1 | 1 | from numpy import histogram, log10, shape, arange, pi |
2 | 2 | from matplotlib.pyplot import figure, show |
3 | -from Read import ReadTime, ReadExtraFile, ReadProfile, ReadEnergy | |
3 | +from Read import ReadTime, ReadTiming, ReadExtraFile, ReadProfile, ReadEnergy | |
4 | 4 | from Constants import yr, degre |
5 | 5 | from Analytic import Analytic_delay_vs_theta |
6 | 6 | |
7 | -def timing(time,weight,NbPhotonsEmitted=1,nbBins=100): | |
7 | +def timing(time,weight,nbBins=100): | |
8 | 8 | ''' |
9 | 9 | Compute flux versus time delay |
10 | 10 | Input: directory name |
... | ... | @@ -23,7 +23,7 @@ def timing(time,weight,NbPhotonsEmitted=1,nbBins=100): |
23 | 23 | dN,dt=histogram(time,nbBins,weights=weight) |
24 | 24 | timecenter=(dt[1:nbBins+1]+dt[0:nbBins])/2 |
25 | 25 | binSize=dt[1:nbBins+1]-dt[0:nbBins] |
26 | - dNdt=dN/(NbPhotonsEmitted*binSize) | |
26 | + dNdt=dN/(max(dN)*binSize) | |
27 | 27 | |
28 | 28 | return 10**timecenter, dNdt |
29 | 29 | |
... | ... | @@ -36,14 +36,9 @@ def drawTiming(files): |
36 | 36 | fig = figure() |
37 | 37 | ax = fig.add_subplot(111) |
38 | 38 | for fileId in files: |
39 | - time = ReadTime(fileId) | |
40 | - weightini, Esource = ReadExtraFile(fileId,[2,5]) | |
41 | - nbPhotonsEmitted=ReadProfile(fileId,[3]) | |
42 | - | |
43 | - for powerlaw_index in [1.5,2,2.5]: | |
44 | - # apply source spectrum | |
45 | - weight = weightini*(Esource/min(Esource))**(1-powerlaw_index) | |
46 | - delta_t,dNdt = timing(time,weight,nbPhotonsEmitted) | |
39 | + i=1 | |
40 | + for powerlaw_index in [1,1.5,2,2.5]: | |
41 | + delta_t,dNdt = ReadTiming(fileId,[0,i]) | |
47 | 42 | ax.plot(delta_t,dNdt,linestyle="steps-mid",label="p=%.1f"%powerlaw_index) |
48 | 43 | |
49 | 44 | ax.set_xscale('log') |
... | ... | @@ -51,7 +46,7 @@ def drawTiming(files): |
51 | 46 | ax.grid(b=True,which='major') |
52 | 47 | ax.legend(loc="best") |
53 | 48 | ax.set_xlabel("Time delay [s]") |
54 | - ax.set_ylabel("$t\ dN/dt$") | |
49 | + ax.set_ylabel("$t\ dN/dt$ [arbitrary units]") | |
55 | 50 | |
56 | 51 | show() |
57 | 52 | ... | ... |
Modules/Timing.pyc
No preview for this file type