Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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);
        }