diff --git a/src/app/config.ts b/src/app/config.ts index ead040c5b92c3de00de30da88495a76caf879562..2abf461d7dbbad33f24396e7ca949de52ae1e3ac 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -56,6 +56,7 @@ export interface IConfig { edgeGroups: { [key: string]: EdgeGroup }; interactionDrugProtein: InteractionDrugProteinDB; interactionProteinProtein: InteractionProteinProteinDB; + autofillEdges: boolean; interactions?: InteractionDatabase; identifier?: Identifier; nodeShadow?: boolean; @@ -93,6 +94,7 @@ export const defaultConfig: IConfig = { interactionProteinProtein: 'STRING', nodeShadow: true, edgeShadow: true, + autofillEdges: true, nodeGroups: { // all NodeGroups but the default group must be set, if not provided by the user, they will be taken from here // IMPORTANT: node color must be hexacode! diff --git a/src/app/interfaces.ts b/src/app/interfaces.ts index cab05e038dc8882bcd5d47fb10bb085379c7721c..2c467aad2383dc2c195ad2208f96b1d8ad692ed9 100644 --- a/src/app/interfaces.ts +++ b/src/app/interfaces.ts @@ -37,6 +37,11 @@ export type legendContext = 'explorer' | 'adjacentDrugs' | 'drug' | 'drugTarget' /// netexId to expressionlvl export type NodeAttributeMap = { string: number } | {}; +export interface NetexInteraction { + dataset: string; + proteinA: string; + proteinB: string; +} export interface NodeInteraction { from: string; diff --git a/src/app/main-network.ts b/src/app/main-network.ts index 1abe89b4fa190d83f9bd247320df400dffef2caa..e2a992912fe8a3a3824d9ee20b321ac06b79aa6d 100644 --- a/src/app/main-network.ts +++ b/src/app/main-network.ts @@ -1,5 +1,5 @@ import { defaultConfig, IConfig } from './config'; -import {NodeInteraction, Node, getProteinNodeId} from './interfaces'; +import {NodeInteraction, Node, getProteinNodeId, NetexInteraction} from './interfaces'; import * as merge from 'lodash/fp/merge'; export function getDatasetFilename(dataset: Array<[string, string]>): string { @@ -117,3 +117,18 @@ export function mapCustomEdge(customEdge: NodeInteraction, config: IConfig): any }; return edge; } + +/** Maps netex retrieved edge to network edge object + * Uses the default group for edge objects. + * + * @param customEdge + * @param config + * @returns + */ + export function mapNetexEdge(customEdge: NetexInteraction, config: IConfig): any { + const edge = JSON.parse(JSON.stringify(config.edgeGroups.default)); + edge['from'] = customEdge['proteinA']; + edge['to'] = customEdge['proteinB']; + edge['dataset'] = customEdge['dataset']; + return edge; +} diff --git a/src/app/pages/explorer-page/explorer-page.component.ts b/src/app/pages/explorer-page/explorer-page.component.ts index fa2a95db649d6bce48a1950dd8b7504b86ad6bb1..7e7c2ef1826d7a97b38999ef3c766531a680e778 100644 --- a/src/app/pages/explorer-page/explorer-page.component.ts +++ b/src/app/pages/explorer-page/explorer-page.component.ts @@ -18,7 +18,7 @@ import { Tissue, Wrapper } from '../../interfaces'; -import {mapCustomEdge, mapCustomNode, ProteinNetwork} from '../../main-network'; +import {mapCustomEdge, mapCustomNode, mapNetexEdge, ProteinNetwork} from '../../main-network'; import {AnalysisService} from '../../services/analysis/analysis.service'; import {OmnipathControllerService} from '../../services/omnipath-controller/omnipath-controller.service'; import domtoimage from 'dom-to-image'; @@ -369,10 +369,19 @@ export class ExplorerPageComponent implements OnInit, AfterViewInit { if (this.networkPositions) { this.proteinData.updateNodePositions(this.networkPositions) } - this.proteinData.linkNodes(); + // TODO do we still need this? + // this.proteinData.linkNodes(); const {nodes, edges} = this.proteinData.mapDataToNetworkInput(this.myConfig); + console.log('nodes', nodes) + console.log('edges', edges) + if (this.myConfig.autofillEdges && nodes.length) { + const netexEdges = await this.netex.fetchEdges(nodes, this.myConfig.interactionProteinProtein); + console.log(netexEdges.map(netexEdge => mapNetexEdge(netexEdge, this.myConfig))) + edges.push(...netexEdges.map(netexEdge => mapNetexEdge(netexEdge, this.myConfig))) + } + this.nodeData.nodes = new vis.DataSet(nodes); this.nodeData.edges = new vis.DataSet(edges); const container = this.networkEl.nativeElement; diff --git a/src/app/services/netex-controller/netex-controller.service.ts b/src/app/services/netex-controller/netex-controller.service.ts index 4992123d0b3552774823b673c8fe0a54d8e5b1f7..bfc7e2859a2bf87c420662a717924f141fc610a4 100644 --- a/src/app/services/netex-controller/netex-controller.service.ts +++ b/src/app/services/netex-controller/netex-controller.service.ts @@ -4,7 +4,7 @@ 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 } from 'src/app/config'; +import { InteractionDrugProteinDB, InteractionProteinProteinDB } from 'src/app/config'; @Injectable({ providedIn: 'root' @@ -115,4 +115,13 @@ export class NetexControllerService { */ return this.http.post(`${environment.backend}graph_export/`, graph_data, {responseType: 'text'}); } + + public async fetchEdges(nodes: Node[], dataset: InteractionProteinProteinDB): Promise<any> { + /** + * Tries to map every node to a node object in out database + * Returns list of mapped nodes if node was found, otherwise original node to not lose information + */ + const payload = {nodes: nodes, dataset: dataset}; + return this.http.post(`${environment.backend}fetch_edges/`, payload).toPromise(); + } } diff --git a/src/index.html b/src/index.html index ea00bbd9cb619817a6e1a16507bce4a5d3e0bcb2..b7e2e5dd6f0f46146f612ccf5d3d1123a3de6a43 100644 --- a/src/index.html +++ b/src/index.html @@ -44,14 +44,13 @@ "identifier": "symbol", "nodeShadow": true, "edgeShadow": true, - "interactionDrugProtein": "ChEMBL", - "legendUrl": "https://exbio.wzw.tum.de/covex/assets/leg1.png" + "interactionProteinProtein": "APID", + "interactionDrugProtein": "ChEMBL" }' network='{ "nodes": [{"id": "TP53", "group": "0.5"}, {"id": "MYC", "group": "pugGroup"}, {"id": "Patient No. 5", "group": "patientgroup"}, {"label": "PTEN", "id": "PTEN", "group": 0.5, "value":"5"}], "edges": [ - {"from": "TP53","to": "C5","group": "xxx", "label": "this is a label", "title": "this is a title"}, - {"from": "Patient No. 5","to": "C5","label": "w/o group"} + ] }' style="height: 100%; width: 100vw; display: block;"