1 package jalview.ws2.client.ebi;
3 import java.io.BufferedReader;
4 import java.io.ByteArrayOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
8 import java.io.StringReader;
10 import java.util.List;
12 import jalview.bin.Console;
13 import jalview.datamodel.Alignment;
14 import jalview.datamodel.AlignmentI;
15 import jalview.datamodel.SequenceI;
16 import jalview.io.DataSourceType;
17 import jalview.io.FileFormat;
18 import jalview.io.FileParse;
19 import jalview.io.FormatAdapter;
20 import jalview.io.StockholmFile;
21 import jalview.ws.params.ArgumentI;
22 import jalview.ws.params.simple.BooleanOption;
23 import jalview.ws.params.simple.DoubleParameter;
24 import jalview.ws.params.simple.IntegerParameter;
25 import jalview.ws2.api.Credentials;
26 import jalview.ws2.api.JobStatus;
27 import jalview.ws2.api.WebServiceJobHandle;
28 import jalview.ws2.client.api.AlignmentWebServiceClientI;
29 import jalview.ws2.client.api.WebServiceClientI;
30 import uk.ac.dundee.compbio.hmmerclient.PhmmerClient;
31 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest;
32 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SequenceDatabase;
33 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SubstitutionMatrix;
35 public class PhmmerWSClient implements AlignmentWebServiceClientI
38 final PhmmerClient client;
40 PhmmerWSClient(PhmmerClient client)
46 public String getUrl()
48 return client.getURL().toString();
52 public String getClientName()
54 return "ebi-job-dispatcher";
58 public WebServiceJobHandle submit(List<SequenceI> sequences,
59 List<ArgumentI> args, Credentials credentials) throws IOException
61 var request = PhmmerRequest.newBuilder();
62 String sequence = FileFormat.Fasta.getWriter(null)
63 .print(new SequenceI[]{ sequences.get(0) }, false);
64 request.sequence(new StringReader(sequence));
65 populateRequestArguments(request, args);
66 var email = credentials.getEmail() != null ? credentials.getEmail() :
68 var jobId = client.submit(request.build(), email);
69 Console.debug("Phmmer client submitted new job with id " + jobId);
70 return new WebServiceJobHandle(
71 getClientName(), "phmmer", getUrl(), jobId);
74 private static void populateRequestArguments(PhmmerRequest.Builder request, List<ArgumentI> args)
76 boolean useBitScore = false;
77 boolean useEValue = false;
80 if (arg.getName().equals("cut-offs"))
81 if (arg.getValue().equals("E"))
83 else if (arg.getValue().equals("T"))
86 throw new IllegalArgumentException(
87 "cut-offs argument contains value other than \"E\" or \"T\": "
90 assert (useBitScore || useEValue) && !(useBitScore && useEValue);
93 switch (arg.getName())
96 request.incE(useEValue ? DoubleParameter.parseFloat(arg) : null);
99 request.incdomE(useEValue ? DoubleParameter.parseFloat(arg) : null);
102 request.E(useEValue ? DoubleParameter.parseFloat(arg) : null);
105 request.domE(useEValue ? DoubleParameter.parseFloat(arg) : null);
108 request.incT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
111 request.incdomT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
114 request.T(useBitScore ? DoubleParameter.parseFloat(arg) : null);
117 request.domT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
120 request.popen(DoubleParameter.parseFloat(arg));
123 request.pextend(DoubleParameter.parseFloat(arg));
126 request.mx(parseSubstitutionMatrix(arg));
129 request.noBias(BooleanOption.parseBoolean(arg));
131 case "compressedout":
132 request.compressedOut(BooleanOption.parseBoolean(arg));
135 request.compressedOut(BooleanOption.parseBoolean(arg));
138 request.database(parseSequenceDatabase(arg));
141 request.evalue(DoubleParameter.parseFloat(arg));
144 request.nhits(IntegerParameter.parseInt(arg));
150 private static SubstitutionMatrix parseSubstitutionMatrix(ArgumentI arg)
152 if (arg.getValue() == null)
154 switch (arg.getValue())
157 return SubstitutionMatrix.BLOSUM45;
159 return SubstitutionMatrix.BLOSUM62;
161 return SubstitutionMatrix.BLOSUM90;
163 return SubstitutionMatrix.PAM30;
165 return SubstitutionMatrix.PAM70;
167 throw new IllegalArgumentException(
168 "invalid matrix " + arg.getValue());
172 private static SequenceDatabase parseSequenceDatabase(ArgumentI arg)
174 if (arg.getValue() == null)
176 switch (arg.getValue())
179 return SequenceDatabase.SWISS_PROT;
180 case "uniprotrefprot":
181 return SequenceDatabase.REFERENCE_PROTEOMES;
183 return SequenceDatabase.UNIPROTKB;
185 return SequenceDatabase.PDB;
187 return SequenceDatabase.RP75;
189 return SequenceDatabase.RP55;
191 return SequenceDatabase.RP35;
193 return SequenceDatabase.RP15;
195 return SequenceDatabase.ENSEMBL;
197 return SequenceDatabase.MEROPS;
199 return SequenceDatabase.QUEST_FOR_ORTHOLOGS;
201 return SequenceDatabase.CHEMBL;
203 throw new IllegalArgumentException(
204 "invalid database " + arg.getValue());
209 public JobStatus getStatus(WebServiceJobHandle job) throws IOException
211 var status = client.getStatus(job.getJobId());
214 case PENDING: return JobStatus.SUBMITTED;
215 case QUEUED: return JobStatus.QUEUED;
216 case RUNNING: return JobStatus.RUNNING;
217 case FINISHED: return JobStatus.COMPLETED;
218 case FAILURE: return JobStatus.FAILED;
219 case ERROR: return JobStatus.SERVER_ERROR;
220 case NOT_FOUND: return JobStatus.SERVER_ERROR;
221 case UNDEFINED: return JobStatus.UNKNOWN;
223 return JobStatus.UNKNOWN;
227 public String getLog(WebServiceJobHandle job) throws IOException
233 public String getErrorLog(WebServiceJobHandle job) throws IOException
235 if (getStatus(job) != JobStatus.FAILED)
237 try(InputStream stream = client.getResultStream(job.getJobId(), "error"))
239 ByteArrayOutputStream out = new ByteArrayOutputStream();
240 stream.transferTo(out);
241 return out.toString();
246 public void cancel(WebServiceJobHandle job)
247 throws IOException, UnsupportedOperationException
249 throw new UnsupportedOperationException(
250 "ebi job dispatcher does not support job cancellation");
254 * FIXME: Temporary hack
257 public AlignmentI getAlignment(WebServiceJobHandle job) throws IOException
259 URI url = client.getResultURL(job.getJobId(), "sto");
260 try(InputStream stream = client.getResultStream(job.getJobId(), "sto"))
262 StockholmFile file = new StockholmFile(new FileParse(
263 new BufferedReader(new InputStreamReader(stream)),
264 url.toString(), DataSourceType.URL));
265 var aln = new Alignment(file.getSeqsAsArray());
266 for (var annotation : file.getAnnotations())
267 aln.addAnnotation(annotation);