1 package com.github.celldynamics.quimp.plugin.protanalysis;
2
3 import java.awt.Point;
4 import java.awt.Polygon;
5 import java.io.IOException;
6 import java.io.Writer;
7 import java.util.ArrayList;
8 import java.util.Collections;
9 import java.util.Iterator;
10 import java.util.List;
11
12 import org.apache.commons.lang3.tuple.ImmutablePair;
13 import org.apache.commons.lang3.tuple.Pair;
14
15
16
17
18
19
20
21 public class TrackCollection {
22
23
24
25
26
27 private ArrayList<Pair<Track, Track>> bf;
28
29
30
31
32
33 private boolean isInitialPointIncluded;
34
35
36
37
38
39
40 public boolean isInitialPointIncluded() {
41 return isInitialPointIncluded;
42 }
43
44 private int nextId = 0;
45
46
47
48
49
50
51 public TrackCollection(boolean isInitialPointIncluded) {
52 bf = new ArrayList<>();
53 this.isInitialPointIncluded = isInitialPointIncluded;
54 }
55
56
57
58
59
60
61
62
63 public void addPair(Polygon backward, Polygon forward) {
64 Trackmics/quimp/plugin/protanalysis/Track.html#Track">Track tmpB = new Track(nextId++, null);
65 for (int i = 0; i < backward.npoints; i++) {
66 tmpB.add(new Point(backward.xpoints[i], backward.ypoints[i]));
67 }
68 Trackmics/quimp/plugin/protanalysis/Track.html#Track">Track tmpF = new Track(nextId++, null);
69 for (int i = 0; i < forward.npoints; i++) {
70 tmpF.add(new Point(forward.xpoints[i], forward.ypoints[i]));
71 }
72 bf.add(new ImmutablePair<Track, Track>(tmpB, tmpF));
73 }
74
75
76
77
78
79
80
81
82 public void addPair(List<Point> backward, List<Point> forward) {
83 Trackynamics/quimp/plugin/protanalysis/Track.html#Track">Track b = new Track(backward, nextId++, null);
84 b.type = Track.TrackType.BACKWARD;
85 Trackynamics/quimp/plugin/protanalysis/Track.html#Track">Track f = new Track(forward, nextId++, null);
86 f.type = Track.TrackType.FORWARD;
87 bf.add(new ImmutablePair<Track, Track>(b, f));
88
89 }
90
91
92
93
94
95
96 public Iterator<Pair<Track, Track>> iterator() {
97 return bf.iterator();
98 }
99
100
101
102
103
104
105 public Iterator<Track> iteratorTrack() {
106 List<Track> ret = new ArrayList<>();
107 for (Pair<Track, Track> p : bf) {
108 ret.add(p.getLeft());
109 ret.add(p.getRight());
110 }
111 return ret.iterator();
112 }
113
114
115
116
117
118
119 public List<Pair<Track, Track>> getBf() {
120 return Collections.unmodifiableList(bf);
121 }
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 public void saveTracks(Writer writer) throws IOException {
151 Iterator<Pair<Track, Track>> iter = iterator();
152 int pointno = 0;
153
154 writer.write("# Each tracked point has two tracks connected to it: backward and forward\n");
155 writer.write("# Each track is defined by two coordinates: frame nummber and outline position\n");
156 writer.write("# Numbers are indexes of maQP arrays taht can be extracted from QCONF\n");
157 writer.write("# by FormatConverter.\n");
158 while (iter.hasNext()) {
159 Pair<Track, Track> track = iter.next();
160 StringBuilder sb = new StringBuilder();
161
162 sb.append(String.format("Point %03d backward;[frame]", pointno));
163 sb.append(',');
164 for (Point p : track.getLeft()) {
165 sb.append(p.x);
166 sb.append(',');
167 }
168 sb.deleteCharAt(sb.length() - 1);
169 sb.append('\n');
170
171 sb.append(String.format("Point %03d backward;[index]", pointno));
172 sb.append(',');
173 for (Point p : track.getLeft()) {
174 sb.append(p.y);
175 sb.append(',');
176 }
177 sb.deleteCharAt(sb.length() - 1);
178 sb.append('\n');
179
180 sb.append(String.format("Point %03d forward;[frame]", pointno));
181 sb.append(',');
182 for (Point p : track.getRight()) {
183 sb.append(p.x);
184 sb.append(',');
185 }
186 sb.deleteCharAt(sb.length() - 1);
187 sb.append('\n');
188
189 sb.append(String.format("Point %03d forward;[index]", pointno));
190 sb.append(',');
191 for (Point p : track.getRight()) {
192 sb.append(p.y);
193 sb.append(',');
194 }
195 sb.deleteCharAt(sb.length() - 1);
196 sb.append('\n');
197
198 writer.write(sb.toString());
199 pointno++;
200 }
201 }
202
203 }