diff --git a/src/app/components/analysis-panel/analysis-panel.component.ts b/src/app/components/analysis-panel/analysis-panel.component.ts index ab7d8b8e90524b48116a5759e219889eabc68a21..27dfb2e4f3a1a108b053f2a9403bdc9e3b6df036 100644 --- a/src/app/components/analysis-panel/analysis-panel.component.ts +++ b/src/app/components/analysis-panel/analysis-panel.component.ts @@ -200,10 +200,11 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit this.networkHandler.activeNetwork.networkInternal = new vis.Network(container, this.nodeData, options); - this.tableDrugs = nodes.filter(e => e.drugstoneId && e.drugstoneId.drugstoneType === 'drug'); + this.tableDrugs = nodes.filter(e => e.drugstoneId && e.drugstoneType === 'drug'); this.tableDrugs.forEach((r) => { r.rawScore = r.score; }); + console.log(this.tableDrugs) this.tableProteins = nodes.filter(e => e.drugstoneId && e.drugstoneType === 'protein'); this.tableSelectedProteins = []; @@ -411,7 +412,6 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit public createNetwork(result: any): { edges: any[], nodes: any[] } { const config = result.parameters.config; this.myConfig = config; - const identifier = this.myConfig.identifier; // add drugGroup and foundNodesGroup for added nodes @@ -424,24 +424,14 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit this.effects = []; const network = result.network; - // const nodeTypes = attributes.nodeTypes || {}; - // const isSeed = attributes.isSeed || {}; - // const scores = attributes.scores || {}; const details = attributes.details || {}; const nodeIdMap = {} - // const reverseNodeIdMap = {} // @ts-ignore Object.entries(details).filter(e => e[1].drugstoneType === 'protein').forEach(e => { - // let id = // @ts-ignore - e[1].drugstoneId.forEach(id=>{ - nodeIdMap[id] = e[1][identifier][0] + e[1].drugstoneId.forEach(id => { + nodeIdMap[id] = e[1][identifier][0] }) - - // if (!nodeIdMap[id]) - // nodeIdMap[id] = [e[0]] - // else - // nodeIdMap[id].push(e[0]) }) for (const nodeId of Object.keys(details)) { const nodeDetails = details[nodeId] @@ -449,7 +439,9 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit if (nodeDetails.drugstoneId && nodeDetails.drugstoneType === 'protein') { // node is protein from database, has been mapped on init to backend protein from backend // or was found during analysis - nodeDetails.group = result.targetNodes && result.targetNodes.indexOf(nodeId) !== -1 ? 'foundNode' : (nodeDetails.group ? nodeDetails.group : 'default' ); + // FIXME connectorNodes are not visualized correctly + nodeDetails.group = result.targetNodes && result.targetNodes.indexOf(nodeId) !== -1 ? 'foundNode' : (nodeDetails.group ? nodeDetails.group : 'connectorNode'); + console.log(nodeDetails) nodeDetails.label = nodeDetails.label ? nodeDetails.label : nodeDetails[identifier]; nodeDetails.id = nodeDetails[identifier][0] ? nodeDetails[identifier][0] : nodeDetails.id; this.proteins.push(nodeDetails); @@ -464,17 +456,21 @@ export class AnalysisPanelComponent implements OnInit, OnChanges, AfterViewInit } // further analysis and the button function can be used to highlight seeds // option to use scores[node] as gradient, but sccores are very small - console.log(nodeDetails) nodes.push(NetworkSettings.getNodeStyle(nodeDetails as Node, config, false, false, 1)) } const edges = []; + let uniqEdges = [] for (const edge of network.edges) { const e = mapCustomEdge(edge, this.myConfig) e.from = e.from[0] === 'p' ? nodeIdMap[e.from] : e.from e.to = e.to[0] === 'p' ? nodeIdMap[e.to] : e.to - edges.push(e); + const hash = e.from + "_" + e.to; + if (uniqEdges.indexOf(hash) === -1) { + uniqEdges.push(hash); + edges.push(e); + } } return { nodes, diff --git a/src/app/components/network/network.component.ts b/src/app/components/network/network.component.ts index da03306cbe05b84c19298dccc86509ae0e720d70..477c20e551890c696c5e8f93bd9fa1049086c3d9 100644 --- a/src/app/components/network/network.component.ts +++ b/src/app/components/network/network.component.ts @@ -426,9 +426,11 @@ export class NetworkComponent implements OnInit { } public hasDrugsLoaded(): boolean { - if (this.nodeData == null || this.nodeData.nodes == null) - return false; - return this.nodeData.nodes.get().filter((node: Node) => node.drugId).map(node => node.drugstoneId).filter(id => id.startsWith('dr')).length > 0; + if(this.nodeData && this.nodeData.nodes) + for(const node of this.nodeData.nodes.get()) + if(node.drugstoneType && node.drugstoneId === 'drug') + return true; + return false; } public setLegendContext() { @@ -442,9 +444,10 @@ export class NetworkComponent implements OnInit { if (this.highlightSeeds) { this.legendContext = "drugTargetAndSeeds"; } else { - this.legendContext = 'drugTarget' + this.legendContext = 'drugTarget'; } } + console.log(this.legendContext) } /** diff --git a/src/app/config.ts b/src/app/config.ts index ee9d639de7d92cc517817e78846ca64e170c701c..9e4f473fafd67647773125f53b2d4d4cc98bd76e 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -79,6 +79,42 @@ export interface IConfig { edgeShadow?: boolean; } + +const defaultNodeGroup: NodeGroup = { + // this default group is used for default node group values + // and is fallback in case user does not provide any nodeGroup + groupName: 'Default Node Group', + color: { + border: '#FFFF00', + background: '#FFFF00', + highlight: { + border: '#FF0000', + background: '#FF0000' + }, + }, + shape: 'triangle', + type: 'default type', + detailShowLabel: false, + font: { + color: '#000000', + size: 14, + face: 'arial', + background: undefined, + strokeWidth: 0, + strokeColor: '#ffffff', + align: 'center', + bold: false, + ital: false, + boldital: false, + mono: false, + }, + borderWidth: 1, + borderWidthSelected: 2 + }; +const connectorNodeGroup: NodeGroup = JSON.parse(JSON.stringify(defaultNodeGroup)); +connectorNodeGroup.groupName = 'Connector Node'; + +// @ts-ignore /** * Provide default values */ @@ -126,37 +162,7 @@ export const defaultConfig: IConfig = { 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! - default: { - // this default group is used for default node group values - // and is fallback in case user does not provide any nodeGroup - groupName: 'Default Node Group', - color: { - border: '#FFFF00', - background: '#FFFF00', - highlight: { - border: '#FF0000', - background: '#FF0000' - }, - }, - shape: 'triangle', - type: 'default type', - detailShowLabel: false, - font: { - color: '#000000', - size: 14, - face: 'arial', - background: undefined, - strokeWidth: 0, - strokeColor: '#ffffff', - align: 'center', - bold: false, - ital: false, - boldital: false, - mono: false, - }, - borderWidth: 1, - borderWidthSelected: 2 - }, + default: defaultNodeGroup, foundNode: { groupName: 'Found Nodes', color: { @@ -170,6 +176,7 @@ export const defaultConfig: IConfig = { shape: 'circle', type: 'default node type', }, + connectorNode: connectorNodeGroup, foundDrug: { groupName: 'Drugs', color: { diff --git a/src/index.html b/src/index.html index 48802835e845f8da9581ebc72c1f9e539e0a61a2..eb8d7e4b0ee463cbd08cf53080ba83b35fdb5428 100644 --- a/src/index.html +++ b/src/index.html @@ -93,7 +93,7 @@ <drugst-one id="netexp1" pluginId="2" config='{"identifier":"symbol","licencedDatasets": false, "interactionDrugProtein":"NeDRex", "physicsOn":true, "showLeftSidebar": true, "showSimpleAnalysis":true, "nodeGroups":{"patient":{"type":"patient","color":"black","font":{"color":"#ffffff"},"groupName":"Patient","shape":"image","image":"https://static.thenounproject.com/png/22780-200.png"},"condition":{"type":"condition","color":"black","font":{"color":"black"},"groupName":"Condition","shape":"text"},"important":{"type":"gene","color":"#ff881f","font":{"color":"#000000"},"groupName":"Important Gene","shape":"star"},"gene":{"type":"gene","color":"#4da300","font":{"color":"#ffffff"},"groupName":"Gene","shape":"circle"},"foundDrug":{"type":"drug","color":{"border":"#F12590","background":"#F12590"},"font":{"color":"#000000"},"groupName":"Drug","shape":"diamond"}},"edgeGroups":{"genotype":{"color":"black","groupName":"Relevant Gene"},"has-condition":{"color":"#ffffff","groupName":"Has Condition","dashes":[2,2]},"default":{"color":"#000000","groupName":"default edge"},"ggi":{"color":"#000000","groupName":"Interaction","dashes":[3,2]}},"title":"Breast cancer example network","nodeShadow":true,"edgeShadow":false,"autofillEdges":true,"showLegend":true}' - network='{"nodes":[{"id":"ATM","label":"ATM","group":"gene","x":289,"y":242},{"id":"BARD1","label":"BARD1","group":"gene","x":44,"y":250},{"id":"BRCA1","label":"BRCA1","group":"gene","x":466,"y":576},{"id":"BRCA2","label":"BRCA2","group":"gene","x":507,"y":285},{"id":"BRIP1","label":"BRIP1","group":"gene","x":54,"y":474},{"id":"CHEK2","label":"CHEK2","group":"gene","x":216,"y":590},{"id":"CDH1","label":"CDH1","group":"gene","x":320,"y":-57},{"id":"NF1","label":"NF1","group":"gene","x":481,"y":111},{"id":"NBN","label":"NBN","group":"gene","x":-57,"y":314},{"id":"PALB2","label":"PALB2","group":"gene","x":450,"y":190},{"id":"PTEN","label":"PTEN","group":"important","x":305,"y":494},{"id":"RAD51C","label":"RAD51C","group":"gene","x":182,"y":-90},{"id":"RAD51D","label":"RAD51D","group":"gene","x":368,"y":73},{"id":"STK11","label":"STK11","group":"gene","x":686,"y":330},{"id":"TP53","label":"TP53","group":"important","x":333,"y":316}],"edges":[]}'> + network='{"nodes":[{"id":"ATM","label":"ATM","group":"gene","x":289,"y":242},{"id":"FOXP2","label":"FOXP2","group":"gene"},{"id":"BARD1","label":"BARD1","group":"gene","x":44,"y":250},{"id":"BRCA1","label":"BRCA1","group":"gene","x":466,"y":576},{"id":"BRCA2","label":"BRCA2","group":"gene","x":507,"y":285},{"id":"BRIP1","label":"BRIP1","group":"gene","x":54,"y":474},{"id":"CHEK2","label":"CHEK2","group":"gene","x":216,"y":590},{"id":"CDH1","label":"CDH1","group":"gene","x":320,"y":-57},{"id":"NF1","label":"NF1","group":"gene","x":481,"y":111},{"id":"NBN","label":"NBN","group":"gene","x":-57,"y":314},{"id":"PALB2","label":"PALB2","group":"gene","x":450,"y":190},{"id":"PTEN","label":"PTEN","group":"important","x":305,"y":494},{"id":"RAD51C","label":"RAD51C","group":"gene","x":182,"y":-90},{"id":"RAD51D","label":"RAD51D","group":"gene","x":368,"y":73},{"id":"STK11","label":"STK11","group":"gene","x":686,"y":330},{"id":"TP53","label":"TP53","group":"important","x":333,"y":316}],"edges":[]}'> </drugst-one> <!-- ENSEMBL test--> <!-- <drugst-one id="netexp1"-->