Скрипт AminoFreq
Данный скрипт написан на языке программирования Python.
Он способен получать на вход файл фаста-формата с несколькими аминокислотными последовательностями и, проанализировав его, создавать новый файл, который будет содержать частоту встречаемости аминокислот.
Пользователю нужно ввести (по просьбе программы) имя исходного файла с последовательностями и имя желаемого файла, который он получит в итоге.
Скачать данный скрипт можно здесь, а ниже представлен разбор его кода.
Разбор кода
1. Задание класса:# protein class
class Protein:
#class arguments
seqId = ""
descr = ""
seq = ""
def __init__(self,i,d,s):
self.seqId = i
self.descr = d
self.seq = s
В данных строчках задаётся класс "Белок", обладающий следующими параметрами:
- идентификатор белка
- описание
- последовательность аминокислот
2. Цикл, создающий список:
for line in fastaFile:
line = line.strip()
if len(line) == 0:
continue
# for finding the first line
if line[0] == ">":
lineList = line.split(None,1)
myId = lineList[0]
myId = myId.strip(">")
if len(lineList) > 1:
myDescr = lineList[1].strip()
else:
myDescr = ""
myProtein = Protein(myId, myDescr, mySeq)
proteinList.append(myProtein)
mySeq = ""
myId = ""
# making sequence
else:
mySeq = mySeq + line.translate(None,"\n\r \t")
myProtein.seq = myProtein.seq + mySeq
mySeq = ""
Данный цикл анализирует файл с последовательностями и вычленяет из него информацию, касающаяся белка. Создаётся новый объект класса "Белок", который добавляется в список, содержащий в себе информацию о всех полученных белках.
До данного цикла задаются переменные:
# parameters mySeq = "" myDescr = "" myId = "" proteinList = []
3. Функция, создающая словарь с аминокислотами:
def aminoMake(proteinList):
"""
This function makes a dictionary with amino acids as keys
and the number of it's appear in the fasta file as value.
"""
aminoAcids = {}
for protein in proteinList:
sequence = protein.seq
for acid in sequence:
if acid in aminoAcids:
aminoAcids[acid] += 1
else:
aminoAcids[acid] = 1
return aminoAcids
Как написано в комментарии к функции, её главная задача — создание словаря, в котором ключами являются аминокислоты, содержащиеся в данном белке, а значениями — количество раз их появления в последовательности, кодирующей данный белок. Цикл анализирует по буквам последовательность, записывая, сколько раз встречается та или иная аминокислота.
4. Подсчёт общего количества аминокислот:
acidSum = 0
for acidNum in aminoAcid.values():
acidSum += acidNum
Данный цикл нужен нам для того, чтобы найти общее количество аминокислот данного белка. Это даст нам позже возможность подсчитать встречаемость каждой аминокислоты.
5. Создание нового файла и запись в него полученных данных:
newName = raw_input("Please enter your new file's name: ") + ".txt"
newFile = open("newName", "w")
newFile.write("Aa: \t Frequency: \n")
for acid in aminoAcid.keys():
frequency = (float(aminoAcid[acid])/acidSum)*100
freqStr = acid + "\t" + str(frequency) + "%" + "\n"
newFile.write(freqStr)
В первых строчках создаётся новый файл, в который будет записываться информация об аминокислотах. Далее у нас цикл. Он проходит по всем ключам созданного ранее словаря (т.е. аминокислотам) и считает их встречаемость в белке, деля значение, которое соответствует ключу, на общее количество аминокислот.
6. Самая редкая и самая часто встречаемая аминокислоты:
quaList = aminoAcid.values()
quaList.sort()
for acid in aminoAcid.keys():
if aminoAcid[acid] == quaList[0]:
fileStr = "The most infrequent amino acid is %s.\n" % acid
newFile.write(fileStr)
if aminoAcid[acid] == quaList[-1]:
fileStr1 = "The most common amino acid is %s.\n" % acid
newFile.write(fileStr1)
Для начала мы создаём список из количества каждой аминокислоты в последовательности. Потом сортируем его, располагая элементы в порядке возрастания.
Дальше идёт цикл, который выписывает самое маленькое значение, т.е. самый первый элемент списка, и находит соответствующую ему аминокислоту. Аналогично с самым большим значениеv (самый последний элемент списка).
В итоге, в файл записывается, какая аминокислота встречается реже других, а какая — чаще.