英語原文(wwPDB)

PDBx/mmCIFの書式

mmCIFデータファイルで用いられる書式や辞書は、STAR(Self-defining Text Archive and Retrieval、自己定義テキストアーカイブ・検索)形式の文法に基づいて定められています。データが1セットしかない場合、データ名と値を空白ではさんで各行に記したものになります。次の例はセル定数の値を示したものですが、書式は容易に解釈できるでしょう。

# 
_cell.entry_id           4HHB 
_cell.length_a           63.150 
_cell.length_b           83.590 
_cell.length_c           53.800 
_cell.angle_alpha        90.00 
_cell.angle_beta         99.34 
_cell.angle_gamma        90.00 
_cell.Z_PDB              4 

アンダースコアで始まっている行にmmCIFデータのアイテム名が記されています。 アンダースコアに続く非空白文字列がカテゴリ名とキーワードとして解釈され、両者の間はピリオドで区切られます。キーワード部分は同一カテゴリ内では重複することのない一意な値になっています。上の例では、全てのデータアイテムがCELLカテゴリに属しています。また、アイテム名とその値が1対1に対応していることも分かります。データカテゴリやデータアイテムの名前は大文字小文字を区別しません。

次の例はmmCIFにおいて文字列がどのように記述されるのかを示しています。短い文字列はシングルクォートまたはダブルクォートで囲んでも構いません。文字列が複数行に渡る場合、先頭行の行頭と値の末尾の次行先頭にセミコロンを置いて値を囲みます。なお、何らかの理由で値を明確に指定することができなかった場合に用いられる特殊文字が2つあります。疑問符(?)はそのアイテム値がないことを、ピリオド(.)は、そのアイテムに対する適当な値がないか、または意図的に省略されたことを意味します。

_entity_src_gen.entity_id                          1 
_entity_src_gen.pdbx_gene_src_gene                 'MT3707, MTCY07H7B.20, panC, Rv3602c' 
_entity_src_gen.pdbx_gene_src_scientific_name      'Mycobacterium tuberculosis' 
_entity_src_gen.pdbx_gene_src_ncbi_taxonomy_id     1773 
_entity_src_gen.pdbx_host_org_scientific_name      'Escherichia coli' 
_entity_src_gen.pdbx_host_org_ncbi_taxonomy_id     562 
_entity_src_gen.pdbx_host_org_vector_type          plasmid 
_entity_src_gen.pdbx_host_org_tissue               ? 
_entity_src_gen.pdbx_host_org_vector               ? 
_entity_src_gen.plasmid_name                       pET30a 

_struct_ref.id                         1 
_struct_ref.db_name                    UNP 
_struct_ref.db_code                    PANC_MYCTU 
_struct_ref.pdbx_db_accession          P0A5R0 
_struct_ref.entity_id                  1 
_struct_ref.biol_id                    . 
_struct_ref.pdbx_seq_one_letter_code   
;MTIPAFHPGELNVYSAPGDVADVSRALRLTGRRVMLVPTMGALHEGHLALVRAAKRVPGS 
VVVVSIFVNPMQFGAGEDLDAYPRTPDDDLAQLRAEGVEIAFTPTTAAMYPDGLRTTVQP 
GPLAAELEGGPRPTHFAGVLTVVLKLLQIVRPDRVFFGEKDYQQLVLIRQLVADFNLDVA 
VVGVPTVREADGLAMSSRNRYLDPAQRAAAVALSAALTAAAHAATAGAQAALDAARAVLD 
AAPGVAVDYLELRDIGLGPMPLNGSGRLLVAARLGTTRLLDNIAIEIGTFAGTDRPDGYR 
;

配列や表の形式になっているデータの場合、mmCIFでは loop_ を使って記述します。表を作成するには、表の列に当たるデータアイテム名の前に loop_ を、後には表の行に当たるデータを記します。以下の例は、著者名の一覧表を作ったものです。

# 
loop_
_citation_author.citation_id 
_citation_author.name 
_citation_author.ordinal 
primary 'Fermi, G.'     1  
primary 'Perutz, M.F.'  2  
primary 'Shaanan, B.'   3  
primary 'Fourme, R.'    4  
1       'Perutz, M.F.'  5  
1       'Hasnain, S.S.' 6  
1       'Duke, P.J.'    7  
1       'Sessler, J.L.' 8  
1       'Hahn, J.E.'    9  
2       'Fermi, G.'     10 
2       'Perutz, M.F.'  11 
3       'Perutz, M.F.'  12 
4       'Teneyck, L.F.' 13 
4       'Arnone, A.'    14 
5       'Fermi, G.'     15 
6       'Muirhead, H.'  16 
6       'Greer, J.'     17 
# 

