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)); }
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))); }