3 import jalview.bin.Cache;
4 import jalview.datamodel.SequenceI;
5 import jalview.gui.Preferences;
6 import jalview.util.MessageManager;
7 import jalview.viewmodel.AlignmentViewport;
8 import jalview.ws.params.ArgumentI;
9 import jalview.ws.params.ParamDatastoreI;
10 import jalview.ws.params.WsParamSetI;
11 import jalview.ws.params.simple.BooleanOption;
12 import jalview.ws.params.simple.DoubleParameter;
13 import jalview.ws.params.simple.FileParameter;
14 import jalview.ws.params.simple.IntegerParameter;
15 import jalview.ws.params.simple.LogarithmicParameter;
16 import jalview.ws.params.simple.Option;
17 import jalview.ws.params.simple.RadioChoiceParameter;
18 import jalview.ws.params.simple.StringParameter;
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.List;
25 import java.util.Scanner;
27 public final class HMMERParamStore implements ParamDatastoreI
29 private static final String HMMBUILD = "hmmbuild";
31 private static final String HMMALIGN = "hmmalign";
33 private static final String HMMSEARCH = "hmmsearch";
35 private static final String JACKHMMER = "jackhmmer";
39 private List<WsParamSetI> presets = new ArrayList<>();
41 private AlignmentViewport viewport;
43 private HMMERParamStore(String nam, AlignmentViewport av)
49 public static HMMERParamStore forBuild(AlignmentViewport viewport)
51 return new HMMERParamStore(HMMBUILD, viewport);
54 public static HMMERParamStore forAlign(AlignmentViewport viewport)
56 return new HMMERParamStore(HMMALIGN, viewport);
59 public static HMMERParamStore forSearch(AlignmentViewport viewport)
61 return new HMMERParamStore(HMMSEARCH, viewport);
64 public static HMMERParamStore forJackhmmer(AlignmentViewport viewport)
66 return new HMMERParamStore(JACKHMMER, viewport);
70 public List<WsParamSetI> getPresets()
76 public WsParamSetI getPreset(String nam)
82 public List<ArgumentI> getServiceParameters()
84 List<ArgumentI> args = new ArrayList<>();
88 getHMMSearchParams(args);
91 getHMMAlignParams(args);
94 getHMMBuildParams(args);
97 getJackhmmerParams(args);
105 * Answers default parameters for hmmsearch, taking into account any
106 * configured as user preferences
110 private void getHMMSearchParams(List<ArgumentI> args)
115 args.add(new BooleanOption(
116 MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY),
117 MessageManager.getString("label.auto_align_seqs_desc"), false,
118 false, false, null));
119 args.add(new BooleanOption(
120 MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY),
121 MessageManager.getString("label.use_accessions_desc"), false,
123 args.add(new BooleanOption(
124 MessageManager.getString(HMMSearch.TRIM_TERMINI_KEY),
125 MessageManager.getString("label.trim_termini_desc"), false,
127 args.add(new BooleanOption(
128 MessageManager.getString(HMMSearch.RETURN_N_NEW_SEQ),
129 MessageManager.getString("label.check_for_new_sequences_desc"),
130 false, false, false, null));
135 addChoiceOfHmm(args);
137 // addChoiceOfDatabase(args);
139 String thisAlignment = MessageManager
140 .getString(HMMSearch.THIS_ALIGNMENT_KEY);
141 String database = MessageManager.getString("label.database");
142 args.add(new FileParameter(database, "", false, "", ""));
143 args.add(new IntegerParameter(
144 MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
145 MessageManager.getString("label.number_of_results_desc"), true,
147 args.add(new RadioChoiceParameter(
148 MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
149 Arrays.asList(MessageManager.getString(HMMSearch.CUTOFF_EVALUE),
150 MessageManager.getString(HMMSearch.CUTOFF_SCORE)),
151 MessageManager.getString(HMMSearch.CUTOFF_EVALUE)));
152 args.add(new LogarithmicParameter(
153 MessageManager.getString(HMMSearch.REPORTING_SEQ_EVALUE_KEY),
154 MessageManager.getString("label.reporting_seq_e_value_desc"),
157 args.add(new LogarithmicParameter(
158 MessageManager.getString(HMMSearch.REPORTING_DOM_EVALUE_KEY),
159 MessageManager.getString("label.reporting_dom_e_value_desc"),
165 .getString(HMMSearch.REPORTING_SEQ_SCORE_KEY),
166 MessageManager.getString(
167 "label.reporting_seq_score_desc"),
173 .getString(HMMSearch.REPORTING_DOM_SCORE_KEY),
174 MessageManager.getString(
175 "label.reporting_dom_score_desc"),
178 args.add(new RadioChoiceParameter(
179 MessageManager.getString(HMMSearch.INCLUSION_THRESHOLD_KEY),
181 Arrays.asList(MessageManager.getString(HMMSearch.CUTOFF_EVALUE),
182 MessageManager.getString(HMMSearch.CUTOFF_SCORE)),
183 MessageManager.getString(HMMSearch.CUTOFF_EVALUE)));
184 args.add(new LogarithmicParameter(
185 MessageManager.getString(HMMSearch.INCLUSION_SEQ_EVALUE_KEY),
186 MessageManager.getString("label.inclusion_seq_e_value_desc"),
189 args.add(new LogarithmicParameter(
190 MessageManager.getString(HMMSearch.INCLUSION_DOM_EVALUE_KEY),
191 MessageManager.getString("label.inclusion_dom_e_value_desc"),
194 args.add(new DoubleParameter(
195 MessageManager.getString(HMMSearch.INCLUSION_SEQ_SCORE_KEY),
196 MessageManager.getString("label.inclusion_seq_score_desc"),
199 args.add(new DoubleParameter(
200 MessageManager.getString(HMMSearch.INCLUSION_DOM_SCORE_KEY),
201 MessageManager.getString("label.inclusion_dom_score_desc"),
207 * Answers default parameters for jackhmmer, taking into account any configured
208 * as user preferences
212 private void getJackhmmerParams(List<ArgumentI> args)
218 addChoiceOfSequence(args);
220 // addChoiceOfDatabase(args);
222 String database = MessageManager.getString("label.database");
223 args.add(new FileParameter(database, "", false, "", ""));
224 args.add(new IntegerParameter(
225 MessageManager.getString(HMMSearch.NUMBER_OF_ITERATIONS),
226 MessageManager.getString("label.number_of_iterations_desc"),
228 args.add(new RadioChoiceParameter(
229 MessageManager.getString(JackHMMER.REPORTING_CUTOFF_KEY), null,
230 Arrays.asList(MessageManager.getString(JackHMMER.CUTOFF_NONE),
231 MessageManager.getString(JackHMMER.CUTOFF_EVALUE),
232 MessageManager.getString(JackHMMER.CUTOFF_SCORE)),
233 MessageManager.getString(JackHMMER.CUTOFF_EVALUE)));
234 args.add(new LogarithmicParameter(
235 MessageManager.getString(JackHMMER.REPORTING_SEQ_EVALUE_KEY),
236 MessageManager.getString("label.reporting_seq_e_value_desc"),
239 args.add(new LogarithmicParameter(
240 MessageManager.getString(JackHMMER.REPORTING_DOM_EVALUE_KEY),
241 MessageManager.getString(
242 "label.reporting_dom_e_value_desc"),
245 args.add(new DoubleParameter(
246 MessageManager.getString(JackHMMER.REPORTING_SEQ_SCORE_KEY),
247 MessageManager.getString("label.reporting_seq_score_desc"),
250 args.add(new DoubleParameter(
251 MessageManager.getString(JackHMMER.REPORTING_DOM_SCORE_KEY),
252 MessageManager.getString("label.reporting_dom_score_desc"),
255 args.add(new RadioChoiceParameter(
256 MessageManager.getString(HMMSearch.INCLUSION_THRESHOLD_KEY),
258 Arrays.asList(MessageManager.getString(HMMSearch.CUTOFF_EVALUE),
259 MessageManager.getString(HMMSearch.CUTOFF_SCORE)),
260 MessageManager.getString(HmmerCommand.CUTOFF_EVALUE)));
261 args.add(new LogarithmicParameter(
262 MessageManager.getString(HMMSearch.INCLUSION_SEQ_EVALUE_KEY),
263 MessageManager.getString("label.inclusion_seq_e_value_desc"),
264 false, 1D, 1E-100, 10D));
265 args.add(new LogarithmicParameter(
266 MessageManager.getString(HMMSearch.INCLUSION_DOM_EVALUE_KEY),
267 MessageManager.getString("label.inclusion_dom_e_value_desc"),
268 false, 1D, 1E-100, 10D));
269 args.add(new DoubleParameter(
270 MessageManager.getString(HMMSearch.INCLUSION_SEQ_SCORE_KEY),
271 MessageManager.getString("label.inclusion_seq_score_desc"),
272 false, 0d, 0d, 1000d));
273 args.add(new DoubleParameter(
274 MessageManager.getString(HMMSearch.INCLUSION_DOM_SCORE_KEY),
275 MessageManager.getString("label.inclusion_dom_score_desc"),
276 false, 0d, 0d, 1000d));
280 * Constructs a choice parameter for database to search; always includes 'this
281 * alignment', and also includes any databases held under user preferences key
282 * "HMMSEARCH_DBS" as a comma-delimited list
286 protected void addChoiceOfDatabase(List<ArgumentI> args)
288 String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
289 if (names == null || names.isEmpty())
294 List<String> filePaths = new ArrayList<>();
295 List<String> fileNames = new ArrayList<>();
297 String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
298 filePaths.add(thisAlignment);
299 fileNames.add(thisAlignment);
301 Scanner nameScanner = new Scanner(names);
302 nameScanner.useDelimiter(Preferences.COMMA);
304 while (nameScanner.hasNext())
306 String next = nameScanner.next();
307 if ("null".equals(next))
309 Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
314 int pos = next.lastIndexOf(File.separator);
315 String fileName = next.substring(pos + 1);
316 fileNames.add(fileName);
320 ArgumentI databasesOption = new StringParameter(
321 MessageManager.getString(HMMSearch.DATABASE_KEY),
322 MessageManager.getString("label.database_for_hmmsearch"), true,
325 filePaths, fileNames);
326 args.add(databasesOption);
330 * Answers default parameters for hmmalign, taking into account any configured
331 * as user preferences
335 private void getHMMAlignParams(List<ArgumentI> args)
337 addChoiceOfHmm(args);
339 boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
341 args.add(new BooleanOption(
342 MessageManager.getString("label.trim_termini"),
343 MessageManager.getString("label.trim_termini_desc"),
344 false, false, def, null));
348 * Adds an argument representing the choice of HMM sequences (profiles)
349 * against which to perform align or search, provided at least one is found
353 protected void addChoiceOfHmm(List<ArgumentI> args)
355 List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
358 List<String> options = new ArrayList<>();
359 for (SequenceI hmmSeq : hmms)
361 options.add(hmmSeq.getName());
363 String defseq = options.get(0);
364 ArgumentI arg = new StringParameter(
365 MessageManager.getString("label.use_hmm"), null, true, defseq,
366 defseq, options, null);
372 * Adds an argument representing the choice of sequence against which to perform
377 protected void addChoiceOfSequence(List<ArgumentI> args)
379 List<SequenceI> sequences = viewport.getAlignment().getSequences();
381 List<String> options = new ArrayList<>();
383 for (SequenceI seq : sequences)
385 options.add(seq.getName());
388 String defseq = options.get(0);
389 ArgumentI arg = new StringParameter(
390 MessageManager.getString("label.use_sequence"), null, true,
392 defseq, options, null);
397 * Answers default parameters for hmmbuild, taking into account any configured
398 * as user preferences
402 private void getHMMBuildParams(List<ArgumentI> args)
405 * name to give the computed alignment HMM consensus sequence
406 * (Jalview constructs group HMM consensus sequence names)
408 String defValue = "Alignment_HMM";
409 StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
410 MessageManager.getString("label.hmm_name_desc"), true, defValue,
415 * only enable Use Reference Annotation if RF is present
417 if (viewport.hasReferenceAnnotation())
419 args.add(new BooleanOption(
420 MessageManager.getString("label.use_reference"),
421 MessageManager.getString("label.use_reference_desc"), true,
426 * choice of whether to compute HMM for alignment and/or group(s)
427 * - only if there are any groups
429 if (!viewport.getAlignment().getGroups().isEmpty())
431 List<String> options = new ArrayList<>();
432 options.add(MessageManager.getString("label.alignment"));
433 options.add(MessageManager.getString("label.groups_and_alignment"));
434 options.add(MessageManager.getString("label.groups"));
435 options.add(MessageManager.getString("label.selected_group"));
436 args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
437 MessageManager.getString("label.hmmbuild_for_desc"), true,
438 MessageManager.getString("label.alignment"),
439 MessageManager.getString("label.alignment"), options, null));
444 public boolean presetExists(String forName)
450 public void deletePreset(String forName)
455 public void storePreset(String presetName, String text,
456 List<ArgumentI> jobParams)
461 public void updatePreset(String oldName, String presetName, String text,
462 List<ArgumentI> jobParams)
467 public WsParamSetI parseServiceParameterFile(String forName,
468 String description, String[] serviceURL, String parameters)
475 public String generateServiceParameterFile(WsParamSetI pset)