Source code for openprotein.chains

"""Additional chains that can be used with OpenProtein."""

from dataclasses import dataclass


[docs] @dataclass class DNA: """ Represents a DNA sequence. Attributes: sequence (str): The nucleotide sequence of the DNA. """ sequence: str chain_id: str | list[str] | None = None cyclic: bool = False
[docs] def __init__( self, sequence: str, chain_id: str | list[str] | None = None, cyclic: bool = False, ): # validate the sequence matches DNA if not all(nt in set("ACGT") for nt in sequence.upper()): raise ValueError("Sequence contains invalid DNA nucleotides.") self.sequence = sequence self.chain_id = chain_id self.cyclic = cyclic
[docs] @dataclass class RNA: """ Represents an RNA sequence. Attributes: sequence (str): The nucleotide sequence of the RNA. """ sequence: str chain_id: str | list[str] | None = None cyclic: bool = False
[docs] def __init__( self, sequence: str, chain_id: str | list[str] | None = None, cyclic: bool = False, ): # validate the sequence matches RNA if not all(nt in set("ACGU") for nt in sequence.upper()): raise ValueError("Sequence contains invalid RNA nucleotides.") self.sequence = sequence self.chain_id = chain_id self.cyclic = cyclic
[docs] @dataclass class Ligand: """ Represents a ligand with optional Chemical Component Dictionary (CCD) identifier and SMILES string. Requires either a CCD identifier or SMILES string. Attributes: ccd (str | None): The CCD identifier for the ligand. smiles (str | None): The SMILES representation of the ligand. """ chain_id: str | list[str] | None = None ccd: str | None = None smiles: str | None = None
[docs] def __init__( self, *, chain_id: str | list[str] | None = None, ccd: str | None = None, smiles: str | None = None, ): self.chain_id = chain_id if (ccd is None and smiles is None) or (ccd is not None and smiles is not None): raise ValueError("Exactly one of 'ccd' or 'smiles' must be provided.") # TODO add validation self.ccd = ccd self.smiles = smiles