Esempio n. 1
0
        public IEnumerable <ISimplePosition> Recompose(List <ISimplePosition> simplePositions, List <int> functionBlockRanges)
        {
            var positionSet = PositionSet.CreatePositionSet(simplePositions, functionBlockRanges);
            var alleleSet   = positionSet.AlleleSet;
            var alleleIndexBlockToSampleIndex = positionSet.AlleleBlockToSampleHaplotype;
            int numSamples = positionSet.NumSamples;

            _sequenceProvider.LoadChromosome(alleleSet.Chromosome);
            int    regionStart   = alleleSet.Starts[0];
            string lastRefAllele = alleleSet.VariantArrays.Last()[0];
            int    regionEnd     = alleleSet.Starts.Last() + lastRefAllele.Length + 100; // make it long enough

            if (regionEnd > _sequenceProvider.Sequence.Length)
            {
                regionEnd = _sequenceProvider.Sequence.Length;
            }
            string totalRefSequence    = _sequenceProvider.Sequence.Substring(regionStart - 1, regionEnd - regionStart); // VCF positions are 1-based
            var    recomposedAlleleSet = new RecomposedAlleleSet(positionSet.ChrName, numSamples);

            foreach (var(alleleIndexBlock, sampleAlleles) in alleleIndexBlockToSampleIndex)
            {
                (int start, _, string refAllele, string altAllele, var varPosIndexesInAlleleBlock, List <string> decomposedVids) = GetPositionsAndRefAltAlleles(alleleIndexBlock, alleleSet, totalRefSequence, regionStart, simplePositions);
                var variantSite = new VariantSite(start, refAllele);

                if (!recomposedAlleleSet.RecomposedAlleles.TryGetValue(variantSite, out var variantInfo))
                {
                    variantInfo = GetVariantInfo(positionSet, alleleIndexBlock);
                    recomposedAlleleSet.RecomposedAlleles[variantSite] = variantInfo;
                }
                variantInfo.AddAllele(altAllele, sampleAlleles, decomposedVids);
                variantInfo.UpdateSampleFilters(varPosIndexesInAlleleBlock, sampleAlleles);
            }

            return(recomposedAlleleSet.GetRecomposedPositions(_sequenceProvider.RefNameToChromosome));
        }
Esempio n. 2
0
        public IEnumerable <ISimplePosition> Recompose(List <ISimplePosition> recomposablePositions, List <int> functionBlockRanges)
        {
            var positionSet = PositionSet.CreatePositionSet(recomposablePositions, functionBlockRanges);
            var alleleSet   = positionSet.AlleleSet;
            var alleleIndexBlockToSampleIndex = positionSet.AlleleIndexBlockToSampleIndex;
            var numSamples = positionSet.NumSamples;

            _sequenceProvider.LoadChromosome(alleleSet.Chromosome);
            int    regionStart   = alleleSet.Starts[0];
            string lastRefAllele = alleleSet.VariantArrays.Last()[0];
            int    regionEnd     = alleleSet.Starts.Last() + lastRefAllele.Length + 100; // make it long enough

            if (regionEnd > _sequenceProvider.Sequence.Length)
            {
                regionEnd = _sequenceProvider.Sequence.Length;
            }
            string totalRefSequence      = _sequenceProvider.Sequence.Substring(regionStart - 1, regionEnd - regionStart); // VCF positions are 1-based
            var    recomposedAlleleSet   = new RecomposedAlleleSet(positionSet.ChrName, numSamples);
            var    decomposedPosVarIndex = new HashSet <(int PosIndex, int VarIndex)>();

            foreach (var(alleleIndexBlock, sampleAlleles) in alleleIndexBlockToSampleIndex)
            {
                var(start, _, refAllele, altAllele) = GetPositionsAndRefAltAlleles(alleleIndexBlock, alleleSet, totalRefSequence, regionStart, decomposedPosVarIndex);
                var variantSite = new VariantSite(start, refAllele);

                if (!recomposedAlleleSet.RecomposedAlleles.TryGetValue(variantSite, out var variantInfo))
                {
                    variantInfo = GetVariantInfo(positionSet, alleleIndexBlock);

                    recomposedAlleleSet.RecomposedAlleles[variantSite] = variantInfo;
                }
                variantInfo.AddAllele(altAllele, sampleAlleles);
            }
            // Set decomposed tag to positions used for recomposition
            foreach (var indexTuple in decomposedPosVarIndex)
            {
                recomposablePositions[indexTuple.PosIndex].IsDecomposed[indexTuple.VarIndex] = true;
            }
            return(recomposedAlleleSet.GetRecomposedVcfRecords().Select(x => SimplePosition.GetSimplePosition(x, _sequenceProvider.RefNameToChromosome, true)));
        }