private void AssignPloidyCallsDistance(CoverageModel model, List<SegmentInfo> segments, int medianVariantCoverage)
{
List<ModelPoint> modelPoints = InitializeModelPoints(model);
foreach (CanvasSegment segment in this.Segments)
{
// Compute (MAF, Coverage) for this segment:
List<double> MAF = new List<double>();
foreach (float VF in segment.VariantFrequencies) MAF.Add(VF > 0.5 ? 1 - VF : VF);
int expectedSnpDensityCutoff = (segment.End - segment.Begin) / MedianHetSnpsDistance / 2;
List<Tuple<float, float>> weightedVariantFrequencies = new List<Tuple<float, float>>();
double medianCoverage = CanvasCommon.Utilities.Median(segment.Counts);
double medianMAF = -1;
SegmentPloidy bestPloidy = null;
if (MAF.Count >= Math.Max(10, expectedSnpDensityCutoff))
{
medianMAF = Utilities.Median(MAF);
}
double bestDistance = double.MaxValue;
double secondBestDistance = double.MaxValue;
foreach (SegmentPloidy ploidy in AllPloidies)
{
double diff = (ploidy.MixedCoverage - medianCoverage) * CoverageWeightingFactor;
double distance = diff * diff;
if (MAF.Count >= Math.Max(10, expectedSnpDensityCutoff))
{
diff = ploidy.MixedMinorAlleleFrequency - medianMAF;
distance += diff * diff;
}
if (distance < bestDistance)
{
secondBestDistance = bestDistance;
bestDistance = distance;
bestPloidy = ploidy;
}
else if (distance < secondBestDistance)
{
secondBestDistance = distance;
}
}
segment.CopyNumber = bestPloidy.CopyNumber;
segment.ModelDistance = bestDistance;
segment.RunnerUpModelDistance = secondBestDistance;
segment.MajorChromosomeCount = bestPloidy.MajorChromosomeCount;
if (MAF.Count < 10) segment.MajorChromosomeCount = null; // Don't assign MCC if we don't have variant allele frequencies
}
}