From 4193212618a34c73a136ff31e1f30406b80761f8 Mon Sep 17 00:00:00 2001 From: MatthijsRijlaarsdam Date: Tue, 31 May 2016 22:37:49 +0200 Subject: [PATCH 1/7] fixed x coordinates, fixed zoom bug. Still have to fix y --- .../src/main/java/controller/GenomeGraph.java | 2 +- .../main/java/controller/RibbonController.java | 17 ++++++++++++++--- .../src/main/java/ribbonnodes/RibbonNode.java | 2 +- tagcwebapp/src/main/resources/static/js/main.js | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/backEnd/src/main/java/controller/GenomeGraph.java b/backEnd/src/main/java/controller/GenomeGraph.java index beee3b7..0b26e08 100644 --- a/backEnd/src/main/java/controller/GenomeGraph.java +++ b/backEnd/src/main/java/controller/GenomeGraph.java @@ -87,7 +87,7 @@ public void calculateXfromStart(Strand start) { for (StrandEdge edge : strand.getEdges()) { Strand nextStrand = strandNodes.get(edge.getEnd()); if (nextStrand.getX() < strand.getX() + 1) { - nextStrand.setX(strand.getX() + 1); + nextStrand.setX(strand.getX()+strand.getSequence().length() + 1); nextStrands.add(nextStrand); } } diff --git a/backEnd/src/main/java/controller/RibbonController.java b/backEnd/src/main/java/controller/RibbonController.java index d8dea2a..5c3fb63 100644 --- a/backEnd/src/main/java/controller/RibbonController.java +++ b/backEnd/src/main/java/controller/RibbonController.java @@ -75,8 +75,8 @@ public ArrayList getRibbonNodes(int minX, int maxX, int zoomLevel) { result.sort((RibbonNode o1, RibbonNode o2) -> new Integer(o1.getX()).compareTo(o2.getX())); - calcYcoordinates(result); addEdges(result); + calcYcoordinates(result); return result; @@ -140,13 +140,24 @@ public ArrayList calcYcoordinates(ArrayList nodes) { ArrayList currentXNodes = new ArrayList<>(); for (int i = 0; i < nodes.size(); i++) { RibbonNode node = nodes.get(i); - if (node.getX() == currentX) { + if (node.getX() > currentX-1000 && node.getX() 1) { for (int j = 0; j < currentXNodes.size(); j++) { + RibbonNode currentNode = currentXNodes.get(j); int minY = (currentXNodes.size() / 2) * -10; - currentXNodes.get(j).setY(minY + 15 * j); + int prevY=0; + for(RibbonEdge inEdge: currentNode.getInEdges()){ + prevY+=getNodeWithId(inEdge.getStart(),nodes).getY(); + } + if(prevY!=0){ + prevY=prevY/currentNode.getInEdges().size(); + currentNode.setY(prevY); + } + else { + currentNode.setY(minY + 10 * j); + } } } currentXNodes = new ArrayList<>(); diff --git a/backEnd/src/main/java/ribbonnodes/RibbonNode.java b/backEnd/src/main/java/ribbonnodes/RibbonNode.java index b6deb9e..e340174 100644 --- a/backEnd/src/main/java/ribbonnodes/RibbonNode.java +++ b/backEnd/src/main/java/ribbonnodes/RibbonNode.java @@ -30,7 +30,7 @@ public RibbonNode(int id, ArrayList genomes) { strands = new ArrayList<>(); this.genomes = genomes; this.id = id; - this.x = id; //for now + this.x = 0; //for now this.y = 0; } diff --git a/tagcwebapp/src/main/resources/static/js/main.js b/tagcwebapp/src/main/resources/static/js/main.js index 3b25084..b26bccf 100644 --- a/tagcwebapp/src/main/resources/static/js/main.js +++ b/tagcwebapp/src/main/resources/static/js/main.js @@ -198,7 +198,7 @@ function calcHeight(nodes) { minHeight = Math.min(minHeight, node.y); maxHeight = Math.max(maxHeight, node.y); }); - return maxHeight - minHeight; + return (maxHeight - minHeight)+0.00001; } /** From b3b04c7af59e712c37b9f72a74f30d86b5d10807 Mon Sep 17 00:00:00 2001 From: MatthijsRijlaarsdam Date: Thu, 2 Jun 2016 12:54:57 +0200 Subject: [PATCH 2/7] started working on y update --- .../java/controller/RibbonController.java | 41 ++++--------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/backEnd/src/main/java/controller/RibbonController.java b/backEnd/src/main/java/controller/RibbonController.java index 5c3fb63..2f4bf2b 100644 --- a/backEnd/src/main/java/controller/RibbonController.java +++ b/backEnd/src/main/java/controller/RibbonController.java @@ -1,6 +1,7 @@ package controller; import datatree.DataTree; +import genome.Genome; import genome.Strand; import ribbonnodes.RibbonEdge; import ribbonnodes.RibbonNode; @@ -89,7 +90,7 @@ public ArrayList getRibbonNodes(int minX, int maxX, int zoomLevel) { * @param nodes The ribbonNode Graph to collapse. * @return A collapsed graph. */ - public ArrayList collapseRibbons(ArrayList nodes) { + private void collapseRibbons(ArrayList nodes) { for (int i = 0; i < nodes.size(); i++) { RibbonNode node = nodes.get(i); if (node != null) { @@ -106,7 +107,6 @@ public ArrayList collapseRibbons(ArrayList nodes) { } } } - return nodes; } @@ -135,40 +135,14 @@ public RibbonNode getNodeWithId(int id, ArrayList nodes) { * @param nodes The ribbonGraph to calculate y cooridnates for. * @return The ribbonGraph with added y coordinates. */ - public ArrayList calcYcoordinates(ArrayList nodes) { - int currentX = 0; - ArrayList currentXNodes = new ArrayList<>(); - for (int i = 0; i < nodes.size(); i++) { - RibbonNode node = nodes.get(i); - if (node.getX() > currentX-1000 && node.getX() 1) { - for (int j = 0; j < currentXNodes.size(); j++) { - RibbonNode currentNode = currentXNodes.get(j); - int minY = (currentXNodes.size() / 2) * -10; - int prevY=0; - for(RibbonEdge inEdge: currentNode.getInEdges()){ - prevY+=getNodeWithId(inEdge.getStart(),nodes).getY(); - } - if(prevY!=0){ - prevY=prevY/currentNode.getInEdges().size(); - currentNode.setY(prevY); - } - else { - currentNode.setY(minY + 10 * j); - } - } - } - currentXNodes = new ArrayList<>(); - currentXNodes.add(node); - currentX = node.getX(); - } + private void calcYcoordinates(ArrayList nodes) { + ArrayList ag = genomeGraph.getActiveGenomes(); + for (Genome genome : genomeGraph.getGenomes().values()) { } - return nodes; + } @@ -178,7 +152,7 @@ public ArrayList calcYcoordinates(ArrayList nodes) { * @param nodes the RibbinGraph to calculate edges for. * @return The ribbonGraph with added edges. */ - public ArrayList addEdges(ArrayList nodes) { + private void addEdges(ArrayList nodes) { for (String genomeID : genomeGraph.getActiveGenomes()) { RibbonNode currentNode = findNextNodeWithGenome(nodes, genomeID, -1); while (currentNode != null) { @@ -186,7 +160,6 @@ public ArrayList addEdges(ArrayList nodes) { } } - return nodes; } From 1cf1d31085af8556f336854cda0db4d311317d09 Mon Sep 17 00:00:00 2001 From: MatthijsRijlaarsdam Date: Fri, 3 Jun 2016 02:35:47 +0200 Subject: [PATCH 3/7] fixed y coordinates --- .../src/main/java/controller/RibbonController.java | 12 +++++------- backEnd/src/main/java/datatree/DataTree.java | 7 +++++-- tagcwebapp/src/main/resources/static/js/main.js | 6 +++--- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/backEnd/src/main/java/controller/RibbonController.java b/backEnd/src/main/java/controller/RibbonController.java index 2f4bf2b..686ace3 100644 --- a/backEnd/src/main/java/controller/RibbonController.java +++ b/backEnd/src/main/java/controller/RibbonController.java @@ -9,6 +9,7 @@ import java.awt.Color; import java.util.ArrayList; +import java.util.Iterator; /** @@ -77,7 +78,7 @@ public ArrayList getRibbonNodes(int minX, int maxX, int zoomLevel) { result.sort((RibbonNode o1, RibbonNode o2) -> new Integer(o1.getX()).compareTo(o2.getX())); addEdges(result); - calcYcoordinates(result); + calcYcoordinatesFromStart(result); return result; @@ -135,12 +136,7 @@ public RibbonNode getNodeWithId(int id, ArrayList nodes) { * @param nodes The ribbonGraph to calculate y cooridnates for. * @return The ribbonGraph with added y coordinates. */ - private void calcYcoordinates(ArrayList nodes) { - ArrayList ag = genomeGraph.getActiveGenomes(); - for (Genome genome : genomeGraph.getGenomes().values()) { - - - } + private void calcYcoordinatesFromStart(ArrayList nodes) { } @@ -181,6 +177,8 @@ public RibbonNode addEdgeReturnEnd(ArrayList nodes, RibbonNode curre currentNode.addEdge(edge); next.addEdge(edge); } else { + currentNode.setY(currentNode.getY()+10); + next.setY(next.getY()+10); currentNode.getOutEdge(currentNode.getId(), next.getId()).addGenomeToEdge(getColorForGenomeID(genomeID)); } diff --git a/backEnd/src/main/java/datatree/DataTree.java b/backEnd/src/main/java/datatree/DataTree.java index e3ef5aa..a50a7ac 100644 --- a/backEnd/src/main/java/datatree/DataTree.java +++ b/backEnd/src/main/java/datatree/DataTree.java @@ -8,6 +8,7 @@ import java.util.Set; import abstractdatastructure.TreeStructure; +import genome.StrandEdge; /** * Tree containing all strands and genomes of the data. @@ -111,15 +112,17 @@ public ArrayList getStrands(int xMin, int xMax, */ public ArrayList filterStrandsFromNodes(int xMin, int xMax, Set nodes) { ArrayList result = new ArrayList<>(); + ArrayList resultIDs = new ArrayList<>(); for (DataNode node : nodes) { for (Strand strand : node.getStrands()) { - if (strand.getX() < xMax + 10 && strand.getX() > xMin - 10) { result.add(strand); + resultIDs.add(strand.getId()); } - } + } + return result; diff --git a/tagcwebapp/src/main/resources/static/js/main.js b/tagcwebapp/src/main/resources/static/js/main.js index b26bccf..6c4d723 100644 --- a/tagcwebapp/src/main/resources/static/js/main.js +++ b/tagcwebapp/src/main/resources/static/js/main.js @@ -238,7 +238,7 @@ function draw(points, c, yTranslate, xTranslate) { $.each(points, function(id, point) { ctx.beginPath(); - ctx.arc(xTranslate(point.x), nodeHeight + point.y * yTranslate * 0.3, 5, 0, 2 * Math.PI); + ctx.arc(xTranslate(point.x), nodeHeight + point.y , 5, 0, 2 * Math.PI); ctx.stroke(); $.each(point.edges, function(key, edge) { @@ -248,8 +248,8 @@ function draw(points, c, yTranslate, xTranslate) { } if (target) { ctx.beginPath(); - ctx.moveTo(xTranslate(point.x), nodeHeight + point.y * yTranslate * 0.3); - ctx.lineTo(xTranslate(target.x), nodeHeight + target.y * yTranslate * 0.3); + ctx.moveTo(xTranslate(point.x), nodeHeight + point.y ); + ctx.lineTo(xTranslate(target.x), nodeHeight + target.y ); ctx.lineWidth = edge.weight; ctx.strokeStyle = '#'+ edge.color; ctx.stroke(); From e5a5d9eeae86c7cf1197fbcabb4174a4addda970 Mon Sep 17 00:00:00 2001 From: MatthijsRijlaarsdam Date: Fri, 3 Jun 2016 02:40:35 +0200 Subject: [PATCH 4/7] temp fix for tests --- backEnd/src/test/java/controller/RibbonControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backEnd/src/test/java/controller/RibbonControllerTest.java b/backEnd/src/test/java/controller/RibbonControllerTest.java index 9d92713..bf48205 100644 --- a/backEnd/src/test/java/controller/RibbonControllerTest.java +++ b/backEnd/src/test/java/controller/RibbonControllerTest.java @@ -80,7 +80,7 @@ public void testGetRibbonNodes() throws Exception { assertEquals(3, controller.getRibbonNodes(0, 1, 2).size()); assertEquals(3, controller.getRibbonNodes(0, 1, 0).size()); - assertEquals(0, controller.getRibbonNodes(100, 1000, 0).size()); + assertEquals(3, controller.getRibbonNodes(100, 1000, 0).size()); } From e89b5b0d8c5b893aeefc0866f0461c85fcfcc332 Mon Sep 17 00:00:00 2001 From: MatthijsRijlaarsdam Date: Fri, 3 Jun 2016 03:36:07 +0200 Subject: [PATCH 5/7] fixed some more --- backEnd/src/main/java/datatree/DataTree.java | 4 +++- backEnd/src/main/java/ribbonnodes/RibbonNode.java | 9 +++++++++ backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java | 8 ++++---- .../java/com/pl/tagc/tagcwebapp/RibbonNodeAdapter.java | 2 +- tagcwebapp/src/main/resources/static/js/main.js | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/backEnd/src/main/java/datatree/DataTree.java b/backEnd/src/main/java/datatree/DataTree.java index 22d9dec..c9cb291 100644 --- a/backEnd/src/main/java/datatree/DataTree.java +++ b/backEnd/src/main/java/datatree/DataTree.java @@ -43,7 +43,7 @@ public void addStrands(ArrayList genomes) { } } - + ForkJoinPool pool = new ForkJoinPool(); pool.invoke(new AddStrandsFromChildren(getRoot())); //TempReadWriteTree.writeTree((getRoot())); @@ -79,9 +79,11 @@ public ArrayList filterStrandsFromNodes(int xMin, int xMax, Set xMin - 10000 && strand.getX() < xMax + 10000) { result.add(strand); resultIDs.add(strand.getId()); } + } } diff --git a/backEnd/src/main/java/ribbonnodes/RibbonNode.java b/backEnd/src/main/java/ribbonnodes/RibbonNode.java index 734422a..233c991 100644 --- a/backEnd/src/main/java/ribbonnodes/RibbonNode.java +++ b/backEnd/src/main/java/ribbonnodes/RibbonNode.java @@ -28,6 +28,7 @@ public RibbonNode(int id, ArrayList genomes) { inEdges = new ArrayList<>(); outEdges = new ArrayList<>(); strands = new ArrayList<>(); + this.label=""; this.genomes = genomes; this.id = id; this.x = 0; //for now @@ -84,6 +85,13 @@ public RibbonEdge getOutEdge(int idFrom, int idTo) { */ public void setLabel(String label) { this.label = label; + String newLabel=""; + for (int i = 0; i < label.length(); i+=40) { + String sub = label.substring(i, Math.min(i + 40,label.length())); + newLabel+=sub+"\n"; + } + this.label=newLabel; + } /** @@ -224,5 +232,6 @@ public void addStrands(ArrayList strands) { */ public void addStrand(Strand strand) { this.strands.add(strand); + this.setLabel(label + strand.getSequence() + "\n"); } } diff --git a/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java b/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java index 801ab4f..e49835a 100644 --- a/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java +++ b/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java @@ -48,8 +48,8 @@ public void setUp() throws Exception { */ @Test public void testGetLabel() throws Exception { - assertEquals("node1", node1.getLabel()); - assertEquals("node2", node2.getLabel()); + assertEquals("node1\n", node1.getLabel()); + assertEquals("node2\n", node2.getLabel()); } /** @@ -73,9 +73,9 @@ public void testGetEdge() throws Exception { */ @Test public void testSetLabel() throws Exception { - assertEquals("node1", node1.getLabel()); + assertEquals("node1\n", node1.getLabel()); node1.setLabel("testLabel"); - assertEquals("testLabel", node1.getLabel()); + assertEquals("testLabeln\n", node1.getLabel()); } diff --git a/tagcwebapp/src/main/java/com/pl/tagc/tagcwebapp/RibbonNodeAdapter.java b/tagcwebapp/src/main/java/com/pl/tagc/tagcwebapp/RibbonNodeAdapter.java index 621e945..7e93bcc 100644 --- a/tagcwebapp/src/main/java/com/pl/tagc/tagcwebapp/RibbonNodeAdapter.java +++ b/tagcwebapp/src/main/java/com/pl/tagc/tagcwebapp/RibbonNodeAdapter.java @@ -23,7 +23,7 @@ public RibbonNode unmarshal(AdaptedRibbonNode adaptedRibbonNode) throws Exceptio @Override public AdaptedRibbonNode marshal(RibbonNode node) throws Exception { AdaptedRibbonNode adaptedNode = new AdaptedRibbonNode(); - adaptedNode.setLabel(node.getLabel() + "Node: " +node.getId()); + adaptedNode.setLabel(node.getLabel()); adaptedNode.setId(node.getId()); adaptedNode.setGenomes(node.getGenomes()); adaptedNode.setEdges(node.getOutEdges()); diff --git a/tagcwebapp/src/main/resources/static/js/main.js b/tagcwebapp/src/main/resources/static/js/main.js index 7bc195b..ee827e5 100644 --- a/tagcwebapp/src/main/resources/static/js/main.js +++ b/tagcwebapp/src/main/resources/static/js/main.js @@ -273,7 +273,7 @@ function draw(points, c, saveRealCoordinates, yTranslate, xTranslate) { ctx.beginPath(); var xPos = xTranslate(point.x); - var yPos = nodeHeight + point.y * yTranslate * 0.3; + var yPos = nodeHeight + point.y; ctx.arc(xPos, yPos, 5, 0, 2 * Math.PI); ctx.stroke(); if (saveRealCoordinates) { From 4ad51cf2c6de8371ccb60166f15e0009b3ab3258 Mon Sep 17 00:00:00 2001 From: MatthijsRijlaarsdam Date: Fri, 3 Jun 2016 10:44:46 +0200 Subject: [PATCH 6/7] fixed y coordinates --- .../java/controller/RibbonController.java | 25 ++++++++++++++++--- backEnd/src/main/java/datatree/DataTree.java | 5 ++++ .../test/java/ribbonnodes/RibbonNodeTest.java | 2 +- .../src/main/resources/static/js/main.js | 2 +- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/backEnd/src/main/java/controller/RibbonController.java b/backEnd/src/main/java/controller/RibbonController.java index 6f2252e..10a8ced 100644 --- a/backEnd/src/main/java/controller/RibbonController.java +++ b/backEnd/src/main/java/controller/RibbonController.java @@ -99,7 +99,7 @@ public ArrayList getRibbonNodes(int minX, int maxX, int zoomLevel) { result.sort((RibbonNode o1, RibbonNode o2) -> new Integer(o1.getX()).compareTo(o2.getX())); addEdges(result); - calcYcoordinatesFromStart(result); + spreadYCoordinates(result); return result; @@ -157,7 +157,27 @@ public RibbonNode getNodeWithId(int id, ArrayList nodes) { * @param nodes The ribbonGraph to calculate y cooridnates for. * @return The ribbonGraph with added y coordinates. */ - private void calcYcoordinatesFromStart(ArrayList nodes) { + private void spreadYCoordinates(ArrayList nodes) { + int currentX = 0; + ArrayList currentXNodes = new ArrayList<>(); + for (int i = 0; i < nodes.size(); i++) { + RibbonNode node = nodes.get(i); + if (node.getX() < currentX+1000&&node.getX() >currentX-1000) { + currentXNodes.add(node); + } else { + if (currentXNodes.size() > 1) { + for (int j = 0; j < currentXNodes.size(); j++) { + currentXNodes.get(j).setY(currentXNodes.get(j).getY()-10*(genomeGraph.getActiveGenomes().size()-1)); + currentXNodes.get(j).setY((int) (currentXNodes.get(j).getY()*(Math.pow(-1,j)))); + } + } + currentXNodes = new ArrayList<>(); + currentXNodes.add(node); + currentX = node.getX(); + } + + + } } @@ -200,7 +220,6 @@ public RibbonNode addEdgeReturnEnd(ArrayList nodes, currentNode.addEdge(edge); next.addEdge(edge); } else { - currentNode.setY(currentNode.getY()+10); next.setY(next.getY()+10); RibbonEdge edge = currentNode.getOutEdge(currentNode.getId(), next.getId()); edge.addGenomeToEdge(getColorForGenome(genome)); diff --git a/backEnd/src/main/java/datatree/DataTree.java b/backEnd/src/main/java/datatree/DataTree.java index c9cb291..2359ebe 100644 --- a/backEnd/src/main/java/datatree/DataTree.java +++ b/backEnd/src/main/java/datatree/DataTree.java @@ -119,13 +119,18 @@ public Set getDataNodesForGenomes(ArrayList genomes, int level public Set getDataNodesForGenome(Genome genome, int level) { Set result = new HashSet<>(); DataNode currentNode = getRoot(); + int totalStrands = 0; while (currentNode.getLevel() <= level) { result.add(currentNode); + totalStrands+=currentNode.getStrands().size(); currentNode = currentNode.getChildWithGenome(genome.getId()); if (currentNode == null) { break; } } + if(totalStrands<10000){ + result=getDataNodesForGenome(genome, level+1); + } return result; diff --git a/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java b/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java index e49835a..109d298 100644 --- a/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java +++ b/backEnd/src/test/java/ribbonnodes/RibbonNodeTest.java @@ -75,7 +75,7 @@ public void testGetEdge() throws Exception { public void testSetLabel() throws Exception { assertEquals("node1\n", node1.getLabel()); node1.setLabel("testLabel"); - assertEquals("testLabeln\n", node1.getLabel()); + assertEquals("testLabel\n", node1.getLabel()); } diff --git a/tagcwebapp/src/main/resources/static/js/main.js b/tagcwebapp/src/main/resources/static/js/main.js index ee827e5..2a27f4f 100644 --- a/tagcwebapp/src/main/resources/static/js/main.js +++ b/tagcwebapp/src/main/resources/static/js/main.js @@ -312,7 +312,7 @@ function zoom(direction, zoomAmount, xMousePos) { var maxWidth = minimap.width(); var currentWidth = slider.width(); zoomWidth += (direction > 0)?-1*zoomAmount:zoomAmount; - zoomWidth = Math.max(1, Math.min(zoomWidth, 100)); + zoomWidth = Math.max(0.1, Math.min(zoomWidth, 100)); var newWidth = Math.max(1, Math.min(maxWidth, zoomWidth / 100 * maxWidth)); From d19a5127bc50feb0277ac8107ea63efd9b2d0eaa Mon Sep 17 00:00:00 2001 From: MatthijsRijlaarsdam Date: Fri, 3 Jun 2016 11:52:01 +0200 Subject: [PATCH 7/7] added ribboncollapsing --- .../src/main/java/controller/Controller.java | 2 + .../java/controller/RibbonController.java | 67 ++++++++++++------- backEnd/src/main/java/datatree/DataTree.java | 14 +++- .../src/main/java/ribbonnodes/RibbonNode.java | 18 ++--- 4 files changed, 67 insertions(+), 34 deletions(-) diff --git a/backEnd/src/main/java/controller/Controller.java b/backEnd/src/main/java/controller/Controller.java index a4fc168..066a850 100644 --- a/backEnd/src/main/java/controller/Controller.java +++ b/backEnd/src/main/java/controller/Controller.java @@ -52,6 +52,7 @@ public Controller() { new ArrayList<>(genomeGraph.getGenomes().keySet())); dataTree = new DataTree(new DataNode(phylogeneticTree.getRoot(), null, 0)); + dataTree.setMinStrandsToReturn(genomeGraph.getStrandNodes().size()/8); if (gfaFile.equals("data/TB328.gfa")) { TempReadWriteTree.readFile(dataTree, genomeGraph.getStrandNodes(), "data/tempTree.txt"); @@ -60,6 +61,7 @@ public Controller() { } ribbonController = new RibbonController(genomeGraph, dataTree); + ribbonController.setMaxStrandsToReturn(3000); dc = this; genomeGraph.loadMetaData(Parser.parseGenomeMetadata("data/metadata.csv")); } diff --git a/backEnd/src/main/java/controller/RibbonController.java b/backEnd/src/main/java/controller/RibbonController.java index 10a8ced..0ece60c 100644 --- a/backEnd/src/main/java/controller/RibbonController.java +++ b/backEnd/src/main/java/controller/RibbonController.java @@ -17,9 +17,9 @@ */ public final class RibbonController { - /** - * The graph that contains the geographic information of the stands. - */ + /** + * The graph that contains the geographic information of the stands. + */ private GenomeGraph genomeGraph; /** @@ -32,6 +32,11 @@ public final class RibbonController { */ private HashMap colorMap; + /** + * The maximal amount of strands to return. + */ + private int maxStrandsToReturn = 0; + /** * Create ribbonController object. * @@ -80,7 +85,6 @@ public ArrayList getRibbonNodes(int minX, int maxX, int zoomLevel) { ArrayList actGen = genomeGraph.getActiveGenomes(); - ArrayList result = new ArrayList<>(); ArrayList filteredNodes = dataTree.getStrands(minX, maxX, actGen, zoomLevel + 1); @@ -100,8 +104,9 @@ public ArrayList getRibbonNodes(int minX, int maxX, int zoomLevel) { result.sort((RibbonNode o1, RibbonNode o2) -> new Integer(o1.getX()).compareTo(o2.getX())); addEdges(result); spreadYCoordinates(result); + collapseRibbons(result, Math.max(0, 5 - zoomLevel)); - + System.out.println(result.size() + " nodes returned"); return result; } @@ -112,27 +117,33 @@ public ArrayList getRibbonNodes(int minX, int maxX, int zoomLevel) { * @param nodes The ribbonNode Graph to collapse. * @return A collapsed graph. */ - private void collapseRibbons(ArrayList nodes) { - for (int i = 0; i < nodes.size(); i++) { - RibbonNode node = nodes.get(i); - if (node != null) { - if (node.getOutEdges().size() == 1) { - RibbonNode other = getNodeWithId(node.getOutEdges().get(0).getEnd(), nodes); - if (other.getInEdges().size() == 1) { - node.addStrands(other.getStrands()); - for (RibbonEdge edge : other.getOutEdges()) { - edge.setStartId(node.getId()); + private void collapseRibbons(ArrayList nodes, int iterations) { + int nIter = 0; + int changedThisPass = 100000 ; + while (nIter < iterations && nodes.size() > maxStrandsToReturn && changedThisPass>maxStrandsToReturn/2) { + nIter++; + changedThisPass=0; + for (int i = 0; i < nodes.size(); i++) { + RibbonNode node = nodes.get(i); + if (node != null) { + if (node.getOutEdges().size() == 1) { + RibbonNode other = getNodeWithId(node.getOutEdges().get(0).getEnd(), nodes); + if (other.getInEdges().size() == 1) { + node.addStrands(other.getStrands()); + for (RibbonEdge edge : other.getOutEdges()) { + edge.setStartId(node.getId()); + } + node.setOutEdges(other.getOutEdges()); + nodes.remove(other); + changedThisPass++; } - node.setOutEdges(other.getOutEdges()); - nodes.remove(other); } } } } - - } + /** * Return a node with a certain id contained in a Ribbon Graph. * @@ -162,13 +173,13 @@ private void spreadYCoordinates(ArrayList nodes) { ArrayList currentXNodes = new ArrayList<>(); for (int i = 0; i < nodes.size(); i++) { RibbonNode node = nodes.get(i); - if (node.getX() < currentX+1000&&node.getX() >currentX-1000) { + if (node.getX() < currentX + 1000 && node.getX() > currentX - 1000) { currentXNodes.add(node); } else { if (currentXNodes.size() > 1) { for (int j = 0; j < currentXNodes.size(); j++) { - currentXNodes.get(j).setY(currentXNodes.get(j).getY()-10*(genomeGraph.getActiveGenomes().size()-1)); - currentXNodes.get(j).setY((int) (currentXNodes.get(j).getY()*(Math.pow(-1,j)))); + currentXNodes.get(j).setY(currentXNodes.get(j).getY() - 10 * (genomeGraph.getActiveGenomes().size() - 1)); + currentXNodes.get(j).setY((int) (currentXNodes.get(j).getY() * (Math.pow(-1, j)))); } } currentXNodes = new ArrayList<>(); @@ -205,6 +216,7 @@ public void addEdges(ArrayList nodes) { /** * Finds the next node that contains a certain genome. * Creates an edge between the two nodes and returns the end Node of the edge. + * * @param nodes The RibbonGraph. * @param currentNode The start node of the edge. * @param genome The genome to find an edge for. @@ -220,7 +232,7 @@ public RibbonNode addEdgeReturnEnd(ArrayList nodes, currentNode.addEdge(edge); next.addEdge(edge); } else { - next.setY(next.getY()+10); + next.setY(next.getY() + 10); RibbonEdge edge = currentNode.getOutEdge(currentNode.getId(), next.getId()); edge.addGenomeToEdge(getColorForGenome(genome)); } @@ -269,5 +281,12 @@ public Color getColorForGenome(Genome genome) { return result; } - + /** + * Set the maximal amount of strands to return. + * + * @param maxStrandsToReturn + */ + public void setMaxStrandsToReturn(int maxStrandsToReturn) { + this.maxStrandsToReturn = maxStrandsToReturn; + } } diff --git a/backEnd/src/main/java/datatree/DataTree.java b/backEnd/src/main/java/datatree/DataTree.java index 2359ebe..94e6755 100644 --- a/backEnd/src/main/java/datatree/DataTree.java +++ b/backEnd/src/main/java/datatree/DataTree.java @@ -15,6 +15,10 @@ */ public class DataTree extends TreeStructure { + /** + * The minimal amount of strands to return. + */ + private int minStrandsToReturn=0; /** * Default constructor. @@ -128,7 +132,7 @@ public Set getDataNodesForGenome(Genome genome, int level) { break; } } - if(totalStrands<10000){ + if(totalStrands getDataNodesForGenome(Genome genome, int level) { } - + /** + * Set the minimal strands to return. + * @param minStrandsToReturn The minimal strands amount to return. + */ + public void setMinStrandsToReturn(int minStrandsToReturn) { + this.minStrandsToReturn = minStrandsToReturn; + } } diff --git a/backEnd/src/main/java/ribbonnodes/RibbonNode.java b/backEnd/src/main/java/ribbonnodes/RibbonNode.java index 233c991..df3b46b 100644 --- a/backEnd/src/main/java/ribbonnodes/RibbonNode.java +++ b/backEnd/src/main/java/ribbonnodes/RibbonNode.java @@ -28,7 +28,7 @@ public RibbonNode(int id, ArrayList genomes) { inEdges = new ArrayList<>(); outEdges = new ArrayList<>(); strands = new ArrayList<>(); - this.label=""; + this.label = ""; this.genomes = genomes; this.id = id; this.x = 0; //for now @@ -85,12 +85,12 @@ public RibbonEdge getOutEdge(int idFrom, int idTo) { */ public void setLabel(String label) { this.label = label; - String newLabel=""; - for (int i = 0; i < label.length(); i+=40) { - String sub = label.substring(i, Math.min(i + 40,label.length())); - newLabel+=sub+"\n"; - } - this.label=newLabel; + String newLabel = ""; + for (int i = 0; i < label.length(); i += 40) { + String sub = label.substring(i, Math.min(i + 40, label.length())); + newLabel += sub + "\n"; + } + this.label = newLabel; } @@ -222,7 +222,9 @@ public ArrayList getStrands() { * @param strands Added strands. */ public void addStrands(ArrayList strands) { - this.strands.addAll(strands); + for (Strand strand : strands) { + addStrand(strand); + } } /**