X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fws%2Febi%2FHmmerJSONProcessor.java;h=428c4983406df1ed0bd12b129b6bf161413c1d98;hb=79d76d41dc80b2c5a71201f26f832af337b7809f;hp=731df912cd3041b770edb4b354e3e3161ad66a04;hpb=8137e3257cb7c28bf46b2194ccbf98d1ea35335a;p=jalview.git diff --git a/src/jalview/ws/ebi/HmmerJSONProcessor.java b/src/jalview/ws/ebi/HmmerJSONProcessor.java index 731df91..428c498 100644 --- a/src/jalview/ws/ebi/HmmerJSONProcessor.java +++ b/src/jalview/ws/ebi/HmmerJSONProcessor.java @@ -3,10 +3,17 @@ package jalview.ws.ebi; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.io.FileParse; +import jalview.viewmodel.AlignmentViewport; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -14,8 +21,16 @@ import org.json.simple.parser.JSONParser; public class HmmerJSONProcessor { + /** + * result to be annotated. may not be null + */ AlignmentI resultAl; + /** + * viewport on the alignment. may be null at construction time + */ + AlignmentViewport viewAl = null; + public HmmerJSONProcessor(AlignmentI searchResult) { resultAl = searchResult; @@ -137,15 +152,20 @@ public class HmmerJSONProcessor // alippline String aliaseq = (String) dhit.get("aliaseq"), alimodel = (String) dhit .get("alimodel"), ppline = (String) dhit.get("alippline"); - AlignmentAnnotation alipp = parsePosteriorProb(ppline); // int found = 0; + SequenceI firsthit = null; for (SequenceI hitseq : hits) { // match alisqfrom,alisqto,seq if (hitseq.getStart() == alisqfrom && hitseq.getEnd() == alisqto) { + if (found == 0) + { + firsthit = hitseq; + } found++; // annotated a sequence + AlignmentAnnotation alipp = parsePosteriorProb(ppline); AlignmentAnnotation pval = new AlignmentAnnotation("p-value", "hmmer3 pvalue", pvalue); AlignmentAnnotation eval = new AlignmentAnnotation("e-value", @@ -157,6 +177,16 @@ public class HmmerJSONProcessor hitseq.addAlignmentAnnotation(eval); alipp.createSequenceMapping(hitseq, hitseq.getStart(), false); hitseq.addAlignmentAnnotation(alipp); + String arch; + hitseq.addSequenceFeature(new SequenceFeature( + "Pfam Domain Architecture", (hmmrhit.get("archindex")) + + " " + (arch = (String) hmmrhit.get("arch")), 0, + 0, + (hmmrhit.get("archScore") != null ? Integer + .valueOf((String) hmmrhit.get("archScore")) : 0f), + "HMMER3")); + addArchGroup(hitseq, arch); + alipp.setScore(Double.valueOf("" + dhit.get("bitscore"))); alipp.adjustForAlignment(); resultAl.addAnnotation(pval); resultAl.addAnnotation(eval); @@ -164,19 +194,114 @@ public class HmmerJSONProcessor alipp.validateRangeAndDisplay(); } } - if (found == 0) + // look for other sequences represented by this hit and create rep groups + // could be in "pdbs", or .. + addRedundantSeqGroup(firsthit, alisqfrom, alisqto, + (JSONArray) hmmrhit.get("seqs"), true); + } + } + + /** + * series of operations to perform for the viewpanel associated with the + * alignment + */ + private List viewOps = new ArrayList(); + + public void updateView(AlignmentViewport view) + { + viewAl = view; + for (Runnable op : viewOps) + { + op.run(); + } + } + + private void addRedundantSeqGroup(final SequenceI firsthit, + long alisqfrom, long alisqto, JSONArray others, boolean justDelete) + { + if (others != null) + { + final SequenceGroup repgroup = new SequenceGroup(); + repgroup.setSeqrep(firsthit); + repgroup.addOrRemove(firsthit, false); + repgroup.setStartRes(0); + repgroup.setEndRes(resultAl.getWidth() - 1); + for (Object otherseq : others.toArray(new JSONObject[0])) { - System.err.println("Warn - no match for json hit " + sname + "/" - + alisqfrom + "-" + alisqto); + String repseq = (String) ((JSONObject) otherseq).get("dn"); + SequenceI[] other = resultAl.findSequenceMatch(repseq); + if (other != null && other.length > 0) + { + if (justDelete) + { + for (SequenceI oth : other) + { + resultAl.deleteSequence(oth); + } + ; + } + else + { + int ofound = 0; + for (SequenceI oth : other) + { + if (oth.getStart() == alisqfrom && oth.getEnd() == alisqto) + { + ofound++; + repgroup.addSequence(oth, false); + } + } + if (ofound == 0) + { + System.err.println("Warn - no match for redundant hit " + + repseq + "/" + alisqfrom + "-" + alisqto); + } + if (ofound > 1) + { + System.err + .println("Warn - multiple matches for redundant hit " + + repseq + "/" + alisqfrom + "-" + alisqto); + } + } + } } - if (found > 1) + if (repgroup.getSequences().size() > 1) { - System.err.println("Warn - multiple matches for json hit " + sname - + "/" + alisqfrom + "-" + alisqto); + // queue a hide operation + final HmmerJSONProcessor me = this; + viewOps.add(new Runnable() + { + @Override + public void run() + { + me.viewAl.hideRepSequences(firsthit, repgroup); + } + }); } } } + Map groups = new HashMap(); + + private void addArchGroup(SequenceI seqToAdd, String groupNam) + { + SequenceGroup sg = groups.get(groupNam); + if (sg == null) + { + sg = new SequenceGroup(); + sg.setName(groupNam); + sg.addSequence(seqToAdd, false); + sg.setStartRes(0); + sg.setEndRes(resultAl.getWidth() - 1); + groups.put(groupNam, sg); + resultAl.addGroup(sg); + } + else + { + sg.addSequence(seqToAdd, false); + } + } + private AlignmentAnnotation parsePosteriorProb(String ppline) { Annotation[] ae = new Annotation[ppline.length()]; @@ -199,7 +324,7 @@ public class HmmerJSONProcessor AlignmentAnnotation pprob = new AlignmentAnnotation( "Posterior Probability", "Likelihood of HMM fit at each hit position.", ae); - pprob.graph = pprob.BAR_GRAPH; + pprob.graph = AlignmentAnnotation.BAR_GRAPH; pprob.visible = false; return pprob; }