JAL-2714 HMMSearch cutoff by E-Value, Score or None
[jalview.git] / src / jalview / hmmer / HMMERParamStore.java
1 package jalview.hmmer;
2
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;
17
18 import java.io.IOException;
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Collection;
22 import java.util.List;
23 import java.util.Scanner;
24
25 public final class HMMERParamStore implements ParamDatastoreI
26 {
27   private static final String HMMBUILD = "hmmbuild";
28
29   private static final String HMMALIGN = "hmmalign";
30
31   private static final String HMMSEARCH = "hmmsearch";
32
33   private String name;
34
35   private List<WsParamSetI> presets = new ArrayList<>();
36
37   private AlignmentViewport viewport;
38
39   private HMMERParamStore(String nam, AlignmentViewport av)
40   {
41     this.viewport = av;
42     this.name = nam;
43   }
44
45   public static HMMERParamStore forBuild(AlignmentViewport viewport)
46   {
47     return new HMMERParamStore(HMMBUILD, viewport);
48   }
49
50   public static HMMERParamStore forAlign(AlignmentViewport viewport)
51   {
52     return new HMMERParamStore(HMMALIGN, viewport);
53   }
54
55   public static HMMERParamStore forSearch(AlignmentViewport viewport)
56   {
57     return new HMMERParamStore(HMMSEARCH, viewport);
58   }
59
60   @Override
61   public List<WsParamSetI> getPresets()
62   {
63     return presets;
64   }
65
66   @Override
67   public WsParamSetI getPreset(String nam)
68   {
69     return null;
70   }
71
72   @Override
73   public List<ArgumentI> getServiceParameters()
74   {
75     List<ArgumentI> args = new ArrayList<>();
76     switch (name)
77     {
78     case HMMSEARCH:
79       getHMMSearchParams(args);
80       break;
81     case HMMALIGN:
82       getHMMAlignParams(args);
83       break;
84     case HMMBUILD:
85       getHMMBuildParams(args);
86       break;
87     default:
88     }
89
90     return args;
91   }
92
93   /**
94    * Answers default parameters for hmmsearch, taking into account any
95    * configured as user preferences
96    * 
97    * @param args
98    */
99   private void getHMMSearchParams(List<ArgumentI> args)
100   {
101     /*
102      * 'Options'
103      */
104     addChoiceOfHmm(args);
105
106     String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
107     if (names != null && !names.isEmpty())
108     {
109       List<String> databases = new ArrayList<>();
110       databases.add(MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY));
111       Scanner nameScanner = new Scanner(names);
112
113       if (nameScanner.hasNext())
114       {
115         while (nameScanner.hasNext())
116         {
117           String next = nameScanner.next();
118           if ("null".equals(next))
119           {
120             Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
121             Cache.setProperty(Preferences.HMMSEARCH_DB_PATHS, "");
122           }
123           else
124           {
125             databases.add(next);
126           }
127         }
128       }
129       nameScanner.close();
130       args.add(new Option(MessageManager.getString(HMMSearch.DATABASE_KEY),
131               MessageManager.getString("label.database_for_hmmsearch"),
132               true, MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY),
133               MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY),
134               databases, null));
135     }
136     args.add(new BooleanOption(
137             MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY),
138             MessageManager.getString("label.auto_align_seqs_desc"), false,
139             false, true, null));
140     args.add(new BooleanOption(
141             MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY),
142             MessageManager.getString("label.use_accessions_desc"), false,
143             false, true, null));
144     args.add(new BooleanOption(
145             MessageManager.getString(HMMSearch.TRIM_TERMINI_KEY),
146             MessageManager.getString("label.trim_termini_desc"), false,
147             false, true, null));
148
149     /*
150      * 'Parameters'
151      */
152     args.add(new IntegerParameter(
153             MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
154             MessageManager.getString("label.number_of_results_desc"), true,
155             100, 0, 100000));
156     args.add(new StringParameter(
157             MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
158             true, HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_NONE,
159             Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE,
160                     HMMSearch.CUTOFF_SCORE)));
161     args.add(new LogarithmicParameter(
162             MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY),
163             MessageManager.getString("label.seq_e_value_desc"), false, 1D,
164             1E-38, 10D));
165     args.add(new LogarithmicParameter(
166             MessageManager.getString(HMMSearch.DOM_EVALUE_KEY),
167             MessageManager.getString("label.dom_e_value_desc"), false, 1D,
168             1E-38, 10D));
169     args.add(
170             new DoubleParameter(
171                     MessageManager.getString(HMMSearch.SEQ_SCORE_KEY),
172                     MessageManager.getString("label.seq_score_desc"), false,
173                     0d, 0d, 1000d));
174     args.add(
175             new DoubleParameter(
176                     MessageManager.getString(HMMSearch.DOM_SCORE_KEY),
177                     MessageManager.getString("label.dom_score_desc"), false,
178                     0d, 0d, 1000d));
179   }
180
181   /**
182    * Answers default parameters for hmmalign, taking into account any configured
183    * as user preferences
184    * 
185    * @param args
186    */
187   private void getHMMAlignParams(List<ArgumentI> args)
188   {
189     addChoiceOfHmm(args);
190
191     boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
192             false);
193     args.add(new BooleanOption(
194             MessageManager.getString("label.trim_termini"),
195             MessageManager.getString("label.trim_termini_desc"),
196             false, false, def, null));
197   }
198
199   /**
200    * Adds an argument representing the choice of HMM sequences (profiles)
201    * against which to perform align or search, provided more than one is found
202    * 
203    * @param args
204    */
205   protected void addChoiceOfHmm(List<ArgumentI> args)
206   {
207     List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
208     if (!hmms.isEmpty())
209     {
210       List<String> options = new ArrayList<>();
211       for (SequenceI hmmSeq : hmms)
212       {
213         options.add(hmmSeq.getName());
214       }
215       String defseq = options.get(0);
216       Option option = new Option(MessageManager.getString("label.use_hmm"),
217               "", true, defseq, defseq, options, null);
218       args.add(option);
219     }
220   }
221
222   /**
223    * Answers default parameters for hmmbuild, taking into account any configured
224    * as user preferences
225    * 
226    * @param args
227    */
228   private void getHMMBuildParams(List<ArgumentI> args)
229   {
230     /*
231      * name to give the computed alignment HMM consensus sequence
232      * (Jalview constructs group HMM consensus sequence names)
233      */
234     String defValue = "Alignment_HMM";
235     StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
236             MessageManager.getString("label.hmm_name_desc"), true, defValue,
237             defValue);
238     args.add(nameParam);
239
240     /*
241      * only enable Use Reference Annotation if RF is present
242      */
243     if (viewport.hasReferenceAnnotation())
244     {
245       args.add(new BooleanOption(
246               MessageManager.getString("label.use_reference"),
247               MessageManager.getString("label.use_reference_desc"), true,
248               true, true, null));
249     }
250
251     /*
252      * choice of whether to compute HMM for alignment and/or group(s)
253      */
254     Collection<String> options = new ArrayList<>();
255     options.add(MessageManager.getString("label.alignment"));
256     options.add(MessageManager.getString("label.groups_and_alignment"));
257     options.add(MessageManager.getString("label.groups"));
258     options.add(MessageManager.getString("label.selected_group"));
259     args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
260             MessageManager.getString("label.hmmbuild_for_desc"), true,
261             MessageManager.getString("label.alignment"),
262             MessageManager.getString("label.alignment"), options, null));
263   }
264
265   @Override
266   public boolean presetExists(String forName)
267   {
268     return false;
269   }
270
271   @Override
272   public void deletePreset(String forName)
273   {
274   }
275
276   @Override
277   public void storePreset(String presetName, String text,
278           List<ArgumentI> jobParams)
279   {
280   }
281
282   @Override
283   public void updatePreset(String oldName, String presetName, String text,
284           List<ArgumentI> jobParams)
285   {
286   }
287
288   @Override
289   public WsParamSetI parseServiceParameterFile(String forName,
290           String description, String[] serviceURL, String parameters)
291           throws IOException
292   {
293     return null;
294   }
295
296   @Override
297   public String generateServiceParameterFile(WsParamSetI pset)
298           throws IOException
299   {
300     return null;
301   }
302
303 }