internal static IInterval <uint> ToBedInterval([NotNull] this IVcfVariant baseVariant, bool throwException, out uint endVal, out bool sharedFirstBase) { endVal = baseVariant.Position; if (IsSimpleSequence(baseVariant, out var refLenVal, out sharedFirstBase, out var sharedLastBase, false)) // first need to save the original end before normalizing { endVal += refLenVal; if (baseVariant.Alts.Count > 0) // refsites don't have Alts in VariantUtils { baseVariant = baseVariant.TryNormalizeVariant(VariantNormalizer.TrimCommonBases, 0).GetOrThrow(); } } var refLen = baseVariant.GetSvLength(throwException, out sharedFirstBase, out sharedLastBase, out var endPos); if (refLen == null) // means insertion of unknown length. { return(null); } if (endPos != null) { endVal = endPos.Value; } var start = sharedFirstBase || baseVariant.Position == 0 ? baseVariant.Position : baseVariant.Position - 1; var end = start + refLen.Value; if (sharedLastBase) // rare case { end--; } return(BedInterval.Create(start, end)); }
internal static IWittyerBnd Create([NotNull] IVcfVariant first, [CanBeNull] IVcfSample originalSample, [NotNull] WittyerType svType, [NotNull] IReadOnlyList <uint> bins, uint bpd, double?percentageDistance, [NotNull] IVcfVariant second) { if (!ReferenceEquals(first, second)) { (first, second) = FindBndEntriesOrder(in first, in second); } var ciPosInterval = first.Position.ConvertPositionToCiInterval(first, WittyerConstants.Cipos); var ciEndInterval = ReferenceEquals(first, second) ? ciPosInterval // same variant means same intervals. : second.Position.ConvertPositionToCiInterval(second, WittyerConstants.Cipos); IContigAndInterval posInterval, endInterval; if (ReferenceEquals(first, second)) // insertions need trimming and stuff. { var trimmed = first.TryNormalizeVariant(VariantNormalizer.TrimCommonBases, 0).GetOrThrow(); var tuple = (bpd, bpd); var(posStart, posStop) = trimmed.Position.ConvertPositionToCiInterval(tuple); WittyerUtils.GetBetterInterval(ciPosInterval, ref posStart, ref posStop); posInterval = endInterval = ContigAndInterval.Create(first.Contig, posStart, posStop); } else { (posInterval, endInterval) = WittyerUtils.GetPosAndEndInterval(first.Contig, svType == WittyerType.IntraChromosomeBreakend ? percentageDistance : null, bpd, ciPosInterval, first.Position, ciEndInterval, second.Position, second.Contig); } var winner = GetWinner(); var sample = WittyerSample.CreateFromVariant(first, originalSample, false); return(new WittyerBndInternal(svType, first, posInterval, ciPosInterval, second, endInterval, ciEndInterval, winner, sample)); (IVcfVariant first, IVcfVariant second) FindBndEntriesOrder(in IVcfVariant variantA, in IVcfVariant variantB) => ContigAndPositionComparer.Default.Compare(variantA, variantB) > 0 ? (variantB, variantA) : (variantA, variantB); Winner GetWinner() { if (svType == WittyerType.TranslocationBreakend) { return(Winner.Create(svType)); } IInterval <uint> bedInterval; if (svType == WittyerType.Insertion) { bedInterval = GetInsertionInterval(first); } else { var start = first.Position; if (start > 0) { start--; } bedInterval = BedInterval.Create(start, second.Position); } return(Winner.Create(svType, bedInterval, bins)); } }