Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.ws.jws2

File AADisorderClient.java

 

Coverage histogram

../../../img/srcFileCovDistChart0.png
56% of files have more coverage

Code metrics

50
144
6
1
381
312
38
0.26
24
6
6.33

Classes

Class Line # Actions
AADisorderClient 49 144 38 200
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
7    * Jalview is free software: you can redistribute it and/or
8    * modify it under the terms of the GNU General Public License
9    * as published by the Free Software Foundation, either version 3
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.ws.jws2;
22   
23    import jalview.api.FeatureColourI;
24    import jalview.bin.Cache;
25    import jalview.datamodel.AlignmentAnnotation;
26    import jalview.datamodel.GraphLine;
27    import jalview.datamodel.SequenceFeature;
28    import jalview.datamodel.SequenceI;
29    import jalview.gui.AlignFrame;
30    import jalview.schemes.FeatureColour;
31    import jalview.util.ColorUtils;
32    import jalview.ws.jws2.jabaws2.Jws2Instance;
33    import jalview.ws.params.WsParamSetI;
34   
35    import java.awt.Color;
36    import java.util.ArrayList;
37    import java.util.HashMap;
38    import java.util.Hashtable;
39    import java.util.Iterator;
40    import java.util.List;
41    import java.util.Map;
42   
43    import compbio.data.sequence.FastaSequence;
44    import compbio.data.sequence.Range;
45    import compbio.data.sequence.Score;
46    import compbio.data.sequence.ScoreManager.ScoreHolder;
47    import compbio.metadata.Argument;
48   
 
