package net.sf.cram; import htsjdk.samtools.ValidationStringency; import htsjdk.samtools.cram.build.ContainerParser; import htsjdk.samtools.cram.build.CramIO; import htsjdk.samtools.cram.structure.Container; import htsjdk.samtools.cram.structure.ContainerIO; import htsjdk.samtools.cram.structure.CramCompressionRecord; import htsjdk.samtools.cram.structure.CramHeader; import htsjdk.samtools.util.Log; import htsjdk.samtools.util.RuntimeEOFException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import net.sf.cram.CramTools.LevelConverter; import net.sf.cram.common.Utils; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; public class Refless { private static Log log = Log.getInstance(Refless.class); public static final String COMMAND = "refless"; private static void printUsage(JCommander jc) { StringBuilder sb = new StringBuilder(); sb.append("\n"); jc.usage(sb); System.out.println("Version " + Refless.class.getPackage().getImplementationVersion()); System.out.println(sb.toString()); } public static void main(String[] args) throws IOException { Params params = new Params(); JCommander jc = new JCommander(params); try { jc.parse(args); } catch (Exception e) { System.out.println("Failed to parse parameteres, detailed message below: "); System.out.println(e.getMessage()); System.out.println(); System.out.println("See usage: -h"); System.exit(1); } if (args.length == 0 || params.help) { printUsage(jc); System.exit(1); } Log.setGlobalLogLevel(params.logLevel); InputStream is = null; try { is = Utils.openCramInputStream(params.cramURL, false, null); } catch (Exception e2) { log.error("Failed to open CRAM from: " + params.cramURL, e2); System.exit(1); } CramHeader cramHeader = CramIO.readCramHeader(is); if (params.printSAMHeaderOnly) { System.out.println(cramHeader.getSamFileHeader().getTextHeader()); return; } Log.setGlobalLogLevel(params.logLevel); ContainerParser parser = new ContainerParser(cramHeader.getSamFileHeader()); Container c = null; long recordCount = 0L; long baseCount = 0L; ArrayList<CramCompressionRecord> cramRecords = new ArrayList<CramCompressionRecord>(); while (true) { if (params.maxContainers-- <= 0) break; c = ContainerIO.readContainer(cramHeader.getVersion(), is); if (c.isEOF()) break; if (params.countOnly && params.requiredFlags == 0 && params.filteringFlags == 0) { recordCount += c.nofRecords; baseCount += c.bases; continue; } cramRecords.clear(); try { parser.getRecords(c, cramRecords, ValidationStringency.SILENT); } catch (Exception e) { throw new RuntimeEOFException(e); } for (CramCompressionRecord r : cramRecords) { if (params.requiredFlags != 0 && ((params.requiredFlags & r.flags) == 0)) continue; if (params.filteringFlags != 0 && ((params.filteringFlags & r.flags) != 0)) continue; if (params.countOnly) { recordCount++; baseCount += r.readLength; continue; } } } if (params.countOnly) System.out.printf("READS: %d; BASES: %d\n", recordCount, baseCount); } @Parameters(commandDescription = "CRAM to BAM conversion. ") static class Params { @Parameter(names = { "-l", "--log-level" }, description = "Change log level: DEBUG, INFO, WARNING, ERROR.", converter = LevelConverter.class) Log.LogLevel logLevel = Log.LogLevel.ERROR; @Parameter(names = { "--input-cram-file", "-I" }, description = "The path or FTP URL to the CRAM file to uncompress. Omit if standard input (pipe).") String cramURL; @Parameter(names = { "-H" }, description = "Print SAM header and quit.") boolean printSAMHeaderOnly = false; @Parameter(names = { "-h", "--help" }, description = "Print help and quit") boolean help = false; @Parameter(names = { "--count-only", "-c" }, description = "Count number of records.") boolean countOnly = false; @Parameter(names = { "--required-flags", "-f" }, description = "Required flags. ") int requiredFlags = 0; @Parameter(names = { "--filter-flags", "-F" }, description = "Filtering flags. ") int filteringFlags = 0; @Parameter(names = { "--max-containers" }, description = "Read only specified number of containers.", hidden = true) long maxContainers = Long.MAX_VALUE; } }