class ProteomeData(MeasurementModel): locus = dmodels.ForeignKey('Locus', on_delete=models.PROTECT) fold_change = dmodels.FloatField(di_show=True) adjusted_p_value = dmodels.FloatField(di_show=True, validators=[validate_probabilty]) unique_peptides = dmodels.IntegerField() class Meta: unique_together = (('locus', 'experiment'), ) verbose_name_plural = 'Proteom data' def __str__(self): return 'Proteome Datapoint'
class CoAData(ExperimentalData): co_a_derivative = dmodels.ForeignKey('CoADerivative', on_delete=models.PROTECT) stderr = dmodels.FloatField(null=True, blank=True, di_show=True) class Meta: unique_together = (('co_a_derivative', 'experiment'), ) verbose_name_plural = 'CoA data' def __str__(self): return 'CoA datapoint'
class FluxData(MeasurementModel): flux = dmodels.FloatField(di_show=True, validators=[validate_flux]) flux_min = dmodels.FloatField(di_show=True, di_display_name='lb', validators=[validate_flux]) flux_max = dmodels.FloatField(di_show=True, di_display_name='ub', validators=[validate_flux]) reaction = dmodels.ForeignKey('Reaction', on_delete=models.CASCADE) class Meta: unique_together = (( 'reaction', 'experiment', )) verbose_name_plural = 'Fluxes' def __str__(self): return 'Flux datapoint'
class Reaction(BiologicalModel): name = dmodels.CharField(max_length=255, unique=True, di_show=True, di_display_name='reaction_name') reaction_equation = dmodels.TextField() lb = dmodels.FloatField(null=True, blank=True) ub = dmodels.FloatField(null=True, blank=True) brenda = dmodels.CharField(max_length=13, blank=True) kegg = dmodels.CharField(max_length=10, blank=True, di_show=True) metacyc = dmodels.CharField(max_length=100, blank=True) pubmed = dmodels.CharField(max_length=12, blank=True) notes = dmodels.TextField(blank=True) metabolite = dmodels.ManyToManyField( 'Metabolite', related_name='reactions') #, through='ReactionMetabolite') def __str__(self): """Return equation and database ID if exists in specified order.""" allowed_length = 30 if self.brenda: return self.brenda elif self.metacyc: return self.metacyc elif self.kegg: return self.kegg else: if len(self.reaction_equation) < allowed_length: return self.reaction_equation else: return self.reaction_equation[:30] + '[...]' @property def brendalink(self): if self.brenda: prefix = self.brenda[:2] refid = self.brenda[2:] link = '<a href="http://www.brenda-enzymes.org/structure.php?show=reaction&id={}&type={}&displayType=marvin">{}</a>' if prefix == 'BS': return format_html(link, mark_safe(refid), mark_safe('S'), self.brenda) elif prefix == 'BR': return format_html(link, mark_safe(refid), mark_safe('I'), self.brenda) else: return None @property def kegglink(self): if self.kegg: link = '<a href="http://www.genome.jp/dbget-bin/www_bget?rn:{}">{}</a>' return format_html(link, mark_safe(self.kegg), self.kegg) else: return None @property def metacyclink(self): if self.metacyc: link = '<a href="http://metacyc.org/META/NEW-IMAGE?type=NIL&object={}&redirect=T">{}</a>' return format_html(link, mark_safe(self.metacyc), self.metacyc) else: return None @property def db_crossref(self): return (self.brendalink or self.kegglink or self.metacyclink or 'No cross reference found.') @property def short_reaction(self): allowed_length = 30 if len(self.reaction_id < allowed_length): return self.reaction_id else: return self.reaction_id[:30] + '[...]'
class RNAseqData(TranscriptomeData): mean_rpkm = dmodels.FloatField(di_show=True) class Meta: verbose_name_plural = 'RNASeq data'
class ExperimentalData(MeasurementModel): mean = dmodels.FloatField(di_show=True) class Meta: abstract = True