49    public class AADisorderClient extends JabawsCalcWorker
50    {
51   
52    private static final String THRESHOLD = "THRESHOLD";
53   
54    private static final String RANGE = "RANGE";
55   
56    String typeName;
57   
58    String methodName;
59   
60    String groupName;
61   
62    AlignFrame af;
63   
 
64  0 toggle public AADisorderClient(Jws2Instance sh, AlignFrame alignFrame,
65    WsParamSetI thePreset, List<Argument> paramset)
66    {
67  0 super(sh, alignFrame, thePreset, paramset);
68  0 af = alignFrame;
69  0 typeName = sh.action;
70  0 methodName = sh.serviceType;
71   
72  0 submitGaps = false;
73  0 alignedSeqs = false;
74  0 nucleotidesAllowed = false;
75  0 proteinAllowed = true;
76  0 bySequence = true;
77    }
78   
 
79  0 toggle @Override
80    public String getServiceActionText()
81    {
82  0 return "Submitting amino acid sequences for disorder prediction.";
83    }
84   
 
85  0 toggle @Override
86    boolean checkValidInputSeqs(boolean dynamic, List<FastaSequence> seqs)
87    {
88  0 return (seqs.size() > 0);
89    }
90   
91    private static Map<String, Map<String, String[]>> featureMap;
92   
93    private static Map<String, Map<String, Map<String, Object>>> annotMap;
94   
95    private static String DONTCOMBINE = "DONTCOMBINE";
96   
97    private static String INVISIBLE = "INVISIBLE";
 
98  0 toggle static
99    {
100    // TODO: turn this into some kind of configuration file that's a bit easier
101    // to edit
102  0 featureMap = new HashMap<>();
103  0 Map<String, String[]> fmap;
104  0 featureMap.put(compbio.ws.client.Services.IUPredWS.toString(),
105    fmap = new HashMap<>());
106  0 fmap.put("Glob",
107    new String[]
108    { "Globular Domain", "Predicted globular domain" });
109  0 featureMap.put(compbio.ws.client.Services.JronnWS.toString(),
110    fmap = new HashMap<>());
111  0 featureMap.put(compbio.ws.client.Services.DisemblWS.toString(),
112    fmap = new HashMap<>());
113  0 fmap.put("REM465", new String[] { "REM465", "Missing density" });
114  0 fmap.put("HOTLOOPS", new String[] { "HOTLOOPS", "Flexible loops" });
115  0 fmap.put("COILS", new String[] { "COILS", "Random coil" });
116  0 featureMap.put(compbio.ws.client.Services.GlobPlotWS.toString(),
117    fmap = new HashMap<>());
118  0 fmap.put("GlobDoms",
119    new String[]
120    { "Globular Domain", "Predicted globular domain" });
121  0 fmap.put("Disorder",
122    new String[]
123    { "Protein Disorder", "Probable unstructured peptide region" });
124  0 Map<String, Map<String, Object>> amap;
125  0 annotMap = new HashMap<>();
126  0 annotMap.put(compbio.ws.client.Services.GlobPlotWS.toString(),
127    amap = new HashMap<>());
128  0 amap.put("Dydx", new HashMap<String, Object>());
129  0 amap.get("Dydx").put(DONTCOMBINE, DONTCOMBINE);
130  0 amap.get("Dydx").put(THRESHOLD, new double[] { 1, 0 });
131  0 amap.get("Dydx").put(RANGE, new float[] { -1, +1 });
132   
133  0 amap.put("SmoothedScore", new HashMap<String, Object>());
134  0 amap.get("SmoothedScore").put(INVISIBLE, INVISIBLE);
135  0 amap.put("RawScore", new HashMap<String, Object>());
136  0 amap.get("RawScore").put(INVISIBLE, INVISIBLE);
137  0 annotMap.put(compbio.ws.client.Services.DisemblWS.toString(),
138    amap = new HashMap<>());
139  0 amap.put("COILS", new HashMap<String, Object>());
140  0 amap.put("HOTLOOPS", new HashMap<String, Object>());
141  0 amap.put("REM465", new HashMap<String, Object>());
142  0 amap.get("COILS").put(THRESHOLD, new double[] { 1, 0.516 });
143  0 amap.get("COILS").put(RANGE, new float[] { 0, 1 });
144   
145  0 amap.get("HOTLOOPS").put(THRESHOLD, new double[] { 1, 0.6 });
146  0 amap.get("HOTLOOPS").put(RANGE, new float[] { 0, 1 });
147  0 amap.get("REM465").put(THRESHOLD, new double[] { 1, 0.1204 });
148  0 amap.get("REM465").put(RANGE, new float[] { 0, 1 });
149   
150  0 annotMap.put(compbio.ws.client.Services.IUPredWS.toString(),
151    amap = new HashMap<>());
152  0 amap.put("Long", new HashMap<String, Object>());
153  0 amap.put("Short", new HashMap<String, Object>());
154  0 amap.get("Long").put(THRESHOLD, new double[] { 1, 0.5 });
155  0 amap.get("Long").put(RANGE, new float[] { 0, 1 });
156  0 amap.get("Short").put(THRESHOLD, new double[] { 1, 0.5 });
157  0 amap.get("Short").put(RANGE, new float[] { 0, 1 });
158  0 annotMap.put(compbio.ws.client.Services.JronnWS.toString(),
159    amap = new HashMap<>());
160  0 amap.put("JRonn", new HashMap<String, Object>());
161  0 amap.get("JRonn").put(THRESHOLD, new double[] { 1, 0.5 });
162  0 amap.get("JRonn").put(RANGE, new float[] { 0, 1 });
163    }
164   
 
165  0 toggle @Override
166    public void updateResultAnnotation(boolean immediate)
167    {
168   
169  0 if (immediate || !calcMan.isWorking(this) && scoremanager != null)
170    {
171  0 Map<String, String[]> featureTypeMap = featureMap
172    .get(service.serviceType);
173  0 Map<String, Map<String, Object>> annotTypeMap = annotMap
174    .get(service.serviceType);
175  0 boolean dispFeatures = false;
176  0 Map<String, Object> fc = new Hashtable<>();
177  0 List<AlignmentAnnotation> ourAnnot = new ArrayList<>();
178    /**
179    * grouping for any annotation rows created
180    */
181  0 int graphGroup = 1;
182  0 if (alignViewport.getAlignment().getAlignmentAnnotation() != null)
183    {
184  0 for (AlignmentAnnotation ala : alignViewport.getAlignment()
185    .getAlignmentAnnotation())
186    {
187  0 if (ala.graphGroup > graphGroup)
188    {
189  0 graphGroup = ala.graphGroup;
190    }
191    }
192    }
193   
194  0 for (String seqId : seqNames.keySet())
195    {
196  0 boolean sameGroup = false;
197  0 SequenceI dseq, aseq, seq = seqNames.get(seqId);
198  0 int base = seq.findPosition(start) - 1;
199  0 aseq = seq;
200  0 while ((dseq = seq).getDatasetSequence() != null)
201    {
202  0 seq = seq.getDatasetSequence();
203    }
204  0 ScoreHolder scores = null;
205  0 try
206    {
207  0 scores = scoremanager.getAnnotationForSequence(seqId);
208    } catch (Exception q)
209    {
210  0 Cache.log
211    .info("Couldn't recover disorder prediction for sequence "
212    + seq.getName() + "(Prediction name was " + seqId
213    + ")"
214    + "\nSee http://issues.jalview.org/browse/JAL-1319 for one possible reason why disorder predictions might fail.");
215    }
216  0 float last = Float.NaN, val = Float.NaN;
217  0 int lastAnnot = ourAnnot.size();
218  0 if (scores != null && scores.scores != null)
219    {
220  0 for (Score scr : scores.scores)
221    {
222   
223  0 if (scr.getRanges() != null && scr.getRanges().size() > 0)
224    {
225  0 Iterator<Float> vals = scr.getScores().iterator();
226    // make features on sequence
227  0 for (Range rn : scr.getRanges())
228    {
229   
230  0 SequenceFeature sf;
231  0 String[] type = featureTypeMap.get(scr.getMethod());
232  0 if (type == null)
233    {
234    // create a default type for this feature
235  0 type = new String[] {
236    typeName + " (" + scr.getMethod() + ")",
237    service.getActionText() };
238    }
239  0 if (vals.hasNext())
240    {
241  0 val = vals.next().floatValue();
242  0 sf = new SequenceFeature(type[0], type[1],
243    base + rn.from, base + rn.to, val, methodName);
244    }
245    else
246    {
247  0 sf = new SequenceFeature(type[0], type[1],
248    base + rn.from, base + rn.to, methodName);
249    }
250  0 dseq.addSequenceFeature(sf);
251  0 if (last != val && !Float.isNaN(last))
252    {
253  0 fc.put(sf.getType(), sf);
254    }
255  0 last = val;
256  0 dispFeatures = true;
257    }
258    }
259    else
260    {
261  0 if (scr.getScores().size() == 0)
262    {
263  0 continue;
264    }
265  0 String typename, calcName;
266  0 AlignmentAnnotation annot = createAnnotationRowsForScores(
267    ourAnnot,
268    typename = service.serviceType + " ("
269    + scr.getMethod() + ")",
270    calcName = service.getServiceTypeURI() + "/"
271    + scr.getMethod(),
272    aseq, base + 1, scr);
273  0 annot.graph = AlignmentAnnotation.LINE_GRAPH;
274   
275  0 Map<String, Object> styleMap = (annotTypeMap == null) ? null
276    : annotTypeMap.get(scr.getMethod());
277   
278  0 annot.visible = (styleMap == null
279    || styleMap.get(INVISIBLE) == null);
280  0 double[] thrsh = (styleMap == null) ? null
281    : (double[]) styleMap.get(THRESHOLD);
282  0 float[] range = (styleMap == null) ? null
283    : (float[]) styleMap.get(RANGE);
284  0 if (range != null)
285    {
286  0 annot.graphMin = range[0];
287  0 annot.graphMax = range[1];
288    }
289  0 if (styleMap == null || styleMap.get(DONTCOMBINE) == null)
290    {
291    {
292  0 if (!sameGroup)
293    {
294  0 graphGroup++;
295  0 sameGroup = true;
296    }
297   
298  0 annot.graphGroup = graphGroup;
299    }
300    }
301   
302  0 annot.description = "<html>" + service.getActionText()
303    + " - raw scores";
304  0 if (thrsh != null)
305    {
306  0 String threshNote = (thrsh[0] > 0 ? "Above " : "Below ")
307    + thrsh[1] + " indicates disorder";
308  0 annot.threshold = new GraphLine((float) thrsh[1],
309    threshNote, Color.red);
310  0 annot.description += "<br/>" + threshNote;
311    }
312  0 annot.description += "</html>";
313  0 Color col = ColorUtils
314    .createColourFromName(typeName + scr.getMethod());
315  0 for (int p = 0, ps = annot.annotations.length; p < ps; p++)
316    {
317  0 if (annot.annotations[p] != null)
318    {
319  0 annot.annotations[p].colour = col;
320    }
321    }
322  0 annot._linecolour = col;
323    // finally, update any dataset annotation
324  0 replaceAnnotationOnAlignmentWith(annot, typename, calcName,
325    aseq);
326    }
327    }
328    }
329  0 if (lastAnnot + 1 == ourAnnot.size())
330    {
331    // remove singleton alignment annotation row
332  0 ourAnnot.get(lastAnnot).graphGroup = -1;
333    }
334    }
335    {
336  0 if (dispFeatures)
337    {
338  0 jalview.api.FeatureRenderer fr = ((jalview.gui.AlignmentPanel) ap)
339    .cloneFeatureRenderer();
340  0 for (String ft : fc.keySet())
341    {
342  0 FeatureColourI gc = fr.getFeatureStyle(ft);
343  0 if (gc.isSimpleColour())
344    {
345    // set graduated color as fading to white for minimum, and
346    // autoscaling to values on alignment
347  0 FeatureColourI ggc = new FeatureColour(Color.white,
348    gc.getColour(), Float.MIN_VALUE, Float.MAX_VALUE);
349  0 ggc.setAutoScaled(true);
350  0 fr.setColour(ft, ggc);
351    }
352    }
353    // TODO: JAL-1150 - create sequence feature settings API for defining
354    // styles and enabling/disabling feature overlay on alignment panel
355  0 ((jalview.gui.AlignmentPanel) ap).updateFeatureRendererFrom(fr);
356  0 if (af.alignPanel == ap)
357    {
358    // only do this if the alignFrame is currently showing this view.
359  0 af.setShowSeqFeatures(true);
360    }
361    }
362  0 if (ourAnnot.size() > 0)
363    {
364    // Modify the visible annotation on the alignment viewport with the
365    // new alignment annotation rows created.
366  0 updateOurAnnots(ourAnnot);
367  0 ap.adjustAnnotationHeight();
368  0 ap.paintAlignment(true, true);
369    }
370    }
371    }
372    }
373   
 
374  0 toggle @Override
375    public String getCalcId()
376    {
377    // Disorder predictions are not dynamically updated so we return null
378  0 return null;
379    }
380   
381    }