Pythonバイオ? Pythonバイオ/ツール?
42   2019-08-22 (木) 09:03:40

SnapGeneに食わす (2019-08-20)

リクエストがあったこと: 外部で得たデータをSnapGeneで表示する

SnapGeneではGenBank形式のアノテーションを含むデータを表示することができる。 表示したい情報をGenBank形式のファイルに追加することによって、SnapGeneに表示 指せることを考える。

具体的にはたとえば、変異情報(SNIP, In/Delなど)の情報を追加し、該当する場所に 表示する。

また、別の(過去の)SnapGeneデータ(=xxx.dnaファイル)に追記されているPrimer情報を移す。これはSnapGeneのPrimerのExport/Inportの機能を使えばできるのだが、 1ファイルずつ移すのは面倒なので、うまく移せないか。

GenBankファイルへの追記

GenBankファイルのフィーチャーとして、

misc_featureは、いわば「その他のフィーチャー」であるから、SnapGeneでは追加の フィーチャーとして表示されるが、格段の処理は無いようだ。GenBankでの書き方は、

    misc_feature    311
                    /label="DEL"
                    /note=" T->*"

のような感じで、311は配列上の位置情報、labelはラベル表示、noteは追記情報として マウスオンで表示される。これらの情報をGenBankファイルに適宜書込めばよい。

なお、通常はGenBankファイル上のさまざまなフィーチャー情報は位置の順にソートされ ているが、SnapGeneは必ずしもソートを要求していない。たとえばmisc_featureだけ 集めてフィーチャーの終わりに追加しても、正しく表示される。なお、位置でソートする こともbiopythonでは容易に行える。

また、primer_bindも同様に、

    primer_bind     2732..2801
                    /label="ups thrB70 5'-PS4"
                    /note="ups thrB70 5'-PS4
                    AATGACGTTACAGCTGCCGGTGTCTTTGCTGATCTGCTACGTACCCTCTCATGGAAGTT
                    AGGAGTCTGACATTCCGGGGATCCGTCGACC"

のようにフィーチャーとして書き足せばSnapGeneの配列表示の画面に表示される。 ただし、もし移した先の配列の位置が異なっていれば、primerを貼り付ける位置も変える 必要がある。(大腸菌の例では環状なので全体の向きが逆になっており、位置がことごとく 変ってしまったケースがある。)この場合は、正しい貼り付け位置を求めた上で、 上記のprimer_bindのレコードを書く必要がある。

ところで、primer_bindが書き込めるのはよいのだが、ここに1つ問題がある。 SnapGeneではGenBankデータ上のprimer_bindの記述は追加フィーチャーと同じ扱いで、 SnapGene上のprimerとしては扱われない。GenSnapの配列表示上でprimerの記号にも ならないし、primerのシートにも載らない。

言い換えると、GenBankファイル上のprimer_bindの情報は、SnapGene上のprimer情報 としては反映されない。これは逆向きもしかりで、SnapGeneから吐き出したGenBankデータ は、primer情報は上記の情報(位置、ラベル、ノート)しか持たない。

というわけで、GenBank上で加工しておいてSnapGeneのprimerデータに反映させることは うまくいかなかった。

SnapGeneの保存形式dnaファイル

SnapGeneのデータはdnaファイルという形式で保存される。ここに何が書かれているか?

dnaファイルの形式については、ネットでは記述が見つからなかった。またテキスト エディタで見るとバイナリ形式である。つまり、何らかの形式記述が見つからないと 解読すらできない。

参考になったのが、PythonのライブラリPyPIでの2つのライブラリ(読み出し専用)で、

ソースを見ると、どちらもprimerの記述部分は解読をスキップする(それ以外にも 普通に興味の無さそうなところは皆スキップし、たとえばシーケンス部分だけを 取出すなどの操作を想定している。)

それで、primer部分をあてずっぽうに解釈してみる。他のフィールドもXML形式なので、 同じXMLパーザを介して辞書形式に落とす。

       elif ord(next_byte) == 5:
           # READ THE PRIMERS
           block_content = fileobject.read(block_size).decode('utf-8')
           primer_data = parse_dict(xmltodict.parse(block_content))
           data['Primers'] = primer_data['Primers']

この加筆をした上で、 from mysnapgene_reader import snapgene_file_to_dict, snapgene_file_to_seqrecord

filepath = './mytest.dna'
dict = snapgene_file_to_dict(filepath)
print(dict['Primers'].keys())
import pprint as pp
d = dict['Primers']
dd = d['Primer']
print(dd.keys())
pp.pprint(dd)

結果を見ると、かなり多くの情報を含んでいることが分かるうえ、これらの情報を 作り出さなければならない。annealiedBasesとかmeldingTempreratureとか hybridizedRangeとか、いろいろと求めなければならないらしい。

