spectrum.py 3.62 KB
from numpy import histogram, log10, sqrt, array, arange
from matplotlib.pyplot import figure, show, setp
from matplotlib import gridspec
from read import ReadSpectrum, ReadSourceSpectrum, ReadGeneration
from constants import degre
from analytic import Ethreshold_gg, Analytic_flux, Eic

def spectrum(energy,weight,nbBins=100,E_range=[1e-3,1e5]):
   '''
      Compute flux versus energy
      Input: events energy and weight (optional: number of bins)
      Output: energy, flux (E^2 dN/dE)
   '''
   Emin=E_range[0]#min(energy)
   Emax=E_range[1]#max(energy)
   energy =log10(energy)
   flux,ener=histogram(energy,nbBins,range=log10(E_range),weights=weight)
   ener = 10**ener
   enercenter=(ener[1:nbBins+1]+ener[0:nbBins])/2
   binSize=ener[1:nbBins+1]-ener[0:nbBins]
   flux = flux/binSize #*enercenter**2
   return enercenter,flux

def drawSpectrum(files,plot_gen=False,plot_source=False,plot_analytic=False,plot_time_range=False):
   '''
      Plot flux versus energy
      Input: list of directories
      Input (optional, default=False): plot analytic expression
      Output: graph spectrum normalize to 1 source photon
   '''
   fig = figure()
   #gs = gridspec.GridSpec(2, 1, height_ratios=[3,1]) 
   #fig.subplots_adjust(hspace=0.001)
   #ax1 = fig.add_subplot(gs[0])
   #ax2 = fig.add_subplot(gs[1],sharex=ax1)
   ax1 = fig.add_subplot(111)

   for fileId in files:
      # draw full spectrum
      ener,dNdE = ReadSpectrum(fileId,[0,1])
      p = ax1.plot(ener,ener**2 *dNdE,drawstyle='steps-mid',label=fileId)#"$t_{obs}=\infty$")

      #minEner=min(ener)
      #alpha=flux[ener==minEner]/sqrt(minEner)
      #ax1.plot(ener,alpha*sqrt(ener),'--m')
      if plot_time_range:
         ener,dNdE1,dNdE2,dNdE3 = ReadSpectrum(fileId,[0,2,3,4])
         ax1.plot(ener,ener**2 *dNdE1,drawstyle='steps-mid',linestyle='--',label="$t_{obs}$=30days")
         ax1.plot(ener,ener**2 *dNdE2,drawstyle='steps-mid',linestyle='--',label="$t_{obs}$=1yr")
         ax1.plot(ener,ener**2 *dNdE3,drawstyle='steps-mid',linestyle='--',label="$t_{obs}$=5yrs")

      if plot_gen:
         ener,dNdE1,dNdE2,dNdE3 = ReadSpectrum(fileId,[0,5,6,7])
         ax1.plot(ener,ener**2 *dNdE1,drawstyle='steps-mid',linestyle='--',label="gen=1")
         ax1.plot(ener,ener**2 *dNdE2,drawstyle='steps-mid',linestyle='--',label="gen=2")
         ax1.plot(ener,ener**2 *dNdE3,drawstyle='steps-mid',linestyle='--',label="gen=3")
         #j=5
         #for gen in ReadGeneration(fileId,[0]):
         #   ener,flux = ReadSpectrum(fileId,[0,j])
         #   ax1.plot(ener,ener**2 *flux,drawstyle='steps-mid',linestyle='--',label="gen=%.0f"%gen)
         #   j+=1

      if plot_source:
         Es,Fs = ReadSourceSpectrum(fileId,[0,1])
         ax1.plot(Es,Fs,color=p[0].get_color(),linestyle=':')
         
   if plot_analytic:
      #=== Gen=2 ===
      ax1.plot(ener,2*Analytic_flux(ener),'--g')
      #=== Gen=4 ===
      #Elim= Eic(Ethreshold_gg()/2)
      #alpha = 2*9.262e3/Elim**(1/4.)
      #ax1.plot(ener,alpha*sqrt(ener),'--r',linewidth=1)
      #alpha = 2*29.29e3
      #ax1.plot(ener,alpha*(ener/100)**(1/4.),'--m',linewidth=1)
      #ax1.plot(ener,ener**(0)*max(flux)*0.95,'--m',linewidth=2)
      #ax1.axvline(x=Ethreshold_gg(), ymin=0., ymax = 1., color='r', linewidth=2)
      #ax1.axvline(x=1e4, ymin=0., ymax = 1., color='g', linewidth=2)

   ax1.legend(loc="best")
   ax1.set_xscale('log')
   ax1.set_yscale('log')
   ax1.grid(b=True,which='major')
   ax1.set_ylabel("$E^2 dN/dE$ [GeV]")
   ax1.set_xlabel("energy [GeV]")
   #ax2.set_xscale('log')
   #ax2.grid(b=True,which='major')
   #ax2.set_xlabel("energy [GeV]")
   #xticklabels = ax1.get_xticklabels()
   #setp(xticklabels, visible=False)

   show()