Skip to content

Commit d1bbdf6

Browse files
committed
Merge pull request #83 from ProgrammingLife3/fix/edgeWeight
Fix/edge weight
2 parents 3dd64a5 + 844961c commit d1bbdf6

File tree

8 files changed

+135
-38
lines changed

8 files changed

+135
-38
lines changed

src/main/java/tudelft/ti2806/pl3/data/filter/Filter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
* the element type to filter
1414
*/
1515
public interface Filter<T> {
16-
16+
17+
List<String> getGenomes();
18+
1719
void filter(List<T> list);
1820
}

src/main/java/tudelft/ti2806/pl3/data/filter/GenomeFilter.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public GenomeFilter(List<String> genomes) {
2121
this.genomes = genomes;
2222
}
2323

24+
@Override
25+
public List<String> getGenomes() {
26+
return genomes;
27+
}
28+
2429
/**
2530
* Filter that removes all nodes that are not in the genome list.
2631
* It also removes the genomes from the node that should be filtered out.
@@ -44,4 +49,27 @@ public void filter(List<DataNode> nodes) {
4449
}
4550
nodes.removeAll(remove);
4651
}
52+
53+
@Override
54+
public boolean equals(Object o) {
55+
if (this == o) {
56+
return true;
57+
}
58+
if (o == null || getClass() != o.getClass()) {
59+
return false;
60+
}
61+
62+
GenomeFilter that = (GenomeFilter) o;
63+
64+
if (genomes != null ? !genomes.equals(that.genomes) : that.genomes != null) {
65+
return false;
66+
}
67+
68+
return true;
69+
}
70+
71+
@Override
72+
public int hashCode() {
73+
return genomes != null ? genomes.hashCode() : 0;
74+
}
4775
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package tudelft.ti2806.pl3.util;
2+
3+
import java.util.Collection;
4+
import java.util.List;
5+
import java.util.Set;
6+
import java.util.stream.Collectors;
7+
8+
/**
9+
* Created by Boris Mattijssen on 17-06-15.
10+
*/
11+
public class CollectionUtil {
12+
13+
private CollectionUtil() {}
14+
15+
16+
/**
17+
* Calculates the intersection between two collections.
18+
*
19+
* @param collection1
20+
* collection 1
21+
* @param collection2
22+
* collection 2
23+
* @param <T>
24+
* type of both collections
25+
* @return the intersection between the two collections
26+
*/
27+
public static <T> Collection<T> intersection(Collection<T> collection1, Collection<T> collection2) {
28+
return collection1.stream().filter(t -> collection2.contains(t)).collect(Collectors.toList());
29+
}
30+
31+
/**
32+
* Calculates the intersection between two collections.
33+
*
34+
* @param collection1
35+
* collection 1
36+
* @param collection2
37+
* collection 2
38+
* @param <T>
39+
* type of both collections
40+
* @return the intersection between the two collections
41+
*/
42+
public static <T> Set<T> intersectionListSet(List<T> collection1, Set<T> collection2) {
43+
return collection1.stream().filter(t -> collection2.contains(t)).collect(Collectors.toSet());
44+
}
45+
}

src/main/java/tudelft/ti2806/pl3/util/EdgeUtil.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -120,33 +120,12 @@ public static void setEdgeWeight(List<WrapperClone> wrapperClones) {
120120
Set<Genome> genomes = new HashSet<>(wrapperClone.getGenome());
121121
Collections.sort(wrapperClone.getOutgoing());
122122
for (Wrapper outgoing : wrapperClone.getOutgoing()) {
123-
Collection<Genome> intersection = intersection(outgoing.getGenome(), genomes);
123+
Collection<Genome> intersection = CollectionUtil.intersection(
124+
outgoing.getGenome(), genomes);
124125
wrapperClone.getOutgoingWeight().add(intersection.size());
125126
genomes.removeAll(intersection);
126127
}
127128
}
128129
}
129130

130-
/**
131-
* Calculates the intersection between two collections.
132-
*
133-
* @param collection1
134-
* collection 1
135-
* @param collection2
136-
* collection 2
137-
* @param <T>
138-
* type of both collections
139-
* @return the intersection between the two collections
140-
*/
141-
public static <T> Collection<T> intersection(Collection<T> collection1, Collection<T> collection2) {
142-
Collection<T> list = new ArrayList<T>();
143-
144-
for (T t : collection1) {
145-
if (collection2.contains(t)) {
146-
list.add(t);
147-
}
148-
}
149-
150-
return list;
151-
}
152131
}

