package htsjdk.samtools.cram.paralell; import htsjdk.samtools.BAMRecordCodec; import htsjdk.samtools.SAMRecord; import htsjdk.samtools.ValidationStringency; import htsjdk.samtools.cram.build.ContainerParser; import htsjdk.samtools.cram.build.Cram2SamRecordFactory; import htsjdk.samtools.cram.build.CramNormalizer; 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.BlockCompressedOutputStream; import htsjdk.samtools.util.Log; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.function.Function; import net.sf.cram.ref.ReferenceSource; class CramToBam_OBA_Function implements Function<OrderedByteArray, OrderedByteArray> { private static Log log = Log.getInstance(CramToBam_OBA_Function.class); private CramHeader header; private ContainerParser parser; private Cram2SamRecordFactory f; private BAMRecordCodec codec; private CramNormalizer n; CramToBam_OBA_Function(CramHeader header, ReferenceSource referenceSource) { this.header = header; parser = new ContainerParser(header.getSamFileHeader()); f = new Cram2SamRecordFactory(header.getSamFileHeader()); codec = new BAMRecordCodec(header.getSamFileHeader()); n = new CramNormalizer(header.getSamFileHeader(), referenceSource); log.info("converter created"); } @Override public OrderedByteArray apply(OrderedByteArray object) { if (object == null) throw new NullPointerException(); log.debug("processing container " + object.order); Container container; try { container = ContainerIO.readContainer(header.getVersion(), new ByteArrayInputStream(object.bytes)); if (container.isEOF()) return null; ArrayList<CramCompressionRecord> records = new ArrayList<CramCompressionRecord>(container.nofRecords); parser.getRecords(container, records, ValidationStringency.SILENT); n.normalize(records, null, 0, container.header.substitutionMatrix); ByteArrayOutputStream bamBAOS = new ByteArrayOutputStream(); BlockCompressedOutputStream os = new BlockCompressedOutputStream(bamBAOS, null); codec.setOutputStream(os); for (CramCompressionRecord record : records) { SAMRecord samRecord = f.create(record); codec.encode(samRecord); } os.flush(); OrderedByteArray bb = new OrderedByteArray(); bb.bytes = bamBAOS.toByteArray(); bb.order = object.order; log.debug(String.format("Converted OBA %d, records %d", object.order, records.size())); return bb; } catch (IOException | IllegalArgumentException | IllegalAccessException e) { throw new RuntimeException(e); } } }