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的な解析が出来るようになりますね。