internal static bool IsSimpleSequence([NotNull] this IVcfVariant variant, out uint absoluteDiff, out bool sharedFirstBase, out bool sharedLastBase, bool isTrimmed) { absoluteDiff = default; sharedFirstBase = false; sharedLastBase = false; if (variant.Alts.Count == 0) { return(false); } if (variant.IsAltSimpleSequence(0)) { absoluteDiff = (uint)Math.Max(variant.Ref.Length, variant.Alts[0].Length); sharedFirstBase = variant.Ref[0].Letter == variant.Alts[0][0]; sharedLastBase = variant.Ref.Last().Letter == variant.Alts[0].Last(); if (isTrimmed && sharedFirstBase && sharedLastBase && (variant.Ref.Length == 1 || variant.Alts[0].Length == 1)) { sharedLastBase = false; // corner case like chr1 1 A AA would be true for both. } if (isTrimmed && sharedFirstBase && sharedLastBase) { throw new InvalidDataException( "Somehow we got a variant that after trimming, shares first and last base: " + variant); } if (sharedFirstBase || sharedLastBase) { absoluteDiff--; } return(true); } // always assume the first base is shared in symbolic alleles. sharedFirstBase = true; // and last base never shared. sharedLastBase = false; absoluteDiff = default; return(false); }
internal static IInterval <uint> GetInsertionInterval([NotNull] IVcfVariant first) => first.IsAltSimpleSequence(0) ? first.ToBedInterval(false, out _, out _) : first.TryGetSvLength(out var svLen) != null