diff --git a/FITS_header.ipynb b/FITS_header.ipynb new file mode 100644 index 0000000..3c33830 --- /dev/null +++ b/FITS_header.ipynb @@ -0,0 +1,306 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XT4sjhJ4SVOV" + }, + "source": [ + "# Editar um cabeçalho FITS\n", + "\n", + "## Autores\n", + "Adrian Price-Whelan, Adam Ginsburg, Stephanie T. Douglas, Kelle Cruz\n", + "\n", + "## Tradução\n", + "José Victor Farias\n", + "\n", + "## Objetivos do aprendizado\n", + "* Ler um arquivo FITS\n", + "* Restaurar metadados do cabeçalho FITS\n", + "* Editar o cabeçalho FITS \n", + "* Salvar o arquivo modificado como um arquivo FITS\n", + "\n", + "## Palavras-chave\n", + "FITS, arquivo de entrada/saída\n", + "\n", + "## Sumário\n", + "Esse tutorial descreve como ler e editar um cabeçalho FITS e, depois, gravá-lo de volta para o disco. Nesse exemplo, iremos mudar a palavra-chave ``OBJECT``." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wAWWbhdOSVOa" + }, + "outputs": [], + "source": [ + "from astropy.io import fits" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Qipf9lBtSVOb" + }, + "source": [ + "``astropy.io.fits`` fornece muita flexibilidade para ler arquivos e cabeçalhos FITS, porém na maioria das vezes as funções de conveniência são o caminho mais fácil para acessar os dados. ``fits.getdata()`` lê apenas os dados de um aquivo FITS, mas com a palavra-chave `header=True`, o argumento lerá o cabeçalho." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "CQNIELhuSVOc" + }, + "outputs": [], + "source": [ + "data, header = fits.getdata(\"input_file.fits\", header=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "md3R0IbiSVOc" + }, + "source": [ + "Existe também uma função especifica para ler apenas o cabeçalho:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "id": "rhLpzgKtSVOd" + }, + "outputs": [], + "source": [ + "hdu_number = 0 # HDU (header data unit) significa unidade de dados do cabeçalho.\n", + "fits.getheader('input_file.fits', hdu_number)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "amjdLFHFSVOd" + }, + "source": [ + "Mas `getdata()` pode obter os dados e o cabeçalho, então é um comando vantajoso de lembrar.Já que a HDU primária de um arquivo FITS deve conter os dados da imagem, agora armazenados em um array ``numpy``. O cabeçalho é armazenado em um objeto que atua como um dicionário python padrão." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tKn6b0-DSVOe" + }, + "outputs": [], + "source": [ + "# Mas hdu_number = 0 é a HDU primária. Quantas HDUs existem neste arquivo?\n", + "fits_inf = fits.open(\"input_file.fits\")\n", + "fits_inf.info() \n", + "fits_inf[0].header" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H6a8TidISVOf" + }, + "source": [ + "Utilizar ``fits.open`` nos permite olhar mais genericamente os nossos dados. ``fits_inf[0].header`` nos dá a mesma saída como ``fits.getheader``. O que você recebe se digitar ``fits_inf[1].header``? Com base no ``fits_inf.info()``, você pode supor o que acontecerá se utilizar ``fits_inf[2].header``?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "46BL7AIASVOg" + }, + "source": [ + "Agora vamos alterar o cabeçalho para dar-lhe o objeto correto:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "r1EOuczdSVOg" + }, + "outputs": [], + "source": [ + "header['OBJECT'] = \"M31\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "j_cJtTVlSVOh" + }, + "source": [ + "Finalmente, temos que escrever o arquivo FITS. Novamente, a função de conveniência para isto é o comando mais útil para lembrar:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "bbruh5B1SVOh" + }, + "outputs": [], + "source": [ + "fits.writeto('output_file.fits', data, header, overwrite=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "u5IDjA5pSVOh" + }, + "source": [ + "É isso; Terminou!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "B8HEX17ASVOi" + }, + "source": [ + "Dois casos comuns e mais complicados que valem a pena mencionar (mas se suas necessidades são mais complexas, você deve consultar a documentação completa http://docs.astropy.org/en/stable/io/fits/).\n", + "\n", + "A primeira complicação é que o arquivo FITS que você está examinando e editando pode possuir múltiplas HDU's (extensões), no qual você pode especificar a extensão desta forma:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "XNF86xKXSVOi" + }, + "outputs": [], + "source": [ + "data1, header1 = fits.getdata(\"input_file.fits\", ext=1, header=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ourki2axSVOi" + }, + "source": [ + "Isso fornecerá para você os dados e o cabeçalho associados à extensão `index=1` do arquivo FITS. Sem especificar um número, `getdata()` obterá a 0ª extensão (equivalente dizer `ext=0`)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JJp3VEiqSVOj" + }, + "source": [ + "Outra dica útil é se você quer sobrescrever um arquivo FITS existente. Por padrão, `writeto()` não vai deixar você fazer isso, então você precisa explicitamente dar permissão usando como argumento a palavra-chave `clobber`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "6m_Mv42RSVOj" + }, + "outputs": [], + "source": [ + "fits.writeto('output_file.fits', data, header, overwrite=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o2Snyi6ZSVOj" + }, + "source": [ + "Um exemplo final é se você deseja fazer uma pequena mudança em um arquivo FITS, como atualizar uma palavra-chave do cabeçalho, mas você não quer ler e reescrever no arquivo todo, o que pode levar um tempo. Ao invés disso, você pode usar o modo de leitura `mode='update'` para fazer isso:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mcdIxytnSVOk" + }, + "outputs": [], + "source": [ + "with fits.open('input_file.fits', mode='update') as filehandle:\n", + " filehandle[0].header['MYHDRKW'] = \"My Header Keyword\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V87jfRelSVOk" + }, + "source": [ + "## Exercícios" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z8pQScj6SVOk" + }, + "source": [ + "Leia o arquivo que você acabou de escrever e adicione três palavras-chave de cabeçalho:\n", + "\n", + "1. 'RA' para a Ascensão reta de M31\n", + "2. 'DEC' para a Declinação de M31\n", + "3. 'RADECSRC' com texto indicando onde você achou a RA/Dec (web URL, nome do livro texto, sua memória fotográfica, etc.)\n", + "\n", + "Então escreva o cabeçalho atualizado em um novo arquivo: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wto-auYGSVOl" + }, + "outputs": [], + "source": [ + "" + ] + } + ], + "metadata": { + "astropy-tutorials": { + "author": "Adrian M. Price-Whelan ", + "date": "July 2013", + "description": "Demonstrates how to read in, edit a FITS header, and then write it back out to disk using astropy.io.fits.", + "link_name": "Editing a FITS header", + "name": "", + "published": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "colab": { + "name": "Cópia de FITS-header.ipynb", + "provenance": [], + "collapsed_sections": [] + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file