2016-09-07 3 views
0

I 두 가지 유형의 파일 가지고 A는 : 좌표 1,206 라인 (XYZ)를 포함 - B는 단백질 사슬 - 분자파이썬 여러 좌표 사이의 최소 거리를 계산

무리 좌표 114 개 라인 (XYZ)를 포함를

다음과 같이하고 싶습니다 : A의 각 줄마다 B의 각 줄마다 거리를 계산하십시오. 그래서 저는 A의 각 줄마다 114 개의 거리 값을 얻습니다. 그러나 나는 모두를 필요로하지 않습니다. A의 각 라인. 따라서 원하는 출력 : 1206 라인의 파일, 각 라인은 하나의 값을 포함합니다 : 최단 거리. 파일 A의 원래 순서를 유지하는 중요

내 코드 : 부분적으로 만

import os 
import sys 
import numpy as np 



outdir = r'E:\MTA\aminosavak_tavolsag\tavolsagok' 
for dirname, dirnames, filenames in os.walk(r'E:\MTA\aminosavak_tavolsag\receptorok'): 
    for path, dirs, files in os.walk(r'E:\MTA\aminosavak_tavolsag\kotohely'): 
     for filename in filenames: 
      for fileok in files: 
       if filename == fileok: 
        with open(os.path.join(outdir, filename) , "a+") as f: 
         data_ligand = np.loadtxt(os.path.join(path, fileok)) 
         data_rec = np.loadtxt(os.path.join(dirname, filename)) 

         for i in data_rec: 
          for j in data_ligand: 

           dist = np.linalg.norm(i - j) 

           dist_float = dist.tolist() 
           dist_str = str(dist_float) 
           dist_list = dist_str.split() 
           for szamok in dist_list: 
            for x in range(len(dist_list)): 
             minimum = min([float(x) for x in dist_list]) 

          f.write(str(minimum) + "\r\n") 

이 코드는 작동하지만. --- 단백질 잔여 물을 찾는 궁극적 인 목표는 분자 묶음 (바인딩 사이트)에 충분히 가깝습니다. 시각적 인 소프트웨어로 결과를 확인할 수 있고 코드가 필요한 것보다 잔류 물이 훨씬 적습니다. ----

어디서 문제인지 파악할 수 없습니다. 당신이 나를 도울 수? 감사합니다.

+0

내가 마지막 질문을하지 않았다! A의 각 행에 대해 B의 가장 가까운 요소가 포함 된 1024 개의 요소 벡터를 계산할 수 있습니다. 이제 다음 단계에서 뭘 계산 하시겠습니까? 파일 A와 파일 B의 예제를 추가하면 멋질 것입니다. –

+0

큰 데이터가 실제로 구현을 테스트하기 위해 작은 데이터를 가져서는 안된다는 의미는 아닙니다. 알고리즘이 작동한다는 것을 증명해야하는 유일한 방법은 외면적인 육안 검사입니다. – Voo

답변

1

코드가 꽤 혼란스럽고 몇 가지 실수를 볼 수 있습니다.

minimumfor 루프 외부에 있으므로 마지막 값만 기록됩니다.

또한 계산 방법은 minimum입니다. szamok은 사용되지 않으며 x (목록 표현식 내에 또 다른 x을 사용하고 있으므로) minimum = ...을 둘러싼 for 루프는 모두 쓸모가 없습니다.

또 다른 의심스러운 것은 str(dist_float)입니다. float 목록을 문자열로 변환합니다. 이렇게하면 문자열 목록이 아닌 목록의 문자열 표현이 제공됩니다. 이것은 쓸모없는 것일뿐만 아니라 예상치 못한 결과가 나면 그것을 나눌 때 잘못 되었기 때문에 잘못되었습니다.

A와 B의 데이터 라인을위한 ij 스탠드를 가정하면,이 같은 코드의 끝을 다시 것 :

... 
data_ligand = np.loadtxt(os.path.join(path, fileok)) 
data_rec = np.loadtxt(os.path.join(dirname, filename)) 

for i in data_rec: 
    min_dist = min(np.linalg.norm(i - j) for j in data_ligand) 
    f.write("{}\r\n".format(min_dist)) # easier than `str(min_dist)` to customize format