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ではデータブロックを使って関連する情報やデータをまとめています。データブロックはデータファイルを論理的に分割するもの、あるいは辞書で 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つのデータブロックに統合することができます。しかし CELL
、ENTRY
などデータブロック内に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フレームを利用することはできません。