ヘッダに合う

次の3章では、例を含むFITタイトル、画像/配列データ、およびテーブルデータを動作させるより詳細な情報についてそれぞれ説明する。

HDUのヘッダ

各ヘッダデータユニット(HDU)は、一般に、ヘッダおよびデータの2つの構成要素を有する。はい。 astropy この2つのコンポーネントはHDUの2つの属性でアクセスします hdu.header そして hdu.data それがそうです。

HDUは空のデータを持っている場合があります .data 属性は None )であれば、いずれのHDUも常にヘッダを有することになる。ビルダを用いてHDUを作成する場合(例えば、 hdu = PrimaryHDU(data, header) )であれば、ユーザは、既存のHDUのヘッダからのヘッダ値およびヘッダ値を提供することができる numpy 配列していますデフォルト値(なし)が使用される場合、新しいHDUは、このタイプのHDUに必要な最小キーワードを有する:

>>> from astropy.io import fits
>>> hdu = fits.PrimaryHDU()
>>> hdu.header  # show the all of the header cards
SIMPLE  =                    T / conforms to FITS standard
BITPIX  =                    8 / array data type
NAXIS   =                    0 / number of array dimensions
EXTEND  =                    T

ユーザは、任意のヘッダおよび任意のデータを使用して新しいHDUを構築することができる。 astropy データ構造を記述するキーワードをすべて取り除き、情報的キーワードのみを残します。後で、必要な構造キーワードを再追加して、新しいHDUおよび追加された任意のデータと互換性がある。したがって、ユーザは、テーブルHDUのタイトルを使用して画像HDUを構築することができ、その逆も同様である。構造関数はまた,ヘッダ中のデータタイプと次元情報がデータと一致することを確保する.

Headerプロパティ

価値アクセス、更新、作成

例えば…。 Getting Started チュートリアルでは、HDUのHeader属性のキーワード名またはインデックスを介してキーワード値にアクセスすることができます。ワイルドカードもご利用いただけます * 検索文字列にマッチするキーワード値対を取得するためには,以下の操作を実行してください.以下に簡単なまとめを示す.

>>> fits_image_filename = fits.util.get_testdata_filepath('test0.fits')
>>> hdul = fits.open(fits_image_filename)  # open a FITS file
>>> hdr = hdul[0].header  # the primary HDU header
>>> print(hdr[34])  # get the 2nd keyword's value
96
>>> hdr[34] = 20  # change its value
>>> hdr['DARKCORR']  # get the value of the keyword 'darkcorr'
'OMIT'
>>> hdr['DARKCOR*']  # get keyword values using wildcard matching
DARKCORR= 'OMIT              ' / Do dark correction: PERFORM, OMIT, COMPLETE
>>> hdr['darkcorr'] = 'PERFORM'  # change darkcorr's value

Keyword names are case-insensitive except in a few special cases (see the sections on HIERARCH card and record-valued cards). Thus, hdr['abc'], hdr['ABC'], or hdr['aBc'] are all equivalent.

Pythonの dict タイプは、代入文法を使用して新しいキーワードをタイトルに追加することもできる:

>>> hdr = hdul[1].header
>>> 'DARKCORR' in hdr  # Check for existence
False
>>> hdr['DARKCORR'] = 'OMIT'  # Add a new DARKCORR keyword

新しい値を追加することもできます and それらをタプルとして指定することによって注釈を行う:

>>> hdr['DARKCORR'] = ('OMIT', 'Dark Image Subtraction')

注釈

見出しに新しいキーワードを追加する際に注意すべき重要な点は,デフォルトではこれらのキーワードを追加しないことである すぐに 書類の末尾まで。代わりに、それらは最後の非論評キーワードの後に追加される。これは,すべての履歴キーワードをつねに見出しの末尾にグループ化する一般的な用例を支援するためである.新しい非コメントキーワードは、既存のキーワードの末尾に追加されるが、タイトルの末尾の任意の履歴/コメントキーワードの前に追加される。

