Занятие 3.
Краткое содержание: Первая полноценная программа своими руками.
Содержание
План рассказа
Краткое содержание предыдущих лекций.
Репозиторий: три основные команды. (darcs init, darcs add <file>, darcs record)
- bool
- функции
- if
- for, range, break, continue
- самодокументация
- doctest: как писать тесты, как их проверять
- Полезности для задания:
как читать данные из сети: import urllib2; fd = urllib2.urlopen("http://kodomo.fbb.msu.ru/wiki/Courses/Python/Lesson03?action=raw");
стандартные потоки import sys; sys.stdin; sys.stdout
библиотека для векторов: from Scientific.Geometry import Vector
Эта библиотека не входит в стандартный дистрибутив языка. Её можно добыть тут: http://dirac.cnrs-orleans.fr/ScientificPython/
как выкинуть из списка все None: filter(None, [1,None,2]) (NB, это специальная форма этой функции только для выбрасывания None; в общем случае она работает совсем не так, как вы ожидаете).
chmod +x
каркас хорошего модуля:
1 #!/usr/bin/python 2 """ Hello world example 3 4 >>> print 1 + 1 5 2 6 """ 7 8 def hello(): 9 """ Print hello 10 11 >>> hello() 12 Hello, world! 13 """ 14 print "Hello, world!" 15 16 # All method & class definitions are before this line 17 if __name__ == "__main__": 18 import optparse 19 parser = optparse.OptionParser() 20 parser.add_option("-f", "--file", help="Save to file") 21 parser.add_option("-t", "--test", action="store_true", help="Run self-tests") 22 options, args = parser.parse_args() 23 24 if options.test: 25 import doctest 26 doctest.testmod() 27 else: 28 hello()
Обязательно научиться
- Аккуратной работе с репозиторием
- Логическим выражениям
- if
- for, break, continue
- def, return
- Самодокументации
- Писать готовые программы на python
- В простейшем случае пользоваться:
- optparse
- doctest
- urllib2
Задание, общая постановка
Оно звучит гораздо страшнее, чем делается
Создать darcs-репозиторий в директории ~/Python (в windows: H:\Python); создать скрипт bend.py под управлением репозитория, который находит точки излома полипептидной цепи и выводит их в виде скрипта pyMol; скрипт должен понимать параметры:
-p --pdb – код PDB файла (файл нужно скачать из сети с адреса http://www.rcsb.org/pdb/files/%s.pdb); флаг несовместим с -f
-f --pdb-file – имя файла, из которого нужно загрузить PDB; флаг несовместим с -p
-o --pymol – имя 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-файлов (если не лень, можете почитать официальное описание формата):
- файл состоит из записей
- каждая запись расположена на отдельной строке
- каждая запись имеет ширину не более 80 символов (что для нас не существенно)
- первые шесть символов записи определяют её тип
- ...
нас интересуют только записи типа ATOM и HETATM, эти записи состоят из полей ([позиции в строке1] описание):
- [1-6] тип записи - ATOM или HETATM
- [7-11] номер атома (int)
- [13-16] имя атома
- [17] индикатор альтернативного положения атома
- [18-20] название остатка
[22] идентификатор цепочки – chain_id
[23-26] номер остатка (int) – res_num
[27] insertion code2
- [31-38] координата по оси X (float), в ангстремах
- [39-46] координата по оси Y (float), в ангстремах
- [47-54] координата по оси Z (float), в ангстремах
- [55-60] коэффициент заполнения
- [61-66] температурный фактор
- [77-78] элемент
- [79-80] заряд атома
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
Задание по частям
Для выполнения задания я рекоммендую открыть три окна:
IDLE – интерфейс к интерпретатору, (в windows: меню Python (GUI))
в нём же – открыть новое окно для создания и редактирования файла
консоль на kodomo (PuTTY) – для работы с репозиторием и тестирования
Каждая часть задания принимается только если она сохранена в репозиторий. Осмысленность комментариев к записи в репозиторий оценивается. Равно как и осмысленность и наличие строк самодокументации.
Создайте darcs-репозиторий ~/Python. Внесите в него файл bend.py, который ничего не делает, но не вызывает у интерпретатора ругани. Все последующие задания нужно выполнять в этом файле.
Напишите каркас скрипта. Если скрипт запущен с флагом -t или --test, он должен запускать doctest.testmod. Напишите самодокументацию модуля с одним примером для тестирования.
- Подсказка: Скрипт до сих пор ничего не должен уметь делать. Придумайте, что можно тестировать
- Подсказка: чтобы doctest мог пользоваться флагом -v, его можно прописать в optparse, но не использовать
Напишите функцию, которая получает строку (запись из PDB-файла) и возвращает пару из номера остатка и идентификатора цепочки и координаты атома (id, x,y,z) (где id = (res_num, chain_id)), если строка является описанием C-aplha атома. В противном случае функция должна возвращать None. Напишите самодокументацию к функции. Напишите несколько примеров для doctest.
Полезный кусок кода с незнакомой конструкцией:
- Подсказка: возьмите настоящий PDB-файл и выберите из него для примера doctest 3-4 последовательных C-alpha атома; таким образом вы не только дадите примеры для этой функции, но и посчитаете входные данные для примеров к следующей
Напишите функцию, которая получает список четвёрок (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')]
Напишите функцию, которая получает список пар (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.
- Подсказка: тут уж примеры проще всего выдумать, сильно попортив выходные данные предыдущих функций, или даже вовсе из головы взять.
Полезный кусок кода:
- Напишите функцию, которая получает список id и файлообразный объект (f) и пишет в f команды pyMol для выделения списка остатков. (Желательно кроме остатка выделять и его соседей). Напишите самодокументацию к функции. Напишите несколько примеров для doctest.
Подсказка: файлообразный объект – это такая штука, в которой есть методы read и write (которые ведут себя как для файлов)
Подсказка для doctest: запись в sys.stdout – синоним конструкции print; вы должны уметь писать doctest для выражений вида print 2*2
Полезный кусок кода:
Напишите функцию, которая получает два файлообразных объекта (i и o), читает из первого объекта PDB-файл, пишет во второй объект команды pyMol для выделения точек излома цепочки. Напишите самодокументацию к функции. (doctest делать не надо, потому, что для такой функции это будут слишком объёмные и ничего не объясняющие примеры).
- Добавьте в список разбираемых флагов командной строки те, которые требуются в общей формулировке задания. Напишите фукнцию, которая возвращает два файлообразных объекта (i, o) в зависимости от флагов. Напишите к ней самодокументацию.
Подсказка: если у вас есть строка parser.add_option("-p", "--pdb-file", help="PDB file to load"), то в переменной options (если вы не меняли болванку скрипта) у вас появится поле options.pdb_file. Если параметр "-p" не был указан, в этом поле будет лежать значение None.
Полезный кусок кода:
- До полностью работающей программы вам не хватает двух строчек. Напишите их. Проверьте на глаз работоспособность программы. Напишите самодокументацию к модулю.
Наберите в командной строке Linux pydoc bend
Наберите ./bend --help.