From e4c5c07829d3c1999404a6848de72a90452274e6 Mon Sep 17 00:00:00 2001 From: Joel Thibault Date: Fri, 8 Mar 2019 14:52:47 -0500 Subject: [PATCH 1/2] ExternalEncodings inherit from ExternalEncoding --- .../external/ExternalByteEncoding.java | 14 ++------------ .../encoding/external/ExternalEncoding.java | 19 +++++++++++++++++++ .../external/ExternalIntegerEncoding.java | 14 ++------------ .../external/ExternalLongEncoding.java | 16 +++------------- 4 files changed, 26 insertions(+), 37 deletions(-) create mode 100644 src/main/java/htsjdk/samtools/cram/encoding/external/ExternalEncoding.java diff --git a/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalByteEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalByteEncoding.java index 5709c34199..2afbfb9d4d 100644 --- a/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalByteEncoding.java +++ b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalByteEncoding.java @@ -18,22 +18,17 @@ package htsjdk.samtools.cram.encoding.external; import htsjdk.samtools.cram.encoding.CRAMCodec; -import htsjdk.samtools.cram.encoding.CRAMEncoding; import htsjdk.samtools.cram.io.BitInputStream; import htsjdk.samtools.cram.io.BitOutputStream; import htsjdk.samtools.cram.io.ITF8; -import htsjdk.samtools.cram.structure.EncodingID; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Map; -public class ExternalByteEncoding extends CRAMEncoding { - private final int externalBlockContentId; - +public class ExternalByteEncoding extends ExternalEncoding { public ExternalByteEncoding(final int externalBlockContentId) { - super(EncodingID.EXTERNAL); - this.externalBlockContentId = externalBlockContentId; + super(externalBlockContentId); } public static ExternalByteEncoding fromParams(byte[] params) { @@ -41,11 +36,6 @@ public static ExternalByteEncoding fromParams(byte[] params) { return new ExternalByteEncoding(contentId); } - @Override - public byte[] toByteArray() { - return ITF8.writeUnsignedITF8(externalBlockContentId); - } - @Override public CRAMCodec buildCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, diff --git a/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalEncoding.java new file mode 100644 index 0000000000..8faa0732a4 --- /dev/null +++ b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalEncoding.java @@ -0,0 +1,19 @@ +package htsjdk.samtools.cram.encoding.external; + +import htsjdk.samtools.cram.encoding.CRAMEncoding; +import htsjdk.samtools.cram.io.ITF8; +import htsjdk.samtools.cram.structure.EncodingID; + +public abstract class ExternalEncoding extends CRAMEncoding { + protected final int externalBlockContentId; + + ExternalEncoding(final int externalBlockContentId) { + super(EncodingID.EXTERNAL); + this.externalBlockContentId = externalBlockContentId; + } + + @Override + public byte[] toByteArray() { + return ITF8.writeUnsignedITF8(externalBlockContentId); + } +} diff --git a/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalIntegerEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalIntegerEncoding.java index 8458541792..d90f0ce398 100644 --- a/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalIntegerEncoding.java +++ b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalIntegerEncoding.java @@ -18,22 +18,17 @@ package htsjdk.samtools.cram.encoding.external; import htsjdk.samtools.cram.encoding.CRAMCodec; -import htsjdk.samtools.cram.encoding.CRAMEncoding; import htsjdk.samtools.cram.io.BitInputStream; import htsjdk.samtools.cram.io.BitOutputStream; import htsjdk.samtools.cram.io.ITF8; -import htsjdk.samtools.cram.structure.EncodingID; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Map; -public class ExternalIntegerEncoding extends CRAMEncoding { - private final int externalBlockContentId; - +public class ExternalIntegerEncoding extends ExternalEncoding { public ExternalIntegerEncoding(final int externalBlockContentId) { - super(EncodingID.EXTERNAL); - this.externalBlockContentId = externalBlockContentId; + super(externalBlockContentId); } public static ExternalIntegerEncoding fromParams(byte[] params) { @@ -41,11 +36,6 @@ public static ExternalIntegerEncoding fromParams(byte[] params) { return new ExternalIntegerEncoding(contentId); } - @Override - public byte[] toByteArray() { - return ITF8.writeUnsignedITF8(externalBlockContentId); - } - @Override public CRAMCodec buildCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, diff --git a/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalLongEncoding.java b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalLongEncoding.java index cfc66a90ba..490440db55 100644 --- a/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalLongEncoding.java +++ b/src/main/java/htsjdk/samtools/cram/encoding/external/ExternalLongEncoding.java @@ -18,22 +18,17 @@ package htsjdk.samtools.cram.encoding.external; import htsjdk.samtools.cram.encoding.CRAMCodec; -import htsjdk.samtools.cram.encoding.CRAMEncoding; import htsjdk.samtools.cram.io.BitInputStream; import htsjdk.samtools.cram.io.BitOutputStream; import htsjdk.samtools.cram.io.ITF8; -import htsjdk.samtools.cram.structure.EncodingID; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Map; -public class ExternalLongEncoding extends CRAMEncoding { - private final int externalBlockContentId; - - ExternalLongEncoding(final int externalBlockContentId) { - super(EncodingID.EXTERNAL); - this.externalBlockContentId = externalBlockContentId; +public class ExternalLongEncoding extends ExternalEncoding { + public ExternalLongEncoding(final int externalBlockContentId) { + super(externalBlockContentId); } public static ExternalLongEncoding fromParams(byte[] params) { @@ -41,11 +36,6 @@ public static ExternalLongEncoding fromParams(byte[] params) { return new ExternalLongEncoding(contentId); } - @Override - public byte[] toByteArray() { - return ITF8.writeUnsignedITF8(externalBlockContentId); - } - @Override public CRAMCodec buildCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, From 676b5a884739794f697b4b6f1d2e751a92b77c05 Mon Sep 17 00:00:00 2001 From: Joel Thibault Date: Fri, 8 Mar 2019 14:53:06 -0500 Subject: [PATCH 2/2] CompressionHeaderFactory refactor: these methods are not datatype-specific --- .../cram/build/CompressionHeaderFactory.java | 90 ++++++++----------- 1 file changed, 37 insertions(+), 53 deletions(-) diff --git a/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java b/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java index 7e66ea2733..0110f58db5 100644 --- a/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java +++ b/src/main/java/htsjdk/samtools/cram/build/CompressionHeaderFactory.java @@ -21,10 +21,7 @@ import htsjdk.samtools.cram.compression.ExternalCompressor; import htsjdk.samtools.cram.encoding.*; import htsjdk.samtools.cram.encoding.core.CanonicalHuffmanIntegerEncoding; -import htsjdk.samtools.cram.encoding.external.ByteArrayStopEncoding; -import htsjdk.samtools.cram.encoding.external.ExternalByteArrayEncoding; -import htsjdk.samtools.cram.encoding.external.ExternalByteEncoding; -import htsjdk.samtools.cram.encoding.external.ExternalIntegerEncoding; +import htsjdk.samtools.cram.encoding.external.*; import htsjdk.samtools.cram.compression.rans.RANS; import htsjdk.samtools.cram.encoding.readfeatures.ReadFeature; import htsjdk.samtools.cram.encoding.readfeatures.Substitution; @@ -80,36 +77,36 @@ public CompressionHeader build(final List records, Substi final CompressionHeaderBuilder builder = new CompressionHeaderBuilder(coordinateSorted); - builder.addExternalIntegerRansOrderZeroEncoding(DataSeries.AP_AlignmentPositionOffset); - builder.addExternalByteRansOrderOneEncoding(DataSeries.BA_Base); + builder.addExternalRansOrderZeroEncoding(DataSeries.AP_AlignmentPositionOffset); + builder.addExternalRansOrderOneEncoding(DataSeries.BA_Base); // BB is not used - builder.addExternalIntegerRansOrderOneEncoding(DataSeries.BF_BitFlags); - builder.addExternalByteGzipEncoding(DataSeries.BS_BaseSubstitutionCode); - builder.addExternalIntegerRansOrderOneEncoding(DataSeries.CF_CompressionBitFlags); - builder.addExternalIntegerGzipEncoding(DataSeries.DL_DeletionLength); - builder.addExternalByteGzipEncoding(DataSeries.FC_FeatureCode); - builder.addExternalIntegerGzipEncoding(DataSeries.FN_NumberOfReadFeatures); - builder.addExternalIntegerGzipEncoding(DataSeries.FP_FeaturePosition); - builder.addExternalIntegerGzipEncoding(DataSeries.HC_HardClip); + builder.addExternalRansOrderOneEncoding(DataSeries.BF_BitFlags); + builder.addExternalGzipEncoding(DataSeries.BS_BaseSubstitutionCode); + builder.addExternalRansOrderOneEncoding(DataSeries.CF_CompressionBitFlags); + builder.addExternalGzipEncoding(DataSeries.DL_DeletionLength); + builder.addExternalGzipEncoding(DataSeries.FC_FeatureCode); + builder.addExternalGzipEncoding(DataSeries.FN_NumberOfReadFeatures); + builder.addExternalGzipEncoding(DataSeries.FP_FeaturePosition); + builder.addExternalGzipEncoding(DataSeries.HC_HardClip); builder.addExternalByteArrayStopTabGzipEncoding(DataSeries.IN_Insertion); - builder.addExternalIntegerGzipEncoding(DataSeries.MF_MateBitFlags); - builder.addExternalIntegerGzipEncoding(DataSeries.MQ_MappingQualityScore); - builder.addExternalIntegerGzipEncoding(DataSeries.NF_RecordsToNextFragment); - builder.addExternalIntegerGzipEncoding(DataSeries.NP_NextFragmentAlignmentStart); - builder.addExternalIntegerRansOrderOneEncoding(DataSeries.NS_NextFragmentReferenceSequenceID); - builder.addExternalIntegerGzipEncoding(DataSeries.PD_padding); + builder.addExternalGzipEncoding(DataSeries.MF_MateBitFlags); + builder.addExternalGzipEncoding(DataSeries.MQ_MappingQualityScore); + builder.addExternalGzipEncoding(DataSeries.NF_RecordsToNextFragment); + builder.addExternalGzipEncoding(DataSeries.NP_NextFragmentAlignmentStart); + builder.addExternalRansOrderOneEncoding(DataSeries.NS_NextFragmentReferenceSequenceID); + builder.addExternalGzipEncoding(DataSeries.PD_padding); // QQ is not used - builder.addExternalByteRansOrderOneEncoding(DataSeries.QS_QualityScore); - builder.addExternalIntegerRansOrderOneEncoding(DataSeries.RG_ReadGroup); - builder.addExternalIntegerRansOrderZeroEncoding(DataSeries.RI_RefId); - builder.addExternalIntegerRansOrderOneEncoding(DataSeries.RL_ReadLength); + builder.addExternalRansOrderOneEncoding(DataSeries.QS_QualityScore); + builder.addExternalRansOrderOneEncoding(DataSeries.RG_ReadGroup); + builder.addExternalRansOrderZeroEncoding(DataSeries.RI_RefId); + builder.addExternalRansOrderOneEncoding(DataSeries.RL_ReadLength); builder.addExternalByteArrayStopTabGzipEncoding(DataSeries.RN_ReadName); - builder.addExternalIntegerGzipEncoding(DataSeries.RS_RefSkip); + builder.addExternalGzipEncoding(DataSeries.RS_RefSkip); builder.addExternalByteArrayStopTabGzipEncoding(DataSeries.SC_SoftClip); - builder.addExternalIntegerGzipEncoding(DataSeries.TC_TagCount); - builder.addExternalIntegerEncoding(DataSeries.TL_TagIdList, ExternalCompressor.createGZIP()); - builder.addExternalIntegerGzipEncoding(DataSeries.TN_TagNameAndType); - builder.addExternalIntegerRansOrderOneEncoding(DataSeries.TS_InsertSize); + builder.addExternalGzipEncoding(DataSeries.TC_TagCount); + builder.addExternalGzipEncoding(DataSeries.TL_TagIdList); + builder.addExternalGzipEncoding(DataSeries.TN_TagNameAndType); + builder.addExternalRansOrderOneEncoding(DataSeries.TS_InsertSize); builder.setTagIdDictionary(buildTagIdDictionary(records)); @@ -512,36 +509,23 @@ private void addExternalByteArrayStopTabGzipEncoding(final DataSeries dataSeries ExternalCompressor.createGZIP()); } - private void addExternalIntegerEncoding(final DataSeries dataSeries, final ExternalCompressor compressor) { - addExternalEncoding(dataSeries, - new ExternalIntegerEncoding(dataSeries.getExternalBlockContentId()).toParam(), - compressor); - } - - private void addExternalIntegerGzipEncoding(final DataSeries dataSeries) { - addExternalEncoding(dataSeries, - new ExternalIntegerEncoding(dataSeries.getExternalBlockContentId()).toParam(), - ExternalCompressor.createGZIP()); + private void addExternalEncoding(final DataSeries dataSeries, final ExternalCompressor compressor) { + // we need a concrete type; the choice of Byte is arbitrary. + // params are equal for all External Encoding value types + final EncodingParams params = new ExternalByteEncoding(dataSeries.getExternalBlockContentId()).toParam(); + addExternalEncoding(dataSeries, params, compressor); } - private void addExternalByteGzipEncoding(final DataSeries dataSeries) { - addExternalEncoding(dataSeries, - new ExternalByteEncoding(dataSeries.getExternalBlockContentId()).toParam(), - ExternalCompressor.createGZIP()); - } - - private void addExternalByteRansOrderOneEncoding(final DataSeries dataSeries) { - addExternalEncoding(dataSeries, - new ExternalByteEncoding(dataSeries.getExternalBlockContentId()).toParam(), - ExternalCompressor.createRANS(RANS.ORDER.ONE)); + private void addExternalGzipEncoding(final DataSeries dataSeries) { + addExternalEncoding(dataSeries, ExternalCompressor.createGZIP()); } - private void addExternalIntegerRansOrderOneEncoding(final DataSeries dataSeries) { - addExternalIntegerEncoding(dataSeries, ExternalCompressor.createRANS(RANS.ORDER.ONE)); + private void addExternalRansOrderOneEncoding(final DataSeries dataSeries) { + addExternalEncoding(dataSeries, ExternalCompressor.createRANS(RANS.ORDER.ONE)); } - private void addExternalIntegerRansOrderZeroEncoding(final DataSeries dataSeries) { - addExternalIntegerEncoding(dataSeries, ExternalCompressor.createRANS(RANS.ORDER.ZERO)); + private void addExternalRansOrderZeroEncoding(final DataSeries dataSeries) { + addExternalEncoding(dataSeries, ExternalCompressor.createRANS(RANS.ORDER.ZERO)); } void addTagEncoding(final int tagId, final EncodingDetails encodingDetails) {