forked from enviPath/enviPy
[Feature] EnzymeLink Annotations (#152)
Co-authored-by: Tim Lorsbach <tim@lorsba.ch> Reviewed-on: enviPath/enviPy#152
This commit is contained in:
@ -26,6 +26,7 @@ from epdb.models import (
|
|||||||
Compound,
|
Compound,
|
||||||
Reaction,
|
Reaction,
|
||||||
CompoundStructure,
|
CompoundStructure,
|
||||||
|
EnzymeLink,
|
||||||
)
|
)
|
||||||
from utilities.chem import FormatConverter
|
from utilities.chem import FormatConverter
|
||||||
from utilities.misc import PackageImporter, PackageExporter
|
from utilities.misc import PackageImporter, PackageExporter
|
||||||
@ -617,6 +618,8 @@ class PackageManager(object):
|
|||||||
parent_mapping = {}
|
parent_mapping = {}
|
||||||
# Mapping old scen_id to old_obj_id
|
# Mapping old scen_id to old_obj_id
|
||||||
scen_mapping = defaultdict(list)
|
scen_mapping = defaultdict(list)
|
||||||
|
# Enzymelink Mapping rule_id to enzymelink objects
|
||||||
|
enzyme_mapping = defaultdict(list)
|
||||||
|
|
||||||
# Store Scenarios
|
# Store Scenarios
|
||||||
for scenario in data["scenarios"]:
|
for scenario in data["scenarios"]:
|
||||||
@ -648,9 +651,7 @@ class PackageManager(object):
|
|||||||
# Broken eP Data
|
# Broken eP Data
|
||||||
if name == "initialmasssediment" and addinf_data == "missing data":
|
if name == "initialmasssediment" and addinf_data == "missing data":
|
||||||
continue
|
continue
|
||||||
|
if name == "columnheight" and addinf_data == "(2)-(2.5);(6)-(8)":
|
||||||
# TODO Enzymes arent ready yet
|
|
||||||
if name == "enzyme":
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -740,6 +741,9 @@ class PackageManager(object):
|
|||||||
for scen in rule["scenarios"]:
|
for scen in rule["scenarios"]:
|
||||||
scen_mapping[scen["id"]].append(r)
|
scen_mapping[scen["id"]].append(r)
|
||||||
|
|
||||||
|
for enzyme_link in rule.get("enzymeLinks", []):
|
||||||
|
enzyme_mapping[r.uuid].append(enzyme_link)
|
||||||
|
|
||||||
print("Par: ", len(par_rules))
|
print("Par: ", len(par_rules))
|
||||||
print("Seq: ", len(seq_rules))
|
print("Seq: ", len(seq_rules))
|
||||||
|
|
||||||
@ -757,6 +761,9 @@ class PackageManager(object):
|
|||||||
for scen in par_rule["scenarios"]:
|
for scen in par_rule["scenarios"]:
|
||||||
scen_mapping[scen["id"]].append(r)
|
scen_mapping[scen["id"]].append(r)
|
||||||
|
|
||||||
|
for enzyme_link in par_rule.get("enzymeLinks", []):
|
||||||
|
enzyme_mapping[r.uuid].append(enzyme_link)
|
||||||
|
|
||||||
for simple_rule in par_rule["simpleRules"]:
|
for simple_rule in par_rule["simpleRules"]:
|
||||||
if simple_rule["id"] in mapping:
|
if simple_rule["id"] in mapping:
|
||||||
r.simple_rules.add(SimpleRule.objects.get(uuid=mapping[simple_rule["id"]]))
|
r.simple_rules.add(SimpleRule.objects.get(uuid=mapping[simple_rule["id"]]))
|
||||||
@ -777,6 +784,9 @@ class PackageManager(object):
|
|||||||
for scen in seq_rule["scenarios"]:
|
for scen in seq_rule["scenarios"]:
|
||||||
scen_mapping[scen["id"]].append(r)
|
scen_mapping[scen["id"]].append(r)
|
||||||
|
|
||||||
|
for enzyme_link in seq_rule.get("enzymeLinks", []):
|
||||||
|
enzyme_mapping[r.uuid].append(enzyme_link)
|
||||||
|
|
||||||
for i, simple_rule in enumerate(seq_rule["simpleRules"]):
|
for i, simple_rule in enumerate(seq_rule["simpleRules"]):
|
||||||
sro = SequentialRuleOrdering()
|
sro = SequentialRuleOrdering()
|
||||||
sro.simple_rule = simple_rule
|
sro.simple_rule = simple_rule
|
||||||
@ -910,6 +920,39 @@ class PackageManager(object):
|
|||||||
|
|
||||||
print("Scenarios linked...")
|
print("Scenarios linked...")
|
||||||
|
|
||||||
|
# Import Enzyme Links
|
||||||
|
for rule_uuid, enzyme_links in enzyme_mapping.items():
|
||||||
|
r = Rule.objects.get(uuid=rule_uuid)
|
||||||
|
for enzyme in enzyme_links:
|
||||||
|
e = EnzymeLink()
|
||||||
|
e.uuid = UUID(enzyme["id"].split("/")[-1]) if keep_ids else uuid4()
|
||||||
|
e.rule = r
|
||||||
|
e.name = enzyme["name"]
|
||||||
|
e.ec_number = enzyme["ecNumber"]
|
||||||
|
e.classification_level = enzyme["classificationLevel"]
|
||||||
|
e.linking_method = enzyme["linkingMethod"]
|
||||||
|
e.save()
|
||||||
|
|
||||||
|
for reaction in enzyme["reactionLinkEvidence"]:
|
||||||
|
reaction = Reaction.objects.get(uuid=mapping[reaction["id"]])
|
||||||
|
e.reaction_evidence.add(reaction)
|
||||||
|
|
||||||
|
for edge in enzyme["edgeLinkEvidence"]:
|
||||||
|
edge = Edge.objects.get(uuid=mapping[edge["id"]])
|
||||||
|
e.reaction_evidence.add(edge)
|
||||||
|
|
||||||
|
for evidence in enzyme["linkEvidence"]:
|
||||||
|
matches = re.findall(r">(R[0-9]+)<", evidence["evidence"])
|
||||||
|
if not matches or len(matches) != 1:
|
||||||
|
logger.warning(f"Could not find reaction id in {evidence['evidence']}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
e.add_kegg_reaction_id(matches[0])
|
||||||
|
|
||||||
|
e.save()
|
||||||
|
|
||||||
|
print("Enzyme links imported...")
|
||||||
|
|
||||||
print("Import statistics:")
|
print("Import statistics:")
|
||||||
print("Package {} stored".format(pack.url))
|
print("Package {} stored".format(pack.url))
|
||||||
print("Imported {} compounds".format(Compound.objects.filter(package=pack).count()))
|
print("Imported {} compounds".format(Compound.objects.filter(package=pack).count()))
|
||||||
|
|||||||
@ -41,6 +41,7 @@ class Command(BaseCommand):
|
|||||||
"RuleBasedRelativeReasoning",
|
"RuleBasedRelativeReasoning",
|
||||||
"EnviFormer",
|
"EnviFormer",
|
||||||
"ApplicabilityDomain",
|
"ApplicabilityDomain",
|
||||||
|
"EnzymeLink",
|
||||||
]
|
]
|
||||||
for model in MODELS:
|
for model in MODELS:
|
||||||
obj_cls = apps.get_model("epdb", model)
|
obj_cls = apps.get_model("epdb", model)
|
||||||
|
|||||||
@ -494,6 +494,20 @@ class ChemicalIdentifierMixin(ExternalIdentifierMixin):
|
|||||||
return self.get_external_identifier("CAS")
|
return self.get_external_identifier("CAS")
|
||||||
|
|
||||||
|
|
||||||
|
class KEGGIdentifierMixin(ExternalIdentifierMixin):
|
||||||
|
@property
|
||||||
|
def kegg_reaction_links(self):
|
||||||
|
return self.get_external_identifier("KEGG Reaction")
|
||||||
|
|
||||||
|
def add_kegg_reaction_id(self, kegg_id):
|
||||||
|
return self.add_external_identifier(
|
||||||
|
"KEGG Reaction", kegg_id, f"https://www.genome.jp/entry/{kegg_id}"
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
class ReactionIdentifierMixin(ExternalIdentifierMixin):
|
class ReactionIdentifierMixin(ExternalIdentifierMixin):
|
||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
abstract = True
|
||||||
@ -1014,6 +1028,26 @@ class CompoundStructure(EnviPathModel, AliasMixin, ScenarioMixin, ChemicalIdenti
|
|||||||
return self.compound.default_structure == self
|
return self.compound.default_structure == self
|
||||||
|
|
||||||
|
|
||||||
|
class EnzymeLink(EnviPathModel, KEGGIdentifierMixin):
|
||||||
|
rule = models.ForeignKey("Rule", on_delete=models.CASCADE, db_index=True)
|
||||||
|
ec_number = models.TextField(blank=False, null=False, verbose_name="EC Number")
|
||||||
|
classification_level = models.IntegerField(
|
||||||
|
blank=False, null=False, verbose_name="Classification Level"
|
||||||
|
)
|
||||||
|
linking_method = models.TextField(blank=False, null=False, verbose_name="Linking Method")
|
||||||
|
|
||||||
|
reaction_evidence = models.ManyToManyField("epdb.Reaction")
|
||||||
|
edge_evidence = models.ManyToManyField("epdb.Edge")
|
||||||
|
|
||||||
|
external_identifiers = GenericRelation("ExternalIdentifier")
|
||||||
|
|
||||||
|
def _url(self):
|
||||||
|
return "{}/enzymelink/{}".format(self.rule.url, self.uuid)
|
||||||
|
|
||||||
|
def get_group(self) -> str:
|
||||||
|
return ".".join(self.ec_number.split(".")[:3]) + ".-"
|
||||||
|
|
||||||
|
|
||||||
class Rule(PolymorphicModel, EnviPathModel, AliasMixin, ScenarioMixin):
|
class Rule(PolymorphicModel, EnviPathModel, AliasMixin, ScenarioMixin):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
"epdb.Package", verbose_name="Package", on_delete=models.CASCADE, db_index=True
|
||||||
@ -1095,6 +1129,18 @@ class Rule(PolymorphicModel, EnviPathModel, AliasMixin, ScenarioMixin):
|
|||||||
|
|
||||||
return new_rule
|
return new_rule
|
||||||
|
|
||||||
|
def enzymelinks(self):
|
||||||
|
return self.enzymelink_set.all()
|
||||||
|
|
||||||
|
def get_grouped_enzymelinks(self):
|
||||||
|
res = defaultdict(list)
|
||||||
|
|
||||||
|
for el in self.enzymelinks():
|
||||||
|
key = ".".join(el.ec_number.split(".")[:3]) + ".-"
|
||||||
|
res[key].append(el)
|
||||||
|
|
||||||
|
return dict(res)
|
||||||
|
|
||||||
|
|
||||||
class SimpleRule(Rule):
|
class SimpleRule(Rule):
|
||||||
pass
|
pass
|
||||||
@ -1437,6 +1483,16 @@ class Reaction(EnviPathModel, AliasMixin, ScenarioMixin, ReactionIdentifierMixin
|
|||||||
id__in=Edge.objects.filter(edge_label=self).values("pathway_id")
|
id__in=Edge.objects.filter(edge_label=self).values("pathway_id")
|
||||||
).order_by("name")
|
).order_by("name")
|
||||||
|
|
||||||
|
def get_related_enzymes(self):
|
||||||
|
res = []
|
||||||
|
edges = Edge.objects.filter(edge_label=self)
|
||||||
|
for e in edges:
|
||||||
|
for scen in e.scenarios.all():
|
||||||
|
for ai in scen.additional_information.keys():
|
||||||
|
if ai == "Enzyme":
|
||||||
|
res.extend(scen.additional_information[ai])
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
class Pathway(EnviPathModel, AliasMixin, ScenarioMixin):
|
class Pathway(EnviPathModel, AliasMixin, ScenarioMixin):
|
||||||
package = models.ForeignKey(
|
package = models.ForeignKey(
|
||||||
|
|||||||
34
epdb/urls.py
34
epdb/urls.py
@ -1,5 +1,5 @@
|
|||||||
from django.urls import path, re_path
|
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
|
from django.urls import path, re_path
|
||||||
|
|
||||||
from . import views as v
|
from . import views as v
|
||||||
|
|
||||||
@ -88,20 +88,36 @@ urlpatterns = [
|
|||||||
v.package_rule,
|
v.package_rule,
|
||||||
name="package rule detail",
|
name="package rule detail",
|
||||||
),
|
),
|
||||||
re_path(
|
# re_path(
|
||||||
rf"^package/(?P<package_uuid>{UUID})/simple-rdkit-rule/(?P<rule_uuid>{UUID})$",
|
# rf"^package/(?P<package_uuid>{UUID})/simple-rdkit-rule/(?P<rule_uuid>{UUID})$",
|
||||||
v.package_rule,
|
# v.package_rule,
|
||||||
name="package rule detail",
|
# name="package rule detail",
|
||||||
),
|
# ),
|
||||||
re_path(
|
re_path(
|
||||||
rf"^package/(?P<package_uuid>{UUID})/parallel-rule/(?P<rule_uuid>{UUID})$",
|
rf"^package/(?P<package_uuid>{UUID})/parallel-rule/(?P<rule_uuid>{UUID})$",
|
||||||
v.package_rule,
|
v.package_rule,
|
||||||
name="package rule detail",
|
name="package rule detail",
|
||||||
),
|
),
|
||||||
|
# re_path(
|
||||||
|
# rf"^package/(?P<package_uuid>{UUID})/sequential-rule/(?P<rule_uuid>{UUID})$",
|
||||||
|
# v.package_rule,
|
||||||
|
# name="package rule detail",
|
||||||
|
# ),
|
||||||
|
# EnzymeLinks
|
||||||
re_path(
|
re_path(
|
||||||
rf"^package/(?P<package_uuid>{UUID})/sequential-rule/(?P<rule_uuid>{UUID})$",
|
rf"^package/(?P<package_uuid>{UUID})/rule/(?P<rule_uuid>{UUID})/enzymelink/(?P<enzymelink_uuid>{UUID})$",
|
||||||
v.package_rule,
|
v.package_rule_enzymelink,
|
||||||
name="package rule detail",
|
name="package rule enzymelink detail",
|
||||||
|
),
|
||||||
|
re_path(
|
||||||
|
rf"^package/(?P<package_uuid>{UUID})/simple-ambit-rule/(?P<rule_uuid>{UUID})/enzymelink/(?P<enzymelink_uuid>{UUID})$",
|
||||||
|
v.package_rule_enzymelink,
|
||||||
|
name="package rule enzymelink detail",
|
||||||
|
),
|
||||||
|
re_path(
|
||||||
|
rf"^package/(?P<package_uuid>{UUID})/parallel-rule/(?P<rule_uuid>{UUID})/enzymelink/(?P<enzymelink_uuid>{UUID})$",
|
||||||
|
v.package_rule_enzymelink,
|
||||||
|
name="package rule enzymelink detail",
|
||||||
),
|
),
|
||||||
# Reaction
|
# Reaction
|
||||||
re_path(
|
re_path(
|
||||||
|
|||||||
@ -46,6 +46,7 @@ from .models import (
|
|||||||
Edge,
|
Edge,
|
||||||
ExternalDatabase,
|
ExternalDatabase,
|
||||||
ExternalIdentifier,
|
ExternalIdentifier,
|
||||||
|
EnzymeLink,
|
||||||
)
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -1528,6 +1529,32 @@ def package_rule(request, package_uuid, rule_uuid):
|
|||||||
return HttpResponseNotAllowed(["GET", "POST"])
|
return HttpResponseNotAllowed(["GET", "POST"])
|
||||||
|
|
||||||
|
|
||||||
|
@package_permission_required()
|
||||||
|
def package_rule_enzymelink(request, package_uuid, rule_uuid, enzymelink_uuid):
|
||||||
|
current_user = _anonymous_or_real(request)
|
||||||
|
current_package = PackageManager.get_package_by_id(current_user, package_uuid)
|
||||||
|
current_rule = Rule.objects.get(package=current_package, uuid=rule_uuid)
|
||||||
|
current_enzymelink = EnzymeLink.objects.get(rule=current_rule, uuid=enzymelink_uuid)
|
||||||
|
|
||||||
|
if request.method == "GET":
|
||||||
|
context = get_base_context(request)
|
||||||
|
|
||||||
|
context["title"] = f"enviPath - {current_package.name} - {current_rule.name}"
|
||||||
|
|
||||||
|
context["meta"]["current_package"] = current_package
|
||||||
|
context["object_type"] = "enzyme"
|
||||||
|
context["breadcrumbs"] = breadcrumbs(
|
||||||
|
current_package, "rule", current_rule, "enzymelink", current_enzymelink
|
||||||
|
)
|
||||||
|
|
||||||
|
context["enzymelink"] = current_enzymelink
|
||||||
|
context["current_object"] = current_enzymelink
|
||||||
|
|
||||||
|
return render(request, "objects/enzymelink.html", context)
|
||||||
|
|
||||||
|
return HttpResponseNotAllowed(["GET"])
|
||||||
|
|
||||||
|
|
||||||
@package_permission_required()
|
@package_permission_required()
|
||||||
def package_reactions(request, package_uuid):
|
def package_reactions(request, package_uuid):
|
||||||
current_user = _anonymous_or_real(request)
|
current_user = _anonymous_or_real(request)
|
||||||
|
|||||||
@ -12,7 +12,6 @@ dependencies = [
|
|||||||
"django-ninja>=1.4.1",
|
"django-ninja>=1.4.1",
|
||||||
"django-oauth-toolkit>=3.0.1",
|
"django-oauth-toolkit>=3.0.1",
|
||||||
"django-polymorphic>=4.1.0",
|
"django-polymorphic>=4.1.0",
|
||||||
"django-stubs>=5.2.4",
|
|
||||||
"enviformer",
|
"enviformer",
|
||||||
"envipy-additional-information",
|
"envipy-additional-information",
|
||||||
"envipy-ambit>=0.1.0",
|
"envipy-ambit>=0.1.0",
|
||||||
@ -33,12 +32,14 @@ dependencies = [
|
|||||||
[tool.uv.sources]
|
[tool.uv.sources]
|
||||||
enviformer = { git = "ssh://git@git.envipath.com/enviPath/enviformer.git", rev = "v0.1.2" }
|
enviformer = { git = "ssh://git@git.envipath.com/enviPath/enviformer.git", rev = "v0.1.2" }
|
||||||
envipy-plugins = { git = "ssh://git@git.envipath.com/enviPath/enviPy-plugins.git", rev = "v0.1.0" }
|
envipy-plugins = { git = "ssh://git@git.envipath.com/enviPath/enviPy-plugins.git", rev = "v0.1.0" }
|
||||||
envipy-additional-information = { git = "ssh://git@git.envipath.com/enviPath/enviPy-additional-information.git", rev = "v0.1.4"}
|
envipy-additional-information = { git = "ssh://git@git.envipath.com/enviPath/enviPy-additional-information.git", rev = "v0.1.7"}
|
||||||
envipy-ambit = { git = "ssh://git@git.envipath.com/enviPath/enviPy-ambit.git" }
|
envipy-ambit = { git = "ssh://git@git.envipath.com/enviPath/enviPy-ambit.git" }
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
ms-login = ["msal>=1.33.0"]
|
ms-login = ["msal>=1.33.0"]
|
||||||
dev = [
|
dev = [
|
||||||
|
"celery-stubs==0.1.3",
|
||||||
|
"django-stubs>=5.2.4",
|
||||||
"poethepoet>=0.37.0",
|
"poethepoet>=0.37.0",
|
||||||
"pre-commit>=4.3.0",
|
"pre-commit>=4.3.0",
|
||||||
"ruff>=0.13.3",
|
"ruff>=0.13.3",
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<p>
|
<p>
|
||||||
{{ rule.description }}
|
{{ rule.description|safe }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -87,6 +87,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if rule.enzymelinks %}
|
||||||
<!-- EC Numbers -->
|
<!-- EC Numbers -->
|
||||||
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
<h4 class="panel-title">
|
<h4 class="panel-title">
|
||||||
@ -94,12 +95,33 @@
|
|||||||
href="#rule-ec-numbers">EC Numbers</a>
|
href="#rule-ec-numbers">EC Numbers</a>
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div id="rule-ec-numbers" class="panel-collapse collapse">
|
<div id="rule-ec-numbers" class="panel-collapse collapse in">
|
||||||
<div class="panel-body list-group-item">
|
<div class="panel-body list-group-item">
|
||||||
|
{% for k, v in rule.get_grouped_enzymelinks.items %}
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="{{ k|slugify }}_Link" data-toggle="collapse"
|
||||||
|
data-parent="#{{ k|slugify }}_Accordion"
|
||||||
|
href="#{{ k|slugify }}">
|
||||||
|
{{ k }}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="{{ k|slugify }}" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{% for enzyme in v %}
|
||||||
|
<a class="list-group-item" href="{{ enzyme.url }}">
|
||||||
|
{{ enzyme.ec_number }}
|
||||||
|
<div style="position:absolute;bottom:10px;left:100px;">{{ enzyme.name }}</div>
|
||||||
|
<div style="float:right;">{{ enzyme.linking_method }}</div>
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
105
templates/objects/enzymelink.html
Normal file
105
templates/objects/enzymelink.html
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
{% extends "framework.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<div class="panel-group" id="enzyme-detail">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading" id="headingPanel" style="font-size:2rem;height: 46px">
|
||||||
|
{{ enzymelink.ec_number }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Name -->
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="enzyme-name-link" data-toggle="collapse" data-parent="#enzyme-detail"
|
||||||
|
href="#enzyme-name">Enzyme Name</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="enzyme-name" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{{ enzymelink.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Linking Method -->
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="enzyme-linking-link" data-toggle="collapse" data-parent="#enzyme-detail"
|
||||||
|
href="#enzyme-linking">Linking Method</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="enzyme-linking" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{{ enzymelink.linking_method }}. <a
|
||||||
|
href="https://wiki.envipath.org/index.php/Rules#EnzymeLinks" target="#">Learn more >></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if enzymelink.kegg_reaction_links %}
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="enzyme-evidence-link" data-toggle="collapse" data-parent="#enzyme-detail"
|
||||||
|
href="#enzyme-evidence">Linking Evidence</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="enzyme-evidence" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{% for kl in enzymelink.kegg_reaction_links %}
|
||||||
|
<a class="list-group-item"
|
||||||
|
href="{{ kl.external_url }}">{{ kl.identifier_value }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if enzymelink.reaction_evidence.all %}
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="enzyme-reaction-evidence-link" data-toggle="collapse" data-parent="#enzyme-detail"
|
||||||
|
href="#enzyme-reaction-evidence">Linking Evidence - enviPath Reactions</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="enzyme-reaction-evidence" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{% for r in enzymelink.reaction_evidence.all %}
|
||||||
|
<a class="list-group-item" href="{{ r.url }}">{{ r.name }} <i>({{ r.package.name }})</i></a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if enzymelink.edge_evidence.all %}
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="enzyme-edge-evidence-link" data-toggle="collapse" data-parent="#enzyme-detail"
|
||||||
|
href="#enzyme-edge-evidence">Linking Evidence - enviPath Pathways</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="enzyme-edge-evidence" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{% for e in enzymelink.edge_evidence.all %}
|
||||||
|
<a class="list-group-item" href="{{ e.pathway.url }}">{{ e.pathway.name }}
|
||||||
|
<i>({{ r.package.name }})</i></a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<!-- External DB Reference -->
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="enzyme-external-identifier-link" data-toggle="collapse" data-parent="#enzyme-detail"
|
||||||
|
href="#enzyme-external-identifier">External DB References</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="enzyme-external-identifier" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
<a class="list-group-item"
|
||||||
|
href="http://www.brenda-enzymes.org/enzyme.php?ecno={{ enzymelink.ec_number }}"
|
||||||
|
target="_blank"> Brenda entry for {{ enzymelink.ec_number }}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
||||||
@ -124,6 +124,23 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if reaction.get_related_enzymes %}
|
||||||
|
<!-- EC Numbers -->
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="rule-ec-numbers-link" data-toggle="collapse" data-parent="#rule-detail"
|
||||||
|
href="#rule-ec-numbers">EC Numbers</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="rule-ec-numbers" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{% for e in reaction.get_related_enzymes %}
|
||||||
|
<a class="list-group-item" href="http://www.brenda-enzymes.org/enzyme.php?ecno={{ e.ec_number }}">{{ e.name }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if reaction.related_pathways %}
|
{% if reaction.related_pathways %}
|
||||||
<!-- Pathways -->
|
<!-- Pathways -->
|
||||||
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
|||||||
@ -201,6 +201,43 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if rule.enzymelinks %}
|
||||||
|
<!-- EC Numbers -->
|
||||||
|
<div class="panel panel-default panel-heading list-group-item" style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="rule-ec-numbers-link" data-toggle="collapse" data-parent="#rule-detail"
|
||||||
|
href="#rule-ec-numbers">EC Numbers</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="rule-ec-numbers" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{% for k, v in rule.get_grouped_enzymelinks.items %}
|
||||||
|
<div class="panel panel-default panel-heading list-group-item"
|
||||||
|
style="background-color:silver">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a id="{{ k|slugify }}_Link" data-toggle="collapse"
|
||||||
|
data-parent="#{{ k|slugify }}_Accordion"
|
||||||
|
href="#{{ k|slugify }}">
|
||||||
|
{{ k }}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="{{ k|slugify }}" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body list-group-item">
|
||||||
|
{% for enzyme in v %}
|
||||||
|
<a class="list-group-item" href="{{ enzyme.url }}">
|
||||||
|
{{ enzyme.ec_number }}
|
||||||
|
<div style="position:absolute;bottom:10px;left:100px;">{{ enzyme.name }}</div>
|
||||||
|
<div style="float:right;">{{ enzyme.linking_method }}</div>
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
Reference in New Issue
Block a user