internal static IWittyerBnd Create([NotNull] IVcfVariant variant, IVcfVariant secondVariant, [CanBeNull] string sampleName, double percentageDistance, uint basepairDistance, IReadOnlyList <uint> bins) { var(first, second) = MiscUtils.FindBndEntriesOrder(variant, secondVariant); var posInterval = first.CalculateBndBorderInterval(second, first.ParseCi(WittyerConstants.Cipos), percentageDistance, basepairDistance); var endInterval = second.CalculateBndBorderInterval(first, second.ParseCi(WittyerConstants.Cipos), percentageDistance, basepairDistance); var svType = variant.ParseWittyerVariantType(sampleName); var winner = GetWinner(); var overlapInfo = new List <OverlapAnnotation>(); var sample = WittyerSample.CreateOverall(variant, sampleName, false); return(Create(first, posInterval, winner, endInterval, overlapInfo, sample, second, svType)); Winner GetWinner() { if (svType == WittyerVariantType.TranslocationBreakend) { return(Winner.Create(svType)); } if (svType != WittyerVariantType.Insertion) { return(Winner.Create(svType, BedInterval.Create(first.Position, second.Position + 1), bins)); } uint?end = null; // insertion, try sequences first if (variant.IsSimpleSequence(out var length)) { end = length; } // try svlength, but if not, assume unknown length. else if (variant.TryGetSvLength(out length) == null) { end = length; } return(Winner.Create(svType, end == null ? null : BedInterval.Create(variant.Position, variant.Position + end.Value), bins)); } }