mmCIFで loop_ を使うに当たって以下のような制約があります。

  • loop内に記述されるデータは全て同一のmmCIFカテゴリに属していること。
  • loopの後に続くデータ値の個数は、データアイテム名の個数のきっちり整数倍であること。
  • mmCIFでは loop_ を入れ子構造にすることはできない。

mmCIFではデータブロックを使って関連する情報やデータをまとめています。データブロックはデータファイルを論理的に分割するもの、あるいは辞書で data_ を使って定義されたものです。データブロック名は data_ の後に文字列を付加したもので、データブロックは別の data_ またはファイルの終端で終わります。以下に、非常に簡単なデータブロックの例を示します。

#
# --- # で始まる行はコメントとして処理されます
#
data_X987A
_entry.id                              X987A

_exptl_crystal.id                  'Crystal A'
_exptl_crystal.colour              'pale yellow'
_exptl_crystal.density_diffrn      1.113
_exptl_crystal.density_Matthews    1.01 

_cell.entry_id                         X987A
_cell.length_a                         95.39
_cell.length_a_esd                      0.05
_cell.length_b                         48.80
_cell.length_b_esd                      0.12
_cell.length_c                         56.27
_cell.length_c_esd                      0.06

# 2つ目のデータブロック
data_T100A

_entry.id                           T100A

_exptl_crystal.id                  'Crystal B'
_exptl_crystal.colour              'orange'
_exptl_crystal.density_diffrn      1.156
_exptl_crystal.density_Matthews    1.06

_cell.entry_id                         T100A
_cell.length_a                         68.39
_cell.length_a_esd                      0.05
_cell.length_b                         88.70
_cell.length_b_esd                      0.12
_cell.length_c                         76.27
_cell.length_c_esd                      0.06

上記の例では、どのようにしてデータブロックを使い、似た情報を異なる構造へと分割するのかを示しています。この分割が必要となるのは、mmCIFの文法ルールで同一データブロック内に同一カテゴリを複数記すことが禁じているからです。そのため、上に記す2つのデータブロックを単につなげて1つのデータブロックにするのは構文として正しくないことになります。

上例のデータブロックをつなげる際、mmCIFデータモデルとこの特定カテゴリの構造に関連する別の問題が生じます。この場合、loop_ を使って、EXPTL_CRYSTAL カテゴリの情報を再構築して1つのデータブロックに統合することができます。しかし CELLENTRYなどデータブロック内に1つしか値がないカテゴリの場合、loopを使うことができません。 これらカテゴリのデータ項目が単一の値しかとらない性質を持っているのは、これら2つのカテゴリのキー項目がそう定義されているからです。CELL カテゴリのカテゴリキーである _cell.entry_id_entry.id の値を継承する子として定義されています。この項目はデータブロックを一意に識別する値として定義されているので、単一の値だけが想定されます。

mmCIF辞書における定義はsaveというフレームでカプセル化されています。saveフレームは save_ という記述子で始まり、save_ という記述子で終わります。saveフレームは save_ トークンに文字列を付け加えた名前になります。mmCIF辞書では、項目とカテゴリをカプセル化するのに使われます。mmCIF辞書は何千ものsaveフレームを含むデータブロックで構成され、各saveフレームには異なる定義が書かれています。saveフレームはmmCIF辞書だけに見られ、入れ子構造にはしません。以下の例は、_exptl.details のデータ項目定義を含むsaveフレームを示したものです。

save__exptl.details
    _item_description.description
;              Any special information about the experimental work prior to the
               intensity measurement. See also _exptl_crystal.preparation.
;
    _item.name                  '_exptl.details'
    _item.category_id             exptl
    _item.mandatory_code          no
    _item_aliases.alias_name    '_exptl_special_details'
    _item_aliases.dictionary      cif_core.dic
    _item_aliases.version         2.0.1
    _item_type.code               text
     save_

saveフレームは、mmCIFよりもSTARにおいてはるかに重要な役割を果たします。NMR-STARなどのSTAR形式を使ったファイルにおいて、ファイル内で参照し展開することができる再利用可能なまとまりとしてsaveフレームは機能します。saveフレーム名の前にドル記号をつけることにより、STARファイル内で参照できます。mmCIFにおけるsaveフレームの利用は、編成とスコープの機能だけに限定されています。mmCIFでは、フレームを保存するための参照や、辞書定義をカプセル化する以外の目的でsaveフレームを利用することはできません。