src/main/java/tudelft/ti2806/pl3/visualization/FilteredGraphModel.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import tudelft.ti2806.pl3.ScreenSize;
44
import tudelft.ti2806.pl3.data.Genome;
5-
import tudelft.ti2806.pl3.util.observable.LoadingObservable;
6-
import tudelft.ti2806.pl3.util.observers.LoadingObserver;
75
import tudelft.ti2806.pl3.data.filter.Filter;
86
import tudelft.ti2806.pl3.data.graph.DataNode;
97
import tudelft.ti2806.pl3.data.graph.Edge;
@@ -16,12 +14,18 @@
1614
import tudelft.ti2806.pl3.data.wrapper.operation.yposition.PositionNodeYOnGenomeSpace;
1715
import tudelft.ti2806.pl3.data.wrapper.util.WrapUtil;
1816
import tudelft.ti2806.pl3.util.CollectInterest;
17+
import tudelft.ti2806.pl3.util.CollectionUtil;
1918
import tudelft.ti2806.pl3.util.EdgeUtil;
19+
import tudelft.ti2806.pl3.util.observable.LoadingObservable;
20+
import tudelft.ti2806.pl3.util.observers.LoadingObserver;
2021

2122
import java.util.ArrayList;
22-
import java.util.Collection;
23+
import java.util.HashMap;
24+
import java.util.HashSet;
2325
import java.util.List;
26+
import java.util.Map;
2427
import java.util.Observable;
28+
import java.util.Set;
2529

2630
/**
2731
* This model filters the original graph data, based on the filter selections.
@@ -40,7 +44,7 @@ public class FilteredGraphModel extends Observable implements LoadingObservable,
4044

4145
protected GraphDataRepository originalGraphData;
4246
private Wrapper collapsedNode;
43-
private Collection<Filter<DataNode>> filters;
47+
private List<Filter<DataNode>> filters;
4448
private PositionNodeYOnGenomeSpace positionNodeYOnGenomeSpace;
4549

4650
private ArrayList<LoadingObserver> loadingObservers = new ArrayList<>();
@@ -49,6 +53,8 @@ public class FilteredGraphModel extends Observable implements LoadingObservable,
4953
private CollectInterest collectInterest;
5054
private List<Genome> genomes;
5155

56+
private Map<List<Filter<DataNode>>, Integer> filtersToGenomesCountMap;
57+
5258
/**
5359
* Construct the model containing the filtered data.<br>
5460
* The model gets the original graph data and filters this data. Then it informs its listeners, to give them the
@@ -61,11 +67,12 @@ public FilteredGraphModel(GraphDataRepository originalGraphData) {
6167
this.originalGraphData = originalGraphData;
6268
filters = new ArrayList<>();
6369
genomes = new ArrayList<>();
70+
filtersToGenomesCountMap = new HashMap<>();
6471
positionNodeYOnGenomeSpace = new PositionNodeYOnGenomeSpace();
6572
calculateCollapse = new CalculateCollapseOnSpace();
6673
}
6774

68-
public void setFilters(Collection<Filter<DataNode>> filters) {
75+
public void setFilters(List<Filter<DataNode>> filters) {
6976
this.filters = filters;
7077
}
7178

@@ -186,4 +193,32 @@ public void graphParsed() {
186193
public List<Genome> getGenomes() {
187194
return genomes;
188195
}
196+
197+
/**
198+
* Count the genomes in the filtered data.
199+
* @return
200+
* returns the amount of genomes in the original data set when no filters are applied,
201+
* otherwise it calculates the amount of genomes in the filtered data and returns it.
202+
*/
203+
public int getGenomesCount() {
204+
if (filters.size() > 0) {
205+
if (filtersToGenomesCountMap.get(filters) == null) {
206+
if (filters.size() == 1) {
207+
filtersToGenomesCountMap.put(filters,
208+
filters.iterator().next().getGenomes().size());
209+
} else if (filters.size() > 1) {
210+
Set<String> filteredGenomes = new HashSet<>(
211+
filters.iterator().next().getGenomes());
212+
for (Filter<DataNode> filter : filters) {
213+
filteredGenomes = CollectionUtil.intersectionListSet(
214+
filter.getGenomes(), filteredGenomes);
215+
}
216+
filtersToGenomesCountMap.put(filters, filteredGenomes.size());
217+
}
218+
}
219+
return filtersToGenomesCountMap.get(filters);
220+
} else {
221+
return genomes.size();
222+
}
223+
}
189224
}

