파이썬으로 이거 가능한지 여쭤보고 싶습니다.

riodiv의 이미지

안녕하세요. 생물정보학을 전공하고 있습니다. (아마 생물쪽 분들은 안계시니깐 그냥 파일 작업만 여쭤볼려고 합니다)

파일 첨부했는데요. 보시다시피 파일자체는 저렇게 질서 정렬하게 되어 있습니다.

파이썬으로 저 작업 가능한지 알고 싶습니다. (다른언어가 아닌 파이썬으로 해야합니다 ㅠ)

file=open

이거해서 파일 연다음에.. 그담에 어떻게 해야할지 모르겠네요 ㅠㅠ

File attachments: 
김정균의 이미지

당연히 가능은 합니다만 질문을 하신 것으로 보아, 두가지 문제가 있네요.

1. 기본적으로 python으로 할 수 있느냐 보다, logic 을 어떻게 만들어야 할지 자체를 모르시는 것 같고요.
2. raw data에서 ATOM과 HETATM 간의 연계를 어떻게 할 것인가 (즉 두 데이터간의 연결 정보가 애매모호 하다는 점)

이 두가지에 따라 가능하냐 못하냐의 문제인 듯 싶습니다.

일단, python으로 할 수 있느냐 없느냐만 말하자면, raw data의 문제가 없다면 당연히 가능 합니다.

기본적으로는 파일을 열고, 한 라인씩 읽어 들여 split을 이용하여 각 filed를 배열로 만든 다음, ATOM과 HETATM을 각각의 배열로 저장을 합니다.

ATOM, HETATM 배열이 다 만들어 지면 배열에 있는 정보로 연산을 하시면 되는데, 문제는 ATOM과 HETATM을 연산할 키가 없어 보이기는 합니다. 순서대로 하면 된다면, 배열 순서를 키로 잡아서 연산을 하면 되는데, 그것 까지는 알 수가 없네요.

단순 로직을 짜 보자면

file open
loop util file end
   -> read per 1 line
   -> split field (split_result)
   -> if (split_result[0] == ATOM) atom[no] = split_result
      else hetatm[no] = split_result
loop end
 
loop 0 to until array_number-1
   -> calculation
      atom[no] - hetatm[no] ~~ (루트 연산은 sqrt method를 사용하시면 될 것 같고..)

이런 식으로 만드시면 됩니다. 위의 경우는 atom과 hetatm의 공통 키가 없어서, 라인 순서대로라고 가정을 한 로직 입니다.

riodiv의 이미지

로직을 설명 안드린 이유는, 저게 생물, 화학 분야라서 그렇습니다.
원래 베이스가 컴퓨터 전공한분들이 설명해주면 더 이해하기 힘드실까봐...
Atom 은 단백질을 구성하는 원자이고, Hetatom (헤테로 원자)는 물분자를 구성하는 원자입니다.
그래서 단백질을 구성하는 모든 원자와 물분자들의 모든 거리를 구하고자 하는것이 목적이었습니다.
거리가 너무 먼 것(2.5 이상)은 필요없어서 제외시키는 것입니다.

김정균의 이미지

그 logic을 말한 것이 아니라 프로그밍을 어떻게 할 것인지에 대한 logic을 말씀 드린 것입니다. 다른 언어로 님의 문제를 해결할 수 있다면 제가 상황을 잘못 판단한 것이고요.

그리고, "거리가 너무 먼 것(2.5 이상)은 필요없어서 제외시키는 것"라는 규칙이 raw data에서 구현이 가능 하다면 프로그래밍적으로 가능할 것이고, 이 규칙을 raw data를 이용하여 만들 수 없다면 python이 아니라 어떤 언어로도 구현이 불가능 할 것 같다는 것 입니다.

dormael의 이미지

혹시 SciPy 같은걸 찾고 계신게 아닌가 싶은데요
Scientific Computing Tools for Python

https://www.scipy.org/about.html

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

