package picard.illumina.parser.readers; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; public class ClocsFileReaderTest { private static final File TEST_DIR = new File("testdata/picard/illumina/readerTests"); private static final File PASSING_CLOCS_FILE = new File(TEST_DIR, "s_2_1101.clocs"); public static final int blockSize = 25; public static final File MULTI_BIN_PASSING_CLOCS_FILE = new File(TEST_DIR, "s_3_2102.clocs"); public static final File MBCF_W_EMPTY_BINS_AT_START = new File(TEST_DIR, "s_3_2103.clocs"); public static final File MBCF_W_EMPTY_BINS_AT_END = new File(TEST_DIR, "s_3_2104.clocs"); public static final File MBCF_W_EMPTY_BINS_THROUGHOUT = new File(TEST_DIR, "s_3_2105.clocs"); public static final int MULTI_BIN_PASSING_CLOCS_TILE = 2102; public static final int MULTI_BIN_PASSING_CLOCS_LANE = 3; public static final int MULTI_BIN_EXPECTED_NUM_VALUES = 271; public static final File MBCF_MULTI_ROW_FILE = new File(TEST_DIR, "s_1_2106.clocs"); public static final float [][] MULTI_BIN_FLOAT_COORD = { {9.7f, 1f}, {16.9f, 1.3f}, {18.5f, 22.6f}, {39.1f, 0.5f}, {46.1f, 1f}, {38.4f, 8.4f}, {59.7f, 1.1f}, {89.9f, 0.30f}, {87.1f, 0.6f}, {83.6f, 0.7f}, {111.4f, 14.3f}, {109.1f, 15f}, {105.7f, 15f} }; public static final int [][] MULTI_BIN_Q_SEQ_COORD = { {1097, 1010}, {1169, 1013}, {1185, 1226}, {1391, 1005}, {1461, 1010}, {1384, 1084}, {1597, 1011}, {1899, 1003}, {1871, 1006}, {1836, 1007}, {2114, 1143}, {2091, 1150}, {2057, 1150} }; public static final int [] MULTI_BIN_INDICES = { 0, 1, 34, 39, 40, 59, 99, 163, 164, 165, 268, 269, 270 }; public static final float [][] MULTI_BIN_FLOAT_COORD_MIXED_EMPTY_BINS = { {9.7f, 1f}, {16.9f, 1.3f}, {18.5f, 22.6f}, {89.1f, 0.5f}, {96.1f, 1f}, {88.4f, 8.4f}, {109.7f, 1.1f}, {164.9f, 0.30f}, {162.1f, 0.6f}, {158.6f, 0.7f}, {186.4f, 14.3f}, {184.1f, 15f}, {180.7f, 15f} }; public static final int [][] MULTI_BIN_Q_SEQ_COORD_MIXED_EMPTY_BINS = { {1097, 1010}, {1169, 1013}, {1185, 1226}, {1891, 1005}, {1961, 1010}, {1884, 1084}, {2097, 1011}, {2649, 1003}, {2621, 1006}, {2586, 1007}, {2864, 1143}, {2841, 1150}, {2807, 1150} }; //These are all essentially the same file but with 0 or more empty bins spread through them @DataProvider(name = "multiBinPassingClocsFiles") public Object [][] multiBinPassingClocsFiles() { return new Object[][] { {MULTI_BIN_PASSING_CLOCS_FILE, 0, 2102}, {MBCF_W_EMPTY_BINS_AT_START, 2, 2103}, {MBCF_W_EMPTY_BINS_AT_END, 0, 2104} }; } @Test(dataProvider = "multiBinPassingClocsFiles") public void multiBinTest(final File multiBinPassingClocsFile, final int binShift, final int tile) { final ClocsFileReader clocsReader = new ClocsFileReader(multiBinPassingClocsFile); int tdIndex = 0; int nextIndex = MULTI_BIN_INDICES[tdIndex]; for(int i = 0; i < MULTI_BIN_EXPECTED_NUM_VALUES; i++) { Assert.assertTrue(clocsReader.hasNext()); final AbstractIlluminaPositionFileReader.PositionInfo piClocs = clocsReader.next(); if(i == nextIndex) { PosFileReaderTest.comparePositionInfo(piClocs, MULTI_BIN_FLOAT_COORD[tdIndex][0] + binShift * blockSize, MULTI_BIN_FLOAT_COORD[tdIndex][1], MULTI_BIN_Q_SEQ_COORD[tdIndex][0] + binShift * blockSize * 10, MULTI_BIN_Q_SEQ_COORD[tdIndex][1], MULTI_BIN_PASSING_CLOCS_LANE, tile, tdIndex); if(tdIndex < MULTI_BIN_INDICES.length-1) { nextIndex = MULTI_BIN_INDICES[++tdIndex]; } } } Assert.assertFalse(clocsReader.hasNext()); } @Test public void multiBinMixedEmptyBinTest() { final ClocsFileReader clocsReader = new ClocsFileReader(MBCF_W_EMPTY_BINS_THROUGHOUT); int tdIndex = 0; int nextIndex = MULTI_BIN_INDICES[tdIndex]; for(int i = 0; i < MULTI_BIN_EXPECTED_NUM_VALUES; i++) { Assert.assertTrue(clocsReader.hasNext()); final AbstractIlluminaPositionFileReader.PositionInfo piClocs = clocsReader.next(); if(i == nextIndex) { PosFileReaderTest.comparePositionInfo(piClocs, MULTI_BIN_FLOAT_COORD_MIXED_EMPTY_BINS[tdIndex][0], MULTI_BIN_FLOAT_COORD_MIXED_EMPTY_BINS[tdIndex][1], MULTI_BIN_Q_SEQ_COORD_MIXED_EMPTY_BINS[tdIndex][0], MULTI_BIN_Q_SEQ_COORD_MIXED_EMPTY_BINS[tdIndex][1], MULTI_BIN_PASSING_CLOCS_LANE, 2105, tdIndex); if(tdIndex < MULTI_BIN_INDICES.length-1) { nextIndex = MULTI_BIN_INDICES[++tdIndex]; } } } Assert.assertFalse(clocsReader.hasNext()); } public static final int [] MULTI_ROW_INDICES = new int[]{ 1, 10, 200, 2000, 10000, 30000 }; public static final float [][] MULTI_ROW_FLOAT_COORD = new float[][] { {23.2f, 0.2f}, {16.7f, 5.7f}, {60.9f, 15.0f}, {596.2f, 19.6f}, {999.3f, 47.3f}, {1015f, 115.5f} }; public static final int [][] MULTI_ROW_Q_SEQ_COORD = new int[][] { {1232, 1002}, {1167, 1057 }, {1609, 1150}, {6962, 1196}, {10993, 1473}, {11150, 2155} }; @Test public void multiRowFileTest() { final ClocsFileReader clocsReader = new ClocsFileReader(MBCF_MULTI_ROW_FILE); int tdIndex = 0; int nextIndex = MULTI_ROW_INDICES[tdIndex]; for(int i = 1; i <= 39891; i++) { Assert.assertTrue(clocsReader.hasNext(), " i == " + i); final AbstractIlluminaPositionFileReader.PositionInfo piClocs = clocsReader.next(); if(i == nextIndex) { PosFileReaderTest.comparePositionInfo(piClocs, MULTI_ROW_FLOAT_COORD[tdIndex][0], MULTI_ROW_FLOAT_COORD[tdIndex][1], MULTI_ROW_Q_SEQ_COORD[tdIndex][0], MULTI_ROW_Q_SEQ_COORD[tdIndex][1], 1, 2106, tdIndex); if(tdIndex < MULTI_ROW_INDICES.length-1) { nextIndex = MULTI_ROW_INDICES[++tdIndex]; } } } Assert.assertFalse(clocsReader.hasNext()); } @Test public void singleBinTest() { final ClocsFileReader clocsReader = new ClocsFileReader(PASSING_CLOCS_FILE); for(int i = 0; i < PosFileReaderTest.PassingPosFloatCoord.length; i++) { Assert.assertTrue(clocsReader.hasNext()); final AbstractIlluminaPositionFileReader.PositionInfo piClocs = clocsReader.next(); PosFileReaderTest.comparePositionInfo(piClocs, i); } Assert.assertFalse(clocsReader.hasNext()); } }