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";
37 private List<WsParamSetI> presets = new ArrayList<>();
39 private AlignmentViewport viewport;
41 private HMMERParamStore(String nam, AlignmentViewport av)
47 public static HMMERParamStore forBuild(AlignmentViewport viewport)
49 return new HMMERParamStore(HMMBUILD, viewport);
52 public static HMMERParamStore forAlign(AlignmentViewport viewport)
54 return new HMMERParamStore(HMMALIGN, viewport);
57 public static HMMERParamStore forSearch(AlignmentViewport viewport)
59 return new HMMERParamStore(HMMSEARCH, viewport);
63 public List<WsParamSetI> getPresets()
69 public WsParamSetI getPreset(String nam)
75 public List<ArgumentI> getServiceParameters()
77 List<ArgumentI> args = new ArrayList<>();
81 getHMMSearchParams(args);
84 getHMMAlignParams(args);
87 getHMMBuildParams(args);
96 * Answers default parameters for hmmsearch, taking into account any
97 * configured as user preferences
101 private void getHMMSearchParams(List<ArgumentI> args)
106 args.add(new BooleanOption(
107 MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY),
108 MessageManager.getString("label.auto_align_seqs_desc"), false,
109 false, false, null));
110 args.add(new BooleanOption(
111 MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY),
112 MessageManager.getString("label.use_accessions_desc"), false,
114 args.add(new BooleanOption(
115 MessageManager.getString(HMMSearch.TRIM_TERMINI_KEY),
116 MessageManager.getString("label.trim_termini_desc"), false,
122 addChoiceOfHmm(args);
124 // addChoiceOfDatabase(args);
126 String thisAlignment = MessageManager
127 .getString(HMMSearch.THIS_ALIGNMENT_KEY);
128 String database = MessageManager.getString("label.database");
129 args.add(new RadioChoiceParameter(
130 MessageManager.getString("action.search"), null,
131 Arrays.asList(thisAlignment,
134 args.add(new FileParameter(database, "", false, "", ""));
135 args.add(new IntegerParameter(
136 MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
137 MessageManager.getString("label.number_of_results_desc"), true,
139 args.add(new RadioChoiceParameter(
140 MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
141 Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE,
142 HMMSearch.CUTOFF_SCORE),
143 HMMSearch.CUTOFF_EVALUE));
144 args.add(new LogarithmicParameter(
145 MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY),
146 MessageManager.getString("label.seq_e_value_desc"), false, 1D,
148 args.add(new LogarithmicParameter(
149 MessageManager.getString(HMMSearch.DOM_EVALUE_KEY),
150 MessageManager.getString("label.dom_e_value_desc"), false, 1D,
154 MessageManager.getString(HMMSearch.SEQ_SCORE_KEY),
155 MessageManager.getString("label.seq_score_desc"), false,
159 MessageManager.getString(HMMSearch.DOM_SCORE_KEY),
160 MessageManager.getString("label.dom_score_desc"), false,
165 * Constructs a choice parameter for database to search; always includes 'this
166 * alignment', and also includes any databases held under user preferences key
167 * "HMMSEARCH_DBS" as a comma-delimited list
171 protected void addChoiceOfDatabase(List<ArgumentI> args)
173 String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
174 if (names == null || names.isEmpty())
179 List<String> filePaths = new ArrayList<>();
180 List<String> fileNames = new ArrayList<>();
182 String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
183 filePaths.add(thisAlignment);
184 fileNames.add(thisAlignment);
186 Scanner nameScanner = new Scanner(names);
187 nameScanner.useDelimiter(Preferences.COMMA);
189 while (nameScanner.hasNext())
191 String next = nameScanner.next();
192 if ("null".equals(next))
194 Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
199 int pos = next.lastIndexOf(File.separator);
200 String fileName = next.substring(pos + 1);
201 fileNames.add(fileName);
205 ArgumentI databasesOption = new StringParameter(
206 MessageManager.getString(HMMSearch.DATABASE_KEY),
207 MessageManager.getString("label.database_for_hmmsearch"), true,
210 filePaths, fileNames);
211 args.add(databasesOption);
215 * Answers default parameters for hmmalign, taking into account any configured
216 * as user preferences
220 private void getHMMAlignParams(List<ArgumentI> args)
222 addChoiceOfHmm(args);
224 boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
226 args.add(new BooleanOption(
227 MessageManager.getString("label.trim_termini"),
228 MessageManager.getString("label.trim_termini_desc"),
229 false, false, def, null));
233 * Adds an argument representing the choice of HMM sequences (profiles)
234 * against which to perform align or search, provided at least one is found
238 protected void addChoiceOfHmm(List<ArgumentI> args)
240 List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
243 List<String> options = new ArrayList<>();
244 for (SequenceI hmmSeq : hmms)
246 options.add(hmmSeq.getName());
248 String defseq = options.get(0);
249 ArgumentI arg = new StringParameter(
250 MessageManager.getString("label.use_hmm"), null, true, defseq,
251 defseq, options, null);
257 * Answers default parameters for hmmbuild, taking into account any configured
258 * as user preferences
262 private void getHMMBuildParams(List<ArgumentI> args)
265 * name to give the computed alignment HMM consensus sequence
266 * (Jalview constructs group HMM consensus sequence names)
268 String defValue = "Alignment_HMM";
269 StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
270 MessageManager.getString("label.hmm_name_desc"), true, defValue,
275 * only enable Use Reference Annotation if RF is present
277 if (viewport.hasReferenceAnnotation())
279 args.add(new BooleanOption(
280 MessageManager.getString("label.use_reference"),
281 MessageManager.getString("label.use_reference_desc"), true,
286 * choice of whether to compute HMM for alignment and/or group(s)
287 * - only if there are any groups
289 if (!viewport.getAlignment().getGroups().isEmpty())
291 List<String> options = new ArrayList<>();
292 options.add(MessageManager.getString("label.alignment"));
293 options.add(MessageManager.getString("label.groups_and_alignment"));
294 options.add(MessageManager.getString("label.groups"));
295 options.add(MessageManager.getString("label.selected_group"));
296 args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
297 MessageManager.getString("label.hmmbuild_for_desc"), true,
298 MessageManager.getString("label.alignment"),
299 MessageManager.getString("label.alignment"), options, null));
304 public boolean presetExists(String forName)
310 public void deletePreset(String forName)
315 public void storePreset(String presetName, String text,
316 List<ArgumentI> jobParams)
321 public void updatePreset(String oldName, String presetName, String text,
322 List<ArgumentI> jobParams)
327 public WsParamSetI parseServiceParameterFile(String forName,
328 String description, String[] serviceURL, String parameters)
335 public String generateServiceParameterFile(WsParamSetI pset)