X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fhmmer%2FHMMERParamStore.java;fp=src%2Fjalview%2Fhmmer%2FHMMERParamStore.java;h=452097b8b149e6649a3b8f4df26fcb844f8f1fb4;hb=7692386ccfe778075dd83a753d30a7a27fe507be;hp=0000000000000000000000000000000000000000;hpb=97264690f394f98cf13cd1d834a53e8956fb1b0e;p=jalview.git diff --git a/src/jalview/hmmer/HMMERParamStore.java b/src/jalview/hmmer/HMMERParamStore.java new file mode 100644 index 0000000..452097b --- /dev/null +++ b/src/jalview/hmmer/HMMERParamStore.java @@ -0,0 +1,341 @@ +package jalview.hmmer; + +import jalview.bin.Cache; +import jalview.datamodel.SequenceI; +import jalview.gui.Preferences; +import jalview.util.MessageManager; +import jalview.viewmodel.AlignmentViewport; +import jalview.ws.params.ArgumentI; +import jalview.ws.params.ParamDatastoreI; +import jalview.ws.params.WsParamSetI; +import jalview.ws.params.simple.BooleanOption; +import jalview.ws.params.simple.DoubleParameter; +import jalview.ws.params.simple.FileParameter; +import jalview.ws.params.simple.IntegerParameter; +import jalview.ws.params.simple.LogarithmicParameter; +import jalview.ws.params.simple.Option; +import jalview.ws.params.simple.RadioChoiceParameter; +import jalview.ws.params.simple.StringParameter; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public final class HMMERParamStore implements ParamDatastoreI +{ + private static final String HMMBUILD = "hmmbuild"; + + private static final String HMMALIGN = "hmmalign"; + + private static final String HMMSEARCH = "hmmsearch"; + + private String name; + + private List presets = new ArrayList<>(); + + private AlignmentViewport viewport; + + private HMMERParamStore(String nam, AlignmentViewport av) + { + this.viewport = av; + this.name = nam; + } + + public static HMMERParamStore forBuild(AlignmentViewport viewport) + { + return new HMMERParamStore(HMMBUILD, viewport); + } + + public static HMMERParamStore forAlign(AlignmentViewport viewport) + { + return new HMMERParamStore(HMMALIGN, viewport); + } + + public static HMMERParamStore forSearch(AlignmentViewport viewport) + { + return new HMMERParamStore(HMMSEARCH, viewport); + } + + @Override + public List getPresets() + { + return presets; + } + + @Override + public WsParamSetI getPreset(String nam) + { + return null; + } + + @Override + public List getServiceParameters() + { + List args = new ArrayList<>(); + switch (name) + { + case HMMSEARCH: + getHMMSearchParams(args); + break; + case HMMALIGN: + getHMMAlignParams(args); + break; + case HMMBUILD: + getHMMBuildParams(args); + break; + default: + } + + return args; + } + + /** + * Answers default parameters for hmmsearch, taking into account any + * configured as user preferences + * + * @param args + */ + private void getHMMSearchParams(List args) + { + /* + * 'Options' + */ + args.add(new BooleanOption( + MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY), + MessageManager.getString("label.auto_align_seqs_desc"), false, + false, false, null)); + args.add(new BooleanOption( + MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY), + MessageManager.getString("label.use_accessions_desc"), false, + false, true, null)); + args.add(new BooleanOption( + MessageManager.getString(HMMSearch.TRIM_TERMINI_KEY), + MessageManager.getString("label.trim_termini_desc"), false, + false, true, null)); + + /* + * 'Parameters' + */ + addChoiceOfHmm(args); + + // addChoiceOfDatabase(args); + + String thisAlignment = MessageManager + .getString(HMMSearch.THIS_ALIGNMENT_KEY); + String database = MessageManager.getString("label.database"); + args.add(new RadioChoiceParameter( + MessageManager.getString("action.search"), null, + Arrays.asList(thisAlignment, + database), + thisAlignment)); + args.add(new FileParameter(database, "", false, "", "")); + args.add(new IntegerParameter( + MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY), + MessageManager.getString("label.number_of_results_desc"), true, + 100, 0, 100000)); + args.add(new RadioChoiceParameter( + MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null, + Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE, + HMMSearch.CUTOFF_SCORE), + HMMSearch.CUTOFF_EVALUE)); + args.add(new LogarithmicParameter( + MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY), + MessageManager.getString("label.seq_e_value_desc"), false, 1D, + 1E-38, 10D)); + args.add(new LogarithmicParameter( + MessageManager.getString(HMMSearch.DOM_EVALUE_KEY), + MessageManager.getString("label.dom_e_value_desc"), false, 1D, + 1E-38, 10D)); + args.add( + new DoubleParameter( + MessageManager.getString(HMMSearch.SEQ_SCORE_KEY), + MessageManager.getString("label.seq_score_desc"), false, + 0d, 0d, 1000d)); + args.add( + new DoubleParameter( + MessageManager.getString(HMMSearch.DOM_SCORE_KEY), + MessageManager.getString("label.dom_score_desc"), false, + 0d, 0d, 1000d)); + } + + /** + * Constructs a choice parameter for database to search; always includes 'this + * alignment', and also includes any databases held under user preferences key + * "HMMSEARCH_DBS" as a comma-delimited list + * + * @param args + */ + protected void addChoiceOfDatabase(List args) + { + String names = Cache.getProperty(Preferences.HMMSEARCH_DBS); + if (names == null || names.isEmpty()) + { + return; + } + + List filePaths = new ArrayList<>(); + List fileNames = new ArrayList<>(); + + String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY); + filePaths.add(thisAlignment); + fileNames.add(thisAlignment); + + Scanner nameScanner = new Scanner(names); + nameScanner.useDelimiter(Preferences.COMMA); + + while (nameScanner.hasNext()) + { + String next = nameScanner.next(); + if ("null".equals(next)) + { + Cache.setProperty(Preferences.HMMSEARCH_DBS, ""); + } + else + { + filePaths.add(next); + int pos = next.lastIndexOf(File.separator); + String fileName = next.substring(pos + 1); + fileNames.add(fileName); + } + } + nameScanner.close(); + ArgumentI databasesOption = new StringParameter( + MessageManager.getString(HMMSearch.DATABASE_KEY), + MessageManager.getString("label.database_for_hmmsearch"), true, + thisAlignment, + thisAlignment, + filePaths, fileNames); + args.add(databasesOption); + } + + /** + * Answers default parameters for hmmalign, taking into account any configured + * as user preferences + * + * @param args + */ + private void getHMMAlignParams(List args) + { + addChoiceOfHmm(args); + + boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI, + false); + args.add(new BooleanOption( + MessageManager.getString("label.trim_termini"), + MessageManager.getString("label.trim_termini_desc"), + false, false, def, null)); + } + + /** + * Adds an argument representing the choice of HMM sequences (profiles) + * against which to perform align or search, provided at least one is found + * + * @param args + */ + protected void addChoiceOfHmm(List args) + { + List hmms = viewport.getAlignment().getHmmSequences(); + if (!hmms.isEmpty()) + { + List options = new ArrayList<>(); + for (SequenceI hmmSeq : hmms) + { + options.add(hmmSeq.getName()); + } + String defseq = options.get(0); + ArgumentI arg = new StringParameter( + MessageManager.getString("label.use_hmm"), null, true, defseq, + defseq, options, null); + args.add(arg); + } + } + + /** + * Answers default parameters for hmmbuild, taking into account any configured + * as user preferences + * + * @param args + */ + private void getHMMBuildParams(List args) + { + /* + * name to give the computed alignment HMM consensus sequence + * (Jalview constructs group HMM consensus sequence names) + */ + String defValue = "Alignment_HMM"; + StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"), + MessageManager.getString("label.hmm_name_desc"), true, defValue, + defValue); + args.add(nameParam); + + /* + * only enable Use Reference Annotation if RF is present + */ + if (viewport.hasReferenceAnnotation()) + { + args.add(new BooleanOption( + MessageManager.getString("label.use_reference"), + MessageManager.getString("label.use_reference_desc"), true, + true, true, null)); + } + + /* + * choice of whether to compute HMM for alignment and/or group(s) + * - only if there are any groups + */ + if (!viewport.getAlignment().getGroups().isEmpty()) + { + List options = new ArrayList<>(); + options.add(MessageManager.getString("label.alignment")); + options.add(MessageManager.getString("label.groups_and_alignment")); + options.add(MessageManager.getString("label.groups")); + options.add(MessageManager.getString("label.selected_group")); + args.add(new Option(MessageManager.getString("label.hmmbuild_for"), + MessageManager.getString("label.hmmbuild_for_desc"), true, + MessageManager.getString("label.alignment"), + MessageManager.getString("label.alignment"), options, null)); + } + } + + @Override + public boolean presetExists(String forName) + { + return false; + } + + @Override + public void deletePreset(String forName) + { + } + + @Override + public void storePreset(String presetName, String text, + List jobParams) + { + } + + @Override + public void updatePreset(String oldName, String presetName, String text, + List jobParams) + { + } + + @Override + public WsParamSetI parseServiceParameterFile(String forName, + String description, String[] serviceURL, String parameters) + throws IOException + { + return null; + } + + @Override + public String generateServiceParameterFile(WsParamSetI pset) + throws IOException + { + return null; + } + +}