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.

Biopython: Cómo extraer únicamente los átomos relevantes y guardar un archivo PDB (sin guardarlo localmente)?

Usando Biopython. Tengo una lista de átomos. repatoms = [CA, CB, CD3] (Átomos de carbono).
Quiero guardar solo estos de cualquier archivo PDB dado. No quiero guardarlo localmente; quiero guardarlo en la memoria (Muchas iteraciones).
He llegado al siguiente código, pero guarda el archivo localmente y es muy lento.
Por lo tanto, mi objetivo es, para cada átomo en PDB, si está presente en rep
atoms. Crear un nuevo_pdb que solo almacene esa información para que, cuando lo llame más adelante en mi código, debería ser un archivo PDB sin guardarse en mi computadora en una carpeta local.

¿Cómo puedo agregar cada átomo? Imprimir todos los átomos es muy rápido. Quiero agregarlo, pero no sería un archivo de estructura PDB. ¿Qué debo hacer?

“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para guardar la información del átomo seleccionado de cada átomo en el archivo PDB en un nuevo archivo PDB en memoria sin guardarlo localmente, se puede utilizar la función StringIO del módulo io de Python. Aquí hay un código actualizado que hace eso:

    from Bio.PDB import PDBIO, Select
    from io import StringIO
    
    class rep_atom_Select(Select):
        def accept_atom(self, atom):
            if atom.get_name() in rep_atoms:
                return 1
            else:
                return 0
    
    def rep_atoms_pdb(input_pdb):
        # crear un buffer de cadena para contener el archivo PDB de salida
        output_pdb = StringIO()
    
        io = PDBIO()
        io.set_structure(input_pdb)
    
        # cambiar el método de guardado para escribir en el buffer de cadena en lugar de un archivo local
        io.save(output_pdb, rep_atom_Select())
    
        # restablecer la posición del buffer al principio antes de devolver el contenido del PDB
        output_pdb.seek(0)
        return output_pdb.read()
    

    El código anterior utiliza el módulo StringIO para crear un buffer de cadena que contiene el archivo PDB de salida. La información del átomo seleccionado se escribe en el buffer utilizando el método save de PDBIO. Dado que no estamos guardando el archivo PDB localmente, necesitamos actualizar el método de guardado para escribir en el buffer de cadena en su lugar (como se muestra arriba). Finalmente, restablecemos la posición del búfer y devolvemos el contenido del PDB como una cadena que puede ser utilizada en memoria por otras partes del código.

    Para agregar la información de los átomos seleccionados en una nueva estructura PDB sin guardarlo como archivo, se puede crear un nuevo objeto de estructura PDB en lugar de escribir en un archivo. Aquí hay un código de ejemplo que hace eso:

    from Bio.PDB import PDBIO, Select, PDBParser
    
    class rep_atom_Select(Select):
        def accept_atom(self, atom):
            if atom.get_name() in rep_atoms:
                return 1
            else:
                return 0
    
    def rep_atoms_pdb(input_pdb):
        # crear un nuevo objeto de estructura PDB para contener los átomos seleccionados
        output_pdb = Bio.PDB.Structure.Structure("new_pdb")
    
        for model in input_pdb:
            # crear un nuevo objeto de modelo para cada modelo en el archivo PDB de entrada
            new_model = Bio.PDB.Model.Model(model.id)
    
            for chain in model:
                # crear un nuevo objeto de cadena para cada cadena en el modelo
                new_chain = Bio.PDB.Chain.Chain(chain.id)
    
                for residue in chain:
                    # crear un nuevo objeto de residuo para cada residuo en la cadena
                    new_residue = Bio.PDB.Residue.Residue(residue.id, residue.resname, residue.segid)
    
                    for atom in residue:
                        # si el átomo está en la lista rep_atoms, agregarlo al nuevo objeto de residuo
                        if atom.get_name() in rep_atoms:
                            new_residue.add(atom)
    
                    # agregar el nuevo objeto de residuo al nuevo objeto de cadena
                    new_chain.add(new_residue)
    
                # agregar el nuevo objeto de cadena al nuevo objeto de modelo
                new_model.add(new_chain)
    
            # agregar el nuevo objeto de modelo al objeto de estructura PDB de salida
            output_pdb.add(new_model)
    
        return output_pdb
    

    El código anterior crea un nuevo objeto de estructura PDB (output_pdb) para contener la información de los átomos seleccionados. Luego realiza un bucle a través del archivo PDB de entrada, creando nuevos objetos de modelo, cadena, residuo y átomo para cada uno de ellos. Si se encuentra un átomo en la lista rep_atoms, se agrega a un nuevo objeto de residuo que luego se agrega a un nuevo objeto de cadena. Finalmente, se agrega el objeto de cadena al objeto de modelo y se agrega el objeto de modelo al objeto de estructura PDB de salida. Este enfoque debería crear un nuevo objeto de estructura PDB que solo contiene los átomos seleccionados sin guardarlo localmente.

Comments are closed.