파이썬3의 이미지

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
# 출처: KLDP[155976]
 
import re
 
"""
ATOM 그룹과 HETATM 그룹 사이의 거리 계산
각 그룹은 16개씩 실측 자료가 있음
 
거리는 아래처럼 표현된다: 
 [m = 거리, jx = HETATM의 X축, ix = ATOM의 X축, ...]
m^2 = (jx - ix)^2 + (jy - iy)^2 + (jz - iz)^2
*** 원질문자 riodiv님께서 m^2 이 6.25 미만이면 유효한 자료로 인정된다고 전제하셨음
*** 하지만 연산을 해서 결과를 출력해보면 m^2 의 값이 모두 6.25 를 넘어감
*** 하여 파이썬 공부 차원에서 본 코드에서는 m^2 기준값을 100배 올렸음: m^2 ===> 625.00
"""
 
data_raw = """\
ATOM   2658  C   ALA A 352     -10.695   1.906  22.342  1.00 24.43           C
ATOM   2659  O   ALA A 352     -11.612   1.825  21.517  1.00 25.80           O
ATOM   2660  CB  ALA A 352      -8.517   2.265  21.194  1.00 21.84           C
ATOM   2661  N   ARG A 353     -10.659   1.176  23.453  1.00 25.59           N
ATOM   2662  CA  ARG A 353     -11.700   0.186  23.733  1.00 26.72           C
ATOM   2663  C   ARG A 353     -13.097   0.754  24.030  1.00 25.22           C
ATOM   2664  O   ARG A 353     -14.080   0.009  24.023  1.00 22.34           O
ATOM   2665  CB  ARG A 353     -11.266  -0.771  24.859  1.00 31.52           C
ATOM   2666  CG  ARG A 353     -11.203  -0.163  26.265  1.00 37.11           C
ATOM   2667  CD  ARG A 353      -9.773   0.093  26.729  1.00 43.28           C
ATOM   2668  NE  ARG A 353      -9.435  -0.666  27.937  1.00 45.56           N
ATOM   2669  CZ  ARG A 353      -8.192  -0.915  28.350  1.00 46.42           C
ATOM   2670  NH1 ARG A 353      -7.150  -0.457  27.665  1.00 44.12           N
ATOM   2671  NH2 ARG A 353      -7.990  -1.643  29.443  1.00 44.24           N
ATOM   2672  N   PHE A 354     -13.184   2.069  24.247  1.00 22.56           N
ATOM   2673  CA  PHE A 354     -14.466   2.718  24.545  1.00 23.67           C
ATOM   2674  C   PHE A 354     -15.110   3.403  23.346  1.00 25.47           C
ATOM   2675  O   PHE A 354     -16.195   3.967  23.473  1.00 25.91           O
HETATM 2765  O   HOH A2002       3.797   2.818  67.660  1.00 32.34           O
HETATM 2766  O   HOH A2003      -8.764  19.343  55.313  1.00 31.79           O
HETATM 2767  O   HOH A2004     -10.875  14.527  21.645  1.00 21.21           O
HETATM 2768  O   HOH A2005     -15.898   1.050  41.687  1.00 36.78           O
HETATM 2769  O   HOH A2006      19.094   7.034  55.677  1.00 43.56           O
HETATM 2770  O   HOH A2007     -18.839  -0.028  49.215  1.00 35.06           O
HETATM 2771  O   HOH A2008      26.041   2.672  59.611  1.00 42.94           O
HETATM 2772  O   HOH A2009      -9.124  -7.668  40.183  1.00 32.04           O
HETATM 2773  O   HOH A2010       2.582  -1.025  68.800  1.00 42.47           O
HETATM 2774  O   HOH A2011      -9.420  12.595  39.358  1.00 24.84           O
HETATM 2775  O   HOH A2012      -9.288   9.851  39.462  1.00 20.64           O
HETATM 2776  O   HOH A2013       0.565  -1.934  53.111  1.00 13.91           O 
HETATM 2777  O   HOH A2014      -2.202  16.653  58.580  1.00 19.07           O  
HETATM 2778  O   HOH A2015      10.778   4.383  53.370  1.00 21.78           O 
HETATM 2779  O   HOH A2016      -2.236  -5.623  49.893  1.00 14.84           O  
HETATM 2780  O   HOH A2017     -10.736   1.061  38.774  1.00 10.51           O
"""
 
