Beispiel #1
0
        public void CallRefs(IVcfNeighborhood completedNbhd)
        {
            var suckedUpRefCalls = completedNbhd.UsedRefCountsLookup;
            Dictionary <int, CalledAllele> possibleRefs = new Dictionary <int, CalledAllele>();
            var variantsRecalledByMnvCaller             = completedNbhd.GetOriginalVcfVariants();

            foreach (var allele in variantsRecalledByMnvCaller)
            {
                int suckedUpRefCallCount = 0;
                if (suckedUpRefCalls.ContainsKey(allele.ReferencePosition))
                {
                    suckedUpRefCallCount = suckedUpRefCalls[allele.ReferencePosition].Counts;
                }

                var newRef = ReCallAsRef(allele, suckedUpRefCallCount);

                if (!possibleRefs.ContainsKey(newRef.ReferencePosition))
                {
                    completedNbhd.NbhdGTcalculator.SetGenotypes(new List <CalledAllele> {
                        newRef
                    });
                    possibleRefs.Add(newRef.ReferencePosition, newRef);
                }
            }

            completedNbhd.CalledRefs = possibleRefs;
        }
Beispiel #2
0
        private static int OrderWithNeighborhood(IVcfNeighborhood nbhdWithMNVs, CalledAllele originalVariant)
        {
            if (originalVariant.Chromosome != nbhdWithMNVs.ReferenceName)
            {
                return(1);
            }

            if (originalVariant.ReferencePosition > nbhdWithMNVs.LastPositionOfInterestInVcf)
            {
                return(1);
            }

            if ((originalVariant.ReferencePosition <= nbhdWithMNVs.LastPositionOfInterestInVcf) && (originalVariant.ReferencePosition >= nbhdWithMNVs.FirstPositionOfInterest))
            {
                return(0);
            }

            return(-1);
        }
Beispiel #3
0
        public void CallMNVs(IVcfNeighborhood completedNbhd)
        {
            var foundMNVs = new Dictionary <int, List <CalledAllele> >();

            foreach (var mnv in completedNbhd.CandidateVariants)
            {
                bool isReference = (mnv.Type == Pisces.Domain.Types.AlleleCategory.Reference);

                CallCandidate(mnv, isReference);

                AddFilters(mnv, isReference);

                if (!foundMNVs.ContainsKey(mnv.Coordinate))
                {
                    foundMNVs.Add(mnv.Coordinate, new List <CalledAllele>());
                }

                foundMNVs[mnv.Coordinate].Add(mnv);
            }

            completedNbhd.CalledVariants = foundMNVs;
        }
Beispiel #4
0
        public void CallRefs(IVcfNeighborhood completedNbhd)
        {
            var suckedUpRefCalls = completedNbhd.UsedRefCountsLookup;
            Dictionary <int, CalledAllele> possibleRefs = new Dictionary <int, CalledAllele>();
            var variantsRecalledByMnvCaller             = completedNbhd.GetOriginalVcfVariants();

            foreach (var allele in variantsRecalledByMnvCaller)
            {
                int suckedUpRefCallCount = 0;
                if (suckedUpRefCalls.ContainsKey(allele.Coordinate))
                {
                    suckedUpRefCallCount = suckedUpRefCalls[allele.Coordinate];
                }

                var newRef = ReCallAsRef(allele, suckedUpRefCallCount);

                if (!possibleRefs.ContainsKey(newRef.Coordinate))
                {
                    possibleRefs.Add(newRef.Coordinate, newRef);
                }
            }

            completedNbhd.CalledRefs = possibleRefs;
        }
