private static List <OverlappingSegmentsRegion> GetSegmentSets(int defaultAlleleCountThreshold, Dictionary <string, List <BedEntry> > commonRegions, Dictionary <string, IReadOnlyList <SampleGenomicBin> > genomicBinsByChromosome, Dictionary <string, List <BedInterval> > segmentIntervalsByChromosome, Dictionary <string, List <Balleles> > allelesByChromosomeCommonSegs, Segments segments) { var segmentsSetByChromosome = new ConcurrentDictionary <string, List <OverlappingSegmentsRegion> >(); Parallel.ForEach( segments.GetChromosomes(), chr => { var segmentsByChromosome = segments.GetSegmentsForChromosome(chr).ToList(); if (commonRegions.Keys.Any(chromosome => chromosome == chr)) { var commonCnvCanvasSegments = CanvasSegment.CreateSegmentsFromCommonCnvs(genomicBinsByChromosome[chr], segmentIntervalsByChromosome[chr], allelesByChromosomeCommonSegs[chr]); segmentsSetByChromosome[chr] = CanvasSegment.MergeCommonCnvSegments(segmentsByChromosome, commonCnvCanvasSegments, defaultAlleleCountThreshold); } else { segmentsSetByChromosome[chr] = segmentsByChromosome.Select( segment => new OverlappingSegmentsRegion(new List <CanvasSegment> { segment }, null)).ToList(); } }); return(segmentsSetByChromosome.OrderBy(i => i.Key).Select(x => x.Value).SelectMany(x => x).ToList()); }
public void TestMergeCommonCnvSegments() { const int alleleThreshold = 2; var counts = new List <SampleGenomicBin> { new SampleGenomicBin("chr1", 100000, 100001, 100), new SampleGenomicBin("chr1", 150000, 150001, 90), new SampleGenomicBin("chr1", 200000, 200001, 110), new SampleGenomicBin("chr1", 250000, 250001, 100), new SampleGenomicBin("chr1", 300000, 300001, 95), new SampleGenomicBin("chr1", 350000, 350001, 105), new SampleGenomicBin("chr1", 400000, 400001, 105), new SampleGenomicBin("chr1", 450000, 450001, 105), new SampleGenomicBin("chr1", 500000, 500001, 105) }; // Canvas segment comes before common segment and does not overlap it var slice = counts.Skip(1).Take(3).ToList(); var canvasSegments = new List <CanvasSegment> { new CanvasSegment(slice.First().GenomicBin.Chromosome, slice.First().Start, slice.Last().Stop, slice) }; slice = counts.Skip(4).Take(2).ToList(); var commonSegments = new List <CanvasSegment> { new CanvasSegment(slice.First().GenomicBin.Chromosome, slice.First().Start, slice.Last().Stop, slice) }; var segmentHaplotypeses = CanvasSegment.MergeCommonCnvSegments(canvasSegments, commonSegments, alleleThreshold); Assert.Equal(2, segmentHaplotypeses.Count); Assert.Equal(canvasSegments, segmentHaplotypeses.First().SetA); Assert.Null(segmentHaplotypeses.First().SetB); Assert.Null(segmentHaplotypeses.Last().SetA); Assert.Equal(commonSegments, segmentHaplotypeses.Last().SetB); // common segment comes before Canvas segment and does not overlap it slice = counts.Skip(1).Take(3).ToList(); commonSegments = new List <CanvasSegment> { new CanvasSegment(slice.First().GenomicBin.Chromosome, slice.First().Start, slice.Last().Stop, slice) }; slice = counts.Skip(4).Take(2).ToList(); canvasSegments = new List <CanvasSegment> { new CanvasSegment(slice.First().GenomicBin.Chromosome, slice.First().Start, slice.Last().Stop, slice) }; segmentHaplotypeses = CanvasSegment.MergeCommonCnvSegments(canvasSegments, commonSegments, alleleThreshold); Assert.Equal(2, segmentHaplotypeses.Count); Assert.Null(segmentHaplotypeses.First().SetA); Assert.Equal(commonSegments, segmentHaplotypeses.First().SetB); Assert.Equal(canvasSegments, segmentHaplotypeses.Last().SetA); Assert.Null(segmentHaplotypeses.Last().SetB); // Canvas segment and common segment have the same coordinates slice = counts.Skip(1).Take(3).ToList(); commonSegments = new List <CanvasSegment> { new CanvasSegment(slice.First().GenomicBin.Chromosome, slice.First().Start, slice.Last().Stop, slice) }; slice = counts.Skip(1).Take(3).ToList(); canvasSegments = new List <CanvasSegment> { new CanvasSegment(slice.First().GenomicBin.Chromosome, slice.First().Start, slice.Last().Stop, slice) }; segmentHaplotypeses = CanvasSegment.MergeCommonCnvSegments(canvasSegments, commonSegments, alleleThreshold); Assert.Single(segmentHaplotypeses); Assert.Null(segmentHaplotypeses.First().SetA); Assert.Equal(commonSegments, segmentHaplotypeses.First().SetB); }