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.IntegerParameter; import jalview.ws.params.simple.LogarithmicParameter; import jalview.ws.params.simple.Option; import jalview.ws.params.simple.StringParameter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; 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' */ addChoiceOfHmm(args); String names = Cache.getProperty(Preferences.HMMSEARCH_DBS); if (names != null && !names.isEmpty()) { List databases = new ArrayList<>(); databases.add(MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY)); Scanner nameScanner = new Scanner(names); if (nameScanner.hasNext()) { while (nameScanner.hasNext()) { String next = nameScanner.next(); if ("null".equals(next)) { Cache.setProperty(Preferences.HMMSEARCH_DBS, ""); Cache.setProperty(Preferences.HMMSEARCH_DB_PATHS, ""); } else { databases.add(next); } } } nameScanner.close(); args.add(new Option(MessageManager.getString(HMMSearch.DATABASE_KEY), MessageManager.getString("label.database_for_hmmsearch"), true, MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY), MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY), databases, null)); } args.add(new BooleanOption( MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY), MessageManager.getString("label.auto_align_seqs_desc"), false, false, true, 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' */ 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 StringParameter( MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null, true, HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_NONE, Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE, HMMSearch.CUTOFF_SCORE))); 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)); } /** * 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 more than 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); Option option = new Option(MessageManager.getString("label.use_hmm"), "", true, defseq, defseq, options, null); args.add(option); } } /** * 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) */ Collection 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; } }