internal static IWittyerVariant Create([NotNull] IVcfVariant baseVariant, [CanBeNull] IVcfSample sample, [NotNull] WittyerType svType, [NotNull] IReadOnlyList <uint> bins, [CanBeNull] double?percentageDistance, uint basepairDistance) { // originalInterval is needed to adjust CIPOS and CIEND against for PD/BPD, but it won't be used for actual reflen and binning. var baseInterval = baseVariant.ToBedInterval(true, out var originalEnd, out var sharedFirstBase); if (baseInterval == null) { throw new InvalidOperationException( $"Expected failure of {nameof(WittyerUtils.ToBedInterval)} to throw, but didn't..."); } // CI intervals are always based on the original POS/END var posStart = baseVariant.Position; if (sharedFirstBase) { posStart++; } var ciPosInterval = posStart.ConvertPositionToCiInterval(baseVariant, WittyerConstants.Cipos); var ciEndInterval = originalEnd.ConvertPositionToCiInterval(baseVariant, WittyerConstants.Ciend); var baseStart = sharedFirstBase ? baseInterval.Start : baseInterval.Start + 1; // not sharing first base (ref site or complex types, etc) need adjustment // the pd/bpd intervals are based on the trimmed variant's coordinates. var(posInterval, endInterval) = WittyerUtils.GetPosAndEndInterval(baseVariant.Contig, percentageDistance, basepairDistance, ciPosInterval, baseStart, ciEndInterval, baseInterval.Stop); return(new WittyerVariantInternal(svType, baseVariant, baseInterval, Winner.Create(svType, baseInterval, bins), posInterval, ciPosInterval, endInterval, ciEndInterval, WittyerSample.CreateFromVariant(baseVariant, sample, svType == WittyerType.CopyNumberReference))); }
internal static IInterval <uint> GetInsertionInterval([NotNull] IVcfVariant first) => first.IsAltSimpleSequence(0) ? first.ToBedInterval(false, out _, out _) : first.TryGetSvLength(out var svLen) != null