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