1 package jalview.ws2.client.ebi;
3 import java.io.IOException;
4 import java.io.StringReader;
7 import jalview.datamodel.SequenceI;
8 import jalview.io.FileFormat;
9 import jalview.ws.params.ArgumentI;
10 import jalview.ws.params.simple.BooleanOption;
11 import jalview.ws.params.simple.DoubleParameter;
12 import jalview.ws.params.simple.IntegerParameter;
13 import jalview.ws2.api.Credentials;
14 import jalview.ws2.api.JobStatus;
15 import jalview.ws2.api.WebServiceJobHandle;
16 import jalview.ws2.client.api.WebServiceClientI;
17 import uk.ac.dundee.compbio.hmmerclient.PhmmerClient;
18 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest;
19 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SequenceDatabase;
20 import uk.ac.dundee.compbio.hmmerclient.PhmmerRequest.SubstitutionMatrix;
22 public class PhmmerWSClient implements WebServiceClientI
25 final PhmmerClient client;
27 PhmmerWSClient(PhmmerClient client)
33 public String getUrl()
35 return client.getURL().toString();
39 public String getClientName()
41 return "ebi-job-dispatcher";
45 public WebServiceJobHandle submit(List<SequenceI> sequences,
46 List<ArgumentI> args, Credentials credentials) throws IOException
48 var request = PhmmerRequest.newBuilder();
49 String sequence = FileFormat.Fasta.getWriter(null)
50 .print(new SequenceI[]{ sequences.get(0) }, false);
51 request.sequence(new StringReader(sequence));
52 populateRequestArguments(request, args);
53 var email = credentials.getEmail() != null ? credentials.getEmail() :
55 var jobId = client.submit(request.build(), email);
56 return new WebServiceJobHandle(
57 getClientName(), "phmmer", getUrl(), jobId);
60 private static void populateRequestArguments(PhmmerRequest.Builder request, List<ArgumentI> args)
62 boolean useBitScore = false;
63 boolean useEValue = false;
66 if (arg.getName().equals("cut-offs"))
67 if (arg.getValue().equals("E"))
69 else if (arg.getValue().equals("T"))
72 throw new IllegalArgumentException(
73 "cut-offs argument contains value other than \"E\" or \"T\": "
76 assert (useBitScore || useEValue) && !(useBitScore && useEValue);
79 switch (arg.getName())
82 request.incE(useEValue ? DoubleParameter.parseFloat(arg) : null);
85 request.incdomE(useEValue ? DoubleParameter.parseFloat(arg) : null);
88 request.E(useEValue ? DoubleParameter.parseFloat(arg) : null);
91 request.domE(useEValue ? DoubleParameter.parseFloat(arg) : null);
94 request.incT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
97 request.incdomT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
100 request.T(useBitScore ? DoubleParameter.parseFloat(arg) : null);
103 request.domT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
106 request.popen(DoubleParameter.parseFloat(arg));
109 request.pextend(DoubleParameter.parseFloat(arg));
112 request.mx(parseSubstitutionMatrix(arg));
115 request.noBias(BooleanOption.parseBoolean(arg));
117 case "compressedout":
118 request.compressedOut(BooleanOption.parseBoolean(arg));
121 request.compressedOut(BooleanOption.parseBoolean(arg));
124 request.database(parseSequenceDatabase(arg));
127 request.evalue(DoubleParameter.parseFloat(arg));
130 request.nhits(IntegerParameter.parseInt(arg));
136 private static SubstitutionMatrix parseSubstitutionMatrix(ArgumentI arg)
138 if (arg.getValue() == null)
140 switch (arg.getValue())
143 return SubstitutionMatrix.BLOSUM45;
145 return SubstitutionMatrix.BLOSUM62;
147 return SubstitutionMatrix.BLOSUM90;
149 return SubstitutionMatrix.PAM30;
151 return SubstitutionMatrix.PAM70;
153 throw new IllegalArgumentException(
154 "invalid matrix " + arg.getValue());
158 private static SequenceDatabase parseSequenceDatabase(ArgumentI arg)
160 if (arg.getValue() == null)
162 switch (arg.getValue())
165 return SequenceDatabase.SWISS_PROT;
166 case "uniprotrefprot":
167 return SequenceDatabase.REFERENCE_PROTEOMES;
169 return SequenceDatabase.UNIPROTKB;
171 return SequenceDatabase.PDB;
173 return SequenceDatabase.RP75;
175 return SequenceDatabase.RP55;
177 return SequenceDatabase.RP35;
179 return SequenceDatabase.RP15;
181 return SequenceDatabase.ENSEMBL;
183 return SequenceDatabase.MEROPS;
185 return SequenceDatabase.QUEST_FOR_ORTHOLOGS;
187 return SequenceDatabase.CHEMBL;
189 throw new IllegalArgumentException(
190 "invalid database " + arg.getValue());
195 public JobStatus getStatus(WebServiceJobHandle job) throws IOException
197 var status = client.getStatus(job.getJobId());
200 case PENDING: return JobStatus.SUBMITTED;
201 case QUEUED: return JobStatus.QUEUED;
202 case RUNNING: return JobStatus.RUNNING;
203 case FINISHED: return JobStatus.COMPLETED;
204 case FAILURE: return JobStatus.FAILED;
205 case ERROR: return JobStatus.SERVER_ERROR;
206 case NOT_FOUND: return JobStatus.SERVER_ERROR;
207 case UNDEFINED: return JobStatus.UNKNOWN;
209 return JobStatus.UNKNOWN;
213 public String getLog(WebServiceJobHandle job) throws IOException
219 public String getErrorLog(WebServiceJobHandle job) throws IOException
225 public void cancel(WebServiceJobHandle job)
226 throws IOException, UnsupportedOperationException
228 throw new UnsupportedOperationException(
229 "ebi job dispatcher does not support job cancellation");