introducción a idl - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err long...

24
Introducción a IDL Leonel Gutiérrez Instituto de Astronomía, UNAM [email protected] Agosto de 2009 Sesión 4

Upload: docong

Post on 01-Nov-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Introducción a IDL

Leonel GutiérrezInstituto de Astronomía, [email protected] de 2009

Sesión 4

Page 2: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

.COMPILE  – Compila un programa sin correrlo. 

.GO  – Ejecuta un programa previamente compilado. 

.RUN  – Compila y ejecuta los comandos de IDL de un programa. 

.CONTINUE  – Continúa la ejecución de un programa detenido. 

.TRACE  – Similar a .CONTINUE, pero despliega cada línea de código antes de ejecutarla. 

.RESET_SESSION – Reinicia el estado de una sesión de IDL sin necesidad de que el usuario salga y vuelva a iniciar una sesión de IDL. 

.FULL_RESET_SESSION – Hace todo lo que hace .RESET_SESSION más otras tareas de reset como descargar bibliotecas compartidas. 

.OUT  – Continúa la ejecución hasta que termine la actual rutina. 

.RETURN  – Continúa la ejecución hasta que encuentra un RETURN. 

.RNEW  – Borra las variables de un programa $MAIN$ y ejecuta un .RUN. 

.SKIP   – Pasa por alto los siguientes n enunciados. 

.STEP  – Ejecuta uno o n enunciados a partir de la posición actual. 

.STEPOVER – Ejecuta un solo enunciado si éste no llama a una rutina. 

.EDIT  – Abre los archivos en una ventana de edición del IDLDE. 

Más sobre comandos ejecutivos

Page 3: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Más sobre funciones y subrutinas

Se usan 2 tipos de parámetros: posicionales y ''keywords'' (palabras clave)

Parámetros posicionales: Se identifican por su posición en la lista de argumentos.

Un programa puede llamar a un procedure con todos o con sólo algunos de los parámetros posicionales, pero en el orden correcto.

Los parámetros ''keyword'': Se definen por la sintaxisNombre_del_keyword=nombre_de_la_variable

Parámetros

Page 4: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

El programa principal suministra un valor al ''nombre_del_keyword'' que se identifica en el procedure por el ''nombre_de_la_variable''.

PRO TEST_MISQRT, x, OPCION=cual    if (x lt 0) then cual = 1    if (NOT KEYWORD_SET(cual)) then begin        print, 'Calcula la raiz cuadrada de manera normal'        print, 'El valor de la raiz es: ', sqrt(x)    endif else begin

print, 'Calcula la funcion que definimos'print, 'El valor de la raiz es: ', misqrt(x)

    endelseEND

Más sobre funciones y subrutinas

Page 5: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

- Es una práctica común usar el mismo nombre para el nombre_del_keyword

que para el nombre_de_la_variable

- Los keywords pueden abreviarse al mínimo número de letras que no causen confusión. La variable asociada no puede abreviarse.

- Transmitiendo keywords. Pasar keywords desconocidos a un procedure puede causar errores. Para pasar keywords no difinidos a procedures de menor nivel, puede usarse el keyword _EXTRA en la lista de parámetros.

Más sobre funciones y subrutinas

Page 6: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Manejo de errores- Normalmente, cuando ocurre un error, IDL detiene la ejecución de un programa y permenece en esa unidad de programa. - Es posible cambiar esto con

ON_ERROR, <N> N = 0 (default) : IDL se detiene y se queda donde estaba. N = 1 : IDL regresa al nivel principal. N = 2 : regresa al nivel del programa que hizo la llamada a

la rutina detenida.

Page 7: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Manejo de errores- Errores de E/S: Los errores de entrada/salida pueden manejarse con

ON_IOERROR, etiqueta Esto ordena un salto a la posición de la etiqueta, en el procedure, evitando que el programa termine. Para informar al usuario, puede usarse

