2015-11-17 3 views
1

Я хочу знать вектор положения некоторых атомов в пимоле. Я могу рассчитать расстояния, но вместо этого мне нужен вектор положения. Как я могу получить атомную координату относительно некоторой системы координат?Как определить систему координат в pymol?

Предположим, что существует два атома. Как получить координаты (x, y, z) этих двух атомов? Для расчета этих координат по отношению к нему должен быть опорный кадр. Какова эта система отсчета в пимоле?

+0

Какой формат файла? Поскольку файл 'pdb' в основном состоит из координат, либо вы используете другой тип файла, либо я не понимаю ваш вопрос. –

+0

Я совершенно новичок в pymol. Формат файла - 'pdb'. Как я могу получить эти координаты? Где происхождение? – MOON

+0

Я не много сделал с pymol за его использование несколько раз, чтобы генерировать классные фотографии, но я проработал для курса прошлой весной, чтобы генерировать карты контакта с белками из файлов pdb и нашел довольно легким написать функцию Python для извлечения данные, которые мне нужны из файлов. См. Это для описания: https://en.wikipedia.org/wiki/Protein_Data_Bank_(file_format). С другой стороны, я был бы удивлен, если бы у pymol не было встроенных инструментов синтаксического анализа, поэтому я бы немного исследовал эту помощь, прежде чем разбирать ее самостоятельно. –

ответ

1

Вот простая функция Python для извлечения данных из файла pdb. Он возвращает словарь словарей словарей. Наружный словарь ключа от номера модели и внутренние словари сконструированы по числу атомов в модели, а затем, каждая строка считывается в словарь шпонки полями, представляющего интереса в соответствующем атоме записи:

def parsePDB(fname): 
    f = open(fname) 
    lines = f.read().split('\n') 
    f.close() 

    modelNum = 1 
    multiModel = False 
    d = {1:{}} 
    for line in lines: 
     fields = line.split() 
     record = fields[0] if len(fields)> 0 else '' 
     if record == "MODEL": 
      if multiModel: 
       modelNum += 1 
       d[modelNum] = {} 
      else: 
       multiModel = True 
     elif record == "ATOM": 
      num = int(fields[1]) 
      atomDict = {} 
      atomDict["atom"] = fields[2] 
      atomDict["amino"] = fields[3] 
      atomDict["chain"] = fields[4] 
      atomDict["residue"] = int(fields[5]) 
      atomDict["xyz"] = (float(fields[6]),float(fields[7]),float(fields[8])) 
      d[modelNum][num] = atomDict 
    return d 

Некоторые тестирования кода:

d = parsePDB("2HIU.pdb") 
atom = d[3][358] 
print("atom",358,"of model",3,"is the",atom["atom"], "atom of a", atom["amino"],"amino acid") 
print("It is located on residue", atom["residue"], "of chain",atom["chain"]) 
print("Its coordinates are", atom["xyz"]) 

Выход:

atom 358 of model 3 is the OD1 atom of a ASN amino acid 
It is located on residue 3 of chain B 
Its coordinates are (13.093, 5.012, -5.549) 

Это из файла 2HIU.pdb. Строка из файла, используемого в тестовом коде выглядит следующим образом:

ATOM 358 OD1 ASN B 3  6.882 2.397 -4.401 1.00 0.00   O 

Вот что соответствующий внутренний словарь выглядит следующим образом:

>>> d[3][358] 
{'atom': 'OD1', 'chain': 'B', 'amino': 'ASN', 'residue': 3, 'xyz': (13.093, 5.012, -5.549)} 

Есть два осложнения, чтобы иметь в виду:

1) Не все эти файлы имеют несколько моделей. Фактически, большинство из них не имеют и не имеют линий, которые начинаются MODEL. Если len(d) равно 1, то в файле есть только одна модель.

2) Регистры HETATM соответствуют атомам, которые не являются частью белка как таковой, но каким-то образом связаны с ним. Я полностью их игнорировал. Ваши цели могут потребовать использования вами - в этом случае вам нужно будет настроить код.

Смежные вопросы