odict_keys(['@recentID', '@name', '@sequence', '@description', '@dateAdded', 'BindingSite'])

OrderedDict([('@recentID', '0'),
            ('@name', 'TestPrimerNY'),
            ('@sequence', 'TTATAAGCAgttcgagt'),
            ('@description', ''),
            ('@dateAdded', '2019-08-20T05:34:31Z'),
            ('BindingSite',
             [OrderedDict([('@location', '1261985-1261996'),
                           ('@boundStrand', '0'),
                           ('@annealedBases', 'AGCgttcgagt'),
                           ('@meltingTemperature', '33'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATA')]),
                             OrderedDict([('@hybridizedRange',
                                           '1261985-1261987'),
                                          ('@bases', 'AGC')]),
                             OrderedDict([('@bases', 'A')]),
                             OrderedDict([('@hybridizedRange',
                                           '1261989-1261996'),
                                          ('@bases', 'gttcgagt')])])]),
              OrderedDict([('@location', '1490680-1490689'),
                           ('@boundStrand', '0'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '1490680-1490689'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@location', '2474407-2474416'),
                           ('@boundStrand', '0'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '2474407-2474416'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@location', '401796-401809'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'AAGCAgttcgagt'),
                           ('@meltingTemperature', '33'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTAT')]),
                             OrderedDict([('@hybridizedRange',
                                           '401805-401809'),
                                          ('@bases', 'AAGCA')]),
                             OrderedDict([('@hybridizedRange',
                                           '401796-401803'),
                                          ('@bases', 'gttcgagt')])])]),
              OrderedDict([('@location', '451228-451237'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '451228-451237'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@location', '1414375-1414384'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '1414375-1414384'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@location', '2529410-2529419'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '36'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '2529410-2529419'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@location', '4065918-4065927'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '36'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '4065918-4065927'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '1261985-1261996'),
                           ('@boundStrand', '0'),
                           ('@annealedBases', 'AGCgttcgagt'),
                           ('@meltingTemperature', '33'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATA')]),
                             OrderedDict([('@hybridizedRange',
                                           '1261985-1261987'),
                                          ('@bases', 'AGC')]),
                             OrderedDict([('@bases', 'A')]),
                             OrderedDict([('@hybridizedRange',
                                           '1261989-1261996'),
                                          ('@bases', 'gttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '1490680-1490689'),
                           ('@boundStrand', '0'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '1490680-1490689'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '2474407-2474416'),
                           ('@boundStrand', '0'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '2474407-2474416'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '401796-401809'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'AAGCAgttcgagt'),
                           ('@meltingTemperature', '33'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTAT')]),
                             OrderedDict([('@hybridizedRange',
                                           '401805-401809'),
                                          ('@bases', 'AAGCA')]),
                             OrderedDict([('@hybridizedRange',
                                           '401796-401803'),
                                          ('@bases', 'gttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '451228-451237'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '451228-451237'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '1414375-1414384'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '35'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '1414375-1414384'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '2529410-2529419'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '36'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '2529410-2529419'),
                                          ('@bases', 'CAgttcgagt')])])]),
              OrderedDict([('@simplified', '1'),
                           ('@location', '4065918-4065927'),
                           ('@boundStrand', '1'),
                           ('@annealedBases', 'CAgttcgagt'),
                           ('@meltingTemperature', '36'),
                           ('Component',
                            [OrderedDict([('@bases', 'TTATAAG')]),
                             OrderedDict([('@hybridizedRange',
                                           '4065918-4065927'),
                                          ('@bases', 'CAgttcgagt')])])])])])

SnapGeneからprimer情報をexportする

SnapGene(有料版)にはprimer情報をexportする機能がある。テキストファイルへの 出力を指定すると、ドキュメント(FAQのページ、https://www.snapgene.com/support/faq/)では

You will need to export the primers to a list. In Excel, list the primers with a Name column and a Sequence column, plus an optional Notes column. Export the data by using Save As with the format Tab Delimited Text. Then in SnapGene, use Primers → Import Primers from a List.

としている。実際にexport出力してみると

yjeI3    TTTTTTTTTTTTTTTTTTTT(ここ適当)   Note Note Note

のように、タブ区切りで、<name> tab <sequence> tab <note> の形になっている。

ということで、この形式になっている。このことから、SnapGeneがこのテキスト形式の primerデータをimportする場合は、結構それなりの処理(位置の特定から始まって、 その他のメタデータの算定等)を行って、内部的に保持しており、それを.dnaファイル には書き出している(XMLで)と思われる。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-22 (木) 09:03:40 (25d)