JAL-974 create graduated feature colours for annotation with scores.
[jalview.git] / src / jalview / ws / jws2 / AADisorderClient.java
1 package jalview.ws.jws2;
2
3 import jalview.api.AlignCalcWorkerI;
4 import jalview.bin.Cache;
5 import jalview.datamodel.SequenceFeature;
6 import jalview.datamodel.SequenceI;
7 import jalview.gui.AlignFrame;
8 import jalview.schemes.GraduatedColor;
9 import jalview.ws.jws2.jabaws2.Jws2Instance;
10 import jalview.ws.params.WsParamSetI;
11
12 import java.awt.Color;
13 import java.util.Hashtable;
14 import java.util.Iterator;
15 import java.util.List;
16 import java.util.Map;
17
18 import compbio.data.sequence.Range;
19 import compbio.data.sequence.Score;
20 import compbio.data.sequence.ScoreManager.ScoreHolder;
21 import compbio.metadata.Argument;
22
23 public class AADisorderClient extends JabawsAlignCalcWorker implements
24         AlignCalcWorkerI
25 {
26
27   String typeName;
28
29   String methodName;
30
31   String groupName;
32
33   AlignFrame af;
34
35   public AADisorderClient(Jws2Instance sh, AlignFrame alignFrame,
36           WsParamSetI preset, List<Argument> paramset)
37   {
38     super(sh, alignFrame, preset, paramset);
39     af = alignFrame;
40     typeName = sh.action;
41     methodName = sh.serviceType;
42
43     submitGaps = false;
44     alignedSeqs = false;
45     nucleotidesAllowed = false;
46     proteinAllowed = true;
47     bySequence = true;
48   }
49
50   @Override
51   public String getServiceActionText()
52   {
53     return "Submitting amino acid sequences for disorder prediction.";
54   }
55
56   @Override
57   public void updateResultAnnotation(boolean immediate)
58   {
59
60     if (immediate || !calcMan.isWorking(this) && scoremanager != null)
61     {
62       boolean dispFeatures = false;
63       Map<String,Object> fc=new Hashtable<String, Object>();
64       for (String seqId : seqNames.keySet())
65       {
66         SequenceI dseq, seq = seqNames.get(seqId);
67         int base = seq.getStart() - 1;
68         while ((dseq = seq).getDatasetSequence() != null)
69         {
70           seq = seq.getDatasetSequence();
71         }
72         ;
73         ScoreHolder scores = scoremanager.getAnnotationForSequence(seqId);
74         float last=Float.NaN,val=Float.NaN;
75         for (Score scr : scores.scores)
76         {
77
78           if (scr.getRanges() != null && scr.getRanges().size() > 0)
79           {
80             Iterator<Float> vals = scr.getScores().iterator();
81             // make features on sequence
82             for (Range rn : scr.getRanges())
83             {
84
85               SequenceFeature sf;
86               if (vals.hasNext())
87               {
88                 sf = new SequenceFeature(typeName + "(" + scr.getMethod()
89                         + ")", "Disordered Region", base + rn.from, base
90                         + rn.to, val=vals.next().floatValue(), methodName);
91               }
92               else
93               {
94                 sf = new SequenceFeature(typeName + "(" + scr.getMethod()
95                         + ")", "Disordered Region", null, base + rn.from,
96                         base + rn.to, methodName);
97               }
98               dseq.addSequenceFeature(sf);
99               if (last!=val && last!=Float.NaN)
100               {
101                 fc.put(sf.getType(),sf);
102               }
103               last=val;
104               dispFeatures = true;
105             }
106           }
107           else
108           {
109             Iterator<Float> vals = scr.getScores().iterator();
110             for (int start = base + 1; vals.hasNext(); start++)
111             {
112               SequenceFeature sf = new SequenceFeature(typeName + "("
113                       + scr.getMethod() + ")", "Disordered Region", start,
114                       start, val=vals.next().floatValue(), methodName);
115               if (last!=val && last!=Float.NaN)
116               {
117                 fc.put(sf.getType(),sf);
118               }
119               last=val;
120               dseq.addSequenceFeature(sf);
121               dispFeatures = true;
122             }
123           }
124         }
125       }
126       {
127         if (dispFeatures)
128         {
129           jalview.gui.FeatureRenderer fr = ((jalview.gui.AlignmentPanel) ap).cloneFeatureRenderer();
130           // TODO: configure feature display settings for added types if they don't already exist
131           for (String ft:fc.keySet())
132           {
133             Cache.log.debug("Set graduated feature for new type:"+ft);
134             Object gc=fr.getFeatureStyle(ft);
135             if (gc instanceof Color)
136             {
137               // set graduated color as fading to white for minimum, and autoscaling to values on alignment
138               GraduatedColor ggc=new GraduatedColor(Color.white, (Color)gc,Float.MIN_VALUE, Float.MAX_VALUE);
139               ggc.setAutoScaled(true);
140               fr.setColour(ft, ggc);
141             }
142           }
143           af.alignPanel.updateFeatureRendererFrom(fr);
144           af.alignPanel.av.setShowSequenceFeatures(true);
145           ap.paintAlignment(true);
146         }
147       }
148     }
149   }
150
151 }