class Compound(models.Model): name = models.CharField(max_length=256) molecule = models.MolField() torsionbv = models.BfpField(null=True) mfp2 = models.BfpField(null=True) ffp2 = models.BfpField(null=True)
class Compound(models.Model): unique_id = models.CharField(max_length=13, unique=True, blank=False) description = models.TextField(blank=True) smiles = models.CharField(max_length=4096, blank=False, unique=True) inchi = models.CharField(max_length=4096, blank=False, unique=True) inchi_key = models.CharField(max_length=27, blank=False, unique=True) mol_weight_exact = models.FloatField(blank=False) heavy_atoms_count = models.IntegerField(blank=False) ring_count = models.IntegerField(blank=False) mol = models.MolField() torsionbv = models.BfpField(null=True) mfp2 = models.BfpField(null=True) ffp2 = models.BfpField(null=True) class MoleculeAlreadyExists(Exception): pass def _generate_id(self): number = datetime.now().timestamp() number=int(number * 10e6) # get seconds random_data = number.to_bytes(8, byteorder='big') return 'MI-M-' + hashlib.md5(random_data).hexdigest()[:8] def __init__(self, *args, **kwargs): if len(args) > 2: super(Compound, self).__init__(*args, **kwargs) return mol_as_RDmol = args[0] if len(args) > 0 else None if not mol_as_RDmol: mol_as_RDmol = kwargs['mol_as_RDmol'] if 'mol_as_RDmol' in kwargs else None if not mol_as_RDmol: raise RuntimeError("No RDMol specified") description = args[1] if len(args) > 1 else None if not description: description = kwargs['description'] if 'description' in kwargs else '' new_kwargs = dict() new_kwargs['unique_id'] = self._generate_id() new_kwargs['smiles'] = Chem.MolToSmiles(mol_as_RDmol, isomericSmiles=True, canonical=True) new_kwargs['inchi'] = Chem.MolToInchi(mol_as_RDmol) new_kwargs['inchi_key'] = Chem.InchiToInchiKey(new_kwargs['inchi']) new_kwargs['mol_weight_exact'] = Descriptors.ExactMolWt(mol_as_RDmol) new_kwargs['heavy_atoms_count'] = Lipinski.HeavyAtomCount(mol_as_RDmol) new_kwargs['ring_count'] = Lipinski.RingCount(mol_as_RDmol) new_kwargs['mol'] = mol_as_RDmol super(Compound, self).__init__(description=description, **new_kwargs) def save(self, *args, **kwargs): if Compound.objects.filter(inchi_key=self.inchi_key).exists(): raise Compound.MoleculeAlreadyExists("Molecule with the same InchiKey was found. Cannot save.") super(Compound, self).save(*args, **kwargs) def __str__(self): return self.unique_id
class Fingerprint(rdkit_models.Model): bfp = rdkit_models.BfpField(null=True, verbose_name="Binary Fingerprint") class Meta: db_table = 'compound_fingerprint' verbose_name = 'Compound Fingerprint' verbose_name_plural = 'Compound Fingerprints' def __unicode__(self): return u"Compound Fingerprint with ID {}".format(self.id)
class ChemicalEntity(models.Model): canonicalSMILES = models.CharField(max_length=65536, unique=True, blank=False) inchi = models.CharField(max_length=65536, unique=True, blank=False) inchiKey = models.CharField(max_length=65536, unique=True, blank=False) # from django-rdkit rdMol = models.MolField() morganFP = models.BfpField(null=True) class Meta: unique_together = ('canonicalSMILES', 'inchiKey') def __str__(self): return '%s object <%s>' % (self.__class__.__name__, self.inchiKey) @property def fingerprint(self): if not self.morganFP: self.morganFP = AllChem.GetMorganFingerprintAsBitVect(self.rdMol, radius=2, nBits=512) return self.morganFP
class BfpModel(models.Model): bfp = models.BfpField(null=True)