Spaces:
Running
Running
| #!/usr/bin/env python3 | |
| """ | |
| Fix both protein and ligand in one go | |
| """ | |
| from pdbfixer import PDBFixer | |
| from openmm.app import PDBFile, Modeller, ForceField | |
| import openmm.unit as u | |
| from seaborn import residplot | |
| print("🔧 Loading and fixing complete system...") | |
| # Load protein | |
| fixer = PDBFixer(filename='inputs/protein.pdb') | |
| fixer.findMissingResidues() | |
| fixer.findMissingAtoms() | |
| fixer.addMissingAtoms() | |
| fixer.addMissingHydrogens(pH=7.0) | |
| print(f" ✓ Protein fixed: {len(list(fixer.topology.atoms()))} atoms") | |
| # Save fixed protein | |
| PDBFile.writeFile(fixer.topology, fixer.positions, open('inputs/protein_fixed.pdb', 'w')) | |
| # Now load ligand and add to protein | |
| print("🔧 Processing ligand...") | |
| # Create modeller with fixed protein | |
| modeller = Modeller(fixer.topology, fixer.positions) | |
| # Load ligand | |
| ligand_pdb = PDBFile('inputs/ligand.pdb') | |
| print(f" Ligand atoms: {ligand_pdb.topology.getNumAtoms()}") | |
| # Fix ligand elements - replace empty elements with carbon | |
| from openmm.app import Topology | |
| fixed_ligand_topology = Topology() | |
| fixed_ligand_positions = [] | |
| chain = fixed_ligand_topology.addChain() | |
| residue = fixed_ligand_topology.addResidue('LIG', chain) | |
| # Get ligand atoms and fix elements | |
| for atom in ligand_pdb.topology.atoms(): | |
| # If element is empty, use carbon as default | |
| if atom.element is None or atom.element.symbol == '': | |
| element = 'C' | |
| else: | |
| element = atom.element.symbol | |
| fixed_ligand_topology.addAtom(atom.name, element, residplot) | |
| fixed_ligand_positions.append(ligand_pdb.positions[atom.index]) | |
| print(f" Fixed ligand: {len(fixed_ligand_positions)} atoms with proper elements") | |
| # Add ligand to modeller | |
| modeller.add(fixed_ligand_topology, fixed_ligand_positions) | |
| # Save combined system | |
| PDBFile.writeFile(modeller.topology, modeller.positions, open('inputs/system_combined.pdb', 'w')) | |
| print(f"✅ Combined system saved: inputs/system_combined.pdb") | |
| print(f" Total atoms: {modeller.topology.getNumAtoms()}") | |