Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.63 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import pyfits
  4. from scipy.stats import sigmaclip as sic
  5. import scipy.signal as sp
  6.  
  7. '''Antes de partir, para correr el codigo, se asigna a,b para el masterflat y
  8. espectro respectivamente, esto se ingresa al metodo yay que luego devuelve la
  9. longitud de onda y flujo respectivamente. Estos dos valores son luego
  10. ingresados en el metodo Mask, junto con el nombre del archivo con la mascara y
  11. la velocidad que se quiere utilizar. Recuerdo aca tambien que la seccion final
  12. de Mask no logro funcionar correctamente, por lo que se obtienen valores
  13. demasiado pequenos para las velocidades buscadas'''
  14.  
  15. #Primero, creo un metodo para leer los datos y corregir con el masterflat:
  16.  
  17. def corr (mf, spec):
  18.     sp = pyfits.getdata(spec)
  19.     ps = sp
  20.     fl = pyfits.getdata(mf)
  21.  
  22.     #Corrijo el flujo del espectro con el del flat dividiendo:
  23.  
  24.     for i in range(1024):
  25.         for j in range(41):
  26.             ps[1][j][i] = (sp[1][j][i])/(fl[j][1][i])
  27.            
  28.     #Veo en donde se hicieron divisiones por 0 (quedan nan)
  29.             #y elimino esos valores
  30.            
  31.     nanas = np.isnan(ps)
  32.     wav = []
  33.     flux = []
  34.     for i in range(41):
  35.         wav.append(ps[0][i][-nanas[1][i]])
  36.     for i in range(41):
  37.         flux.append(ps[1][i][-nanas[1][i]])
  38.     wav = np.array(wav)
  39.     flux = np.array(flux)
  40.  
  41.     #En el final de los datos queda todo muy raro. Se cortaran los datos
  42.     # al final para poder realizar bien el ajuste polinomial y para
  43.     #coincidir con la mascara. Ademas, todo seve horrible al principio,
  44.     #por lo que se cortara tambien.
  45.     Wav = []
  46.     Flux = []
  47.     for i in range(41):
  48.         if wav[i][0] > 4500 and wav[i][1022]<6800:
  49.             Wav.append(wav[i])
  50.             Flux.append(flux[i])
  51.     Flux = np.array(Flux)
  52.     Wav = np.array(Wav)
  53.    
  54.    
  55.     return Wav,Flux
  56.  
  57. #A continuacion, procedemos a realizar el fiteo. Para esto, se usa un polinomio
  58. # de grado 3
  59.  
  60. def fiteo(wav,flux):
  61.     coef = []
  62.     cosa = []
  63.     for i in range(len(flux)):
  64.         poli = np.polyfit(wav[i],flux[i], 3)
  65.        
  66.         y = np.poly1d(poli)
  67.         x = wav[i]    
  68.         f = y(x)
  69.         cosa.append(f)
  70.  
  71.     return np.array(cosa)
  72.  
  73. #Ahora, hago elimino rayos cosmicos usando sigma clipping:
  74.  
  75. def sick(Wav,Flux):
  76.    
  77.     sig = []
  78.     FL = []
  79.     WV = []
  80.     end1 = []
  81.     end2 = []
  82.     for i in range (len(Flux)):
  83.         mad = np.median(np.abs(Flux[i]-np.median(Flux[i])))
  84.         sig.append(1.4826*mad)
  85.     for i in range (len(Flux)):
  86.         aux1=[]
  87.         aux2=[]
  88.         for j in range(1023):
  89.             if (np.abs(Flux[i][j]-np.median(Flux[i]))<3*sig[i]):
  90.                 aux1.append(Flux[i][j])
  91.                 aux2.append(Wav[i][j])
  92.                
  93.         if aux1:
  94.             FL.append(aux1)
  95.             WV.append(aux2)
  96.     return np.array(WV),np.array(FL)
  97.  
  98. #Finalmente, unimos todo en un metodo que plotea lo que queremos. Es decir,
  99. # la curva ajustada para cada orden y luego con la aplicacion de sigma clipping
  100.  
  101. def yay (mf,spec):
  102.     wav, flux = corr(mf,spec)
  103.     f = fiteo(wav,flux)
  104.     flux  = flux/f
  105.     c, d = sick(wav,flux)
  106.     for i in range(len(c)):
  107.         plt.plot(c[i], d[i], linewidth='0.1')
  108.     return c,d
  109.    
  110.    
  111. #Ahora, creo el metodo de aplicacion de la mascara (antes de moverla)
  112. #Es decir, es para un valor dado de cada cosa
  113. def apmask(wavu,fluxu,masc,wind):
  114.     f = 0
  115.     fl = 0
  116.     for i in range(10):
  117.         if wavu<masc[i][0]:
  118.             if wavu+wind>masc[i][0]:
  119.                 fl = masc[i][2]*fluxu*(wavu+wind-masc[i][0])/(2*wind)
  120.         if wavu>masc[i][0]:
  121.             if wavu-wind<masc[i][0]:
  122.                
  123.  
  124.                 fl = masc[i][2]*fluxu*(wavu+wind-masc[i][0])/(2*wind)
  125.                
  126.             if wavu+wind<masc[i][1] and wavu-wind>masc[i][0]:
  127.                 fl = masc[i][2]*fluxu
  128.                
  129.             if wavu+wind>masc[i][1] and wavu-wind<masc[i][1]:
  130.                 fl = masc[i][2]*fluxu*(masc[i][1]-(wavu-wind))/(2*wind)
  131.         if wavu>masc[i][1]:
  132.             if wavu-wind<masc[i][1]:
  133.                 masc[i][2]*fluxu*(masc[i][1]-(wavu-wind))/(2*wind)
  134.         f = f + fl
  135.     return f
  136.  
  137. #Luego, creamos un metodo que mueva la mascara (aca, vc = v/c y le otorgamos
  138. #un valor arbitrario, por ejemplo, 0.1:
  139.  
  140. def movmask(masc,vc):
  141.     masc = np.array(masc)
  142.     aux = masc.T
  143.     delam = aux[0]*vc
  144.     aux[0] = aux[0]+delam
  145.     aux[1] = aux[1]+delam
  146.     masc = aux.T
  147.     return masc
  148.    
  149. #Ahora, queremos aplicar la mascara:
  150. def Mask (wav,flux,masc,vc):
  151.     mask = np.loadtxt(masc)
  152.     aux = []
  153.     for i in range(len(mask)):
  154.         if mask[i][0] > 4500:
  155.             aux.append(mask[i])
  156.     mask = aux
  157.    
  158.  
  159.    
  160. #Necesito crear una ventana para las longitudes de onda de cada pixel:
  161.     aux1 = 100
  162.     wind = []
  163.     for i in range(len(wav)):
  164.         for j in range(len(wav[i])-1):
  165.             win = np.abs(wav[i][j+1]-wav[i][j])
  166.             if win < aux1:
  167.                 aux1 = win
  168.            
  169.         wind.append(aux1)
  170. #Con esto, tenemos una ventana minima aproximada para cada pixel en los ordenes
  171. #Esto lo usaremos para ir aplicando la mascara a cada flujo en cada orden, para
  172. #luego sumar todo:
  173.     suma = []
  174.     x=0
  175.     while mask[0][0] < 6800:
  176.         cosa = 0
  177.        
  178.         for i in range(len(wav)):
  179.             for j in range(len(wav[i])):
  180.                 cosa = cosa + apmask(wav[i][j],flux[i][j], mask, wind[i])
  181.         suma.append(cosa)
  182.         mask = movmask(mask,vc)
  183.         #print('Vuelta! Valor: ' + str(cosa))
  184.         x = x+1
  185.         if x%3 == 0:
  186.             print('Valor: ' + str(cosa))
  187.             x = 0
  188.     return suma
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement