/* * The MIT License * * Pierre Lindenbaum - Institut du Thorax - 2016 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package picard.sam; import htsjdk.samtools.*; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import picard.cmdline.CommandLineProgramTest; import java.io.File; import java.util.stream.StreamSupport; public class FilterSamReadsTest extends CommandLineProgramTest { @Override public String getCommandLineProgramName() { return FilterSamReads.class.getSimpleName(); } private static final int READ_LENGTH = 151; private final SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); private final static File TEST_DIR = new File("testdata/picard/sam/FilterSamReads/"); @BeforeTest public void setUp() { builder.setReadLength(READ_LENGTH); builder.addPair("mapped_pair_chr1", 0, 1, 151); //should be kept in first test, filtered out in third builder.addPair("mapped_pair_chr2", 1, 1, 151); //should be filtered out for first test, and kept in third builder.addPair("prove_one_of_pair", 0, 1000, 1000); //neither of these will be kept in any test builder.addPair("one_of_pair", 0, 1, 1000); //first read should pass, second should not, but both will be kept in first test } @DataProvider(name = "dataTestJsFilter") public Object[][] dataTestJsFilter() { return new Object[][]{ {"testdata/picard/sam/aligned.sam", "testdata/picard/sam/FilterSamReads/filterOddStarts.js",3}, {"testdata/picard/sam/aligned.sam", "testdata/picard/sam/FilterSamReads/filterReadsWithout5primeSoftClip.js", 0} }; } @DataProvider(name = "dataTestPairedIntervalFilter") public Object[][] dataTestPairedIntervalFilter() { return new Object[][]{ {"testdata/picard/sam/FilterSamReads/filter1.interval_list", 4}, {"testdata/picard/sam/FilterSamReads/filter2.interval_list", 0} }; } /** * filters a SAM using a javascript filter */ @Test(dataProvider = "dataTestJsFilter") public void testJavaScriptFilters(final String samFilename, final String javascriptFilename,final int expectNumber) throws Exception { // input as SAM file final File inputSam = new File(samFilename); final File javascriptFile = new File(javascriptFilename); FilterSamReads filterTest = setupProgram(javascriptFile, inputSam, FilterSamReads.Filter.includeJavascript); Assert.assertEquals(filterTest.doWork(),0); long count = getReadCount(filterTest); Assert.assertEquals(count, expectNumber); } /** * filters a SAM using an interval filter */ @Test(dataProvider = "dataTestPairedIntervalFilter") public void testPairedIntervalFilter(final String intervalFilename, final int expectNumber) throws Exception { // Build a sam file for testing final File inputSam = File.createTempFile("testSam", ".sam", TEST_DIR); inputSam.deleteOnExit(); final SAMFileWriter writer = new SAMFileWriterFactory() .setCreateIndex(true).makeBAMWriter(builder.getHeader(), false, inputSam); for (final SAMRecord record : builder) { writer.addAlignment(record); } writer.close(); final File intervalFile = new File(intervalFilename); FilterSamReads filterTest = setupProgram(intervalFile, inputSam, FilterSamReads.Filter.includePairedIntervals); Assert.assertEquals(filterTest.doWork(),0); long count = getReadCount(filterTest); Assert.assertEquals(count, expectNumber); } private FilterSamReads setupProgram(final File inputFile, final File inputSam, final FilterSamReads.Filter filter) throws Exception { final FilterSamReads program = new FilterSamReads(); program.INPUT = inputSam; program.OUTPUT = File.createTempFile("FilterSamReads.output.", ".sam"); program.OUTPUT.deleteOnExit(); program.FILTER = filter; if(filter == FilterSamReads.Filter.includePairedIntervals) { program.INTERVAL_LIST = inputFile; } else { program.JAVASCRIPT_FILE = inputFile; } return program; } private long getReadCount(FilterSamReads filterTest) throws Exception { final SamReader samReader = SamReaderFactory.makeDefault().open(filterTest.OUTPUT); long count = StreamSupport.stream(samReader.spliterator(), false) .count(); samReader.close(); return count; } }