Source code for ionize.PolyIon.NucleicAcid

from math import exp, log, pi

from .PolyIon import PolyIon
from ..Ion import fixed_state


@fixed_state
[docs]class NucleicAcid(PolyIon): _state = {'name': 'Name of the ion.', 'size': 'Number of bases or base pairs in the nucleic acid.', 'species': 'Type of nucleic acid species.', 'sequence': 'Sequence of the nucleic acid.', } _name = 'Nucleic Acid' _size = float('inf') _species = 'DNA' _sequence = None __species_options = {'DNA': {'duplex': True}, 'RNA': {'duplex': False}, 'dsDNA': {'duplex': True}, 'ssDNA': {'duplex': False}, 'ssRNA': {'duplex': False}} def __init__(self, name=None, size=None, sequence=None, species=None): self._name = name or self.name self._size = size or self.size self._sequence = sequence or self.sequence self._species = species or self.species assert self.species in self.__species_options.keys() def mobility(self, pH=None, ionic_strength=None, temperature=None): pH, ionic_strength, temperature = \ self._resolve_context(pH, ionic_strength, temperature) mu = (3.75 - 1.8 * (self.size**-.6)) * -1e-8 return mu def charge(self, pH=None, ionic_strength=None, temperature=None, moment=1): pH, ionic_strength, temperature = \ self._resolve_context(pH, ionic_strength, temperature) return -1. * self.length() / self._solvent.bjerrum(temperature) def length(self): per_bp_length = 3.4e-10 # 3.4 Angstrom in meters return self.size * per_bp_length # TODO: Finish the manning model below def _friction(self, pH=None, ionic_strength=None, temperature=None): pass def _manning_mobility(self, pH=None, ionic_strength=None, temperature=None): pH, ionic_strength, temperature = \ self._resolve_context(pH, ionic_strength, temperature) lb = self._solvent.bjerrum(temperature) k = 1./self._solvent.debye(ionic_strength, temperature) mu = 6 * pi * self._solvent.viscosity(temperature) * lb / self.friction() mu -= 2 * self.charge() * log(1 - exp(-k * lb / self.charge())) return mu