Пример #1
0
        /// <summary>
        /// assigns a variant type to the structural variant alternate allele
        /// </summary>
        public void AssignVariantType(VariantAlternateAllele altAllele, IAlleleTrimmer alleleTrimmer)
        {
            // sanity check: ignore unknown SV variant types
            if (_variantType == VariantType.unknown)
            {
                // the only thing we do for unknown SV types is to increment the begin if it has a symbolic allele
                if (altAllele.IsSymbolicAllele)
                {
                    altAllele.Start++;
                }
                return;
            }

            var oldAltAllele = altAllele.AlternateAllele;
            var has1KgCnv    = false;

            // add the copy number if applicable
            if (_variantType == VariantType.copy_number_variation)
            {
                has1KgCnv            = altAllele.IsSymbolicAllele && _copyNumber == "?";
                altAllele.CopyNumber = has1KgCnv
                    ? ExtractCopyNumberFromAltAllele(oldAltAllele)
                    : _copyNumber;
            }

            altAllele.IsStructuralVariant = true;
            altAllele.VepVariantType      = _variantType;
            altAllele.NirvanaVariantType  = _variantType;
            altAllele.AlternateAllele     = has1KgCnv ? ExtractCnvSymbolicAllele(oldAltAllele) : _altAllele;

            // handle breakends
            if (_breakEnds?.Count > 0)
            {
                altAllele.BreakEnds = new List <BreakEnd>();
                altAllele.BreakEnds.AddRange(_breakEnds);
            }

            // update the reference begin position
            //
            // NOTE: If any of the ALT alleles is a symbolic allele (an angle-bracketed
            //       ID String “<ID>”) then the padding base is required and POS denotes
            //       the coordinate of the base preceding the polymorphism.
            if (altAllele.IsSymbolicAllele)
            {
                altAllele.Start++;
            }
            else
            {
                // if the alt allele is not symbolic and its not a breakend, we call the regular trimmer
                if (_variantType != VariantType.translocation_breakend)
                {
                    altAllele.AlternateAllele = oldAltAllele;
                    alleleTrimmer.Trim(new List <VariantAlternateAllele> {
                        altAllele
                    });
                }
            }

            // adjust the end coordinates after adjusted the begin
            if (_svEnd != null)
            {
                altAllele.End = (int)_svEnd;
                MaxEnd        = Math.Max(MaxEnd, (int)_svEnd);
            }
            else if (_svLength != null)
            {
                altAllele.End = altAllele.Start + Math.Abs(_svLength.Value) - 1;
                MaxEnd        = Math.Max(MaxEnd, (int)_svLength);
            }

            // set the VID
            altAllele.VariantId = _vid.Create(_renamer, _referenceName, altAllele);
        }