diff --git a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java index 551d9eff8..8fbfa96e9 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java +++ b/public/java/src/org/broadinstitute/sting/gatk/report/GATKReport.java @@ -30,6 +30,7 @@ import org.broadinstitute.sting.utils.exceptions.UserException; import java.io.*; import java.util.Collection; +import java.util.List; import java.util.TreeMap; /** @@ -141,6 +142,11 @@ public class GATKReport { tables.put(table.getTableName(), table); } + public void addTables(List gatkReportTables) { + for (GATKReportTable table : gatkReportTables) + addTable(table); + } + /** * Return true if table with a given name exists * diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGatherer.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGatherer.java index 3712f0cc5..ecb19c6e6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGatherer.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGatherer.java @@ -26,17 +26,13 @@ package org.broadinstitute.sting.gatk.walkers.bqsr; import org.broadinstitute.sting.commandline.Gatherer; -import org.broadinstitute.sting.gatk.walkers.recalibration.RecalDatumOptimized; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.exceptions.UserException; -import org.broadinstitute.sting.utils.text.XReadLines; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * User: carneiro @@ -45,80 +41,31 @@ import java.util.Map; public class BQSRGatherer extends Gatherer { - - ///////////////////////////// - // Private Member Variables - ///////////////////////////// - private static final String EOF_MARKER = "EOF"; - - private HashMap dataMap = new HashMap(); - - - private void addCSVData (String line) { - String[] covariates = line.split(","); - String key = ""; - RecalDatumOptimized values; - - for (int i = 0; i < covariates.length-3; i++) - key += covariates[i] + ","; - - if (covariates.length < 3) - throw new ReviewedStingException("Line only has 1 covariate : " + line); - - values = new RecalDatumOptimized(Long.parseLong(covariates[covariates.length - 3]), Long.parseLong(covariates[covariates.length - 2])); - - RecalDatumOptimized currentValues = dataMap.get(key); - if (currentValues == null) - dataMap.put(key, values); - else - currentValues.increment(values); - - } + + private static final String EMPTY_INPUT_LIST = "list of inputs files is empty"; + private static final String MISSING_OUTPUT_FILE = "missing output file name"; @Override public void gather(List inputs, File output) { - PrintStream o; + RecalibrationReport generalReport = null; + PrintStream outputFile; try { - o = new PrintStream(output); - } catch ( FileNotFoundException e) { - throw new UserException("File to be output by CountCovariates Gather function was not found"); + outputFile = new PrintStream(output); + } catch(FileNotFoundException e) { + throw new UserException.MissingArgument("output", MISSING_OUTPUT_FILE); } - boolean sawEOF = false; - boolean printedHeader = false; - - // Read input files - for ( File RECAL_FILE : inputs) { - try { - for ( String line : new XReadLines(RECAL_FILE) ) { - if ( EOF_MARKER.equals(line) ) { - sawEOF = true; // sanity check - break; - } - - else if(line.startsWith("#")) { - if (!printedHeader) - o.println(line); - } - - else // Found a line of data - addCSVData(line); // Parse the line and add the data to the HashMap - } - - } catch ( FileNotFoundException e ) { - throw new UserException.CouldNotReadInputFile(RECAL_FILE, "Can not find input file", e); - } - - if ( !sawEOF ) { - final String errorMessage = "No EOF marker was present in the recal covariates table; this could mean that the file is corrupted!"; - throw new UserException.MalformedFile(RECAL_FILE, errorMessage); - } - printedHeader = true; + for (File input : inputs) { + RecalibrationReport inputReport = new RecalibrationReport(input); + if (generalReport == null) + generalReport = inputReport; + else + generalReport.combine(inputReport); } + if (generalReport == null) + throw new ReviewedStingException(EMPTY_INPUT_LIST); - // Write output file from dataMap - for(Map.Entry entry : dataMap.entrySet()) - o.println(entry.getKey() + entry.getValue().outputToCSV()); - o.println("EOF"); + generalReport.calculateEmpiricalAndQuantizedQualities(); + generalReport.output(outputFile); } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRKeyManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRKeyManager.java index 8a9c626eb..bcbda4b20 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRKeyManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRKeyManager.java @@ -25,17 +25,17 @@ import java.util.*; * @since 3/6/12 */ public class BQSRKeyManager { - private List requiredCovariates; - private List optionalCovariates; - private Map covariateNameToIDMap; + private final List requiredCovariates; + private final List optionalCovariates; + private final Map covariateNameToIDMap; - private int nRequiredBits; // Number of bits used to represent the required covariates - private int nOptionalBits; // Number of bits used to represent the standard covaraites - private int nOptionalIDBits; // Number of bits used to represent the optional covariates IDs - private int totalNumberOfBits; // Sum of all of the above plus the event bits + private int nRequiredBits; // Number of bits used to represent the required covariates + private int nOptionalBits; // Number of bits used to represent the standard covaraites + private final int nOptionalIDBits; // Number of bits used to represent the optional covariates IDs + private final int totalNumberOfBits; // Sum of all of the above plus the event bits - private BitSet optionalCovariateMask; // Standard mask for optional covariates bitset - private BitSet optionalCovariateIDMask; // Standard mask for optional covariates order bitset + private final BitSet optionalCovariateMask; // Standard mask for optional covariates bitset + private final BitSet optionalCovariateIDMask; // Standard mask for optional covariates order bitset /** * Initializes the KeyManager with the total number of covariates to use @@ -44,34 +44,34 @@ public class BQSRKeyManager { * @param optionalCovariates the ordered list of optional covariates */ public BQSRKeyManager(List requiredCovariates, List optionalCovariates) { - this.requiredCovariates = new ArrayList(requiredCovariates.size()); // initialize the required covariates list - this.optionalCovariates = new ArrayList(optionalCovariates.size()); // initialize the optional covariates list (size may be 0, it's okay) - this.covariateNameToIDMap = new HashMap(optionalCovariates.size()*2); // the map from covariate name to covariate id (when reading GATK Reports, we get the IDs as names of covariates) + this.requiredCovariates = new ArrayList(requiredCovariates.size()); // initialize the required covariates list + this.optionalCovariates = new ArrayList(optionalCovariates.size()); // initialize the optional covariates list (size may be 0, it's okay) + this.covariateNameToIDMap = new HashMap(optionalCovariates.size()*2); // the map from covariate name to covariate id (when reading GATK Reports, we get the IDs as names of covariates) nRequiredBits = 0; - for (Covariate required : requiredCovariates) { // create a list of required covariates with the extra information for key management - int nBits = required.numberOfBits(); // number of bits used by this covariate - BitSet mask = genericMask(nRequiredBits, nBits); // create a mask for this covariate - this.requiredCovariates.add(new RequiredCovariateInfo(nRequiredBits, nBits, mask, required)); // Create an object for this required covariate + for (Covariate required : requiredCovariates) { // create a list of required covariates with the extra information for key management + int nBits = required.numberOfBits(); // number of bits used by this covariate + BitSet mask = genericMask(nRequiredBits, nBits); // create a mask for this covariate + this.requiredCovariates.add(new RequiredCovariateInfo(nRequiredBits, nBits, mask, required)); // Create an object for this required covariate nRequiredBits += nBits; } short id = 0; nOptionalBits = 0; for (Covariate optional : optionalCovariates) { - int nBits = optional.numberOfBits(); // number of bits used by this covariate - nOptionalBits = Math.max(nOptionalBits, nBits); // optional covariates are represented by the number of bits needed by biggest covariate - BitSet optionalID = BitSetUtils.bitSetFrom(id); // calculate the optional covariate ID for this covariate - this.optionalCovariates.add(new OptionalCovariateInfo(optionalID, optional)); // optional covariates have standardized mask and number of bits, so no need to store in the RequiredCovariateInfo object - String covariateName = optional.getClass().getSimpleName().split("Covariate")[0]; // get the name of the covariate (without the "covariate" part of it) so we can match with the GATKReport + int nBits = optional.numberOfBits(); // number of bits used by this covariate + nOptionalBits = Math.max(nOptionalBits, nBits); // optional covariates are represented by the number of bits needed by biggest covariate + BitSet optionalID = BitSetUtils.bitSetFrom(id); // calculate the optional covariate ID for this covariate + this.optionalCovariates.add(new OptionalCovariateInfo(optionalID, optional)); // optional covariates have standardized mask and number of bits, so no need to store in the RequiredCovariateInfo object + String covariateName = optional.getClass().getSimpleName().split("Covariate")[0]; // get the name of the covariate (without the "covariate" part of it) so we can match with the GATKReport this.covariateNameToIDMap.put(covariateName, id); id++; } - nOptionalIDBits = BitSetUtils.numberOfBitsToRepresent(optionalCovariates.size()); // number of bits used to represent the covariate ID - optionalCovariateMask = genericMask(nRequiredBits, nOptionalBits); // the generic mask to extract optional covariate bits from the combined bitset - optionalCovariateIDMask = genericMask(nRequiredBits + nOptionalBits, nOptionalIDBits); // the generic mask to extract optional covariate ID bits from the combined bitset - totalNumberOfBits = nRequiredBits + nOptionalBits + nOptionalIDBits + bitsInEventType(); // total number of bits used in the final key + nOptionalIDBits = BitSetUtils.numberOfBitsToRepresent(optionalCovariates.size()); // number of bits used to represent the covariate ID + optionalCovariateMask = genericMask(nRequiredBits, nOptionalBits); // the generic mask to extract optional covariate bits from the combined bitset + optionalCovariateIDMask = genericMask(nRequiredBits + nOptionalBits, nOptionalIDBits); // the generic mask to extract optional covariate ID bits from the combined bitset + totalNumberOfBits = nRequiredBits + nOptionalBits + nOptionalIDBits + bitsInEventType(); // total number of bits used in the final key } /** @@ -93,32 +93,32 @@ public class BQSRKeyManager { * @return one key in bitset representation per covariate */ public List bitSetsFromAllKeys(BitSet[] allKeys, EventType eventType) { - List allBitSets = new LinkedList(); // Generate one key per optional covariate + List allBitSets = new LinkedList(); // Generate one key per optional covariate - BitSet eventBitSet = BitSetUtils.bitSetFrom(eventType.index); // create a bitset with the event type - int eventTypeBitIndex = nRequiredBits + nOptionalBits + nOptionalIDBits; // Location in the bit set to add the event type bits + BitSet eventBitSet = BitSetUtils.bitSetFrom(eventType.index); // create a bitset with the event type + int eventTypeBitIndex = nRequiredBits + nOptionalBits + nOptionalIDBits; // Location in the bit set to add the event type bits int covariateIndex = 0; - BitSet requiredKey = new BitSet(nRequiredBits); // This will be a bitset holding all the required keys, to replicate later on + BitSet requiredKey = new BitSet(nRequiredBits); // This will be a bitset holding all the required keys, to replicate later on for (RequiredCovariateInfo infoRequired : requiredCovariates) - addBitSetToKeyAtLocation(requiredKey, allKeys[covariateIndex++], infoRequired.bitsBefore); // Add all the required covariates to the key set + addBitSetToKeyAtLocation(requiredKey, allKeys[covariateIndex++], infoRequired.bitsBefore); // Add all the required covariates to the key set for (OptionalCovariateInfo infoOptional : optionalCovariates) { - BitSet covariateKey = allKeys[covariateIndex++]; // get the bitset from all keys + BitSet covariateKey = allKeys[covariateIndex++]; // get the bitset from all keys if (covariateKey == null) - continue; // do not add nulls to the final set of keys. + continue; // do not add nulls to the final set of keys. - BitSet optionalKey = new BitSet(totalNumberOfBits); // create a new key for this optional covariate - optionalKey.or(requiredKey); // import all the required covariates - addBitSetToKeyAtLocation(optionalKey, covariateKey, nRequiredBits); // add the optional covariate right after the required covariates - addBitSetToKeyAtLocation(optionalKey, infoOptional.covariateID, nRequiredBits + nOptionalBits); // add the optional covariate ID right after the optional covarite - addBitSetToKeyAtLocation(optionalKey, eventBitSet, eventTypeBitIndex); // Add the event type - allBitSets.add(optionalKey); // add this key to the list of keys + BitSet optionalKey = new BitSet(totalNumberOfBits); // create a new key for this optional covariate + optionalKey.or(requiredKey); // import all the required covariates + addBitSetToKeyAtLocation(optionalKey, covariateKey, nRequiredBits); // add the optional covariate right after the required covariates + addBitSetToKeyAtLocation(optionalKey, infoOptional.covariateID, nRequiredBits + nOptionalBits); // add the optional covariate ID right after the optional covarite + addBitSetToKeyAtLocation(optionalKey, eventBitSet, eventTypeBitIndex); // Add the event type + allBitSets.add(optionalKey); // add this key to the list of keys } - if (optionalCovariates.size() == 0) { // special case when we have no optional covariates, add the event type to the required key (our only key) - addBitSetToKeyAtLocation(requiredKey, eventBitSet, eventTypeBitIndex); // Add the event type - allBitSets.add(requiredKey); // add this key to the list of keys + if (optionalCovariates.size() == 0) { // special case when we have no optional covariates, add the event type to the required key (our only key) + addBitSetToKeyAtLocation(requiredKey, eventBitSet, eventTypeBitIndex); // Add the event type + allBitSets.add(requiredKey); // add this key to the list of keys } return allBitSets; @@ -141,25 +141,25 @@ public class BQSRKeyManager { int requiredCovariate = 0; for (RequiredCovariateInfo infoRequired : requiredCovariates) { - BitSet covariateBitSet = infoRequired.covariate.bitSetFromKey(key[requiredCovariate++]); // create a bitset from the object key provided using the required covariate's interface - addBitSetToKeyAtLocation(bitSetKey, covariateBitSet, infoRequired.bitsBefore); // add it to the bitset key + BitSet covariateBitSet = infoRequired.covariate.bitSetFromKey(key[requiredCovariate++]); // create a bitset from the object key provided using the required covariate's interface + addBitSetToKeyAtLocation(bitSetKey, covariateBitSet, infoRequired.bitsBefore); // add it to the bitset key } if (optionalCovariates.size() > 0) { - int optionalCovariate = requiredCovariates.size(); // the optional covariate index in the key array - int covariateIDIndex = optionalCovariate + 1; // the optional covariate ID index is right after the optional covariate's - int covariateID = parseCovariateID(key[covariateIDIndex]); // when reading the GATK Report the ID may come in a String instead of an index - OptionalCovariateInfo infoOptional = optionalCovariates.get(covariateID); // so we can get the optional covariate information + int optionalCovariate = requiredCovariates.size(); // the optional covariate index in the key array + int covariateIDIndex = optionalCovariate + 1; // the optional covariate ID index is right after the optional covariate's + int covariateID = parseCovariateID(key[covariateIDIndex]); // when reading the GATK Report the ID may come in a String instead of an index + OptionalCovariateInfo infoOptional = optionalCovariates.get(covariateID); // so we can get the optional covariate information - BitSet covariateBitSet = infoOptional.covariate.bitSetFromKey(key[optionalCovariate]); // convert the optional covariate key into a bitset using the covariate's interface - addBitSetToKeyAtLocation(bitSetKey, covariateBitSet, nRequiredBits); // add the optional covariate right after the required covariates - addBitSetToKeyAtLocation(bitSetKey, infoOptional.covariateID, nRequiredBits + nOptionalBits); // add the optional covariate ID right after the optional covarite + BitSet covariateBitSet = infoOptional.covariate.bitSetFromKey(key[optionalCovariate]); // convert the optional covariate key into a bitset using the covariate's interface + addBitSetToKeyAtLocation(bitSetKey, covariateBitSet, nRequiredBits); // add the optional covariate right after the required covariates + addBitSetToKeyAtLocation(bitSetKey, infoOptional.covariateID, nRequiredBits + nOptionalBits); // add the optional covariate ID right after the optional covarite } - int eventIndex = key.length - 1; // the event type is always the last key - int eventTypeBitIndex = nRequiredBits + nOptionalBits + nOptionalIDBits; // location in the bit set to add the event type bits - BitSet eventBitSet = bitSetFromEvent((EventType) key[eventIndex]); // get the bit set representation of the event type - addBitSetToKeyAtLocation(bitSetKey, eventBitSet, eventTypeBitIndex); // add the event type + int eventIndex = key.length - 1; // the event type is always the last key + int eventTypeBitIndex = nRequiredBits + nOptionalBits + nOptionalIDBits; // location in the bit set to add the event type bits + BitSet eventBitSet = bitSetFromEvent((EventType) key[eventIndex]); // get the bit set representation of the event type + addBitSetToKeyAtLocation(bitSetKey, eventBitSet, eventTypeBitIndex); // add the event type return bitSetKey; } @@ -186,19 +186,19 @@ public class BQSRKeyManager { public List keySetFrom(BitSet key) { List objectKeys = new ArrayList(); for (RequiredCovariateInfo info : requiredCovariates) { - BitSet covariateBitSet = extractBitSetFromKey(key, info.mask, info.bitsBefore); // get the covariate's bitset - objectKeys.add(info.covariate.keyFromBitSet(covariateBitSet)); // convert the bitset to object using covariate's interface + BitSet covariateBitSet = extractBitSetFromKey(key, info.mask, info.bitsBefore); // get the covariate's bitset + objectKeys.add(info.covariate.keyFromBitSet(covariateBitSet)); // convert the bitset to object using covariate's interface } if (optionalCovariates.size() > 0) { - BitSet covBitSet = extractBitSetFromKey(key, optionalCovariateMask, nRequiredBits); // mask out the covariate bit set - BitSet idbs = extractBitSetFromKey(key, optionalCovariateIDMask, nRequiredBits + nOptionalBits);// mask out the covariate order (to identify which covariate this is) - short id = BitSetUtils.shortFrom(idbs); // covert the id bitset into a short - Covariate covariate = optionalCovariates.get(id).covariate; // get the corresponding optional covariate object - objectKeys.add(covariate.keyFromBitSet(covBitSet)); // add the optional covariate to the key set - objectKeys.add(covariate.getClass().getSimpleName().split("Covariate")[0]); // add the covariate name using the id + BitSet covBitSet = extractBitSetFromKey(key, optionalCovariateMask, nRequiredBits); // mask out the covariate bit set + BitSet idbs = extractBitSetFromKey(key, optionalCovariateIDMask, nRequiredBits + nOptionalBits); // mask out the covariate order (to identify which covariate this is) + short id = BitSetUtils.shortFrom(idbs); // covert the id bitset into a short + Covariate covariate = optionalCovariates.get(id).covariate; // get the corresponding optional covariate object + objectKeys.add(covariate.keyFromBitSet(covBitSet)); // add the optional covariate to the key set + objectKeys.add(covariate.getClass().getSimpleName().split("Covariate")[0]); // add the covariate name using the id } - objectKeys.add(eventFromBitSet(key)); // add the event type object to the key set + objectKeys.add(eventFromBitSet(key)); // add the event type object to the key set return objectKeys; } @@ -227,7 +227,7 @@ public class BQSRKeyManager { private BitSet chopNBitsFrom(BitSet key, int n) { BitSet choppedKey = new BitSet(); for (int i = key.nextSetBit(0); i >= 0; i = key.nextSetBit(i + 1)) - choppedKey.set(i - n); // Set every bit translocated to the beginning of the BitSet + choppedKey.set(i - n); // Set every bit translocated to the beginning of the BitSet return choppedKey; } @@ -269,7 +269,7 @@ public class BQSRKeyManager { private void addBitSetToKeyAtLocation(BitSet key, BitSet bitSet, int location) { for (int j = bitSet.nextSetBit(0); j >= 0; j = bitSet.nextSetBit(j + 1)) - key.set(j + location); // translate the bits set in the key to their corresponding position in the full key + key.set(j + location); // translate the bits set in the key to their corresponding position in the full key } private BitSet extractBitSetFromKey (BitSet key, BitSet mask, int leadingBits) { @@ -282,22 +282,20 @@ public class BQSRKeyManager { * Aggregate information for each Covariate */ class RequiredCovariateInfo { - public int bitsBefore; // number of bits before this covariate in the combined bitset key - public int nBits; // number of bits used by this covariate (cached access to covariate.nBits()) - public BitSet mask; // the mask to pull out this covariate from the combined bitset key ( a mask made from bitsBefore and nBits ) - public Covariate covariate; // this allows reverse lookup of the Covariates in order + public final int bitsBefore; // number of bits before this covariate in the combined bitset key + public final BitSet mask; // the mask to pull out this covariate from the combined bitset key ( a mask made from bitsBefore and nBits ) + public final Covariate covariate; // this allows reverse lookup of the Covariates in order RequiredCovariateInfo(int bitsBefore, int nBits, BitSet mask, Covariate covariate) { this.bitsBefore = bitsBefore; - this.nBits = nBits; this.mask = mask; this.covariate = covariate; } } class OptionalCovariateInfo { - public BitSet covariateID; // cache the covariate ID - public Covariate covariate; + public final BitSet covariateID; // cache the covariate ID + public final Covariate covariate; OptionalCovariateInfo(BitSet covariateID, Covariate covariate) { this.covariateID = covariateID; diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/QuantizationInfo.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/QuantizationInfo.java new file mode 100644 index 000000000..393230ee4 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/QuantizationInfo.java @@ -0,0 +1,74 @@ +package org.broadinstitute.sting.gatk.walkers.bqsr; + +import org.broadinstitute.sting.gatk.report.GATKReportTable; +import org.broadinstitute.sting.utils.QualityUtils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; +import org.broadinstitute.sting.utils.recalibration.QualQuantizer; + +import java.util.Arrays; +import java.util.BitSet; +import java.util.List; +import java.util.Map; + +/** + * Class that encapsulates the information necessary for quality score quantization for BQSR + * + * @author carneiro + * @since 3/26/12 + */ +public class QuantizationInfo { + private List quantizedQuals; + private List empiricalQualCounts; + + public QuantizationInfo(List quantizedQuals, List empiricalQualCounts) { + this.quantizedQuals = quantizedQuals; + this.empiricalQualCounts = empiricalQualCounts; + } + + public QuantizationInfo(Map> keysAndTablesMap, int nLevels) { + final Long [] qualHistogram = new Long[QualityUtils.MAX_QUAL_SCORE+1]; // create a histogram with the empirical quality distribution + for (int i = 0; i < qualHistogram.length; i++) + qualHistogram[i] = 0L; + + Map qualTable = null; // look for the quality score table + for (Map.Entry> entry : keysAndTablesMap.entrySet()) { + BQSRKeyManager keyManager = entry.getKey(); + if (keyManager.getRequiredCovariates().size() == 2) // it should be the only one with 2 required covaraites + qualTable = entry.getValue(); + } + + if (qualTable == null) + throw new ReviewedStingException("Could not find QualityScore table."); + + for (RecalDatum datum : qualTable.values()) { + int empiricalQual = (int) Math.round(datum.getEmpiricalQuality()); // convert the empirical quality to an integer ( it is already capped by MAX_QUAL ) + long nObservations = datum.numObservations; + qualHistogram[empiricalQual] += nObservations; // add the number of observations for every key + } + empiricalQualCounts = Arrays.asList(qualHistogram); // histogram with the number of observations of the empirical qualities + quantizeQualityScores(nLevels); + } + + + public void quantizeQualityScores(int nLevels) { + QualQuantizer quantizer = new QualQuantizer(empiricalQualCounts, nLevels, QualityUtils.MIN_USABLE_Q_SCORE); // quantize the qualities to the desired number of levels + quantizedQuals = quantizer.getOriginalToQuantizedMap(); // map with the original to quantized qual map (using the standard number of levels in the RAC) + } + + public List getQuantizedQuals() { + return quantizedQuals; + } + + public GATKReportTable generateReportTable() { + GATKReportTable quantizedTable = new GATKReportTable(RecalDataManager.QUANTIZED_REPORT_TABLE_TITLE, "Quality quantization map"); + quantizedTable.addPrimaryKey(RecalDataManager.QUALITY_SCORE_COLUMN_NAME); + quantizedTable.addColumn(RecalDataManager.QUANTIZED_COUNT_COLUMN_NAME, 0L); + quantizedTable.addColumn(RecalDataManager.QUANTIZED_VALUE_COLUMN_NAME, (byte) 0); + + for (int qual = 0; qual <= QualityUtils.MAX_QUAL_SCORE; qual++) { + quantizedTable.set(qual, RecalDataManager.QUANTIZED_COUNT_COLUMN_NAME, empiricalQualCounts.get(qual)); + quantizedTable.set(qual, RecalDataManager.QUANTIZED_VALUE_COLUMN_NAME, quantizedQuals.get(qual)); + } + return quantizedTable; + } +} diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDataManager.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDataManager.java index a2edd2806..8e8523e88 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDataManager.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDataManager.java @@ -28,7 +28,8 @@ package org.broadinstitute.sting.gatk.walkers.bqsr; import net.sf.samtools.SAMUtils; import org.apache.log4j.Logger; import org.broadinstitute.sting.gatk.GenomeAnalysisEngine; -import org.broadinstitute.sting.gatk.walkers.recalibration.EmpiricalQual; +import org.broadinstitute.sting.gatk.report.GATKReport; +import org.broadinstitute.sting.gatk.report.GATKReportTable; import org.broadinstitute.sting.utils.BaseUtils; import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.Utils; @@ -42,6 +43,7 @@ import org.broadinstitute.sting.utils.sam.GATKSAMReadGroupRecord; import org.broadinstitute.sting.utils.sam.GATKSAMRecord; import org.broadinstitute.sting.utils.sam.ReadUtils; +import java.io.PrintStream; import java.util.*; /** @@ -71,13 +73,14 @@ public class RecalDataManager { public final static String QUALITY_SCORE_COLUMN_NAME = "QualityScore"; public final static String COVARIATE_VALUE_COLUMN_NAME = "CovariateValue"; public final static String COVARIATE_NAME_COLUMN_NAME = "CovariateName"; + public final static String NUMBER_OBSERVATIONS_COLUMN_NAME = "Observations"; + public final static String NUMBER_ERRORS_COLUMN_NAME = "Errors"; - public final static String COLOR_SPACE_QUAL_ATTRIBUTE_TAG = "CQ"; // The tag that holds the color space quality scores for SOLID bams - public final static String COLOR_SPACE_ATTRIBUTE_TAG = "CS"; // The tag that holds the color space for SOLID bams - public final static String COLOR_SPACE_INCONSISTENCY_TAG = "ZC"; // A new tag made up for the recalibrator which will hold an array of ints which say if this base is inconsistent with its color + private final static String COLOR_SPACE_QUAL_ATTRIBUTE_TAG = "CQ"; // The tag that holds the color space quality scores for SOLID bams + private final static String COLOR_SPACE_ATTRIBUTE_TAG = "CS"; // The tag that holds the color space for SOLID bams + private final static String COLOR_SPACE_INCONSISTENCY_TAG = "ZC"; // A new tag made up for the recalibrator which will hold an array of ints which say if this base is inconsistent with its color private static boolean warnUserNullPlatform = false; - public enum SOLID_RECAL_MODE { /** * Treat reference inserted bases as reference matching bases. Very unsafe! @@ -136,25 +139,38 @@ public class RecalDataManager { } } - public static void listAvailableCovariates(Logger logger) { - // Get a list of all available covariates - final List> covariateClasses = new PluginManager(Covariate.class).getPlugins(); - // Print and exit if that's what was requested - logger.info("Available covariates:"); - for (Class covClass : covariateClasses) - logger.info(covClass.getSimpleName()); - logger.info(""); + /** + * Initializes the recalibration table -> key manager map + * + * @param requiredCovariates list of required covariates (in order) + * @param optionalCovariates list of optional covariates (in order) + * @return a map with each key manager and it's corresponding recalibration table properly initialized + */ + public static LinkedHashMap> initializeTables(ArrayList requiredCovariates, ArrayList optionalCovariates) { + final LinkedHashMap> tablesAndKeysMap = new LinkedHashMap>(); + ArrayList requiredCovariatesToAdd = new ArrayList(requiredCovariates.size() + 1); // incrementally add the covariates to create the recal tables with 1, 2 and 3 covariates. + ArrayList optionalCovariatesToAdd = new ArrayList(); // initialize an empty array of optional covariates to create the first few tables + for (Covariate covariate : requiredCovariates) { + requiredCovariatesToAdd.add(covariate); + final Map recalTable = new HashMap(QualityUtils.MAX_QUAL_SCORE); // initializing a new recal table for each required covariate (cumulatively) + final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariatesToAdd, optionalCovariatesToAdd); // initializing it's corresponding key manager + tablesAndKeysMap.put(keyManager, recalTable); // adding the pair table+key to the map + } + final Map recalTable = new HashMap(Short.MAX_VALUE); // initializing a new recal table to hold all optional covariates + final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariates, optionalCovariates); // initializing it's corresponding key manager + tablesAndKeysMap.put(keyManager, recalTable); // adding the pair table+key to the map + return tablesAndKeysMap; } /** * Generates two lists : required covariates and optional covariates based on the user's requests. - * + * * Performs the following tasks in order: * 1. Adds all requierd covariates in order * 2. Check if the user asked to use the standard covariates and adds them all if that's the case - * 3. Adds all covariates requested by the user that were not already added by the two previous steps - * + * 3. Adds all covariates requested by the user that were not already added by the two previous steps + * * @param argumentCollection the argument collection object for the recalibration walker * @return a pair of ordered lists : required covariates (first) and optional covariates (second) */ @@ -194,52 +210,102 @@ public class RecalDataManager { return new Pair, ArrayList>(requiredCovariates, optionalCovariates); } - /** - * Initializes the recalibration table -> key manager map - * - * @param requiredCovariates list of required covariates (in order) - * @param optionalCovariates list of optional covariates (in order) - * @return a map with each key manager and it's corresponding recalibration table properly initialized - */ - public static LinkedHashMap> initializeTables(ArrayList requiredCovariates, ArrayList optionalCovariates) { - final LinkedHashMap> tablesAndKeysMap = new LinkedHashMap>(); - ArrayList requiredCovariatesToAdd = new ArrayList(requiredCovariates.size() + 1); // incrementally add the covariates to create the recal tables with 1, 2 and 3 covariates. - ArrayList optionalCovariatesToAdd = new ArrayList(); // initialize an empty array of optional covariates to create the first few tables - for (Covariate covariate : requiredCovariates) { - requiredCovariatesToAdd.add(covariate); - final Map recalTable = new HashMap(QualityUtils.MAX_QUAL_SCORE); // initializing a new recal table for each required covariate (cumulatively) - final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariatesToAdd, optionalCovariatesToAdd); // initializing it's corresponding key manager - tablesAndKeysMap.put(keyManager, recalTable); // adding the pair table+key to the map - } - final Map recalTable = new HashMap(Short.MAX_VALUE); // initializing a new recal table to hold all optional covariates - final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariates, optionalCovariates); // initializing it's corresponding key manager - tablesAndKeysMap.put(keyManager, recalTable); // adding the pair table+key to the map - return tablesAndKeysMap; + public static void listAvailableCovariates(Logger logger) { + // Get a list of all available covariates + final List> covariateClasses = new PluginManager(Covariate.class).getPlugins(); + + // Print and exit if that's what was requested + logger.info("Available covariates:"); + for (Class covClass : covariateClasses) + logger.info(covClass.getSimpleName()); + logger.info(""); } - /** - * Initializes the table -> key manager map (unfortunate copy of the above code with minor modifications to accomodate the different return types (RecalDatum vs EmpiricalQual objects) - * - * @param requiredCovariates list of required covariates (in order) - * @param optionalCovariates list of optional covariates (in order) - * @return a map with each key manager and it's corresponding recalibration table properly initialized - */ - public static LinkedHashMap> initializeEmpiricalTables(ArrayList requiredCovariates, ArrayList optionalCovariates) { - final LinkedHashMap> tablesAndKeysMap = new LinkedHashMap>(); - ArrayList requiredCovariatesToAdd = new ArrayList(requiredCovariates.size() + 1); // incrementally add the covariates to create the recal tables with 1, 2 and 3 covariates. - ArrayList optionalCovariatesToAdd = new ArrayList(); // initialize an empty array of optional covariates to create the first few tables - for (Covariate covariate : requiredCovariates) { - requiredCovariatesToAdd.add(covariate); - final Map recalTable = new HashMap(QualityUtils.MAX_QUAL_SCORE); // initializing a new recal table for each required covariate (cumulatively) - final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariatesToAdd, optionalCovariatesToAdd); // initializing it's corresponding key manager - tablesAndKeysMap.put(keyManager, recalTable); // adding the pair table+key to the map + public static List generateReportTables(Map> keysAndTablesMap) { + List result = new LinkedList(); + int tableIndex = 0; + for (Map.Entry> entry : keysAndTablesMap.entrySet()) { + BQSRKeyManager keyManager = entry.getKey(); + Map recalTable = entry.getValue(); + + GATKReportTable reportTable = new GATKReportTable("RecalTable" + tableIndex++, ""); + final Pair covariateValue = new Pair(RecalDataManager.COVARIATE_VALUE_COLUMN_NAME, "%s"); + final Pair covariateName = new Pair(RecalDataManager.COVARIATE_NAME_COLUMN_NAME, "%s"); + final Pair eventType = new Pair(RecalDataManager.EVENT_TYPE_COLUMN_NAME, "%s"); + final Pair empiricalQuality = new Pair(RecalDataManager.EMPIRICAL_QUALITY_COLUMN_NAME, "%.2f"); + final Pair estimatedQReported = new Pair(RecalDataManager.ESTIMATED_Q_REPORTED_COLUMN_NAME, "%.2f"); + final Pair nObservations = new Pair(RecalDataManager.NUMBER_OBSERVATIONS_COLUMN_NAME, "%d"); + final Pair nErrors = new Pair(RecalDataManager.NUMBER_ERRORS_COLUMN_NAME, "%d"); + + long primaryKey = 0L; + + List requiredList = keyManager.getRequiredCovariates(); // ask the key manager what required covariates were used in this recal table + List optionalList = keyManager.getOptionalCovariates(); // ask the key manager what optional covariates were used in this recal table + + ArrayList> columnNames = new ArrayList>(); // initialize the array to hold the column names + + for (Covariate covariate : requiredList) { + String name = covariate.getClass().getSimpleName().split("Covariate")[0]; // get the covariate names and put them in order + columnNames.add(new Pair(name, "%s")); // save the required covariate name so we can reference it in the future + } + + if (optionalList.size() > 0) { + columnNames.add(covariateValue); + columnNames.add(covariateName); + } + + columnNames.add(eventType); // the order of these column names is important here + columnNames.add(empiricalQuality); + columnNames.add(estimatedQReported); + columnNames.add(nObservations); + columnNames.add(nErrors); + + + reportTable.addPrimaryKey("PrimaryKey", false); // every table must have a primary key (hidden) + for (Pair columnName : columnNames) + reportTable.addColumn(columnName.getFirst(), true, columnName.getSecond()); // every table must have the event type + + for (Map.Entry recalTableEntry : recalTable.entrySet()) { // create a map with column name => key value for all covariate keys + BitSet bitSetKey = recalTableEntry.getKey(); + Map columnData = new HashMap(columnNames.size()); + Iterator> iterator = columnNames.iterator(); + for (Object key : keyManager.keySetFrom(bitSetKey)) { + String columnName = iterator.next().getFirst(); + columnData.put(columnName, key); + } + RecalDatum datum = recalTableEntry.getValue(); + columnData.put(iterator.next().getFirst(), datum.getEmpiricalQuality()); // iterator.next() gives the column name for Empirical Quality + columnData.put(iterator.next().getFirst(), Math.round(datum.getEstimatedQReported())); // iterator.next() gives the column name for EstimatedQReported + columnData.put(iterator.next().getFirst(), datum.numObservations); + columnData.put(iterator.next().getFirst(), datum.numMismatches); + + for (Map.Entry dataEntry : columnData.entrySet()) { + String columnName = dataEntry.getKey(); + Object value = dataEntry.getValue(); + reportTable.set(primaryKey, columnName, value.toString()); + } + primaryKey++; + } + result.add(reportTable); } - final Map recalTable = new HashMap(Short.MAX_VALUE); // initializing a new recal table to hold all optional covariates - final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariates, optionalCovariates); // initializing it's corresponding key manager - tablesAndKeysMap.put(keyManager, recalTable); // adding the pair table+key to the map - return tablesAndKeysMap; + return result; } + public static void outputRecalibrationReport(RecalibrationArgumentCollection RAC, QuantizationInfo quantizationInfo, Map> keysAndTablesMap, PrintStream outputFile) { + outputRecalibrationReport(RAC.generateReportTable(), quantizationInfo.generateReportTable(), generateReportTables(keysAndTablesMap), outputFile); + } + + public static void outputRecalibrationReport(GATKReportTable argumentTable, QuantizationInfo quantizationInfo, LinkedHashMap> keysAndTablesMap, PrintStream outputFile) { + outputRecalibrationReport(argumentTable, quantizationInfo.generateReportTable(), generateReportTables(keysAndTablesMap), outputFile); + } + + private static void outputRecalibrationReport(GATKReportTable argumentTable, GATKReportTable quantizationTable, List recalTables, PrintStream outputFile) { + GATKReport report = new GATKReport(); + report.addTable(argumentTable); + report.addTable(quantizationTable); + report.addTables(recalTables); + report.print(outputFile); + } /** * Section of code shared between the two recalibration walkers which uses the command line arguments to adjust attributes of the read such as quals or platform string diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDatum.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDatum.java index b7f88c524..d197cc6b6 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDatum.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalDatum.java @@ -38,6 +38,8 @@ public class RecalDatum extends RecalDatumOptimized { private double estimatedQReported; // estimated reported quality score based on combined data's individual q-reporteds and number of observations private double empiricalQuality; // the empirical quality for datums that have been collapsed together (by read group and reported quality, for example) + private static final int SMOOTHING_CONSTANT = 1; // used when calculating empirical qualities to avoid division by zero + //--------------------------------------------------------------------------------------------------------------- // // constructors @@ -75,7 +77,6 @@ public class RecalDatum extends RecalDatumOptimized { final double sumErrors = this.calcExpectedErrors() + other.calcExpectedErrors(); this.increment(other.numObservations, other.numMismatches); this.estimatedQReported = -10 * Math.log10(sumErrors / (double) this.numObservations); - //if( this.estimatedQReported > QualityUtils.MAX_REASONABLE_Q_SCORE ) { this.estimatedQReported = QualityUtils.MAX_REASONABLE_Q_SCORE; } } //--------------------------------------------------------------------------------------------------------------- @@ -84,8 +85,8 @@ public class RecalDatum extends RecalDatumOptimized { // //--------------------------------------------------------------------------------------------------------------- - public final void calcCombinedEmpiricalQuality(final int smoothing, final int maxQual) { - this.empiricalQuality = empiricalQualDouble(smoothing, maxQual); // cache the value so we don't call log over and over again + public final void calcCombinedEmpiricalQuality(final int maxQual) { + this.empiricalQuality = empiricalQualDouble(SMOOTHING_CONSTANT, maxQual); // cache the value so we don't call log over and over again } public final void calcEstimatedReportedQuality() { @@ -106,6 +107,11 @@ public class RecalDatum extends RecalDatumOptimized { return empiricalQuality; } + public final void resetCalculatedQualities() { + empiricalQuality = 0.0; + estimatedQReported = 0.0; + } + private double calcExpectedErrors() { return (double) this.numObservations * qualToErrorProb(estimatedQReported); } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalibrationArgumentCollection.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalibrationArgumentCollection.java index a33ba8bd0..07cb8d7a8 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalibrationArgumentCollection.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalibrationArgumentCollection.java @@ -27,6 +27,8 @@ package org.broadinstitute.sting.gatk.walkers.bqsr; import org.broad.tribble.Feature; import org.broadinstitute.sting.commandline.*; +import org.broadinstitute.sting.gatk.report.GATKReportTable; +import org.broadinstitute.sting.utils.Utils; import java.io.PrintStream; import java.util.Collections; @@ -156,5 +158,25 @@ public class RecalibrationArgumentCollection { @Argument(fullName = "quantizing_levels", shortName = "ql", required = false, doc = "number of distinct quality scores in the quantized output") public int QUANTIZING_LEVELS = 16; + public GATKReportTable generateReportTable() { + GATKReportTable argumentsTable = new GATKReportTable("Arguments", "Recalibration argument collection values used in this run"); + argumentsTable.addPrimaryKey("Argument"); + argumentsTable.addColumn(RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, "null"); + argumentsTable.set("covariate", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, (COVARIATES == null) ? "null" : Utils.join(",", COVARIATES)); + argumentsTable.set("standard_covs", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, USE_STANDARD_COVARIATES); + argumentsTable.set("run_without_dbsnp", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, RUN_WITHOUT_DBSNP); + argumentsTable.set("solid_recal_mode", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, SOLID_RECAL_MODE); + argumentsTable.set("solid_nocall_strategy", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, SOLID_NOCALL_STRATEGY); + argumentsTable.set("mismatches_context_size", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, MISMATCHES_CONTEXT_SIZE); + argumentsTable.set("insertions_context_size", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, INSERTIONS_CONTEXT_SIZE); + argumentsTable.set("deletions_context_size", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, DELETIONS_CONTEXT_SIZE); + argumentsTable.set("mismatches_default_quality", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, MISMATCHES_DEFAULT_QUALITY); + argumentsTable.set("insertions_default_quality", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, INSERTIONS_DEFAULT_QUALITY); + argumentsTable.set("low_quality_tail", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, LOW_QUAL_TAIL); + argumentsTable.set("default_platform", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, DEFAULT_PLATFORM); + argumentsTable.set("force_platform", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, FORCE_PLATFORM); + argumentsTable.set("quantizing_levels", RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME, QUANTIZING_LEVELS); + return argumentsTable; + } } diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalibrationReport.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalibrationReport.java new file mode 100644 index 000000000..ce00240b8 --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/bqsr/RecalibrationReport.java @@ -0,0 +1,290 @@ +package org.broadinstitute.sting.gatk.walkers.bqsr; + +import org.broadinstitute.sting.gatk.report.GATKReport; +import org.broadinstitute.sting.gatk.report.GATKReportTable; +import org.broadinstitute.sting.utils.QualityUtils; +import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.io.File; +import java.io.PrintStream; +import java.util.*; + +/** + * This class has all the static functionality for reading a recalibration report file into memory. + * + * @author carneiro + * @since 3/26/12 + */ +public class RecalibrationReport { + private QuantizationInfo quantizationInfo; // histogram containing the counts for qual quantization (calculated after recalibration is done) + private LinkedHashMap> keysAndTablesMap; // quick access reference to the read group table and its key manager + private ArrayList requestedCovariates = new ArrayList(); // list of all covariates to be used in this calculation + + GATKReportTable argumentTable; // keep the argument table untouched just for output purposes + RecalibrationArgumentCollection RAC; // necessary for quantizing qualities with the same parameter | todo -- this should be a new parameter, not necessarily coming from the original table parameter list + + private static String UNRECOGNIZED_REPORT_TABLE_EXCEPTION = "Unrecognized table. Did you add an extra required covariate? This is a hard check that needs propagate through the code"; + + public RecalibrationReport(final File RECAL_FILE) { + GATKReport report = new GATKReport(RECAL_FILE); + + argumentTable = report.getTable(RecalDataManager.ARGUMENT_REPORT_TABLE_TITLE); + RAC = initializeArgumentCollectionTable(argumentTable); + + GATKReportTable quantizedTable = report.getTable(RecalDataManager.QUANTIZED_REPORT_TABLE_TITLE); + quantizationInfo = initializeQuantizationTable(quantizedTable); + + Pair, ArrayList> covariates = RecalDataManager.initializeCovariates(RAC); // initialize the required and optional covariates + ArrayList requiredCovariates = covariates.getFirst(); + ArrayList optionalCovariates = covariates.getSecond(); + requestedCovariates.addAll(requiredCovariates); // add all required covariates to the list of requested covariates + requestedCovariates.addAll(optionalCovariates); // add all optional covariates to the list of requested covariates + + for (Covariate cov : requestedCovariates) + cov.initialize(RAC); // initialize any covariate member variables using the shared argument collection + + keysAndTablesMap = new LinkedHashMap>(); + ArrayList requiredCovariatesToAdd = new ArrayList(requiredCovariates.size()); // incrementally add the covariates to create the recal tables with 1, 2 and 3 covariates. + ArrayList optionalCovariatesToAdd = new ArrayList(); // initialize an empty array of optional covariates to create the first few tables + for (Covariate covariate : requiredCovariates) { + requiredCovariatesToAdd.add(covariate); + final Map table; // initializing a new recal table for each required covariate (cumulatively) + final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariatesToAdd, optionalCovariatesToAdd); // initializing it's corresponding key manager + + int nRequiredCovariates = requiredCovariatesToAdd.size(); // the number of required covariates defines which table we are looking at (RG, QUAL or ALL_COVARIATES) + if (nRequiredCovariates == 1) { // if there is only one required covariate, this is the read group table + final GATKReportTable reportTable = report.getTable(RecalDataManager.READGROUP_REPORT_TABLE_TITLE); + table = parseReadGroupTable(keyManager, reportTable); + } + else if (nRequiredCovariates == 2 && optionalCovariatesToAdd.isEmpty()) { // when we have both required covariates and no optional covariates we're at the QUAL table + final GATKReportTable reportTable = report.getTable(RecalDataManager.QUALITY_SCORE_REPORT_TABLE_TITLE); + table = parseQualityScoreTable(keyManager, reportTable); + } + else + throw new ReviewedStingException(UNRECOGNIZED_REPORT_TABLE_EXCEPTION); + + keysAndTablesMap.put(keyManager, table); // adding the pair key+table to the map + } + + + final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariates, optionalCovariates); // initializing it's corresponding key manager + final GATKReportTable reportTable = report.getTable(RecalDataManager.ALL_COVARIATES_REPORT_TABLE_TITLE); + final Map table = parseAllCovariatesTable(keyManager, reportTable); + keysAndTablesMap.put(keyManager, table); + } + + /** + * Combines two recalibration reports by adding all observations and errors + * + * Note: This method DOES NOT recalculate the empirical qualities and quantized qualities. You have to recalculate them + * after combining. The reason for not calculating it is because this function is inteded for combining a series of + * recalibration reports, and it only makes sense to calculate the empirical qualities and quantized qualities after all + * the recalibration reports have been combined. Having the user recalculate when appropriate, makes this method faster + * + * Note2: The empirical quality reported, however, is recalculated given its simplicity. + * + * @param other the recalibration report to combine with this one + */ + public void combine(RecalibrationReport other) { + Iterator> tableIterator = keysAndTablesMap.values().iterator(); // because these are ordered (linked hashmaps) we can iterate over the 'this' and do a for loop on the 'other' tables and be sure that we are looking at the equivalent tables on both objects + for (Map otherTable : other.getKeysAndTablesMap().values()) { // iterate over all tables for 'other' + Map thisTable = tableIterator.next(); // iterate over all tables for 'this' + for (Map.Entry entry : otherTable.entrySet()) { // for each table, go through all the entries in the 'other' dataset to update 'this' dataset + BitSet key = entry.getKey(); + RecalDatum otherDatum = entry.getValue(); + RecalDatum thisDatum = thisTable.get(key); + thisDatum.increment(otherDatum); // add the two datum objects into 'this' + thisDatum.resetCalculatedQualities(); // reset the empirical quality to make sure the user doesn't forget to recalculate it + } + } + } + + + public QuantizationInfo getQuantizationInfo() { + return quantizationInfo; + } + + public LinkedHashMap> getKeysAndTablesMap() { + return keysAndTablesMap; + } + + public ArrayList getRequestedCovariates() { + return requestedCovariates; + } + + /** + * Compiles the list of keys for the Covariates table and uses the shared parsing utility to produce the actual table + * + * @param keyManager the key manager for this table + * @param reportTable the GATKReport table containing data for this table + * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. + */ + private Map parseAllCovariatesTable(BQSRKeyManager keyManager, GATKReportTable reportTable) { + ArrayList columnNamesOrderedList = new ArrayList(5); + columnNamesOrderedList.add(RecalDataManager.READGROUP_COLUMN_NAME); + columnNamesOrderedList.add(RecalDataManager.QUALITY_SCORE_COLUMN_NAME); + columnNamesOrderedList.add(RecalDataManager.COVARIATE_VALUE_COLUMN_NAME); + columnNamesOrderedList.add(RecalDataManager.COVARIATE_NAME_COLUMN_NAME); + columnNamesOrderedList.add(RecalDataManager.EVENT_TYPE_COLUMN_NAME); + return genericRecalTableParsing(keyManager, reportTable, columnNamesOrderedList); + } + + /** + * + * Compiles the list of keys for the QualityScore table and uses the shared parsing utility to produce the actual table + * @param keyManager the key manager for this table + * @param reportTable the GATKReport table containing data for this table + * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. + */ + private Map parseQualityScoreTable(BQSRKeyManager keyManager, GATKReportTable reportTable) { + ArrayList columnNamesOrderedList = new ArrayList(3); + columnNamesOrderedList.add(RecalDataManager.READGROUP_COLUMN_NAME); + columnNamesOrderedList.add(RecalDataManager.QUALITY_SCORE_COLUMN_NAME); + columnNamesOrderedList.add(RecalDataManager.EVENT_TYPE_COLUMN_NAME); + return genericRecalTableParsing(keyManager, reportTable, columnNamesOrderedList); + } + + /** + * Compiles the list of keys for the ReadGroup table and uses the shared parsing utility to produce the actual table + * + * @param keyManager the key manager for this table + * @param reportTable the GATKReport table containing data for this table + * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. + */ + private Map parseReadGroupTable(BQSRKeyManager keyManager, GATKReportTable reportTable) { + ArrayList columnNamesOrderedList = new ArrayList(2); + columnNamesOrderedList.add(RecalDataManager.READGROUP_COLUMN_NAME); + columnNamesOrderedList.add(RecalDataManager.EVENT_TYPE_COLUMN_NAME); + return genericRecalTableParsing(keyManager, reportTable, columnNamesOrderedList); + } + + /** + * Shared parsing functionality for all tables. + * + * @param keyManager the key manager for this table + * @param reportTable the GATKReport table containing data for this table + * @param columnNamesOrderedList a list of columns to read from the report table and build as key for this particular table + * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. + */ + private Map genericRecalTableParsing(BQSRKeyManager keyManager, GATKReportTable reportTable, ArrayList columnNamesOrderedList) { + Map result = new HashMap(reportTable.getNumRows()*2); + + for (Object primaryKey : reportTable.getPrimaryKeys()) { + int nKeys = columnNamesOrderedList.size(); + Object [] keySet = new Object[nKeys]; + for (int i = 0; i < nKeys; i++) + keySet[i] = reportTable.get(primaryKey, columnNamesOrderedList.get(i)); // all these objects are okay in String format, the key manager will handle them correctly (except for the event type (see below) + keySet[keySet.length-1] = EventType.eventFrom((String) keySet[keySet.length-1]); // the last key is always the event type. We convert the string ("M", "I" or "D") to an enum object (necessary for the key manager). + BitSet bitKey = keyManager.bitSetFromKey(keySet); + + long nObservations = (Long) reportTable.get(primaryKey, RecalDataManager.NUMBER_OBSERVATIONS_COLUMN_NAME); + long nErrors = (Long) reportTable.get(primaryKey, RecalDataManager.NUMBER_ERRORS_COLUMN_NAME); + double estimatedQReported = (Double) reportTable.get(primaryKey, RecalDataManager.ESTIMATED_Q_REPORTED_COLUMN_NAME); + double empiricalQuality = (Double) reportTable.get(primaryKey, RecalDataManager.EMPIRICAL_QUALITY_COLUMN_NAME); + RecalDatum recalDatum = new RecalDatum(nObservations, nErrors, estimatedQReported, empiricalQuality); + + result.put(bitKey, recalDatum); + } + return result; + } + + /** + * Parses the quantization table from the GATK Report and turns it into a map of original => quantized quality scores + * + * @param table the GATKReportTable containing the quantization mappings + * @return an ArrayList with the quantization mappings from 0 to MAX_QUAL_SCORE + */ + private QuantizationInfo initializeQuantizationTable(GATKReportTable table) { + Byte[] quals = new Byte[QualityUtils.MAX_QUAL_SCORE + 1]; + Long[] counts = new Long[QualityUtils.MAX_QUAL_SCORE + 1]; + for (Object primaryKey : table.getPrimaryKeys()) { + Object quantizedObject = table.get(primaryKey, RecalDataManager.QUANTIZED_VALUE_COLUMN_NAME); + Object countObject = table.get(primaryKey, RecalDataManager.QUANTIZED_COUNT_COLUMN_NAME); + byte originalQual = Byte.parseByte(primaryKey.toString()); + byte quantizedQual = Byte.parseByte(quantizedObject.toString()); + long quantizedCount = Long.parseLong(countObject.toString()); + quals[originalQual] = quantizedQual; + counts[originalQual] = quantizedCount; + } + return new QuantizationInfo(Arrays.asList(quals), Arrays.asList(counts)); + } + + /** + * Parses the arguments table from the GATK Report and creates a RAC object with the proper initialization values + * + * @param table the GATKReportTable containing the arguments and its corresponding values + * @return a RAC object properly initialized with all the objects in the table + */ + private RecalibrationArgumentCollection initializeArgumentCollectionTable(GATKReportTable table) { + RecalibrationArgumentCollection RAC = new RecalibrationArgumentCollection(); + + for (Object primaryKey : table.getPrimaryKeys()) { + Object value = table.get(primaryKey, RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME); + if (value.equals("null")) + value = null; // generic translation of null values that were printed out as strings | todo -- add this capability to the GATKReport + + if (primaryKey.equals("covariate") && value != null) + RAC.COVARIATES = value.toString().split(","); + + else if (primaryKey.equals("standard_covs")) + RAC.USE_STANDARD_COVARIATES = Boolean.parseBoolean((String) value); + + else if (primaryKey.equals("solid_recal_mode")) + RAC.SOLID_RECAL_MODE = RecalDataManager.SOLID_RECAL_MODE.recalModeFromString((String) value); + + else if (primaryKey.equals("solid_nocall_strategy")) + RAC.SOLID_NOCALL_STRATEGY = RecalDataManager.SOLID_NOCALL_STRATEGY.nocallStrategyFromString((String) value); + + else if (primaryKey.equals("mismatches_context_size")) + RAC.MISMATCHES_CONTEXT_SIZE = Integer.parseInt((String) value); + + else if (primaryKey.equals("insertions_context_size")) + RAC.INSERTIONS_CONTEXT_SIZE = Integer.parseInt((String) value); + + else if (primaryKey.equals("deletions_context_size")) + RAC.DELETIONS_CONTEXT_SIZE = Integer.parseInt((String) value); + + else if (primaryKey.equals("mismatches_default_quality")) + RAC.MISMATCHES_DEFAULT_QUALITY = Byte.parseByte((String) value); + + else if (primaryKey.equals("insertions_default_quality")) + RAC.INSERTIONS_DEFAULT_QUALITY = Byte.parseByte((String) value); + + else if (primaryKey.equals("deletions_default_quality")) + RAC.DELETIONS_DEFAULT_QUALITY = Byte.parseByte((String) value); + + else if (primaryKey.equals("low_quality_tail")) + RAC.LOW_QUAL_TAIL = Byte.parseByte((String) value); + + else if (primaryKey.equals("default_platform")) + RAC.DEFAULT_PLATFORM = (String) value; + + else if (primaryKey.equals("force_platform")) + RAC.FORCE_PLATFORM = (String) value; + + else if (primaryKey.equals("quantizing_levels")) + RAC.QUANTIZING_LEVELS = Integer.parseInt((String) value); + } + + return RAC; + } + + /** + * this functionality avoids recalculating the empirical qualities, estimated reported quality + * and quantization of the quality scores during every call of combine(). Very useful for the BQSRGatherer. + */ + public void calculateEmpiricalAndQuantizedQualities() { + quantizationInfo.quantizeQualityScores(RAC.QUANTIZING_LEVELS); + for (Map table : keysAndTablesMap.values()) { + for (RecalDatum datum : table.values()) { + datum.calcCombinedEmpiricalQuality(QualityUtils.MAX_QUAL_SCORE); + datum.calcEstimatedReportedQuality(); + } + } + } + + public void output(PrintStream output) { + RecalDataManager.outputRecalibrationReport(argumentTable, quantizationInfo, keysAndTablesMap, output); + } +} diff --git a/public/java/src/org/broadinstitute/sting/utils/recalibration/BaseRecalibration.java b/public/java/src/org/broadinstitute/sting/utils/recalibration/BaseRecalibration.java index cf44e7c36..2411a7d04 100644 --- a/public/java/src/org/broadinstitute/sting/utils/recalibration/BaseRecalibration.java +++ b/public/java/src/org/broadinstitute/sting/utils/recalibration/BaseRecalibration.java @@ -25,13 +25,9 @@ package org.broadinstitute.sting.utils.recalibration; -import org.broadinstitute.sting.gatk.report.GATKReport; -import org.broadinstitute.sting.gatk.report.GATKReportTable; import org.broadinstitute.sting.gatk.walkers.bqsr.*; -import org.broadinstitute.sting.gatk.walkers.recalibration.EmpiricalQual; import org.broadinstitute.sting.utils.BitSetUtils; import org.broadinstitute.sting.utils.QualityUtils; -import org.broadinstitute.sting.utils.collections.Pair; import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; import org.broadinstitute.sting.utils.sam.GATKSAMRecord; @@ -46,224 +42,27 @@ import java.util.*; */ public class BaseRecalibration { - private List qualQuantizationMap; // histogram containing the map for qual quantization (calculated after recalibration is done) - private LinkedHashMap> keysAndTablesMap; // quick access reference to the read group table and its key manager + private QuantizationInfo quantizationInfo; // histogram containing the map for qual quantization (calculated after recalibration is done) + private LinkedHashMap> keysAndTablesMap; // quick access reference to the read group table and its key manager private ArrayList requestedCovariates = new ArrayList(); // list of all covariates to be used in this calculation private static String UNRECOGNIZED_REPORT_TABLE_EXCEPTION = "Unrecognized table. Did you add an extra required covariate? This is a hard check that needs propagate through the code"; private static String TOO_MANY_KEYS_EXCEPTION = "There should only be one key for the RG collapsed table, something went wrong here"; - /** - * Should ALWAYS use the constructor with the GATK Report file - */ - private BaseRecalibration() {} - /** * Constructor using a GATK Report file * * @param RECAL_FILE a GATK Report file containing the recalibration information */ public BaseRecalibration(final File RECAL_FILE) { - GATKReport report = new GATKReport(RECAL_FILE); + RecalibrationReport recalibrationReport = new RecalibrationReport(RECAL_FILE); - GATKReportTable argumentTable = report.getTable(RecalDataManager.ARGUMENT_REPORT_TABLE_TITLE); - RecalibrationArgumentCollection RAC = initializeArgumentCollectionTable(argumentTable); - - GATKReportTable quantizedTable = report.getTable(RecalDataManager.QUANTIZED_REPORT_TABLE_TITLE); - qualQuantizationMap = initializeQuantizationTable(quantizedTable); - - Pair, ArrayList> covariates = RecalDataManager.initializeCovariates(RAC); // initialize the required and optional covariates - ArrayList requiredCovariates = covariates.getFirst(); - ArrayList optionalCovariates = covariates.getSecond(); - requestedCovariates.addAll(requiredCovariates); // add all required covariates to the list of requested covariates - requestedCovariates.addAll(optionalCovariates); // add all optional covariates to the list of requested covariates - - for (Covariate cov : requestedCovariates) - cov.initialize(RAC); // initialize any covariate member variables using the shared argument collection - - keysAndTablesMap = new LinkedHashMap>(); - ArrayList requiredCovariatesToAdd = new ArrayList(requiredCovariates.size()); // incrementally add the covariates to create the recal tables with 1, 2 and 3 covariates. - ArrayList optionalCovariatesToAdd = new ArrayList(); // initialize an empty array of optional covariates to create the first few tables - for (Covariate covariate : requiredCovariates) { - requiredCovariatesToAdd.add(covariate); - final Map table; // initializing a new recal table for each required covariate (cumulatively) - final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariatesToAdd, optionalCovariatesToAdd); // initializing it's corresponding key manager - - int nRequiredCovariates = requiredCovariatesToAdd.size(); // the number of required covariates defines which table we are looking at (RG, QUAL or ALL_COVARIATES) - if (nRequiredCovariates == 1) { // if there is only one required covariate, this is the read group table - final GATKReportTable reportTable = report.getTable(RecalDataManager.READGROUP_REPORT_TABLE_TITLE); - table = parseReadGroupTable(keyManager, reportTable); - } - else if (nRequiredCovariates == 2 && optionalCovariatesToAdd.isEmpty()) { // when we have both required covariates and no optional covariates we're at the QUAL table - final GATKReportTable reportTable = report.getTable(RecalDataManager.QUALITY_SCORE_REPORT_TABLE_TITLE); - table = parseQualityScoreTable(keyManager, reportTable); - } - else - throw new ReviewedStingException(UNRECOGNIZED_REPORT_TABLE_EXCEPTION); - - keysAndTablesMap.put(keyManager, table); // adding the pair key+table to the map - } - - - final BQSRKeyManager keyManager = new BQSRKeyManager(requiredCovariates, optionalCovariates); // initializing it's corresponding key manager - final GATKReportTable reportTable = report.getTable(RecalDataManager.ALL_COVARIATES_REPORT_TABLE_TITLE); - final Map table = parseAllCovariatesTable(keyManager, reportTable); - keysAndTablesMap.put(keyManager, table); // adding the pair table+key to the map + quantizationInfo = recalibrationReport.getQuantizationInfo(); + keysAndTablesMap = recalibrationReport.getKeysAndTablesMap(); + requestedCovariates = recalibrationReport.getRequestedCovariates(); } - - /** - * Compiles the list of keys for the Covariates table and uses the shared parsing utility to produce the actual table - * - * @param keyManager the key manager for this table - * @param reportTable the GATKReport table containing data for this table - * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. - */ - private Map parseAllCovariatesTable(BQSRKeyManager keyManager, GATKReportTable reportTable) { - ArrayList columnNamesOrderedList = new ArrayList(5); - columnNamesOrderedList.add(RecalDataManager.READGROUP_COLUMN_NAME); - columnNamesOrderedList.add(RecalDataManager.QUALITY_SCORE_COLUMN_NAME); - columnNamesOrderedList.add(RecalDataManager.COVARIATE_VALUE_COLUMN_NAME); - columnNamesOrderedList.add(RecalDataManager.COVARIATE_NAME_COLUMN_NAME); - columnNamesOrderedList.add(RecalDataManager.EVENT_TYPE_COLUMN_NAME); - return genericRecalTableParsing(keyManager, reportTable, columnNamesOrderedList); - } - - /** - * - * Compiles the list of keys for the QualityScore table and uses the shared parsing utility to produce the actual table - * @param keyManager the key manager for this table - * @param reportTable the GATKReport table containing data for this table - * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. - */ - private Map parseQualityScoreTable(BQSRKeyManager keyManager, GATKReportTable reportTable) { - ArrayList columnNamesOrderedList = new ArrayList(3); - columnNamesOrderedList.add(RecalDataManager.READGROUP_COLUMN_NAME); - columnNamesOrderedList.add(RecalDataManager.QUALITY_SCORE_COLUMN_NAME); - columnNamesOrderedList.add(RecalDataManager.EVENT_TYPE_COLUMN_NAME); - return genericRecalTableParsing(keyManager, reportTable, columnNamesOrderedList); - } - - /** - * Compiles the list of keys for the ReadGroup table and uses the shared parsing utility to produce the actual table - * - * @param keyManager the key manager for this table - * @param reportTable the GATKReport table containing data for this table - * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. - */ - private Map parseReadGroupTable(BQSRKeyManager keyManager, GATKReportTable reportTable) { - ArrayList columnNamesOrderedList = new ArrayList(2); - columnNamesOrderedList.add(RecalDataManager.READGROUP_COLUMN_NAME); - columnNamesOrderedList.add(RecalDataManager.EVENT_TYPE_COLUMN_NAME); - return genericRecalTableParsing(keyManager, reportTable, columnNamesOrderedList); - } - - /** - * Shared parsing functionality for all tables. - * - * @param keyManager the key manager for this table - * @param reportTable the GATKReport table containing data for this table - * @param columnNamesOrderedList a list of columns to read from the report table and build as key for this particular table - * @return a lookup table indexed by bitsets containing the empirical quality and estimated quality reported for every key. - */ - private Map genericRecalTableParsing(BQSRKeyManager keyManager, GATKReportTable reportTable, ArrayList columnNamesOrderedList) { - Map result = new HashMap(reportTable.getNumRows()*2); - - for (Object primaryKey : reportTable.getPrimaryKeys()) { - int nKeys = columnNamesOrderedList.size(); - Object [] keySet = new Object[nKeys]; - for (int i = 0; i < nKeys; i++) - keySet[i] = reportTable.get(primaryKey, columnNamesOrderedList.get(i)); // all these objects are okay in String format, the key manager will handle them correctly (except for the event type (see below) - keySet[keySet.length-1] = EventType.eventFrom((String) keySet[keySet.length-1]); // the last key is always the event type. We convert the string ("M", "I" or "D") to an enum object (necessary for the key manager). - BitSet bitKey = keyManager.bitSetFromKey(keySet); - - double estimatedQReported = (Double) reportTable.get(primaryKey, RecalDataManager.ESTIMATED_Q_REPORTED_COLUMN_NAME); - double empiricalQuality = (Double) reportTable.get(primaryKey, RecalDataManager.EMPIRICAL_QUALITY_COLUMN_NAME); - EmpiricalQual empiricalQual = new EmpiricalQual(estimatedQReported, empiricalQuality); - - result.put(bitKey, empiricalQual); - } - return result; - } - - /** - * Parses the quantization table from the GATK Report and turns it into a map of original => quantized quality scores - * - * @param table the GATKReportTable containing the quantization mappings - * @return an ArrayList with the quantization mappings from 0 to MAX_QUAL_SCORE - */ - private List initializeQuantizationTable(GATKReportTable table) { - Byte[] result = new Byte[QualityUtils.MAX_QUAL_SCORE + 1]; - for (Object primaryKey : table.getPrimaryKeys()) { - Object value = table.get(primaryKey, RecalDataManager.QUANTIZED_VALUE_COLUMN_NAME); - byte originalQual = Byte.parseByte(primaryKey.toString()); - byte quantizedQual = Byte.parseByte(value.toString()); - result[originalQual] = quantizedQual; - } - return Arrays.asList(result); - } - - /** - * Parses the arguments table from the GATK Report and creates a RAC object with the proper initialization values - * - * @param table the GATKReportTable containing the arguments and its corresponding values - * @return a RAC object properly initialized with all the objects in the table - */ - private RecalibrationArgumentCollection initializeArgumentCollectionTable(GATKReportTable table) { - RecalibrationArgumentCollection RAC = new RecalibrationArgumentCollection(); - - for (Object primaryKey : table.getPrimaryKeys()) { - Object value = table.get(primaryKey, RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME); - if (value.equals("null")) - value = null; // generic translation of null values that were printed out as strings | todo -- add this capability to the GATKReport - - if (primaryKey.equals("covariate") && value != null) - RAC.COVARIATES = value.toString().split(","); - - else if (primaryKey.equals("standard_covs")) - RAC.USE_STANDARD_COVARIATES = Boolean.parseBoolean((String) value); - - else if (primaryKey.equals("solid_recal_mode")) - RAC.SOLID_RECAL_MODE = RecalDataManager.SOLID_RECAL_MODE.recalModeFromString((String) value); - - else if (primaryKey.equals("solid_nocall_strategy")) - RAC.SOLID_NOCALL_STRATEGY = RecalDataManager.SOLID_NOCALL_STRATEGY.nocallStrategyFromString((String) value); - - else if (primaryKey.equals("mismatches_context_size")) - RAC.MISMATCHES_CONTEXT_SIZE = Integer.parseInt((String) value); - - else if (primaryKey.equals("insertions_context_size")) - RAC.INSERTIONS_CONTEXT_SIZE = Integer.parseInt((String) value); - - else if (primaryKey.equals("deletions_context_size")) - RAC.DELETIONS_CONTEXT_SIZE = Integer.parseInt((String) value); - - else if (primaryKey.equals("mismatches_default_quality")) - RAC.MISMATCHES_DEFAULT_QUALITY = Byte.parseByte((String) value); - - else if (primaryKey.equals("insertions_default_quality")) - RAC.INSERTIONS_DEFAULT_QUALITY = Byte.parseByte((String) value); - - else if (primaryKey.equals("deletions_default_quality")) - RAC.DELETIONS_DEFAULT_QUALITY = Byte.parseByte((String) value); - - else if (primaryKey.equals("low_quality_tail")) - RAC.LOW_QUAL_TAIL = Byte.parseByte((String) value); - - else if (primaryKey.equals("default_platform")) - RAC.DEFAULT_PLATFORM = (String) value; - - else if (primaryKey.equals("force_platform")) - RAC.FORCE_PLATFORM = (String) value; - - else if (primaryKey.equals("quantizing_levels")) - RAC.QUANTIZING_LEVELS = Integer.parseInt((String) value); - } - - return RAC; - } - /** * Recalibrates the base qualities of a read * @@ -316,9 +115,9 @@ public class BaseRecalibration { double deltaQReported = 0.0; double deltaQCovariates = 0.0; - for (Map.Entry> mapEntry : keysAndTablesMap.entrySet()) { + for (Map.Entry> mapEntry : keysAndTablesMap.entrySet()) { BQSRKeyManager keyManager = mapEntry.getKey(); - Map table = mapEntry.getValue(); + Map table = mapEntry.getValue(); switch(keyManager.getRequiredCovariates().size()) { case 1: // this is the ReadGroup table @@ -326,7 +125,7 @@ public class BaseRecalibration { if (bitKeys.size() > 1) throw new ReviewedStingException(TOO_MANY_KEYS_EXCEPTION); - final EmpiricalQual empiricalQualRG = table.get(bitKeys.get(0)); + final RecalDatum empiricalQualRG = table.get(bitKeys.get(0)); if (empiricalQualRG != null) { final double globalDeltaQEmpirical = empiricalQualRG.getEmpiricalQuality(); final double aggregrateQReported = empiricalQualRG.getEstimatedQReported(); @@ -339,7 +138,7 @@ public class BaseRecalibration { if (bitKeys.size() > 1) throw new ReviewedStingException(TOO_MANY_KEYS_EXCEPTION); - final EmpiricalQual empiricalQualQS = table.get(bitKeys.get(0)); + final RecalDatum empiricalQualQS = table.get(bitKeys.get(0)); if (empiricalQualQS != null) { final double deltaQReportedEmpirical = empiricalQualQS.getEmpiricalQuality(); deltaQReported = deltaQReportedEmpirical - qualFromRead - globalDeltaQ; @@ -348,7 +147,7 @@ public class BaseRecalibration { else { // this is the table with all the covariates bitKeys = keyManager.bitSetsFromAllKeys(key, errorModel); // calculate the shift in quality due to each covariate by itself in turn for (BitSet k : bitKeys) { - final EmpiricalQual empiricalQualCO = table.get(k); + final RecalDatum empiricalQualCO = table.get(k); if (empiricalQualCO != null) { double deltaQCovariateEmpirical = empiricalQualCO.getEmpiricalQuality(); deltaQCovariates += (deltaQCovariateEmpirical - qualFromRead - (globalDeltaQ + deltaQReported)); @@ -364,7 +163,8 @@ public class BaseRecalibration { double recalibratedQual = qualFromRead + globalDeltaQ + deltaQReported + deltaQCovariates; // calculate the recalibrated qual using the BQSR formula recalibratedQual = QualityUtils.boundQual((int) Math.round(recalibratedQual), QualityUtils.MAX_QUAL_SCORE); // recalibrated quality is bound between 1 and MAX_QUAL - return qualQuantizationMap.get((int) recalibratedQual); // return the quantized version of the recalibrated quality + + return quantizationInfo.getQuantizedQuals().get((int) recalibratedQual); // return the quantized version of the recalibrated quality } } diff --git a/public/java/src/org/broadinstitute/sting/utils/recalibration/QualQuantizer.java b/public/java/src/org/broadinstitute/sting/utils/recalibration/QualQuantizer.java new file mode 100644 index 000000000..9e20e9afc --- /dev/null +++ b/public/java/src/org/broadinstitute/sting/utils/recalibration/QualQuantizer.java @@ -0,0 +1,476 @@ +/* + * 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 com.google.java.contract.Ensures; +import com.google.java.contract.Invariant; +import com.google.java.contract.Requires; +import org.apache.log4j.Logger; +import org.broadinstitute.sting.gatk.report.GATKReport; +import org.broadinstitute.sting.gatk.report.GATKReportTable; +import org.broadinstitute.sting.utils.QualityUtils; +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.exceptions.ReviewedStingException; + +import java.io.PrintStream; +import java.util.*; + +/** + * A general algorithm for quantizing quality score distributions to use a specific number of levels + * + * Takes a histogram of quality scores and a desired number of levels and produces a + * map from original quality scores -> quantized quality scores. + * + * Note that this data structure is fairly heavy-weight, holding lots of debugging and + * calculation information. If you want to use it efficiently at scale with lots of + * read groups the right way to do this: + * + * Map> map + * for each read group rg: + * hist = getQualHist(rg) + * QualQuantizer qq = new QualQuantizer(hist, nLevels, minInterestingQual) + * map.set(rg, qq.getOriginalToQuantizedMap()) + * + * This map would then be used to look up the appropriate original -> quantized + * quals for each read as it comes in. + * + * @author Mark Depristo + * @since 3/2/12 + */ +public class QualQuantizer { + final private static Set MY_EMPTY_SET = Collections.emptySet(); + + private static Logger logger = Logger.getLogger(QualQuantizer.class); + + /** + * Inputs to the QualQuantizer + */ + final int nLevels, minInterestingQual; + final List nObservationsPerQual; + + /** + * Map from original qual (e.g., Q30) to new quantized qual (e.g., Q28). + * + * Has the same range as nObservationsPerQual + */ + final List originalToQuantizedMap; + + /** Sorted set of qual intervals. + * + * After quantize() this data structure contains only the top-level qual intervals + */ + final TreeSet quantizedIntervals; + + /** + * Protected creator for testng use only + */ + protected QualQuantizer(final int minInterestingQual) { + this.nObservationsPerQual = Collections.emptyList(); + this.nLevels = 0; + this.minInterestingQual = minInterestingQual; + this.quantizedIntervals = null; + this.originalToQuantizedMap = null; + } + + /** + * Creates a QualQuantizer for the histogram that has nLevels + * + * Note this is the only interface to the system. After creating this object + * the map can be obtained via getOriginalToQuantizedMap() + * + * @param nObservationsPerQual A histogram of counts of bases with quality scores. Note that + * this histogram must start at 0 (i.e., get(0) => count of Q0 bases) and must include counts all the + * way up to the largest quality score possible in the reads. OK if the histogram includes many 0 + * count bins, as these are quantized for free. + * @param nLevels the desired number of distinct quality scores to represent the full original range. Must + * be at least 1. + * @param minInterestingQual All quality scores <= this value are considered uninteresting and are freely + * merged together. For example, if this value is 10, then Q0-Q10 are all considered free to merge, and + * quantized into a single value. For ILMN data with lots of Q2 bases this results in a Q2 bin containing + * all data with Q0-Q10. + */ + public QualQuantizer(final List nObservationsPerQual, final int nLevels, final int minInterestingQual) { + this.nObservationsPerQual = nObservationsPerQual; + this.nLevels = nLevels; + this.minInterestingQual = minInterestingQual; + + // some sanity checking + if ( Collections.min(nObservationsPerQual) < 0 ) throw new ReviewedStingException("Quality score histogram has negative values at: " + Utils.join(", ", nObservationsPerQual)); + if ( nLevels < 0 ) throw new ReviewedStingException("nLevels must be >= 0"); + if ( minInterestingQual < 0 ) throw new ReviewedStingException("minInterestingQual must be >= 0"); + + // actually run the quantizer + this.quantizedIntervals = quantize(); + + // store the map + this.originalToQuantizedMap = intervalsToMap(quantizedIntervals); + } + + /** + * Represents an contiguous interval of quality scores. + * + * qStart and qEnd are inclusive, so qStart = qEnd = 2 is the quality score bin of 2 + */ + @Invariant({ + "qStart <= qEnd", + "qStart >= 0", + "qEnd <= 1000", + "nObservations >= 0", + "nErrors >= 0", + "nErrors <= nObservations", + "fixedQual >= -1 && fixedQual <= QualityUtils.MAX_QUAL_SCORE", + "mergeOrder >= 0"}) + protected final class QualInterval implements Comparable { + final int qStart, qEnd, fixedQual, level; + final long nObservations, nErrors; + final Set subIntervals; + + /** for debugging / visualization. When was this interval created? */ + int mergeOrder; + + protected QualInterval(final int qStart, final int qEnd, final long nObservations, final long nErrors, final int level) { + this(qStart, qEnd, nObservations, nErrors, level, -1, MY_EMPTY_SET); + } + + protected QualInterval(final int qStart, final int qEnd, final long nObservations, final long nErrors, final int level, final Set subIntervals) { + this(qStart, qEnd, nObservations, nErrors, level, -1, subIntervals); + } + + protected QualInterval(final int qStart, final int qEnd, final long nObservations, final long nErrors, final int level, final int fixedQual) { + this(qStart, qEnd, nObservations, nErrors, level, fixedQual, MY_EMPTY_SET); + } + + @Requires("level >= 0") + public QualInterval(final int qStart, final int qEnd, final long nObservations, final long nErrors, final int level, final int fixedQual, final Set subIntervals) { + this.qStart = qStart; + this.qEnd = qEnd; + this.nObservations = nObservations; + this.nErrors = nErrors; + this.fixedQual = fixedQual; + this.level = level; + this.mergeOrder = 0; + this.subIntervals = Collections.unmodifiableSet(subIntervals); + } + + /** + * Human readable name of this interval: e.g., 10-12 + * @return + */ + public String getName() { + return qStart + "-" + qEnd; + } + + @Override + public String toString() { + return "QQ:" + getName(); + } + + /** + * Returns the error rate (in real space) of this interval, or 0 if there are no obserations + * @return + */ + @Ensures("result >= 0.0") + public double getErrorRate() { + if ( hasFixedQual() ) + return QualityUtils.qualToErrorProb((byte)fixedQual); + else if ( nObservations == 0 ) + return 0.0; + else + return (nErrors+1) / (1.0 * (nObservations+1)); + } + + /** + * Returns the QUAL of the error rate of this interval, or the fixed + * qual if this interval was created with a fixed qual. + * @return + */ + @Ensures("result >= 0 && result <= QualityUtils.MAX_QUAL_SCORE") + public byte getQual() { + if ( ! hasFixedQual() ) + return QualityUtils.probToQual(1-getErrorRate(), 0); + else + return (byte)fixedQual; + } + + /** + * @return true if this bin is using a fixed qual + */ + public boolean hasFixedQual() { + return fixedQual != -1; + } + + @Override + public int compareTo(final QualInterval qualInterval) { + return new Integer(this.qStart).compareTo(qualInterval.qStart); + } + + /** + * Create a interval representing the merge of this interval and toMerge + * + * Errors and observations are combined + * Subintervals updated in order of left to right (determined by qStart) + * Level is 1 + highest level of this and toMerge + * Order must be updated elsewhere + * + * @param toMerge + * @return newly created merged QualInterval + */ + @Requires({"toMerge != null"}) + @Ensures({ + "result != null", + "result.nObservations >= this.nObservations", + "result.nObservations >= toMerge.nObservations", + "result.nErrors >= this.nErrors", + "result.nErrors >= toMerge.nErrors", + "result.qStart == Math.min(this.qStart, toMerge.qStart)", + "result.qEnd == Math.max(this.qEnd, toMerge.qEnd)", + "result.level > Math.max(this.level, toMerge.level)", + "result.subIntervals.size() == 2" + }) + public QualInterval merge(final QualInterval toMerge) { + final QualInterval left = this.compareTo(toMerge) < 0 ? this : toMerge; + final QualInterval right = this.compareTo(toMerge) < 0 ? toMerge : this; + + if ( left.qEnd + 1 != right.qStart ) + throw new ReviewedStingException("Attempting to merge non-continguous intervals: left = " + left + " right = " + right); + + final long nCombinedObs = left.nObservations + right.nObservations; + final long nCombinedErr = left.nErrors + right.nErrors; + + final int level = Math.max(left.level, right.level) + 1; + final Set subIntervals = new HashSet(Arrays.asList(left, right)); + QualInterval merged = new QualInterval(left.qStart, right.qEnd, nCombinedObs, nCombinedErr, level, subIntervals); + + return merged; + } + + public double getPenalty() { + return calcPenalty(getErrorRate()); + } + + + /** + * Calculate the penalty of this interval, given the overall error rate for the interval + * + * If the globalErrorRate is e, this value is: + * + * sum_i |log10(e_i) - log10(e)| * nObservations_i + * + * each the index i applies to all leaves of the tree accessible from this interval + * (found recursively from subIntervals as necessary) + * + * @param globalErrorRate overall error rate in real space against which we calculate the penalty + * @return the cost of approximating the bins in this interval with the globalErrorRate + */ + @Requires("globalErrorRate >= 0.0") + @Ensures("result >= 0.0") + private double calcPenalty(final double globalErrorRate) { + if ( globalErrorRate == 0.0 ) // there were no observations, so there's no penalty + return 0.0; + + if ( subIntervals.isEmpty() ) { + // this is leave node + if ( this.qEnd <= minInterestingQual ) + // It's free to merge up quality scores below the smallest interesting one + return 0; + else { + return (Math.abs(Math.log10(getErrorRate()) - Math.log10(globalErrorRate))) * nObservations; + } + } else { + double sum = 0; + for ( final QualInterval interval : subIntervals ) + sum += interval.calcPenalty(globalErrorRate); + return sum; + } + } + } + + /** + * Main method for computing the quantization intervals. + * + * Invoked in the constructor after all input variables are initialized. Walks + * over the inputs and builds the min. penalty forest of intervals with exactly nLevel + * root nodes. Finds this min. penalty forest via greedy search, so is not guarenteed + * to find the optimal combination. + * + * TODO: develop a smarter algorithm + * + * @return the forest of intervals with size == nLevels + */ + @Ensures({"! result.isEmpty()", "result.size() == nLevels"}) + private TreeSet quantize() { + // create intervals for each qual individually + final TreeSet intervals = new TreeSet(); + for ( int qStart = 0; qStart < getNQualsInHistogram(); qStart++ ) { + final long nObs = nObservationsPerQual.get(qStart); + final double errorRate = QualityUtils.qualToErrorProb((byte)qStart); + final double nErrors = nObs * errorRate; + final QualInterval qi = new QualInterval(qStart, qStart, nObs, (int)Math.floor(nErrors), 0, (byte)qStart); + intervals.add(qi); + } + + // greedy algorithm: + // while ( n intervals >= nLevels ): + // find intervals to merge with least penalty + // merge it + while ( intervals.size() > nLevels ) { + mergeLowestPenaltyIntervals(intervals); + } + + return intervals; + } + + /** + * Helper function that finds and mergest together the lowest penalty pair + * of intervals + * @param intervals + */ + @Requires("! intervals.isEmpty()") + private void mergeLowestPenaltyIntervals(final TreeSet intervals) { + // setup the iterators + final Iterator it1 = intervals.iterator(); + final Iterator it1p = intervals.iterator(); + it1p.next(); // skip one + + // walk over the pairs of left and right, keeping track of the pair with the lowest merge penalty + QualInterval minMerge = null; + if ( logger.isDebugEnabled() ) logger.debug("mergeLowestPenaltyIntervals: " + intervals.size()); + int lastMergeOrder = 0; + while ( it1p.hasNext() ) { + final QualInterval left = it1.next(); + final QualInterval right = it1p.next(); + final QualInterval merged = left.merge(right); + lastMergeOrder = Math.max(Math.max(lastMergeOrder, left.mergeOrder), right.mergeOrder); + if ( minMerge == null || (merged.getPenalty() < minMerge.getPenalty() ) ) { + if ( logger.isDebugEnabled() ) logger.debug(" Updating merge " + minMerge); + minMerge = merged; + } + } + + // now actually go ahead and merge the minMerge pair + if ( logger.isDebugEnabled() ) logger.debug(" => final min merge " + minMerge); + intervals.removeAll(minMerge.subIntervals); + intervals.add(minMerge); + minMerge.mergeOrder = lastMergeOrder + 1; + if ( logger.isDebugEnabled() ) logger.debug("updated intervals: " + intervals); + } + + /** + * Given a final forest of intervals constructs a list mapping + * list.get(i) => quantized qual to use for original quality score i + * + * This function should be called only once to initialize the corresponding + * cached value in this object, as the calculation is a bit costly. + * + * @param intervals + * @return + */ + @Ensures("result.size() == getNQualsInHistogram()") + private List intervalsToMap(final TreeSet intervals) { + final List map = new ArrayList(getNQualsInHistogram()); + map.addAll(Collections.nCopies(getNQualsInHistogram(), Byte.MIN_VALUE)); + for ( final QualInterval interval : intervals ) { + for ( int q = interval.qStart; q <= interval.qEnd; q++ ) { + map.set(q, interval.getQual()); + } + } + + if ( Collections.min(map) == Byte.MIN_VALUE ) + throw new ReviewedStingException("quantized quality score map contains an un-initialized value"); + + return map; + } + + @Ensures("result > 0") + private final int getNQualsInHistogram() { + return nObservationsPerQual.size(); + } + + /** + * Write out a GATKReport to visualize the QualQuantization process of this data + * @param out + */ + public void writeReport(PrintStream out) { + final GATKReport report = new GATKReport(); + + addQualHistogramToReport(report); + addIntervalsToReport(report); + + report.print(out); + } + + private final void addQualHistogramToReport(final GATKReport report) { + report.addTable("QualHistogram", "Quality score histogram provided to report"); + GATKReportTable table = report.getTable("QualHistogram"); + + table.addPrimaryKey("qual"); + table.addColumn("count", "NA"); + + for ( int q = 0; q < nObservationsPerQual.size(); q++ ) { + table.set(q, "count", nObservationsPerQual.get(q)); + } + } + + + private final void addIntervalsToReport(final GATKReport report) { + report.addTable("QualQuantizerIntervals", "Table of QualQuantizer quantization intervals"); + GATKReportTable table = report.getTable("QualQuantizerIntervals"); + + table.addPrimaryKey("name"); + table.addColumn("qStart", "NA"); + table.addColumn("qEnd", "NA"); + table.addColumn("level", "NA"); + table.addColumn("merge.order", "NA"); + table.addColumn("nErrors", "NA"); + table.addColumn("nObservations", "NA"); + table.addColumn("qual", "NA"); + table.addColumn("penalty", "NA"); + table.addColumn("root.node", "NA"); + //table.addColumn("subintervals", "NA"); + + for ( QualInterval interval : quantizedIntervals) + addIntervalToReport(table, interval, true); + } + + private final void addIntervalToReport(final GATKReportTable table, QualInterval interval, final boolean atRootP) { + final String name = interval.getName(); + table.set(name, "qStart", interval.qStart); + table.set(name, "qEnd", interval.qEnd); + table.set(name, "level", interval.level); + table.set(name, "merge.order", interval.mergeOrder); + table.set(name, "nErrors", interval.nErrors); + table.set(name, "nObservations", interval.nObservations); + table.set(name, "qual", interval.getQual()); + table.set(name, "penalty", String.format("%.1f", interval.getPenalty())); + table.set(name, "root.node", atRootP); + + for ( final QualInterval sub : interval.subIntervals ) + addIntervalToReport(table, sub, false); + } + + public List getOriginalToQuantizedMap() { + return originalToQuantizedMap; + } +} diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGathererUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGathererUnitTest.java index f1df6f9a7..bded9001e 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGathererUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRGathererUnitTest.java @@ -1,5 +1,8 @@ package org.broadinstitute.sting.gatk.walkers.bqsr; +import org.broadinstitute.sting.gatk.report.GATKReport; +import org.broadinstitute.sting.gatk.report.GATKReportTable; +import org.testng.Assert; import org.testng.annotations.Test; import java.io.File; @@ -13,17 +16,69 @@ import java.util.List; public class BQSRGathererUnitTest { RecalibrationArgumentCollection RAC; - private static File recal1 = new File("public/testdata/exampleCSV.csv"); - private static File recal2 = new File("public/testdata/exampleCSV.2.csv"); + private static File recal = new File("public/testdata/exampleGRP.grp"); + //todo -- this test doesnt work because the primary keys in different tables are not the same. Need to either implement "sort" for testing purposes on GATKReport or have a sophisticated comparison measure @Test(enabled = false) - public void testCombineTwoFiles() { + public void testCombineSimilarFiles() { BQSRGatherer gatherer = new BQSRGatherer(); List recalFiles = new LinkedList (); - File output = new File("foo.csv"); - - recalFiles.add(recal1); - recalFiles.add(recal2); + File output = new File("foo.grp"); + recalFiles.add(recal); + recalFiles.add(recal); gatherer.gather(recalFiles, output); + + GATKReport originalReport = new GATKReport(recal); + GATKReport calculatedReport = new GATKReport(output); + for (GATKReportTable originalTable : originalReport.getTables()) { + GATKReportTable calculatedTable = calculatedReport.getTable(originalTable.getTableName()); + List columnsToTest = new LinkedList(); + if (originalTable.getTableName().equals(RecalDataManager.ARGUMENT_REPORT_TABLE_TITLE)) { // these tables must be IDENTICAL + columnsToTest.add(RecalDataManager.ARGUMENT_VALUE_COLUMN_NAME); + testTablesWithColumnsAndFactor(originalTable, calculatedTable, columnsToTest, 1); + } + + else if (originalTable.getTableName().equals(RecalDataManager.QUANTIZED_REPORT_TABLE_TITLE)) { + columnsToTest.add(RecalDataManager.QUANTIZED_COUNT_COLUMN_NAME); + testTablesWithColumnsAndFactor(originalTable, calculatedTable, columnsToTest, 2); + } + + else if (originalTable.getTableName().startsWith("RecalTable")) { + columnsToTest.add(RecalDataManager.NUMBER_OBSERVATIONS_COLUMN_NAME); + columnsToTest.add(RecalDataManager.NUMBER_ERRORS_COLUMN_NAME); + testTablesWithColumnsAndFactor(originalTable, calculatedTable, columnsToTest, 2); + } + } + } + + /** + * Common testing functionality given the columns to test and the multiplication factor to the expected result + * + * @param original the original table + * @param calculated the calculated table + * @param columnsToTest list of columns to test. All columns will be tested with the same criteria (equality given factor) + * @param factor 1 to test for equality, any other value to multiply the original value and match with the calculated + */ + private void testTablesWithColumnsAndFactor(GATKReportTable original, GATKReportTable calculated, List columnsToTest, int factor) { + for (Object primaryKey : original.getPrimaryKeys()) { // tables don't necessarily have the same primary keys + for (String column : columnsToTest) { + Object actual = calculated.get(primaryKey, column); + Object expected = original.get(primaryKey, column); + + if (factor != 1) { + if (expected instanceof Double) + expected = (Double) expected * factor; + else if (expected instanceof Long) + expected = (Long) expected * factor; + else if (expected instanceof Integer) + expected = (Integer) expected * factor; + else if (expected instanceof Byte) { + expected = (Byte) expected * factor; + } + } + Assert.assertEquals(actual, expected, "Primary key: " + primaryKey + " Original Table: " + original.getTableName() + " Calc Table: " + calculated.getTableName()); + } + } + } } diff --git a/public/java/test/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRKeyManagerUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRKeyManagerUnitTest.java new file mode 100644 index 000000000..636d4ffb8 --- /dev/null +++ b/public/java/test/org/broadinstitute/sting/gatk/walkers/bqsr/BQSRKeyManagerUnitTest.java @@ -0,0 +1,132 @@ +package org.broadinstitute.sting.gatk.walkers.bqsr; + +import org.broadinstitute.sting.utils.sam.ArtificialSAMUtils; +import org.broadinstitute.sting.utils.sam.GATKSAMReadGroupRecord; +import org.broadinstitute.sting.utils.sam.GATKSAMRecord; +import org.broadinstitute.sting.utils.sam.ReadUtils; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.BitSet; +import java.util.LinkedList; +import java.util.List; + +/** + * @author Mauricio Carneiro + * @since 3/7/12 + */ +public class BQSRKeyManagerUnitTest { + RecalibrationArgumentCollection RAC; + + @BeforeClass + public void init() { + RAC = new RecalibrationArgumentCollection(); + } + + @Test(enabled = true) + public void testCombineBitSets() { + final int nRequired = 2; + final ArrayList covariates = new ArrayList(); + covariates.add(new ReadGroupCovariate()); + covariates.add(new QualityScoreCovariate()); + covariates.add(new CycleCovariate()); + covariates.add(new ContextCovariate()); + createReadAndTest(covariates, nRequired); + } + + @Test(enabled = true) + public void testOnlyRequiredCovariates() { + final int nRequired = 2; + final ArrayList covariates = new ArrayList(2); + covariates.add(new ReadGroupCovariate()); + covariates.add(new QualityScoreCovariate()); + createReadAndTest(covariates, nRequired); + } + + @Test(enabled = true) + public void testOnlyOneCovariate() { + final int nRequired = 1; + final ArrayList covariates = new ArrayList(2); + covariates.add(new ReadGroupCovariate()); + createReadAndTest(covariates, nRequired); + } + + private void createReadAndTest(List covariates, int nRequired) { + int readLength = 1000; + GATKSAMRecord read = ArtificialSAMUtils.createArtificialRead(ReadUtils.createRandomReadBases(readLength, true), ReadUtils.createRandomReadQuals(readLength), readLength + "M"); + read.setReadGroup(new GATKSAMReadGroupRecord("ID")); + read.getReadGroup().setPlatform("illumina"); + + runTestOnRead(read, covariates, nRequired); + read.setReadNegativeStrandFlag(true); + runTestOnRead(read, covariates, nRequired); + read.setReadPairedFlag(true); + read.setSecondOfPairFlag(true); + runTestOnRead(read, covariates, nRequired); + read.setReadNegativeStrandFlag(false); + runTestOnRead(read, covariates, nRequired); + } + + private void runTestOnRead(GATKSAMRecord read, List covariateList, int nRequired) { + final BitSet[][][] covariateKeys = new BitSet[covariateList.size()][EventType.values().length][]; + int i = 0; + for (Covariate cov : covariateList) { + cov.initialize(RAC); + CovariateValues covValues = cov.getValues(read); + covariateKeys[i][EventType.BASE_SUBSTITUTION.index] = covValues.getMismatches(); + covariateKeys[i][EventType.BASE_INSERTION.index] = covValues.getInsertions(); + covariateKeys[i][EventType.BASE_DELETION.index] = covValues.getDeletions(); + i++; + } + List requiredCovariates = new LinkedList(); + List optionalCovariates = new LinkedList(); + + for (int j=0; j hashKeys = keyManager.bitSetsFromAllKeys(keySet, EventType.eventFrom(eventType)); + short cov = 0; + for (BitSet key : hashKeys) { + Object[] actual = keyManager.keySetFrom(key).toArray(); + + // Build the expected array + Object[] expected = new Object[nRequired + (optionalCovariates.size() > 0 ? 3 : 1)]; + System.arraycopy(expectedRequired, 0, expected, 0, nRequired); + if (optionalCovariates.size() > 0) { + expected[expected.length-3] = expectedCovariate[cov]; + expected[expected.length-2] = optionalCovariates.get(cov++).getClass().getSimpleName().split("Covariate")[0]; + } + expected[expected.length-1] = EventType.eventFrom(eventType); + +// System.out.println("Actual : " + Utils.join(",", Arrays.asList(actual))); +// System.out.println("Expected: " + Utils.join(",", Arrays.asList(expected))); +// System.out.println(); + + for (int k = 0; k < expected.length; k++) + Assert.assertEquals(actual[k], expected[k]); + } + } + } + } +} diff --git a/public/java/test/org/broadinstitute/sting/utils/activeregion/ActivityProfileUnitTest.java b/public/java/test/org/broadinstitute/sting/utils/activeregion/ActivityProfileUnitTest.java index e6df6d1be..7d478d063 100644 --- a/public/java/test/org/broadinstitute/sting/utils/activeregion/ActivityProfileUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/utils/activeregion/ActivityProfileUnitTest.java @@ -33,19 +33,15 @@ import net.sf.picard.reference.ReferenceSequenceFile; import org.broadinstitute.sting.BaseTest; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.GenomeLocParser; -import org.broadinstitute.sting.utils.QualityUtils; import org.broadinstitute.sting.utils.Utils; import org.broadinstitute.sting.utils.fasta.CachingIndexedFastaSequenceFile; -import org.broadinstitute.sting.utils.recalibration.QualQuantizer; import org.testng.Assert; import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeSuite; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.io.FileNotFoundException; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/public/testdata/exampleGRP.grp b/public/testdata/exampleGRP.grp new file mode 100644 index 000000000..b939f22fe --- /dev/null +++ b/public/testdata/exampleGRP.grp @@ -0,0 +1,1518 @@ +#:GATKReport.v1.0:5 +#:GATKTable:true:1:14::; +#:GATKTable:Arguments:Recalibration argument collection values used in this run +Argument Value +covariate null +default_platform null +deletions_context_size 8 +force_platform null +insertions_context_size 8 +insertions_default_quality 45 +low_quality_tail 2 +mismatches_context_size 2 +mismatches_default_quality -1 +quantizing_levels 16 +run_without_dbsnp false +solid_nocall_strategy THROW_EXCEPTION +solid_recal_mode SET_Q_ZERO +standard_covs true + +#:GATKTable:true:2:94:::; +#:GATKTable:Quantized:Quality quantization map +QualityScore Count QuantizedScore +0 6 4 +1 0 4 +2 12 4 +3 875 4 +4 18 4 +5 250 4 +6 150 4 +7 82 7 +8 1208 8 +9 228 9 +10 40 10 +11 22 11 +12 62 12 +13 152 13 +14 872 14 +15 0 15 +16 234 16 +17 0 93 +18 0 93 +19 0 93 +20 0 93 +21 0 93 +22 0 93 +23 0 93 +24 0 93 +25 0 93 +26 0 93 +27 0 93 +28 0 93 +29 3052 29 +30 0 93 +31 0 93 +32 0 93 +33 0 93 +34 0 93 +35 0 93 +36 0 93 +37 0 93 +38 0 93 +39 0 93 +40 0 93 +41 0 93 +42 0 93 +43 0 93 +44 0 93 +45 0 93 +46 0 93 +47 0 93 +48 0 93 +49 0 93 +50 0 93 +51 0 93 +52 0 93 +53 0 93 +54 0 93 +55 0 93 +56 0 93 +57 0 93 +58 0 93 +59 0 93 +60 0 93 +61 0 93 +62 0 93 +63 0 93 +64 0 93 +65 0 93 +66 0 93 +67 0 93 +68 0 93 +69 0 93 +70 0 93 +71 0 93 +72 0 93 +73 0 93 +74 0 93 +75 0 93 +76 0 93 +77 0 93 +78 0 93 +79 0 93 +80 0 93 +81 0 93 +82 0 93 +83 0 93 +84 0 93 +85 0 93 +86 0 93 +87 0 93 +88 0 93 +89 0 93 +90 0 93 +91 0 93 +92 0 92 +93 0 93 + +#:GATKTable:false:6:3:%s:%s:%.2f:%.2f:%d:%d:; +#:GATKTable:RecalTable0: +ReadGroup EventType EmpiricalQuality EstimatedQReported Observations Errors +exampleBAM.bam.bam D 28.83 17.00 763 0 +exampleBAM.bam.bam M 14.13 17.00 387 14 +exampleBAM.bam.bam I 28.83 17.00 763 0 + +#:GATKTable:false:7:32:%s:%s:%s:%.2f:%.2f:%d:%d:; +#:GATKTable:RecalTable1: +ReadGroup QualityScore EventType EmpiricalQuality EstimatedQReported Observations Errors +exampleBAM.bam.bam 32 M 15.68 32.00 36 0 +exampleBAM.bam.bam 19 M 9.29 19.00 16 1 +exampleBAM.bam.bam 33 M 16.13 33.00 40 0 +exampleBAM.bam.bam 18 M 6.02 18.00 7 1 +exampleBAM.bam.bam 34 M 16.23 34.00 41 0 +exampleBAM.bam.bam 17 M 14.13 17.00 387 14 +exampleBAM.bam.bam 16 M 8.45 16.00 13 1 +exampleBAM.bam.bam 23 M 12.04 23.00 15 0 +exampleBAM.bam.bam 6 M 5.74 6.00 14 3 +exampleBAM.bam.bam 45 I 28.83 17.00 763 0 +exampleBAM.bam.bam 22 M 10.79 22.00 11 0 +exampleBAM.bam.bam 4 M 4.77 4.00 5 1 +exampleBAM.bam.bam 21 M 12.79 21.00 18 0 +exampleBAM.bam.bam 5 M 3.98 5.00 9 3 +exampleBAM.bam.bam 20 M 4.77 20.00 5 1 +exampleBAM.bam.bam 27 M 13.62 27.00 22 0 +exampleBAM.bam.bam 10 M 3.01 10.00 1 0 +exampleBAM.bam.bam 26 M 8.45 26.00 6 0 +exampleBAM.bam.bam 11 M 1.76 11.00 2 1 +exampleBAM.bam.bam 8 M 6.99 8.00 9 1 +exampleBAM.bam.bam 25 M 12.30 25.00 16 0 +exampleBAM.bam.bam 9 M 6.99 9.00 4 0 +exampleBAM.bam.bam 24 M 10.21 24.00 20 1 +exampleBAM.bam.bam 31 M 14.47 31.00 27 0 +exampleBAM.bam.bam 14 M 3.01 14.00 1 0 +exampleBAM.bam.bam 30 M 13.22 30.00 20 0 +exampleBAM.bam.bam 15 M 8.45 15.00 6 0 +exampleBAM.bam.bam 12 M 6.99 12.00 4 0 +exampleBAM.bam.bam 29 M 13.42 29.00 21 0 +exampleBAM.bam.bam 45 D 28.83 17.00 763 0 +exampleBAM.bam.bam 13 M 6.02 13.00 3 0 +exampleBAM.bam.bam 28 M 12.55 28.00 17 0 + +#:GATKTable:false:9:1354:%s:%s:%s:%s:%s:%.2f:%.2f:%d:%d:; +#:GATKTable:RecalTable2: +ReadGroup QualityScore CovariateValue CovariateName EventType EmpiricalQuality EstimatedQReported Observations Errors +exampleBAM.bam.bam 45 TGAAAGTG Context D 3.01 8.00 1 0 +exampleBAM.bam.bam 45 TGGTATTA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 AGCCTCGT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTGTGTCT Context D 3.01 6.00 1 0 +exampleBAM.bam.bam 45 CTTTGTAT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTTAAGTG Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTTTATTA Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 45 23 Cycle I 7.78 22.00 5 0 +exampleBAM.bam.bam 45 27 Cycle D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 ATTCTATT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTAATCTC Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 34 GC Context M 4.77 34.00 2 0 +exampleBAM.bam.bam 8 TG Context M 6.99 8.00 9 1 +exampleBAM.bam.bam 45 TAGAGTTT Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 9 TA Context M 3.01 9.00 1 0 +exampleBAM.bam.bam 45 GGTTCGGG Context I 9.03 6.00 7 0 +exampleBAM.bam.bam 45 AGTTTCAC Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 CATTTCAC Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 16 7 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 5 76 Cycle M 3.01 5.00 1 0 +exampleBAM.bam.bam 45 CATGATAA Context D 3.01 4.00 1 0 +exampleBAM.bam.bam 45 53 Cycle I 7.78 28.00 5 0 +exampleBAM.bam.bam 45 57 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 25 52 Cycle M 4.77 25.00 2 0 +exampleBAM.bam.bam 45 TGGCAGCC Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 33 CT Context M 8.45 33.00 6 0 +exampleBAM.bam.bam 45 AAGTGACA Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 AGTGACAT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AGAGTTTC Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 CTCTTTGT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 GCCTGAAA Context D 3.01 12.00 1 0 +exampleBAM.bam.bam 12 25 Cycle M 3.01 12.00 1 0 +exampleBAM.bam.bam 34 75 Cycle M 16.23 34.00 41 0 +exampleBAM.bam.bam 32 41 Cycle M 6.99 32.00 4 0 +exampleBAM.bam.bam 21 GG Context M 4.77 21.00 2 0 +exampleBAM.bam.bam 26 50 Cycle M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 ACCTGGAG Context D 3.01 22.00 1 0 +exampleBAM.bam.bam 45 CACAGCAA Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 20 GA Context M 3.01 20.00 1 0 +exampleBAM.bam.bam 45 AGGTGGAG Context D 3.01 22.00 1 0 +exampleBAM.bam.bam 45 GCAAAATC Context I 3.01 9.00 1 0 +exampleBAM.bam.bam 27 TA Context M 6.99 27.00 4 0 +exampleBAM.bam.bam 27 18 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 32 CC Context M 3.01 32.00 1 0 +exampleBAM.bam.bam 45 AAAATCTA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 22 Cycle I 7.78 5.00 5 0 +exampleBAM.bam.bam 45 26 Cycle D 8.45 5.00 6 0 +exampleBAM.bam.bam 33 76 Cycle M 6.02 33.00 3 0 +exampleBAM.bam.bam 30 24 Cycle M 4.77 30.00 2 0 +exampleBAM.bam.bam 45 TTCTATTC Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GTCAATGT Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 21 73 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 17 4 Cycle M 3.01 17.00 1 0 +exampleBAM.bam.bam 8 17 Cycle M 3.01 8.00 1 0 +exampleBAM.bam.bam 34 GA Context M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 ATCGTGAG Context I 3.01 8.00 1 0 +exampleBAM.bam.bam 45 CCAGATCC Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 GATCGTGA Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 52 Cycle I 7.78 6.00 5 0 +exampleBAM.bam.bam 45 56 Cycle D 7.78 18.00 5 0 +exampleBAM.bam.bam 9 TC Context M 3.01 9.00 1 0 +exampleBAM.bam.bam 23 CT Context M 4.77 23.00 2 0 +exampleBAM.bam.bam 31 26 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 45 ATGTGAAC Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 ATTACTCT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 ACACAGCA Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 26 TT Context M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 GGGTTTGG Context D 8.45 23.00 6 0 +exampleBAM.bam.bam 33 8 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 21 GT Context M 4.77 21.00 2 0 +exampleBAM.bam.bam 34 74 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 ATTCTTAA Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GAGCCTTT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 20 GC Context M 3.01 20.00 1 0 +exampleBAM.bam.bam 45 GGTTAGGG Context D 8.45 5.00 6 0 +exampleBAM.bam.bam 33 42 Cycle M 4.77 33.00 2 0 +exampleBAM.bam.bam 45 GTGCAAAG Context I 3.01 5.00 1 0 +exampleBAM.bam.bam 6 75 Cycle M 3.01 6.00 1 0 +exampleBAM.bam.bam 27 TC Context M 3.01 27.00 1 0 +exampleBAM.bam.bam 32 CA Context M 6.02 32.00 3 0 +exampleBAM.bam.bam 29 60 Cycle M 13.42 29.00 21 0 +exampleBAM.bam.bam 34 13 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 34 GT Context M 4.77 34.00 2 0 +exampleBAM.bam.bam 21 74 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 45 GTTAATGA Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TATTATTG Context D 3.01 8.00 1 0 +exampleBAM.bam.bam 24 52 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 45 CTTTCAGG Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 GACATGGT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 ATCATGGT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 21 Cycle I 7.78 25.00 5 0 +exampleBAM.bam.bam 45 25 Cycle D 7.78 24.00 5 0 +exampleBAM.bam.bam 34 47 Cycle M 4.77 34.00 2 0 +exampleBAM.bam.bam 31 25 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 19 71 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 6 GG Context M 5.74 6.00 14 3 +exampleBAM.bam.bam 9 16 Cycle M 6.99 9.00 4 0 +exampleBAM.bam.bam 45 TCCAGTTC Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 TTCACATG Context D 3.01 22.00 1 0 +exampleBAM.bam.bam 45 TAAGTGAC Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 GTGACATG Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 55 Cycle I 7.78 27.00 5 0 +exampleBAM.bam.bam 45 59 Cycle D 7.78 33.00 5 0 +exampleBAM.bam.bam 45 CATGATCG Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 16 AT Context M 3.01 16.00 1 0 +exampleBAM.bam.bam 32 43 Cycle M 6.02 32.00 3 0 +exampleBAM.bam.bam 19 33 Cycle M 4.77 19.00 2 0 +exampleBAM.bam.bam 21 GA Context M 4.77 21.00 2 0 +exampleBAM.bam.bam 45 GTATTTGC Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 26 TA Context M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TCTTAAGT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 33 CC Context M 3.01 33.00 1 0 +exampleBAM.bam.bam 11 20 Cycle M 3.01 11.00 1 0 +exampleBAM.bam.bam 28 61 Cycle M 6.02 28.00 3 0 +exampleBAM.bam.bam 18 1 Cycle M 3.01 18.00 1 0 +exampleBAM.bam.bam 45 ACCCAGAT Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 AAAGACAC Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 GCCTTTGC Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 27 16 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 27 TG Context M 4.77 27.00 2 0 +exampleBAM.bam.bam 32 CT Context M 3.01 32.00 1 0 +exampleBAM.bam.bam 21 44 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TATTACTC Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGGGCTGG Context I 7.78 32.00 5 0 +exampleBAM.bam.bam 16 65 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 34 GG Context M 4.77 34.00 2 0 +exampleBAM.bam.bam 25 21 Cycle M 6.02 25.00 3 0 +exampleBAM.bam.bam 22 9 Cycle M 4.77 22.00 2 0 +exampleBAM.bam.bam 45 CAGGCCAC Context D 3.01 20.00 1 0 +exampleBAM.bam.bam 45 20 Cycle I 7.78 11.00 5 0 +exampleBAM.bam.bam 45 24 Cycle D 7.78 29.00 5 0 +exampleBAM.bam.bam 30 26 Cycle M 4.77 30.00 2 0 +exampleBAM.bam.bam 45 TTGTATTT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 24 53 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 23 CC Context M 3.01 23.00 1 0 +exampleBAM.bam.bam 19 70 Cycle M 9.29 19.00 16 1 +exampleBAM.bam.bam 25 55 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 45 AGGCCACC Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 54 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 58 Cycle D 7.78 18.00 5 0 +exampleBAM.bam.bam 45 ACTTTCAG Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 45 AAAGTGCA Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 45 ATTGATAT Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 45 AATGTGAA Context I 3.01 5.00 1 0 +exampleBAM.bam.bam 9 TT Context M 6.99 9.00 4 0 +exampleBAM.bam.bam 19 32 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 29 28 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 45 CGGGTTTG Context I 8.45 31.00 6 0 +exampleBAM.bam.bam 45 TCTTTGTA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 33 10 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 33 CA Context M 4.77 33.00 2 0 +exampleBAM.bam.bam 45 GTTCGGGT Context I 9.03 17.00 7 0 +exampleBAM.bam.bam 27 TT Context M 4.77 27.00 2 0 +exampleBAM.bam.bam 27 17 Cycle M 4.77 27.00 2 0 +exampleBAM.bam.bam 45 CAGCAAAA Context I 3.01 6.00 1 0 +exampleBAM.bam.bam 45 GGCAGCCT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 20 GT Context M 4.77 20.00 5 1 +exampleBAM.bam.bam 45 TGGAGCCT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TGGTGGCC Context I 3.01 6.00 1 0 +exampleBAM.bam.bam 28 30 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 33 40 Cycle M 8.45 33.00 6 0 +exampleBAM.bam.bam 24 TG Context M 6.02 24.00 3 0 +exampleBAM.bam.bam 45 TGTGTCTT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TCAATAAT Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 45 TCTCCAGG Context I 3.01 4.00 1 0 +exampleBAM.bam.bam 45 49 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 61 Cycle D 9.03 28.00 7 0 +exampleBAM.bam.bam 45 CCTCGTCC Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 GGCACCCA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 22 44 Cycle M 4.77 22.00 2 0 +exampleBAM.bam.bam 45 AGGTTATC Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 34 41 Cycle M 4.77 34.00 2 0 +exampleBAM.bam.bam 19 65 Cycle M 4.77 19.00 2 0 +exampleBAM.bam.bam 23 12 Cycle M 4.77 23.00 2 0 +exampleBAM.bam.bam 23 GG Context M 12.04 23.00 15 0 +exampleBAM.bam.bam 45 TTGGGTTC Context I 7.78 33.00 5 0 +exampleBAM.bam.bam 45 TTCTGTGT Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TGTTGGTT Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 24 50 Cycle M 4.77 24.00 2 0 +exampleBAM.bam.bam 45 GTTTCACA Context I 3.01 18.00 1 0 +exampleBAM.bam.bam 45 TCGGGTTC Context I 7.78 29.00 5 0 +exampleBAM.bam.bam 45 TAGGGTTC Context I 7.78 32.00 5 0 +exampleBAM.bam.bam 33 73 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 9 52 Cycle M 3.01 9.00 1 0 +exampleBAM.bam.bam 45 19 Cycle I 7.78 31.00 5 0 +exampleBAM.bam.bam 45 31 Cycle D 8.45 32.00 6 0 +exampleBAM.bam.bam 25 TA Context M 6.02 25.00 3 0 +exampleBAM.bam.bam 34 11 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 34 CC Context M 3.01 34.00 1 0 +exampleBAM.bam.bam 28 25 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 TAGATTTT Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 45 GGTTGGGG Context I 8.45 5.00 6 0 +exampleBAM.bam.bam 45 GGCTGGGG Context I 7.78 5.00 5 0 +exampleBAM.bam.bam 45 GATTAGAT Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 5 GG Context M 3.98 5.00 9 3 +exampleBAM.bam.bam 32 15 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 27 22 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 21 42 Cycle M 4.77 21.00 2 0 +exampleBAM.bam.bam 19 5 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 19 AT Context M 4.77 19.00 2 0 +exampleBAM.bam.bam 45 TTTCAGGC Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 TGCCAGGC Context D 3.01 20.00 1 0 +exampleBAM.bam.bam 45 GTCTTTAT Context I 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TGAACTGG Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 26 20 Cycle M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TATTCTTA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TGATAACC Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 ATTTTTCT Context D 3.01 20.00 1 0 +exampleBAM.bam.bam 45 GGCTTTAT Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 5 46 Cycle M 1.76 5.00 2 1 +exampleBAM.bam.bam 29 27 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 45 ATCCATTT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 48 Cycle I 7.78 24.00 5 0 +exampleBAM.bam.bam 45 60 Cycle D 7.78 29.00 5 0 +exampleBAM.bam.bam 45 GATCCAGT Context I 3.01 18.00 1 0 +exampleBAM.bam.bam 45 AATGAGTC Context D 3.01 17.00 1 0 +exampleBAM.bam.bam 24 TT Context M 3.01 24.00 3 1 +exampleBAM.bam.bam 45 TCTTTATA Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 6 CC Context M 4.77 6.00 2 0 +exampleBAM.bam.bam 23 GT Context M 4.77 23.00 2 0 +exampleBAM.bam.bam 34 40 Cycle M 4.77 34.00 2 0 +exampleBAM.bam.bam 45 18 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 30 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 CAAAATCT Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 22 15 Cycle M 4.77 22.00 2 0 +exampleBAM.bam.bam 45 CCAGGTTA Context I 3.01 9.00 1 0 +exampleBAM.bam.bam 45 TCATGGTG Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 TCTAATCT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TTGGGTTA Context I 7.78 30.00 5 0 +exampleBAM.bam.bam 45 TAGGGTTA Context I 7.78 28.00 5 0 +exampleBAM.bam.bam 45 GTTGGTTA Context I 3.01 13.00 1 0 +exampleBAM.bam.bam 33 72 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 31 60 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 34 CA Context M 6.99 34.00 4 0 +exampleBAM.bam.bam 45 CCCAGATC Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 18 36 Cycle M 3.01 18.00 1 0 +exampleBAM.bam.bam 16 70 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 45 TGTATTTG Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 33 46 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GGTTGGGT Context I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 GTTTGGGT Context I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 TTCTAGAG Context I 3.01 4.00 1 0 +exampleBAM.bam.bam 19 AG Context M 3.01 19.00 1 0 +exampleBAM.bam.bam 32 GA Context M 6.02 32.00 3 0 +exampleBAM.bam.bam 32 14 Cycle M 6.02 32.00 3 0 +exampleBAM.bam.bam 12 62 Cycle M 3.01 12.00 1 0 +exampleBAM.bam.bam 33 12 Cycle M 6.02 33.00 3 0 +exampleBAM.bam.bam 45 GGTGGCCT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 4 GC Context M 3.01 4.00 1 0 +exampleBAM.bam.bam 27 53 Cycle M 7.78 27.00 5 0 +exampleBAM.bam.bam 23 GA Context M 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TTATTATT Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 5 74 Cycle M 3.98 5.00 9 3 +exampleBAM.bam.bam 45 ATGATAAC Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 51 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 63 Cycle D 9.03 17.00 7 0 +exampleBAM.bam.bam 45 CACCCAGA Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 CGTGAGTG Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 45 GCTTTATT Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 ATGGTGGC Context D 3.01 12.00 1 0 +exampleBAM.bam.bam 34 CT Context M 4.77 34.00 2 0 +exampleBAM.bam.bam 4 72 Cycle M 3.01 4.00 1 0 +exampleBAM.bam.bam 45 TCGGGTTT Context I 8.45 6.00 6 0 +exampleBAM.bam.bam 24 48 Cycle M 10.21 24.00 20 1 +exampleBAM.bam.bam 45 TCCATGAT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CACATGAT Context I 3.01 12.00 1 0 +exampleBAM.bam.bam 45 17 Cycle I 7.78 27.00 5 0 +exampleBAM.bam.bam 45 29 Cycle D 7.78 33.00 5 0 +exampleBAM.bam.bam 45 ATCAATAA Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 ACCATGAT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 32 GT Context M 8.45 32.00 6 0 +exampleBAM.bam.bam 19 7 Cycle M 4.77 19.00 2 0 +exampleBAM.bam.bam 33 45 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 28 27 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 TCCATTTC Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GATAACCT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 AACTGGGA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 4 GG Context M 3.01 4.00 1 0 +exampleBAM.bam.bam 33 GC Context M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TCAGGCCA Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 45 TTGCACTT Context I 3.01 17.00 1 0 +exampleBAM.bam.bam 45 TTCACTGA Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTCCAGGT Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 6 CT Context M 3.01 6.00 1 0 +exampleBAM.bam.bam 23 15 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 25 51 Cycle M 4.77 25.00 2 0 +exampleBAM.bam.bam 32 72 Cycle M 15.68 32.00 36 0 +exampleBAM.bam.bam 34 42 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GATATAAA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 CTAGAGTT Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 45 50 Cycle I 7.78 28.00 5 0 +exampleBAM.bam.bam 45 62 Cycle D 9.03 6.00 7 0 +exampleBAM.bam.bam 45 GCCACCAT Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 GGGTTCGG Context D 9.03 28.00 7 0 +exampleBAM.bam.bam 24 TC Context M 6.02 24.00 3 0 +exampleBAM.bam.bam 25 TT Context M 4.77 25.00 2 0 +exampleBAM.bam.bam 45 16 Cycle I 7.78 9.00 5 0 +exampleBAM.bam.bam 45 28 Cycle D 7.78 20.00 5 0 +exampleBAM.bam.bam 45 ACATGGTA Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 16 34 Cycle M 8.45 16.00 13 1 +exampleBAM.bam.bam 45 AATCTCCA Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 45 ATTTCACT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 22 GT Context M 4.77 22.00 2 0 +exampleBAM.bam.bam 45 ATATCAAT Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 CAATGTGA Context D 3.01 20.00 1 0 +exampleBAM.bam.bam 45 GAGTCAAT Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 24 49 Cycle M 4.77 24.00 2 0 +exampleBAM.bam.bam 45 GGGGGTTG Context I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 TAGGGTTG Context I 7.78 27.00 5 0 +exampleBAM.bam.bam 45 TGCAATCC Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 TGGGGTTG Context I 7.78 22.00 5 0 +exampleBAM.bam.bam 45 TTAATGAG Context I 3.01 8.00 1 0 +exampleBAM.bam.bam 30 30 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 23 75 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 32 GG Context M 15.68 32.00 36 0 +exampleBAM.bam.bam 20 9 Cycle M 3.01 20.00 1 0 +exampleBAM.bam.bam 20 CT Context M 3.01 20.00 1 0 +exampleBAM.bam.bam 45 ATTAGATT Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 33 44 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TTTCTGTG Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TGGAGATT Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 45 GTTTGGGC Context I 7.78 30.00 5 0 +exampleBAM.bam.bam 21 11 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 29 24 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 32 46 Cycle M 4.77 32.00 2 0 +exampleBAM.bam.bam 27 55 Cycle M 13.62 27.00 22 0 +exampleBAM.bam.bam 45 ATATAAAG Context I 3.01 12.00 1 0 +exampleBAM.bam.bam 45 GAGTTTCA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 CACTTTCA Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CCATTTCA Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CCAGGCAC Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 11 TT Context M 1.76 11.00 2 1 +exampleBAM.bam.bam 45 TTTCACTG Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 33 GA Context M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TCGTGAGT Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 45 TACTCTTT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 TAATGAGT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 GTGTCTTT Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 45 GGCTTTAT Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 22 70 Cycle M 3.01 22.00 1 0 +exampleBAM.bam.bam 45 ATTTTTCT Context I 3.01 20.00 1 0 +exampleBAM.bam.bam 45 TGCCAGGC Context I 3.01 20.00 1 0 +exampleBAM.bam.bam 33 1 Cycle M 4.77 33.00 2 0 +exampleBAM.bam.bam 45 TTTCAGGC Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 TATTCTTA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TGATAACC Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GTCTTTAT Context D 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TGAACTGG Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 21 AG Context M 12.79 21.00 18 0 +exampleBAM.bam.bam 32 33 Cycle M 4.77 32.00 2 0 +exampleBAM.bam.bam 27 56 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 45 GGCTGGGG Context D 7.78 5.00 5 0 +exampleBAM.bam.bam 45 GATTAGAT Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 33 35 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TAGATTTT Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 GGTTGGGG Context D 8.45 5.00 6 0 +exampleBAM.bam.bam 19 CT Context M 9.29 19.00 16 1 +exampleBAM.bam.bam 45 19 Cycle D 7.78 31.00 5 0 +exampleBAM.bam.bam 45 31 Cycle I 8.45 32.00 6 0 +exampleBAM.bam.bam 45 TGTTGGTT Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 45 TTCTGTGT Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 24 62 Cycle M 6.02 24.00 3 0 +exampleBAM.bam.bam 45 TCGGGTTC Context D 7.78 29.00 5 0 +exampleBAM.bam.bam 45 GTTTCACA Context D 3.01 18.00 1 0 +exampleBAM.bam.bam 45 TAGGGTTC Context D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 TTGGGTTC Context D 7.78 33.00 5 0 +exampleBAM.bam.bam 30 TT Context M 4.77 30.00 2 0 +exampleBAM.bam.bam 30 17 Cycle M 6.99 30.00 4 0 +exampleBAM.bam.bam 33 69 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 6 36 Cycle M 3.01 6.00 1 0 +exampleBAM.bam.bam 17 GT Context M 3.01 17.00 1 0 +exampleBAM.bam.bam 21 64 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 34 AC Context M 3.01 34.00 1 0 +exampleBAM.bam.bam 16 GC Context M 3.01 16.00 1 0 +exampleBAM.bam.bam 45 CCTCGTCC Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 49 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 61 Cycle I 9.03 28.00 7 0 +exampleBAM.bam.bam 45 AGGTTATC Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 45 GGCACCCA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TGTGTCTT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TCAATAAT Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 TCTCCAGG Context D 3.01 4.00 1 0 +exampleBAM.bam.bam 6 AA Context M 4.77 6.00 2 0 +exampleBAM.bam.bam 31 TC Context M 3.01 31.00 1 0 +exampleBAM.bam.bam 31 19 Cycle M 6.99 31.00 4 0 +exampleBAM.bam.bam 8 58 Cycle M 3.01 8.00 1 0 +exampleBAM.bam.bam 28 54 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 GGTGGCCT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 18 10 Cycle M 4.77 18.00 2 0 +exampleBAM.bam.bam 18 CA Context M 4.77 18.00 2 0 +exampleBAM.bam.bam 27 57 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 21 AT Context M 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TGTATTTG Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 TTCTAGAG Context D 3.01 4.00 1 0 +exampleBAM.bam.bam 45 GGTTGGGT Context D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 GTTTGGGT Context D 7.78 32.00 5 0 +exampleBAM.bam.bam 13 TA Context M 3.01 13.00 1 0 +exampleBAM.bam.bam 20 AC Context M 3.01 20.00 1 0 +exampleBAM.bam.bam 45 CCCAGATC Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 32 2 Cycle M 4.77 32.00 2 0 +exampleBAM.bam.bam 27 27 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 6 67 Cycle M 4.77 6.00 2 0 +exampleBAM.bam.bam 45 TAGGGTTA Context D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 GTTGGTTA Context D 3.01 13.00 1 0 +exampleBAM.bam.bam 45 TCATGGTG Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 TCTAATCT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TTGGGTTA Context D 7.78 30.00 5 0 +exampleBAM.bam.bam 30 TG Context M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 18 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 30 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 CCAGGTTA Context D 3.01 9.00 1 0 +exampleBAM.bam.bam 45 CAAAATCT Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 25 31 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 34 6 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 34 AA Context M 3.01 34.00 1 0 +exampleBAM.bam.bam 17 GG Context M 3.01 17.00 1 0 +exampleBAM.bam.bam 23 35 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TCTTTATA Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 GATCCAGT Context D 3.01 18.00 1 0 +exampleBAM.bam.bam 45 48 Cycle D 7.78 24.00 5 0 +exampleBAM.bam.bam 45 60 Cycle I 7.78 29.00 5 0 +exampleBAM.bam.bam 45 ATCCATTT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AATGAGTC Context I 3.01 17.00 1 0 +exampleBAM.bam.bam 31 TA Context M 4.77 31.00 2 0 +exampleBAM.bam.bam 21 AA Context M 3.01 21.00 1 0 +exampleBAM.bam.bam 34 65 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTCCAGGT Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 18 CT Context M 3.01 18.00 1 0 +exampleBAM.bam.bam 33 3 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TCAGGCCA Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 TTGCACTT Context D 3.01 17.00 1 0 +exampleBAM.bam.bam 28 53 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 TTCACTGA Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 19 CC Context M 3.01 19.00 1 0 +exampleBAM.bam.bam 32 1 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 45 GATAACCT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 AACTGGGA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 16 73 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 45 TCCATTTC Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 21 66 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 34 5 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 34 AT Context M 16.23 34.00 41 0 +exampleBAM.bam.bam 16 47 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 45 CACATGAT Context D 3.01 12.00 1 0 +exampleBAM.bam.bam 45 17 Cycle D 7.78 27.00 5 0 +exampleBAM.bam.bam 45 29 Cycle I 7.78 33.00 5 0 +exampleBAM.bam.bam 45 ATCAATAA Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 ACCATGAT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TCGGGTTT Context D 8.45 6.00 6 0 +exampleBAM.bam.bam 45 TCCATGAT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 6 AG Context M -0.00 6.00 1 1 +exampleBAM.bam.bam 6 4 Cycle M 3.01 6.00 1 0 +exampleBAM.bam.bam 31 TT Context M 3.01 31.00 1 0 +exampleBAM.bam.bam 45 ATGATAAC Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 51 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 63 Cycle I 9.03 17.00 7 0 +exampleBAM.bam.bam 45 CGTGAGTG Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 45 CACCCAGA Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 16 GT Context M 3.01 16.00 1 0 +exampleBAM.bam.bam 5 70 Cycle M 3.01 5.00 1 0 +exampleBAM.bam.bam 45 GCTTTATT Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 ATGGTGGC Context I 3.01 12.00 1 0 +exampleBAM.bam.bam 45 TTATTATT Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 34 64 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 21 AC Context M 6.02 21.00 3 0 +exampleBAM.bam.bam 33 2 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TTTCACTG Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TCGTGAGT Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 45 GTGTCTTT Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 45 TAATGAGT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TACTCTTT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CACTTTCA Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CCATTTCA Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 ATATAAAG Context D 3.01 12.00 1 0 +exampleBAM.bam.bam 45 GAGTTTCA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 CCAGGCAC Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 29 54 Cycle M 4.77 29.00 2 0 +exampleBAM.bam.bam 6 65 Cycle M 1.76 6.00 2 1 +exampleBAM.bam.bam 19 10 Cycle M 4.77 19.00 2 0 +exampleBAM.bam.bam 19 CA Context M 4.77 19.00 2 0 +exampleBAM.bam.bam 45 TTTCTGTG Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 33 32 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GTTTGGGC Context D 7.78 30.00 5 0 +exampleBAM.bam.bam 45 TGGAGATT Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 45 ATTAGATT Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 34 4 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 21 67 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TGGGGTTG Context D 7.78 22.00 5 0 +exampleBAM.bam.bam 45 TGCAATCC Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GGGGGTTG Context D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 TAGGGTTG Context D 7.78 27.00 5 0 +exampleBAM.bam.bam 45 TTAATGAG Context D 3.01 8.00 1 0 +exampleBAM.bam.bam 30 18 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 30 TA Context M 7.78 30.00 5 0 +exampleBAM.bam.bam 45 16 Cycle D 7.78 9.00 5 0 +exampleBAM.bam.bam 45 28 Cycle I 7.78 20.00 5 0 +exampleBAM.bam.bam 45 ACATGGTA Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GAGTCAAT Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 CAATGTGA Context I 3.01 20.00 1 0 +exampleBAM.bam.bam 45 AATCTCCA Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 45 ATTTCACT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 ATATCAAT Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 8 57 Cycle M -0.00 8.00 1 1 +exampleBAM.bam.bam 34 38 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 31 16 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 31 TG Context M 14.47 31.00 27 0 +exampleBAM.bam.bam 45 GGGTTCGG Context I 9.03 28.00 7 0 +exampleBAM.bam.bam 45 CTAGAGTT Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 45 50 Cycle D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 62 Cycle I 9.03 6.00 7 0 +exampleBAM.bam.bam 45 GATATAAA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GCCACCAT Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 ACCTGGAG Context I 3.01 22.00 1 0 +exampleBAM.bam.bam 5 AG Context M 3.01 5.00 1 0 +exampleBAM.bam.bam 45 AGGTGGAG Context I 3.01 22.00 1 0 +exampleBAM.bam.bam 45 GCAAAATC Context D 3.01 9.00 1 0 +exampleBAM.bam.bam 45 CACAGCAA Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 28 TT Context M 3.01 28.00 1 0 +exampleBAM.bam.bam 33 39 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 19 GT Context M 3.01 19.00 1 0 +exampleBAM.bam.bam 23 64 Cycle M 4.77 23.00 2 0 +exampleBAM.bam.bam 27 30 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 32 AC Context M 3.01 32.00 1 0 +exampleBAM.bam.bam 45 AAGTGACA Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 5 38 Cycle M 3.01 5.00 1 0 +exampleBAM.bam.bam 45 AGAGTTTC Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 AGTGACAT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GCCTGAAA Context I 3.01 12.00 1 0 +exampleBAM.bam.bam 45 CTCTTTGT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 33 AT Context M 4.77 33.00 2 0 +exampleBAM.bam.bam 45 TGGCAGCC Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 4 AA Context M 3.01 4.00 1 0 +exampleBAM.bam.bam 29 TC Context M 3.01 29.00 1 0 +exampleBAM.bam.bam 34 71 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AGTTTCAC Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 CATTTCAC Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 53 Cycle D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 57 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 CATGATAA Context I 3.01 4.00 1 0 +exampleBAM.bam.bam 45 TAGAGTTT Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GGTTCGGG Context D 9.03 6.00 7 0 +exampleBAM.bam.bam 45 CTTTATTA Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 45 CTTTGTAT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AGCCTCGT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTGTGTCT Context I 3.01 6.00 1 0 +exampleBAM.bam.bam 45 CTTAAGTG Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 ATTCTATT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CTAATCTC Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 23 Cycle D 7.78 22.00 5 0 +exampleBAM.bam.bam 45 27 Cycle I 7.78 28.00 5 0 +exampleBAM.bam.bam 30 21 Cycle M 4.77 30.00 2 0 +exampleBAM.bam.bam 45 TGAAAGTG Context I 3.01 8.00 1 0 +exampleBAM.bam.bam 45 TGGTATTA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 23 38 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 34 3 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GGTTAGGG Context I 8.45 5.00 6 0 +exampleBAM.bam.bam 45 GTGCAAAG Context D 3.01 5.00 1 0 +exampleBAM.bam.bam 28 TG Context M 12.55 28.00 17 0 +exampleBAM.bam.bam 45 ATTCTTAA Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GAGCCTTT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 27 31 Cycle M 4.77 27.00 2 0 +exampleBAM.bam.bam 29 48 Cycle M 4.77 29.00 2 0 +exampleBAM.bam.bam 32 AA Context M 3.01 32.00 1 0 +exampleBAM.bam.bam 19 GG Context M 4.77 19.00 2 0 +exampleBAM.bam.bam 4 37 Cycle M 3.01 4.00 1 0 +exampleBAM.bam.bam 45 GGGTTTGG Context I 8.45 23.00 6 0 +exampleBAM.bam.bam 33 AG Context M 6.02 33.00 3 0 +exampleBAM.bam.bam 28 50 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 ATTACTCT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 ACACAGCA Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 ATGTGAAC Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 32 36 Cycle M 4.77 32.00 2 0 +exampleBAM.bam.bam 29 TA Context M 4.77 29.00 2 0 +exampleBAM.bam.bam 34 70 Cycle M 6.99 34.00 4 0 +exampleBAM.bam.bam 17 76 Cycle M 14.13 17.00 387 14 +exampleBAM.bam.bam 30 54 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 24 25 Cycle M 4.77 24.00 2 0 +exampleBAM.bam.bam 45 ATCGTGAG Context D 3.01 8.00 1 0 +exampleBAM.bam.bam 45 GATCGTGA Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 52 Cycle D 7.78 6.00 5 0 +exampleBAM.bam.bam 45 56 Cycle I 7.78 18.00 5 0 +exampleBAM.bam.bam 45 CCAGATCC Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 16 CA Context M 3.01 16.00 1 0 +exampleBAM.bam.bam 8 63 Cycle M 3.01 8.00 1 0 +exampleBAM.bam.bam 14 TG Context M 3.01 14.00 1 0 +exampleBAM.bam.bam 23 AT Context M 6.02 23.00 3 0 +exampleBAM.bam.bam 19 72 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 30 20 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TTCTATTC Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GTCAATGT Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 AAAATCTA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 22 Cycle D 7.78 5.00 5 0 +exampleBAM.bam.bam 45 26 Cycle I 8.45 5.00 6 0 +exampleBAM.bam.bam 34 2 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 19 GC Context M 3.01 19.00 1 0 +exampleBAM.bam.bam 6 68 Cycle M 5.74 6.00 14 3 +exampleBAM.bam.bam 23 66 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 27 28 Cycle M 4.77 27.00 2 0 +exampleBAM.bam.bam 32 AT Context M 4.77 32.00 2 0 +exampleBAM.bam.bam 5 AA Context M 3.01 5.00 1 0 +exampleBAM.bam.bam 45 TATTACTC Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 33 37 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGGGCTGG Context D 7.78 32.00 5 0 +exampleBAM.bam.bam 28 TC Context M 3.01 28.00 1 0 +exampleBAM.bam.bam 4 AG Context M 3.01 4.00 1 0 +exampleBAM.bam.bam 29 TT Context M 4.77 29.00 2 0 +exampleBAM.bam.bam 18 GT Context M 3.01 18.00 1 0 +exampleBAM.bam.bam 45 AAAGACAC Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 GCCTTTGC Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 ACCCAGAT Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TCTTAAGT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 13 55 Cycle M 3.01 13.00 1 0 +exampleBAM.bam.bam 45 GTATTTGC Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 33 7 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 33 AC Context M 3.01 33.00 1 0 +exampleBAM.bam.bam 23 AA Context M 3.01 23.00 1 0 +exampleBAM.bam.bam 8 60 Cycle M 3.01 8.00 1 0 +exampleBAM.bam.bam 22 38 Cycle M 3.01 22.00 1 0 +exampleBAM.bam.bam 45 CATGATCG Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 55 Cycle D 7.78 27.00 5 0 +exampleBAM.bam.bam 45 59 Cycle I 7.78 33.00 5 0 +exampleBAM.bam.bam 45 TCCAGTTC Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 GTGACATG Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 TTCACATG Context I 3.01 22.00 1 0 +exampleBAM.bam.bam 45 TAAGTGAC Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 4 64 Cycle M 4.77 4.00 5 1 +exampleBAM.bam.bam 25 24 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 22 AG Context M 4.77 22.00 2 0 +exampleBAM.bam.bam 45 CTTTCAGG Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 ATCATGGT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 21 Cycle D 7.78 25.00 5 0 +exampleBAM.bam.bam 45 25 Cycle I 7.78 24.00 5 0 +exampleBAM.bam.bam 45 GACATGGT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 30 23 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 33 67 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 24 56 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TATTATTG Context I 3.01 8.00 1 0 +exampleBAM.bam.bam 45 GTTAATGA Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 32 AG Context M 4.77 32.00 2 0 +exampleBAM.bam.bam 23 67 Cycle M 12.04 23.00 15 0 +exampleBAM.bam.bam 45 TGGAGCCT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TGGTGGCC Context D 3.01 6.00 1 0 +exampleBAM.bam.bam 28 TA Context M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 CAGCAAAA Context D 3.01 6.00 1 0 +exampleBAM.bam.bam 45 GGCAGCCT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 34 68 Cycle M 8.45 34.00 6 0 +exampleBAM.bam.bam 21 3 Cycle M 12.79 21.00 18 0 +exampleBAM.bam.bam 45 TCTTTGTA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GTTCGGGT Context D 9.03 17.00 7 0 +exampleBAM.bam.bam 28 48 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 33 AA Context M 3.01 33.00 1 0 +exampleBAM.bam.bam 18 GG Context M 3.01 18.00 1 0 +exampleBAM.bam.bam 45 CGGGTTTG Context D 8.45 31.00 6 0 +exampleBAM.bam.bam 34 34 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 23 AC Context M 3.01 23.00 1 0 +exampleBAM.bam.bam 30 52 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 24 27 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 45 AGGCCACC Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 20 69 Cycle M 3.01 20.00 1 0 +exampleBAM.bam.bam 45 AAAGTGCA Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 45 ATTGATAT Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 AATGTGAA Context D 3.01 5.00 1 0 +exampleBAM.bam.bam 45 54 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 58 Cycle I 7.78 18.00 5 0 +exampleBAM.bam.bam 45 ACTTTCAG Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 23 37 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 21 71 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 33 66 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 15 TG Context M 3.01 15.00 1 0 +exampleBAM.bam.bam 45 TTGTATTT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 20 Cycle D 7.78 11.00 5 0 +exampleBAM.bam.bam 45 24 Cycle I 7.78 29.00 5 0 +exampleBAM.bam.bam 45 CAGGCCAC Context I 3.01 20.00 1 0 +exampleBAM.bam.bam 23 59 Cycle M 4.77 23.00 2 0 +exampleBAM.bam.bam 17 20 Cycle M 3.01 17.00 1 0 +exampleBAM.bam.bam 30 CG Context M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TTGATATA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TTCTTAAG Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 15 14 Cycle M 8.45 15.00 6 0 +exampleBAM.bam.bam 45 GAACTGGG Context D 3.01 6.00 1 0 +exampleBAM.bam.bam 45 6 Cycle I 7.78 31.00 5 0 +exampleBAM.bam.bam 45 10 Cycle D 7.78 24.00 5 0 +exampleBAM.bam.bam 45 GGGCTGGG Context D 7.78 25.00 5 0 +exampleBAM.bam.bam 31 10 Cycle M 6.02 31.00 3 0 +exampleBAM.bam.bam 34 60 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 25 37 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 6 31 Cycle M -0.00 6.00 1 1 +exampleBAM.bam.bam 30 42 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GTTCTAGA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TATTTGCA Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 24 5 Cycle M 4.77 24.00 2 0 +exampleBAM.bam.bam 45 CCTTTGCA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 CAGGCACC Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 36 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 40 Cycle D 9.03 11.00 7 0 +exampleBAM.bam.bam 29 GA Context M 4.77 29.00 2 0 +exampleBAM.bam.bam 21 29 Cycle M 6.02 21.00 3 0 +exampleBAM.bam.bam 45 TAATCTCC Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 15 74 Cycle M 4.77 15.00 2 0 +exampleBAM.bam.bam 45 TTGGGGGT Context I 7.78 20.00 5 0 +exampleBAM.bam.bam 33 24 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GTTGGGGT Context I 7.78 25.00 5 0 +exampleBAM.bam.bam 45 GCTGGGGT Context I 7.78 10.00 5 0 +exampleBAM.bam.bam 45 66 Cycle I 8.45 31.00 6 0 +exampleBAM.bam.bam 45 CTTGGCTT Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 GGCCACCA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 19 TG Context M 4.77 19.00 2 0 +exampleBAM.bam.bam 45 TTCAGGCC Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 GGTTAATG Context I 3.01 8.00 1 0 +exampleBAM.bam.bam 45 GGTGGAGC Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 28 GG Context M 6.02 28.00 3 0 +exampleBAM.bam.bam 45 GAGATTAG Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 7 Cycle I 7.78 29.00 5 0 +exampleBAM.bam.bam 45 11 Cycle D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 TTACTCTT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 30 9 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TTTATATC Context I 3.01 22.00 1 0 +exampleBAM.bam.bam 45 TGGTTAAT Context I 3.01 8.00 1 0 +exampleBAM.bam.bam 45 GTATTACT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 31 11 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 31 CC Context M 3.01 31.00 1 0 +exampleBAM.bam.bam 34 61 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 25 36 Cycle M 6.02 25.00 3 0 +exampleBAM.bam.bam 45 ACAGCAAA Context D 3.01 15.00 1 0 +exampleBAM.bam.bam 45 AGTGCAAA Context D 3.01 13.00 1 0 +exampleBAM.bam.bam 45 37 Cycle I 8.45 29.00 6 0 +exampleBAM.bam.bam 45 41 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 TCCAGGTT Context I 3.01 22.00 1 0 +exampleBAM.bam.bam 45 GTGAGTGT Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 45 TTATCATG Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 24 AG Context M 4.77 24.00 2 0 +exampleBAM.bam.bam 29 GC Context M 3.01 29.00 1 0 +exampleBAM.bam.bam 32 57 Cycle M 8.45 32.00 6 0 +exampleBAM.bam.bam 45 67 Cycle I 8.45 23.00 6 0 +exampleBAM.bam.bam 18 19 Cycle M 3.01 18.00 1 0 +exampleBAM.bam.bam 45 CTGGAGAT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 AGATTTTT Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 45 AAATCTAA Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 CTGAAAGT Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 45 AGGCACCC Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TCTGTGTC Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TTGGGCTG Context D 7.78 28.00 5 0 +exampleBAM.bam.bam 28 47 Cycle M 4.77 28.00 2 0 +exampleBAM.bam.bam 45 GTTGGGGG Context I 7.78 28.00 5 0 +exampleBAM.bam.bam 19 TT Context M 4.77 19.00 2 0 +exampleBAM.bam.bam 29 45 Cycle M 4.77 29.00 2 0 +exampleBAM.bam.bam 45 CCTGGAGA Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 ATGATTCT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GCCAGGCA Context I 3.01 18.00 1 0 +exampleBAM.bam.bam 45 TTTATTAT Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 33 59 Cycle M 16.13 33.00 40 0 +exampleBAM.bam.bam 45 TCTATTCT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 TAACCTGG Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 30 CA Context M 6.99 30.00 4 0 +exampleBAM.bam.bam 15 GG Context M 8.45 15.00 6 0 +exampleBAM.bam.bam 45 GACACAGC Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 AACCTGGA Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 4 Cycle I 7.78 17.00 5 0 +exampleBAM.bam.bam 45 8 Cycle D 7.78 15.00 5 0 +exampleBAM.bam.bam 25 AT Context M 4.77 25.00 2 0 +exampleBAM.bam.bam 6 63 Cycle M 4.77 6.00 2 0 +exampleBAM.bam.bam 45 TTTGCAAT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 TTTGCACT Context I 3.01 18.00 1 0 +exampleBAM.bam.bam 45 TTAAGTGA Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGAGTCAA Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 22 59 Cycle M 3.01 22.00 1 0 +exampleBAM.bam.bam 45 CTCGTCCA Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 38 Cycle I 8.45 5.00 6 0 +exampleBAM.bam.bam 45 42 Cycle D 7.78 30.00 5 0 +exampleBAM.bam.bam 34 62 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 31 CG Context M 3.01 31.00 1 0 +exampleBAM.bam.bam 31 8 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 27 69 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 26 3 Cycle M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TATAAAGA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GGGGTTGG Context D 8.45 32.00 6 0 +exampleBAM.bam.bam 45 64 Cycle I 9.03 4.00 7 0 +exampleBAM.bam.bam 45 76 Cycle D 28.83 17.00 763 0 +exampleBAM.bam.bam 45 GATTCTAT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AGACACAG Context I 3.01 6.00 1 0 +exampleBAM.bam.bam 45 AGGGTTGG Context D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 AGTGTTGG Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 29 12 Cycle M 4.77 29.00 2 0 +exampleBAM.bam.bam 29 GG Context M 6.99 29.00 4 0 +exampleBAM.bam.bam 8 71 Cycle M 6.99 8.00 9 1 +exampleBAM.bam.bam 45 GTGAACTG Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TTGGCTTT Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 9 69 Cycle M 3.01 9.00 1 0 +exampleBAM.bam.bam 45 CCTGAAAG Context I 3.01 9.00 1 0 +exampleBAM.bam.bam 45 CTTTGCAC Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 20 29 Cycle M 3.01 20.00 1 0 +exampleBAM.bam.bam 12 40 Cycle M 3.01 12.00 1 0 +exampleBAM.bam.bam 32 24 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 21 61 Cycle M 4.77 21.00 2 0 +exampleBAM.bam.bam 45 CATGGTAT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 GCACCCAG Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 16 55 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 45 ATGATCGT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 5 Cycle I 7.78 31.00 5 0 +exampleBAM.bam.bam 45 9 Cycle D 7.78 25.00 5 0 +exampleBAM.bam.bam 30 CC Context M 4.77 30.00 2 0 +exampleBAM.bam.bam 23 56 Cycle M 6.02 23.00 3 0 +exampleBAM.bam.bam 6 62 Cycle M 3.01 6.00 1 0 +exampleBAM.bam.bam 31 43 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 25 AG Context M 3.01 25.00 1 0 +exampleBAM.bam.bam 45 ATAACCTG Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 45 39 Cycle I 9.03 31.00 7 0 +exampleBAM.bam.bam 45 43 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 GAAAGTGC Context D 3.01 4.00 1 0 +exampleBAM.bam.bam 24 AA Context M 3.01 24.00 1 0 +exampleBAM.bam.bam 24 6 Cycle M 6.02 24.00 3 0 +exampleBAM.bam.bam 45 TTATTGAT Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 34 63 Cycle M 6.02 34.00 3 0 +exampleBAM.bam.bam 31 CT Context M 4.77 31.00 2 0 +exampleBAM.bam.bam 45 65 Cycle I 8.45 6.00 6 0 +exampleBAM.bam.bam 18 TT Context M 6.02 18.00 7 1 +exampleBAM.bam.bam 45 GATTTTTC Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 AGTTCTAG Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TAAAGACA Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 TGAGTGTT Context I 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TTTCACAT Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 45 GTGGAGCC Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 19 49 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 29 GT Context M 4.77 29.00 2 0 +exampleBAM.bam.bam 5 26 Cycle M -0.00 5.00 1 1 +exampleBAM.bam.bam 45 AAGTGCAA Context D 3.01 15.00 1 0 +exampleBAM.bam.bam 45 ATTTGCAA Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 ATCTAATC Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 20 28 Cycle M 4.77 20.00 5 1 +exampleBAM.bam.bam 45 GGTATTAC Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGTGAACT Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 45 TGGCCTGA Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 33 57 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 21 60 Cycle M 6.02 21.00 3 0 +exampleBAM.bam.bam 29 47 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 34 56 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 31 GA Context M 4.77 31.00 2 0 +exampleBAM.bam.bam 45 TCGTCCAT Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TGATTCTA Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 ATCCAGTT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 32 Cycle I 9.03 25.00 7 0 +exampleBAM.bam.bam 45 44 Cycle D 7.78 26.00 5 0 +exampleBAM.bam.bam 45 CATGATTC Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CAATCCAT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CAGTTCTA Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 34 26 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 8 AT Context M -0.00 8.00 1 1 +exampleBAM.bam.bam 45 GGGTTAGG Context D 8.45 29.00 6 0 +exampleBAM.bam.bam 30 12 Cycle M 4.77 30.00 2 0 +exampleBAM.bam.bam 45 TATATCAA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 GCAATCCA Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GGAGCCTT Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 CAGATCCA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 2 Cycle I 7.78 28.00 5 0 +exampleBAM.bam.bam 45 14 Cycle D 7.78 15.00 5 0 +exampleBAM.bam.bam 45 GAGTGTTG Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 32 30 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 27 AC Context M 3.01 27.00 1 0 +exampleBAM.bam.bam 21 59 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TGTCTTTA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TCAATGTG Context I 3.01 15.00 1 0 +exampleBAM.bam.bam 45 TGGCTTTA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 13 GA Context M 3.01 13.00 1 0 +exampleBAM.bam.bam 45 CCATGATT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 29 CA Context M 3.01 29.00 1 0 +exampleBAM.bam.bam 19 54 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 45 TATCAATA Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 45 TTTGGGCT Context I 7.78 19.00 5 0 +exampleBAM.bam.bam 45 TTGGTTAA Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TGCACTTT Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TCTAGAGT Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 26 AT Context M 3.01 26.00 1 0 +exampleBAM.bam.bam 20 57 Cycle M 3.01 20.00 1 0 +exampleBAM.bam.bam 45 GCCTCGTC Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 70 Cycle I 7.78 19.00 5 0 +exampleBAM.bam.bam 45 74 Cycle D 7.78 5.00 5 0 +exampleBAM.bam.bam 18 22 Cycle M 3.01 18.00 1 0 +exampleBAM.bam.bam 25 32 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 27 66 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 31 15 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 31 GC Context M 6.02 31.00 3 0 +exampleBAM.bam.bam 45 33 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 45 Cycle D 7.78 29.00 5 0 +exampleBAM.bam.bam 45 GGAGATTA Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 AGATCCAG Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 16 19 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 45 ATGGTATT Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 ATCTCCAG Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 13 75 Cycle M 6.02 13.00 3 0 +exampleBAM.bam.bam 45 TTTGTATT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 TATCATGG Context I 3.01 17.00 1 0 +exampleBAM.bam.bam 45 TGACATGG Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 17 TT Context M 14.13 17.00 387 14 +exampleBAM.bam.bam 31 45 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 8 AG Context M 4.77 8.00 2 0 +exampleBAM.bam.bam 34 27 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 3 Cycle I 7.78 26.00 5 0 +exampleBAM.bam.bam 45 15 Cycle D 7.78 22.00 5 0 +exampleBAM.bam.bam 45 TTATATCA Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 TGATATAA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GGTTATCA Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 45 TCACTGAT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GTGGCCTG Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 19 21 Cycle M 4.77 19.00 2 0 +exampleBAM.bam.bam 32 31 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 27 AA Context M 3.01 27.00 1 0 +exampleBAM.bam.bam 45 CACTGATG Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 ATAAAGAC Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 45 GCACTTTC Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CAGCCTCG Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 28 CT Context M 4.77 28.00 2 0 +exampleBAM.bam.bam 45 71 Cycle I 7.78 28.00 5 0 +exampleBAM.bam.bam 45 75 Cycle D 7.78 10.00 5 0 +exampleBAM.bam.bam 45 AGCAAAAT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TTGCAATC Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 33 29 Cycle M 7.78 33.00 5 0 +exampleBAM.bam.bam 26 AG Context M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 GGTTTGGG Context D 8.45 6.00 6 0 +exampleBAM.bam.bam 45 GGGTTGGG Context D 9.03 25.00 7 0 +exampleBAM.bam.bam 24 3 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TTTTTCTG Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 45 TTAGATTT Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 16 TG Context M 4.77 16.00 2 0 +exampleBAM.bam.bam 45 34 Cycle I 7.78 16.00 5 0 +exampleBAM.bam.bam 45 46 Cycle D 7.78 5.00 5 0 +exampleBAM.bam.bam 45 ATGAGTCA Context D 3.01 8.00 1 0 +exampleBAM.bam.bam 27 65 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 31 12 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 31 GG Context M 6.99 31.00 4 0 +exampleBAM.bam.bam 34 58 Cycle M 6.02 34.00 3 0 +exampleBAM.bam.bam 24 33 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 15 8 Cycle M 3.01 15.00 1 0 +exampleBAM.bam.bam 26 67 Cycle M 3.01 26.00 1 0 +exampleBAM.bam.bam 30 GA Context M 4.77 30.00 2 0 +exampleBAM.bam.bam 45 12 Cycle D 7.78 33.00 5 0 +exampleBAM.bam.bam 45 GGCCTGAA Context I 3.01 6.00 1 0 +exampleBAM.bam.bam 45 AGATTAGA Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 GCAGCCTC Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CATGGTGG Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 45 AATCCATT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CTTTATAT Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 29 76 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 23 61 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 28 CA Context M 4.77 28.00 2 0 +exampleBAM.bam.bam 45 GTTAGGGT Context I 9.03 31.00 7 0 +exampleBAM.bam.bam 45 ACTCTTTG Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 AGCCTTTG Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 45 ACATGATC Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 ATTATTGA Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 32 28 Cycle M 6.02 32.00 3 0 +exampleBAM.bam.bam 29 42 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 27 AT Context M 7.78 27.00 5 0 +exampleBAM.bam.bam 45 TGGGTTAG Context I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 TGGGTTCG Context D 7.78 29.00 5 0 +exampleBAM.bam.bam 26 7 Cycle M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TTTTCTGT Context I 3.01 22.00 1 0 +exampleBAM.bam.bam 45 AGGGTTAG Context I 7.78 33.00 5 0 +exampleBAM.bam.bam 45 AGGGTTCG Context D 7.78 30.00 5 0 +exampleBAM.bam.bam 45 CGGGTTCG Context D 7.78 24.00 5 0 +exampleBAM.bam.bam 45 68 Cycle I 8.45 6.00 6 0 +exampleBAM.bam.bam 45 72 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 AGTCAATG Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 29 8 Cycle M 4.77 29.00 2 0 +exampleBAM.bam.bam 29 CG Context M 13.42 29.00 21 0 +exampleBAM.bam.bam 4 29 Cycle M 3.01 4.00 1 0 +exampleBAM.bam.bam 16 TT Context M 8.45 16.00 13 1 +exampleBAM.bam.bam 45 CACCATGA Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 35 Cycle I 7.78 30.00 5 0 +exampleBAM.bam.bam 45 47 Cycle D 7.78 29.00 5 0 +exampleBAM.bam.bam 45 CTATTCTT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 AATCTAAT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GTGTTGGT Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 30 45 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TCACATGA Context I 3.01 13.00 1 0 +exampleBAM.bam.bam 9 AG Context M 3.01 9.00 1 0 +exampleBAM.bam.bam 45 GTCCATGA Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 31 13 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 31 GT Context M 4.77 31.00 2 0 +exampleBAM.bam.bam 34 59 Cycle M 4.77 34.00 2 0 +exampleBAM.bam.bam 45 AAGACACA Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 45 CCACCATG Context D 3.01 14.00 1 0 +exampleBAM.bam.bam 45 1 Cycle I 7.78 18.00 5 0 +exampleBAM.bam.bam 45 13 Cycle D 7.78 31.00 5 0 +exampleBAM.bam.bam 16 51 Cycle M 3.01 16.00 1 0 +exampleBAM.bam.bam 45 CGTCCATG Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CTGGGGTT Context I 28.83 17.00 763 0 +exampleBAM.bam.bam 45 GTTGGGTT Context I 7.78 16.00 5 0 +exampleBAM.bam.bam 45 TTCGGGTT Context I 9.03 4.00 7 0 +exampleBAM.bam.bam 45 TTAGGGTT Context I 9.03 11.00 7 0 +exampleBAM.bam.bam 45 TGGGGGTT Context I 7.78 33.00 5 0 +exampleBAM.bam.bam 45 TTTGGGTT Context I 7.78 18.00 5 0 +exampleBAM.bam.bam 45 TTGGGGTT Context I 7.78 5.00 5 0 +exampleBAM.bam.bam 9 38 Cycle M 3.01 9.00 1 0 +exampleBAM.bam.bam 45 GTTATCAT Context I 3.01 23.00 1 0 +exampleBAM.bam.bam 30 GC Context M 13.22 30.00 20 0 +exampleBAM.bam.bam 17 TC Context M 3.01 17.00 1 0 +exampleBAM.bam.bam 34 25 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CCATGATA Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 28 11 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 TATTGATA Context D 3.01 26.00 1 0 +exampleBAM.bam.bam 29 43 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 45 CCAGTTCT Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 45 CAGGTTAT Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 69 Cycle I 7.78 30.00 5 0 +exampleBAM.bam.bam 45 73 Cycle D 7.78 25.00 5 0 +exampleBAM.bam.bam 28 41 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 33 31 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGATCGTG Context D 3.01 22.00 1 0 +exampleBAM.bam.bam 29 9 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 12 GC Context M 3.01 12.00 1 0 +exampleBAM.bam.bam 29 6 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 45 GCCTCGTC Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 70 Cycle D 7.78 19.00 5 0 +exampleBAM.bam.bam 45 74 Cycle I 7.78 5.00 5 0 +exampleBAM.bam.bam 45 TTTGGGCT Context D 7.78 19.00 5 0 +exampleBAM.bam.bam 45 TATCAATA Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 33 TG Context M 6.02 33.00 3 0 +exampleBAM.bam.bam 45 TTGGTTAA Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TCTAGAGT Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TGCACTTT Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 4 49 Cycle M 3.01 4.00 1 0 +exampleBAM.bam.bam 32 18 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 10 GT Context M 3.01 10.00 1 0 +exampleBAM.bam.bam 27 11 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 27 CC Context M 3.01 27.00 1 0 +exampleBAM.bam.bam 45 CCATGATT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 5 TT Context M 1.76 5.00 2 1 +exampleBAM.bam.bam 18 56 Cycle M 3.01 18.00 1 0 +exampleBAM.bam.bam 45 TGGCTTTA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TGTCTTTA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TCAATGTG Context D 3.01 15.00 1 0 +exampleBAM.bam.bam 12 68 Cycle M 6.99 12.00 4 0 +exampleBAM.bam.bam 31 32 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 45 GGAGCCTT Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 CAGATCCA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 2 Cycle D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 14 Cycle I 7.78 15.00 5 0 +exampleBAM.bam.bam 45 GCAATCCA Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 22 TC Context M 3.01 22.00 1 0 +exampleBAM.bam.bam 45 GAGTGTTG Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 15 AA Context M 4.77 15.00 2 0 +exampleBAM.bam.bam 45 GGGTTAGG Context I 8.45 29.00 6 0 +exampleBAM.bam.bam 45 TATATCAA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 17 62 Cycle M 3.01 17.00 1 0 +exampleBAM.bam.bam 23 TT Context M 3.01 23.00 1 0 +exampleBAM.bam.bam 45 CATGATTC Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 32 Cycle D 9.03 25.00 7 0 +exampleBAM.bam.bam 45 44 Cycle I 7.78 26.00 5 0 +exampleBAM.bam.bam 45 ATCCAGTT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 CAGTTCTA Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 CAATCCAT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGATTCTA Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TCGTCCAT Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 24 GT Context M 4.77 24.00 2 0 +exampleBAM.bam.bam 24 13 Cycle M 6.02 24.00 3 0 +exampleBAM.bam.bam 30 34 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 29 AC Context M 3.01 29.00 1 0 +exampleBAM.bam.bam 29 7 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 32 49 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 25 74 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 27 40 Cycle M 6.99 27.00 4 0 +exampleBAM.bam.bam 28 39 Cycle M 4.77 28.00 2 0 +exampleBAM.bam.bam 45 TTGCAATC Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 33 TT Context M 7.78 33.00 5 0 +exampleBAM.bam.bam 30 69 Cycle M 13.22 30.00 20 0 +exampleBAM.bam.bam 45 71 Cycle D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 75 Cycle I 7.78 10.00 5 0 +exampleBAM.bam.bam 45 AGCAAAAT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 32 19 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 32 TC Context M 6.99 32.00 4 0 +exampleBAM.bam.bam 29 37 Cycle M 6.99 29.00 4 0 +exampleBAM.bam.bam 27 CA Context M 4.77 27.00 2 0 +exampleBAM.bam.bam 45 ATAAAGAC Context D 3.01 29.00 1 0 +exampleBAM.bam.bam 45 CACTGATG Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CAGCCTCG Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 GCACTTTC Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 25 14 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 34 23 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 6 52 Cycle M -0.00 6.00 1 1 +exampleBAM.bam.bam 45 TGATATAA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GGTTATCA Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 45 TTATATCA Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 45 TCACTGAT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GTGGCCTG Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 3 Cycle D 7.78 26.00 5 0 +exampleBAM.bam.bam 45 15 Cycle I 7.78 22.00 5 0 +exampleBAM.bam.bam 17 63 Cycle M 3.01 17.00 1 0 +exampleBAM.bam.bam 23 TG Context M 3.01 23.00 1 0 +exampleBAM.bam.bam 45 TTTGTATT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 24 GG Context M 4.77 24.00 2 0 +exampleBAM.bam.bam 30 35 Cycle M 7.78 30.00 5 0 +exampleBAM.bam.bam 45 TATCATGG Context D 3.01 17.00 1 0 +exampleBAM.bam.bam 45 TGACATGG Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AGATCCAG Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 33 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 45 Cycle I 7.78 29.00 5 0 +exampleBAM.bam.bam 45 GGAGATTA Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 45 ATGGTATT Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 ATCTCCAG Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 CGGGTTCG Context I 7.78 24.00 5 0 +exampleBAM.bam.bam 45 AGGGTTAG Context D 7.78 33.00 5 0 +exampleBAM.bam.bam 45 AGGGTTCG Context I 7.78 30.00 5 0 +exampleBAM.bam.bam 45 68 Cycle D 8.45 6.00 6 0 +exampleBAM.bam.bam 45 72 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 AGTCAATG Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 33 18 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 33 TA Context M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGGGTTAG Context D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 TGGGTTCG Context I 7.78 29.00 5 0 +exampleBAM.bam.bam 45 TTTTCTGT Context D 3.01 22.00 1 0 +exampleBAM.bam.bam 4 TT Context M 4.77 4.00 5 1 +exampleBAM.bam.bam 29 4 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 25 73 Cycle M 12.30 25.00 16 0 +exampleBAM.bam.bam 45 AGCCTTTG Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 ACTCTTTG Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 18 58 Cycle M 6.02 18.00 7 1 +exampleBAM.bam.bam 45 ATTATTGA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 ACATGATC Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 28 AA Context M 3.01 28.00 1 0 +exampleBAM.bam.bam 33 48 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 GTTAGGGT Context D 9.03 31.00 7 0 +exampleBAM.bam.bam 32 16 Cycle M 6.02 32.00 3 0 +exampleBAM.bam.bam 32 TG Context M 4.77 32.00 2 0 +exampleBAM.bam.bam 45 GGCCTGAA Context D 3.01 6.00 1 0 +exampleBAM.bam.bam 45 12 Cycle I 7.78 33.00 5 0 +exampleBAM.bam.bam 45 AGATTAGA Context I 3.01 21.00 1 0 +exampleBAM.bam.bam 45 GCAGCCTC Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AATCCATT Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CTTTATAT Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 CATGGTGG Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 22 TT Context M 3.01 22.00 1 0 +exampleBAM.bam.bam 24 45 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 25 GT Context M 6.02 25.00 3 0 +exampleBAM.bam.bam 31 34 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 34 20 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 45 34 Cycle D 7.78 16.00 5 0 +exampleBAM.bam.bam 45 46 Cycle I 7.78 5.00 5 0 +exampleBAM.bam.bam 45 ATGAGTCA Context I 3.01 8.00 1 0 +exampleBAM.bam.bam 22 51 Cycle M 3.01 22.00 1 0 +exampleBAM.bam.bam 45 TTTTTCTG Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 45 GGGTTGGG Context I 9.03 25.00 7 0 +exampleBAM.bam.bam 45 GGTTTGGG Context I 8.45 6.00 6 0 +exampleBAM.bam.bam 45 TTAGATTT Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 30 32 Cycle M 3.01 30.00 1 0 +exampleBAM.bam.bam 23 19 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 23 TC Context M 3.01 23.00 1 0 +exampleBAM.bam.bam 25 47 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 10 75 Cycle M 3.01 10.00 1 0 +exampleBAM.bam.bam 11 GG Context M 3.01 11.00 1 0 +exampleBAM.bam.bam 33 TC Context M 16.13 33.00 40 0 +exampleBAM.bam.bam 45 TGATCGTG Context I 3.01 22.00 1 0 +exampleBAM.bam.bam 45 CAGGTTAT Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 CCAGTTCT Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 45 69 Cycle D 7.78 30.00 5 0 +exampleBAM.bam.bam 45 73 Cycle I 7.78 25.00 5 0 +exampleBAM.bam.bam 32 51 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 29 AT Context M 4.77 29.00 2 0 +exampleBAM.bam.bam 29 5 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 33 49 Cycle M 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TATTGATA Context I 3.01 26.00 1 0 +exampleBAM.bam.bam 45 CCATGATA Context I 3.01 25.00 1 0 +exampleBAM.bam.bam 32 TT Context M 6.02 32.00 3 0 +exampleBAM.bam.bam 45 TGGGGGTT Context D 7.78 33.00 5 0 +exampleBAM.bam.bam 45 TTAGGGTT Context D 9.03 11.00 7 0 +exampleBAM.bam.bam 45 TTCGGGTT Context D 9.03 4.00 7 0 +exampleBAM.bam.bam 45 TTGGGGTT Context D 7.78 5.00 5 0 +exampleBAM.bam.bam 45 TTTGGGTT Context D 7.78 18.00 5 0 +exampleBAM.bam.bam 45 GTTGGGTT Context D 7.78 16.00 5 0 +exampleBAM.bam.bam 45 GTTATCAT Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 45 CGTCCATG Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 CCACCATG Context I 3.01 14.00 1 0 +exampleBAM.bam.bam 45 AAGACACA Context D 3.01 28.00 1 0 +exampleBAM.bam.bam 45 1 Cycle D 7.78 18.00 5 0 +exampleBAM.bam.bam 45 13 Cycle I 7.78 31.00 5 0 +exampleBAM.bam.bam 45 CTGGGGTT Context D 28.83 17.00 763 0 +exampleBAM.bam.bam 22 TG Context M 10.79 22.00 11 0 +exampleBAM.bam.bam 25 GG Context M 12.30 25.00 16 0 +exampleBAM.bam.bam 8 CA Context M 3.01 8.00 1 0 +exampleBAM.bam.bam 34 21 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 24 GA Context M 3.01 24.00 1 0 +exampleBAM.bam.bam 45 GTGTTGGT Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TCACATGA Context D 3.01 13.00 1 0 +exampleBAM.bam.bam 45 GTCCATGA Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 CACCATGA Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 35 Cycle D 7.78 30.00 5 0 +exampleBAM.bam.bam 45 47 Cycle I 7.78 29.00 5 0 +exampleBAM.bam.bam 45 CTATTCTT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 AATCTAAT Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 25 46 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 27 76 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 34 55 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 31 1 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 23 18 Cycle M 3.01 23.00 1 0 +exampleBAM.bam.bam 31 66 Cycle M 14.47 31.00 27 0 +exampleBAM.bam.bam 45 GAGATTAG Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 TTCAGGCC Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 13 AA Context M 6.02 13.00 3 0 +exampleBAM.bam.bam 45 GGTTAATG Context D 3.01 8.00 1 0 +exampleBAM.bam.bam 45 GGTGGAGC Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 21 TT Context M 3.01 21.00 1 0 +exampleBAM.bam.bam 21 17 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 12 AG Context M 3.01 12.00 1 0 +exampleBAM.bam.bam 45 GGCCACCA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 GCTGGGGT Context D 7.78 10.00 5 0 +exampleBAM.bam.bam 45 CTTGGCTT Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 45 66 Cycle D 8.45 31.00 6 0 +exampleBAM.bam.bam 26 GT Context M 3.01 26.00 1 0 +exampleBAM.bam.bam 45 TAATCTCC Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 45 GTTGGGGT Context D 7.78 25.00 5 0 +exampleBAM.bam.bam 28 34 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 45 TTGGGGGT Context D 7.78 20.00 5 0 +exampleBAM.bam.bam 17 58 Cycle M 3.01 17.00 1 0 +exampleBAM.bam.bam 31 6 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 45 CCTTTGCA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 45 36 Cycle D 7.78 32.00 5 0 +exampleBAM.bam.bam 45 40 Cycle I 9.03 11.00 7 0 +exampleBAM.bam.bam 45 CAGGCACC Context D 3.01 30.00 1 0 +exampleBAM.bam.bam 45 GTTCTAGA Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TATTTGCA Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 34 TA Context M 3.01 34.00 1 0 +exampleBAM.bam.bam 25 CC Context M 3.01 25.00 1 0 +exampleBAM.bam.bam 22 23 Cycle M 10.79 22.00 11 0 +exampleBAM.bam.bam 45 GAACTGGG Context I 3.01 6.00 1 0 +exampleBAM.bam.bam 45 6 Cycle D 7.78 31.00 5 0 +exampleBAM.bam.bam 45 10 Cycle I 7.78 24.00 5 0 +exampleBAM.bam.bam 45 GGGCTGGG Context I 7.78 25.00 5 0 +exampleBAM.bam.bam 45 TTGATATA Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 TTCTTAAG Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 27 GA Context M 4.77 27.00 2 0 +exampleBAM.bam.bam 27 14 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 32 23 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 21 50 Cycle M 4.77 21.00 2 0 +exampleBAM.bam.bam 45 TAACCTGG Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TCTATTCT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 11 40 Cycle M 1.76 11.00 2 1 +exampleBAM.bam.bam 45 TTTATTAT Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 ATGATTCT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 CCTGGAGA Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 45 GCCAGGCA Context D 3.01 18.00 1 0 +exampleBAM.bam.bam 12 AT Context M 3.01 12.00 1 0 +exampleBAM.bam.bam 32 53 Cycle M 3.01 32.00 1 0 +exampleBAM.bam.bam 21 TG Context M 6.02 21.00 3 0 +exampleBAM.bam.bam 26 GG Context M 8.45 26.00 6 0 +exampleBAM.bam.bam 45 TCTGTGTC Context D 3.01 24.00 1 0 +exampleBAM.bam.bam 45 GTTGGGGG Context D 7.78 28.00 5 0 +exampleBAM.bam.bam 45 TTGGGCTG Context I 7.78 28.00 5 0 +exampleBAM.bam.bam 45 AAATCTAA Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 67 Cycle D 8.45 23.00 6 0 +exampleBAM.bam.bam 45 CTGGAGAT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 AGATTTTT Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 45 AGGCACCC Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 CTGAAAGT Context I 3.01 16.00 1 0 +exampleBAM.bam.bam 8 46 Cycle M 4.77 8.00 2 0 +exampleBAM.bam.bam 45 TCCAGGTT Context D 3.01 22.00 1 0 +exampleBAM.bam.bam 45 GTGAGTGT Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 24 CG Context M 10.21 24.00 20 1 +exampleBAM.bam.bam 45 TTATCATG Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 ACAGCAAA Context I 3.01 15.00 1 0 +exampleBAM.bam.bam 45 37 Cycle D 8.45 29.00 6 0 +exampleBAM.bam.bam 45 41 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 AGTGCAAA Context I 3.01 13.00 1 0 +exampleBAM.bam.bam 34 TC Context M 6.02 34.00 3 0 +exampleBAM.bam.bam 25 CA Context M 3.01 25.00 1 0 +exampleBAM.bam.bam 30 AT Context M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 TTTATATC Context D 3.01 22.00 1 0 +exampleBAM.bam.bam 45 TTACTCTT Context D 3.01 34.00 1 0 +exampleBAM.bam.bam 45 GTATTACT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 TGGTTAAT Context D 3.01 8.00 1 0 +exampleBAM.bam.bam 45 7 Cycle D 7.78 29.00 5 0 +exampleBAM.bam.bam 45 11 Cycle I 7.78 28.00 5 0 +exampleBAM.bam.bam 45 CCTGAAAG Context D 3.01 9.00 1 0 +exampleBAM.bam.bam 45 CTTTGCAC Context I 3.01 27.00 1 0 +exampleBAM.bam.bam 45 GTGAACTG Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TTGGCTTT Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 28 2 Cycle M 3.01 28.00 1 0 +exampleBAM.bam.bam 19 30 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 27 GT Context M 3.01 27.00 1 0 +exampleBAM.bam.bam 45 64 Cycle D 9.03 4.00 7 0 +exampleBAM.bam.bam 45 76 Cycle I 28.83 17.00 763 0 +exampleBAM.bam.bam 45 AGTGTTGG Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 45 AGGGTTGG Context I 7.78 32.00 5 0 +exampleBAM.bam.bam 45 GATTCTAT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 AGACACAG Context D 3.01 6.00 1 0 +exampleBAM.bam.bam 45 GGGGTTGG Context I 8.45 32.00 6 0 +exampleBAM.bam.bam 15 68 Cycle M 3.01 15.00 1 0 +exampleBAM.bam.bam 45 TATAAAGA Context I 3.01 30.00 1 0 +exampleBAM.bam.bam 33 22 Cycle M 4.77 33.00 2 0 +exampleBAM.bam.bam 12 AA Context M 6.99 12.00 4 0 +exampleBAM.bam.bam 32 54 Cycle M 4.77 32.00 2 0 +exampleBAM.bam.bam 45 CTCGTCCA Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 38 Cycle D 8.45 5.00 6 0 +exampleBAM.bam.bam 45 42 Cycle I 7.78 30.00 5 0 +exampleBAM.bam.bam 45 TTAAGTGA Context I 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TTTGCAAT Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 TTTGCACT Context D 3.01 18.00 1 0 +exampleBAM.bam.bam 24 CC Context M 4.77 24.00 2 0 +exampleBAM.bam.bam 45 TGAGTCAA Context D 3.01 21.00 1 0 +exampleBAM.bam.bam 6 TT Context M 1.76 6.00 2 1 +exampleBAM.bam.bam 31 4 Cycle M 3.01 31.00 1 0 +exampleBAM.bam.bam 31 AG Context M 4.77 31.00 2 0 +exampleBAM.bam.bam 34 50 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 27 73 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 45 GACACAGC Context D 3.01 19.00 1 0 +exampleBAM.bam.bam 45 AACCTGGA Context I 3.01 29.00 1 0 +exampleBAM.bam.bam 45 4 Cycle D 7.78 17.00 5 0 +exampleBAM.bam.bam 45 8 Cycle I 7.78 15.00 5 0 +exampleBAM.bam.bam 16 58 Cycle M 4.77 16.00 2 0 +exampleBAM.bam.bam 30 AA Context M 4.77 30.00 2 0 +exampleBAM.bam.bam 24 41 Cycle M 3.01 24.00 1 0 +exampleBAM.bam.bam 34 TG Context M 6.02 34.00 3 0 +exampleBAM.bam.bam 29 68 Cycle M 3.01 29.00 1 0 +exampleBAM.bam.bam 25 9 Cycle M 3.01 25.00 1 0 +exampleBAM.bam.bam 26 44 Cycle M 8.45 26.00 6 0 +exampleBAM.bam.bam 45 GGTATTAC Context D 3.01 33.00 1 0 +exampleBAM.bam.bam 45 TGTGAACT Context I 3.01 19.00 1 0 +exampleBAM.bam.bam 45 TGGCCTGA Context D 3.01 23.00 1 0 +exampleBAM.bam.bam 5 22 Cycle M 3.01 5.00 1 0 +exampleBAM.bam.bam 45 AAGTGCAA Context I 3.01 15.00 1 0 +exampleBAM.bam.bam 45 ATTTGCAA Context I 3.01 34.00 1 0 +exampleBAM.bam.bam 45 ATCTAATC Context D 3.01 31.00 1 0 +exampleBAM.bam.bam 27 GG Context M 13.62 27.00 22 0 +exampleBAM.bam.bam 21 48 Cycle M 3.01 21.00 1 0 +exampleBAM.bam.bam 45 TGAGTGTT Context D 3.01 26.00 1 0 +exampleBAM.bam.bam 13 39 Cycle M 3.01 13.00 1 0 +exampleBAM.bam.bam 45 TAAAGACA Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 33 23 Cycle M 4.77 33.00 2 0 +exampleBAM.bam.bam 45 GTGGAGCC Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 45 TTTCACAT Context D 3.01 25.00 1 0 +exampleBAM.bam.bam 45 65 Cycle D 8.45 6.00 6 0 +exampleBAM.bam.bam 45 GATTTTTC Context D 3.01 27.00 1 0 +exampleBAM.bam.bam 45 AGTTCTAG Context I 3.01 24.00 1 0 +exampleBAM.bam.bam 19 61 Cycle M 3.01 19.00 1 0 +exampleBAM.bam.bam 28 71 Cycle M 12.55 28.00 17 0 +exampleBAM.bam.bam 15 35 Cycle M 3.01 15.00 1 0 +exampleBAM.bam.bam 24 CA Context M 3.01 24.00 1 0 +exampleBAM.bam.bam 24 10 Cycle M 3.01 24.00 3 1 +exampleBAM.bam.bam 45 TTATTGAT Context D 3.01 16.00 1 0 +exampleBAM.bam.bam 45 ATAACCTG Context I 3.01 28.00 1 0 +exampleBAM.bam.bam 45 GAAAGTGC Context I 3.01 4.00 1 0 +exampleBAM.bam.bam 45 39 Cycle D 9.03 31.00 7 0 +exampleBAM.bam.bam 45 43 Cycle I 7.78 32.00 5 0 +exampleBAM.bam.bam 31 AT Context M 4.77 31.00 2 0 +exampleBAM.bam.bam 31 5 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 34 51 Cycle M 3.01 34.00 1 0 +exampleBAM.bam.bam 27 72 Cycle M 3.01 27.00 1 0 +exampleBAM.bam.bam 30 AC Context M 3.01 30.00 1 0 +exampleBAM.bam.bam 45 CATGGTAT Context D 3.01 32.00 1 0 +exampleBAM.bam.bam 45 ATGATCGT Context I 3.01 32.00 1 0 +exampleBAM.bam.bam 45 5 Cycle D 7.78 31.00 5 0 +exampleBAM.bam.bam 45 9 Cycle I 7.78 25.00 5 0 +exampleBAM.bam.bam 45 GCACCCAG Context I 3.01 31.00 1 0 +exampleBAM.bam.bam 34 TT Context M 8.45 34.00 6 0 +exampleBAM.bam.bam 31 39 Cycle M 4.77 31.00 2 0 +exampleBAM.bam.bam 14 33 Cycle M 3.01 14.00 1 0 +