MESSAGE, texto Esto manda a la terminal el texto, junto con el nombre del procedure donde se hace la llamada.- Los errores matemáticos pueden revisarse con FINITE y CHECK_MATH.

Page 8: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Más sobre E/S en archivos (Ver en escribe_binarios.pro)outfile = 'binary.dat'n =  20                        ; tama&o del arreglom = 400                        ; tama&o del arreglo zi = LINDGEN(n, n, n)           ; crea el arreglo iz = DIST(m)                    ; crea el arreglo zb = BYTSCL(z)                  ; crea el arreglo b

HELP, n, m, i, z, bPRINT, 'Tamanio del archivo = ', 4*(1+1+n*n*n+m*m) + m*mOPENW, ounit, outfile, /GET_LUN

    ; abre el archivo de salidaWRITEU, ounit, n, m            ; escribe las dimensionesWRITEU, ounit, i, z, b         ; escribe los arreglosFREE_LUN, ounit                ; cierra el archivo binario

Page 9: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Más sobre E/S en archivos (Ver en lee_binarios.pro)infile = 'binary.dat'           ; archivo de entradaOPENR, iunit, infile, /GET_LUN     ; abre el archivon = 0                              ; crea la variable nm = 0                              ; crea m         READU, iunit, n, m                 ; lee n y mi = LONARR(n, n, n)                ; crea el arreglo iz = FLTARR(m, m)                   ; crea el arreglo zb = BYTARR(m, m)                   ; crea el arreglo bREADU, iunit, i, z, b              ; lee los arreglosFREE_LUN, iunit                    ; cierra el archivoHELP, n, m, i, z, b                ; imprime la infoPRINT, z[0:3,0:3]                  ; imprime parte de z

Page 10: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Variables del sistema- IDL cuenta con un conjunto de variables de sistema. - Pueden leerse y modificarse desde cualquier segmento de programa.- Todas empiezan con el signo ! . Algunas variables útiles son las siguientes:“ ”

Nombre      Tipo       Contenido

!path    String       Todos los directorios donde IDL busca

!pi/!dpi Real/Double   Pi en precisión sencilla y doble

!dtor     float         grados a radianes

!radeg    float         radianes a grados

!prompt    String      El prompt de IDL (puede cambiarlo el usuario)

!err    Long      Número de código del último error encontrado

!error     Long      Número de código del  último mensaje de error

!err_string String      Último mensaje de error

!version    Structure   Inf. del Sistema Op. y de la versión de IDL

!d    Structure     Información específica de los dispositivos

!p    Structure     Información específica de las gráficas

!x,!y,!z    Structures    Información de los ejes de graficación

Page 11: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Variables del sistema- Es posible crear variables de sistema con

DEFSYSV, Nombre, Valor [, Read_Only] [, EXISTS=variable] - Algunas variables:

!d - Estructura con información acerca del dispositivo gráfico de salida!d.n_colors : es el número de colores disponibles en IDL!d.name : nombre del dispositivo!d.window : índice de la ventana actualmente abierta!d.x_ch_size, !d.y_ch_size : ancho y largo del rectángulo que encierra

a los caracteres promedio en unidades de dispositivo!p - Estructura con las variables de graficación

!p.multi : configura las gráficas en una ventana!p.background : índice o valor del color de fondo

(Ver en el IDLHELP system variables)

Page 12: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Variables del sistemaPara revisar los parámetros: Para revisar ciertas condiciones de los argumentos de entrada en un procedure:

keyword_set(nombre_del_keyword) regresa 1 si está definido el nombre_del_keyword; si no, regresa un cero

n_params() regresa el número real de parámetros que se le pasaron al procedure.n_elements(variable)

regresa el número total de elementos de una variablesize(variable)

regresa un vector de enteros largos con información acerca de variable

Page 13: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Estructuras

Una estructura combina varios datos en una unidad lógica.

Los elementos en una estructura con nombre se referencian como estructura.elemento.