data = (data_raw.split("\n"))[2:-1] # 첫 두행은 제외시킴
 
atom = []
hetatm = []
for v in data:
    if v.startswith("ATOM"):
        atom.append(v.replace("ATOM   ", "ATOM"))
    elif v.startswith("HETATM"):
        hetatm.append(v.replace("HETATM ", "HETATM"))
 
atom_x = []
atom_y = []
atom_z = []
for v in atom:
    atom_x.append(v.split()[5])
    atom_y.append(v.split()[6])
    atom_z.append(v.split()[7])
 
hetatm_x = []
hetatm_y = []
hetatm_z = []
for v in hetatm:
    hetatm_x.append(v.split()[4])
    hetatm_y.append(v.split()[5])
    hetatm_z.append(v.split()[6])
 
class mc:
    i0 = [v.split()[0] for v in atom] # ATOM 색인
    j0 = [v.split()[0] for v in hetatm] # HETATM 색인
    ix = atom_x # ATOM X축
    iy = atom_y # ATOM Y축
    iz = atom_z # ATOM Z축
    jx = hetatm_x # HETATM X축
    jy = hetatm_y # HETATM Y축
    jz = hetatm_z # HETATM Z축
    mv = float(625.00) # m^2 유효값 판단 기준
 
def get_index(xyz):
    exp = re.compile("i(.+)j(.+)$")
    chop1 = exp.search(xyz).group(1)
    chop2 = exp.search(xyz).group(2)
    index_i = int(chop1)
    index_j = int(chop2)
 
    return mc.i0[index_i], mc.j0[index_j]
 
def compute(ix, jx, iy, jy, iz, jz):
    result_x = []
    for k in ix:
        for v in jx:
            result_x.append("i{0}j{1} {2}".format(ix.index(k), jx.index(v), (float(v) - float(k)) ** 2))
 
    result_y = []
    for k in iy:
        for v in jy:
            result_y.append("i{0}]j{1} {2}".format(iy.index(k), jy.index(v), (float(v) - float(k)) ** 2))
 
    result_z = []
    for k in iz:
        for v in jz:
            result_z.append("i{0}j{1} {2}".format(iz.index(k), jz.index(v), (float(v) - float(k)) ** 2))
 
    result_xyz = []
    for v1, v2, v3 in zip(result_x, result_y, result_z):
        index = v1.split()[0]
        hap = round(float(v1.split()[1]) + float(v2.split()[1]) + float(v3.split()[1]), 3) 
        result_xyz.append("{0} \t {1}".format(index, hap))
 
    return result_xyz
 
result_final = compute(mc.ix, mc.jx, mc.iy, mc.jy, mc.iz, mc.jz)
 
for k in result_final:
    if float(k.split()[1]) < mc.mv: # 625.00 미만인 항목만 유효함
        print("{0} {1}".format(get_index(k.split()[0]), k.split()[1]))
    else:
        print("sorry...") # 625.00 이상이면 버림
 
# 편집: Emacs 26.2 (Ubuntu 18.04)
# 마지막 갱신: 2019년 7월 6일
 
