[[Pythonバイオ]] [[Pythonバイオ/ツール]]~
&counter();   &lastmod();~

*SnapGeneに食わす (2019-08-20) [#z3b43427]

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

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

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

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

** GenBankファイルへの追記 [#u3ac08d3]
GenBankファイルのフィーチャーとして、
-misc_feature
-primer_bind
がある。

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ファイル [#o2fe085d]

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

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

参考になったのが、PythonのライブラリPyPIでの2つのライブラリ(読み出し専用)で、
- [[snapgene_reader PyPI:https://pypi.org/project/snapgene_reader/#files]]  [[Description:https://pypi.org/project/snapgene_reader/#description]] 
- [[SnapGeneFileReader · PyPI:https://pypi.org/project/SnapGeneFileReader/]] 
である。

ソースを見ると、どちらも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する [#b3f3c3c8]
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> の形になっている。

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



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS