Учебная страница курса биоинформатики,
год поступления 2013
Практикум 8. Задания
Результатом этого задания является два скрипта на языке Python, в которых реализован перечисленный в заданиях 1 и 2 функционал. Скрипты должны быть положены в папку зачетных заданий до 23:59 дня накануне следующего занятия.
Внимание! Как и раньше, имя скрипта должны быть в том же формате, что и названия протоколов. Поскольку от Вас требуется два файла, в конце имени (до расширения!) после знака подчеркивания проставляйте номер (scrNN, где scr - сокращение от английского слова script, а NN - двухзначный порядковый номер скрипта). Например, Dibrova_pr8_scr01.py и Dibrova_pr8_scr02.py.
Не забывайте смотреть подсказки по python, обновленные и содержащие справочную информацию по новым темам этого занятия. И не стесняйтесь спрашивать преподавателей, если что-то не получается!
Обязательные задания
Задание 1. Создайте скрипт, принимающий аргументы командной строки и создающий новый текстовый файл
Этот скрипт должен называться <Familiya>_pr8_scr01.py, где <Familiya> – Ваша фамилия в том же написании, что и раньше.
Цель: Написать скрипт, который будет принимать 2 параметра из командной строки, запрашивать у запустившего его любую строчку и создавать текстовый файл в соответствии с требованиями. Требования:
Первый параметр из командной строки – имя файла, который нужно создать и в который нужно записать результат.
Второй параметр – количество раз; столько раз нужно записать в файл введенную пользователем строчку.
Скрипт должен проверять, что пользователь ввел ровно 2 параметра из командной строки (как получать параметры из командной строки написано в разделе 4.7 подсказок по Python). Если количество аргументов не равно двум, то скрипт должен выдать пользователю на экран пояснение, сколько и каких параметров ему требуется, а потом завершить работу (см. раздел 4.8 подсказок по Python)
- Если пользователь ввел 2 параметра через командную строку, скрипт должен:
Запросить у пользователя ввести с клавиатуры строку и сохранить ее в переменной (см. раздел 4.2 подсказок по Python)
Открыть для записи файл с именем, которое пользователь задал в первом аргументе (см. раздел 4.9 подсказок по Python)
- Напечатать в этот файл поданную пользователем строку столько раз, сколько пользователь задал во втором аргументе
- Закрыть файл.
Задание 2. Напишите скрипт, читающий файл полного генома прокариотического организма в формате GenBank, создающий в памяти список генов и сохраняющий в файле таблицу с информацией об их координатах в геноме и длинах
Этот скрипт должен называться <Familiya>_pr8_scr02.py, где <Familiya> – Ваша фамилия в том же написании, что и раньше.
Этап 1: Скрипт находит строчки "gene" и сохраняет в выходном файле координаты, указанные в этих строчках (и пока ничего больше)
Замечание. Если в Вашем файле с геномом нет строчек gene (такое бывает), то берите строчки CDS - они есть всегда.
Скопируйте скрипт <Familiya>_pr8_scr01.py и поправьте его, чтобы получать имя файл из командной строки
- Откройте входной файл на чтение, а выходной - на запись
- Читайте файл построчно
Пропускайте все неподходящие строки. В нужных строках, если их разбить на части методом .split(None,1), первый элемент списка должно быть "gene"
- Второй элемент списка запишите в выходной файл
- Все
Отладьте скрипт и проверьте, что он работает правильно. Следите за тем, чтобы строчки в выходном файле шли подряд, а не через одну!
Этап 2: Модифицируйте скрипт так, чтобы в выходном файле каждая строчка содержала три числа: начало гена в геноме, знак табуляции (\t), конец, знак табуляции, ориентация (1 или -1)
- Надо разобрать второй элемент списка в двух вариантах (числа будут другие):
complement(1134693..1135391)
1136557..1138245
- Проверьте, что в вашем файле именно так задаются координаты!
- Третий вариант - с join(...) - пока пропускайте
- При разборе можно разбить строку методом .split("..") и/или .split( "(" )
- Пригодятся, возможно, следующие методы строки:
- .replace("("," ") - замена одного символа на другой
- .split(...) - многоточие заменить на подходящие аргументы
- .strip(...)
- .isdigit() - этот метод возвращает значение True, если строка (аргумент) является целым числом (содержит только цифры), иначе - False. Примеры:
>>> "123".isdigit() True >>> ")123".isdigit() False >>> " 123".isdigit() False >>>
Необязательные задания (на дополнительные баллы)
Задание 3*. Продолжение модификации скрипта из задания 2
Этап 3: Опишите в скрипте <Familiya>_pr8_scr02.py класс ProteinCodingGene
Метод __init__ требует аргументы: начало, конец, ориентация. Из аргументов он создает соответствующие атрибуты (сведения об объекте при его создании)
Метод .get_data() возвращает строку, содержащую строку таблицы, которую вы делали для этапа 2, соответствующую этому гену
Этап 4: Модифицируйте скрипт <Familiya>_pr8_scr02.py так, чтобы он сохранял в список объектов типа ProteinCodingGene информацию о начале, конце, ориентации генов
Задайте пустой список gene_list до цикла, проходящего по строчкам файла.
В том месте, где вы сохраняли отдельно начало, конец и ориентацию, создавайте новый объект класса ProteinCodingGene. Подайте эти переменные в качестве атрибутов при создании объекта.
- Добавьте этот объект в список.
- Когда файл будет прочитан, закройте его.
Пройдите по сохраненному списку генов и проверьте, что он сохранен правильно: для этого вызывайте у каждого объекта метод .get_data() и печатайте получившуюся строчку в файл. Табличка должна выглядеть точно так же, как и на этапе 2.
Задание 4*. Рассмотрение генов в геноме Вашего организма с необычными координатами начал и концов
Чтобы выполнить это задание, нужно модифицировать свой скрипт из задания 2 еще раз. Вместо пропуска всех "подозрительных" генов (т.е. содержащих несколько фрагментов кодирующей последовательности, объединяемых словом join, или неточные координаты кодирующей последовательности) нужно иметь возможность все-таки сохранять информацию о них.
Чтобы минимизировать исправление и легко иметь возможность "откатиться" к работающей версии, сделайте следующее. Если Вы еще не сделали этого, перенесите код, который отвечает за разбор строки, содержащей координаты гена, в отдельную функцию. Напишите новую функцию, которая бы разбирала строку по другому алгоритму.
Координаты содержат join:
Пусть координатой начала гена, координаты которого заданы с помощью команды join, скрипт считает координату начала первого фрагмента, а координатой конца такого гена - координату конца последнего.
Чтобы как-то для себя пометить такие гены, сделайте так, что их направление (direction) будет не 1 или -1, а 11 или -11.
Координаты содержат содержат символы < и >
Если координаты заданы "неточно", т.е. содержат символы < и > слева или справа от цифр, просто игнорируйте эти символы.
Чтобы как-то для себя пометить такие гены, сделайте так, что их направление (direction) будет не 1 или -1, а 111 или -111.
- Сделайте так, чтобы скрипт записывал в еще один дополнительный файл строки такой же таблицы, как для задания 2, но содержащие все "странные" гены.