1 package jalview.ws2.client.ebi;
3 import java.io.IOException;
4 import java.io.StringReader;
8 import jalview.datamodel.AlignmentI;
9 import jalview.datamodel.SequenceI;
10 import jalview.io.DataSourceType;
11 import jalview.io.FileFormat;
12 import jalview.io.FormatAdapter;
13 import jalview.ws.params.ArgumentI;
14 import jalview.ws.params.simple.BooleanOption;
15 import jalview.ws.params.simple.DoubleParameter;
16 import jalview.ws.params.simple.IntegerParameter;
17 import jalview.ws2.api.Credentials;
18 import jalview.ws2.api.JobStatus;
19 import jalview.ws2.api.WebServiceJobHandle;
20 import jalview.ws2.client.api.AlignmentWebServiceClientI;
21 import jalview.ws2.client.api.WebServiceClientI;
22 import uk.ac.dundee.compbio.hmmerclient.PhmmerClient;
23 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest;
24 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SequenceDatabase;
25 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SubstitutionMatrix;
27 public class PhmmerWSClient implements AlignmentWebServiceClientI
30 final PhmmerClient client;
32 PhmmerWSClient(PhmmerClient client)
38 public String getUrl()
40 return client.getURL().toString();
44 public String getClientName()
46 return "ebi-job-dispatcher";
50 public WebServiceJobHandle submit(List<SequenceI> sequences,
51 List<ArgumentI> args, Credentials credentials) throws IOException
53 var request = PhmmerRequest.newBuilder();
54 String sequence = FileFormat.Fasta.getWriter(null)
55 .print(new SequenceI[]{ sequences.get(0) }, false);
56 request.sequence(new StringReader(sequence));
57 populateRequestArguments(request, args);
58 var email = credentials.getEmail() != null ? credentials.getEmail() :
60 var jobId = client.submit(request.build(), email);
61 return new WebServiceJobHandle(
62 getClientName(), "phmmer", getUrl(), jobId);
65 private static void populateRequestArguments(PhmmerRequest.Builder request, List<ArgumentI> args)
67 boolean useBitScore = false;
68 boolean useEValue = false;
71 if (arg.getName().equals("cut-offs"))
72 if (arg.getValue().equals("E"))
74 else if (arg.getValue().equals("T"))
77 throw new IllegalArgumentException(
78 "cut-offs argument contains value other than \"E\" or \"T\": "
81 assert (useBitScore || useEValue) && !(useBitScore && useEValue);
84 switch (arg.getName())
87 request.incE(useEValue ? DoubleParameter.parseFloat(arg) : null);
90 request.incdomE(useEValue ? DoubleParameter.parseFloat(arg) : null);
93 request.E(useEValue ? DoubleParameter.parseFloat(arg) : null);
96 request.domE(useEValue ? DoubleParameter.parseFloat(arg) : null);
99 request.incT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
102 request.incdomT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
105 request.T(useBitScore ? DoubleParameter.parseFloat(arg) : null);
108 request.domT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
111 request.popen(DoubleParameter.parseFloat(arg));
114 request.pextend(DoubleParameter.parseFloat(arg));
117 request.mx(parseSubstitutionMatrix(arg));
120 request.noBias(BooleanOption.parseBoolean(arg));
122 case "compressedout":
123 request.compressedOut(BooleanOption.parseBoolean(arg));
126 request.compressedOut(BooleanOption.parseBoolean(arg));
129 request.database(parseSequenceDatabase(arg));
132 request.evalue(DoubleParameter.parseFloat(arg));
135 request.nhits(IntegerParameter.parseInt(arg));
141 private static SubstitutionMatrix parseSubstitutionMatrix(ArgumentI arg)
143 if (arg.getValue() == null)
145 switch (arg.getValue())
148 return SubstitutionMatrix.BLOSUM45;
150 return SubstitutionMatrix.BLOSUM62;
152 return SubstitutionMatrix.BLOSUM90;
154 return SubstitutionMatrix.PAM30;
156 return SubstitutionMatrix.PAM70;
158 throw new IllegalArgumentException(
159 "invalid matrix " + arg.getValue());
163 private static SequenceDatabase parseSequenceDatabase(ArgumentI arg)
165 if (arg.getValue() == null)
167 switch (arg.getValue())
170 return SequenceDatabase.SWISS_PROT;
171 case "uniprotrefprot":
172 return SequenceDatabase.REFERENCE_PROTEOMES;
174 return SequenceDatabase.UNIPROTKB;
176 return SequenceDatabase.PDB;
178 return SequenceDatabase.RP75;
180 return SequenceDatabase.RP55;
182 return SequenceDatabase.RP35;
184 return SequenceDatabase.RP15;
186 return SequenceDatabase.ENSEMBL;
188 return SequenceDatabase.MEROPS;
190 return SequenceDatabase.QUEST_FOR_ORTHOLOGS;
192 return SequenceDatabase.CHEMBL;
194 throw new IllegalArgumentException(
195 "invalid database " + arg.getValue());
200 public JobStatus getStatus(WebServiceJobHandle job) throws IOException
202 var status = client.getStatus(job.getJobId());
205 case PENDING: return JobStatus.SUBMITTED;
206 case QUEUED: return JobStatus.QUEUED;
207 case RUNNING: return JobStatus.RUNNING;
208 case FINISHED: return JobStatus.COMPLETED;
209 case FAILURE: return JobStatus.FAILED;
210 case ERROR: return JobStatus.SERVER_ERROR;
211 case NOT_FOUND: return JobStatus.SERVER_ERROR;
212 case UNDEFINED: return JobStatus.UNKNOWN;
214 return JobStatus.UNKNOWN;
218 public String getLog(WebServiceJobHandle job) throws IOException
224 public String getErrorLog(WebServiceJobHandle job) throws IOException
230 public void cancel(WebServiceJobHandle job)
231 throws IOException, UnsupportedOperationException
233 throw new UnsupportedOperationException(
234 "ebi job dispatcher does not support job cancellation");
238 * FIXME: Temporary hack
241 public AlignmentI getAlignment(WebServiceJobHandle job) throws IOException
243 URI url = client.getResultURL(job.getJobId(), "sto");
244 return new FormatAdapter().readFile(url.toString(), DataSourceType.URL, FileFormat.Stockholm);