1
1
package at .gmi .nordborglab .widgets .gwasgeneviewer .client ;
2
2
3
3
import java .util .ArrayList ;
4
+ import java .util .List ;
4
5
5
6
import org .danvk .dygraphs .client .Dygraphs ;
6
7
import org .danvk .dygraphs .client .Dygraphs .Options ;
19
20
import at .gmi .nordborglab .widgets .geneviewer .client .event .ZoomResizeHandler ;
20
21
21
22
import com .google .gwt .core .client .GWT ;
23
+ import com .google .gwt .core .client .JsArray ;
24
+ import com .google .gwt .core .client .JsArrayInteger ;
25
+ import com .google .gwt .core .client .JsArrayMixed ;
22
26
import com .google .gwt .uibinder .client .UiBinder ;
23
27
import com .google .gwt .user .client .ui .Composite ;
24
28
import com .google .gwt .user .client .ui .HTMLPanel ;
25
29
import com .google .gwt .user .client .ui .Widget ;
26
30
import com .google .gwt .uibinder .client .UiField ;
27
31
import com .google .gwt .user .client .ui .Label ;
28
32
import com .google .gwt .visualization .client .DataTable ;
33
+ import com .google .gwt .visualization .client .Selection ;
29
34
30
35
public class GWASGeneViewer extends Composite {
31
36
@@ -45,10 +50,13 @@ interface ScatterGenomeChartUiBinder extends UiBinder<Widget, GWASGeneViewer> {
45
50
protected String color ;
46
51
protected String gene_marker_color ;
47
52
protected int pointSize =2 ;
48
- protected int chr_length ;
49
53
protected int scatterChartHeight =200 ;
50
54
protected DataTable dataTable ;
51
55
protected boolean isScatterChartLoaded = false ;
56
+ protected int snpPosX = -1 ;
57
+
58
+ // use instance because getSelection() does not work in onUnderlay event, because date_graph is not properly initialized
59
+ protected JsArray <Selection > selections =JsArray .createArray ().cast ();
52
60
53
61
protected SelectHandler selectHandler =null ;
54
62
protected ClickGeneHandler clickGeneHandler = null ;
@@ -62,10 +70,12 @@ interface ScatterGenomeChartUiBinder extends UiBinder<Widget, GWASGeneViewer> {
62
70
protected int width = 1000 ;
63
71
protected int geneViewerHeight = 200 ;
64
72
protected DataSource datasource = null ;
65
-
73
+ protected int viewStart = 0 ;
74
+ protected int viewEnd = 0 ;
66
75
protected ArrayList <Gene > displayGenes = new ArrayList <Gene >();
67
76
68
77
78
+
69
79
70
80
public GWASGeneViewer () {
71
81
initWidget (uiBinder .createAndBindUi (this ));
@@ -101,7 +111,7 @@ private void initGenomeView()
101
111
{
102
112
try
103
113
{
104
- geneViewer .setLength ( chr_length );
114
+ geneViewer .setViewRegion ( viewStart , viewEnd );
105
115
geneViewer .setSize (width - DYGRAPHOFFSET , geneViewerHeight );
106
116
geneViewer .load (new Runnable () {
107
117
@ Override
@@ -119,7 +129,13 @@ public void onZoomResize(ZoomResizeEvent event) {
119
129
});
120
130
if (clickGeneHandler != null )
121
131
geneViewer .addClickGeneHandler (clickGeneHandler );
132
+
133
+ if (minZoomLevelForGenomeView >= (viewEnd - viewStart )) {
134
+ toggleGenomeViewVisible (true );
135
+ geneViewer .redraw (true );
136
+ }
122
137
}
138
+
123
139
});
124
140
}
125
141
catch (Exception e )
@@ -131,12 +147,13 @@ public void refresh() {
131
147
scatterChart .redraw ();
132
148
}
133
149
134
- public void draw (DataTable dataTable ,double max_value , int chr_length )
150
+ public void draw (DataTable dataTable ,double max_value , int start , int end )
135
151
{
136
152
this .dataTable = dataTable ;
137
153
this .max_value = max_value ;
138
- this .chr_length = chr_length ;
139
- geneViewer .setLength (chr_length );
154
+ this .viewStart = start ;
155
+ this .viewEnd = end ;
156
+ geneViewer .setViewRegion (start ,end );
140
157
geneViewer .setChromosome (chromosome );
141
158
geneViewer .setDataSource (datasource );
142
159
geneViewer .setSize (width - DYGRAPHOFFSET , geneViewerHeight );
@@ -147,14 +164,22 @@ public void draw(DataTable dataTable,double max_value, int chr_length)
147
164
148
165
@ Override
149
166
public void onZoom (ZoomEvent event ) {
150
-
151
- if (event . maxX - event . minX <= minZoomLevelForGenomeView )
167
+ int zoomLength = event . maxX - event . minX ;
168
+ if (zoomLength > viewEnd - viewStart )
152
169
{
170
+ scatterChart .setValueRangeX (viewStart , viewEnd );
153
171
geneViewer .updateZoom (event .minX , event .maxX );
154
- toggleGenomeViewVisible (true );
155
172
}
156
173
else
157
- toggleGenomeViewVisible (false );
174
+ {
175
+ if (event .maxX - event .minX <= minZoomLevelForGenomeView )
176
+ {
177
+ geneViewer .updateZoom (event .minX , event .maxX );
178
+ toggleGenomeViewVisible (true );
179
+ }
180
+ else
181
+ toggleGenomeViewVisible (false );
182
+ }
158
183
}
159
184
});
160
185
@@ -185,7 +210,7 @@ protected void drawScatterChart()
185
210
@ Override
186
211
public void onUnderlay (UnderlayEvent event ) {
187
212
for (Gene gene :displayGenes ) {
188
- if (gene .getChromosome ().equals (chromosome ))
213
+ if (gene .getChromosome ().equals (chromosome ) && ( gene . getStart () >= viewStart || gene . getEnd () <= viewEnd ) )
189
214
{
190
215
double left = event .dygraph .toDomXCoord (gene .getStart ());
191
216
double right = event .dygraph .toDomXCoord (gene .getEnd ());
@@ -195,14 +220,45 @@ public void onUnderlay(UnderlayEvent event) {
195
220
left = left -0.5 ;
196
221
length = 1 ;
197
222
}
223
+ event .canvas .save ();
198
224
event .canvas .setFillStyle (gene_marker_color );
199
225
event .canvas .fillRect (left , event .area .getY (), length , event .area .getH ());
226
+ event .canvas .restore ();
200
227
}
201
228
}
229
+
230
+ for (int i =0 ;i <selections .length ();i ++)
231
+ {
232
+ Selection selection = selections .get (i );
233
+ double posX = event .dygraph .toDomXCoord (dataTable .getValueInt (selection .getRow (), 0 ));
234
+ double posY = event .dygraph .toDomYCoord (dataTable .getValueDouble (selection .getRow (), 1 ), 0 );
235
+ event .canvas .save ();
236
+ event .canvas .beginPath ();
237
+ event .canvas .setFillStyle (gene_marker_color );
238
+ event .canvas .fillRect (posX -0.5 , posY , 1 , event .area .getH ());
239
+ event .canvas .arc (posX , posY , 3 , 0 , 2 *Math .PI , false );
240
+ event .canvas .fill ();
241
+ event .canvas .restore ();
242
+ }
202
243
}
244
+
203
245
},options );
204
246
scatterChart .setID (chromosome );
247
+ if (snpPosX > -1 ) {
248
+ Selection selection = null ;
249
+ for (int i =0 ;i <dataTable .getNumberOfRows ();i ++) {
250
+ if (dataTable .getValueInt (i , 0 ) == snpPosX ) {
251
+ selection = Selection .createRowSelection (i );
252
+ break ;
253
+ }
254
+ }
255
+ selections .set (0 , selection );
256
+ }
205
257
scatterChart .draw (dataTable ,setOptions (options ));
258
+ if (selections .length () > 0 )
259
+ scatterChart .setSelections (selections );
260
+
261
+ //scatterChart.setSelections()
206
262
isScatterChartLoaded = true ;
207
263
}
208
264
@@ -220,6 +276,7 @@ protected Options setOptions(Dygraphs.Options options){
220
276
options .setColors (new String [] {color });
221
277
options .setMinimumDistanceForHighlight (10 );
222
278
options .setIncludeYPositionForHightlight (true );
279
+ options .setDateWindow (viewStart , viewEnd );
223
280
return options ;
224
281
}
225
282
@@ -242,7 +299,11 @@ public void setColor(String color) {
242
299
243
300
public void setPointSize (int pointSize ) {
244
301
this .pointSize = pointSize ;
245
-
302
+ }
303
+
304
+ public void setViewRegion (int start , int end ) {
305
+ this .viewStart = start ;
306
+ this .viewEnd = end ;
246
307
}
247
308
248
309
public void setWidth (int width ) {
@@ -272,4 +333,12 @@ public void addClickGeneHandler(ClickGeneHandler handler) {
272
333
else
273
334
this .clickGeneHandler = handler ;
274
335
}
336
+
337
+ public void setSnpPosX (int snpPosX ) {
338
+ this .snpPosX = snpPosX ;
339
+ }
340
+
341
+ public void setGeneInfoUrl (String geneInfoUrl ) {
342
+ geneViewer .setGeneInfoUrl (geneInfoUrl );
343
+ }
275
344
}
0 commit comments