if (msa.getSequences().length == 1)
{
// Single Sequence prediction
- new jalview.ws.JPredClient(sh, title, false, msa, af);
+ new jalview.ws.JPredClient(sh, title, false, msa, af, true);
}
else
{
{
// Sequence profile based prediction
new jalview.ws.JPredClient(sh,
- title, true, msa, af);
+ title, true, msa, af, true);
}
}
}
{
return viewport;
}
-}
+}
\ No newline at end of file
-/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
-*/package jalview.io;\r
-\r
-import jalview.datamodel.*;\r
-\r
-public class JnetAnnotationMaker\r
-{\r
- /**\r
- * adds the annotation parsed by prediction to al.\r
- * @param prediction JPredFile\r
- * @param al AlignmentI\r
- * @param FirstSeq int -\r
- * @param noMsa boolean\r
- */\r
- public static void add_annotation(JPredFile prediction, AlignmentI al,\r
- int FirstSeq, boolean noMsa)\r
- throws Exception\r
- {\r
- int i = 0;\r
- SequenceI[] preds = prediction.getSeqsAsArray();\r
- // in the future we could search for the query\r
- // sequence in the alignment before calling this function.\r
- SequenceI seqRef = al.getSequenceAt(FirstSeq);\r
- int width = preds[0].getSequence().length();\r
- int[] gapmap = al.getSequenceAt(FirstSeq).gapMap();\r
- if (gapmap.length != width)\r
- {\r
- throw (new Exception(\r
- "Number of residues in supposed query sequence ('" +\r
- al.getSequenceAt(FirstSeq).getName() + "'\n" +\r
- al.getSequenceAt(FirstSeq).getSequence() +\r
- ")\ndiffer from number of prediction sites in prediction (" + width +\r
- ")"));\r
- }\r
-\r
- AlignmentAnnotation annot;\r
- Annotation[] annotations = null;\r
-\r
- int existingAnnotations = 0;\r
- if(al.getAlignmentAnnotation()!=null)\r
- existingAnnotations = al.getAlignmentAnnotation().length;\r
-\r
-\r
- while (i < preds.length)\r
- {\r
- String id = preds[i].getName().toUpperCase();\r
-\r
- if (id.startsWith("LUPAS") || id.startsWith("JNET") ||\r
- id.startsWith("JPRED"))\r
- {\r
- annotations = new Annotation[al.getWidth()];\r
-\r
- if (id.equals("JNETPRED") || id.equals("JNETPSSM") ||\r
- id.equals("JNETFREQ") || id.equals("JNETHMM") ||\r
- id.equals("JNETALIGN") || id.equals("JPRED"))\r
- {\r
- for (int j = 0; j < width; j++)\r
- {\r
- annotations[gapmap[j]] = new Annotation("", "",\r
- preds[i].getCharAt(j), 0);\r
- }\r
- }\r
- else if (id.equals("JNETCONF"))\r
- {\r
- for (int j = 0; j < width; j++)\r
- {\r
- float value = new Float(preds[i].getCharAt(\r
- j) + "").floatValue();\r
- annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(\r
- j) + "", "", preds[i].getCharAt(j),\r
- value);\r
- }\r
- }\r
- else\r
- {\r
- for (int j = 0; j < width; j++)\r
- {\r
- annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(\r
- j) + "", "", ' ', 0);\r
- }\r
- }\r
-\r
- if (id.equals("JNETCONF"))\r
- {\r
- annot = new AlignmentAnnotation(preds[i].getName(),\r
- "JNet Output", annotations, 0f,\r
- 10f,\r
- AlignmentAnnotation.BAR_GRAPH);\r
- }\r
- else\r
- {\r
- annot = new AlignmentAnnotation(preds[i].getName(),\r
- "JNet Output", annotations);\r
- }\r
-\r
- if (seqRef != null)\r
- {\r
- annot.createSequenceMapping(seqRef, 1, true);\r
- seqRef.addAlignmentAnnotation(annot);\r
- }\r
-\r
- al.addAnnotation(annot);\r
- al.setAnnotationIndex(annot,\r
- al.getAlignmentAnnotation().\r
- length - existingAnnotations - 1);\r
-\r
- if (noMsa)\r
- {\r
- al.deleteSequence(preds[i]);\r
- }\r
- }\r
-\r
- i++;\r
- }\r
-\r
- //Hashtable scores = prediction.getScores();\r
-\r
- /* addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPH"),\r
- "JnetpropH", "Jnet Helix Propensity", 0f,1f,1);\r
-\r
- addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPB"),\r
- "JnetpropB", "Jnet Beta Sheet Propensity", 0f,1f,1);\r
-\r
- addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPC"),\r
- "JnetpropC", "Jnet Coil Propensity", 0f,1f,1);\r
- */\r
-\r
- }\r
-}\r
+/*
+* Jalview - A Sequence Alignment Editor and Viewer
+* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/package jalview.io;
+
+import jalview.datamodel.*;
+
+public class JnetAnnotationMaker
+{
+ public static void add_annotation(JPredFile prediction, AlignmentI al,
+ int firstSeq, boolean noMsa) throws Exception {
+ JnetAnnotationMaker.add_annotation(prediction, al, firstSeq, noMsa, (int[]) null);
+ }
+ /**
+ * adds the annotation parsed by prediction to al.
+ * @param prediction JPredFile
+ * @param al AlignmentI
+ * @param firstSeq int -
+ * @param noMsa boolean
+ * @param delMap mapping from columns in JPredFile prediction to residue number in al.getSequence(firstSeq)
+ */
+ public static void add_annotation(JPredFile prediction, AlignmentI al,
+ int firstSeq, boolean noMsa, int[] delMap)
+ throws Exception
+ {
+ int i = 0;
+ SequenceI[] preds = prediction.getSeqsAsArray();
+ // in the future we could search for the query
+ // sequence in the alignment before calling this function.
+ SequenceI seqRef = al.getSequenceAt(firstSeq);
+ int width = preds[0].getSequence().length();
+ int[] gapmap = al.getSequenceAt(firstSeq).gapMap();
+ if ((delMap!=null && delMap.length > width) || (delMap==null && gapmap.length!=width))
+ {
+ throw (new Exception(
+ "Number of residues in "+(delMap==null ? "" : " mapped ")+"supposed query sequence ('" +
+ al.getSequenceAt(firstSeq).getName() + "'\n" +
+ al.getSequenceAt(firstSeq).getSequence() +
+ ")\ndiffer from number of prediction sites in prediction (" + width +
+ ")"));
+ }
+
+ AlignmentAnnotation annot;
+ Annotation[] annotations = null;
+
+ int existingAnnotations = 0;
+ if(al.getAlignmentAnnotation()!=null)
+ existingAnnotations = al.getAlignmentAnnotation().length;
+
+
+ while (i < preds.length)
+ {
+ String id = preds[i].getName().toUpperCase();
+
+ if (id.startsWith("LUPAS") || id.startsWith("JNET") ||
+ id.startsWith("JPRED"))
+ {
+ annotations = new Annotation[al.getWidth()];
+ /* if (delMap!=null) {
+ for (int j=0; j<annotations.length; j++)
+ annotations[j] = new Annotation("","",'',0);
+ }
+ */
+ if (id.equals("JNETPRED") || id.equals("JNETPSSM") ||
+ id.equals("JNETFREQ") || id.equals("JNETHMM") ||
+ id.equals("JNETALIGN") || id.equals("JPRED"))
+ {
+ if (delMap==null) {
+ for (int j = 0; j < width; j++)
+ {
+ annotations[gapmap[j]] = new Annotation("", "",
+ preds[i].getCharAt(j), 0);
+ }
+ } else {
+ for (int j = 0; j < width; j++)
+ {
+ annotations[gapmap[delMap[j]]] = new Annotation("", "",
+ preds[i].getCharAt(j), 0);
+ }
+ }
+ }
+ else if (id.equals("JNETCONF"))
+ {
+ if (delMap==null) {
+ for (int j = 0; j < width; j++)
+ {
+ float value = new Float(preds[i].getCharAt(
+ j) + "").floatValue();
+ annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(
+ j) + "", "", preds[i].getCharAt(j),
+ value);
+ }
+ } else {
+ for (int j = 0; j < width; j++)
+ {
+ float value = new Float(preds[i].getCharAt(
+ j) + "").floatValue();
+ annotations[gapmap[delMap[j]]] = new Annotation(preds[i].getCharAt(
+ j) + "", "", preds[i].getCharAt(j),
+ value);
+ }
+ }
+ }
+ else
+ {
+ if (delMap==null) {
+ for (int j = 0; j < width; j++)
+ {
+ annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(
+ j) + "", "", ' ', 0);
+ }
+ } else {
+ for (int j = 0; j < width; j++)
+ {
+ annotations[gapmap[delMap[j]]] = new Annotation(preds[i].getCharAt(
+ j) + "", "", ' ', 0);
+ }
+ }
+ }
+
+ if (id.equals("JNETCONF"))
+ {
+ annot = new AlignmentAnnotation(preds[i].getName(),
+ "JNet Output", annotations, 0f,
+ 10f,
+ AlignmentAnnotation.BAR_GRAPH);
+ }
+ else
+ {
+ annot = new AlignmentAnnotation(preds[i].getName(),
+ "JNet Output", annotations);
+ }
+
+ if (seqRef != null)
+ {
+ annot.createSequenceMapping(seqRef, 1, true);
+ seqRef.addAlignmentAnnotation(annot);
+ }
+
+ al.addAnnotation(annot);
+ al.setAnnotationIndex(annot,
+ al.getAlignmentAnnotation().
+ length - existingAnnotations - 1);
+
+ if (noMsa)
+ {
+ al.deleteSequence(preds[i]);
+ }
+ }
+
+ i++;
+ }
+
+ //Hashtable scores = prediction.getScores();
+
+ /* addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPH"),
+ "JnetpropH", "Jnet Helix Propensity", 0f,1f,1);
+
+ addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPB"),
+ "JnetpropB", "Jnet Beta Sheet Propensity", 0f,1f,1);
+
+ addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPC"),
+ "JnetpropC", "Jnet Coil Propensity", 0f,1f,1);
+ */
+
+ }
+}
\ No newline at end of file
* @param title String
* @param msa boolean - true - submit alignment as a sequence profile
* @param alview AlignmentView
+ * @param viewonly TODO
*/
- public JPredClient(ext.vamsas.ServiceHandle sh, String title, boolean msa, AlignmentView alview, AlignFrame parentFrame) {
+ public JPredClient(ext.vamsas.ServiceHandle sh, String title, boolean msa, AlignmentView alview, AlignFrame parentFrame, boolean viewonly) {
super();
wsInfo=setWebService(sh);
- startJPredClient(title, msa, alview, parentFrame);
+ startJPredClient(title, msa, alview, parentFrame, viewonly);
}
/**
* @param title String
* @param msa boolean
* @param alview AlignmentView
+ * @param viewonly if true then the prediction will be made just on the concatenated visible regions
*/
private void startJPredClient(String title, boolean msa,
- jalview.datamodel.AlignmentView alview, AlignFrame parentFrame)
+ jalview.datamodel.AlignmentView alview, AlignFrame parentFrame, boolean viewonly)
{
AlignmentView input = alview;
if (wsInfo == null)
Cache.log.warn("Couldn't find a Jpred webservice to invoke!");
return;
}
-
- SeqCigar[] msf = input.getSequences();
- SequenceI seq = msf[0].getSeq('-');
+ SeqCigar[] msf=null;
+ SequenceI seq=null;
+ int[] delMap=null;
+ // original JNetClient behaviour - submit full length of sequence or profile
+ // and mask result.
+ msf = input.getSequences();
+ seq = msf[0].getSeq('-');
+
+ if (viewonly) {
+ int[] viscontigs = alview.getVisibleContigs();
+ int spos=0;
+ int i=0;
+ if (viscontigs!=null) {
+ // Construct the delMap - mapping from the positions within the input to Jnet to the contigs in the original sequence
+
+ delMap = new int[seq.getEnd()-seq.getStart()+1];
+ int gapMap[] = seq.gapMap();
+ for (int contig = 0; contig<viscontigs.length; contig += 2)
+ {
+
+ while (spos<gapMap.length && gapMap[spos]<viscontigs[contig]) {
+ spos++;
+ }
+ while (spos<gapMap.length && gapMap[spos]<=viscontigs[contig+1]) {
+ delMap[i++] = spos++;
+ }
+ }
+ int tmap[] = new int[i];
+ System.arraycopy(delMap, 0, tmap, 0, i);
+ delMap=tmap;
+ }
+ }
if (msa && msf.length > 1)
{
-
- String altitle = "JNet prediction on " + seq.getName() +
+
+ String altitle = "JNet prediction on "+(viewonly?"visible ":"") + seq.getName() +
" using alignment from " + title;
- wsInfo.setProgressText("Job details for MSA based prediction (" +
- title + ") on sequence :\n>" + seq.getName() +
- "\n" +
- AlignSeq.extractGaps("-. ", seq.getSequence()) +
- "\n");
SequenceI aln[] = new SequenceI[msf.length];
for (int i = 0, j = msf.length; i < j; i++)
{
aln[i] = msf[i].getSeq('-');
}
-
+
+
Hashtable SequenceInfo = jalview.analysis.SeqsetUtils.uniquify(aln, true);
-
+ if (viewonly) {
+ // Remove hidden regions from sequence objects.
+ String seqs[] = alview.getSequenceStrings('-');
+ for (int i = 0, j = msf.length; i < j; i++)
+ {
+ aln[i].setSequence(seqs[i]);
+ }
+ seq.setSequence(seqs[0]);
+ }
+ wsInfo.setProgressText("Job details for "+(viewonly?"visible ":"")+"MSA based prediction (" +
+ title + ") on sequence :\n>" + seq.getName() +
+ "\n" +
+ AlignSeq.extractGaps("-. ", seq.getSequence()) +
+ "\n");
JPredThread jthread = new JPredThread(wsInfo, altitle, server,
- SequenceInfo, aln, alview, parentFrame);
+ SequenceInfo, aln, delMap, alview, parentFrame, WsURL);
wsInfo.setthisService(jthread);
jthread.start();
}
{
if (!msa && msf.length>1)
throw new Error("Implementation Error! Multiple single sequence prediction jobs are not yet supported.");
- wsInfo.setProgressText("Job details for prediction on sequence :\n>" +
- seq.getName() + "\n" +
- AlignSeq.extractGaps("-. ", seq.getSequence()) +
- "\n");
- String altitle = "JNet prediction for sequence " + seq.getName() +
+ String altitle = "JNet prediction for "+(viewonly?"visible ":"")+"sequence " + seq.getName() +
" from " +
title;
-
+ String seqname = seq.getName();
Hashtable SequenceInfo = jalview.analysis.SeqsetUtils.SeqCharacterHash(
seq);
-
- JPredThread jthread = new JPredThread(wsInfo, altitle, server,
- SequenceInfo, seq, alview, parentFrame);
+ if (viewonly) {
+ // Remove hidden regions from input sequence
+ String seqs[] = alview.getSequenceStrings('-');
+ seq.setSequence(seqs[0]);
+ }
+ wsInfo.setProgressText("Job details for prediction on "+(viewonly?"visible ":"")+"sequence :\n>" +
+ seqname + "\n" +
+ AlignSeq.extractGaps("-. ", seq.getSequence()) +
+ "\n");
+ JPredThread jthread = new JPredThread(wsInfo, altitle, server, WsURL,
+ SequenceInfo, seq, delMap, alview, parentFrame);
wsInfo.setthisService(jthread);
jthread.start();
}
return;
}
- JPredThread jthread = new JPredThread(wsInfo, altitle, server, SequenceInfo, aln,null, parentFrame);
+ JPredThread jthread = new JPredThread(wsInfo, altitle, server, SequenceInfo, aln,null, null, parentFrame, WsURL);
wsInfo.setthisService(jthread);
jthread.start();
}
return;
}
- JPredThread jthread = new JPredThread(wsInfo, altitle, server, SequenceInfo, seq,null, parentFrame);
+ JPredThread jthread = new JPredThread(wsInfo, altitle, server, WsURL, SequenceInfo, seq,null, null, parentFrame);
wsInfo.setthisService(jthread);
jthread.start();
}
return server;
}
-
- class JPredThread
- extends WSThread
- implements WSClientI
- {
- class JPredJob
- extends WSThread.WSJob
- {
-
- vamsas.objects.simple.Sequence sequence;
- vamsas.objects.simple.Msfalignment msa;
- java.util.Hashtable SequenceInfo = null;
- /**
- *
- * @return true if getResultSet will return a valid alignment and prediction result.
- */
- public boolean hasResults()
- {
- if (subjobComplete && result != null && result.isFinished()
- && ( (JpredResult) result).getPredfile() != null &&
- ( (JpredResult) result).getAligfile() != null)
- {
- return true;
- }
- return false;
- }
-
- boolean hasValidInput()
- {
- if (sequence != null)
- {
- return true;
- }
- return false;
- }
-
- public Alignment getResultSet()
- throws Exception
- {
- if (result == null || !result.isFinished())
- {
- return null;
- }
- Alignment al = null;
- int FirstSeq = -1; // the position of the query sequence in Alignment al
-
- JpredResult result = (JpredResult)this.result;
-
- jalview.bin.Cache.log.debug("Parsing output from JNet job.");
- // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File");
- jalview.io.JPredFile prediction = new jalview.io.JPredFile(result.
- getPredfile(),
- "Paste");
- SequenceI[] preds = prediction.getSeqsAsArray();
- jalview.bin.Cache.log.debug("Got prediction profile.");
-
- if ( (this.msa != null) && (result.getAligfile() != null))
- {
- jalview.bin.Cache.log.debug("Getting associated alignment.");
- // we ignore the returned alignment if we only predicted on a single sequence
- String format = new jalview.io.IdentifyFile().Identify(result.
- getAligfile(),
- "Paste");
-
- if (jalview.io.FormatAdapter.isValidFormat(format))
- {
- al = new Alignment(new FormatAdapter().readFile(result.getAligfile(),
- "Paste", format));
- SequenceI sqs[] = new SequenceI[al.getHeight()];
- for (int i = 0, j = al.getHeight(); i < j; i++)
- {
- sqs[i] = al.getSequenceAt(i);
- }
- if (!jalview.analysis.SeqsetUtils.deuniquify( (Hashtable)
- SequenceInfo, sqs))
- {
- throw (new Exception(
- "Couldn't recover sequence properties for alignment."));
- }
-
- FirstSeq = 0;
- al.setDataset(null);
-
- jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq,
- false);
-
- }
- else
- {
- throw (new Exception(
- "Unknown format "+format+" for file : \n" +
- result.getAligfile()));
- }
- }
- else
- {
- al = new Alignment(preds);
- FirstSeq = prediction.getQuerySeqPosition();
- if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(
- al.getSequenceAt(FirstSeq), SequenceInfo))
- {
- throw (new Exception(
- "Couldn't recover sequence properties for JNet Query sequence!"));
- } else {
- al.setDataset(null);
- jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq,
- true);
- }
- }
-
- return al; // , FirstSeq, noMsa};
- }
- public JPredJob(Hashtable SequenceInfo, SequenceI seq)
- {
- super();
- String sq = AlignSeq.extractGaps(Comparison.GapChars, seq.getSequence());
- if (sq.length() >= 20)
- {
- this.SequenceInfo = SequenceInfo;
- sequence = new vamsas.objects.simple.Sequence();
- sequence.setId(seq.getName());
- sequence.setSeq(sq);
- }
- }
-
- public JPredJob(Hashtable SequenceInfo, SequenceI[] msf)
- {
- this(SequenceInfo, msf[0]);
- if (sequence != null)
- {
- if (msf.length > 1)
- {
- msa = new vamsas.objects.simple.Msfalignment();
- jalview.io.PileUpfile pileup = new jalview.io.PileUpfile();
- msa.setMsf(pileup.print(msf));
- }
- }
- }
- }
- ext.vamsas.Jpred server;
- String altitle = "";
- JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, AlignmentView alview, AlignFrame alframe) {
- this.altitle = altitle;
- this.server = server;
- this.wsInfo = wsinfo;
- this.input = alview;
- this.alignFrame = alframe;
- }
-
-// String OutputHeader;
-// vamsas.objects.simple.JpredResult result;
-
- JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, Hashtable SequenceInfo,SequenceI seq, AlignmentView alview, AlignFrame alframe)
- {
- this(wsinfo, altitle, server,alview, alframe);
- JPredJob job = new JPredJob(SequenceInfo, seq);
- if (job.hasValidInput())
- {
- OutputHeader = wsInfo.getProgressText();
- jobs = new WSJob[]
- {
- job};
- job.jobnum = 0;
- }
- }
-
- JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, Hashtable SequenceInfo, SequenceI[] msf, AlignmentView alview, AlignFrame alframe)
- {
- this(wsinfo, altitle, server,alview, alframe);
- JPredJob job = new JPredJob(SequenceInfo, msf);
- if (job.hasValidInput())
- {
- jobs = new WSJob[]
- {
- job};
- OutputHeader = wsInfo.getProgressText();
- job.jobnum = 0;
- }
- }
-
- /*
- public void run()
- {
- StartJob();
-
- while (!jobComplete && (allowedServerExceptions > 0))
- {
- try
- {
- if ( (result = server.getresult(jobId)) == null)
- {
- throw (new Exception(
- "Timed out when communicating with server\nTry again later.\n"));
- }
- if (result.getState()==0)
- jalview.bin.Cache.log.debug("Finished "+jobId);
- if (result.isRunning())
- {
- wsInfo.setStatus(WebserviceInfo.STATE_RUNNING);
- }
- if (result.isQueued())
- {
- wsInfo.setStatus(WebserviceInfo.STATE_QUEUING);
- }
-
- wsInfo.setProgressText(OutputHeader + "\n" +
- result.getStatus());
-
- if (result.isFinished())
- {
-
- parseResult();
- jobComplete = true;
- jobsRunning--;
- } else {
- // catch exceptions
- if (! (result.isJobFailed() || result.isServerError()))
- {
- try
- {
- Thread.sleep(5000);
- }
- catch (InterruptedException ex1)
- {
- }
-
- // System.out.println("I'm alive "+seqid+" "+jobid);
- }
- else
- {
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- jobsRunning--;
- jobComplete = true;
- }
- }
- }
- catch (Exception ex)
- {
- allowedServerExceptions--;
-
- wsInfo.appendProgressText("\nJPredWS Server exception!\n" +
- ex.getMessage());
-
- try
- {
- if (allowedServerExceptions > 0)
- {
- Thread.sleep(5000);
- }
- }
- catch (InterruptedException ex1)
- {
- }
- }
- catch (OutOfMemoryError er)
- {
- jobComplete = true;
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- JOptionPane.showInternalMessageDialog(Desktop.desktop,
- "Out of memory handling result!!"
- +
- "\nSee help files for increasing Java Virtual Machine memory."
- , "Out of memory",
- JOptionPane.WARNING_MESSAGE);
- System.out.println("JPredClient: "+er);
- System.gc();
- }
- }
- if (result!=null)
- if (! (result.isJobFailed() || result.isServerError()))
- {
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK);
- }
- else
- {
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- }
- }
- */
- void StartJob(WSJob j)
- {
- if (! (j instanceof JPredJob))
- {
- throw new Error("Implementation error - StartJob(JpredJob) called on " +
- j.getClass());
- }
- try
- {
- JPredJob job = (JPredJob) j;
- if (job.msa != null)
- {
- job.jobId = server.predictOnMsa(job.msa);
- }
- else
- if (job.sequence!=null)
- {
- job.jobId = server.predict(job.sequence); // debug like : job.jobId = "/jobs/www-jpred/jp_Yatat29";//
- }
-
- if (job.jobId != null)
- {
- if (job.jobId.startsWith("Broken"))
- {
- job.result = (vamsas.objects.simple.Result)new JpredResult();
- job.result.setInvalid(true);
- job.result.setStatus("Submission " + job.jobId);
- }
- else
- {
- job.submitted = true;
- job.subjobComplete = false;
- Cache.log.info(WsURL + " Job Id '" + job.jobId + "'");
- }
- }
- else
- {
- throw new Exception("Server timed out - try again later\n");
- }
- }
- catch (Exception e)
- {
- if (e.getMessage().indexOf("Exception") > -1)
- {
- wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_SERVERERROR);
- wsInfo.setProgressText(j.jobnum,
- "Failed to submit the prediction. (Just close the window)\n"
- +
- "It is most likely that there is a problem with the server.\n");
- System.err.println(
- "JPredWS Client: Failed to submit the prediction. Quite possibly because of a server error - see below)\n" +
- e.getMessage() + "\n");
-
- jalview.bin.Cache.log.warn("Server Exception", e);
- }
- else
- {
- wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR);
- // JBPNote - this could be a popup informing the user of the problem.
- wsInfo.appendProgressText(j.jobnum,
- "Failed to submit the prediction:\n"
- + e.getMessage() +
- wsInfo.getProgressText());
-
- jalview.bin.Cache.log.debug("Failed Submission of job " + j.jobnum, e);
-
- }
- j.allowedServerExceptions = -1;
- j.subjobComplete = true;
- }
- }
-
- /* private void addFloatAnnotations(Alignment al, int[] gapmap,
- Vector values, String Symname,
- String Visname, float min,
- float max, int winLength)
- {
- Annotation[] annotations = new Annotation[al.getWidth()];
-
- for (int j = 0; j < values.size(); j++)
- {
- float value = Float.parseFloat(values.get(j).toString());
- annotations[gapmap[j]] = new Annotation("", value + "", ' ',
- value);
- }
-
- al.addAnnotation(new AlignmentAnnotation(Symname, Visname,
- annotations, min, max, winLength));
- }*/
-
- void parseResult()
- {
- int results = 0; // number of result sets received
- JobStateSummary finalState = new JobStateSummary();
- try
- {
- for (int j = 0; j < jobs.length; j++)
- {
- finalState.updateJobPanelState(wsInfo, OutputHeader, jobs[j]);
- if (jobs[j].submitted && jobs[j].subjobComplete && jobs[j].hasResults())
- {
- results++;
- }
- }
- }
- catch (Exception ex)
- {
-
- Cache.log.error("Unexpected exception when processing results for " +
- altitle, ex);
- wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
- }
- if (results > 0)
- {
- wsInfo.showResultsNewFrame
- .addActionListener(new java.awt.event.ActionListener()
- {
- public void actionPerformed(
- java.awt.event.ActionEvent evt)
- {
- displayResults(true);
- }
- });
- wsInfo.mergeResults
- .addActionListener(new java.awt.event.ActionListener()
- {
- public void actionPerformed(
- java.awt.event.ActionEvent evt)
- {
- displayResults(false);
- }
- });
- wsInfo.setResultsReady();
- }
- else
- {
- wsInfo.setFinishedNoResults();
- }
- }
-
- void displayResults(boolean newWindow)
- {
- // TODO: cope with multiple subjobs.
- if (jobs != null)
- {
- Alignment res = null;
- boolean msa=false;
- for (int jn = 0; jn < jobs.length; jn++)
- {
- Alignment jobres = null;
- JPredJob j = (JPredJob) jobs[jn];
-
- if (j.hasResults())
- {
- // hack - we only deal with all single seuqence predictions or all profile predictions
- msa = (j.msa!=null) ? true : msa;
- try
- {
- jalview.bin.Cache.log.debug("Parsing output of job " + jn);
- jobres = j.getResultSet();
- jalview.bin.Cache.log.debug("Finished parsing output.");
- if (jobs.length==1)
- res = jobres;
- else {
- // do merge with other job results
- throw new Error("Multiple JNet subjob merging not yet implemented.");
- }
- }
- catch (Exception e)
- {
- jalview.bin.Cache.log.error(
- "JNet Client: JPred Annotation Parse Error",
- e);
- wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR);
- wsInfo.appendProgressText(j.jobnum,
- OutputHeader + "\n" +
- j.result.getStatus() +
- "\nInvalid JNet job result data!\n" +
- e.getMessage());
- j.result.setBroken(true);
- }
- }
- }
-
- if (res != null)
- {
- if (newWindow)
- {
- AlignFrame af;
- if (input==null) {
- af = new AlignFrame(res,
- AlignFrame.DEFAULT_WIDTH,
- AlignFrame.DEFAULT_HEIGHT);
-
- } else {
- java.lang.Object[] alandcolsel = input.getAlignmentAndColumnSelection(alignFrame.getViewport().getGapCharacter());
-
- if (((SequenceI[])alandcolsel[0])[0].getLength()!=res.getWidth()) {
- if (msa) {
- throw new Error("Implementation Error! ColumnSelection from input alignment will not map to result alignment!");
- } else {
- // test this.
- ((ColumnSelection) alandcolsel[1]).pruneDeletions(ShiftList.parseMap(((SequenceI[]) alandcolsel[0])[0].gapMap()));//gapMap returns insert list, interpreted as delete list by pruneDeletions
- }
- }
- af = new AlignFrame(res, (ColumnSelection) alandcolsel[1],
- AlignFrame.DEFAULT_WIDTH,
- AlignFrame.DEFAULT_HEIGHT);
- }
- Desktop.addInternalFrame(af, altitle,
- AlignFrame.DEFAULT_WIDTH,
- AlignFrame.DEFAULT_HEIGHT);
- }
- else
- {
- Cache.log.info("Append results onto existing alignment.");
- }
- }
- }
- }
- void pollJob(WSJob job)
- throws Exception
- {
- job.result = server.getresult(job.jobId);
- }
- public boolean isCancellable()
- {
- return false;
- }
-
- public void cancelJob()
- {
- throw new Error("Implementation error!");
- }
-
- public boolean canMergeResults()
- {
- return false;
- }
-
- }
}
--- /dev/null
+package jalview.ws;\r
+\r
+import java.util.*;\r
+\r
+import javax.swing.*;\r
+\r
+import vamsas.objects.simple.JpredResult;\r
+\r
+import ext.vamsas.*;\r
+import jalview.analysis.*;\r
+import jalview.bin.*;\r
+import jalview.datamodel.*;\r
+import jalview.gui.*;\r
+import jalview.io.*;\r
+import jalview.util.*;\r
+import jalview.ws.WSThread.*;\r
+\r
+class JPredThread\r
+extends WSThread\r
+implements WSClientI\r
+{\r
+ // TODO: put mapping between JPredJob input and input data here - JNetAnnotation adding is done after result parsing.\r
+ class JPredJob\r
+ extends WSThread.WSJob\r
+ {\r
+ // TODO: make JPredJob deal only with what was sent to and received from a JNet service\r
+ int[] predMap=null; // mapping from sequence(i) to the original sequence(predMap[i]) being predicted on\r
+ vamsas.objects.simple.Sequence sequence;\r
+ vamsas.objects.simple.Msfalignment msa;\r
+ java.util.Hashtable SequenceInfo = null;\r
+ int msaIndex=0; // the position of the original sequence in the array of Sequences in the input object that this job holds a prediction for\r
+ /**\r
+ *\r
+ * @return true if getResultSet will return a valid alignment and prediction result.\r
+ */\r
+ public boolean hasResults()\r
+ {\r
+ if (subjobComplete && result != null && result.isFinished()\r
+ && ( (JpredResult) result).getPredfile() != null &&\r
+ ( (JpredResult) result).getAligfile() != null)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ boolean hasValidInput()\r
+ {\r
+ if (sequence != null)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+ /**\r
+ * \r
+ * @return null or Object[] { annotated alignment for this prediction, ColumnSelection for this prediction} or null if no results available.\r
+ * @throws Exception\r
+ */\r
+ public Object[] getResultSet()\r
+ throws Exception\r
+ {\r
+ if (result == null || !result.isFinished())\r
+ {\r
+ return null;\r
+ }\r
+ Alignment al = null;\r
+ ColumnSelection alcsel=null;\r
+ int FirstSeq = -1; // the position of the query sequence in Alignment al\r
+\r
+ JpredResult result = (JpredResult)this.result;\r
+\r
+ jalview.bin.Cache.log.debug("Parsing output from JNet job.");\r
+ // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File");\r
+ jalview.io.JPredFile prediction = new jalview.io.JPredFile(result.\r
+ getPredfile(),\r
+ "Paste");\r
+ SequenceI[] preds = prediction.getSeqsAsArray();\r
+ jalview.bin.Cache.log.debug("Got prediction profile.");\r
+\r
+ if ( (this.msa != null) && (result.getAligfile() != null))\r
+ {\r
+ jalview.bin.Cache.log.debug("Getting associated alignment.");\r
+ // we ignore the returned alignment if we only predicted on a single sequence\r
+ String format = new jalview.io.IdentifyFile().Identify(result.\r
+ getAligfile(),\r
+ "Paste");\r
+\r
+ if (jalview.io.FormatAdapter.isValidFormat(format))\r
+ {\r
+ SequenceI sqs[];\r
+ if (predMap!=null) {\r
+ Object[] alandcolsel = input.getAlignmentAndColumnSelection(alignFrame.getViewport().getGapCharacter());\r
+ sqs = (SequenceI[]) alandcolsel[0];\r
+ al = new Alignment(sqs);\r
+ alcsel=(ColumnSelection) alandcolsel[1];\r
+ } else {\r
+ al = new Alignment(new FormatAdapter().readFile(result.getAligfile(),\r
+ "Paste", format));\r
+ sqs = new SequenceI[al.getHeight()];\r
+\r
+ for (int i = 0, j = al.getHeight(); i < j; i++)\r
+ {\r
+ sqs[i] = al.getSequenceAt(i);\r
+ } \r
+ if (!jalview.analysis.SeqsetUtils.deuniquify( (Hashtable)\r
+ SequenceInfo, sqs))\r
+ {\r
+ throw (new Exception(\r
+ "Couldn't recover sequence properties for alignment."));\r
+ }\r
+ }\r
+ FirstSeq = 0;\r
+ al.setDataset(null);\r
+\r
+ jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq,\r
+ false,predMap);\r
+\r
+ }\r
+ else\r
+ {\r
+ throw (new Exception(\r
+ "Unknown format "+format+" for file : \n" +\r
+ result.getAligfile()));\r
+ }\r
+ }\r
+ else\r
+ {\r
+ al = new Alignment(preds);\r
+ FirstSeq = prediction.getQuerySeqPosition();\r
+ if (predMap!=null) {\r
+ char gc = alignFrame.getViewport().getGapCharacter();\r
+ SequenceI[] sqs = (SequenceI[]) ((java.lang.Object[]) input.getAlignmentAndColumnSelection(gc))[0];\r
+ if (this.msaIndex>=sqs.length)\r
+ throw new Error("Implementation Error! Invalid msaIndex for JPredJob on parent MSA input object!");\r
+ sqs[msaIndex].removeGaps();\r
+ SequenceI profileseq=al.getSequenceAt(FirstSeq);\r
+ profileseq.setSequence(sqs[msaIndex].getSequence());\r
+ }\r
+\r
+ if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(\r
+ al.getSequenceAt(FirstSeq), SequenceInfo))\r
+ {\r
+ throw (new Exception(\r
+ "Couldn't recover sequence properties for JNet Query sequence!"));\r
+ } else {\r
+ al.setDataset(null);\r
+ jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq,\r
+ true, predMap);\r
+ SequenceI profileseq=al.getSequenceAt(0); // this includes any gaps.\r
+ alignToProfileSeq(al, profileseq);\r
+ if (predMap!=null) {\r
+ // Adjust input view for gaps\r
+ // propagate insertions into profile\r
+ alcsel=propagateInsertions(profileseq, al, input);\r
+ }\r
+ }\r
+ }\r
+ return new Object[] { al, alcsel}; // , FirstSeq, noMsa};\r
+ }\r
+ /**\r
+ * Given an alignment where all other sequences except profileseq are aligned to the ungapped profileseq, insert gaps in the other sequences to realign them with the residues in profileseq\r
+ * @param al\r
+ * @param profileseq\r
+ */\r
+ private void alignToProfileSeq(Alignment al, SequenceI profileseq) {\r
+ char gc = al.getGapCharacter();\r
+ int[] gapMap = profileseq.gapMap();\r
+ // insert gaps into profile\r
+ for (int lp=0,r=0; r<gapMap.length; r++) {\r
+ if (gapMap[r]-lp>1) {\r
+ StringBuffer sb=new StringBuffer();\r
+ for (int s=0, ns=gapMap[r]-lp; s<ns; s++) {\r
+ sb.append(gc);\r
+ }\r
+ for (int s=1,ns=al.getHeight(); s<ns; s++) {\r
+ String sq = al.getSequenceAt(s).getSequence();\r
+ int diff=gapMap[r]-sq.length();\r
+ if (diff>0) {\r
+ // pad gaps\r
+ sq=sq+sb;\r
+ while ((diff=gapMap[r]-sq.length())>0) {\r
+ sq=sq+((diff>=sb.length()) ? sb.toString() : sb.substring(0, diff));\r
+ }\r
+ al.getSequenceAt(s).setSequence(sq);\r
+ } else {\r
+ al.getSequenceAt(s).setSequence(sq.substring(0,gapMap[r])+sb.toString()+sq.substring(gapMap[r]));\r
+ }\r
+ }\r
+ }\r
+ lp=gapMap[r];\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Add gaps into the sequences aligned to profileseq under the given AlignmentView\r
+ * @param profileseq\r
+ * @param al\r
+ * @param input\r
+ */\r
+ private ColumnSelection propagateInsertions(SequenceI profileseq, Alignment al, AlignmentView input) {\r
+ char gc = al.getGapCharacter();\r
+ Object[] alandcolsel = input.getAlignmentAndColumnSelection(gc);\r
+ ColumnSelection nview = (ColumnSelection) alandcolsel[1];\r
+ SequenceI origseq;\r
+ nview.pruneDeletions(ShiftList.parseMap((origseq=((SequenceI[]) alandcolsel[0])[0]).gapMap())); // recover original prediction sequence's mapping to view.\r
+ int[] viscontigs=nview.getVisibleContigs(0, profileseq.getLength());\r
+ int spos=0;\r
+ int offset=0;\r
+ // input.pruneDeletions(ShiftList.parseMap(((SequenceI[]) alandcolsel[0])[0].gapMap()))\r
+ // add profile to visible contigs\r
+ for (int v=0; v<viscontigs.length; v+=2) {\r
+ if (viscontigs[v]>spos) {\r
+ StringBuffer sb=new StringBuffer();\r
+ for (int s=0, ns=viscontigs[v]-spos; s<ns; s++) {\r
+ sb.append(gc);\r
+ }\r
+ for (int s=0,ns=al.getHeight(); s<ns; s++) {\r
+ SequenceI sqobj = al.getSequenceAt(s);\r
+ if (sqobj!=profileseq) {\r
+ String sq = al.getSequenceAt(s).getSequence();\r
+ if (sq.length()<=spos+offset) {\r
+ // pad sequence\r
+ int diff=spos+offset-sq.length()-1;\r
+ if (diff>0) {\r
+ // pad gaps\r
+ sq=sq+sb;\r
+ while ((diff=spos+offset-sq.length()-1)>0) {\r
+ sq=sq+((diff>=sb.length()) ? sb.toString() : sb.substring(0, diff));\r
+ }\r
+ }\r
+ sq+=sb.toString();\r
+ } else {\r
+ al.getSequenceAt(s).setSequence(sq.substring(0,spos+offset)+sb.toString()+sq.substring(spos+offset));\r
+ }\r
+ }\r
+ }\r
+ //offset+=sb.length();\r
+ }\r
+ spos = viscontigs[v+1]+1;\r
+ }\r
+ if ((offset+spos)<profileseq.getLength()) {\r
+ StringBuffer sb=new StringBuffer();\r
+ for (int s=0, ns=profileseq.getLength()-spos-offset; s<ns; s++) {\r
+ sb.append(gc);\r
+ }\r
+ for (int s=1,ns=al.getHeight(); s<ns; s++) {\r
+ String sq = al.getSequenceAt(s).getSequence();\r
+ // pad sequence\r
+ int diff=origseq.getLength()-sq.length();\r
+ while (diff>0) {\r
+ sq=sq+((diff>=sb.length()) ? sb.toString() : sb.substring(0, diff));\r
+ diff=origseq.getLength()-sq.length(); \r
+ }\r
+ }\r
+ }\r
+ return nview;\r
+ }\r
+\r
+ public JPredJob(Hashtable SequenceInfo, SequenceI seq, int[] delMap)\r
+ {\r
+ super();\r
+ this.predMap = delMap;\r
+ String sq = AlignSeq.extractGaps(Comparison.GapChars, seq.getSequence());\r
+ if (sq.length() >= 20)\r
+ {\r
+ this.SequenceInfo = SequenceInfo;\r
+ sequence = new vamsas.objects.simple.Sequence();\r
+ sequence.setId(seq.getName());\r
+ sequence.setSeq(sq);\r
+ }\r
+ }\r
+\r
+ public JPredJob(Hashtable SequenceInfo, SequenceI[] msf, int[] delMap)\r
+ {\r
+ this(SequenceInfo, msf[0], delMap);\r
+ if (sequence != null)\r
+ {\r
+ if (msf.length > 1)\r
+ {\r
+ msa = new vamsas.objects.simple.Msfalignment();\r
+ jalview.io.PileUpfile pileup = new jalview.io.PileUpfile();\r
+ msa.setMsf(pileup.print(msf));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ ext.vamsas.Jpred server;\r
+ String altitle = "";\r
+ JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, String wsurl, AlignmentView alview, AlignFrame alframe) {\r
+ super();\r
+ this.altitle = altitle;\r
+ this.server = server;\r
+ this.wsInfo = wsinfo;\r
+ this.input = alview;\r
+ this.alignFrame = alframe;\r
+ WsUrl = wsurl;\r
+ }\r
+\r
+\r
+ JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, String wsurl, Hashtable SequenceInfo,SequenceI seq, int[] delMap, AlignmentView alview, AlignFrame alframe)\r
+ {\r
+ this(wsinfo, altitle, server,wsurl, alview, alframe);\r
+ JPredJob job = new JPredJob(SequenceInfo, seq, delMap);\r
+ if (job.hasValidInput())\r
+ {\r
+ OutputHeader = wsInfo.getProgressText();\r
+ jobs = new WSJob[]\r
+ {\r
+ job};\r
+ job.jobnum = 0;\r
+ }\r
+ }\r
+\r
+ JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, Hashtable SequenceInfo, SequenceI[] msf, int[] delMap, AlignmentView alview, AlignFrame alframe, String wsurl)\r
+ {\r
+ this(wsinfo, altitle, server,wsurl, alview, alframe);\r
+ JPredJob job = new JPredJob(SequenceInfo, msf, delMap);\r
+ if (job.hasValidInput())\r
+ {\r
+ jobs = new WSJob[]\r
+ {\r
+ job};\r
+ OutputHeader = wsInfo.getProgressText();\r
+ job.jobnum = 0;\r
+ }\r
+ }\r
+ void StartJob(WSJob j)\r
+ {\r
+ if (! (j instanceof JPredJob))\r
+ {\r
+ throw new Error("Implementation error - StartJob(JpredJob) called on " +\r
+ j.getClass());\r
+ }\r
+ try\r
+ {\r
+ JPredJob job = (JPredJob) j;\r
+ if (job.msa != null)\r
+ {\r
+ job.jobId = server.predictOnMsa(job.msa);\r
+ }\r
+ else\r
+ if (job.sequence!=null)\r
+ {\r
+ job.jobId = server.predict(job.sequence); // debug like : job.jobId = "/jobs/www-jpred/jp_Yatat29";//\r
+ }\r
+\r
+ if (job.jobId != null)\r
+ {\r
+ if (job.jobId.startsWith("Broken"))\r
+ {\r
+ job.result = (vamsas.objects.simple.Result)new JpredResult();\r
+ job.result.setInvalid(true);\r
+ job.result.setStatus("Submission " + job.jobId);\r
+ }\r
+ else\r
+ {\r
+ job.submitted = true;\r
+ job.subjobComplete = false;\r
+ Cache.log.info(WsUrl + " Job Id '" + job.jobId + "'");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ throw new Exception("Server timed out - try again later\n");\r
+ }\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ if (e.getMessage().indexOf("Exception") > -1)\r
+ {\r
+ wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_SERVERERROR);\r
+ wsInfo.setProgressText(j.jobnum,\r
+ "Failed to submit the prediction. (Just close the window)\n"\r
+ +\r
+ "It is most likely that there is a problem with the server.\n");\r
+ System.err.println(\r
+ "JPredWS Client: Failed to submit the prediction. Quite possibly because of a server error - see below)\n" +\r
+ e.getMessage() + "\n");\r
+\r
+ jalview.bin.Cache.log.warn("Server Exception", e);\r
+ }\r
+ else\r
+ {\r
+ wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR);\r
+ // JBPNote - this could be a popup informing the user of the problem.\r
+ wsInfo.appendProgressText(j.jobnum,\r
+ "Failed to submit the prediction:\n"\r
+ + e.getMessage() +\r
+ wsInfo.getProgressText());\r
+\r
+ jalview.bin.Cache.log.debug("Failed Submission of job " + j.jobnum, e);\r
+\r
+ }\r
+ j.allowedServerExceptions = -1;\r
+ j.subjobComplete = true;\r
+ }\r
+ }\r
+\r
+ void parseResult()\r
+ {\r
+ int results = 0; // number of result sets received\r
+ JobStateSummary finalState = new JobStateSummary();\r
+ try\r
+ {\r
+ for (int j = 0; j < jobs.length; j++)\r
+ {\r
+ finalState.updateJobPanelState(wsInfo, OutputHeader, jobs[j]);\r
+ if (jobs[j].submitted && jobs[j].subjobComplete && jobs[j].hasResults())\r
+ {\r
+ results++;\r
+ }\r
+ }\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+\r
+ Cache.log.error("Unexpected exception when processing results for " +\r
+ altitle, ex);\r
+ wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
+ }\r
+ if (results > 0)\r
+ {\r
+ wsInfo.showResultsNewFrame\r
+ .addActionListener(new java.awt.event.ActionListener()\r
+ {\r
+ public void actionPerformed(\r
+ java.awt.event.ActionEvent evt)\r
+ {\r
+ displayResults(true);\r
+ }\r
+ });\r
+ wsInfo.mergeResults\r
+ .addActionListener(new java.awt.event.ActionListener()\r
+ {\r
+ public void actionPerformed(\r
+ java.awt.event.ActionEvent evt)\r
+ {\r
+ displayResults(false);\r
+ }\r
+ });\r
+ wsInfo.setResultsReady();\r
+ }\r
+ else\r
+ {\r
+ wsInfo.setFinishedNoResults();\r
+ }\r
+ }\r
+\r
+ void displayResults(boolean newWindow)\r
+ {\r
+ // TODO: cope with multiple subjobs.\r
+ if (jobs != null)\r
+ {\r
+ Object[] res = null;\r
+ boolean msa=false;\r
+ for (int jn = 0; jn < jobs.length; jn++)\r
+ {\r
+ Object[] jobres = null;\r
+ JPredJob j = (JPredJob) jobs[jn];\r
+\r
+ if (j.hasResults())\r
+ {\r
+ // hack - we only deal with all single seuqence predictions or all profile predictions\r
+ msa = (j.msa!=null) ? true : msa;\r
+ try\r
+ {\r
+ jalview.bin.Cache.log.debug("Parsing output of job " + jn);\r
+ jobres = j.getResultSet();\r
+ jalview.bin.Cache.log.debug("Finished parsing output.");\r
+ if (jobs.length==1)\r
+ res = jobres;\r
+ else {\r
+ // do merge with other job results\r
+ throw new Error("Multiple JNet subjob merging not yet implemented.");\r
+ }\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ jalview.bin.Cache.log.error(\r
+ "JNet Client: JPred Annotation Parse Error",\r
+ e);\r
+ wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR);\r
+ wsInfo.appendProgressText(j.jobnum,\r
+ OutputHeader + "\n" +\r
+ j.result.getStatus() +\r
+ "\nInvalid JNet job result data!\n" +\r
+ e.getMessage());\r
+ j.result.setBroken(true);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (res != null)\r
+ {\r
+ if (newWindow)\r
+ {\r
+ AlignFrame af;\r
+ if (input==null) {\r
+ if (res[1]!=null) {\r
+ af = new AlignFrame((Alignment)res[0], (ColumnSelection) res[1], AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);\r
+ } else {\r
+ af = new AlignFrame((Alignment)res[0], AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);\r
+ }\r
+ } else {\r
+ /*java.lang.Object[] alandcolsel = input.getAlignmentAndColumnSelection(alignFrame.getViewport().getGapCharacter());\r
+\r
+ if (((SequenceI[])alandcolsel[0])[0].getLength()!=res.getWidth()) {\r
+ if (msa) {\r
+ throw new Error("Implementation Error! ColumnSelection from input alignment will not map to result alignment!");\r
+ } \r
+ }\r
+ if (!msa) {\r
+ // update hidden regions to account for loss of gaps in profile. - if any\r
+ // gapMap returns insert list, interpreted as delete list by pruneDeletions\r
+ //((ColumnSelection) alandcolsel[1]).pruneDeletions(ShiftList.parseMap(((SequenceI[]) alandcolsel[0])[0].gapMap()));\r
+ }*/\r
+ \r
+ af = new AlignFrame((Alignment) res[0], (ColumnSelection) res[1],AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);\r
+ }\r
+ Desktop.addInternalFrame(af, altitle,\r
+ AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);\r
+ }\r
+ else\r
+ {\r
+ Cache.log.info("Append results onto existing alignment.");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ void pollJob(WSJob job)\r
+ throws Exception\r
+ {\r
+ job.result = server.getresult(job.jobId);\r
+ }\r
+ public boolean isCancellable()\r
+ {\r
+ return false;\r
+ }\r
+\r
+ public void cancelJob()\r
+ {\r
+ throw new Error("Implementation error!");\r
+ }\r
+\r
+ public boolean canMergeResults()\r
+ {\r
+ return false;\r
+ }\r
+\r
+}\r
+\r
+\r
{
return false;
}
-}
+}
\ No newline at end of file