#pragma css /css/2013.css
<<BI>>

= Практикум 7. Задания =

''Результатом этого задания является два скрипта на языке Python, в которых реализован перечисленный в заданиях 1 и 2 функционал, и файл с последовательностями `<Familiya>_pr7_proteins.fasta`, где `<Familiya>`, как обычно, Ваша фамилия. Скрипты и fasta-файл должны быть положены в папку зачетных заданий '''до 23:59''' дня накануне следующего занятия''.<<BR>>

'''Внимание!''' Как и раньше, имя скрипта должны быть в том же формате, что и названия протоколов. Поскольку от Вас требуется два файла, в конце имени (до расширения!) после знака подчеркивания проставляйте номер (scrNN, где scr - сокращение от английского слова script, а NN - двухзначный порядковый номер скрипта). Например, Dibrova_pr7_scr01.py и Dibrova_pr7_scr02.py.

''Не забывайте смотреть [[../python_hints_DD|подсказки по python]], в которые добавлены пояснения по тем разделам, которые введены на этом занятии. В презентации тоже есть много примеров. И не стесняйтесь спрашивать преподавателей, если что-то не получается!''

{{{#!wiki warning
Акция "'''Ошибайтесь и получайте бонусные баллы!'''" продолжается! Как? Посмотрите необязательное задание №4 уже сейчас! :) 
Также бонусные баллы начисляются за правильное название функций и переменных; за комментарии в теле скрипта и за комментирование функций.
}}}

= Обязательные задания =

== Задание 1. Создайте скрипт, задающий класс, который описывает какой-нибудь объект в мире ==
Этот скрипт должен называться `<Familiya>_pr7_scr01.py`, где `<Familiya>` – Ваша фамилия в том же написании, что и раньше.

'''Цель:''' выберите любой предмет реального (или фантастического) мира и создайте класс, который будет описывать такие предметы (частично описывать, конечно) в скрипте. Требования:

 * Имя класса должно быть названием данного предмета на английском языке (не на транслите). Пользуйтесь словарями или спросите у преподавателя, как называется этот предмет по-английски.
 * Если класс описывает предметы из фантастического мира, то обязательно создайте комментарий в скрипте, объясняющий что это за зверь такой :)
 * В классе должно быть минимум 3 переменных-члена (атрибута) и минимум 2 функции-члена (метода).
 * Помимо этих двух функций-членов, в классе должна быть инициализирующая функция.

'''После задания класса убедитесь, что он работает.''' Для этого:
 1. Создайте четыре экземпляра класса с разными атрибутами;
 1. Поместите эти экземпляры в список;
 1. Пройдите по списку и заставьте каждый экземпляр вызывать свои методы; проверьте, что получается.


== Задание 2. Напишите скрипт, читающий файл в формате fasta с несколькими последовательностями и печатающий эти последовательности на экран ==
Этот скрипт должен называться `<Familiya>_pr7_scr02.py`, где `<Familiya>` – Ваша фамилия в том же написании, что и раньше.

'''Цель:''' создайте скрипт, умеющий читать fasta-файл и сохранять в память информацию о последовательностях нескольких белков, содержащихся в прочитанном файле.

=== 2.1. Подготовка fasta-файла с несколькими последовательностями ===

Примечание: если в одном файле сохранены несколько последовательностей, каждая из которых имеет формат fasta, и не содержится никакой другой информации (кроме пустых строк) -- то такой файл тоже считается файлом в формате fasta. Например:

{{{
>protein1 My good protein
MTSKLLVSTFGGTRYH
THGYF

>protein2 The best protein! [user1]
MHGTSDERFRYH
GTRY
FGTRG

>protein3 The very best protein!! [user2]
MAAAAFRTYING
}}} 

