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

= Указания к практикуму 9 =

== Как написать программу на Python, берущую данные из командной строки? ==
Если в начале скрипта на Python поместить строку "`from sys import argv`", 
то при запуске программы образуется список с именем argv, куда попадут все аргументы командной строки, включая само название файла со скриптом. Например, вот такая программа:
{{{
from sys import argv
a = int(argv[1])
b = int(argv[2])
print(a + b)
}}}
при запуске напечатает сумму чисел, которые будут приведены после её имени:
{{{
python sum.py 15 28
43
}}}
(если имя файла с программой — "sum.py"). Если же аргументов будет меньше двух или хотя бы один из них не интерпретируется как целое число, будет выдана ошибка (советую попробовать все варианты).

В вашем случае вам нужно будет открыть на чтение файл с именем `argv[1]`, предполагая, что при запуске он будет приведён после имени программы и будет содержать выдачу needle или water.

== Как получить списки идентификаторов Swiss-Prot с заданной мнемоникой организма? ==
Два варианта:
 * На kodomo программой infoseq. Например, чтобы получить в файле `human.txt` список идентификаторов человеческих белков, можно выполнить команду (может занять пару минут):
{{{
infoseq 'sw:*_human' -only -name -nohead -out human.txt
}}}
 * На сайте !UniProt, используя поиск по Organism [OS] (сначала войдите в расширенный -- "Advanced" -- поиск). Начните набирать латинское название организма, в какой-то момент появится список продолжений, щёлкните по нужному. После получения таблицы с результатами поиска нужно оставить только записи Swiss-Prot, ткнув в слово "Reviewed" (слева), затем сохранить таблицу: Download &rarr; Format: Tab-separated или Excel.

== Как определить пары с совпадающими мнемониками функции? ==
Несколько вариантов:
 * Средствами электронных таблиц (поможет разбиение столбца на два по символу подчёркивания и функция VLOOKUP/ВПР)
 * С помощью Python
 * Объединить списки и отсортировать: ID с одинаковым началом окажутся рядом. Чтобы сразу получить список мнемоник, имеющихся в обоих списках, можно воспользоваться стандартными консольными программами GNU/Linux: `cut`, `sort`, `uniq`.
{{{
cut -f 1 -d '_' ecoli.txt human.txt | sort | uniq -d > common_mnems.txt
}}}
Прежде чем использовать, почитайте `man`! Особенно `man uniq`.

== Как определить рекомендуемое полное имя белка? ==
В полной записи Swiss-Prot ищите поле DE. Можно использовать конвейер из entret в grep:
{{{
entret sw:eno_bacsu -filter | grep '^DE'
}}}
Там ищите слова "`RecName: Full=`", название белка --- после знака равенства. 
Например, если вы видите в поле DE строку:<<BR>>
`DE   RecName: Full=GSX1 {ECO:0000303|PubMed:7768864};`<<BR>>
то пишите в качестве названия белка "GSX1".

== Как запустить needle и water с параметрами по умолчанию? ==
В программах EMBOSS опция `-auto` задаёт значения по умолчанию для всех параметров, для которых это возможно.
Имейте в виду, что у выходного файла тоже есть имя по умолчанию, но как раз его лучше задать явно. Например, если ваша пара --- ENO_ECOLI и ENO_BACSU, то можно использовать строку вида
{{{
needle sw:eno_ecoli sw:eno_bacsu eno.needle -auto
}}}
выравнивание появится в файле с именем `eno.needle`.

== Как определить характеристики выравнивания? ==
В выдаче needle и water (если не задавать другой формат) имеются следующие характеристики: число и процент колонок с идентичными буквами, число и процент колонок с близкими буквами (т.е. теми, для которых значение матрицы замен положительно), число и процент гэпов, вес выравнивания. Число инделей посчитаете своей программой; не забывайте, что один индель может присутствовать в двух "блоках" выравнивания (то есть начинаться на одной строке, продолжаться на другой).

Чтобы посчитать процент покрытия локальным выравниванием для каждой последовательности, нужно определить длину участка, попавшего в выравнивание (по координатам начала и конца) и разделить эту длину на полную длину последовательности. Полные длины есть в выдаче needle (в конце выравнивания), кроме того, длину выдаёт программа infoseq. Покрытием считаем именно долю всего участка, а не только тех букв, для которых нашлось сопоставление в другой последовательности.

== Как заставить программу needle выдать выравнивание в fasta-формате? ==
Добавить параметр `-aformat fasta`.

== Как построить множественное выравнивание? ==
Есть много способов сделать это, ниже описаны три.

Первый --- на kodomo программой muscle. Пусть у вас есть идентификаторы записей в Swiss-Prot, например ENO_BACSU, ENO_ECOLI, ENO_MYCTU, ENO_HAEIN.
Создайте списочный файл (скажем, eno.txt) со строками:
{{{
sw:eno_bacsu
sw:eno_ecoli
sw:eno_myctu
sw:eno_haein
}}}
Затем создайте файл в fasta-формате:
{{{
seqret @eno.txt eno.fasta
}}}
После этого запустите muscle:
{{{
muscle -in eno.fasta -out eno_alignment.fasta
}}}

Второй способ. Запустите Jalview. В меню File выберите Fetch sequences. Отметьте Uniprot и нажмите OK. В меню слева выберите Entry name, в окошко справа внесите ID белков, разделённых точкой с запятой "`;`". Дождитесь появления списка находок. Отметьте НЕУСТАРЕВШИЕ находки (у них "нормальные" поля Protein names и Gene names, без ссылок на другие записи) и нажмите OK. Если всё нормально, появится окошко "Retreived from Uniprot" с последовательностями белков. Теперь надо их выровнять, для этого в меню Web service выберите Alignment и там --- любую программу "with Defaults", например "Muscle with Defaults". Через некоторое время появится окошко с выравниванием. Можно "скрестить" этот способ с предыдущим: последовательности добыть seqret'ом, потом невыровнеными импортировать в Jalview и из Jalview запустить выравнивание.

Третий способ. На сайте Uniprot внесите в окно поиска идентификаторы, разделённые словом "or", например:<<BR>>
`ENO_BACSU or ENO_ECOLI or ENO_MYCTU or ENO_HAEIN`<<BR>>
и запустите поиск (то же самое можно сделать без "or" через ID mapping, разберитесь сами). Отметьте галочками все правильные находки и нажмите кнопку Align. Когда появится выравнивание, нажмите кнопку Download (сразу над словом "Alignment"). Выберите формат FASTA, отметьте Uncompressed и сохраните файл.