Beispiel #5
0
        public List <CalledAllele> WriteVariantsUptoIncludingNbhd(
            IVcfNeighborhood nbhdWithMNVs,
            IVcfFileWriter <CalledAllele> writer, List <CalledAllele> leftoverAlleles)
        {
            var calledMNVs                = nbhdWithMNVs.CalledVariants;
            var allelesReadyToWrite       = new List <CalledAllele>();
            var allelesInCurrentVcfNbhd   = new List <CalledAllele>();
            var allelesToGoupWithNextNbhd = new List <CalledAllele>();

            var allelesInProcess = new List <CalledAllele>();

            int  orderWithRespectToNbhd = -1;
            bool quittingNbhd           = false;
            bool takenCareOfLeftOvers   = (leftoverAlleles.Count() == 0);

            while (true)
            {
                if (quittingNbhd)
                {
                    break;
                }

                if (takenCareOfLeftOvers)
                {
                    allelesInProcess = GetNextBlockOfOriginalAllelesFromVcfVar().ToList();
                }
                else
                {
                    allelesInProcess     = GetNextSetOfAllelesToProcess(leftoverAlleles, nbhdWithMNVs.ReferenceName, writer);
                    takenCareOfLeftOvers = true;
                }


                if (allelesInProcess.Count() == 0)
                {
                    break;
                }

                foreach (var originalAllele in allelesInProcess)
                {
                    if (quittingNbhd)
                    {
                        allelesReadyToWrite.Add(originalAllele);
                        continue;
                    }

                    orderWithRespectToNbhd = OrderWithNeighborhood(nbhdWithMNVs, originalAllele);
                    switch (orderWithRespectToNbhd)
                    {
                    case (-1):    //if we are before the nbhd, write straight to vcf
                        allelesReadyToWrite.Add(originalAllele);
                        break;

                    case (0):     //in the nbhd
                        allelesInCurrentVcfNbhd.Add(originalAllele);
                        break;

                    default:
                        //if we are either ahead of our nbhd, or gone into the wrong chr)
                        //Close out the nbhd and finish up.
                        var mergedVariants = GetMergedListOfVariants(nbhdWithMNVs, allelesInCurrentVcfNbhd);
                        allelesReadyToWrite.AddRange(mergedVariants);
                        allelesToGoupWithNextNbhd.Add(originalAllele);
                        quittingNbhd = true;
                        break;
                    }
                }
            }

            //close out any remaining nbhd
            if (orderWithRespectToNbhd == 0)
            {
                var mergedVariants = GetMergedListOfVariants(nbhdWithMNVs, allelesInCurrentVcfNbhd);
                allelesReadyToWrite.AddRange(mergedVariants);
            }

            var alleleAfterAdjustment = VcfMergerUtils.AdjustForcedAllele(allelesReadyToWrite);

            writer.Write(alleleAfterAdjustment);
            return(allelesToGoupWithNextNbhd);
        }
Beispiel #6
0
        public static List <CalledAllele> GetMergedListOfVariants(IVcfNeighborhood completedNbhd, List <CalledAllele> originalVariantsInsideRange)
        {
            var mergedVariantList = new List <CalledAllele>();
            Dictionary <int, List <CalledAllele> > foundMNVS = completedNbhd.CalledVariants;

            //track which variants got used for MNV phasing.
            var indexesOfVariantsRecalledByMnvCaller = completedNbhd.GetOriginalVcfVariants();

            //decide which of the original variants we keep, and which get replaced.
            for (int i = 0; i < originalVariantsInsideRange.Count; i++)
            {
                var  originalCall          = originalVariantsInsideRange[i];
                var  currentPosition       = originalCall.ReferencePosition;
                bool variantWasAlreadyUsed = CheckIfUsed(indexesOfVariantsRecalledByMnvCaller, originalCall);


                if (foundMNVS.ContainsKey(currentPosition))
                {
                    //add all the MNVs
                    mergedVariantList.AddRange(foundMNVS[currentPosition]);
                    foundMNVS[currentPosition] = new List <CalledAllele>();//empty out the list, but leave the fact that there were MNVs here.

                    //add back any original variants,
                    //so long as they were not used by the caller, and not reference
                    if (!(variantWasAlreadyUsed) &&
                        (originalCall.Type != Pisces.Domain.Types.AlleleCategory.Reference))
                    {
                        mergedVariantList.Add(originalCall);
                    }

                    continue;
                }

                //Else, we did not find any MNVs here.
                //Then this position should be either the original call from the vcf,
                //or a new reference call converted from a variant that got used by the MNV caller.
                if (variantWasAlreadyUsed)
                {
                    var newRef = completedNbhd.CalledRefs[originalCall.ReferencePosition];

                    //sometimes several variants were used, all at the same position. we dont need to add new references for all of them.
                    if ((mergedVariantList.Count == 0) || (mergedVariantList.Last().ReferencePosition != currentPosition))
                    {
                        mergedVariantList.Add(newRef);
                    }
                }
                else //wasnt used for MNV calling
                {
                    mergedVariantList.Add(originalVariantsInsideRange[i]);
                }
            }

            //incase we called any MNVs past the edge of the input VCF.
            foreach (var mnvsLeft in foundMNVS)
            {
                mergedVariantList.AddRange(mnvsLeft.Value);
            }

            var comparer = new AlleleCompareByLoci();

            mergedVariantList.Sort(comparer);


            return(mergedVariantList);
        }