es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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 objeto Seq como entrada, pero el código actual está pasando un objeto SeqRecord. Para solucionarlo, podemos extraer el objeto Seq del objeto SeqRecord usando record.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:

    import Bio
    from Bio import SeqUtils, SeqIO
    
    def calcular_peso_molecular(seq):
        return Bio.SeqUtils.molecular_weight(seq)
    
    def leer_fasta(filename):
        with open(filename) as handle:
            for record in SeqIO.parse(handle, "fasta"):
                peso_molecular = calcular_peso_molecular(record.seq)
                yield record.id, peso_molecular
    
    for id_secuencia, peso_molecular in leer_fasta("random.fasta"):
        print(f"{id_secuencia}: peso molecular = {peso_molecular:.2f}")
    

    Este código define una función calcular_peso_molecular() que toma un objeto Seq como entrada y devuelve el peso molecular. La función leer_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:

    secuencia_ambiguous: peso molecular = 143365.36
    secuencia_unambiguous: peso molecular = 40109.84
    

    Ten en cuenta que he incluido un especificador de formato :.2f en la instrucción print() para redondear el peso molecular a dos decimales. Puedes ajustar esto para que coincida con el nivel de precisión que desees.

Comments are closed.