+ 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",
+ "hmmer3 evalue", evalue);
+ pval.setCalcId("HMMER3");
+ eval.setCalcId("HMMER3");
+ alipp.setCalcId("HMMER3");
+ hitseq.addAlignmentAnnotation(pval);
+ 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);
+ resultAl.addAnnotation(alipp);
+ alipp.validateRangeAndDisplay();
+ }
+ }
+ // 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<Runnable> viewOps = new ArrayList<Runnable>();
+
+ 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]))
+ {
+ 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 (repgroup.getSequences().size() > 1)
+ {
+ // queue a hide operation
+ final HmmerJSONProcessor me = this;
+ viewOps.add(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ me.viewAl.hideRepSequences(firsthit, repgroup);
+ }
+ });
+ }
+ }
+ }
+
+ Map<String, SequenceGroup> groups = new HashMap<String, SequenceGroup>();
+
+ 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);
+ }
+ }