Неспособность (функция Bio.SeqUtils.molecular_weight) вычислить молекулярный вес однозначной нуклеотидной последовательности

#biopython

#питон #последовательность #биопитон #фаста

Вопрос:

Я пытаюсь создать функцию в python, которая считывает как однозначные, так и неоднозначные нуклеотидные последовательности из файла fasta и возвращает идентификатор последовательности и молекулярный вес.

Я попробовал это сделать со следующим кодом:

 import Bio from Bio import SeqUtils, SeqIO  def function(filename):  nucleotides ={'A','T', 'C', 'G'}  with open(filename) as file:  for record in SeqIO.parse(file, "fasta"):  for nucl in record:  if nucl in nucleotides:  continue  else:  print(str(record.id) ": is ambiguous")  break  else:  mol_weight= Bio.SeqUtils.molecular_weight(record)  print(str(record.id) ": is unambiguous amp; molecular weight = " str(mol_weight))  function("random.fasta")  

Если я использую этот код для неоднозначных последовательностей, то абсолютно никаких проблем не возникнет, и я получу результат, который имел в виду. Если я менее однозначной последовательности, я получаю «ValueError: ‘я’ не является допустимым однозначные буквы ДНК» обусловлено биологически.SeqUtils.функция molecular_weight(запись), по которым в моем понимании не имеет смысла, так как буква «I», как правило, причиной разрыва первого блока else, если я получил это неправильно.

Я также использовал пользовательскую функцию для ручного вычисления молекулярного веса (на основе фиксированных значений), и в этом случае ошибок нет, и функция отлично работает как для неоднозначных, так и для однозначных последовательностей. Однако кто-то указал, что мой ручной расчет не так точен, как встроенная функция.

Я немного новичок в Python, но я надеюсь, что кто-нибудь может знать, почему ошибка ValueError все еще возникает и как ее решить.

Комментарии:

1. Я исправил отступ в теле функции — легко ошибиться при вставке кода в форму. Я также включил необходимый импорт для запуска кода — все, что нужно, — это действительный файл fasta.

Ответ №1:

Я думаю, что ошибка происходит в выражении mol_weight= Bio.SeqUtils.molecular_weight(record) .

Запись неявно преобразуется в ее строковое представление ID: SEQUENCE_1 ... . Таким 'I' образом, ошибка в значении соответствует вовсе не нуклеотиду, а довольно случайному строковому значению.

Попробуйте вместо этого эту строку: mol_weight = Bio.SeqUtils.molecular_weight(record.seq)

Для меня это вернуло желаемый результат:

 SEQUENCE_1: is unambiguous amp; molecular weight = 331.2218  

для тривиальной последовательности (просто буква А), которая раньше вызывала бы описанную вами ошибку.

 gt;SEQUENCE_1 A  

Обновить:

Полные решения выглядят следующим образом:

 from Bio import SeqIO, SeqUtils   def function(filename):  with open(filename) as file:  for record in SeqIO.parse(file, "fasta"):  try:  mol_weight = SeqUtils.molecular_weight(record.seq)  print(f"{record.id}: is unambiguous amp; molecular weight = {mol_weight}")  except ValueError as exception:  print(f"{record.id}: {exception}")   if __name__ == '__main__':  function("random.fasta")   

Я включил обработку выполнения из ответа @pippo1980, поскольку она действительно немного проще, быстрее и, возможно, более питоническая.

Комментарии:

1. Большое вам спасибо! В конце концов, это была довольно глупая ошибка с моей стороны.

2. Не совсем. Подобные ошибки легко совершать с Python из-за системы набора текста уткой. Мне пришлось запустить отладчик, чтобы обнаружить это. Пожалуйста, также отметьте ответ как «принятый ответ», если он решил вашу проблему.

Ответ №2:

короче:

 from Bio import SeqIO, SeqUtils    def function(filename):  with open(filename) as file:  for record in SeqIO.parse(file, "fasta"):  try:  mol_weight= SeqUtils.molecular_weight(record.seq, 'DNA')  print(str(record.id) ": is unambiguous amp; molecular weight = " str(mol_weight))    except Exception as exception:  print(record.id ':',str(type(exception).__name__), str(exception))    function("random.fasta")    function("random.fasta")  

введите случайный файл.fasta:

 gt;first AAAAAAAAAAAAATTTTTTTTTTTTTTGGGGGGGGGGGGGGCCCCCCCCCCCCCCGTA gt;second AAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTICCCCCCCCCCCCCCCCCCCCCCCCCCC gt;third AAAAAAAAAQQQQQQQQQQQQQQQQQQTTTTTTTTTT gt;fourth AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGGCGCGCGCGCGC  

выход:

 first: is unambiguous amp; molecular weight = 17952.438 second: ValueError 'I' is not a valid unambiguous letter for DNA third: ValueError 'Q' is not a valid unambiguous letter for DNA fourth: is unambiguous amp; molecular weight = 25755.56080000001