/** * Calculate snp effect for a list of snps * * @param snpEffFile */ public void snpEffect(String vcfFile, String txtFile, String aaHgsv, String genotype) { // Create command String argsVcf[] = {"-classic", "-cancer", "-hgvs", "testHg3766Chr1", vcfFile}; String argsTxt[] = { "-classic", "-cancer", "-cancerSamples", txtFile, "-hgvs", "testHg3766Chr1", vcfFile }; String args[] = (txtFile == null ? argsVcf : argsTxt); SnpEff cmd = new SnpEff(args); SnpEffCmdEff cmdEff = (SnpEffCmdEff) cmd.snpEffCmd(); // Run command List<VcfEntry> list = cmdEff.run(true); // Find AA change for a genotype boolean found = false; for (VcfEntry vcfEntry : list) { for (VcfEffect eff : vcfEntry.parseEffects()) { if (genotype.equals(eff.getGenotype())) { if (debug) Gpr.debug("AA: " + eff.getAa() + "\t" + eff.getGenotype() + "\t" + eff); Assert.assertEquals(aaHgsv, eff.getAa()); found = true; } } } // Not found? Error if (!found) throw new RuntimeException("Genotype '" + genotype + "' not found."); }
/** Add some lines to header before showing it */ @Override public boolean addHeaders(VcfFileIterator vcfFile) { super.addHeaders(vcfFile); for (String key : fieldsToAdd.keySet()) { // Get type String type = fieldsType.get(key); if (type == null) { System.err.println("WARNING: Cannot find type for field '" + key + "', using 'String'."); type = VcfInfoType.String.toString(); } String infoKey = VcfEntry.vcfInfoKeySafe(DBNSFP_VCF_INFO_PREFIX + key); vcfFile .getVcfHeader() .addLine( "##INFO=<ID=" + infoKey + ",Number=A,Type=" + type + ",Description=\"" + fieldsToAdd.get(key) + "\">"); } return false; }
@Override public boolean annotate(VcfEntry vcfEntry) { boolean annotated = false; Map<String, String> info = new HashMap<>(); // Find annotations for each variant in this VcfEntry for (Variant var : vcfEntry.variants()) annotated |= annotate(var, info); // Add annotations to VcfEntry if (annotated) { // Sort keys and add them to VcfEntry ArrayList<String> keys = new ArrayList<>(); keys.addAll(info.keySet()); Collections.sort(keys); // Add INFO fields for (String key : keys) { String infoKey = VcfEntry.vcfInfoKeySafe(DBNSFP_VCF_INFO_PREFIX + key); vcfEntry.addInfo(infoKey, info.get(key)); } } return annotated; }
/** Annotate a VCF file using dbNSFP */ ArrayList<VcfEntry> annotate(boolean createList) { ArrayList<VcfEntry> list = (createList ? new ArrayList<VcfEntry>() : null); // Open VCF file vcfFile = new VcfFileIterator(vcfFileName); vcfFile.setDebug(debug); // Initialize annotations try { annotateInit(vcfFile); } catch (Exception e) { throw new RuntimeException(e); } // Annotate VCF file if (verbose) Timer.showStdErr("Annotating file '" + vcfFileName + "'"); boolean showHeader = true; int pos = -1; String chr = ""; for (VcfEntry vcfEntry : vcfFile) { try { // Show header? if (showHeader) { // Add VCF header addHeaders(vcfFile); String headerStr = vcfFile.getVcfHeader().toString(); if (!headerStr.isEmpty()) print(headerStr); showHeader = false; // Check that the fields we want to add are actually in the database checkFieldsToAdd(); } // Check if file is sorted if (vcfEntry.getChromosomeName().equals(chr) && vcfEntry.getStart() < pos) { fatalError( "Your VCF file should be sorted!" // + "\n\tPrevious entry " + chr + ":" + pos // + "\n\tCurrent entry " + vcfEntry.getChromosomeName() + ":" + (vcfEntry.getStart() + 1) // ); } // Annotate annotate(vcfEntry); // Show print(vcfEntry); if (list != null) list.add(vcfEntry); count++; // Update chr:pos chr = vcfEntry.getChromosomeName(); pos = vcfEntry.getStart(); } catch (IOException e) { throw new RuntimeException(e); } } annotateFinish(); vcfFile.close(); // Show some stats if (verbose) { double perc = (100.0 * countAnnotated) / count; Timer.showStdErr( "Done." // + "\n\tTotal annotated entries : " + countAnnotated // + "\n\tTotal entries : " + count // + "\n\tPercent : " + String.format("%.2f%%", perc) // ); } return list; }