package jalview.hmmer; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.util.FileUtils; import jalview.util.MessageManager; import jalview.ws.params.ArgumentI; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Hashtable; import java.util.List; import java.util.Scanner; public abstract class Search extends HmmerCommand { static final String JACKHMMER = "jackhmmer"; static final String HMMSEARCH = "hmmsearch"; boolean realign = false; boolean trim = false; SequenceI[] seqs; String databaseName; boolean searchAlignment = true; Hashtable sequencesHash; public Search(AlignFrame alignFrame, List args) { super(alignFrame, args); } @Override public void run() { } /* void readOutputFile(File inputTableTemp) throws IOException { BufferedReader br = new BufferedReader(new FileReader(inputTableTemp)); String line = ""; while (!line.startsWith("//")) { while (!line.startsWith(">> ") && !line.startsWith("//")) { line = br.readLine(); } if (line.startsWith("//")) { break; } Scanner scanner = new Scanner(line); String name = scanner.next(); name = scanner.next(); br.readLine(); br.readLine(); List domains = new ArrayList<>(); for (SequenceI seq : seqs) { if (seq.getName().contains(name)) { domains.add(seq); } } if (domains.contains(getSequence())) { domains.remove(getSequence()); } if (domains.size() > 0) { readOutputTable(br, domains); } line = br.readLine(); } } /** * Reads in the scores table output by jackhmmer and adds annotation to * sequences for E-value and bit score * * @param inputTableTemp * @throws IOException */ /* void readOutputTable(BufferedReader br, List seqs) throws IOException { String line = br.readLine(); while (!"".equals(line) && line != null) { if (" ------ inclusion threshold ------".equals(line)) { line = br.readLine(); continue; } Scanner scanner = new Scanner(line); scanner.next(); scanner.next(); String score = scanner.next(); scanner.next(); String evalue = scanner.next(); scanner.next(); scanner.next(); scanner.next(); scanner.next(); int start = scanner.nextInt(); int end = scanner.nextInt(); SequenceI seq = null; for (SequenceI sequence : seqs) { if (sequence.getStart() >= start && sequence.getEnd() <= end) { seq = sequence; break; } } if (seq != null) { addScoreAnnotations(evalue, score, seq); } scanner.close(); line = br.readLine(); } } */ void readDomainTable(File inputTableTemp, boolean includesQuery) throws IOException { BufferedReader br = new BufferedReader(new FileReader(inputTableTemp)); String line = br.readLine(); br.readLine(); br.readLine(); line = br.readLine(); int index; if (includesQuery) { index = 1; } else { index = 0; } while (!line.startsWith("#")) { if (line.contains("inclusion threshold")) { line = br.readLine(); continue; } Scanner scanner = new Scanner(line); String name = scanner.next(); for (int i = 0; i < 10; i++) { scanner.next(); } String evalue = scanner.next(); scanner.next(); String score = scanner.next(); addScoreAnnotations(evalue, score, seqs[index]); index++; scanner.close(); line = br.readLine(); } br.close(); } void addScoreAnnotations(String eValue, String bitScore, SequenceI seq) { String label = "Search Scores"; String description = "Full sequence bit score and E-Value"; try { AlignmentAnnotation annot = new AlignmentAnnotation(label, description, null); annot.label = label; annot.description = description; annot.setCalcId(JACKHMMER); double dEValue = Double.parseDouble(eValue); annot.setEValue(dEValue); double dBitScore = Double.parseDouble(bitScore); annot.setBitScore(dBitScore); annot.setSequenceRef(seq); seq.addAlignmentAnnotation(annot); } catch (NumberFormatException e) { System.err.println("Error parsing " + label + " from " + eValue + " & " + bitScore); } } void buildArguments(List args, File searchOutputFile, File hitsAlignmentFile, File queryFile) throws IOException { args.add("--domtblout"); args.add(getFilePath(searchOutputFile, true)); args.add("-A"); args.add(getFilePath(hitsAlignmentFile, true)); File databaseFile = null; boolean useEvalueCutoff = false; boolean useScoreCutoff = false; String seqReportingEvalueCutoff = null; String domReportingEvalueCutoff = null; String seqReportingScoreCutoff = null; String domReportingScoreCutoff = null; String seqInclusionEvalueCutoff = null; String domInclusionEvalueCutoff = null; String seqInclusionScoreCutoff = null; String domInclusionScoreCutoff = null; databaseName = "Alignment"; if (params != null) { for (ArgumentI arg : params) { String name = arg.getName(); if (MessageManager.getString(REPORTING_CUTOFF_KEY).equals(name)) { if (MessageManager.getString(CUTOFF_EVALUE) .equals(arg.getValue())) { useEvalueCutoff = true; } else if (MessageManager.getString(CUTOFF_SCORE) .equals(arg.getValue())) { useScoreCutoff = true; } } else if (MessageManager.getString(REPORTING_SEQ_EVALUE_KEY) .equals(name)) { seqReportingEvalueCutoff = arg.getValue(); } else if (MessageManager.getString(REPORTING_SEQ_SCORE_KEY) .equals(name)) { seqReportingScoreCutoff = arg.getValue(); } else if (MessageManager.getString(REPORTING_DOM_EVALUE_KEY) .equals(name)) { domReportingEvalueCutoff = arg.getValue(); } else if (MessageManager.getString(REPORTING_DOM_SCORE_KEY) .equals(name)) { domReportingScoreCutoff = arg.getValue(); } else if (MessageManager.getString(INCLUSION_SEQ_EVALUE_KEY) .equals(name)) { seqInclusionEvalueCutoff = arg.getValue(); } else if (MessageManager.getString(INCLUSION_SEQ_SCORE_KEY) .equals(name)) { seqInclusionScoreCutoff = arg.getValue(); } else if (MessageManager.getString(INCLUSION_DOM_EVALUE_KEY) .equals(name)) { domInclusionEvalueCutoff = arg.getValue(); } else if (MessageManager.getString(INCLUSION_DOM_SCORE_KEY) .equals(name)) { domInclusionScoreCutoff = arg.getValue(); } else if (MessageManager.getString(DATABASE_KEY).equals(name)) { databaseFile = new File(arg.getValue()); if (!arg.getValue().isEmpty()) { searchAlignment = false; } } else if (MessageManager.getString(NUMBER_OF_ITERATIONS) .equals(name)) { if (!arg.getValue().isEmpty()) { args.add("-N"); args.add(arg.getValue()); } } } } if (useEvalueCutoff) { args.add("-E"); args.add(seqReportingEvalueCutoff); args.add("--domE"); args.add(domReportingEvalueCutoff); args.add("--incE"); args.add(seqInclusionEvalueCutoff); args.add("--incdomE"); args.add(domInclusionEvalueCutoff); } else if (useScoreCutoff) { args.add("-T"); args.add(seqReportingScoreCutoff); args.add("--domT"); args.add(domReportingScoreCutoff); args.add("--incT"); args.add(seqInclusionEvalueCutoff); args.add("--incdomT"); args.add(domInclusionEvalueCutoff); } // if (!dbFound || MessageManager.getString(THIS_ALIGNMENT_KEY) // .equals(dbPath)) if (searchAlignment) { /* * no external database specified for search, so * export current alignment as 'database' to search */ databaseFile = FileUtils.createTempFile("database", ".sto"); AlignmentI al = af.getViewport().getAlignment(); AlignmentI copy = new Alignment(al); deleteHmmSequences(copy); if (searchAlignment) { sequencesHash = stashSequences(copy.getSequencesArray()); } exportStockholm(copy.getSequencesArray(), databaseFile, null); } args.add(getFilePath(queryFile, true)); args.add(getFilePath(databaseFile, true)); } }