Incapacidad de la función (Bio.SeqUtils.molecular_weight) para calcular el peso molecular de una secuencia de nucleótidos no ambigua.
Estoy tratando de crear una función en python que lea secuencias de nucleótidos tanto inequívocas como ambiguas de un archivo fasta y devuelva el ID de la secuencia y el peso molecular.
He intentado esto con el siguiente código:
import Bio
from Bio import SeqUtils, SeqIO
def funcion(nombre_archivo):
nucleotidos = {'A', 'T', 'C', 'G'}
with open(nombre_archivo) as archivo:
for registro in SeqIO.parse(archivo, "fasta"):
for nucl in registro:
if nucl in nucleotidos:
continue
else:
print(str(registro.id) + ": es ambigua")
break
else:
peso_molecular = Bio.SeqUtils.molecular_weight(registro)
print(str(registro.id) + ": es inequívoca y el peso molecular es " + str(peso_molecular))
funcion("random.fasta")
Si uso este código en secuencias ambiguas, no hay absolutamente ningún problema y obtengo el resultado que tenía en mente. Sin embargo, si incluyo secuencias inequívocas, obtengo el error “ValueError: ‘I’ no es una letra inequívoca válida para ADN”, causado por la función Bio.SeqUtils.molecular_weight(registro)
, lo cual no tiene sentido para mí ya que la letra ‘I’ normalmente causaría el break en el primer bloque else
si entendí esto correctamente.
También utilicé una función personalizada para calcular manualmente el peso molecular (basado en valores fijos) y en este caso no hay errores y la función funciona perfectamente tanto para secuencias ambiguas como inequívocas. Sin embargo, alguien señaló que mi cálculo manual no es tan preciso como la función incorporada.
Soy algo nuevo en Python, pero espero que alguien pueda saber por qué todavía se produce el ValueError y cómo solucionarlo.
davy.ai
Solución para leer secuencias nucleotídicas unambiguous y ambiguous de un archivo fasta y calcular su peso molecular
El código proporcionado es un buen punto de partida, pero necesita algunas modificaciones. Un problema con el código es que la función
SeqUtils.molecular_weight()
espera un objetoSeq
como entrada, pero el código actual está pasando un objetoSeqRecord
. Para solucionarlo, podemos extraer el objetoSeq
del objetoSeqRecord
usandorecord.seq
.Otro problema es que el código actual está comprobando si cada nucleótido en la secuencia está en el conjunto de nucleótidos unambiguous, lo cual es innecesario ya que
SeqUtils.molecular_weight()
puede manejar nucleótidos ambiguous. Podemos simplificar el código eliminando el bucle que comprueba los nucleótidos unambiguous.Aquí hay una versión revisada del código que debería funcionar tanto para secuencias unambiguous como para secuencias ambiguous:
Este código define una función
calcular_peso_molecular()
que toma un objetoSeq
como entrada y devuelve el peso molecular. La funciónleer_fasta()
lee las secuencias del archivo fasta, calcula el peso molecular para cada secuencia y devuelve el id de la secuencia y el peso molecular como una tupla.Así es como podría verse la salida:
Ten en cuenta que he incluido un especificador de formato
:.2f
en la instrucciónprint()
para redondear el peso molecular a dos decimales. Puedes ajustar esto para que coincida con el nivel de precisión que desees.