/** * Combines the recalibration data for table1 and table2 into table1 * * Note that table1 is the destination, so it is modified * * @param table1 the destination table to merge table2 into * @param table2 the source table to merge into table1 */ public static void combineTables(final NestedIntegerArray<RecalDatum> table1, final NestedIntegerArray<RecalDatum> table2) { if ( table1 == null ) throw new IllegalArgumentException("table1 cannot be null"); if ( table2 == null ) throw new IllegalArgumentException("table2 cannot be null"); if ( ! Arrays.equals(table1.getDimensions(), table2.getDimensions())) throw new IllegalArgumentException("Table1 " + Utils.join(",", table1.getDimensions()) + " not equal to " + Utils.join(",", table2.getDimensions())); for (final NestedIntegerArray.Leaf<RecalDatum> row : table2.getAllLeaves()) { final RecalDatum myDatum = table1.get(row.keys); if (myDatum == null) table1.put(row.value, row.keys); else myDatum.combine(row.value); } }
private void testDimensions(final NestedIntegerArray<RecalDatum> table, final int ... dimensions) { final int[] dim = new int[dimensions.length+1]; System.arraycopy(dimensions, 0, dim, 0, dimensions.length); dim[dimensions.length] = EventType.values().length; Assert.assertEquals(table.getDimensions().length, dim.length); for ( int i = 0; i < dim.length; i++ ) { Assert.assertEquals(table.getDimensions()[i], dim[i], "Table dimensions not expected at dim " + i); } }
@Requires("recalibrationTables != null && numCovariates > 0") @Ensures("result != null") private static NestedIntegerArray<RecalDatum> createDeltaTable(final RecalibrationTables recalibrationTables, final int numCovariates) { final int[] dimensionsForDeltaTable = new int[4]; // initialize the dimensions with those of the qual table to start with final NestedIntegerArray<RecalDatum> qualTable = recalibrationTables.getQualityScoreTable(); final int[] dimensionsOfQualTable = qualTable.getDimensions(); dimensionsForDeltaTable[0] = dimensionsOfQualTable[0]; // num read groups dimensionsForDeltaTable[1] = numCovariates + 1; // num covariates dimensionsForDeltaTable[2] = dimensionsOfQualTable[1]; dimensionsForDeltaTable[3] = dimensionsOfQualTable[2]; // now, update the dimensions based on the optional covariate tables as needed for ( int i = RecalibrationTables.TableType.OPTIONAL_COVARIATE_TABLES_START.ordinal(); i < numCovariates; i++ ) { final NestedIntegerArray<RecalDatum> covTable = recalibrationTables.getTable(i); final int[] dimensionsOfCovTable = covTable.getDimensions(); dimensionsForDeltaTable[2] = Math.max(dimensionsForDeltaTable[2], dimensionsOfCovTable[2]); dimensionsForDeltaTable[3] = Math.max(dimensionsForDeltaTable[3], dimensionsOfCovTable[3]); } return new NestedIntegerArray<RecalDatum>(dimensionsForDeltaTable); }
@Test(dataProvider = "CombineTablesProvider") public void testCombineTables(final List<Row> table1, final List<Row> table2) { final NestedIntegerArray<RecalDatum> nia1 = makeTable(table1); final NestedIntegerArray<RecalDatum> nia2 = makeTable(table2); final List<Row> expectedRows = makeExpected(table1, table2); final NestedIntegerArray<RecalDatum> expected = makeTable(expectedRows); RecalUtils.combineTables(nia1, nia2); Assert.assertEquals(nia1.getDimensions(), expected.getDimensions()); Assert.assertEquals(nia1.getAllValues().size(), expected.getAllValues().size()); for ( final NestedIntegerArray.Leaf<RecalDatum> leaf : expected.getAllLeaves() ) { final RecalDatum actual = nia1.get(leaf.keys); Assert.assertEquals(actual.getNumMismatches(), leaf.value.getNumMismatches()); Assert.assertEquals(actual.getNumObservations(), leaf.value.getNumObservations()); } }