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.IntegerParameter;
14 import jalview.ws.params.simple.LogarithmicParameter;
15 import jalview.ws.params.simple.Option;
16 import jalview.ws.params.simple.StringParameter;
19 import java.io.IOException;
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.List;
23 import java.util.Scanner;
25 public final class HMMERParamStore implements ParamDatastoreI
27 private static final String HMMBUILD = "hmmbuild";
29 private static final String HMMALIGN = "hmmalign";
31 private static final String HMMSEARCH = "hmmsearch";
35 private List<WsParamSetI> presets = new ArrayList<>();
37 private AlignmentViewport viewport;
39 private HMMERParamStore(String nam, AlignmentViewport av)
45 public static HMMERParamStore forBuild(AlignmentViewport viewport)
47 return new HMMERParamStore(HMMBUILD, viewport);
50 public static HMMERParamStore forAlign(AlignmentViewport viewport)
52 return new HMMERParamStore(HMMALIGN, viewport);
55 public static HMMERParamStore forSearch(AlignmentViewport viewport)
57 return new HMMERParamStore(HMMSEARCH, viewport);
61 public List<WsParamSetI> getPresets()
67 public WsParamSetI getPreset(String nam)
73 public List<ArgumentI> getServiceParameters()
75 List<ArgumentI> args = new ArrayList<>();
79 getHMMSearchParams(args);
82 getHMMAlignParams(args);
85 getHMMBuildParams(args);
94 * Answers default parameters for hmmsearch, taking into account any
95 * configured as user preferences
99 private void getHMMSearchParams(List<ArgumentI> args)
104 args.add(new BooleanOption(
105 MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY),
106 MessageManager.getString("label.auto_align_seqs_desc"), false,
108 args.add(new BooleanOption(
109 MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY),
110 MessageManager.getString("label.use_accessions_desc"), false,
112 args.add(new BooleanOption(
113 MessageManager.getString(HMMSearch.TRIM_TERMINI_KEY),
114 MessageManager.getString("label.trim_termini_desc"), false,
120 addChoiceOfHmm(args);
122 addChoiceOfDatabase(args);
124 args.add(new IntegerParameter(
125 MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
126 MessageManager.getString("label.number_of_results_desc"), true,
128 args.add(new StringParameter(
129 MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
130 true, HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_NONE,
131 Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE,
132 HMMSearch.CUTOFF_SCORE),
134 args.add(new LogarithmicParameter(
135 MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY),
136 MessageManager.getString("label.seq_e_value_desc"), false, 1D,
138 args.add(new LogarithmicParameter(
139 MessageManager.getString(HMMSearch.DOM_EVALUE_KEY),
140 MessageManager.getString("label.dom_e_value_desc"), false, 1D,
144 MessageManager.getString(HMMSearch.SEQ_SCORE_KEY),
145 MessageManager.getString("label.seq_score_desc"), false,
149 MessageManager.getString(HMMSearch.DOM_SCORE_KEY),
150 MessageManager.getString("label.dom_score_desc"), false,
155 * Constructs a choice parameter for database to search; always includes 'this
156 * alignment', and also includes any databases held under user preferences key
157 * "HMMSEARCH_DBS" as a comma-delimited list
161 protected void addChoiceOfDatabase(List<ArgumentI> args)
163 String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
164 if (names == null || names.isEmpty())
169 List<String> filePaths = new ArrayList<>();
170 List<String> fileNames = new ArrayList<>();
172 String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
173 filePaths.add(thisAlignment);
174 fileNames.add(thisAlignment);
176 Scanner nameScanner = new Scanner(names);
177 nameScanner.useDelimiter(Preferences.COMMA);
179 while (nameScanner.hasNext())
181 String next = nameScanner.next();
182 if ("null".equals(next))
184 Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
189 int pos = next.lastIndexOf(File.separator);
190 String fileName = next.substring(pos + 1);
191 fileNames.add(fileName);
195 ArgumentI databasesOption = new StringParameter(
196 MessageManager.getString(HMMSearch.DATABASE_KEY),
197 MessageManager.getString("label.database_for_hmmsearch"), true,
200 filePaths, fileNames);
201 args.add(databasesOption);
205 * Answers default parameters for hmmalign, taking into account any configured
206 * as user preferences
210 private void getHMMAlignParams(List<ArgumentI> args)
212 addChoiceOfHmm(args);
214 boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
216 args.add(new BooleanOption(
217 MessageManager.getString("label.trim_termini"),
218 MessageManager.getString("label.trim_termini_desc"),
219 false, false, def, null));
223 * Adds an argument representing the choice of HMM sequences (profiles)
224 * against which to perform align or search, provided at least one is found
228 protected void addChoiceOfHmm(List<ArgumentI> args)
230 List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
233 List<String> options = new ArrayList<>();
234 for (SequenceI hmmSeq : hmms)
236 options.add(hmmSeq.getName());
238 String defseq = options.get(0);
239 ArgumentI arg = new StringParameter(
240 MessageManager.getString("label.use_hmm"), null, true, defseq,
241 defseq, options, null);
247 * Answers default parameters for hmmbuild, taking into account any configured
248 * as user preferences
252 private void getHMMBuildParams(List<ArgumentI> args)
255 * name to give the computed alignment HMM consensus sequence
256 * (Jalview constructs group HMM consensus sequence names)
258 String defValue = "Alignment_HMM";
259 StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
260 MessageManager.getString("label.hmm_name_desc"), true, defValue,
265 * only enable Use Reference Annotation if RF is present
267 if (viewport.hasReferenceAnnotation())
269 args.add(new BooleanOption(
270 MessageManager.getString("label.use_reference"),
271 MessageManager.getString("label.use_reference_desc"), true,
276 * choice of whether to compute HMM for alignment and/or group(s)
277 * - only if there are any groups
279 if (!viewport.getAlignment().getGroups().isEmpty())
281 List<String> options = new ArrayList<>();
282 options.add(MessageManager.getString("label.alignment"));
283 options.add(MessageManager.getString("label.groups_and_alignment"));
284 options.add(MessageManager.getString("label.groups"));
285 options.add(MessageManager.getString("label.selected_group"));
286 args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
287 MessageManager.getString("label.hmmbuild_for_desc"), true,
288 MessageManager.getString("label.alignment"),
289 MessageManager.getString("label.alignment"), options, null));
294 public boolean presetExists(String forName)
300 public void deletePreset(String forName)
305 public void storePreset(String presetName, String text,
306 List<ArgumentI> jobParams)
311 public void updatePreset(String oldName, String presetName, String text,
312 List<ArgumentI> jobParams)
317 public WsParamSetI parseServiceParameterFile(String forName,
318 String description, String[] serviceURL, String parameters)
325 public String generateServiceParameterFile(WsParamSetI pset)