Составьте файл, включающий последовательность Вашего белка и последовательности белков трех других студентов, выбранных случайным образом и приведенных в [[../table_b2_pr7|таблице 1]]. В этой таблице в соответствующей Вам строке приведены ники тех студентов, чьи белки Вам необходимо взять. Чтобы это сделать:
 1. Создайте новый файл, назовите его `<Familiya>_pr7_proteins.fasta`, где `<Familiya>` - Ваша фамилия.
 1. Скопируйте в него последовательность Вашего белка в fasta-формате (то есть вместе со строкой ">name Description").
 1. Войдите на сервер kodomo через NetBox, так же, как входили на сервера NCBI (или как входите обычно из дома), указав:
   * `File protocol`: '''SCP''',
   * `Host name`: '''kodomo.fbb.msu.ru''',
   * `Login type`: '''Normal''',
   * логин и пароль -- Ваши обычные.
 1. Перейдите в родительскую директорию по отношению к Вашей домашней. Там Вы увидите список ников студентов.
 1. Зайдите в директории `term1/block1/credits/` тех студентов, которые даны Вам в таблице, и cкопируйте последовательности их белков в fasta-формате в файл, созданный в пункте 1. '''Добавьте в конец описания каждой скопированной последовательности через пробел в квадратных скобках ник того студента, у которого она взята.'''
 1. Если нужного файла у кого-то из Ваших коллег нет, то выберите себе любого другого студента.

=== 2.2. Написание скрипта ===
  
При выполнении данного задания приветствуется использование перекомпонованных функций из предыдущего практикума: не зря же Вы их писали! Примерный алгоритм, которым можно решить эту задачу, приведен в [[../hints_b2_pr7|советах]] по этому заданию. Следовать ему, разумеется, не обязательно; можете придумать и свой вариант! Скрипт должен делать следующее:

 1. Задавать новый класс `Protein`, описывающий один белок. В [[../python_hints_DD#A8|справочной информации по классам]] рассказывается с примерами о том, как задать класс, его атрибуты и методы. Этот класс должен содержать:
   * атрибуты, хранящие идентификатор (`id_RefSeq`), описание (`description`) и последовательность (`sequence`) белка;
   * инициализирующий метод (в [[../python_hints_DD#A8.4|этом разделе]] справки по Python находится объяснение того, что это такое и как его задать);
   * метод, позволяющий напечатать на экран информацию о данном белке в формате fasta с заданным числом букв в строке последовательности.
 1. Открывать Ваш файл `<Familiya>_pr7_proteins.fasta`, где `<Familiya>` - Ваша фамилия (конкретное имя задайте в одной из переменных в теле скрипта), и обрабатывать его построчно. Про то, как это сделать, читайте в [[../python_hints_DD#A4.4|этом разделе]] справки по Python.
 1. Сохранять информацию о последовательностях в '''список объектов класса, заданного в начале скрипта'''. Про списки и строки вообще читайте [[../python_hints_DD#A6|тут]], про методы, связанные со строками, -- [[../python_hints_DD#A9.4|тут]], а про методы, связанные со списками, -- [[../python_hints_DD#A9.5|тут]].
 1. Проходить по списку белков и вызывать их методы, печатающие информацию в fasta-формате на экран с любой выбранной Вами длиной строки последовательности.


= Необязательные задания (на дополнительные баллы) =

== Задание 3*. Получение параметров скрипта из командной строки ==

Пользуясь [[../python_hints_DD#A4.7|справочной информацией]], сделайте так, чтобы скрипт получал имя fasta-файла и количество букв, которые нужно выводить на экран, из командной строки.

 * Скрипт должен получать из командной строки два аргумента: первый -- имя файла, который будет читаться, второй -- количество букв в строке при распечатке последовательностей в fasta-формате;
 * Проверять, что получено два аргумента: если их получено меньше или больше, скрипт должен выдать на экран текст, сообщающий пользователю, какие аргументы требуется ввести, и завершить работу. В [[../python_hints_DD#A4.8|разделе подсказок 4.8]] написано, как можно завершить работу своего скрипта с помощью команды.

== Задание 4*. Коллекционер и победитель ошибок (продолжение) ==

Соберите коллекцию ошибок Вашего скрипта, с которыми Вы столкнулись в процессе работы. Предоставьте в папке `credits` второго блока протокол с обычным именем (например, `Dibrova_pr7.doc`), в котором будет приведена следующая информация об ошибках. Протокол оформите в удобном для Вас формате, но чтобы было понятно, что происходит. Про каждый случай укажите:
 1. Ошибка, выданная Python (чтобы получить текст ошибки в текстовый файл, а не просто на экран, воспользуйтесь [[../hints_b2_pr5|подсказками к занятию 5]]).
 1. Место в скрипте, вызвавшее ошибку (та строчка или строчки, из-за которых все пошло наперекосяк).
 1. Объяснение, что именно неверно.
 1. Исправленная, работающая версия.

P.S. Ошибки в протоколах за практикумы 5, 6 и 7 не должны повторяться. Задание называется "Коллекционер и победитель ошибок", а не "Любитель гулять по граблям" :)