ファイル1
ATOM 2 CA PRO A 2 29.341 -18.244 23.236 1.00112.52 C
ATOM 9 CA LYS A 3 28.103 -17.550 19.692 1.00 91.13 C
ATOM 18 CA PRO A 4 29.134 -14.592 19.578 1.00 63.64 C
ATOM 51 CA GLY A 5 24.012 -5.835 11.284 1.00 25.93 C
ATOM 1605 CA LYS B 1 8.357 5.403 38.590 1.00 58.36 C
ATOM 1614 CA PRO B 2 6.423 2.744 36.650 1.00 49.68 C
ATOM 1621 CA PHE B 3 7.816 1.954 33.187 1.00 42.38 C
ATOM 1623 CA PHE B 4 7.816 1.954 33.187 1.00 42.38 C
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ファイル2
ATOM 51 CA GLY A 1 24.012 -5.835 11.284 1.00 25.93 C
ATOM 55 CA ILE A 2 23.574 -2.078 10.974 1.00 25.44 C
ATOM 63 CA ALA A 3 22.508 -0.631 7.650 1.00 33.94 C
ATOM 68 CA GLY A 4 20.982 2.603 6.424 1.00 29.02 C
ATOM 69 CA GLY A 5 20.982 2.603 6.424 1.00 29.02 C
ATOM 1614 CA PRO B 2 6.423 2.744 36.650 1.00 49.68 C
ATOM 1621 CA PHE B 3 7.816 1.954 33.187 1.00 42.38 C
ATOM 1623 CA PHE B 4 7.816 1.954 33.187 1.00 42.38 C
ATOM 1623 CA PHE B 5 7.816 1.954 33.187 1.00 42.38 C
上記の2つのテキストファイルがある。
そのテキストファイルと同じフォルダに下記のコードが存在する。
内容は、これら同じフォルダ内のファイルを一括で読み込み、ATOM、CA、Aという文字を含む行とATOM、CA、Bという文字を含む行をぞれぞれ分けて抽出し、
左から6個目の要素(今回ではファイル1でいう、Aの2,3,4,5, Bの1,2,3,4)の数字がAとBでぞれぞれいくつからいくつがつながっているか(今回ではファイル1でいう、Aは2-5、Bは1-4)を調べるプログラムを作った。
下記のコードを実行して、
結果は
-------- pdb1ufq.ent(今回のファイル1) --------
A側のCA
[2, 5]
B側のCA
[1, 4]
-------- pdb3asy.ent(今回のファイル2) --------
A側のCA
[1, 5]
B側のCA
[2, 5]
となる。
そしてここからやりたいのはこのそれぞれの結果のA側だけ、B側だけ、AもBも含めた全体の範囲の頻度をそれぞれ3種類求めたい。
今回でいう
A側だけ↓
1 50%
2-5 100%
B側だけ↓
1 50%
2-4 100%
5 50%
AもBも含めた全体の範囲↓
1 50%
2-4 100%
5 75%
という感じにしたいです。
下記コードにどのようにしたらこのようなものを求められるでしょうか?お願いします。
もしかしたらデータを抽出する段階でpandasのDateFrameで作ったほうが良かったかもしれません。
そうすればvalue_countで数えられたかもしれません。どちらの方法でも構わないので分かる方お願いいたします。
import tkinter from selenium import webdriver from time import sleep import requests from bs4 import BeautifulSoup import more_itertools as mit import glob # テキストファイルのみを取得 list1=glob.glob("*.ent") print(list1) for name in list1: def consecutive_groups(iterable): """Yield range of consecutive numbers.""" for group in mit.consecutive_groups(iterable): group = list(group) if len(group) == 1: yield group[0] else: yield group[0], group[-1] path = name print("--------",name,"--------") serial_numbers_A = [] serial_numbers_B = [] with open(path) as f: lines = f.readlines() lines_strip = [line.strip() for line in lines] #A側のCAの抽出----------------------------- for A_and in lines: A_and=A_and.split() if A_and[0] == 'ATOM' and A_and[2] == 'CA' and A_and[4] == 'A': serial_numbers_A.append(int(A_and[5])) print("A側のCA") for Agroup in consecutive_groups(serial_numbers_A): print(list(Agroup)) #B側のCAの抽出----------------------------- for B_and in lines: B_and=B_and.split() if B_and[0] == 'ATOM' and B_and[2] == 'CA' and B_and[4] == 'B': serial_numbers_B.append(int(B_and[5])) print(" ") print("B側のCA") for Bgroup in consecutive_groups(serial_numbers_B): print(list(Bgroup))
回答1件
あなたの回答
tips
プレビュー