"""
출력 결과:
 
sorry...
sorry...
('ATOM2660', 'HETATM2767') 156.12
('ATOM2660', 'HETATM2768') 475.918
sorry...
sorry...
sorry...
('ATOM2660', 'HETATM2772') 459.615
sorry...
('ATOM2660', 'HETATM2774') 437.455
('ATOM2660', 'HETATM2775') 391.862
sorry...
sorry...
sorry...
sorry...
('ATOM2660', 'HETATM2780') 315.43
sorry...
sorry...
('ATOM2661', 'HETATM2767') 181.565
('ATOM2661', 'HETATM2768') 359.942
sorry...
sorry...
sorry...
('ATOM2661', 'HETATM2772') 360.465
sorry...
('ATOM2661', 'HETATM2774') 384.898
('ATOM2661', 'HETATM2775') 333.423
sorry...
sorry...
sorry...
sorry...
('ATOM2661', 'HETATM2780') 234.752
sorry...
sorry...
('ATOM2662', 'HETATM2767') 210.705
('ATOM2662', 'HETATM2768') 340.716
sorry...
sorry...
sorry...
('ATOM2662', 'HETATM2772') 338.924
sorry...
('ATOM2662', 'HETATM2774') 403.322
('ATOM2662', 'HETATM2775') 346.631
sorry...
sorry...
sorry...
sorry...
('ATOM2662', 'HETATM2780') 227.927
sorry...
sorry...
('ATOM2663', 'HETATM2767') 200.321
('ATOM2663', 'HETATM2768') 319.703
sorry...
sorry...
sorry...
('ATOM2663', 'HETATM2772') 347.634
sorry...
('ATOM2663', 'HETATM2774') 388.677
('ATOM2663', 'HETATM2775') 335.411
sorry...
sorry...
sorry...
sorry...
('ATOM2663', 'HETATM2780') 223.054
sorry...
sorry...
('ATOM2664', 'HETATM2767') 226.699
('ATOM2664', 'HETATM2768') 316.406
sorry...
sorry...
sorry...
('ATOM2664', 'HETATM2772') 344.644
sorry...
('ATOM2664', 'HETATM2774') 415.285
('ATOM2664', 'HETATM2775') 358.191
sorry...
sorry...
sorry...
sorry...
('ATOM2664', 'HETATM2780') 229.881
sorry...
sorry...
('ATOM2665', 'HETATM2767') 244.511
('ATOM2665', 'HETATM2768') 307.953
sorry...
sorry...
sorry...
('ATOM2665', 'HETATM2772') 286.982
sorry...
('ATOM2665', 'HETATM2774') 392.279
('ATOM2665', 'HETATM2775') 329.987
sorry...
sorry...
sorry...
sorry...
('ATOM2665', 'HETATM2780') 197.264
sorry...
sorry...
('ATOM2666', 'HETATM2767') 237.248
('ATOM2666', 'HETATM2768') 261.352
sorry...
('ATOM2666', 'HETATM2770') 585.029
sorry...
('ATOM2666', 'HETATM2772') 254.358
sorry...
('ATOM2666', 'HETATM2774') 337.372
('ATOM2666', 'HETATM2775') 278.108
sorry...
sorry...
sorry...
sorry...
('ATOM2666', 'HETATM2780') 158.191
sorry...
sorry...
('ATOM2667', 'HETATM2767') 235.402
('ATOM2667', 'HETATM2768') 262.173
sorry...
('ATOM2667', 'HETATM2770') 587.827
sorry...
('ATOM2667', 'HETATM2772') 241.664
sorry...
('ATOM2667', 'HETATM2774') 315.916
('ATOM2667', 'HETATM2775') 257.583
sorry...
sorry...
sorry...
sorry...
('ATOM2667', 'HETATM2780') 146.946
sorry...
sorry...
('ATOM2668', 'HETATM2767') 272.49
('ATOM2668', 'HETATM2768') 233.778
sorry...
('ATOM2668', 'HETATM2770') 541.596
sorry...
('ATOM2668', 'HETATM2772') 199.089
sorry...
('ATOM2668', 'HETATM2774') 306.294
('ATOM2668', 'HETATM2775') 243.455
sorry...
sorry...
sorry...
('ATOM2668', 'HETATM2779') 558.463
('ATOM2668', 'HETATM2780') 122.116
sorry...
sorry...
('ATOM2669', 'HETATM2767') 290.611
('ATOM2669', 'HETATM2768') 241.119
sorry...
('ATOM2669', 'HETATM2770') 549.494
sorry...
('ATOM2669', 'HETATM2772') 186.492
sorry...
('ATOM2669', 'HETATM2774') 305.204
('ATOM2669', 'HETATM2775') 240.585
sorry...
sorry...
sorry...
('ATOM2669', 'HETATM2779') 521.74
('ATOM2669', 'HETATM2780') 119.036
sorry...
sorry...
('ATOM2670', 'HETATM2767') 274.636
('ATOM2670', 'HETATM2768') 275.415
sorry...
('ATOM2670', 'HETATM2770') 601.219
sorry...
('ATOM2670', 'HETATM2772') 212.596
sorry...
('ATOM2670', 'HETATM2774') 312.234
('ATOM2670', 'HETATM2775') 249.995
sorry...
sorry...
sorry...
('ATOM2670', 'HETATM2779') 544.919
('ATOM2670', 'HETATM2780') 138.574
sorry...
sorry...
('ATOM2671', 'HETATM2767') 330.601
('ATOM2671', 'HETATM2768') 219.704
sorry...
('ATOM2671', 'HETATM2770') 511.241
sorry...
('ATOM2671', 'HETATM2772') 152.934
sorry...
('ATOM2671', 'HETATM2774') 303.073
('ATOM2671', 'HETATM2775') 234.177
sorry...
sorry...
sorry...
('ATOM2671', 'HETATM2779') 467.151
('ATOM2671', 'HETATM2780') 101.92
sorry...
sorry...
('ATOM2672', 'HETATM2767') 167.304
('ATOM2672', 'HETATM2768') 312.558
sorry...
sorry...
sorry...
('ATOM2672', 'HETATM2772') 365.249
sorry...
('ATOM2672', 'HETATM2774') 353.307
('ATOM2672', 'HETATM2775') 307.235
sorry...
sorry...
sorry...
sorry...
('ATOM2672', 'HETATM2780') 218.042
sorry...
sorry...
('ATOM2673', 'HETATM2767') 160.758
('ATOM2673', 'HETATM2768') 298.681
sorry...
sorry...
sorry...
('ATOM2673', 'HETATM2772') 380.953
sorry...
('ATOM2673', 'HETATM2774') 342.442
('ATOM2673', 'HETATM2775') 300.208
sorry...
sorry...
sorry...
sorry...
('ATOM2673', 'HETATM2780') 219.123
sorry...
sorry...
('ATOM2674', 'HETATM2767') 144.572
('ATOM2674', 'HETATM2768') 342.55
sorry...
sorry...
sorry...
('ATOM2674', 'HETATM2772') 441.884
sorry...
('ATOM2674', 'HETATM2774') 373.253
('ATOM2674', 'HETATM2775') 335.198
sorry...
sorry...
sorry...
sorry...
('ATOM2674', 'HETATM2780') 262.64
sorry...
sorry...
('ATOM2675', 'HETATM2767') 143.158
('ATOM2675', 'HETATM2768') 340.347
sorry...
sorry...
sorry...
('ATOM2675', 'HETATM2772') 464.596
sorry...
('ATOM2675', 'HETATM2774') 372.676
('ATOM2675', 'HETATM2775') 337.976
sorry...
sorry...
sorry...
sorry...
('ATOM2675', 'HETATM2780') 272.366
"""
황병희의 이미지

소스코드 원본: https://gitlab.com/soyeomul/test/raw/master/155976.py

해당 색인과 결과값이 일치하는지 출력된 결과행에서 2개를 찝어서,
실제 계산기로 두들겨서 검산을 해봤씁니다^^^

인덱스를 추출하는 산법(알고리즘)이 좀 무식했는데...
좀 더 세련된 방법을 배우고 싶습니다.
꾸벅,,,

황병희 드림

[ibus-hangul(서라운딩 패치판)에서 작성했씁니다]

--
ㄱㅅㅎㄴㄷ!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.