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,
131 addChoiceOfHmm(args);
133 // addChoiceOfDatabase(args);
135 String thisAlignment = MessageManager
136 .getString(HMMSearch.THIS_ALIGNMENT_KEY);
137 String database = MessageManager.getString("label.database");
138 args.add(new RadioChoiceParameter(
139 MessageManager.getString("action.search"), null,
140 Arrays.asList(thisAlignment,
143 args.add(new FileParameter(database, "", false, "", ""));
144 args.add(new IntegerParameter(
145 MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
146 MessageManager.getString("label.number_of_results_desc"), true,
148 args.add(new RadioChoiceParameter(
149 MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
150 Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE,
151 HMMSearch.CUTOFF_SCORE),
152 HMMSearch.CUTOFF_EVALUE));
153 args.add(new LogarithmicParameter(
154 MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY),
155 MessageManager.getString("label.seq_e_value_desc"), false, 1D,
157 args.add(new LogarithmicParameter(
158 MessageManager.getString(HMMSearch.DOM_EVALUE_KEY),
159 MessageManager.getString("label.dom_e_value_desc"), false, 1D,
163 MessageManager.getString(HMMSearch.SEQ_SCORE_KEY),
164 MessageManager.getString("label.seq_score_desc"), false,
168 MessageManager.getString(HMMSearch.DOM_SCORE_KEY),
169 MessageManager.getString("label.dom_score_desc"), false,
174 * Answers default parameters for jackhmmer, taking into account any configured
175 * as user preferences
179 private void getJackhmmerParams(List<ArgumentI> args)
185 addChoiceOfSequence(args);
187 // addChoiceOfDatabase(args);
189 String thisAlignment = MessageManager
190 .getString(JackHMMER.THIS_ALIGNMENT_KEY);
191 String database = MessageManager.getString("label.database");
192 args.add(new RadioChoiceParameter(
193 MessageManager.getString("action.search"), null,
194 Arrays.asList(thisAlignment, database), thisAlignment));
195 args.add(new FileParameter(database, "", false, "", ""));
196 args.add(new RadioChoiceParameter(
197 MessageManager.getString(JackHMMER.REPORTING_CUTOFF_KEY), null,
198 Arrays.asList(JackHMMER.CUTOFF_NONE, JackHMMER.CUTOFF_EVALUE,
199 JackHMMER.CUTOFF_SCORE),
200 JackHMMER.CUTOFF_EVALUE));
201 args.add(new LogarithmicParameter(
202 MessageManager.getString(JackHMMER.SEQ_EVALUE_KEY),
203 MessageManager.getString("label.seq_e_value_desc"), false, 1D,
205 args.add(new LogarithmicParameter(
206 MessageManager.getString(JackHMMER.DOM_EVALUE_KEY),
207 MessageManager.getString("label.dom_e_value_desc"), false, 1D,
209 args.add(new DoubleParameter(
210 MessageManager.getString(JackHMMER.SEQ_SCORE_KEY),
211 MessageManager.getString("label.seq_score_desc"), false, 0d, 0d,
213 args.add(new DoubleParameter(
214 MessageManager.getString(JackHMMER.DOM_SCORE_KEY),
215 MessageManager.getString("label.dom_score_desc"), false, 0d, 0d,
220 * Constructs a choice parameter for database to search; always includes 'this
221 * alignment', and also includes any databases held under user preferences key
222 * "HMMSEARCH_DBS" as a comma-delimited list
226 protected void addChoiceOfDatabase(List<ArgumentI> args)
228 String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
229 if (names == null || names.isEmpty())
234 List<String> filePaths = new ArrayList<>();
235 List<String> fileNames = new ArrayList<>();
237 String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
238 filePaths.add(thisAlignment);
239 fileNames.add(thisAlignment);
241 Scanner nameScanner = new Scanner(names);
242 nameScanner.useDelimiter(Preferences.COMMA);
244 while (nameScanner.hasNext())
246 String next = nameScanner.next();
247 if ("null".equals(next))
249 Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
254 int pos = next.lastIndexOf(File.separator);
255 String fileName = next.substring(pos + 1);
256 fileNames.add(fileName);
260 ArgumentI databasesOption = new StringParameter(
261 MessageManager.getString(HMMSearch.DATABASE_KEY),
262 MessageManager.getString("label.database_for_hmmsearch"), true,
265 filePaths, fileNames);
266 args.add(databasesOption);
270 * Answers default parameters for hmmalign, taking into account any configured
271 * as user preferences
275 private void getHMMAlignParams(List<ArgumentI> args)
277 addChoiceOfHmm(args);
279 boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
281 args.add(new BooleanOption(
282 MessageManager.getString("label.trim_termini"),
283 MessageManager.getString("label.trim_termini_desc"),
284 false, false, def, null));
288 * Adds an argument representing the choice of HMM sequences (profiles)
289 * against which to perform align or search, provided at least one is found
293 protected void addChoiceOfHmm(List<ArgumentI> args)
295 List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
298 List<String> options = new ArrayList<>();
299 for (SequenceI hmmSeq : hmms)
301 options.add(hmmSeq.getName());
303 String defseq = options.get(0);
304 ArgumentI arg = new StringParameter(
305 MessageManager.getString("label.use_hmm"), null, true, defseq,
306 defseq, options, null);
312 * Adds an argument representing the choice of sequence against which to perform
317 protected void addChoiceOfSequence(List<ArgumentI> args)
319 List<SequenceI> sequences = viewport.getAlignment().getSequences();
321 List<String> options = new ArrayList<>();
323 for (SequenceI seq : sequences)
325 options.add(seq.getName());
328 String defseq = options.get(0);
329 ArgumentI arg = new StringParameter(
330 MessageManager.getString("label.use_sequence"), null, true,
332 defseq, options, null);
337 * Answers default parameters for hmmbuild, taking into account any configured
338 * as user preferences
342 private void getHMMBuildParams(List<ArgumentI> args)
345 * name to give the computed alignment HMM consensus sequence
346 * (Jalview constructs group HMM consensus sequence names)
348 String defValue = "Alignment_HMM";
349 StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
350 MessageManager.getString("label.hmm_name_desc"), true, defValue,
355 * only enable Use Reference Annotation if RF is present
357 if (viewport.hasReferenceAnnotation())
359 args.add(new BooleanOption(
360 MessageManager.getString("label.use_reference"),
361 MessageManager.getString("label.use_reference_desc"), true,
366 * choice of whether to compute HMM for alignment and/or group(s)
367 * - only if there are any groups
369 if (!viewport.getAlignment().getGroups().isEmpty())
371 List<String> options = new ArrayList<>();
372 options.add(MessageManager.getString("label.alignment"));
373 options.add(MessageManager.getString("label.groups_and_alignment"));
374 options.add(MessageManager.getString("label.groups"));
375 options.add(MessageManager.getString("label.selected_group"));
376 args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
377 MessageManager.getString("label.hmmbuild_for_desc"), true,
378 MessageManager.getString("label.alignment"),
379 MessageManager.getString("label.alignment"), options, null));
384 public boolean presetExists(String forName)
390 public void deletePreset(String forName)
395 public void storePreset(String presetName, String text,
396 List<ArgumentI> jobParams)
401 public void updatePreset(String oldName, String presetName, String text,
402 List<ArgumentI> jobParams)
407 public WsParamSetI parseServiceParameterFile(String forName,
408 String description, String[] serviceURL, String parameters)
415 public String generateServiceParameterFile(WsParamSetI pset)