1 package jalview.ws2.client.ebi;
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
7 import java.io.StringReader;
11 import jalview.bin.Console;
12 import jalview.datamodel.Alignment;
13 import jalview.datamodel.AlignmentI;
14 import jalview.datamodel.SequenceI;
15 import jalview.io.DataSourceType;
16 import jalview.io.FileFormat;
17 import jalview.io.FileParse;
18 import jalview.io.FormatAdapter;
19 import jalview.io.StockholmFile;
20 import jalview.ws.params.ArgumentI;
21 import jalview.ws.params.simple.BooleanOption;
22 import jalview.ws.params.simple.DoubleParameter;
23 import jalview.ws.params.simple.IntegerParameter;
24 import jalview.ws2.api.Credentials;
25 import jalview.ws2.api.JobStatus;
26 import jalview.ws2.api.WebServiceJobHandle;
27 import jalview.ws2.client.api.AlignmentWebServiceClientI;
28 import jalview.ws2.client.api.WebServiceClientI;
29 import uk.ac.dundee.compbio.hmmerclient.PhmmerClient;
30 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest;
31 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SequenceDatabase;
32 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SubstitutionMatrix;
34 public class PhmmerWSClient implements AlignmentWebServiceClientI
37 final PhmmerClient client;
39 PhmmerWSClient(PhmmerClient client)
45 public String getUrl()
47 return client.getURL().toString();
51 public String getClientName()
53 return "ebi-job-dispatcher";
57 public WebServiceJobHandle submit(List<SequenceI> sequences,
58 List<ArgumentI> args, Credentials credentials) throws IOException
60 var request = PhmmerRequest.newBuilder();
61 String sequence = FileFormat.Fasta.getWriter(null)
62 .print(new SequenceI[]{ sequences.get(0) }, false);
63 request.sequence(new StringReader(sequence));
64 populateRequestArguments(request, args);
65 var email = credentials.getEmail() != null ? credentials.getEmail() :
67 var jobId = client.submit(request.build(), email);
68 Console.debug("Phmmer client submitted new job with id " + jobId);
69 return new WebServiceJobHandle(
70 getClientName(), "phmmer", getUrl(), jobId);
73 private static void populateRequestArguments(PhmmerRequest.Builder request, List<ArgumentI> args)
75 boolean useBitScore = false;
76 boolean useEValue = false;
79 if (arg.getName().equals("cut-offs"))
80 if (arg.getValue().equals("E"))
82 else if (arg.getValue().equals("T"))
85 throw new IllegalArgumentException(
86 "cut-offs argument contains value other than \"E\" or \"T\": "
89 assert (useBitScore || useEValue) && !(useBitScore && useEValue);
92 switch (arg.getName())
95 request.incE(useEValue ? DoubleParameter.parseFloat(arg) : null);
98 request.incdomE(useEValue ? DoubleParameter.parseFloat(arg) : null);
101 request.E(useEValue ? DoubleParameter.parseFloat(arg) : null);
104 request.domE(useEValue ? DoubleParameter.parseFloat(arg) : null);
107 request.incT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
110 request.incdomT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
113 request.T(useBitScore ? DoubleParameter.parseFloat(arg) : null);
116 request.domT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
119 request.popen(DoubleParameter.parseFloat(arg));
122 request.pextend(DoubleParameter.parseFloat(arg));
125 request.mx(parseSubstitutionMatrix(arg));
128 request.noBias(BooleanOption.parseBoolean(arg));
130 case "compressedout":
131 request.compressedOut(BooleanOption.parseBoolean(arg));
134 request.compressedOut(BooleanOption.parseBoolean(arg));
137 request.database(parseSequenceDatabase(arg));
140 request.evalue(DoubleParameter.parseFloat(arg));
143 request.nhits(IntegerParameter.parseInt(arg));
149 private static SubstitutionMatrix parseSubstitutionMatrix(ArgumentI arg)
151 if (arg.getValue() == null)
153 switch (arg.getValue())
156 return SubstitutionMatrix.BLOSUM45;
158 return SubstitutionMatrix.BLOSUM62;
160 return SubstitutionMatrix.BLOSUM90;
162 return SubstitutionMatrix.PAM30;
164 return SubstitutionMatrix.PAM70;
166 throw new IllegalArgumentException(
167 "invalid matrix " + arg.getValue());
171 private static SequenceDatabase parseSequenceDatabase(ArgumentI arg)
173 if (arg.getValue() == null)
175 switch (arg.getValue())
178 return SequenceDatabase.SWISS_PROT;
179 case "uniprotrefprot":
180 return SequenceDatabase.REFERENCE_PROTEOMES;
182 return SequenceDatabase.UNIPROTKB;
184 return SequenceDatabase.PDB;
186 return SequenceDatabase.RP75;
188 return SequenceDatabase.RP55;
190 return SequenceDatabase.RP35;
192 return SequenceDatabase.RP15;
194 return SequenceDatabase.ENSEMBL;
196 return SequenceDatabase.MEROPS;
198 return SequenceDatabase.QUEST_FOR_ORTHOLOGS;
200 return SequenceDatabase.CHEMBL;
202 throw new IllegalArgumentException(
203 "invalid database " + arg.getValue());
208 public JobStatus getStatus(WebServiceJobHandle job) throws IOException
210 var status = client.getStatus(job.getJobId());
213 case PENDING: return JobStatus.SUBMITTED;
214 case QUEUED: return JobStatus.QUEUED;
215 case RUNNING: return JobStatus.RUNNING;
216 case FINISHED: return JobStatus.COMPLETED;
217 case FAILURE: return JobStatus.FAILED;
218 case ERROR: return JobStatus.SERVER_ERROR;
219 case NOT_FOUND: return JobStatus.SERVER_ERROR;
220 case UNDEFINED: return JobStatus.UNKNOWN;
222 return JobStatus.UNKNOWN;
226 public String getLog(WebServiceJobHandle job) throws IOException
232 public String getErrorLog(WebServiceJobHandle job) throws IOException
238 public void cancel(WebServiceJobHandle job)
239 throws IOException, UnsupportedOperationException
241 throw new UnsupportedOperationException(
242 "ebi job dispatcher does not support job cancellation");
246 * FIXME: Temporary hack
249 public AlignmentI getAlignment(WebServiceJobHandle job) throws IOException
251 URI url = client.getResultURL(job.getJobId(), "sto");
252 try(InputStream stream = client.getResultStream(job.getJobId(), "sto"))
254 StockholmFile file = new StockholmFile(new FileParse(
255 new BufferedReader(new InputStreamReader(stream)),
256 url.toString(), DataSourceType.URL));
257 var aln = new Alignment(file.getSeqsAsArray());
258 for (var annotation : file.getAnnotations())
259 aln.addAnnotation(annotation);