Kodomo

Пользователь

Занятие 3.

Краткое содержание: Первая полноценная программа своими руками.


План рассказа

Краткое содержание предыдущих лекций.

Обязательно научиться

Задание, общая постановка

Оно звучит гораздо страшнее, чем делается

Создать darcs-репозиторий в директории ~/Python (в windows: H:\Python); создать скрипт bend.py под управлением репозитория, который находит точки излома полипептидной цепи и выводит их в виде скрипта pyMol; скрипт должен понимать параметры:

Если не указан входной файл, программа должна ожидать содержимое PDB-файла на стандартном потоке входа (sys.stdin). Если не указан выходной файл, программа должна выдать pyMol-скрипт на стандартный вывод (sys.stdout).

Все диалоги с пользователем программа должна вести по-английски (до тех пор, пока мы не изучили, как работать с русским языком)

Излом полипептидной цепи – изменение направления более, чем на 70 градусов.

  i-2    i-1     i     i+1    i+2
-N-C-C--N-C-C--N-C-C--N-C-C--N-C-C-
 H   O  H   O  H   O  H   O  H   O
   !------------->!------------>

Формат PDB-файлов (если не лень, можете почитать официальное описание формата):

C-alpha - атомы обозначаются именем атома CA в PDB-файле.

Пример выдачи программы:

# fetch 1nkz
# hide every
# show ribbon, all
select bend, resi 2 & chain a
select bend, bend | ( resi 3 & chain a )
# color red, bend

Задание по частям

Для выполнения задания я рекоммендую открыть три окна:

Каждая часть задания принимается только если она сохранена в репозиторий. Осмысленность комментариев к записи в репозиторий оценивается. Равно как и осмысленность и наличие строк самодокументации.

  1. Создайте darcs-репозиторий ~/Python. Внесите в него файл bend.py, который ничего не делает, но не вызывает у интерпретатора ругани. Все последующие задания нужно выполнять в этом файле.

  2. Напишите каркас скрипта. Если скрипт запущен с флагом -t или --test, он должен запускать doctest.testmod. Напишите самодокументацию модуля с одним примером для тестирования.

    • Подсказка: Скрипт до сих пор ничего не должен уметь делать. Придумайте, что можно тестировать
    • Подсказка: чтобы doctest мог пользоваться флагом -v, его можно прописать в optparse, но не использовать
  3. Напишите функцию, которая получает строку (запись из PDB-файла) и возвращает пару из номера остатка и идентификатора цепочки и координаты атома (id, x,y,z) (где id = (res_num, chain_id)), если строка является описанием C-aplha атома. В противном случае функция должна возвращать None. Напишите самодокументацию к функции. Напишите несколько примеров для doctest.

    • Полезный кусок кода с незнакомой конструкцией:

         1 >>> x = "ATOM  "
         2 >>> y = x.strip().lower()
         3 >>> y
         4 'atom'
         5 >>> y in ["atom", "hetatm"] # проверить принадлежность списку
         6 True
      
    • Подсказка: возьмите настоящий PDB-файл и выберите из него для примера doctest 3-4 последовательных C-alpha атома; таким образом вы не только дадите примеры для этой функции, но и посчитаете входные данные для примеров к следующей
  4. Напишите функцию, которая получает список четвёрок (id, x,y,z) и возвращает список пар (id, vect), где vect – вектор от выбранного C-alpha атома до послеследующего, id – идентификация начального атома вектора. Напишите самодокументацию к функции. Напишите несколько примеров для doctest.

    • Полезный кусок кода с незнакомой конструкцией:

         1 >>> items = [((2, 'a'), 30.63, 14.23, 41.060)] # так может выглядеть часть входных данных для теста
         2 >>> id, x, y, z = items[0] # это называется распаковка; синоним: id = items[0][0]; x = items[0][1]; y = items[0][2]; z = items[0][3]
         3 >>> x # ну, это же почти-почти совсем то же, что и 30.63... С float всегда так, что они выглядят страшнее, чем они есть.
         4 30.629999999999999
         5 >>> # А вот это вы могли бы подсмотреть в документации:
         6 ... result = []
         7 >>> result.append((2, 'a'))
         8 >>> result
         9 [(2, 'a')]
      
  5. Напишите функцию, которая получает список пар (id, vect) и возвращает список id C-aplha атомов точек излома. Напишите самодокументацию к функции. Напишите несколько примеров для doctest

    • Подсказка: входные вектора построены между C-alpha атомами так: вектор i – между атомами i*2, i*2+2, вектор i+1 – между атомами i*2+1,i*2+3, вектор i+2 – между атомами i*2+2,i*2+4.

    • Подсказка: тут уж примеры проще всего выдумать, сильно попортив выходные данные предыдущих функций, или даже вовсе из головы взять.
    • Полезный кусок кода:

         1 >>> import math
         2 >>> math.radians(70) # 70 градусов = ? радиан
         3 1.2217304763960306
         4 >>> math.degrees(1.22) # 1.22 радиан = ? градусов
         5 69.900851005960433
         6 >>> x = Vector(1,0,0)
         7 >>> y = Vector(0,1,0)
         8 >>> x.angle(y)
         9 1.5707963267948966
        10 >>> math.degrees(x.angle(y))
        11 90.0
      
  6. Напишите функцию, которая получает список id и файлообразный объект (f) и пишет в f команды pyMol для выделения списка остатков. (Желательно кроме остатка выделять и его соседей). Напишите самодокументацию к функции. Напишите несколько примеров для doctest.
    • Подсказка: файлообразный объект – это такая штука, в которой есть методы read и write (которые ведут себя как для файлов)

    • Подсказка для doctest: запись в sys.stdout – синоним конструкции print; вы должны уметь писать doctest для выражений вида print 2*2

    • Полезный кусок кода:

         1 >>> import sys
         2 >>> f = sys.stdout
         3 >>> f.write("select bend, resi %s & chain %s\n" % (2, 'a'))
         4 select bend, resi 2 & chain a
      
  7. Напишите функцию, которая получает два файлообразных объекта (i и o), читает из первого объекта PDB-файл, пишет во второй объект команды pyMol для выделения точек излома цепочки. Напишите самодокументацию к функции. (doctest делать не надо, потому, что для такой функции это будут слишком объёмные и ничего не объясняющие примеры).

  8. Добавьте в список разбираемых флагов командной строки те, которые требуются в общей формулировке задания. Напишите фукнцию, которая возвращает два файлообразных объекта (i, o) в зависимости от флагов. Напишите к ней самодокументацию.
    • Подсказка: если у вас есть строка parser.add_option("-p", "--pdb-file", help="PDB file to load"), то в переменной options (если вы не меняли болванку скрипта) у вас появится поле options.pdb_file. Если параметр "-p" не был указан, в этом поле будет лежать значение None.

    • Полезный кусок кода:

         1 >>> x = None
         2 >>> if x: print "X!"
         3 ...
         4 >>> x = "1nkz"
         5 >>> if x: print "X!"
         6 ...
         7 X!
      
  9. До полностью работающей программы вам не хватает двух строчек. Напишите их. Проверьте на глаз работоспособность программы. Напишите самодокументацию к модулю.
    • Наберите в командной строке Linux pydoc bend

    • Наберите ./bend --help.

Рейтинговые задачи

Рейтинговые задачи принимаются только, если они внесены в репозиторий и называются ratingN.py

*/

  1. Чтобы все запутались, нумерация здесь такая же как в официальной спецификации формата, а не такая, как в питоне (1)

  2. Трудности перевода... Хорошо, что нас это поле не интересует (2)