// Copyright (C) 2011-2012 CRS4. // // This file is part of Seal. // // Seal is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, either version 3 of the License, or (at your option) // any later version. // // Seal is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License along // with Seal. If not, see <http://www.gnu.org/licenses/>. package tests.it.crs4.seal.prq; import org.junit.*; import static org.junit.Assert.*; import it.crs4.seal.prq.PairReadsQSeqReducer; import it.crs4.seal.common.AbstractTaggedMapping; import it.crs4.seal.common.WritableMapping; import it.crs4.seal.common.ReadPair; import it.crs4.seal.common.SequenceId; import it.crs4.seal.common.IMRContext; import it.crs4.seal.common.TestContext; import org.seqdoop.hadoop_bam.SequencedFragment; import org.apache.hadoop.io.Text; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Set; public class TestPairReadsQseqReducer { private PairReadsQSeqReducer reducer; private TestContext<Text, ReadPair> context; private SequenceId inputKey = new SequenceId("location", 1); private ArrayList<Text> reads; private Text r1, r2; @Before public void setup() { context = new TestContext<Text, ReadPair>(); reducer = new PairReadsQSeqReducer(); reducer.setup(context); reads = new ArrayList<Text>(); r1 = new Text("AAAAAAAAAA\tBBBBBBBBBB\t1"); r2 = new Text("GGGGGGGGGG\tBBBBBBBBBB\t1"); } @Test public void testNormal() throws IOException, InterruptedException { reads.add(r1); reads.add(r2); reducer.reduce(inputKey, reads, context); Set<Text> keys = context.getKeys(); assertEquals(1, keys.size()); assertEquals(inputKey.getLocation(), keys.iterator().next().toString()); List<ReadPair> values = context.getAllValues(); assertEquals(1, values.size()); ReadPair pair = values.get(0); AbstractTaggedMapping read1 = pair.getRead1(); AbstractTaggedMapping read2 = pair.getRead2(); String[] fields = r1.toString().split("\t"); assertEquals(fields[0], read1.getSequenceString()); assertEquals(fields[1], read1.getBaseQualitiesString()); fields = r2.toString().split("\t"); assertEquals(fields[0], read2.getSequenceString()); assertEquals(fields[1], read2.getBaseQualitiesString()); assertEquals(0, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "NotEnoughBases")); assertEquals(0, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "FailedFilter")); assertEquals(0, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "Dropped")); } @Test public void testFailedNotEnoughBases() throws IOException, InterruptedException { r1 = new Text("AAANNNNNNN\tBBBBBBBBBB\t1"); reads.add(r1); reads.add(r2); reducer.setMinBasesThreshold(4); reducer.setDropFailedFilter(true); reducer.reduce(inputKey, reads, context); assertEquals(1, context.getAllValues().size()); // emits 2 reads in 1 pair assertEquals(1, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "NotEnoughBases")); } @Test public void testPairFailsNotEnoughBases() throws IOException, InterruptedException { r1 = new Text("AAANNNNNNN\tBBBBBBBBBB\t1"); r2 = new Text("GGGNNNNNNN\tBBBBBBBBBB\t1"); reads.add(r1); reads.add(r2); reducer.setMinBasesThreshold(4); reducer.setDropFailedFilter(true); reducer.reduce(inputKey, reads, context); assertEquals(0, context.getAllValues().size()); assertEquals(2, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "Dropped")); } @Test public void testFailedQC() throws IOException, InterruptedException { r1 = new Text("AAANNNNNNN\tBBBBBBBBBB\t0"); reads.add(r1); reads.add(r2); reducer.setDropFailedFilter(true); reducer.reduce(inputKey, reads, context); assertEquals(1, context.getAllValues().size()); // emits 2 reads in 1 pair assertEquals(1, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "FailedFilter")); } @Test public void testPairFailsQC() throws IOException, InterruptedException { r1 = new Text("AAANNNNNNN\tBBBBBBBBBB\t0"); r2 = new Text("GGGNNNNNNN\tBBBBBBBBBB\t0"); reads.add(r1); reads.add(r2); reducer.setDropFailedFilter(true); reducer.reduce(inputKey, reads, context); assertEquals(0, context.getAllValues().size()); assertEquals(2, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "FailedFilter")); assertEquals(2, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "Dropped")); } @Test(expected=RuntimeException.class) public void testUnpaired() throws IOException, InterruptedException { reads.add(r1); reducer.reduce(inputKey, reads, context); } @Test public void testUnpairedWarning() throws IOException, InterruptedException { reads.add(r1); reducer.setWarnOnlyIfUnpaired(true); reducer.reduce(inputKey, reads, context); List<ReadPair> values = context.getAllValues(); assertEquals(0, values.size()); assertEquals(1, context.getCounterValue("it.crs4.seal.prq.PairReadsQSeqReducer$ReadCounters", "Dropped")); } @Test public void testSingleReads() throws IOException, InterruptedException { reads.add(r1); reducer.setNumReadsPerTemplate(1); reducer.reduce(inputKey, reads, context); Set<Text> keys = context.getKeys(); assertEquals(1, keys.size()); assertEquals(inputKey.getLocation(), keys.iterator().next().toString()); List<ReadPair> values = context.getAllValues(); assertEquals(1, values.size()); ReadPair pair = values.get(0); AbstractTaggedMapping read1 = pair.getRead1(); String[] fields = r1.toString().split("\t"); assertEquals(fields[0], read1.getSequenceString()); assertNull(pair.getRead2()); } }