Cleanup and unit tests for EventType and ReadRecalibrationInfo in BQSR
-- Added unit tests for EventType and ReadRecalibrationInfo -- Simplified interface of EventType. Previously this enum carried an index with it, but this is redundant with the enum.ordinal function. Now just using that function instead.
This commit is contained in:
parent
a5901cdd20
commit
810e2da1d4
|
|
@ -58,7 +58,8 @@ public final class ReadRecalibrationInfo {
|
|||
if ( covariates == null ) throw new IllegalArgumentException("covariates cannot be null");
|
||||
if ( skips == null ) throw new IllegalArgumentException("skips cannot be null");
|
||||
if ( snpErrors == null ) throw new IllegalArgumentException("snpErrors cannot be null");
|
||||
// future: may allow insertionErrors && deletionErrors to be null, so don't enforce
|
||||
if ( insertionErrors == null ) throw new IllegalArgumentException("insertionErrors cannot be null");
|
||||
if ( deletionErrors == null ) throw new IllegalArgumentException("deletionErrors cannot be null");
|
||||
|
||||
this.read = read;
|
||||
this.baseQuals = read.getBaseQualities();
|
||||
|
|
@ -73,8 +74,8 @@ public final class ReadRecalibrationInfo {
|
|||
|
||||
if ( skips.length != length ) throw new IllegalArgumentException("skips.length " + snpErrors.length + " != length " + length);
|
||||
if ( snpErrors.length != length ) throw new IllegalArgumentException("snpErrors.length " + snpErrors.length + " != length " + length);
|
||||
if ( insertionErrors != null && insertionErrors.length != length ) throw new IllegalArgumentException("insertionErrors.length " + snpErrors.length + " != length " + length);
|
||||
if ( deletionErrors != null && deletionErrors.length != length ) throw new IllegalArgumentException("deletionErrors.length " + snpErrors.length + " != length " + length);
|
||||
if ( insertionErrors.length != length ) throw new IllegalArgumentException("insertionErrors.length " + snpErrors.length + " != length " + length);
|
||||
if ( deletionErrors.length != length ) throw new IllegalArgumentException("deletionErrors.length " + snpErrors.length + " != length " + length);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ public class RecalibrationEngine {
|
|||
|
||||
for (final EventType eventType : EventType.values()) {
|
||||
final int[] keys = readCovariates.getKeySet(offset, eventType);
|
||||
final int eventIndex = eventType.index;
|
||||
final int eventIndex = eventType.ordinal();
|
||||
final byte qual = recalInfo.getQual(eventType, offset);
|
||||
final double isError = recalInfo.getErrorFraction(eventType, offset);
|
||||
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ public class BaseRecalibration {
|
|||
}
|
||||
|
||||
private double getGlobalDeltaQ(final int rgKey, final EventType errorModel) {
|
||||
final Double cached = globalDeltaQs.get(rgKey, errorModel.index);
|
||||
final Double cached = globalDeltaQs.get(rgKey, errorModel.ordinal());
|
||||
|
||||
if ( TEST_CACHING ) {
|
||||
final double calcd = calculateGlobalDeltaQ(rgKey, errorModel);
|
||||
|
|
@ -210,7 +210,7 @@ public class BaseRecalibration {
|
|||
}
|
||||
|
||||
private double getDeltaQReported(final int rgKey, final int qualKey, final EventType errorModel, final double globalDeltaQ) {
|
||||
final Double cached = deltaQReporteds.get(rgKey, qualKey, errorModel.index);
|
||||
final Double cached = deltaQReporteds.get(rgKey, qualKey, errorModel.ordinal());
|
||||
|
||||
if ( TEST_CACHING ) {
|
||||
final double calcd = calculateDeltaQReported(rgKey, qualKey, errorModel, globalDeltaQ, (byte)qualKey);
|
||||
|
|
@ -240,7 +240,7 @@ public class BaseRecalibration {
|
|||
private double calculateGlobalDeltaQ(final int rgKey, final EventType errorModel) {
|
||||
double result = 0.0;
|
||||
|
||||
final RecalDatum empiricalQualRG = recalibrationTables.getReadGroupTable().get(rgKey, errorModel.index);
|
||||
final RecalDatum empiricalQualRG = recalibrationTables.getReadGroupTable().get(rgKey, errorModel.ordinal());
|
||||
|
||||
if (empiricalQualRG != null) {
|
||||
final double globalDeltaQEmpirical = empiricalQualRG.getEmpiricalQuality();
|
||||
|
|
@ -254,7 +254,7 @@ public class BaseRecalibration {
|
|||
private double calculateDeltaQReported(final int rgKey, final int qualKey, final EventType errorModel, final double globalDeltaQ, final byte qualFromRead) {
|
||||
double result = 0.0;
|
||||
|
||||
final RecalDatum empiricalQualQS = recalibrationTables.getQualityScoreTable().get(rgKey, qualKey, errorModel.index);
|
||||
final RecalDatum empiricalQualQS = recalibrationTables.getQualityScoreTable().get(rgKey, qualKey, errorModel.ordinal());
|
||||
if (empiricalQualQS != null) {
|
||||
final double deltaQReportedEmpirical = empiricalQualQS.getEmpiricalQuality();
|
||||
result = deltaQReportedEmpirical - qualFromRead - globalDeltaQ;
|
||||
|
|
@ -287,7 +287,7 @@ public class BaseRecalibration {
|
|||
final double globalDeltaQ,
|
||||
final double deltaQReported,
|
||||
final byte qualFromRead) {
|
||||
final RecalDatum empiricalQualCO = table.get(rgKey, qualKey, tableKey, errorModel.index);
|
||||
final RecalDatum empiricalQualCO = table.get(rgKey, qualKey, tableKey, errorModel.ordinal());
|
||||
if (empiricalQualCO != null) {
|
||||
final double deltaQCovariateEmpirical = empiricalQualCO.getEmpiricalQuality();
|
||||
return deltaQCovariateEmpirical - qualFromRead - (globalDeltaQ + deltaQReported);
|
||||
|
|
|
|||
|
|
@ -1,41 +1,39 @@
|
|||
package org.broadinstitute.sting.utils.recalibration;
|
||||
|
||||
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
|
||||
|
||||
public enum EventType {
|
||||
BASE_SUBSTITUTION(0, "M", "Base Substitution"),
|
||||
BASE_INSERTION(1, "I", "Base Insertion"),
|
||||
BASE_DELETION(2, "D", "Base Deletion");
|
||||
BASE_SUBSTITUTION("M", "Base Substitution"),
|
||||
BASE_INSERTION("I", "Base Insertion"),
|
||||
BASE_DELETION("D", "Base Deletion");
|
||||
|
||||
public final int index;
|
||||
private final String representation;
|
||||
private final String longRepresentation;
|
||||
|
||||
private EventType(int index, String representation, String longRepresentation) {
|
||||
this.index = index;
|
||||
private EventType(String representation, String longRepresentation) {
|
||||
this.representation = representation;
|
||||
this.longRepresentation = longRepresentation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the EventType corresponding to its ordinal index
|
||||
* @param index an ordinal index
|
||||
* @return the event type corresponding to ordinal index
|
||||
*/
|
||||
public static EventType eventFrom(int index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
return BASE_SUBSTITUTION;
|
||||
case 1:
|
||||
return BASE_INSERTION;
|
||||
case 2:
|
||||
return BASE_DELETION;
|
||||
default:
|
||||
throw new ReviewedStingException(String.format("Event %d does not exist.", index));
|
||||
}
|
||||
return EventType.values()[index];
|
||||
}
|
||||
|
||||
public static EventType eventFrom(String event) {
|
||||
|
||||
/**
|
||||
* Get the EventType with short string representation
|
||||
* @throws IllegalArgumentException if representation doesn't correspond to one of EventType
|
||||
* @param representation short string representation of the event
|
||||
* @return an EventType
|
||||
*/
|
||||
public static EventType eventFrom(String representation) {
|
||||
for (EventType eventType : EventType.values())
|
||||
if (eventType.representation.equals(event))
|
||||
if (eventType.representation.equals(representation))
|
||||
return eventType;
|
||||
|
||||
throw new ReviewedStingException(String.format("Event %s does not exist.", event));
|
||||
throw new IllegalArgumentException(String.format("Event %s does not exist.", representation));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -68,9 +68,9 @@ public class ReadCovariates {
|
|||
* @param readOffset the read offset, must be >= 0 and <= the read length used to create this ReadCovariates
|
||||
*/
|
||||
public void addCovariate(final int mismatch, final int insertion, final int deletion, final int readOffset) {
|
||||
keys[EventType.BASE_SUBSTITUTION.index][readOffset][currentCovariateIndex] = mismatch;
|
||||
keys[EventType.BASE_INSERTION.index][readOffset][currentCovariateIndex] = insertion;
|
||||
keys[EventType.BASE_DELETION.index][readOffset][currentCovariateIndex] = deletion;
|
||||
keys[EventType.BASE_SUBSTITUTION.ordinal()][readOffset][currentCovariateIndex] = mismatch;
|
||||
keys[EventType.BASE_INSERTION.ordinal()][readOffset][currentCovariateIndex] = insertion;
|
||||
keys[EventType.BASE_DELETION.ordinal()][readOffset][currentCovariateIndex] = deletion;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -81,11 +81,11 @@ public class ReadCovariates {
|
|||
* @return
|
||||
*/
|
||||
public int[] getKeySet(final int readPosition, final EventType errorModel) {
|
||||
return keys[errorModel.index][readPosition];
|
||||
return keys[errorModel.ordinal()][readPosition];
|
||||
}
|
||||
|
||||
public int[][] getKeySet(final EventType errorModel) {
|
||||
return keys[errorModel.index];
|
||||
return keys[errorModel.ordinal()];
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
|
@ -94,17 +94,9 @@ public class ReadCovariates {
|
|||
//
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
protected int[][] getMismatchesKeySet() {
|
||||
return keys[EventType.BASE_SUBSTITUTION.index];
|
||||
}
|
||||
|
||||
protected int[][] getInsertionsKeySet() {
|
||||
return keys[EventType.BASE_INSERTION.index];
|
||||
}
|
||||
|
||||
protected int[][] getDeletionsKeySet() {
|
||||
return keys[EventType.BASE_DELETION.index];
|
||||
}
|
||||
protected int[][] getMismatchesKeySet() { return getKeySet(EventType.BASE_SUBSTITUTION); }
|
||||
protected int[][] getInsertionsKeySet() { return getKeySet(EventType.BASE_INSERTION); }
|
||||
protected int[][] getDeletionsKeySet() { return getKeySet(EventType.BASE_DELETION); }
|
||||
|
||||
protected int[] getMismatchesKeySet(final int readPosition) {
|
||||
return getKeySet(readPosition, EventType.BASE_SUBSTITUTION);
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ public class RecalibrationReport {
|
|||
tempCOVarray[2] = requestedCovariates[RecalibrationTables.TableType.OPTIONAL_COVARIATE_TABLES_START.index + covIndex].keyFromValue(covValue);
|
||||
|
||||
final EventType event = EventType.eventFrom((String)reportTable.get(i, RecalUtils.EVENT_TYPE_COLUMN_NAME));
|
||||
tempCOVarray[3] = event.index;
|
||||
tempCOVarray[3] = event.ordinal();
|
||||
|
||||
recalibrationTables.getTable(RecalibrationTables.TableType.OPTIONAL_COVARIATE_TABLES_START.index + covIndex).put(getRecalDatum(reportTable, i, false), tempCOVarray);
|
||||
}
|
||||
|
|
@ -161,7 +161,7 @@ public class RecalibrationReport {
|
|||
final Object qual = reportTable.get(i, RecalUtils.QUALITY_SCORE_COLUMN_NAME);
|
||||
tempQUALarray[1] = requestedCovariates[1].keyFromValue(qual);
|
||||
final EventType event = EventType.eventFrom((String)reportTable.get(i, RecalUtils.EVENT_TYPE_COLUMN_NAME));
|
||||
tempQUALarray[2] = event.index;
|
||||
tempQUALarray[2] = event.ordinal();
|
||||
|
||||
qualTable.put(getRecalDatum(reportTable, i, false), tempQUALarray);
|
||||
}
|
||||
|
|
@ -178,7 +178,7 @@ public class RecalibrationReport {
|
|||
final Object rg = reportTable.get(i, RecalUtils.READGROUP_COLUMN_NAME);
|
||||
tempRGarray[0] = requestedCovariates[0].keyFromValue(rg);
|
||||
final EventType event = EventType.eventFrom((String)reportTable.get(i, RecalUtils.EVENT_TYPE_COLUMN_NAME));
|
||||
tempRGarray[1] = event.index;
|
||||
tempRGarray[1] = event.ordinal();
|
||||
|
||||
rgTable.put(getRecalDatum(reportTable, i, true), tempRGarray);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* Copyright (c) 2012 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 org.broadinstitute.sting.gatk.walkers.bqsr;
|
||||
|
||||
import net.sf.samtools.SAMUtils;
|
||||
import org.broadinstitute.sting.BaseTest;
|
||||
import org.broadinstitute.sting.utils.recalibration.EventType;
|
||||
import org.broadinstitute.sting.utils.recalibration.ReadCovariates;
|
||||
import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils;
|
||||
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
|
||||
public final class ReadRecalibrationInfoUnitTest extends BaseTest {
|
||||
@DataProvider(name = "InfoProvider")
|
||||
public Object[][] createCombineTablesProvider() {
|
||||
List<Object[]> tests = new ArrayList<Object[]>();
|
||||
|
||||
for ( final int readLength: Arrays.asList(10, 100, 1000) ) {
|
||||
for ( final boolean includeIndelErrors : Arrays.asList(true, false) ) {
|
||||
tests.add(new Object[]{readLength, includeIndelErrors});
|
||||
}
|
||||
}
|
||||
|
||||
return tests.toArray(new Object[][]{});
|
||||
}
|
||||
|
||||
@Test(dataProvider = "InfoProvider")
|
||||
public void testReadInfo(final int readLength, final boolean includeIndelErrors) {
|
||||
final ReadCovariates covariates = new ReadCovariates(readLength, 2);
|
||||
|
||||
final byte[] bases = new byte[readLength];
|
||||
final byte[] baseQuals = new byte[readLength];
|
||||
final byte[] insertionQuals = new byte[readLength];
|
||||
final byte[] deletionQuals = new byte[readLength];
|
||||
final boolean[] skips = new boolean[readLength];
|
||||
final double[] snpErrors = new double[readLength];
|
||||
final double[] insertionErrors = new double[readLength];
|
||||
final double[] deletionsErrors = new double[readLength];
|
||||
for ( int i = 0; i < readLength; i++ ) {
|
||||
bases[i] = 'A';
|
||||
baseQuals[i] = (byte)(i % SAMUtils.MAX_PHRED_SCORE);
|
||||
insertionQuals[i] = (byte)((i+1) % SAMUtils.MAX_PHRED_SCORE);
|
||||
deletionQuals[i] = (byte)((i+2) % SAMUtils.MAX_PHRED_SCORE);
|
||||
skips[i] = i % 2 == 0;
|
||||
snpErrors[i] = 1.0 / (i+1);
|
||||
insertionErrors[i] = 0.5 / (i+1);
|
||||
deletionsErrors[i] = 0.3 / (i+1);
|
||||
}
|
||||
|
||||
final EnumMap<EventType, double[]> errors = new EnumMap<EventType, double[]>(EventType.class);
|
||||
errors.put(EventType.BASE_SUBSTITUTION, snpErrors);
|
||||
errors.put(EventType.BASE_INSERTION, insertionErrors);
|
||||
errors.put(EventType.BASE_DELETION, deletionsErrors);
|
||||
|
||||
final EnumMap<EventType, byte[]> quals = new EnumMap<EventType, byte[]>(EventType.class);
|
||||
quals.put(EventType.BASE_SUBSTITUTION, baseQuals);
|
||||
quals.put(EventType.BASE_INSERTION, insertionQuals);
|
||||
quals.put(EventType.BASE_DELETION, deletionQuals);
|
||||
|
||||
final GATKSAMRecord read = ArtificialSAMUtils.createArtificialRead(bases, baseQuals, readLength + "M");
|
||||
if ( includeIndelErrors ) {
|
||||
read.setBaseQualities(insertionQuals, EventType.BASE_INSERTION);
|
||||
read.setBaseQualities(deletionQuals, EventType.BASE_DELETION);
|
||||
}
|
||||
|
||||
final ReadRecalibrationInfo info = new ReadRecalibrationInfo(read, covariates, skips, snpErrors, insertionErrors, deletionsErrors);
|
||||
|
||||
Assert.assertEquals(info.getCovariatesValues(), covariates);
|
||||
Assert.assertEquals(info.getRead(), read);
|
||||
|
||||
for ( int i = 0; i < readLength; i++ ) {
|
||||
Assert.assertEquals(info.skip(i), skips[i]);
|
||||
for ( final EventType et : EventType.values() ) {
|
||||
Assert.assertEquals(info.getErrorFraction(et, i), errors.get(et)[i]);
|
||||
final byte expectedQual = et == EventType.BASE_SUBSTITUTION || includeIndelErrors ? quals.get(et)[i]: GATKSAMRecord.DEFAULT_INSERTION_DELETION_QUAL;
|
||||
Assert.assertEquals(info.getQual(et, i), expectedQual);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright (c) 2012 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 org.broadinstitute.sting.utils.recalibration;
|
||||
|
||||
import org.broadinstitute.sting.BaseTest;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public final class EventTypeUnitTest extends BaseTest {
|
||||
@Test
|
||||
public void testEventTypes() {
|
||||
for ( final EventType et : EventType.values() ) {
|
||||
Assert.assertNotNull(et.toString());
|
||||
Assert.assertNotNull(et.prettyPrint());
|
||||
Assert.assertFalse("".equals(et.toString()));
|
||||
Assert.assertFalse("".equals(et.prettyPrint()));
|
||||
Assert.assertEquals(EventType.eventFrom(et.ordinal()), et);
|
||||
Assert.assertEquals(EventType.eventFrom(et.toString()), et);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEventTypesEnumItself() {
|
||||
final Set<String> shortReps = new HashSet<String>();
|
||||
for ( final EventType et : EventType.values() ) {
|
||||
Assert.assertFalse(shortReps.contains(et.toString()), "Short representative for EventType has duplicates for " + et);
|
||||
shortReps.add(et.toString());
|
||||
}
|
||||
Assert.assertEquals(shortReps.size(), EventType.values().length, "Short representatives for EventType aren't unique");
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testBadString() {
|
||||
EventType.eventFrom("asdfhalsdjfalkjsdf");
|
||||
}
|
||||
}
|
||||
|
|
@ -20,7 +20,7 @@ public class RecalibrationReportUnitTest {
|
|||
private static RecalDatum createRandomRecalDatum(int maxObservations, int maxErrors) {
|
||||
final Random random = new Random();
|
||||
final int nObservations = random.nextInt(maxObservations);
|
||||
final int nErrors = random.nextInt(maxErrors);
|
||||
final int nErrors = Math.min(random.nextInt(maxErrors), nObservations);
|
||||
final int qual = random.nextInt(QualityUtils.MAX_QUAL_SCORE);
|
||||
return new RecalDatum(nObservations, nErrors, (byte)qual);
|
||||
}
|
||||
|
|
@ -90,14 +90,14 @@ public class RecalibrationReportUnitTest {
|
|||
final int[] covariates = rc.getKeySet(offset, errorMode);
|
||||
final int randomMax = errorMode == EventType.BASE_SUBSTITUTION ? 10000 : 100000;
|
||||
|
||||
rgTable.put(createRandomRecalDatum(randomMax, 10), covariates[0], errorMode.index);
|
||||
qualTable.put(createRandomRecalDatum(randomMax, 10), covariates[0], covariates[1], errorMode.index);
|
||||
rgTable.put(createRandomRecalDatum(randomMax, 10), covariates[0], errorMode.ordinal());
|
||||
qualTable.put(createRandomRecalDatum(randomMax, 10), covariates[0], covariates[1], errorMode.ordinal());
|
||||
nKeys += 2;
|
||||
for (int j = 0; j < optionalCovariates.size(); j++) {
|
||||
final NestedIntegerArray<RecalDatum> covTable = recalibrationTables.getTable(RecalibrationTables.TableType.OPTIONAL_COVARIATE_TABLES_START.index + j);
|
||||
final int covValue = covariates[RecalibrationTables.TableType.OPTIONAL_COVARIATE_TABLES_START.index + j];
|
||||
if ( covValue >= 0 ) {
|
||||
covTable.put(createRandomRecalDatum(randomMax, 10), covariates[0], covariates[1], covValue, errorMode.index);
|
||||
covTable.put(createRandomRecalDatum(randomMax, 10), covariates[0], covariates[1], covValue, errorMode.ordinal());
|
||||
nKeys++;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue