Clover icon

Coverage Report

  1. Project Clover database Thu Dec 4 2025 14:43:25 GMT
  2. Package jalview.ws2.client.ebi

File PhmmerWSClient.java

 

Coverage histogram

../../../../img/srcFileCovDistChart1.png
57% of files have more coverage

Code metrics

32
153
12
1
271
252
77
0.5
12.75
12
6.42

Classes

Class Line # Actions
PhmmerWSClient 35 153 77
0.0101522841%
 

Contributing tests

This file is covered by 47 tests. .

Source view

1    package jalview.ws2.client.ebi;
2   
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;
9    import java.net.URI;
10    import java.util.List;
11   
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;
34   
 
35    public class PhmmerWSClient implements AlignmentWebServiceClientI
36    {
37   
38    final PhmmerClient client;
39   
 
40  80 toggle PhmmerWSClient(PhmmerClient client)
41    {
42  80 this.client = client;
43    }
44   
 
45  0 toggle @Override
46    public String getUrl()
47    {
48  0 return client.getURL().toString();
49    }
50   
 
51  0 toggle @Override
52    public String getClientName()
53    {
54  0 return "ebi-job-dispatcher";
55    }
56   
 
57  0 toggle @Override
58    public WebServiceJobHandle submit(List<SequenceI> sequences,
59    List<ArgumentI> args, Credentials credentials) throws IOException
60    {
61  0 var request = PhmmerRequest.newBuilder();
62  0 String sequence = FileFormat.Fasta.getWriter(null)
63    .print(new SequenceI[]{ sequences.get(0) }, false);
64  0 request.sequence(new StringReader(sequence));
65  0 populateRequestArguments(request, args);
66  0 var email = credentials.getEmail() != null ? credentials.getEmail() :
67    "nouser@jalview.org";
68  0 var jobId = client.submit(request.build(), email);
69  0 Console.debug("Phmmer client submitted new job with id " + jobId);
70  0 return new WebServiceJobHandle(
71    getClientName(), "phmmer", getUrl(), jobId);
72    }
73   
 
74  0 toggle private static void populateRequestArguments(PhmmerRequest.Builder request, List<ArgumentI> args)
75    {
76  0 boolean useBitScore = false;
77  0 boolean useEValue = false;
78  0 for (var arg : args)
79    {
80  0 if (arg.getName().equals("cut-offs"))
81  0 if (arg.getValue().equals("E"))
82  0 useEValue = true;
83  0 else if (arg.getValue().equals("T"))
84  0 useBitScore = true;
85    else
86  0 throw new IllegalArgumentException(
87    "cut-offs argument contains value other than \"E\" or \"T\": "
88    + arg.getValue());
89    }
90  0 assert (useBitScore || useEValue) && !(useBitScore && useEValue);
91  0 for (var arg : args)
92    {
93  0 switch (arg.getName())
94    {
95  0 case "incE":
96  0 request.incE(useEValue ? DoubleParameter.parseFloat(arg) : null);
97  0 break;
98  0 case "incdomE":
99  0 request.incdomE(useEValue ? DoubleParameter.parseFloat(arg) : null);
100  0 break;
101  0 case "E":
102  0 request.E(useEValue ? DoubleParameter.parseFloat(arg) : null);
103  0 break;
104  0 case "domE":
105  0 request.domE(useEValue ? DoubleParameter.parseFloat(arg) : null);
106  0 break;
107  0 case "incT":
108  0 request.incT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
109  0 break;
110  0 case "incdomT":
111  0 request.incdomT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
112  0 break;
113  0 case "T":
114  0 request.T(useBitScore ? DoubleParameter.parseFloat(arg) : null);
115  0 break;
116  0 case "domT":
117  0 request.domT(useBitScore ? DoubleParameter.parseFloat(arg) : null);
118  0 break;
119  0 case "popen":
120  0 request.popen(DoubleParameter.parseFloat(arg));
121  0 break;
122  0 case "pextend":
123  0 request.pextend(DoubleParameter.parseFloat(arg));
124  0 break;
125  0 case "mx":
126  0 request.mx(parseSubstitutionMatrix(arg));
127  0 break;
128  0 case "nobias":
129  0 request.noBias(BooleanOption.parseBoolean(arg));
130  0 break;
131  0 case "compressedout":
132  0 request.compressedOut(BooleanOption.parseBoolean(arg));
133  0 break;
134  0 case "alignView":
135  0 request.compressedOut(BooleanOption.parseBoolean(arg));
136  0 break;
137  0 case "database":
138  0 request.database(parseSequenceDatabase(arg));
139  0 break;
140  0 case "evalue":
141  0 request.evalue(DoubleParameter.parseFloat(arg));
142  0 break;
143  0 case "nhits":
144  0 request.nhits(IntegerParameter.parseInt(arg));
145  0 break;
146    }
147    }
148    }
149   
 
150  0 toggle private static SubstitutionMatrix parseSubstitutionMatrix(ArgumentI arg)
151    {
152  0 if (arg.getValue() == null)
153  0 return null;
154  0 switch (arg.getValue())
155    {
156  0 case "BLOSUM45":
157  0 return SubstitutionMatrix.BLOSUM45;
158  0 case "BLOSUM62":
159  0 return SubstitutionMatrix.BLOSUM62;
160  0 case "BLOSUM90":
161  0 return SubstitutionMatrix.BLOSUM90;
162  0 case "PAM30":
163  0 return SubstitutionMatrix.PAM30;
164  0 case "PAM70":
165  0 return SubstitutionMatrix.PAM70;
166  0 default:
167  0 throw new IllegalArgumentException(
168    "invalid matrix " + arg.getValue());
169    }
170    }
171   
 
172  0 toggle private static SequenceDatabase parseSequenceDatabase(ArgumentI arg)
173    {
174  0 if (arg.getValue() == null)
175  0 return null;
176  0 switch (arg.getValue())
177    {
178  0 case "swissprot":
179  0 return SequenceDatabase.SWISS_PROT;
180  0 case "uniprotrefprot":
181  0 return SequenceDatabase.REFERENCE_PROTEOMES;
182  0 case "uniprotkb":
183  0 return SequenceDatabase.UNIPROTKB;
184  0 case "pdb":
185  0 return SequenceDatabase.PDB;
186  0 case "rp75":
187  0 return SequenceDatabase.RP75;
188  0 case "rp55":
189  0 return SequenceDatabase.RP55;
190  0 case "rp35":
191  0 return SequenceDatabase.RP35;
192  0 case "rp15":
193  0 return SequenceDatabase.RP15;
194  0 case "ensembl":
195  0 return SequenceDatabase.ENSEMBL;
196  0 case "merops":
197  0 return SequenceDatabase.MEROPS;
198  0 case "qfo":
199  0 return SequenceDatabase.QUEST_FOR_ORTHOLOGS;
200  0 case "chembl":
201  0 return SequenceDatabase.CHEMBL;
202  0 default:
203  0 throw new IllegalArgumentException(
204    "invalid database " + arg.getValue());
205    }
206    }
207   
 
208  0 toggle @Override
209    public JobStatus getStatus(WebServiceJobHandle job) throws IOException
210    {
211  0 var status = client.getStatus(job.getJobId());
212  0 switch (status)
213    {
214  0 case PENDING: return JobStatus.SUBMITTED;
215  0 case QUEUED: return JobStatus.QUEUED;
216  0 case RUNNING: return JobStatus.RUNNING;
217  0 case FINISHED: return JobStatus.COMPLETED;
218  0 case FAILURE: return JobStatus.FAILED;
219  0 case ERROR: return JobStatus.SERVER_ERROR;
220  0 case NOT_FOUND: return JobStatus.SERVER_ERROR;
221  0 case UNDEFINED: return JobStatus.UNKNOWN;
222    }
223  0 return JobStatus.UNKNOWN;
224    }
225   
 
226  0 toggle @Override
227    public String getLog(WebServiceJobHandle job) throws IOException
228    {
229  0 return "";
230    }
231   
 
232  0 toggle @Override
233    public String getErrorLog(WebServiceJobHandle job) throws IOException
234    {
235  0 if (getStatus(job) != JobStatus.FAILED)
236  0 return "";
237  0 try(InputStream stream = client.getResultStream(job.getJobId(), "error"))
238    {
239  0 ByteArrayOutputStream out = new ByteArrayOutputStream();
240  0 stream.transferTo(out);
241  0 return out.toString();
242    }
243    }
244   
 
245  0 toggle @Override
246    public void cancel(WebServiceJobHandle job)
247    throws IOException, UnsupportedOperationException
248    {
249  0 throw new UnsupportedOperationException(
250    "ebi job dispatcher does not support job cancellation");
251    }
252   
253    /**
254    * FIXME: Temporary hack
255    */
 
256  0 toggle @Override
257    public AlignmentI getAlignment(WebServiceJobHandle job) throws IOException
258    {
259  0 URI url = client.getResultURL(job.getJobId(), "sto");
260  0 try(InputStream stream = client.getResultStream(job.getJobId(), "sto"))
261    {
262  0 StockholmFile file = new StockholmFile(new FileParse(
263    new BufferedReader(new InputStreamReader(stream)),
264    url.toString(), DataSourceType.URL));
265  0 var aln = new Alignment(file.getSeqsAsArray());
266  0 for (var annotation : file.getAnnotations())
267  0 aln.addAnnotation(annotation);
268  0 return aln;
269    }
270    }
271    }