Skip to content
Snippets Groups Projects
Commit 040ae50f authored by AndiMajore's avatar AndiMajore
Browse files

added drug-target action information

Former-commit-id: b20c62b41036bbf7aa7fcc8c7622c5f83c1fc5d3 [formerly 8c7f0c56bac0e15f052652a2281d739209fb0d7f]
Former-commit-id: 1d3b5790373ca6913a8e0f3346d1562bb925ddcc
parent 8c3c38ea
No related branches found
No related tags found
No related merge requests found
...@@ -8,10 +8,11 @@ ENV LC_ALL=C.UTF-8 ...@@ -8,10 +8,11 @@ ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8 ENV LANG=C.UTF-8
RUN apt update && apt upgrade -y RUN apt update && apt upgrade -y
RUN apt install -y supervisor nginx libgtk-3-dev wget RUN apt install -y supervisor nginx libgtk-3-dev
RUN conda install -y conda python=3.8 RUN conda install -y conda python=3.8
RUN conda install -c conda-forge -y graph-tool=2.46 #RUN conda install -c conda-forge -y graph-tool=2.46
RUN conda install -c conda-forge -y graph-tool=2.55
RUN pip install gunicorn RUN pip install gunicorn
......
...@@ -2,7 +2,6 @@ import os ...@@ -2,7 +2,6 @@ import os
from celery import Celery from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drugstone.settings') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drugstone.settings')
app = Celery('drugstone') app = Celery('drugstone')
......
import json
from collections import defaultdict from collections import defaultdict
import nedrex import nedrex
...@@ -245,7 +246,8 @@ class NedrexImporter: ...@@ -245,7 +246,8 @@ class NedrexImporter:
try: try:
drug = self.cache.get_drug_by_drugbank(to_id(edge['sourceDomainId'])) drug = self.cache.get_drug_by_drugbank(to_id(edge['sourceDomainId']))
protein = self.cache.get_protein_by_uniprot(to_id(edge['targetDomainId'])) protein = self.cache.get_protein_by_uniprot(to_id(edge['targetDomainId']))
e = models.ProteinDrugInteraction(pdi_dataset=dataset, drug=drug, protein=protein) actions = json.dumps(edge['actions'])
e = models.ProteinDrugInteraction(pdi_dataset=dataset, drug=drug, protein=protein, actions=actions)
if not update or e.__hash__() not in existing: if not update or e.__hash__() not in existing:
bulk.add(e) bulk.add(e)
for source in edge['dataSources']: for source in edge['dataSources']:
......
...@@ -272,6 +272,7 @@ class ProteinDrugInteraction(models.Model): ...@@ -272,6 +272,7 @@ class ProteinDrugInteraction(models.Model):
PDIDataset, null=True, on_delete=models.CASCADE, related_name='pdi_dataset_relation') PDIDataset, null=True, on_delete=models.CASCADE, related_name='pdi_dataset_relation')
protein = models.ForeignKey('Protein', on_delete=models.CASCADE) protein = models.ForeignKey('Protein', on_delete=models.CASCADE)
drug = models.ForeignKey('Drug', on_delete=models.CASCADE) drug = models.ForeignKey('Drug', on_delete=models.CASCADE)
actions = models.CharField(max_length=255, default='[]')
class Meta: class Meta:
unique_together = ('pdi_dataset', 'protein', 'drug') unique_together = ('pdi_dataset', 'protein', 'drug')
...@@ -280,13 +281,13 @@ class ProteinDrugInteraction(models.Model): ...@@ -280,13 +281,13 @@ class ProteinDrugInteraction(models.Model):
return f'{self.pdi_dataset}-{self.protein}-{self.drug}' return f'{self.pdi_dataset}-{self.protein}-{self.drug}'
def __eq__(self, other): def __eq__(self, other):
return self.pdi_dataset_id == other.pdi_dataset_id and self.protein_id == other.protein_id and self.drug_id == other.drug_id return self.pdi_dataset_id == other.pdi_dataset_id and self.protein_id == other.protein_id and self.drug_id == other.drug_id and self.actions == other.actions
def __ne__(self, other): def __ne__(self, other):
return not self.__eq__(other) return not self.__eq__(other)
def __hash__(self): def __hash__(self):
return hash((self.pdi_dataset_id, self.protein_id, self.drug_id)) return hash((self.pdi_dataset_id, self.protein_id, self.drug_id, self.actions))
class Task(models.Model): class Task(models.Model):
......
...@@ -157,6 +157,7 @@ class ProteinDrugInteractionSerializer(serializers.ModelSerializer): ...@@ -157,6 +157,7 @@ class ProteinDrugInteractionSerializer(serializers.ModelSerializer):
dataset = serializers.SerializerMethodField() dataset = serializers.SerializerMethodField()
protein = serializers.SerializerMethodField() protein = serializers.SerializerMethodField()
drug = serializers.SerializerMethodField() drug = serializers.SerializerMethodField()
actions = serializers.SerializerMethodField()
def get_dataset(self, obj): def get_dataset(self, obj):
return obj.pdi_dataset.name return obj.pdi_dataset.name
...@@ -167,9 +168,14 @@ class ProteinDrugInteractionSerializer(serializers.ModelSerializer): ...@@ -167,9 +168,14 @@ class ProteinDrugInteractionSerializer(serializers.ModelSerializer):
def get_drug(self, obj): def get_drug(self, obj):
return f'dr{obj.drug.id}' return f'dr{obj.drug.id}'
def get_actions(self, obj):
if obj.actions:
return json.loads(obj.actions)
return []
class Meta: class Meta:
model = ProteinDrugInteraction model = ProteinDrugInteraction
fields = ['dataset', 'protein', 'drug'] fields = ['dataset', 'protein', 'drug', 'actions']
class ProteinDisorderAssociationSerializer(serializers.ModelSerializer): class ProteinDisorderAssociationSerializer(serializers.ModelSerializer):
......
...@@ -423,6 +423,27 @@ def result_view(request) -> Response: ...@@ -423,6 +423,27 @@ def result_view(request) -> Response:
nodes_mapped, id_key = query_proteins_by_identifier(edge_endpoint_ids, identifier) nodes_mapped, id_key = query_proteins_by_identifier(edge_endpoint_ids, identifier)
pdi_config = result.get("parameters").get('pdi_dataset')
if pdi_config:
pdi_dataset = get_pdi_ds(pdi_config.get('name', DEFAULTS['pdi']), pdi_config.get('licenced', False))
for edge in result['network']['edges']:
if (edge['from'][:2] == 'dr'):
drug = edge['from']
edge['from'] = edge['to']
edge['to'] = drug
if (edge['to'][:2] == 'dr'):
drug_id = int(edge['to'][2:])
pdi_object = ProteinDrugInteraction.objects.filter(
protein_id__in={int(p[1:]) for p in node_attributes['details'][edge['from']]['drugstone_id']},
drug_id=drug_id, pdi_dataset_id=pdi_dataset.id)
actions = set()
for pdi in pdi_object:
if pdi.actions:
for action in json.loads(pdi.actions):
actions.add(action)
edge['actions'] = list(actions)
if 'autofill_edges' in parameters['config'] and parameters['config']['autofill_edges']: if 'autofill_edges' in parameters['config'] and parameters['config']['autofill_edges']:
prots = list(filter(lambda n: n['drugstone_type'] == 'protein', prots = list(filter(lambda n: n['drugstone_type'] == 'protein',
filter(lambda n: 'drugstone_type' in n and node_name_attribute in n, filter(lambda n: 'drugstone_type' in n and node_name_attribute in n,
...@@ -704,11 +725,13 @@ def save_selection(request) -> Response: ...@@ -704,11 +725,13 @@ def save_selection(request) -> Response:
config = request.data.get("config") config = request.data.get("config")
network = request.data.get("network") network = request.data.get("network")
Network.objects.create(id=token_str, config=json.dumps(config), nodes=json.dumps(network["nodes"]), edges=json.dumps(network["edges"])) Network.objects.create(id=token_str, config=json.dumps(config), nodes=json.dumps(network["nodes"]),
edges=json.dumps(network["edges"]))
return Response({ return Response({
'token': token_str, 'token': token_str,
}) })
@api_view(['GET']) @api_view(['GET'])
def get_view(request) -> Response: def get_view(request) -> Response:
token = request.query_params.get('token') token = request.query_params.get('token')
...@@ -726,7 +749,7 @@ def get_view(request) -> Response: ...@@ -726,7 +749,7 @@ def get_view(request) -> Response:
@api_view(['POST']) @api_view(['POST'])
def get_view_infos(request) -> Response: def get_view_infos(request) -> Response:
tokens = request.data.get('tokens') tokens = request.data.get('tokens')
networks = Network.objects.filter(id__in = tokens) networks = Network.objects.filter(id__in=tokens)
return Response([{ return Response([{
'token': n.id, 'token': n.id,
'created_at': n.created_at, 'created_at': n.created_at,
......
...@@ -5,7 +5,7 @@ chardet==3.0.4 ...@@ -5,7 +5,7 @@ chardet==3.0.4
click==8.1.3 click==8.1.3
cryptography==39.0.1 cryptography==39.0.1
decorator==4.4.2 decorator==4.4.2
Django==3.2.18 Django==3.2.19
django-cors-headers==3.4.0 django-cors-headers==3.4.0
django-redis==4.11.0 django-redis==4.11.0
django-rq-dashboard==0.3.3 django-rq-dashboard==0.3.3
...@@ -19,7 +19,7 @@ mccabe==0.6.1 ...@@ -19,7 +19,7 @@ mccabe==0.6.1
networkx==3.1 networkx==3.1
numpy==1.23.5 numpy==1.23.5
pandas==1.3.5 pandas==1.3.5
pillow==9.3.0 pillow==9.4.0
psycopg2-binary==2.8.6 psycopg2-binary==2.8.6
pycodestyle==2.5.0 pycodestyle==2.5.0
pyflakes==2.1.1 pyflakes==2.1.1
...@@ -30,5 +30,5 @@ requests==2.28.1 ...@@ -30,5 +30,5 @@ requests==2.28.1
rq==1.11.1 rq==1.11.1
six==1.15.0 six==1.15.0
sqlalchemy==1.3.23 sqlalchemy==1.3.23
sqlparse==0.4.2 sqlparse==0.4.4
urllib3==1.26.12 urllib3==1.26.12
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment