openbabelのfingerprintをビット列にする
openbabelではxhオプションをつけることでフィンガープリントを16進表記で書き出すことができます。
babel -ismi test.smi -ofpt test.fpt -xh -xfFP2 less test.fpt >test1 18 bits set 00002000 00000000 00000100 00010200 00000000 00000000 00000000 00000000 00000000 00000840 00000000 40008000 00000000 00000000 00000000 00000000 00020000 02000000 04000000 00000000 00000000 08000000 10000000 00400000 00000000 80000000 00000000 00000040 00004000 00020000 00000000 00000000 >test2 Tanimoto from test1 = 0.027027 00010000 01000000 00000000 00000000 00080000 00000000
ただしこれだと、解析するときに不便なのでビット列に直したい時があります。なのでpythonでビット列に変換するコードを書いてみました
def hex2bin(fingerprint): bf = "" h2b = {"0":"0000","1":"0001","2":"0010","3":"0011", "4":"0100","5":"0101","6":"0110","7":"0111", "8":"1000","9":"1001","a":"1010","b":"1011", "c":"1100","d":"1101","e":"1110","f":"1111", } for l in fingerprint: for c in l: b = h2b.get(c) if b: bf += b return bf def convert(file): result = "" for data in open(file,"r").read().split("\n>"): fp = "" for list in data.split("\n")[1:]: fp += hex2bin(list) result += data.split("\n")[0].split(" ")[0] + " " + fp + "\n" return result if __name__ == "__main__": import sys file = sys.argv[1] sys.stdout.write(convert(file))
フィンガープリントをさらにsplitしてcsvで書き出せばRであれとかこれとかQSAR的な解析が出来るようになりますね。