この機能をカバーする方法はいくつかあります

  • 使用 Header.append() 方法使用 end=True 論点:

    >>> hdr.append(('DARKCORR', 'OMIT', 'Dark Image Subtraction'), end=True)
    

    これは新しいキーワードをタイトルの実際の末尾に追加することを強制するだろう。

  • ♪the Header.insert() 方法は、常に要求された位置に新しいキーワードを挿入します。

    >>> del hdr['DARKCORR']  # Delete previous insertion for doctest
    >>> hdr.insert(20, ('DARKCORR', 'OMIT', 'Dark Image Subtraction'))
    

    これはタイトルの20番目のキーワードの前にDARKCORRキーワードを挿入するだろう。

キーワード(および対応するカード)は、同じインデックス/名前文法を使用して削除することができる::

>>> del hdr[3]  # delete the 2nd keyword
>>> del hdr['DARKCORR']  # delete the value of the keyword 'DARKCORR'

通常のPythonリストと同様に、インデックスは削除されるたびに更新されますので、もし del hdr[3] 2回連続して実行されると、4番目および5番目のキーワードが元のタイトルから削除される。同じように del hdr[-1] タイトルの最後のカードを削除します。

スライス文法を使用して範囲全体のカードを削除することもできます:

>>> del hdr[3:5]

方法 Header.set() 既存のキーワードに関連する値または注釈を更新するか、または新しいキーワードを作成する別の方法である。その機能の大部分は,上に示した辞書のような文法でコピー可能である.しかし、場合によっては、これはもっと明確になるかもしれない。また、ユーザがヘッダ内でカードを移動させること、または既存のカードに対する新しいカードの位置を指定することを可能にする利点がある。

>>> hdr.set('target', 'NGC1234', 'target name')
>>> # place the next new keyword before the 'TARGET' keyword
>>> hdr.set('newkey', 666, before='TARGET')  # comment is optional
>>> # place the next new keyword after the 21st keyword
>>> hdr.set('newkey2', 42.0, 'another new key', after=20)

FITSヘッダでは、各キーワードには、その用途を説明するための注釈が関連付けられている可能性もある。各キーワードに関連する注釈は通過可能である comments 属性::

>>> hdr['NAXIS']
2
>>> hdr.comments['NAXIS']
'number of data axes'
>>> hdr.comments['NAXIS'] = 'The number of image axes'  # Update
>>> hdul.close()  # close the HDUList again

注釈は、キーワード名でもカードインデックスでも、アクセス値と同じすべての方法でアクセスすることができる。スライスも可能です唯一の違いはあなたが経験することです hdr.comments ただ…。 hdr 一騎打ちをする。

注釈、歴史、空白キーワード

FITSヘッダ中のキーワードの多くは一意の名前を持っている.2枚以上のカードが同じ名前を共有している場合は,名前順に参照した場合,最初にアクセスされたカードである.重複項はデジタルインデックスでしかアクセスできない.

3つの特殊なキーワード(それらの関連カードは注釈カードと呼ばれることがある)があり,通常FITSヘッダに複数回出現する.これらは,(1)空白キーワード,(2)履歴と(3)コメントである.他のキーワードとは異なり、これらのキーワードにアクセスすると、リスト形式で返される:

>>> filename = fits.util.get_testdata_filepath('history_header.fits')
>>> with fits.open(filename) as hdul:  # open a FITS file
...     hdr = hdul[0].header

>>> hdr['HISTORY']
I updated this file on 02/03/2011
I updated this file on 02/04/2011

これらのリストは,任意の他のリストのようにスライスすることができる.例えば、最後の履歴項目のみを表示する場合は、ご利用ください hdr['history'][-1] それがそうです。既存の解説カードは、当該カードの適切なインデックス番号を用いて更新することも可能である。

辞書のようなキーワード代入文法を使うことで Header.set() 方法です。しかしながら、他のキーワードとは異なり、新しいコメントカードは、タイトルの末尾に追加するのではなく、同じキーワードを有する最後のコメントカードに常に追加されて付加される。

例を引く

新しい解説カードを追加するには、以下の操作を実行してください。

>>> hdu.header['HISTORY'] = 'history 1'
>>> hdu.header[''] = 'blank 1'
>>> hdu.header['COMMENT'] = 'comment 1'
>>> hdu.header['HISTORY'] = 'history 2'
>>> hdu.header[''] = 'blank 2'
>>> hdu.header['COMMENT'] = 'comment 2'

また、修正されたヘッダの部分は、以下のようになる。