src/main/java/tudelft/ti2806/pl3/visualization/GraphController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public void parseGraph(File nodeFile, File edgeFile) throws FileNotFoundExceptio
101101
*/
102102
public void addFilter(String name, Filter<DataNode> filter) {
103103
filters.put(name, filter);
104-
filteredGraphModel.setFilters(filters.values());
104+
filteredGraphModel.setFilters(new ArrayList<>(filters.values()));
105105
filteredGraphModel.produceWrappedGraphData();
106106
graphMoved();
107107
}

src/main/java/tudelft/ti2806/pl3/visualization/GraphView.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@
88
import org.graphstream.ui.swingViewer.View;
99
import org.graphstream.ui.swingViewer.Viewer;
1010
import org.graphstream.ui.swingViewer.util.DefaultShortcutManager;
11-
import tudelft.ti2806.pl3.util.observable.LoadingObservable;
12-
import tudelft.ti2806.pl3.util.observers.LoadingObserver;
13-
import tudelft.ti2806.pl3.controls.MouseManager;
11+
1412
import tudelft.ti2806.pl3.ScreenSize;
13+
import tudelft.ti2806.pl3.controls.MouseManager;
1514
import tudelft.ti2806.pl3.data.graph.DataNode;
1615
import tudelft.ti2806.pl3.data.wrapper.Wrapper;
1716
import tudelft.ti2806.pl3.data.wrapper.WrapperClone;
1817
import tudelft.ti2806.pl3.exception.EdgeZeroWeightException;
1918
import tudelft.ti2806.pl3.exception.NodeNotFoundException;
19+
import tudelft.ti2806.pl3.util.observable.LoadingObservable;
20+
import tudelft.ti2806.pl3.util.observers.LoadingObserver;
2021

2122
import java.awt.Component;
2223
import java.awt.event.ComponentAdapter;
@@ -36,7 +37,9 @@
3637
*/
3738
public class GraphView
3839
implements Observer, tudelft.ti2806.pl3.View, ViewInterface, LoadingObservable {
39-
/**
40+
private static final float EDGE_THICKNESS_SCALE = 10f;
41+
42+
/**
4043
* The zoomLevel used to draw the graph.<br>
4144
* A zoom level of 1.0 shows the graph 1:1, so that every base pair should
4245
* be readable, each with pixels to draw its
@@ -125,7 +128,7 @@ public Graph generateGraph() throws EdgeZeroWeightException {
125128
graph.clear();
126129
setGraphPropertys();
127130
final double someSize = panel.getBounds().height
128-
/ ((double) panel.getBounds().width * zoomLevel / zoomedGraphModel
131+
/ (panel.getBounds().width * zoomLevel / zoomedGraphModel
129132
.getWrappedCollapsedNode().getWidth())
130133
/ zoomedGraphModel.getWrappedCollapsedNode().getGenome().size();
131134
graphData.forEach(node -> {
@@ -169,13 +172,14 @@ private void addNormalEdge(Graph graph, Wrapper from, Wrapper to, int i) throws
169172
Edge edge = graph.addEdge(from.getId() + "-" + to.getId(),
170173
Integer.toString(from.getId()), Integer.toString(to.getId()), true);
171174
int weight = from.getOutgoingWeight().get(i);
172-
float percent = ((float) weight) / ((float) zoomedGraphModel.getGenomes().size());
175+
float percent = ((float) weight) / ((float) zoomedGraphModel.getGenomesCount());
176+
173177
if (weight == 0) {
174178
edge.addAttribute("ui.label", "fix me!");
175179
throw new EdgeZeroWeightException(
176180
"The weight of the edge from " + from + " to " + to + " cannot be 0.");
177181
} else {
178-
edge.addAttribute("ui.style", "size: " + (percent * 5f) + "px;");
182+
edge.addAttribute("ui.style", "size: " + (percent * EDGE_THICKNESS_SCALE) + "px;");
179183
}
180184
}
181185

@@ -226,7 +230,7 @@ public double getViewPercent() {
226230
*/
227231
public void setOffsetToCenter() {
228232
Point3 point3 = viewer.getDefaultView().getCamera()
229-
.transformPxToGu(0, (double) ScreenSize.getInstance().getHeight() / 2d);
233+
.transformPxToGu(0, ScreenSize.getInstance().getHeight() / 2d);
230234
offsetToCenter = (float) point3.x * -1;
231235
}
232236

src/main/java/tudelft/ti2806/pl3/visualization/ZoomedGraphModel.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,8 @@ public void notifyLoadingObservers(Object arguments) {
142142
loadingObserver.update(this, arguments);
143143
}
144144
}
145+
146+
public int getGenomesCount() {
147+
return filteredGraphModel.getGenomesCount();
148+
}
145149
}

0 commit comments

Comments
 (0)