private void ProcessReadBases(BamAlignment read, int nextVariantIndex)
{
int position = read.Position;
int baseIndex = 0;
int cigarCount = read.CigarData.Count;
for (int opIndex = 0; opIndex < cigarCount; opIndex++)
{
CigarOp cigar = read.CigarData[opIndex];
switch (cigar.Type)
{
case 'M':
// Loop over matches/mismatches:
for (int index = 0; index < cigar.Length; index++,position++,baseIndex++)
{
for (int varIndex = nextVariantIndex; varIndex < this.Variants.Count; varIndex++)
{
VcfVariant variant = this.Variants[varIndex];
// Subtract 1: Vcf positions are 1-based, bam file positions are 0-based:
if (variant.ReferencePosition - 1 > position) break;
if (variant.ReferencePosition - 1 < position)
{
nextVariantIndex++;
continue;
}
if (read.Qualities[baseIndex] < MinimumBaseQScore) continue; // Skip low-quality base calls.
char Base = read.Bases[baseIndex];
if (Base == variant.ReferenceAllele[0]) this.ReferenceCounts[varIndex]++;
if (Base == variant.VariantAlleles[0][0]) this.VariantCounts[varIndex]++;
}
}
break;
case 'S':
baseIndex += (int)cigar.Length;
break;
case 'I':
baseIndex += (int)cigar.Length;
break;
case 'D':
position += (int)cigar.Length;
break;
default:
// We don't know how to cope with this CIGAR operation; bail out!
return;
}
}
}