Скрипт 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 (самый последний элемент списка).
В итоге, в файл записывается, какая аминокислота встречается реже других, а какая — чаще.