Para definir una estructura con nombreestructura={nombre_estructura,elemento_1:definicion_1,

elemento_2:definicion_2,....}

Existen estructuras con nombre y estructuras sin nombre o anónimas.

Page 14: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

EstructurasEjemplo de estructura con nombre:IDL> dato ={coord, valores:findgen(4), n:4, etiqueta:"un dato"}IDL> print, "Contenido de la estructura con nombre"IDL> print, dato.valoresIDL> print, dato.nIDL> print, dato.etiquetaIDL> dato1 = {coord}IDL> help ,dato   DATO            STRUCT    = ­> COORD Array[1]IDL> help ,dato1

DATO1           STRUCT    = ­> COORD Array[1]IDL> dato2 = {valores:findgen(4), n:4, etiqueta:"un dato"}IDL> help ,dato

DATO            STRUCT    = ­> <Anonymous> Array[1]

Otro ejemplo, una estructura con toda la información de un archivo fits:IDL> cabecera=bytarr(80,36)IDL> datos=fltarr(1024,1024)IDL> fitsim={fits, header:cabecera, data:datos}

Page 15: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

EstructurasDefinición automática. El nombre del archivo donde se define la

estructura, debe tener el mismo nombre de la estructura seguido de ''__DEFINE'' (tiene un doble guión bajo).

PRO mi_dato__DEFINE

;  Definicion de la estructura mi_dato

dato = {MI_DATO, $        nombre      : '',  $        debe        : 0.0, $        domicilio   : '',  $        id          : 0L,  $        socio       : ''}

END

En el archivo mi_dato__define.pro

Page 16: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Estructuras

IDL> kk = {mi_dato}IDL> kk.nombre = 'juan'IDL> kk.debe = 10000IDL> kk.domicilio = 'Av. Central # 10'IDL> kk.id = 234IDL> kk.socio = 'no'IDL> print, kk

