Skip to content
Snippets Groups Projects
Commit 09bbaefb authored by Hartung, Michael's avatar Hartung, Michael
Browse files

Merge branch 'development' of...

Merge branch 'development' of gitlab.rrz.uni-hamburg.de:cosy-bio/drugst.one/backend into development
parents 3d379eb8 e8d6a3cc
No related branches found
No related tags found
No related merge requests found
.git .git
data
venv
...@@ -7,10 +7,10 @@ venv/ ...@@ -7,10 +7,10 @@ venv/
*.DS_Store *.DS_Store
db.sqlite3 db.sqlite3
supervisord.log supervisord.log
supervisord.log
supervisord.pid supervisord.pid
docker-entrypoint.lock docker-entrypoint.lock
celerybeat-schedule.bak celerybeat-schedule.bak
celerybeat-schedule.dat celerybeat-schedule.dat
celerybeat-schedule.dir celerybeat-schedule.dir
docker-django.env.prodnetworks.zip docker-django.env.prodnetworks.zip
data/Networks/
...@@ -26,3 +26,7 @@ python3 manage.py make_graphs ...@@ -26,3 +26,7 @@ python3 manage.py make_graphs
### Docker DEV environment (building is optional) ### Docker DEV environment (building is optional)
``docker-compose -f docker-compose.yml up -d --build`` ``docker-compose -f docker-compose.yml up -d --build``
### Data folder
Static datasets are mounted from a directory now, instead of fusing them into the image. Download them from the following link and put them into the data folder that is mounted by the docker-compose.yml:
https://wolken.zbh.uni-hamburg.de/index.php/s/gywnL3HP26CWrgA
...@@ -13,7 +13,7 @@ services: ...@@ -13,7 +13,7 @@ services:
restart: always restart: always
volumes: volumes:
- drugstone_db_schema_volume:/usr/src/drugstone/drugstone/migrations - drugstone_db_schema_volume:/usr/src/drugstone/drugstone/migrations
- drugstone_data_volume:/usr/src/drugstone/data - ./data:/usr/src/drugstone/data
ports: ports:
- 8001:8000 - 8001:8000
networks: networks:
...@@ -60,7 +60,7 @@ services: ...@@ -60,7 +60,7 @@ services:
container_name: drugstone_celery container_name: drugstone_celery
hostname: drugstone_celery hostname: drugstone_celery
volumes: volumes:
- drugstone_data_volume:/usr/src/drugstone/data - ./data:/usr/src/drugstone/data
env_file: env_file:
- './docker-django.env.dev' - './docker-django.env.dev'
depends_on: depends_on:
......
...@@ -256,8 +256,8 @@ class NedrexImporter: ...@@ -256,8 +256,8 @@ class NedrexImporter:
iter_edge_collection('drug_has_target', add_dpi) iter_edge_collection('drug_has_target', add_dpi)
models.ProteinDrugInteraction.objects.bulk_create(bulk) models.ProteinDrugInteraction.objects.bulk_create(bulk)
new_datasets = [dataset].extend(source_datasets.values()) # new_datasets = [dataset].extend(source_datasets.values())
DatasetLoader.remove_old_pdi_data(new_datasets, licenced) # DatasetLoader.remove_old_pdi_data(new_datasets, licenced)
return len(bulk) return len(bulk)
def import_protein_protein_interactions(self, dataset: PPIDataset, update): def import_protein_protein_interactions(self, dataset: PPIDataset, update):
...@@ -316,8 +316,8 @@ class NedrexImporter: ...@@ -316,8 +316,8 @@ class NedrexImporter:
iter_ppi(add_ppi) iter_ppi(add_ppi)
models.ProteinProteinInteraction.objects.bulk_create(bulk) models.ProteinProteinInteraction.objects.bulk_create(bulk)
new_datasets = [dataset, source_datasets.values()] # new_datasets = [dataset, source_datasets.values()]
DatasetLoader.remove_old_ppi_data(new_datasets, licenced) # DatasetLoader.remove_old_ppi_data(new_datasets, licenced)
return len(bulk) return len(bulk)
def import_protein_disorder_associations(self, dataset, update): def import_protein_disorder_associations(self, dataset, update):
...@@ -367,8 +367,8 @@ class NedrexImporter: ...@@ -367,8 +367,8 @@ class NedrexImporter:
iter_edge_collection('gene_associated_with_disorder', add_pdis) iter_edge_collection('gene_associated_with_disorder', add_pdis)
models.ProteinDisorderAssociation.objects.bulk_create(bulk) models.ProteinDisorderAssociation.objects.bulk_create(bulk)
new_datasets = [dataset, source_datasets.values()] # new_datasets = [dataset, source_datasets.values()]
DatasetLoader.remove_old_pdis_data(new_datasets, licenced) # DatasetLoader.remove_old_pdis_data(new_datasets, licenced)
return len(bulk) return len(bulk)
def import_drug_disorder_indications(self, dataset, update): def import_drug_disorder_indications(self, dataset, update):
...@@ -416,6 +416,6 @@ class NedrexImporter: ...@@ -416,6 +416,6 @@ class NedrexImporter:
iter_edge_collection('drug_has_indication', add_drdis) iter_edge_collection('drug_has_indication', add_drdis)
models.DrugDisorderIndication.objects.bulk_create(bulk) models.DrugDisorderIndication.objects.bulk_create(bulk)
new_datasets = [dataset, source_datasets.values()] # new_datasets = [dataset, source_datasets.values()]
DatasetLoader.remove_old_drdi_data(new_datasets, licenced) # DatasetLoader.remove_old_drdi_data(new_datasets, licenced)
return len(bulk) return len(bulk)
...@@ -10,8 +10,8 @@ from drugstone.management.includes.DataPopulator import DataPopulator ...@@ -10,8 +10,8 @@ from drugstone.management.includes.DataPopulator import DataPopulator
from .import_from_nedrex import NedrexImporter from .import_from_nedrex import NedrexImporter
from drugstone.management.includes.NodeCache import NodeCache from drugstone.management.includes.NodeCache import NodeCache
from drugstone.management.includes import DatasetLoader from drugstone.management.includes import DatasetLoader
from ..includes.DatasetLoader import remove_old_pdi_data, remove_old_ppi_data, remove_old_pdis_data, \ # from ..includes.DatasetLoader import remove_old_pdi_data, remove_old_ppi_data, remove_old_pdis_data, \
remove_old_drdi_data # remove_old_drdi_data
class DatabasePopulator: class DatabasePopulator:
......
...@@ -226,7 +226,7 @@ class DataLoader: ...@@ -226,7 +226,7 @@ class DataLoader:
# @staticmethod # @staticmethod
# def load_pdis_disgenet() -> pd.DataFrame: # def load_pdis_disgenet() -> pd.DataFrame:
# """Loads the DisGeNET PDis associations with UniprotAC Numbers and Mondo IDs # """Loads the DisGeNET PDis associations with Uniprot Numbers and Mondo IDs
# #
# Returns: # Returns:
# pd.DataFrame: columns "protein_name", "disorder_name" and "score" # pd.DataFrame: columns "protein_name", "disorder_name" and "score"
......
...@@ -300,61 +300,69 @@ def is_licenced_drdi_source(source): ...@@ -300,61 +300,69 @@ def is_licenced_drdi_source(source):
return False return False
def remove_old_pdi_data(new_datasets, licenced): # def remove_old_pdi_data(new_datasets, licenced):
for dataset in new_datasets: # if new_datasets is None:
print("Deleting all except "+str(dataset)) # return
try: # for dataset in new_datasets:
for d in models.PDIDataset.objects.filter(name=dataset.name, licenced=licenced): # print("Deleting all except "+str(dataset))
print("Testing: "+str(d)) # try:
if d != dataset: # for d in models.PDIDataset.objects.filter(name=dataset.name, licenced=licenced):
print("Deleting: "+str(d)) # print("Testing: "+str(d))
d.delete() # if d != dataset:
except Exception as e: # print("Deleting: "+str(d))
print("Error when trying to delete old datasets") # d.delete()
print(e) # except Exception as e:
continue # print("Error when trying to delete old datasets")
# print(e)
# continue
def remove_old_ppi_data(new_datasets, licenced):
for dataset in new_datasets:
print("Deleting all except " + str(dataset)) # def remove_old_ppi_data(new_datasets, licenced):
try: # if new_datasets is None:
for d in models.PPIDataset.objects.filter(name=dataset.name, licenced=licenced): # return
print("Testing: " + str(d)) # for dataset in new_datasets:
if d != dataset: # print("Deleting all except " + str(dataset))
print("Deleting: " + str(d)) # try:
d.delete() # for d in models.PPIDataset.objects.filter(name=dataset.name, licenced=licenced):
except Exception as e: # print("Testing: " + str(d))
print("Error when trying to delete old datasets") # if d != dataset:
print(e) # print("Deleting: " + str(d))
continue # d.delete()
# except Exception as e:
# print("Error when trying to delete old datasets")
def remove_old_pdis_data(new_datasets, licenced): # print(e)
for dataset in new_datasets: # continue
print("Deleting all except " + str(dataset))
try:
for d in models.PDisDataset.objects.filter(name=dataset.name, licenced=licenced): # def remove_old_pdis_data(new_datasets, licenced):
print("Testing: " + str(d)) # if new_datasets is None:
if d != dataset: # return
print("Deleting: " + str(d)) # for dataset in new_datasets:
d.delete() # print("Deleting all except " + str(dataset))
except Exception as e: # try:
print("Error when trying to delete old datasets") # for d in models.PDisDataset.objects.filter(name=dataset.name, licenced=licenced):
print(e) # print("Testing: " + str(d))
continue # if d != dataset:
# print("Deleting: " + str(d))
# d.delete()
def remove_old_drdi_data(new_datasets, licenced): # except Exception as e:
for dataset in new_datasets: # print("Error when trying to delete old datasets")
print("Deleting all except " + str(dataset)) # print(e)
try: # continue
for d in models.DrDiDataset.objects.filter(name=dataset.name, licenced=licenced):
print("Testing: " + str(d))
if d != dataset: # def remove_old_drdi_data(new_datasets, licenced):
print("Deleting: " + str(d)) # if new_datasets is None:
d.delete() # return
except Exception as e: # for dataset in new_datasets:
print("Error when trying to delete old datasets") # print("Deleting all except " + str(dataset))
print(e) # try:
continue # for d in models.DrDiDataset.objects.filter(name=dataset.name, licenced=licenced):
# print("Testing: " + str(d))
# if d != dataset:
# print("Deleting: " + str(d))
# d.delete()
# except Exception as e:
# print("Error when trying to delete old datasets")
# print(e)
# continue
...@@ -30,7 +30,7 @@ class DrDisDatasetSerializer(serializers.ModelSerializer): ...@@ -30,7 +30,7 @@ class DrDisDatasetSerializer(serializers.ModelSerializer):
class ProteinNodeSerializer(serializers.ModelSerializer): class ProteinNodeSerializer(serializers.ModelSerializer):
drugstone_id = serializers.SerializerMethodField() drugstone_id = serializers.SerializerMethodField()
uniprot_ac = serializers.SerializerMethodField() uniprot = serializers.SerializerMethodField()
symbol = serializers.SerializerMethodField() symbol = serializers.SerializerMethodField()
ensg = serializers.SerializerMethodField() ensg = serializers.SerializerMethodField()
entrez = serializers.SerializerMethodField() entrez = serializers.SerializerMethodField()
...@@ -38,7 +38,7 @@ class ProteinNodeSerializer(serializers.ModelSerializer): ...@@ -38,7 +38,7 @@ class ProteinNodeSerializer(serializers.ModelSerializer):
def get_drugstone_id(self, obj): def get_drugstone_id(self, obj):
return [f'p{obj.id}'] return [f'p{obj.id}']
def get_uniprot_ac(self, obj): def get_uniprot(self, obj):
return [obj.uniprot_code] return [obj.uniprot_code]
def get_symbol(self, obj): def get_symbol(self, obj):
...@@ -61,19 +61,19 @@ class ProteinNodeSerializer(serializers.ModelSerializer): ...@@ -61,19 +61,19 @@ class ProteinNodeSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Protein model = Protein
fields = ['drugstone_id', 'uniprot_ac', 'symbol', 'protein_name', 'entrez', 'ensg'] fields = ['drugstone_id', 'uniprot', 'symbol', 'protein_name', 'entrez', 'ensg']
class ProteinSerializer(serializers.ModelSerializer): class ProteinSerializer(serializers.ModelSerializer):
drugstone_id = serializers.SerializerMethodField() drugstone_id = serializers.SerializerMethodField()
uniprot_ac = serializers.SerializerMethodField() uniprot = serializers.SerializerMethodField()
symbol = serializers.SerializerMethodField() symbol = serializers.SerializerMethodField()
ensg = serializers.SerializerMethodField() ensg = serializers.SerializerMethodField()
def get_drugstone_id(self, obj): def get_drugstone_id(self, obj):
return f'p{obj.id}' return f'p{obj.id}'
def get_uniprot_ac(self, obj): def get_uniprot(self, obj):
return obj.uniprot_code return obj.uniprot_code
def get_symbol(self, obj): def get_symbol(self, obj):
...@@ -93,7 +93,7 @@ class ProteinSerializer(serializers.ModelSerializer): ...@@ -93,7 +93,7 @@ class ProteinSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Protein model = Protein
fields = ['drugstone_id', 'uniprot_ac', 'symbol', 'protein_name', 'entrez', 'ensg'] fields = ['drugstone_id', 'uniprot', 'symbol', 'protein_name', 'entrez', 'ensg']
class DrugSerializer(serializers.ModelSerializer): class DrugSerializer(serializers.ModelSerializer):
......
...@@ -30,7 +30,7 @@ def query_proteins_by_identifier(node_ids: Set[str], identifier: str) -> Tuple[L ...@@ -30,7 +30,7 @@ def query_proteins_by_identifier(node_ids: Set[str], identifier: str) -> Tuple[L
protein_attribute = 'symbol' protein_attribute = 'symbol'
q_list = map(lambda n: Q(gene__iexact=n), node_ids) q_list = map(lambda n: Q(gene__iexact=n), node_ids)
elif identifier == 'uniprot': elif identifier == 'uniprot':
protein_attribute = 'uniprot_ac' protein_attribute = 'uniprot'
q_list = map(lambda n: Q(uniprot_code__iexact=n), node_ids) q_list = map(lambda n: Q(uniprot_code__iexact=n), node_ids)
elif identifier == 'ensg' or identifier == 'ensembl': elif identifier == 'ensg' or identifier == 'ensembl':
protein_attribute = 'ensg' protein_attribute = 'ensg'
...@@ -66,7 +66,7 @@ def query_proteins_by_identifier(node_ids: Set[str], identifier: str) -> Tuple[L ...@@ -66,7 +66,7 @@ def query_proteins_by_identifier(node_ids: Set[str], identifier: str) -> Tuple[L
def get_protein_ids(id_space, proteins): def get_protein_ids(id_space, proteins):
if (id_space == 'uniprot'): if (id_space == 'uniprot'):
return [p['uniprot_ac'] for p in proteins] return [p['uniprot'] for p in proteins]
if (id_space == 'ensg' or id_space == 'ensembl'): if (id_space == 'ensg' or id_space == 'ensembl'):
return [p['ensg'] for p in proteins] return [p['ensg'] for p in proteins]
if (id_space == 'symbol'): if (id_space == 'symbol'):
......
...@@ -60,10 +60,6 @@ class TaskView(APIView): ...@@ -60,10 +60,6 @@ class TaskView(APIView):
parameters = request.data['parameters'] parameters = request.data['parameters']
licenced = parameters.get('licenced', False) licenced = parameters.get('licenced', False)
print(models.PDIDataset.objects.all())
print(get_ppi_ds(parameters.get('ppi_dataset', DEFAULTS['ppi']), licenced))
print(get_pdi_ds(parameters.get('pdi_dataset', DEFAULTS['pdi']), licenced))
# find databases based on parameter strings # find databases based on parameter strings
parameters['ppi_dataset'] = PPIDatasetSerializer().to_representation( parameters['ppi_dataset'] = PPIDatasetSerializer().to_representation(
...@@ -172,7 +168,6 @@ def map_nodes(request) -> Response: ...@@ -172,7 +168,6 @@ def map_nodes(request) -> Response:
# change data structure to dict in order to be quicker when merging # change data structure to dict in order to be quicker when merging
nodes_mapped_dict = {id.upper(): node for node in nodes_mapped for id in node[id_key]} nodes_mapped_dict = {id.upper(): node for node in nodes_mapped for id in node[id_key]}
print(nodes_mapped_dict)
# merge fetched data with given data to avoid data loss # merge fetched data with given data to avoid data loss
for node in nodes: for node in nodes:
...@@ -231,13 +226,29 @@ def create_network(request) -> Response: ...@@ -231,13 +226,29 @@ def create_network(request) -> Response:
return Response(id) return Response(id)
def latest_datasets(ds):
dataset_dict = {}
for d in ds:
name = d.name + "_" + str(d.licenced)
if name not in dataset_dict:
dataset_dict[name] = d
continue
if dataset_dict[name].version < d.version:
dataset_dict[name] = d
return dataset_dict.values()
@api_view(['GET']) @api_view(['GET'])
def get_datasets(request) -> Response: def get_datasets(request) -> Response:
datasets = {} datasets = {}
datasets['protein-protein'] = PPIDatasetSerializer(many=True).to_representation(PPIDataset.objects.all()) datasets['protein-protein'] = PPIDatasetSerializer(many=True).to_representation(
datasets['protein-drug'] = PDIDatasetSerializer(many=True).to_representation(PDIDataset.objects.all()) latest_datasets(PPIDataset.objects.all()))
datasets['protein-disorder'] = PDisDatasetSerializer(many=True).to_representation(PDisDataset.objects.all()) datasets['protein-drug'] = PDIDatasetSerializer(many=True).to_representation(
datasets['drug-disorder'] = DrDisDatasetSerializer(many=True).to_representation(DrDiDataset.objects.all()) latest_datasets(PDIDataset.objects.all()))
datasets['protein-disorder'] = PDisDatasetSerializer(many=True).to_representation(
latest_datasets(PDisDataset.objects.all()))
datasets['drug-disorder'] = DrDisDatasetSerializer(many=True).to_representation(
latest_datasets(DrDiDataset.objects.all()))
return Response(datasets) return Response(datasets)
...@@ -275,6 +286,7 @@ def result_view(request) -> Response: ...@@ -275,6 +286,7 @@ def result_view(request) -> Response:
if not node_types: if not node_types:
node_types = {} node_types = {}
node_attributes['node_types'] = node_types node_attributes['node_types'] = node_types
is_seed = node_attributes.get('is_seed') is_seed = node_attributes.get('is_seed')
if not is_seed: if not is_seed:
is_seed = {} is_seed = {}
...@@ -336,7 +348,7 @@ def result_view(request) -> Response: ...@@ -336,7 +348,7 @@ def result_view(request) -> Response:
else: else:
continue continue
nodes_mapped, _ = query_proteins_by_identifier(protein_nodes, identifier) nodes_mapped, identifier = query_proteins_by_identifier(protein_nodes, identifier)
nodes_mapped_dict = {node[identifier][0]: node for node in nodes_mapped} nodes_mapped_dict = {node[identifier][0]: node for node in nodes_mapped}
...@@ -366,11 +378,10 @@ def result_view(request) -> Response: ...@@ -366,11 +378,10 @@ def result_view(request) -> Response:
for node_id, detail in node_details.items(): for node_id, detail in node_details.items():
if 'drugstoneType' in detail and detail['drugstoneType'] == 'protein': if 'drugstoneType' in detail and detail['drugstoneType'] == 'protein':
detail['symbol'] = list(set(detail['symbol'])) detail['symbol'] = list(set(detail['symbol'])) if 'symbol' in detail else []
detail['entrez'] = list(set(detail['entrez'])) detail['entrez'] = list(set(detail['entrez'])) if 'entrez' in detail else []
detail['uniprot_ac'] = list(set(detail['uniprot_ac'])) detail['uniprot'] = list(set(detail['uniprot'])) if 'uniprot' in detail else []
if 'ensg' in detail: detail['ensg'] = list(set(detail['ensg'])) if 'ensg' in detail else []
detail['ensg'] = list(set(detail['ensg']))
edges = parameters['input_network']['edges'] edges = parameters['input_network']['edges']
...@@ -420,7 +431,7 @@ def result_view(request) -> Response: ...@@ -420,7 +431,7 @@ def result_view(request) -> Response:
for i in proteins: for i in proteins:
new_i = { new_i = {
'id': i['id'], 'id': i['id'],
'uniprot_ac': i['uniprot_ac'] if 'uniprot_ac' in i else [], 'uniprot': i['uniprot'] if 'uniprot' in i else [],
'gene': i['symbol'] if 'symbol' in i else [], 'gene': i['symbol'] if 'symbol' in i else [],
'name': i['protein_name'] if 'protein_name' in i else [], 'name': i['protein_name'] if 'protein_name' in i else [],
'ensembl': i['ensg'] if 'ensg' in i else [], 'ensembl': i['ensg'] if 'ensg' in i else [],
...@@ -463,9 +474,11 @@ def graph_export(request) -> Response: ...@@ -463,9 +474,11 @@ def graph_export(request) -> Response:
Recieve whole graph data and write it to graphml file. Return the Recieve whole graph data and write it to graphml file. Return the
file ready to download. file ready to download.
""" """
remove_node_properties = ['color', 'shape', 'border_width', 'group_name', 'border_width_selected', 'shadow', remove_node_properties = ['color', 'shape', 'border_width', 'group', 'border_width_selected', 'shadow',
'group_id', 'drugstone_type', 'font', 'x', 'y'] 'group_id', 'drugstone_type', 'font', 'x', 'y', '_group']
remove_edge_properties = ['group_name', 'color', 'dashes', 'shadow', 'id'] rename_node_properties = {'group_name': 'group'}
remove_edge_properties = ['group', 'color', 'dashes', 'shadow', 'id']
rename_edge_properties = {'group_name': 'group'}
nodes = request.data.get('nodes', []) nodes = request.data.get('nodes', [])
edges = request.data.get('edges', []) edges = request.data.get('edges', [])
fmt = request.data.get('fmt', 'graphml') fmt = request.data.get('fmt', 'graphml')
...@@ -476,6 +489,10 @@ def graph_export(request) -> Response: ...@@ -476,6 +489,10 @@ def graph_export(request) -> Response:
for prop in remove_node_properties: for prop in remove_node_properties:
if prop in node: if prop in node:
del node[prop] del node[prop]
for k, v in rename_node_properties.items():
if k in node:
node[v] = node[k]
del node[k]
for key in list(node.keys()): for key in list(node.keys()):
if isinstance(node[key], list) or isinstance(node[key], dict): if isinstance(node[key], list) or isinstance(node[key], dict):
node[key] = json.dumps(node[key]) node[key] = json.dumps(node[key])
...@@ -497,6 +514,10 @@ def graph_export(request) -> Response: ...@@ -497,6 +514,10 @@ def graph_export(request) -> Response:
for prop in remove_edge_properties: for prop in remove_edge_properties:
if prop in e: if prop in e:
del e[prop] del e[prop]
for k, v in rename_edge_properties.items():
if k in e:
e[v] = e[k]
del e[k]
for key in e: for key in e:
if isinstance(e[key], list) or isinstance(e[key], dict): if isinstance(e[key], list) or isinstance(e[key], dict):
e[key] = json.dumps(e[key]) e[key] = json.dumps(e[key])
......
...@@ -3,9 +3,9 @@ celery==5.2.7 ...@@ -3,9 +3,9 @@ celery==5.2.7
certifi==2022.12.7 certifi==2022.12.7
chardet==3.0.4 chardet==3.0.4
click==8.1.3 click==8.1.3
cryptography==38.0.3 cryptography==39.0.1
decorator==4.4.2 decorator==4.4.2
Django==3.2.16 Django==3.2.17
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
......
...@@ -11,4 +11,5 @@ else ...@@ -11,4 +11,5 @@ else
python3 manage.py populate_db --update -a python3 manage.py populate_db --update -a
python3 manage.py make_graphs python3 manage.py make_graphs
fi fi
/usr/bin/supervisord -c "/etc/supervisor/conf.d/supervisord.conf" /usr/bin/supervisord -c "/etc/supervisor/conf.d/supervisord.conf"
from tasks.task_hook import TaskHook from tasks.task_hook import TaskHook
def quick_task(task_hook: TaskHook): def quick_task(task_hook: TaskHook):
def run_closeness(parameters, network): def run_closeness(parameters, network, original_seeds=None):
from .closeness_centrality import closeness_centrality from .closeness_centrality import closeness_centrality
def closeness_progress(progress, status): def closeness_progress(progress, status):
...@@ -9,6 +10,8 @@ def quick_task(task_hook: TaskHook): ...@@ -9,6 +10,8 @@ def quick_task(task_hook: TaskHook):
def closeness_set_result(result): def closeness_set_result(result):
result["network"]["edges"].extend(network["edges"]) result["network"]["edges"].extend(network["edges"])
if original_seeds is not None:
result['node_attributes']['is_seed'] = original_seeds
task_hook.set_results(result) task_hook.set_results(result)
# Prepare intermediate hook # Prepare intermediate hook
...@@ -20,7 +23,6 @@ def quick_task(task_hook: TaskHook): ...@@ -20,7 +23,6 @@ def quick_task(task_hook: TaskHook):
# Run closeness centrality # Run closeness centrality
closeness_centrality(closeness_task_hook) closeness_centrality(closeness_task_hook)
def run_multi_steiner(parameters): def run_multi_steiner(parameters):
from .multi_steiner import multi_steiner from .multi_steiner import multi_steiner
...@@ -35,7 +37,7 @@ def quick_task(task_hook: TaskHook): ...@@ -35,7 +37,7 @@ def quick_task(task_hook: TaskHook):
if len(seeds) == 0: if len(seeds) == 0:
task_hook.set_results({"network": {"nodes": [], "edges": []}}) task_hook.set_results({"network": {"nodes": [], "edges": []}})
return return
og_seeds = parameters.get('seeds')
parameters.update({ parameters.update({
"seeds": seeds, "seeds": seeds,
"result_size": 10, "result_size": 10,
...@@ -43,7 +45,11 @@ def quick_task(task_hook: TaskHook): ...@@ -43,7 +45,11 @@ def quick_task(task_hook: TaskHook):
"target": "drug", "target": "drug",
"include_non_approved_drugs": True "include_non_approved_drugs": True
}) })
run_closeness(parameters, result["network"]) is_seed = result.get('node_attributes')
run_closeness(parameters, result["network"], result['node_attributes']['is_seed'])
# parameters.update({
# "seeds": og_seeds
# })
parameters["num_trees"] = 1 parameters["num_trees"] = 1
parameters["hub_penalty"] = 1 parameters["hub_penalty"] = 1
......
...@@ -12,14 +12,14 @@ def scores_to_results( ...@@ -12,14 +12,14 @@ def scores_to_results(
pdi_dataset, pdi_dataset,
filterPaths filterPaths
): ):
r"""Transforms the scores to the required result format.""" r"""Transforms the scores to the required result format."""
node_name_attribute = "internal_id" # nodes in the input network which is created from RepoTrialDB have primaryDomainId as name attribute node_name_attribute = "internal_id" # nodes in the input network which is created from RepoTrialDB have primaryDomainId as name attribute
if target == "drug": if target == "drug":
candidates = [(node, scores[node]) for node in drug_ids if scores[node] > 0] candidates = [(node, scores[node]) for node in drug_ids if scores[node] > 0]
else: else:
candidates = [(node, scores[node]) for node in range(g.num_vertices()) if scores[node] > 0 and node not in set(seed_ids)] candidates = [(node, scores[node]) for node in range(g.num_vertices()) if
scores[node] > 0 and node not in set(seed_ids)]
best_candidates = [item[0] for item in sorted(candidates, key=lambda item: item[1], reverse=True)[:result_size]] best_candidates = [item[0] for item in sorted(candidates, key=lambda item: item[1], reverse=True)[:result_size]]
# Concatenate best result candidates with seeds and compute induced subgraph. # Concatenate best result candidates with seeds and compute induced subgraph.
# since the result size filters out nodes, the result network is not complete anymore. # since the result size filters out nodes, the result network is not complete anymore.
...@@ -29,7 +29,7 @@ def scores_to_results( ...@@ -29,7 +29,7 @@ def scores_to_results(
intermediate_nodes = set() intermediate_nodes = set()
returned_edges = set() returned_edges = set()
returned_nodes = set(seed_ids) # return seed_ids in any case returned_nodes = set(seed_ids) # return seed_ids in any case
# return only the path to a drug with the shortest distance # return only the path to a drug with the shortest distance
accepted_candidates = set() accepted_candidates = set()
...@@ -44,11 +44,15 @@ def scores_to_results( ...@@ -44,11 +44,15 @@ def scores_to_results(
vertices, edges = gtt.shortest_path(g, candidate, seed_id) vertices, edges = gtt.shortest_path(g, candidate, seed_id)
drug_in_path = False drug_in_path = False
seed_in_path = False
for vertex in vertices: for vertex in vertices:
if g.vertex_properties["type"][int(vertex)] == "drug" and vertex != candidate: if g.vertex_properties["type"][int(vertex)] == "drug" and vertex != candidate:
drug_in_path = True drug_in_path = True
break break
if drug_in_path: if int(vertex) in seed_ids and int(vertex) != seed_id:
seed_in_path = True
break
if drug_in_path or seed_in_path:
continue continue
accepted_candidates.add(g.vertex_properties[node_name_attribute][int(candidate)]) accepted_candidates.add(g.vertex_properties[node_name_attribute][int(candidate)])
for vertex in vertices: for vertex in vertices:
...@@ -58,7 +62,8 @@ def scores_to_results( ...@@ -58,7 +62,8 @@ def scores_to_results(
intermediate_nodes.add(g.vertex_properties[node_name_attribute][int(vertex)]) intermediate_nodes.add(g.vertex_properties[node_name_attribute][int(vertex)])
returned_nodes.add(int(vertex)) returned_nodes.add(int(vertex))
for edge in edges: for edge in edges:
if ((edge.source(), edge.target()) not in returned_edges) or ((edge.target(), edge.source()) not in returned_edges): if (((edge.source(), edge.target()) not in returned_edges) or (
(edge.target(), edge.source()) not in returned_edges)) and int(edge.target()) in returned_nodes and int(edge.source()) in returned_nodes:
returned_edges.add((edge.source(), edge.target())) returned_edges.add((edge.source(), edge.target()))
else: else:
for candidate in best_candidates: for candidate in best_candidates:
...@@ -66,11 +71,15 @@ def scores_to_results( ...@@ -66,11 +71,15 @@ def scores_to_results(
vertices, edges = gtt.shortest_path(g, candidate, seed_id) vertices, edges = gtt.shortest_path(g, candidate, seed_id)
drug_in_path = False drug_in_path = False
seed_in_path = False
for vertex in vertices: for vertex in vertices:
if g.vertex_properties["type"][int(vertex)] == "drug" and vertex != candidate: if g.vertex_properties["type"][int(vertex)] == "drug" and vertex != candidate:
drug_in_path = True drug_in_path = True
break break
if drug_in_path: if int(vertex) in seed_ids and int(vertex) != seed_id:
seed_in_path = True
break
if drug_in_path or seed_in_path:
continue continue
accepted_candidates.add(g.vertex_properties[node_name_attribute][int(candidate)]) accepted_candidates.add(g.vertex_properties[node_name_attribute][int(candidate)])
for vertex in vertices: for vertex in vertices:
...@@ -80,18 +89,22 @@ def scores_to_results( ...@@ -80,18 +89,22 @@ def scores_to_results(
intermediate_nodes.add(g.vertex_properties[node_name_attribute][int(vertex)]) intermediate_nodes.add(g.vertex_properties[node_name_attribute][int(vertex)])
returned_nodes.add(int(vertex)) returned_nodes.add(int(vertex))
for edge in edges: for edge in edges:
if ((edge.source(), edge.target()) not in returned_edges) or ((edge.target(), edge.source()) not in returned_edges): if (((edge.source(), edge.target()) not in returned_edges) or (
(edge.target(), edge.source()) not in returned_edges)) and int(
edge.target()) in returned_nodes and int(edge.source()) in returned_nodes:
returned_edges.add((edge.source(), edge.target())) returned_edges.add((edge.source(), edge.target()))
for node in accepted_candidates: for node in accepted_candidates:
if node in intermediate_nodes: if node in intermediate_nodes:
intermediate_nodes.remove(node) intermediate_nodes.remove(node)
subgraph = { subgraph = {
"nodes":[g.vertex_properties[node_name_attribute][node] for node in returned_nodes], "nodes": [g.vertex_properties[node_name_attribute][node] for node in returned_nodes],
"edges": [{"from": g.vertex_properties[node_name_attribute][source], "to": g.vertex_properties[node_name_attribute][target]} for source, target in returned_edges], "edges": [{"from": g.vertex_properties[node_name_attribute][source],
} "to": g.vertex_properties[node_name_attribute][target]} for source, target in returned_edges],
}
# Compute node attributes. # Compute node attributes.
node_types = {g.vertex_properties[node_name_attribute][node]: g.vertex_properties["type"][node] for node in returned_nodes} node_types = {g.vertex_properties[node_name_attribute][node]: g.vertex_properties["type"][node] for node in
returned_nodes}
is_seed = {g.vertex_properties[node_name_attribute][node]: node in set(seed_ids) for node in returned_nodes} is_seed = {g.vertex_properties[node_name_attribute][node]: node in set(seed_ids) for node in returned_nodes}
returned_scores = {g.vertex_properties[node_name_attribute][node]: scores[node] for node in returned_nodes} returned_scores = {g.vertex_properties[node_name_attribute][node]: scores[node] for node in returned_nodes}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment