1 package jalview.ws2.client.ebi;
3 import java.io.IOException;
4 import java.io.StringReader;
8 import jalview.bin.Console;
9 import jalview.datamodel.AlignmentI;
10 import jalview.datamodel.SequenceI;
11 import jalview.io.DataSourceType;
12 import jalview.io.FileFormat;
13 import jalview.io.FormatAdapter;
14 import jalview.ws.params.ArgumentI;
15 import jalview.ws.params.simple.BooleanOption;
16 import jalview.ws.params.simple.DoubleParameter;
17 import jalview.ws.params.simple.IntegerParameter;
18 import jalview.ws2.api.Credentials;
19 import jalview.ws2.api.JobStatus;
20 import jalview.ws2.api.WebServiceJobHandle;
21 import jalview.ws2.client.api.AlignmentWebServiceClientI;
22 import jalview.ws2.client.api.WebServiceClientI;
23 import uk.ac.dundee.compbio.hmmerclient.PhmmerClient;
24 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest;
25 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SequenceDatabase;
26 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SubstitutionMatrix;
28 public class PhmmerWSClient implements AlignmentWebServiceClientI
31 final PhmmerClient client;
33 PhmmerWSClient(PhmmerClient client)
39 public String getUrl()
41 return client.getURL().toString();
45 public String getClientName()
47 return "ebi-job-dispatcher";
51 public WebServiceJobHandle submit(List<SequenceI> sequences,
52 List<ArgumentI> args, Credentials credentials) throws IOException
54 var request = PhmmerRequest.newBuilder();
55 String sequence = FileFormat.Fasta.getWriter(null)
56 .print(new SequenceI[]{ sequences.get(0) }, false);
57 request.sequence(new StringReader(sequence));
58 populateRequestArguments(request, args);
59 var email = credentials.getEmail() != null ? credentials.getEmail() :
61 var jobId = client.submit(request.build(), email);
62 Console.debug("Phmmer client submitted new job with id " + jobId);
63 return new WebServiceJobHandle(
64 getClientName(), "phmmer", getUrl(), jobId);
67 private static void populateRequestArguments(PhmmerRequest.Builder request, List<ArgumentI> args)
69 boolean useBitScore = false;
70 boolean useEValue = false;
73 if (arg.getName().equals("cut-offs"))
74 if (arg.getValue().equals("E"))
76 else if (arg.getValue().equals("T"))
79 throw new IllegalArgumentException(
80 "cut-offs argument contains value other than \"E\" or \"T\": "
83 assert (useBitScore || useEValue) && !(useBitScore && useEValue);
86 switch (arg.getName())
89 request.incE(useEValue ? DoubleParameter.parseFloat(arg) : null);
92 request.incdomE(useEValue ? DoubleParameter.parseFloat(arg) : null);
95 request.E(useEValue ? DoubleParameter.parseFloat(arg) : null);
98 request.domE(useEValue ? DoubleParameter.parseFloat(arg) : null);
101 request.incT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
104 request.incdomT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
107 request.T(useBitScore ? DoubleParameter.parseFloat(arg) : null);
110 request.domT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
113 request.popen(DoubleParameter.parseFloat(arg));
116 request.pextend(DoubleParameter.parseFloat(arg));
119 request.mx(parseSubstitutionMatrix(arg));
122 request.noBias(BooleanOption.parseBoolean(arg));
124 case "compressedout":
125 request.compressedOut(BooleanOption.parseBoolean(arg));
128 request.compressedOut(BooleanOption.parseBoolean(arg));
131 request.database(parseSequenceDatabase(arg));
134 request.evalue(DoubleParameter.parseFloat(arg));
137 request.nhits(IntegerParameter.parseInt(arg));
143 private static SubstitutionMatrix parseSubstitutionMatrix(ArgumentI arg)
145 if (arg.getValue() == null)
147 switch (arg.getValue())
150 return SubstitutionMatrix.BLOSUM45;
152 return SubstitutionMatrix.BLOSUM62;
154 return SubstitutionMatrix.BLOSUM90;
156 return SubstitutionMatrix.PAM30;
158 return SubstitutionMatrix.PAM70;
160 throw new IllegalArgumentException(
161 "invalid matrix " + arg.getValue());
165 private static SequenceDatabase parseSequenceDatabase(ArgumentI arg)
167 if (arg.getValue() == null)
169 switch (arg.getValue())
172 return SequenceDatabase.SWISS_PROT;
173 case "uniprotrefprot":
174 return SequenceDatabase.REFERENCE_PROTEOMES;
176 return SequenceDatabase.UNIPROTKB;
178 return SequenceDatabase.PDB;
180 return SequenceDatabase.RP75;
182 return SequenceDatabase.RP55;
184 return SequenceDatabase.RP35;
186 return SequenceDatabase.RP15;
188 return SequenceDatabase.ENSEMBL;
190 return SequenceDatabase.MEROPS;
192 return SequenceDatabase.QUEST_FOR_ORTHOLOGS;
194 return SequenceDatabase.CHEMBL;
196 throw new IllegalArgumentException(
197 "invalid database " + arg.getValue());
202 public JobStatus getStatus(WebServiceJobHandle job) throws IOException
204 var status = client.getStatus(job.getJobId());
207 case PENDING: return JobStatus.SUBMITTED;
208 case QUEUED: return JobStatus.QUEUED;
209 case RUNNING: return JobStatus.RUNNING;
210 case FINISHED: return JobStatus.COMPLETED;
211 case FAILURE: return JobStatus.FAILED;
212 case ERROR: return JobStatus.SERVER_ERROR;
213 case NOT_FOUND: return JobStatus.SERVER_ERROR;
214 case UNDEFINED: return JobStatus.UNKNOWN;
216 return JobStatus.UNKNOWN;
220 public String getLog(WebServiceJobHandle job) throws IOException
226 public String getErrorLog(WebServiceJobHandle job) throws IOException
232 public void cancel(WebServiceJobHandle job)
233 throws IOException, UnsupportedOperationException
235 throw new UnsupportedOperationException(
236 "ebi job dispatcher does not support job cancellation");
240 * FIXME: Temporary hack
243 public AlignmentI getAlignment(WebServiceJobHandle job) throws IOException
245 URI url = client.getResultURL(job.getJobId(), "sto");
246 return new FormatAdapter().readFile(url.toString(), DataSourceType.URL, FileFormat.Stockholm);