HISTORY history 1
HISTORY history 2
        blank 1
        blank 2
COMMENT comment 1
COMMENT comment 2

ユーザはまた,タイトルのどの位置に新たなアノテカードを追加するかを直接制御することができ,方法は使用する. Header.insert() 方法です。

注釈

皮肉なことに,アノテーションカードにはアノテーションがなく,文字列の値のみである.

未定義の値

FITSヘッダは、Pythonで特定の値表現を使用して定義されていない値を有することができる。 None それがそうです。 None 値を与える Header あるいは…。 Card それがそうです。

>>> hdr = fits.Header()
>>> hdr['UNDEF'] = None
>>> hdr['UNDEF'] is None
True
>>> repr(hdr)
'UNDEF   =                                                                       '
>>> hdr.append('UNDEF2')
>>> hdr['UNDEF2'] is None
True
>>> hdr.append(('UNDEF3', None, 'Undefined value'))
>>> str(hdr.cards[-1])
'UNDEF3  =  / Undefined value                                                    '

カード画像

FITSヘッダはカード画像からなる.

FITSヘッダ中のカード画像は,キーワード名,値,備考(オプション)からなる.FITSファイルの格納フォーマットでは,物理的に80列(バイト)(リターン符を含まない)が必要となる.はい。 astropy それぞれのカード画像は Card 相手。解説カード(上述したように)と80欄以上のカード画像を1枚以上撮影できるカード画像がある特殊なタイプのカードもある.後者は後で議論される予定だ。

ほとんどの場合処理カードの詳細は Header オブジェクトは,かつカードを直接操作する必要がない.実際ほとんどの人は Header 受け入れる. (keyword, value) あるいは…。 (keyword, value, comment) パラメータとしてタプルを採用することも可能である Card 対象をパラメータとする. Card オブジェクトは、タイトル中の各カードを解析およびフォーマットする論理を提供するタプルのラッパのみである。通常、手動で使用します Card オブジェクトは,実際にカードをタイトルに追加する前にカードのタイトルへの表示方法をチェックしない.

プロパティ新しいCardオブジェクトの作成 Card 構造関数: Card(key, value, comment) それがそうです。

例を引く

新しいCardオブジェクトを作成するには、以下の操作を実行してください。

>>> c1 = fits.Card('TEMP', 80.0, 'temperature, floating value')
>>> c2 = fits.Card('DETECTOR', 1)  # comment is optional
>>> c3 = fits.Card('MIR_REVR', True,
...                'mirror reversed? Boolean value')
>>> c4 = fits.Card('ABC', 2+3j, 'complex value')
>>> c5 = fits.Card('OBSERVER', 'Hubble', 'string value')

>>> print(c1); print(c2); print(c3); print(c4); print(c5)  # show the cards
TEMP    =                 80.0 / temperature, floating value
DETECTOR=                    1
MIR_REVR=                    T / mirror reversed? Boolean value
ABC     =           (2.0, 3.0) / complex value
OBSERVER= 'Hubble  '           / string value

Cards have the attributes .keyword, .value, and .comment. Both .value and .comment can be changed but not the .keyword attribute. In other words, once a card is created, it is created for a specific, immutable keyword.

♪the Card() 構造関数は,与えられたパラメータがFITS規格に適合しているかどうかを検査し,固定されたカード画像フォーマットを持つ.ユーザがFITS規格に適合していないカード(例えば、テスト目的のための)であっても、カスタマイズされたフォーマットを有するカードを作成したい場合、 Card.fromstring() 種類の方法を使うことができる。

カードは以下のように検証できます Card.verify() それがそうです。非標準カード c2 以下の例では,このような検証によりタグ付けを行う.検証の詳細については、ご参照ください astropy 後述する節で議論する.

>>> c1 = fits.Card.fromstring('ABC     = 3.456D023')
>>> c2 = fits.Card.fromstring("P.I. ='Hubble'")
>>> print(c1)
ABC     = 3.456D023
>>> print(c2)  
P.I. ='Hubble'
>>> c2.verify()  
Output verification result:
Unfixable error: Illegal keyword name 'P.I.'

1部の名簿. Card これらの対象は Header 対象者はご利用いただけます Header.cards 属性です。このリストは観察だけで、直接操作されてはいけない。実は、それはただのコピーに過ぎない-それの修正はそれが由来する頭に影響を与えない。使用由 Header 種類ではありません

