Skip to content

Commit 45c070b

Browse files
authoredMar 7, 2025··
Merge pull request #81 from daisybio/dev
combined sorting
2 parents 2e5810f + eee8fe0 commit 45c070b

File tree

3 files changed

+36
-36
lines changed

3 files changed

+36
-36
lines changed
 

‎app/controllers/geneInteraction.py

+11-13
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sqlalchemy as sa
22
import os
33
from flask import jsonify
4-
from sqlalchemy import desc, or_, and_
4+
from sqlalchemy import desc, literal_column, or_, and_
55
from sqlalchemy.sql import text
66
from app.controllers.dataset import _dataset_query
77
import app.models as models
@@ -1017,7 +1017,7 @@ def getGeneCounts(dataset_ID: int = None, disease_name=None, ensg_number=None, g
10171017
def get_gene_network(dataset_ID: int = None, disease_name=None,
10181018
minBetweenness:float = None, minNodeDegree:float = None, minEigenvector:float = None,
10191019
maxPValue=0.05, minMscor=None, minCorrelation=None,
1020-
edgeSorting: str = None, nodeSorting: str = None,
1020+
edgeSorting: str = None, nodeSorting: list[str] = None,
10211021
maxNodes: int = 100, maxEdges: int = 100,
10221022
offsetNodes: int = None, offsetEdges: int = None,
10231023
sponge_db_version: int = LATEST):
@@ -1032,7 +1032,7 @@ def get_gene_network(dataset_ID: int = None, disease_name=None,
10321032
:param minMscor: mscor cutoff (>)
10331033
:param minCorrelation: correlation cutoff (>)
10341034
:param edgeSorting: sorting key for edges
1035-
:param nodeSorting: sorting key for nodes
1035+
:param nodeSorting: sorting key(s) for nodes (options are 'betweenness', 'degree', 'eigenvector')
10361036
:param maxNodes: maximum number of nodes
10371037
:param maxEdges: maximum number of edges
10381038
:param offsetNodes: offset for node pagination
@@ -1080,17 +1080,15 @@ def get_gene_network(dataset_ID: int = None, disease_name=None,
10801080
if minEigenvector:
10811081
node_query = node_query.filter(models.networkAnalysis.eigenvector >= minEigenvector)
10821082

1083-
# Sorting nodes
1084-
if nodeSorting == "betweenness":
1085-
node_query = node_query.order_by(models.networkAnalysis.betweenness.desc())
1086-
elif nodeSorting == "degree":
1087-
node_query = node_query.order_by(models.networkAnalysis.node_degree.desc())
1088-
elif nodeSorting == "eigenvector":
1089-
node_query = node_query.order_by(models.networkAnalysis.eigenvector.desc())
1090-
else:
1091-
raise ValueError("Invalid node sorting key. Choose one of 'betweenness', 'degree', 'eigenvector'")
1083+
# Sorting nodes: if more than one sorting key, rank by each key individually and sort by the mean of the ranks
1084+
if nodeSorting:
1085+
if any([key not in ['betweenness', 'node_degree', 'eigenvector'] for key in nodeSorting]):
1086+
raise ValueError("Invalid node sorting key. Choose from 'betweenness', 'node_degree', 'eigenvector'")
1087+
rank_columns = [db.func.rank().over(order_by=getattr(models.networkAnalysis, col).desc()).label(f"{col}_rank") for col in nodeSorting]
1088+
mean_rank = sum(rank_columns) / len(rank_columns)
1089+
node_query = node_query.order_by(mean_rank)
10921090

1093-
# node agination
1091+
# node pagination
10941092
node_query = node_query.offset(offsetNodes).limit(maxNodes)
10951093

10961094
# filter edges based on filtered nodes

‎app/controllers/transcriptInteraction.py

+9-11
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,7 @@ def getTranscriptCounts(dataset_ID: int = None, disease_name=None, enst_number=N
845845
def get_transcript_network(dataset_ID: int = None, disease_name=None,
846846
minBetweenness:float = None, minNodeDegree:float = None, minEigenvector:float = None,
847847
maxPValue=0.05, minMscor=None, minCorrelation=None,
848-
edgeSorting: str = None, nodeSorting: str = None,
848+
edgeSorting: str = None, nodeSorting: list[str] = None,
849849
maxNodes: int = 100, maxEdges: int = 100,
850850
offsetNodes: int = None, offsetEdges: int = None,
851851
sponge_db_version: int = LATEST):
@@ -860,7 +860,7 @@ def get_transcript_network(dataset_ID: int = None, disease_name=None,
860860
:param minMscor: mscor cutoff (>)
861861
:param minCorrelation: correlation cutoff (>)
862862
:param edgeSorting: sorting key for edges
863-
:param nodeSorting: sorting key for nodes
863+
:param nodeSorting: sorting key(s) for nodes (options are 'betweenness', 'node_degree', 'eigenvector')
864864
:param maxNodes: maximum number of nodes
865865
:param maxEdges: maximum number of edges
866866
:param offsetNodes: offset for node pagination
@@ -910,15 +910,13 @@ def get_transcript_network(dataset_ID: int = None, disease_name=None,
910910
if minEigenvector:
911911
node_query = node_query.filter(models.networkAnalysisTranscript.eigenvector >= minEigenvector)
912912

913-
# Sorting nodes
914-
if nodeSorting == "betweenness":
915-
node_query = node_query.order_by(models.networkAnalysisTranscript.betweenness.desc())
916-
elif nodeSorting == "degree":
917-
node_query = node_query.order_by(models.networkAnalysisTranscript.node_degree.desc())
918-
elif nodeSorting == "eigenvector":
919-
node_query = node_query.order_by(models.networkAnalysisTranscript.eigenvector.desc())
920-
else:
921-
raise ValueError("Invalid node sorting key. Choose one of 'betweenness', 'degree', 'eigenvector'")
913+
# Sorting nodes: if more than one sorting key, rank by each key individually and sort by the mean of the ranks
914+
if nodeSorting:
915+
if any([key not in ['betweenness', 'node_degree', 'eigenvector'] for key in nodeSorting]):
916+
raise ValueError("Invalid node sorting key. Choose from 'betweenness', 'node_degree', 'eigenvector'")
917+
rank_columns = [db.func.rank().over(order_by=getattr(models.networkAnalysisTranscript, col).desc()).label(f"{col}_rank") for col in nodeSorting]
918+
mean_rank = sum(rank_columns) / len(rank_columns)
919+
node_query = node_query.order_by(mean_rank)
922920

923921
# node pagination
924922
node_query = node_query.offset(offsetNodes).limit(maxNodes)

‎swagger.yml

+16-12
Original file line numberDiff line numberDiff line change
@@ -1432,11 +1432,13 @@ paths:
14321432
required: false
14331433
description: Possibilities for sorting of the nodes.
14341434
schema:
1435-
type: string
1436-
enum:
1437-
- betweenness
1438-
- degree
1439-
- eigenvector
1435+
type: array
1436+
items:
1437+
type: string
1438+
# enum:
1439+
# - betweenness
1440+
# - degree
1441+
# - eigenvector
14401442
- name: maxNodes
14411443
in: query
14421444
description: Number of nodes that should be shown. Default value is 100 and can be up to 1000. For more results please use batches, the provided offset parameter or download the whole dataset.
@@ -1552,11 +1554,13 @@ paths:
15521554
required: false
15531555
description: Possibilities for sorting of the nodes.
15541556
schema:
1555-
type: string
1556-
enum:
1557-
- betweenness
1558-
- degree
1559-
- eigenvector
1557+
type: array
1558+
items:
1559+
type: string
1560+
# enum:
1561+
# - betweenness
1562+
# - degree
1563+
# - eigenvector
15601564
- name: maxNodes
15611565
in: query
15621566
description: Number of nodes that should be shown. Default value is 100 and can be up to 1000. For more results please use batches, the provided offset parameter or download the whole dataset.
@@ -1714,7 +1718,7 @@ paths:
17141718
type: string
17151719
enum:
17161720
- betweenness
1717-
- degree
1721+
- node_degree
17181722
- eigenvector
17191723
- name: descending
17201724
in: query
@@ -1895,7 +1899,7 @@ paths:
18951899
type: string
18961900
enum:
18971901
- betweenness
1898-
- degree
1902+
- node_degree
18991903
- eigenvector
19001904
- name: descending
19011905
in: query

0 commit comments

Comments
 (0)
Please sign in to comment.