From a825b584a274cdabbaf79949a809ecf848f630d5 Mon Sep 17 00:00:00 2001 From: jprocter Date: Tue, 28 Aug 2012 14:17:26 +0100 Subject: [PATCH] JAL-974 create mixture of sequence features marking disordered regions and sequence associated annotation rows for positional disorder scores --- src/jalview/ws/jws2/AADisorderClient.java | 172 +++++++++++++++++++++++------ 1 file changed, 140 insertions(+), 32 deletions(-) diff --git a/src/jalview/ws/jws2/AADisorderClient.java b/src/jalview/ws/jws2/AADisorderClient.java index c5c7a13..7bf2045a 100644 --- a/src/jalview/ws/jws2/AADisorderClient.java +++ b/src/jalview/ws/jws2/AADisorderClient.java @@ -2,23 +2,28 @@ package jalview.ws.jws2; import jalview.api.AlignCalcWorkerI; import jalview.bin.Cache; +import jalview.datamodel.AlignmentAnnotation; + import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.schemes.GraduatedColor; +import jalview.schemes.UserColourScheme; import jalview.ws.jws2.jabaws2.Jws2Instance; import jalview.ws.params.WsParamSetI; import java.awt.Color; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; - import compbio.data.sequence.Range; import compbio.data.sequence.Score; import compbio.data.sequence.ScoreManager.ScoreHolder; import compbio.metadata.Argument; +import compbio.ws.client.Services; public class AADisorderClient extends JabawsAlignCalcWorker implements AlignCalcWorkerI @@ -53,25 +58,89 @@ public class AADisorderClient extends JabawsAlignCalcWorker implements return "Submitting amino acid sequences for disorder prediction."; } + private static Map> featureMap; + + private static Map>> annotMap; + + private static String DONTCOMBINE = "DONTCOMBINE"; + static + { + featureMap = new HashMap>(); + Map fmap; + featureMap.put(compbio.ws.client.Services.IUPredWS.toString(), + fmap = new HashMap()); + fmap.put("Glob", new String[] + { "Globular Domain", "Predicted globular domain" }); + featureMap.put(compbio.ws.client.Services.JronnWS.toString(), + fmap = new HashMap()); + featureMap.put(compbio.ws.client.Services.DisemblWS.toString(), + fmap = new HashMap()); + fmap.put("REM465", new String[] + { "REM465", "Missing density" }); + fmap.put("HOTLOOPS", new String[] + { "HOTLOOPS", "Flexible loops" }); + fmap.put("COILS", new String[] + { "COILS", "Random coil" }); + featureMap.put(compbio.ws.client.Services.GlobPlotWS.toString(), + fmap = new HashMap()); + fmap.put("GlobDoms", new String[] + { "Globular Domain", "Predicted globular domain" }); + fmap.put("Disorder", new String[] + { "Protein Disorder", "Probable unstructured peptide region" }); + Map> amap; + annotMap = new HashMap>>(); + annotMap.put(compbio.ws.client.Services.GlobPlotWS.toString(), + amap = new HashMap>()); + amap.put("Dydx", new HashMap()); + amap.get("Dydx").put(DONTCOMBINE, DONTCOMBINE); + annotMap.put(compbio.ws.client.Services.DisemblWS.toString(), + amap = new HashMap>()); + + } + @Override public void updateResultAnnotation(boolean immediate) { if (immediate || !calcMan.isWorking(this) && scoremanager != null) { + Map featureTypeMap = featureMap + .get(service.serviceType); + Map> annotTypeMap = annotMap + .get(service.serviceType); boolean dispFeatures = false; - Map fc=new Hashtable(); + Map fc = new Hashtable(); + List ourAnnot = new ArrayList(); + /** + * grouping for any annotation rows created + */ + int graphGroup = 1, iGraphGroup = 1; + if (alignViewport.getAlignment().getAlignmentAnnotation() != null) + { + for (AlignmentAnnotation ala : alignViewport.getAlignment() + .getAlignmentAnnotation()) + { + if (ala.graphGroup > graphGroup) + { + graphGroup = ala.graphGroup; + } + } + } + for (String seqId : seqNames.keySet()) { - SequenceI dseq, seq = seqNames.get(seqId); + boolean sameGroup = false; + SequenceI dseq, aseq, seq = seqNames.get(seqId); int base = seq.getStart() - 1; + aseq = seq; while ((dseq = seq).getDatasetSequence() != null) { seq = seq.getDatasetSequence(); } ; ScoreHolder scores = scoremanager.getAnnotationForSequence(seqId); - float last=Float.NaN,val=Float.NaN; + float last = Float.NaN, val = Float.NaN; + int lastAnnot = ourAnnot.size(); for (Score scr : scores.scores) { @@ -83,67 +152,106 @@ public class AADisorderClient extends JabawsAlignCalcWorker implements { SequenceFeature sf; + String[] type = featureTypeMap.get(scr.getMethod()); + if (type == null) + { + // create a default type for this feature + type = new String[] + { typeName + " (" + scr.getMethod() + ")", + service.getActionText() }; + } if (vals.hasNext()) { - sf = new SequenceFeature(typeName + "(" + scr.getMethod() - + ")", "Disordered Region", base + rn.from, base - + rn.to, val=vals.next().floatValue(), methodName); + sf = new SequenceFeature(type[0], type[1], base + rn.from, + base + rn.to, val = vals.next().floatValue(), + methodName); } else { - sf = new SequenceFeature(typeName + "(" + scr.getMethod() - + ")", "Disordered Region", null, base + rn.from, - base + rn.to, methodName); + sf = new SequenceFeature(type[0], type[1], null, base + + rn.from, base + rn.to, methodName); } dseq.addSequenceFeature(sf); - if (last!=val && last!=Float.NaN) + if (last != val && last != Float.NaN) { - fc.put(sf.getType(),sf); + fc.put(sf.getType(), sf); } - last=val; + last = val; dispFeatures = true; } } else { - Iterator vals = scr.getScores().iterator(); - for (int start = base + 1; vals.hasNext(); start++) + + AlignmentAnnotation annot = createAnnotationRowsForScores( + ourAnnot, service.serviceType + " (" + scr.getMethod() + + ")", service.getServiceTypeURI()+"/"+ scr.getMethod(), aseq, + base, scr); + annot.graph = AlignmentAnnotation.LINE_GRAPH; + if (annotTypeMap==null || annotTypeMap.get(scr.getMethod())==null || annotTypeMap.get(scr.getMethod()).get(DONTCOMBINE) == null) { - SequenceFeature sf = new SequenceFeature(typeName + "(" - + scr.getMethod() + ")", "Disordered Region", start, - start, val=vals.next().floatValue(), methodName); - if (last!=val && last!=Float.NaN) { - fc.put(sf.getType(),sf); + if (!sameGroup) + { + graphGroup++; + sameGroup = true; + } + + annot.graphGroup = graphGroup; + } + } + annot.description = service.getActionText() + " - raw scores"; + Color col = new UserColourScheme(typeName) + .createColourFromName(typeName + scr.getMethod()); + for (int p = 0, ps = annot.annotations.length; p < ps; p++) + { + if (annot.annotations[p] != null) + { + annot.annotations[p].colour = col; } - last=val; - dseq.addSequenceFeature(sf); - dispFeatures = true; } } } + if (lastAnnot + 1 == ourAnnot.size()) + { + // remove singleton alignment annotation row + ourAnnot.get(lastAnnot).graphGroup = -1; + } } { if (dispFeatures) { - jalview.gui.FeatureRenderer fr = ((jalview.gui.AlignmentPanel) ap).cloneFeatureRenderer(); - // TODO: configure feature display settings for added types if they don't already exist - for (String ft:fc.keySet()) + jalview.gui.FeatureRenderer fr = ((jalview.gui.AlignmentPanel) ap) + .cloneFeatureRenderer(); + for (String ft : fc.keySet()) { - Cache.log.debug("Set graduated feature for new type:"+ft); - Object gc=fr.getFeatureStyle(ft); + Object gc = fr.getFeatureStyle(ft); if (gc instanceof Color) { - // set graduated color as fading to white for minimum, and autoscaling to values on alignment - GraduatedColor ggc=new GraduatedColor(Color.white, (Color)gc,Float.MIN_VALUE, Float.MAX_VALUE); + // set graduated color as fading to white for minimum, and + // autoscaling to values on alignment + GraduatedColor ggc = new GraduatedColor(Color.white, + (Color) gc, Float.MIN_VALUE, Float.MAX_VALUE); ggc.setAutoScaled(true); fr.setColour(ft, ggc); } } - af.alignPanel.updateFeatureRendererFrom(fr); - af.alignPanel.av.setShowSequenceFeatures(true); + // TODO: JAL-1150 - create sequence feature settings API for defining styles and enabling/disabling feature overlay on alignment panel + ((jalview.gui.AlignmentPanel) ap).updateFeatureRendererFrom(fr); + if (af.alignPanel==ap) + { + // only do this if the alignFrame is currently showing this view. + af.setShowSeqFeatures(true); + } ap.paintAlignment(true); } + if (ourAnnot.size() > 0) + { + // Modify the visible annotation on the alignment viewport with the + // new alignment annotation rows created. + updateOurAnnots(ourAnnot); + ap.adjustAnnotationHeight(); + } } } } -- 1.7.10.2