From 7584853f48eccea3dd8b8494ca10f46781913012 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Fri, 22 Nov 2024 13:42:15 -0500 Subject: [PATCH 1/2] refactoring overlap detector to use modern code before starting --- src/main/java/picard/sam/AddOATag.java | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/picard/sam/AddOATag.java b/src/main/java/picard/sam/AddOATag.java index 146bb05248..dac6496898 100644 --- a/src/main/java/picard/sam/AddOATag.java +++ b/src/main/java/picard/sam/AddOATag.java @@ -24,6 +24,7 @@ package picard.sam; +import htsjdk.io.IOPath; import htsjdk.samtools.*; import htsjdk.samtools.util.*; import htsjdk.tribble.annotation.Strand; @@ -34,8 +35,8 @@ import picard.cmdline.CommandLineProgram; import picard.cmdline.StandardOptionDefinitions; import picard.cmdline.programgroups.ReadDataManipulationProgramGroup; +import picard.nio.PicardHtsPath; -import java.io.File; import java.io.IOException; import java.util.List; import java.util.Optional; @@ -62,24 +63,24 @@ public class AddOATag extends CommandLineProgram { ""; @Argument(shortName = StandardOptionDefinitions.INPUT_SHORT_NAME, doc = "SAM or BAM input file") - public String INPUT; + public PicardHtsPath INPUT; @Argument(shortName = StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc = "SAM or BAM file to write merged result to") - public String OUTPUT; + public PicardHtsPath OUTPUT; @Argument(shortName = "L", doc = "If provided, only records that overlap given interval list will have the OA tag added.", optional = true) - public File INTERVAL_LIST; + public PicardHtsPath INTERVAL_LIST; private static final Log log = Log.getInstance(AddOATag.class); @Override protected int doWork() { - try (final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).open(IOUtil.getPath(INPUT)); - final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), true, IOUtil.getPath(OUTPUT), REFERENCE_SEQUENCE)) { + try (final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(referenceSequence.getReferencePath()).open(INPUT.toPath()); + final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), true, OUTPUT.toPath(), referenceSequence.getReferencePath())) { writer.setProgressLogger( new ProgressLogger(log, (int) 1e7, "Wrote", "records")); - final OverlapDetector overlapDetector = getOverlapDetectorFromIntervalListFile(INTERVAL_LIST, 0, 0); + final OverlapDetector overlapDetector = getOverlapDetectorFromIntervalListFile(INTERVAL_LIST); for (final SAMRecord rec : reader) { if (overlapDetector == null || overlapDetector.overlapsAny(rec)) { setOATag(rec); @@ -95,14 +96,12 @@ protected int doWork() { } // Take an interval list file and convert it to an overlap detector, can add left and right padding - static OverlapDetector getOverlapDetectorFromIntervalListFile(final File intervalList, final int lhsBuffer, final int rhsBuffer) { + static OverlapDetector getOverlapDetectorFromIntervalListFile(final IOPath intervalList) { if (intervalList == null) { return null; } - List intervals = IntervalList.fromFile(intervalList).uniqued().getIntervals(); - OverlapDetector detector = new OverlapDetector<>(lhsBuffer, rhsBuffer); - detector.addAll(intervals, intervals); - return detector; + List intervals = IntervalList.fromPath(intervalList.toPath()).uniqued().getIntervals(); + return OverlapDetector.create(intervals); } // format OA tag string according to the spec From 196e2df82191562b586b3408636765ff96c71b10 Mon Sep 17 00:00:00 2001 From: Louis Bergelson Date: Fri, 22 Nov 2024 14:08:47 -0500 Subject: [PATCH 2/2] Converting to use Beta API --- src/main/java/picard/sam/AddOATag.java | 30 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/picard/sam/AddOATag.java b/src/main/java/picard/sam/AddOATag.java index dac6496898..3a60d06561 100644 --- a/src/main/java/picard/sam/AddOATag.java +++ b/src/main/java/picard/sam/AddOATag.java @@ -24,6 +24,16 @@ package picard.sam; +import htsjdk.beta.codecs.reads.cram.CRAMDecoderOptions; +import htsjdk.beta.codecs.reads.cram.CRAMEncoderOptions; +import htsjdk.beta.exception.HtsjdkException; +import htsjdk.beta.plugin.reads.ReadsDecoder; +import htsjdk.beta.plugin.reads.ReadsDecoderOptions; +import htsjdk.beta.plugin.reads.ReadsEncoder; +import htsjdk.beta.plugin.reads.ReadsEncoderOptions; +import htsjdk.beta.plugin.registry.HtsCodecRegistry; +import htsjdk.beta.plugin.registry.HtsCodecResolver; +import htsjdk.beta.plugin.registry.HtsDefaultRegistry; import htsjdk.io.IOPath; import htsjdk.samtools.*; import htsjdk.samtools.util.*; @@ -75,19 +85,27 @@ public class AddOATag extends CommandLineProgram { @Override protected int doWork() { - try (final SamReader reader = SamReaderFactory.makeDefault().referenceSequence(referenceSequence.getReferencePath()).open(INPUT.toPath()); - final SAMFileWriter writer = new SAMFileWriterFactory().makeWriter(reader.getFileHeader(), true, OUTPUT.toPath(), referenceSequence.getReferencePath())) { - writer.setProgressLogger( - new ProgressLogger(log, (int) 1e7, "Wrote", "records")); + ReadsDecoderOptions readsDecoderOptions = new ReadsDecoderOptions() + .setCRAMDecoderOptions(new CRAMDecoderOptions() + .setReferencePath(referenceSequence.getHtsPath())); + ReadsEncoderOptions readsEncoderOptions = new ReadsEncoderOptions() + .setPreSorted(true) + .setCRAMEncoderOptions(new CRAMEncoderOptions() + .setReferencePath(referenceSequence.getHtsPath())); + + try (ReadsDecoder reader = HtsDefaultRegistry.getReadsResolver().getReadsDecoder(INPUT, readsDecoderOptions); + ReadsEncoder writer = HtsDefaultRegistry.getReadsResolver().getReadsEncoder(OUTPUT, readsEncoderOptions)) { + // unsupported writer.setProgressLogger(new ProgressLogger(log, (int) 1e7, "Wrote", "records")); + writer.setHeader(reader.getHeader()); final OverlapDetector overlapDetector = getOverlapDetectorFromIntervalListFile(INTERVAL_LIST); for (final SAMRecord rec : reader) { if (overlapDetector == null || overlapDetector.overlapsAny(rec)) { setOATag(rec); } - writer.addAlignment(rec); + writer.write(rec); } - } catch (IOException e) { + } catch (HtsjdkException e) { log.error(e); return 1; }