/* * The MIT License * * Copyright (c) 2013 The Broad Institute * * 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.illumina; import htsjdk.samtools.util.BufferedLineReader; import htsjdk.samtools.util.IOUtil; import htsjdk.samtools.util.LineReader; import htsjdk.samtools.util.StringUtil; import htsjdk.samtools.util.TestUtil; import org.testng.annotations.Test; import picard.cmdline.CommandLineProgramTest; import picard.illumina.parser.ReadStructure; import java.io.File; import java.io.FileInputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class IlluminaBasecallsToFastqTest extends CommandLineProgramTest { private static final File BASECALLS_DIR = new File("testdata/picard/illumina/25T8B25T/Data/Intensities/BaseCalls"); private static final File DUAL_BASECALLS_DIR = new File("testdata/picard/illumina/25T8B8B25T/Data/Intensities/BaseCalls"); private static final File TEST_DATA_DIR = new File("testdata/picard/illumina/25T8B25T/fastq"); private static final File DUAL_TEST_DATA_DIR = new File("testdata/picard/illumina/25T8B8B25T/fastq"); public String getCommandLineProgramName() { return IlluminaBasecallsToFastq.class.getSimpleName(); } @Test public void testNonBarcoded() throws Exception { final String suffix = ".1.fastq"; final File outputFastq1 = File.createTempFile("nonBarcoded.", suffix); outputFastq1.deleteOnExit(); final String outputPrefix = outputFastq1.getAbsolutePath().substring(0, outputFastq1.getAbsolutePath().length() - suffix.length()); final File outputFastq2 = new File(outputPrefix + ".2.fastq"); outputFastq2.deleteOnExit(); final int lane = 1; runPicardCommandLine(new String[]{ "BASECALLS_DIR=" + BASECALLS_DIR, "LANE=" + lane, "READ_STRUCTURE=25T8B25T", "OUTPUT_PREFIX=" + outputPrefix, "RUN_BARCODE=HiMom", "MACHINE_NAME=machine1", "FLOWCELL_BARCODE=abcdeACXX" }); IOUtil.assertFilesEqual(outputFastq1, new File(TEST_DATA_DIR, "nonBarcoded.1.fastq")); IOUtil.assertFilesEqual(outputFastq2, new File(TEST_DATA_DIR, "nonBarcoded.2.fastq")); } @Test public void testMultiplexWithIlluminaReadNameHeaders() throws Exception { final File outputDir = File.createTempFile("testMultiplexRH.", ".dir"); try { outputDir.delete(); outputDir.mkdir(); outputDir.deleteOnExit(); final String filePrefix = "testMultiplexRH"; final File outputPrefix = new File(outputDir, filePrefix); runPicardCommandLine(new String[]{ "BASECALLS_DIR=" + BASECALLS_DIR, "LANE=" + 1, "RUN_BARCODE=HiMom", "READ_STRUCTURE=" + "25T8B25T", "OUTPUT_PREFIX=" + outputPrefix.getAbsolutePath(), "MACHINE_NAME=machine1", "FLOWCELL_BARCODE=abcdeACXX", "READ_NAME_FORMAT=" + IlluminaBasecallsToFastq.ReadNameFormat.ILLUMINA }); final String[] filenames = new String[]{ filePrefix + ".1.fastq", filePrefix + ".barcode_1.fastq" }; for (final String filename : filenames) { IOUtil.assertFilesEqual(new File(outputDir, filename), new File(TEST_DATA_DIR, filename)); } } finally { TestUtil.recursiveDelete(outputDir); } } @Test public void testDeMultiplexed() throws Exception { runStandardTest(1, "multiplexedBarcode.", "mp_barcode.params", 1, "25T8B25T", BASECALLS_DIR, TEST_DATA_DIR); } @Test public void testDualBarcodes() throws Exception { runStandardTest(1, "dualBarcode.", "barcode_double.params", 2, "25T8B8B25T", DUAL_BASECALLS_DIR, DUAL_TEST_DATA_DIR); } /** * This test utility takes a libraryParamsFile and generates output sam files through IlluminaBasecallsToFastq to compare against * preloaded test data * * @param jobName * @param libraryParamsFile * @param concatNColumnFields * @param readStructureString * @throws Exception */ private void runStandardTest(final int lane, final String jobName, final String libraryParamsFile, final int concatNColumnFields, final String readStructureString, final File baseCallsDir, final File testDataDir) throws Exception { final File outputDir = File.createTempFile(jobName, ".dir"); try { outputDir.delete(); outputDir.mkdir(); outputDir.deleteOnExit(); // Create barcode.params with output files in the temp directory final File libraryParams = new File(outputDir, libraryParamsFile); libraryParams.deleteOnExit(); final List<File> outputPrefixes = new ArrayList<File>(); final LineReader reader = new BufferedLineReader(new FileInputStream(new File(testDataDir, libraryParamsFile))); final PrintWriter writer = new PrintWriter(libraryParams); final String header = reader.readLine(); writer.println(header + "\tOUTPUT_PREFIX"); while (true) { final String line = reader.readLine(); if (line == null) { break; } final String[] fields = line.split("\t"); final File outputPrefix = new File(outputDir, StringUtil.join("", Arrays.copyOfRange(fields, 0, concatNColumnFields))); outputPrefixes.add(outputPrefix); writer.println(line + "\t" + outputPrefix); } writer.close(); reader.close(); runPicardCommandLine(new String[]{ "BASECALLS_DIR=" + baseCallsDir, "LANE=" + lane, "RUN_BARCODE=HiMom", "READ_STRUCTURE=" + readStructureString, "MULTIPLEX_PARAMS=" + libraryParams, "MACHINE_NAME=machine1", "FLOWCELL_BARCODE=abcdeACXX" }); final ReadStructure readStructure = new ReadStructure(readStructureString); for (final File outputSam : outputPrefixes) { for (int i = 1; i <= readStructure.templates.length(); ++i) { final String filename = outputSam.getName() + "." + i + ".fastq"; IOUtil.assertFilesEqual(new File(outputSam.getParentFile(), filename), new File(testDataDir, filename)); } for (int i = 1; i <= readStructure.barcodes.length(); ++i) { final String filename = outputSam.getName() + ".barcode_" + i + ".fastq"; IOUtil.assertFilesEqual(new File(outputSam.getParentFile(), filename), new File(testDataDir, filename)); } } } finally { TestUtil.recursiveDelete(outputDir); } } }