{ juan      10000.0 Av. Central #10        234 no}IDL> print, kk.id         234

Al intentar crear una estructura de tipo mi_dato, IDL busca automáticamente un procedure llamado MI_DATO__DEFINE

Page 17: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Un ejemplo de una estructura sin nombre:x = findgen(4)dato = {valores:x, n:n_elements(x), etiqueta:"otro dato"}print, "Contenido de la estructura sin nombre"print, dato.valoresprint, dato.nprint, dato.etiqueta

Estructuras

Estructuras jerárquicas: Son ''estructuras que contienen estructuras''. Por ejemplo:

Para definir una estructura sin nombre se definen directamente los elementos:estructura={elemento_1:definicion_1,

elemento_2:definicion_2,....}

Page 18: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

nx   = 20x    = {nombre   : 'Longitud', $        valores  : FLTARR(nx)}

ny   = 25y    = {nombre   : 'Latitud', $        valores  : FLTARR(ny)}

dato = {nombre   : 'Temperatura', $        valores  : FLTARR(nx, ny), $        x        : x, $        y        : y}

HELP, dato,   /str    ; /str (o /structure) despliega laHELP, dato.x, /str    ; información de una variable de HELP, dato.y, /str    ; de tipo estructura

PRINT, dato.nombrePRINT, dato.x.nombrePRINT, dato.y.nombre

Estructuras

Page 19: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

EstructurasRecordemos un ejemplo de una sesión anterior

 fname = 'datos_a.txt' nl = 0 junk = "" openr, ifile, fname, /get_lun while not eof(ifile) do begin   readf, ifile, junk   nl++ endwhile point_lun,ifile,0 record = {a:0.0, b:0.0, c:0.0} datos = replicate(record, nl) readf, ifile, datos free_lun, ifile print, datos[0:5].aend

Archivo con el programa “lee_datos2.pro”

;la estructura está;formada por tres números ;reales de precisión simple

Page 20: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

EstructurasUna estructura puede ser tan compleja como ésta:

table = {nrows: Nlines, a: FLTARR(Nlines), I: FLTARR(Nlines), $     I_err: FLTARR(Nlines), ell: FLTARR(Nlines), $     ell_err: FLTARR(Nlines), pa: FLTARR(Nlines), $     pa_err: FLTARR(Nlines), x0: FLTARR(Nlines), $     x0_err: FLTARR(Nlines), y0: FLTARR(Nlines), $     y0_err: FLTARR(Nlines), I_grad: FLTARR(Nlines), $     I_grad_err: FLTARR(Nlines), mag: FLTARR(Nlines), $     mag_merr: FLTARR(Nlines), mag_perr: FLTARR(Nlines), $     flux_ell: FLTARR(Nlines), flux_circ: FLTARR(Nlines), $     A3: FLTARR(Nlines), A3_err: FLTARR(Nlines), $     B3: FLTARR(Nlines), B3_err: FLTARR(Nlines), $     A4: FLTARR(Nlines), A4_err: FLTARR(Nlines), $     B4: FLTARR(Nlines), B4_err: FLTARR(Nlines), $     stop: INTARR(Nlines)}

Page 21: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

EstructurasUn ejemplo de su uso puede verse en el programa ''lee_ell.pro'':   Pro  lee_ell, nombre      OPENR,unit,nombre,/GET_LUN      Nrows = 0      WHILE NOT EOF(unit) DO BEGIN         READF,unit,junk         Nrows = Nrows + 1      ENDWHILE

      Nlines = (Nrows ­ 21)/5      data_block8 = FLTARR(8, Nlines)      data_block9 = FLTARR(9, Nlines)      data_block10 = FLTARR(10, Nlines)      all_data = FLTARR(40, Nlines)

      POINT_LUN,unit,0      READF,unit,junk

Page 22: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Estructuras      FOR I = 0, 4 DO BEGIN         FOR J = 0, 3 DO READF,unit,junk         CASE I OF            0: BEGIN

          READF,unit,data_block9      all_data(0, 0) = data_block9(1:8, *)

            END            1: BEGIN

          READF,unit,data_block9          all_data(8, 0) = data_block9(1:8, *)

            END            2: BEGIN

          READF,unit,data_block8              all_data(16, 0) = data_block8(1:7, *)            END            3: BEGIN

          READF,unit,data_block9              all_data(23, 0) = data_block9(1:8, *)            END            4: BEGIN

          READF,unit,data_block10          all_data(31, 0) = data_block10(1:9, *)

            END         ENDCASE      ENDFOR

Page 23: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Estructuras      CLOSE,unit      FREE_LUN,unit

      reordered = SORT(all_data(0, *))            ; Etiquetas de L. Gutierrez

      table.a = all_data(0, reordered) * ArcsecPerPix ; SMA pixel      table.I = all_data(1, reordered)                ; INTENS      table.I_err = all_data(2, reordered)            ; INT_ERR       table.ell = all_data(5, reordered)              ; ELLIP      table.ell_err = all_data(6, reordered)          ; ELLIP_ERR      table.pa = all_data(7, reordered)               ; PA (degrees)      table.pa_err = all_data(8, reordered)           ; PA_ERR      table.x0 = all_data(9, reordered)               ; XO (pixel)      table.x0_err = all_data(10, reordered)          ; XO_ERR      table.y0 = all_data(11, reordered)              ; YO (pixel)      table.y0_err = all_data(12, reordered)          ; YO_ERR      table.I_grad = all_data(13, reordered)          ; GRAD      table.I_grad_err = all_data(14, reordered)      ; GRAD_ERR       .      .      .(ver el archivo lee_ell.pro y ejecutarlo con     lee_ell, 'el_n3675gsssfix.txt', titulo='NGC 3675')

Page 24: Introducción a IDL - astrosen.unam.mxleonel/cursos/curso_idl/idl_curso-2009-parte... · !err Long Número de código del último error encontrado !error Long ... índice de la ventana

Fin de la sesión 4