継続札.

FITS規格ではキーワード名として最大8文字のみを許可しており,80文字にキーワード,値,アノテーションが含まれていることは,あるアプリケーションに制限がある.キーワードが長い文字列の値を使用することを可能にするために、ここで提案されている:

CONTINUEキーワードは,キーワードを含むRegular 80列の後に使用される. astropy このコミットメントはサポートされておらず,このコミットメントは4.0版から始まるFITS規格の一部である.

実例.

以下の例では、長い文字列値について、CONTINUEが自動的に使用されることを示す。

>>> hdr = fits.Header()
>>> hdr['abc'] = 'abcdefg' * 20
>>> hdr
ABC     = 'abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcd&'
CONTINUE  'efgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefga&'
CONTINUE  'bcdefg'
>>> hdr['abc']
'abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg'
>>> # both value and comments are long
>>> hdr['abc'] = ('abcdefg' * 10, 'abcdefg' * 10)
>>> hdr
ABC     = 'abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcd&'
CONTINUE  'efg&'
CONTINUE  '&' / abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefga
CONTINUE  '' / bcdefg

なお、連続カードを使用する場合には、各80文字のカード画像の末尾に1つのAND番号が出現する。和番号は文字列の値の一部ではない.さらに、CONTINUEの後の9列目には“=”はない。第1の例では、240文字全体が astropy カードとして。したがって、タイトルのn番目のカードである場合、(n+1)番目のカードは、次の継続カードではなく、次のキーワードを指す。したがって,連続カードは透明に処理される. astropy 単一の論理カードとしては,一般にフォーマットの詳細を心配する必要はない.通常のキーワードへのアクセスや更新のように1組の連続カードのキーワードにアクセス·更新解析することができる.

階層カード.

長さ8文字を超えるキーワードについては、欧州南方天文台(ESO)がこのような使用を促進する慣例がある。これは,実際のLongキーワードに続く特殊なキーワード階層構造を用いている. astropy この約束も支持します。

キーワードに8つ以上の文字が含まれていれば astropy クラスカードは自動的に使用されますが、エラーの場合には警告を発することもあります。しかしながら、キーワードの前に“Hierarchy”(タイトルに現れるような)を加えることで、階層カードを明示的に要求することができます。例えば hdr['HIERARCH abcdefghi'] キーワードが作成されます abcdefghi 警告は表示されません作成後、任意の他のキーワードにアクセスするように階層キーワードにアクセスすることができます: hdr['abcdefghi'] キーワードの前に‘Hierarchy’をつけるのではない.

実例.

astropy 階層カードを使用し、キーワードが8文字以上含まれている場合に警告します:

>>> # this will result in a Warning because a HIERARCH card is implicitly created
>>> c = fits.Card('abcdefghi', 10)  
>>> print(c)  
HIERARCH abcdefghi = 10
>>> c = fits.Card('hierarch abcdefghi', 10)
>>> print(c)
HIERARCH abcdefghi = 10
>>> hdu = fits.PrimaryHDU()
>>> hdu.header['hierarch abcdefghi'] =  99
>>> hdu.header['abcdefghi']
99
>>> hdu.header['abcdefghi'] = 10
>>> hdu.header['abcdefghi']
10
>>> hdu.header
SIMPLE  =                    T / conforms to FITS standard
BITPIX  =                    8 / array data type
NAXIS   =                    0 / number of array dimensions
EXTEND  =                    T
HIERARCH abcdefghi = 10

注釈

最後に覚えておきたいのは Header クラスの特徴の1つは,FITSフォーマットに関する奇癖を抽象化するための設計がほとんどであることである.たとえば,それがContinueとHierarcheカードを自動的に作成する理由である.ヘッダはただのデータ構造であり、ユーザとして、最終的にFITSファイルのヘッダにどのようにシーケンスされるかを心配する必要はありません。

一部の分野ではFITSフォーマットの奇癖を隠すことはほとんど不可能だが、 astropy あなたが少なければ少ないほどよくなるように努力します。タイトルの構造に曖昧さや理解しにくい点があれば、もっと改善できるところがあるかもしれないので教えてください。