wget 'https://rest.uniprot.org/uniprotkb/stream?compressed=true&format=txt&query=(proteome: UP000001408)' -O ~/term2/pr8/UP000001408.swiss.gz |
Моей задачей было попытаться оценить, сколько в протеоме белков, обладающих какой-либо ферментативной активностью, используя поисковые запросы на сайте UniProt и команды bash на kodomo.
Поисковый запрос (proteome:UP000001408) AND (ec:*) позволяет найти все записи, имеющие какой-либо идентификатор ЕС.
(add field: Function → Enzyme classification [EC] → *)
Всего обнаружилось 585 записей.
Поисковый запрос (proteome:UP000001408) AND (ec:2) позволяет обнаружить все трансферазы моей бактерии. В результате было найдено 238 записей. Таким образом, можно подумать, что трансферазы составляют 40% от всех ферментов бактерии Leptospira interrogans serovar Lai str. 56601. (но на самом деле это не точно)
Поисковый запрос (proteome:UP000001408) AND ((ec:*) OR (keyword:KW-0560) OR (keyword:KW-0808) OR (keyword:KW-0378) OR (keyword:KW-0456) OR (keyword:KW-0413) OR (keyword:KW-0436) OR (keyword:KW-1278)) дал 1059 находок. Как и первый он позволяет найти все записи, имеющие какой-либо идентификатор ЕС, а также записи, в ключевых словах которых указаны 7 основных классов ферментов: оксидоредуктазы (EC 1), трансферазы (EC 2), гидролазы (EC 3), лиазы (EC 4), изомеразы (EC 5), лигазы (EC 6) или транслоказы (EC 7).
К последнему поисковому запросу можно еще что-нибудь добавить, например, protein_name, но я не буду этого делать. Приведенных поисковых запросов и их результатов вполне достаточно, чтобы увидеть разницу (585 vs 1059) по количеству записей почти в 2 раза и снова прийти к мысли о том, что с фильтрами нужно работать осознанно.
Если бы меня спросили, какой результат кажется мне более достоверным, я бы сказала что на общее количество 3676 белков 1059 обладающих ферментативной активностью мне кажутся более вероятным вариантом, нежели всего 585.
Я планирую написать команду, которая подсчитывает количество строк в моем сжатом файле (по условию его распаковывать нельзя) базы данных белковых последовательностей (UP000001408.swiss.gz). Будут считаться строки, содержащие любой код классификации ферментов (EC) от 0 до 7 (по сути, это то же самое, что я делала ранее, но при помощи «сложного» поискового запроса).
Конвейер: zgrep 'EC=[0-7]' UP000001408.swiss.gz | wc -l |
Результат: файл содержит 1198 таких строк, что более или менее согласуется с результатом последнего «сложного» поискового запроса.
Конвейер был составлен по аналогии с командами из подсказок: zgrep 'что-нибудь' some-file.gz | sort -u zcat some-file.gz | wc -l |
Можно начать с подсчета ферментов каждого класса:
Конвейер: zgrep -o 'EC=[1-7]\.' UP000001408.swiss.gz | sort | uniq -с |
Результат:
| Количество | Класс |
|---|---|
| 148 | EC=1. |
| 483 | EC=2. |
| 199 | EC=3. |
| 108 | EC=4. |
| 110 | EC=5. |
| 112 | EC=6. |
| 38 | EC=7. |
Можно посчитать количество каких-то особых белков, например трансмембранных:
Конвейер: zcat UP000001408.swiss.gz | awk '/Transmembrane/{if(!skip) count++; skip=10} skip>0{skip--} END{print count}' |
awk читает файл построчно и выполняет действия, когда строка соответствует шаблону
awk 'шаблон1{действие1} шаблон2{действие2} ...'
/Transmembrane/ - это шаблон (ищем строки, содержащие слово "Transmembrane")
Когда строка подошла под заданный шаблон, выполняется блок в {}:
if(!skip) - если переменная skip равна 0 (т.е. мы не в режиме пропуска)
count++ увеличиваем счётчик найденных уникальных вхождений на 1 (если строка соответствует шаблону, т.е. содержит слово "Transmembrane")
skip=10 переустанавливаем переменную skip в 10 (режим пропуска следующих 10 строк)
Перебираем строки дальше: блок skip>0{skip--}
skip>0 шаблон: «режим пропуска активен» (skip больше нуля: 10, 9, 8, 7...) то
{skip--} выполняется действие: skip уменьшается на 1 (так мы отсчитываем строки, которые нам осталось пропустить)
Переходим дальше (и так пока skip не обнулится)
блок END{print count}
END - специальный шаблон, который выполняется после обработки всех строк файла
print count выводит итоговое значение счётчика
Результат: 825 находок.
Конечно, такая команда - это своеобразный костыль, но просто считать, сколько раз встретилось слово "Transmembrane" не вариант, так как на один трансмембранный белок это слово может встретиться и 2, и 3 раза. Тогда и в итоговом результате количество трансмембранных белков будет сильно превышено (не будет соответствовать действительности). Лично я придумала (предварительно изучив структуру файла) просто пропускать следующие 10 строк после того, как попадается слово "Transmembrane", так что если оно и будет попадаться 2-3 раза на одну запись (белок), то счетчик его проигнорирует, и посчитает только первое соответствие шаблону.
Раз уж я когда-то выбрала для обзора патогенную лептоспиру, почему бы не посмотреть, сколько белков связаны с патогенностью (по ключевому слову Virulence):
Конвейер: zcat UP000001408.swiss.gz | grep -c '^KW.*Virulence' |
Результат: 5 находок.
Можно попробовать узнать ID этих белков.
Конвейер: zcat UP000001408.swiss.gz | awk '/^ID/{id=$0; flag=0} /^KW/,/^$/{if(/Virulence /) flag=1} /^\//{if(flag) print id}' |
Блок /^ID/{id=$0; flag=0}
/^ID/ шаблон: ищем строки, начинающиеся с "ID" (начало записи белка)
{id=$0; f=0} действие: id=$0 сохраняет всю текущую строку в переменную id (так мы запоминаем ID белка), flag=0 сбрасывает индикатор в 0 (так будет, пока не найдется заданное ключевое слово)
Дальше блок /^KW/,/^$/ {if(/Virulence /) flag=1}
Шаблон /^KW/,/^$/ это диапазон строк (действие начинается, когда мы встречаем строку, начинающуюся с ^KW, продолжается для всех следующих строк и прекращается, когда встречаем пустую строку (^$)
Действие {if(/Virulence /) flag=1} с условием: если в текущей строке есть слово Virulence с пробелом после, то ставим индикатор flag =1 (нашли нужное слово)
Зачем пробел после Virulence? Чтобы быть уверенным в том, что это самостоятельное слово.
Дальше блок /^\/\// {if(flag) print id}
Шаблон /^\/\// значит, что строка начинается с // (конец записи белка)
Действие {if(flag) print id} с условием: если индикатор не равен 0, выводится сохранённый ID белка
Результат:
| ID белка | Примечание |
|---|---|
| ID Q8EY43_LEPIN | Unreviewed; 305 AA. |
| ID Q8F107_LEPIN | Unreviewed; 2306 AA. |
| ID Q8F371_LEPIN | Unreviewed; 468 AA. |
| ID Q8F5B9_LEPIN | Unreviewed; 2547 AA. |
| ID Q8F9W4_LEPIN | Unreviewed; 260 AA. |