/******************************************************************************* * Copyright 2013 EMBL-EBI * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package htsjdk.samtools.cram.lossy; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; import htsjdk.samtools.SAMFileHeader; import htsjdk.samtools.SAMFileReader; import htsjdk.samtools.SAMRecord; import htsjdk.samtools.SAMUtils; import htsjdk.samtools.cram.build.CramNormalizer; import htsjdk.samtools.cram.build.Sam2CramRecordFactory; import htsjdk.samtools.cram.common.CramVersions; import htsjdk.samtools.cram.ref.ReferenceTracks; import htsjdk.samtools.cram.structure.CramCompressionRecord; import org.junit.Ignore; import org.junit.Test; public class TestQualityScorePreservation { @Test public void test1() { QualityScorePreservation p = new QualityScorePreservation("m999_8"); List<PreservationPolicy> policies = p.getPreservationPolicies(); assertNotNull(p); assertEquals(policies.size(), 1); PreservationPolicy policy0 = policies.get(0); assertThat(policy0.readCategory.type, is(ReadCategoryType.LOWER_MAPPING_SCORE)); assertThat(policy0.readCategory.param, is(999)); if (policy0.baseCategories != null) assertEquals(policy0.baseCategories.isEmpty(), true); QualityScoreTreatment treatment = policy0.treatment; assertNotNull(treatment); assertThat(treatment.type, is(QualityScoreTreatmentType.BIN)); assertThat(treatment.param, is(8)); } @Test public void test2() { QualityScorePreservation p = new QualityScorePreservation("R8-N40"); List<PreservationPolicy> policies = p.getPreservationPolicies(); assertNotNull(p); assertEquals(policies.size(), 2); { PreservationPolicy policy0 = policies.get(0); assertNull(policy0.readCategory); List<BaseCategory> baseCategories = policy0.baseCategories; assertNotNull(baseCategories); assertEquals(baseCategories.size(), 1); BaseCategory c0 = baseCategories.get(0); assertEquals(c0.type, BaseCategoryType.MATCH); assertEquals(c0.param, -1); QualityScoreTreatment treatment = policy0.treatment; assertNotNull(treatment); assertThat(treatment.type, is(QualityScoreTreatmentType.BIN)); assertThat(treatment.param, is(8)); } { PreservationPolicy policy1 = policies.get(1); assertNull(policy1.readCategory); List<BaseCategory> baseCategories = policy1.baseCategories; assertNotNull(baseCategories); assertEquals(baseCategories.size(), 1); BaseCategory c0 = baseCategories.get(0); assertEquals(c0.type, BaseCategoryType.MISMATCH); assertEquals(c0.param, -1); QualityScoreTreatment treatment = policy1.treatment; assertNotNull(treatment); assertThat(treatment.type, is(QualityScoreTreatmentType.PRESERVE)); assertThat(treatment.param, is(40)); } } private SAMFileHeader samFileHeader = new SAMFileHeader(); private SAMRecord buildSAMRecord(String seqName, String line) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { baos.write("@HD\tVN:1.0\tGO:none SO:coordinate\n".getBytes()); baos.write(("@SQ\tSN:" + seqName + "\tLN:247249719\n").getBytes()); baos.write(line.replaceAll("\\s+", "\t").getBytes()); baos.close(); } catch (IOException e) { throw new RuntimeException(e); } ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); SAMFileReader r = new SAMFileReader(bais); try { return r.iterator().next(); } finally { r.close(); } } @Ignore("Broken test.") @Test public void test3() { String line1 = "98573 1107 20 1 60 100M = 999587 -415 CTGGTCTTAGTTCCGCAAGTGGGTATATATAAAGGCTCAAAATCAATCTTTATATTGACATCTCTCTACTTATTTGTGTTGTCTGATGCTCATATTGTAG ::A<<=D@BBC;C9=7DEEBHDEHHACEEBEEEDEE=EFFHEEFFFEHEF@HFBCEFEHFEHEHFEHDHHHFHHHEHHHHDFHHHHHGHHHHHHHHHHHH"; String line2 = "98738 1187 20 18 29 99M1S = 1000253 432 AGCGGGGATATATAAAGGCTCAAAATTACTTTTTATATGGACAACTCTCTACTGCTTTGAGATGACTGATACTCATATTGATGGAGCTTTATCAAGAAAT !\"#$%&'()*+-./0'''''''''''#'#'#'''''''#''''#'''''''''##''''#'#''#'''''#'''''''''##''''#''##''''''''?"; String seqName = "20"; List<String> lines = Arrays.asList(new String[] { line2, line1 }); byte[] ref = "CTGGTCTTAGTTCCGCAAGTGGGTATATATAAAGGCTCAAAATCAATCTTTATATTGACATCTCTCTACTTATTTGTGTTGTCTGATGCTCATATTGTAGGAGATTCCTCAAGAAAGG" .getBytes(); ReferenceTracks tracks = new ReferenceTracks(0, seqName, ref); QualityScorePreservation p = new QualityScorePreservation("R8-N40-M40-D40"); for (String line : lines) { SAMRecord record = buildSAMRecord(seqName, line); Sam2CramRecordFactory f = new Sam2CramRecordFactory(ref, record.getHeader(), CramVersions.CRAM_v3); CramCompressionRecord cramRecord = f.createCramRecord(record); p.addQualityScores(record, cramRecord, tracks); if (!cramRecord.isForcePreserveQualityScores()) { CramNormalizer.restoreQualityScores((byte) 30, Collections.singletonList(cramRecord)); } StringBuffer sb = new StringBuffer(); sb.append(record.getBaseQualityString()); sb.append("\n"); sb.append(SAMUtils.phredToFastq(cramRecord.qualityScores)); assertArrayEquals(sb.toString(), record.getBaseQualities(), cramRecord.qualityScores); } } @Ignore("Broken test.") @Test public void test4() { String line2 = "98738 1187 20 18 29 99M1S = 1000253 432 AGCGGGGATATATAAAGGCTCAAAATTACTTTTTATATGGACAACTCTCTACTGCTTTGAGATGACTGATACTCATATTGATGGAGCTTTATCAAGAAAT !\"#$%&'()*+-./0'''''''''''#'#'#'''''''#''''#'''''''''##''''#'#''#'''''#'''''''''##''''#''##''''''''?"; String seqName = "20"; List<String> lines = Arrays.asList(new String[] { line2 }); byte[] ref = "CTGGTCTTAGTTCCGCAAGTGGGTATATATAAAGGCTCAAAATCAATCTTTATATTGACATCTCTCTACTTATTTGTGTTGTCTGATGCTCATATTGTAGGAGATTCCTCAAGAAAGG" .getBytes(); ReferenceTracks tracks = new ReferenceTracks(0, seqName, ref); QualityScorePreservation p = new QualityScorePreservation("R40X10-N40-U40"); for (int i = 0; i < ref.length; i++) tracks.addCoverage(i + 1, 66); for (String line : lines) { SAMRecord record = buildSAMRecord(seqName, line); Sam2CramRecordFactory f = new Sam2CramRecordFactory(ref, record.getHeader(), CramVersions.CRAM_v3); CramCompressionRecord cramRecord = f.createCramRecord(record); p.addQualityScores(record, cramRecord, tracks); if (!cramRecord.isForcePreserveQualityScores()) { CramNormalizer.restoreQualityScores((byte) 30, Collections.singletonList(cramRecord)); } StringBuffer sb = new StringBuffer(); sb.append(record.getBaseQualityString()); sb.append("\n"); sb.append(SAMUtils.phredToFastq(cramRecord.qualityScores)); assertArrayEquals(sb.toString(), record.getBaseQualities(), cramRecord.qualityScores); } } }