From ab3a699dcf00df5f34d4750dd942b7cdb44e3eb2 Mon Sep 17 00:00:00 2001 From: AndiMajore <andi.majore@googlemail.com> Date: Wed, 22 Sep 2021 19:26:48 +0200 Subject: [PATCH] added add disorders by protein association to explorer --- .../network-legend.component.ts | 14 ++++--- src/app/config.ts | 13 ++++++ src/app/interfaces.ts | 11 ++++- .../explorer-page.component.html | 11 ++++- .../explorer-page/explorer-page.component.ts | 31 +++++++++++++- src/app/services/analysis/analysis.service.ts | 2 +- .../netex-controller.service.ts | 42 ++++++++++++------- 7 files changed, 98 insertions(+), 26 deletions(-) diff --git a/src/app/components/network-legend/network-legend.component.ts b/src/app/components/network-legend/network-legend.component.ts index 431fbe69..79c83120 100644 --- a/src/app/components/network-legend/network-legend.component.ts +++ b/src/app/components/network-legend/network-legend.component.ts @@ -13,17 +13,19 @@ export class NetworkLegendComponent implements OnInit { @Input() config: IConfig; private contextNodeGroupsToDelete = { - 'explorer': ['foundNode', 'foundDrug', 'seedNode', 'default'], - 'adjacentDrugs': ['foundNode', 'seedNode', 'default'], - 'drugTarget': ['foundDrug', 'seedNode', 'default'], - 'drug': ['seedNode', 'default'], - 'drugTargetAndSeeds': ['foundDrug', 'default'], - 'drugAndSeeds': ['default'] + 'explorer': ['foundNode', 'foundDrug', 'seedNode', 'default', 'defaultDisorder'], + 'adjacentDrugs': ['foundNode', 'seedNode', 'default', 'defaultDisorder'], + 'adjacentDisorders': ['foundDrug', 'foundNode', 'seedNode', 'default'], + 'drugTarget': ['foundDrug', 'seedNode', 'default', 'defaultDisorder'], + 'drug': ['seedNode', 'default', 'defaultDisorder'], + 'drugTargetAndSeeds': ['foundDrug', 'default', 'defaultDisorder'], + 'drugAndSeeds': ['default', 'defaultDisorder'] } private contextEdgeGroupsToDelete = { 'explorer': ['default'], 'adjacentDrugs': ['default'], + 'adjacentDisorders': ['default'], 'drugTarget': ['default'], 'drug': ['default'], 'drugTargetAndSeeds': ['default'], diff --git a/src/app/config.ts b/src/app/config.ts index 54e4461f..b938f880 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -155,6 +155,19 @@ export const defaultConfig: IConfig = { shape: 'diamond', type: 'default drug type', }, + defaultDisorder: { + groupName: 'Disorders', + color: { + border: '#ffa62f', + background: '#ffa62f', + highlight: { + border: '#ffa62f', + background: '#ffa62f' + }, + }, + shape: 'diamond', + type: 'default disorder type', + }, seedNode: { groupName: 'Seed Nodes', shape: 'triangle', diff --git a/src/app/interfaces.ts b/src/app/interfaces.ts index 2c467aad..3bebde46 100644 --- a/src/app/interfaces.ts +++ b/src/app/interfaces.ts @@ -6,6 +6,7 @@ export interface Node { id: string; type: string; netexId?: string; + drugId?:string; uniprotAc?: string; ensg?: Array<string>; group?: string; @@ -31,8 +32,8 @@ export interface Tissue { name: string; } -export type legendContext = 'explorer' | 'adjacentDrugs' | 'drug' | 'drugTarget' | -'drugTargetAndSeeds' | 'drugAndSeeds'; +export type legendContext = 'explorer' | 'adjacentDrugs' | 'drug' | 'drugTarget' | +'drugTargetAndSeeds' | 'drugAndSeeds' | 'adjacentDisorders'; /// netexId to expressionlvl export type NodeAttributeMap = { string: number } | {}; @@ -120,6 +121,12 @@ export function getDrugNodeId(drug: Drug) { return drug.netexId } +// export function getDisorderNodeId(disorder: Disorder) { +// /** +// * Returns backend_id of Drug object +// */ +// return disorder.netexId + export function getNodeId(node: Node) { /** * Returns backend_id of Gene object diff --git a/src/app/pages/explorer-page/explorer-page.component.html b/src/app/pages/explorer-page/explorer-page.component.html index 4b426b8e..0f1ba721 100644 --- a/src/app/pages/explorer-page/explorer-page.component.html +++ b/src/app/pages/explorer-page/explorer-page.component.html @@ -299,7 +299,16 @@ [value]="adjacentDrugs" (valueChange)="updateAdjacentDrugs($event)" ></app-toggle> - + <app-toggle + class="footer-buttons network-footer-toolbar-element" + textOn="Disorders" + textOff="Off" + tooltipOn="Display adjacent disorders ON." + tooltipOff="Display adjacent disorders OFF." + [smallStyle]="smallStyle" + [value]="adjacentDisorders" + (valueChange)="updateAdjacentDisorders($event)" + ></app-toggle> <app-toggle class="footer-buttons network-footer-toolbar-element" textOn="Animation" diff --git a/src/app/pages/explorer-page/explorer-page.component.ts b/src/app/pages/explorer-page/explorer-page.component.ts index 3f2e7700..2a156407 100644 --- a/src/app/pages/explorer-page/explorer-page.component.ts +++ b/src/app/pages/explorer-page/explorer-page.component.ts @@ -152,9 +152,13 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { private dumpPositions = false; public physicsEnabled = false; public adjacentDrugs = false; + public adjacentDisorders = false; public adjacentDrugList: Node[] = []; public adjacentDrugEdgesList: Node[] = []; + public adjacentDisorderList: Node[] = []; + public adjacentDisorderEdgesList: Node[] = []; + public queryItems: Wrapper[] = []; public showAnalysisDialog = false; public showThresholdDialog = false; @@ -427,7 +431,6 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { } } }); - this.networkInternal.on('click', (properties) => { const nodeIds: Array<string> = properties.nodes; if (nodeIds != null && nodeIds.length > 0) { @@ -485,6 +488,32 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { }); } + public updateAdjacentDisorders(bool: boolean){ + this.adjacentDisorders = bool; + if (this.adjacentDisorders){ + this.netex.adjacentDisorders(this.nodeData.nodes).subscribe(response => { + for (const interaction of response.pdis) { + const edge = {from: interaction.protein, to: interaction.disorder}; + this.adjacentDisorderEdgesList.push(mapCustomEdge(edge, this.myConfig)); + } + for (const disorder of response.disorders) { + disorder.group = 'defaultDisorder'; + disorder.id = disorder.netexId; + this.adjacentDisorderList.push(mapCustomNode(disorder, this.myConfig)) + } + this.nodeData.nodes.add(this.adjacentDisorderList); + this.nodeData.edges.add(this.adjacentDisorderEdgesList); + }); + this.legendContext = 'adjacentDisorders'; + }else { + this.nodeData.nodes.remove(this.adjacentDisorderList); + this.nodeData.edges.remove(this.adjacentDisorderEdgesList); + this.adjacentDisorderList = []; + this.adjacentDisorderEdgesList = []; + this.legendContext = 'explorer'; + } + } + public updateAdjacentDrugs(bool: boolean) { this.adjacentDrugs = bool; if (this.adjacentDrugs) { diff --git a/src/app/services/analysis/analysis.service.ts b/src/app/services/analysis/analysis.service.ts index 5278217d..0752bd50 100644 --- a/src/app/services/analysis/analysis.service.ts +++ b/src/app/services/analysis/analysis.service.ts @@ -358,7 +358,7 @@ export class AnalysisService { const watch = async () => { if (this.tokens.length > 0) { const newtasks = await this.getTasks(); - if (newtasks.length === 0) + if(newtasks.length === 0) return; const newTaskIds = newtasks.map(t => t.token.toString()); this.tasks = newtasks.concat(this.tasks.filter(t => newTaskIds.indexOf(t.token) === -1)); diff --git a/src/app/services/netex-controller/netex-controller.service.ts b/src/app/services/netex-controller/netex-controller.service.ts index bfc7e285..145db2b7 100644 --- a/src/app/services/netex-controller/netex-controller.service.ts +++ b/src/app/services/netex-controller/netex-controller.service.ts @@ -1,17 +1,18 @@ -import { Injectable } from '@angular/core'; +import {Injectable} from '@angular/core'; import {environment} from '../../../environments/environment'; import {HttpClient, HttpParams} from '@angular/common/http'; import {AlgorithmType, QuickAlgorithmType} from '../analysis/analysis.service'; -import { Observable } from 'rxjs'; -import { Tissue, Node, EdgeType} from 'src/app/interfaces'; -import { InteractionDrugProteinDB, InteractionProteinProteinDB } from 'src/app/config'; +import {Observable} from 'rxjs'; +import {Tissue, Node, EdgeType} from 'src/app/interfaces'; +import {InteractionDrugProteinDB, InteractionProteinProteinDB} from 'src/app/config'; @Injectable({ providedIn: 'root' }) export class NetexControllerService { - constructor(private http: HttpClient) { } + constructor(private http: HttpClient) { + } public async getTask(token): Promise<any> { /** @@ -42,9 +43,9 @@ export class NetexControllerService { } public async getTaskResultGene(token): Promise<any> { - /** - * returns promise of gene view of task result of COMPLETED task - */ + /** + * returns promise of gene view of task result of COMPLETED task + */ return this.http.get<any>(`${environment.backend}task_result/?token=${token}&view=genes`).toPromise(); } @@ -55,7 +56,7 @@ export class NetexControllerService { return this.http.get<any>(`${environment.backend}task_result/?token=${token}&view=cancer_driver_genes`).toPromise(); } - public async postTask(algorithm: QuickAlgorithmType | AlgorithmType, target, parameters, ) { + public async postTask(algorithm: QuickAlgorithmType | AlgorithmType, target, parameters,) { /** * sends a task to task service */ @@ -87,28 +88,39 @@ export class NetexControllerService { /** * Returns the expression in the given tissue for given nodes and cancerNodes */ - // slice prefix of netex id away for direct lookup in db, if node not mapped to db, replace by undefined - const genesBackendIds = nodes.map( (node: Node) => node.netexId ? node.netexId.slice(1) : undefined); + // slice prefix of netex id away for direct lookup in db, if node not mapped to db, replace by undefined + const genesBackendIds = nodes.map((node: Node) => node.netexId ? node.netexId.slice(1) : undefined); const params = new HttpParams() .set('tissue', tissue.netexId) .set('proteins', JSON.stringify(genesBackendIds)); return this.http.get(`${environment.backend}tissue_expression/`, {params}); } + public adjacentDisorders(nodes: Node[]): Observable<any> { + const genesBackendIds = nodes.map((node: Node) => node.netexId && !node.drugId ? node.netexId.slice(1) : undefined).filter(id => id != null); + const drugsBackendIds = nodes.map((node: Node) => node.drugId && node.netexId ? node.netexId.slice(1) : undefined).filter(id => id != null); + const params = { + proteins: genesBackendIds, + drugs: drugsBackendIds, + }; + console.log(params) + return this.http.post<any>(`${environment.backend}adjacent_disorders/`, params); + } + public adjacentDrugs(pdiDataset: InteractionDrugProteinDB, nodes: Node[]): Observable<any> { /** * Returns the expression in the given tissue for given nodes and cancerNodes */ - // slice prefix of netex id away for direct lookup in db, if node not mapped to db, replace by undefined - const genesBackendIds = nodes.map( (node: Node) => node.netexId ? node.netexId.slice(1) : undefined); + // slice prefix of netex id away for direct lookup in db, if node not mapped to db, replace by undefined + const genesBackendIds = nodes.map((node: Node) => node.netexId ? node.netexId.slice(1) : undefined).filter(id => id != null); const params = { pdi_dataset: pdiDataset, proteins: genesBackendIds - } + }; return this.http.post<any>(`${environment.backend}adjacent_drugs/`, params); } - public graphmlLink(graph_data: {edges: EdgeType[], nodes: Node[]}) { + public graphmlLink(graph_data: { edges: EdgeType[], nodes: Node[] }) { /** * Sends complete graph data to backend where it is written to graphml File. * The file is returned as download for the user. -- GitLab