internal static void DoOverlapping <T>( [NotNull] IReadOnlyDictionary <WittyerType, GenomeIntervalTree <T> > truthTrees, [NotNull] T queryVariant, IsAlleleMatch <T> alleleMatchFunc, bool isCrossType, bool isSimpleCounting) where T : class, IMutableWittyerSimpleVariant { if (!truthTrees.TryGetValue(queryVariant.VariantType, out var tree)) { return; // no match at all, nothing to update } var failedReasons = new HashSet <FailedReason>(); foreach (var overlap in tree.Search(queryVariant)) { failedReasons.Clear(); var(matchEnum, failedReason) = GenerateWhatAndWhy(queryVariant, failedReasons, overlap, alleleMatchFunc, isCrossType); var wow = overlap.VariantType.HasOverlappingWindows && (isSimpleCounting || matchEnum == MatchEnum.AlleleAndGenotypeMatch || matchEnum == MatchEnum.LocalAndGenotypeMatch) ? overlap.TryGetOverlap(queryVariant).GetOrDefault() : null; var borderDistance = BorderDistance.CreateFromVariant(overlap, queryVariant); var who = GetNextWhoTag(); var overlapInfo = OverlapAnnotation.Create(who, matchEnum, wow, borderDistance, failedReason); overlap.AddToOverlapInfo(overlapInfo); queryVariant.AddToOverlapInfo(overlapInfo); uint GetNextWhoTag() { var ret = overlap.OriginalVariant.Position; while (WhoTags.Contains(ret)) { ret++; } WhoTags.Add(ret); return(ret); } } }
/// <inheritdoc /> public void AddToOverlapInfo(OverlapAnnotation newAnnotation) => _overlapInfo.Add(newAnnotation);