private static GenomeIntervalTree <IContigAndInterval> CreateGenomeIntervalTree( [NotNull] IEnumerable <IContigAndInterval> contigIntervals) { var dictionary = new Dictionary <IContigInfo, MergedIntervalTree <uint> >(); var listOrder = new List <IContigInfo>(); foreach (var contigInterval in contigIntervals) { if (!dictionary.TryGetValue(contigInterval.Contig, out var tree)) { tree = MergedIntervalTree <uint> .Create(null); listOrder.Add(contigInterval.Contig); dictionary.Add(contigInterval.Contig, tree); } tree.Add(contigInterval); } var ret = GenomeIntervalTree <IContigAndInterval> .Create(); foreach (var contig in listOrder) { ret.AddRange(dictionary[contig] .Select(i => i as IContigAndInterval ?? ContigAndInterval.Create(contig, i.Start, i.Stop))); } return(ret); }
internal static TruthForest CreateEmpty(string sampleName) { //create empty tree for each supported type. So when we do search it won't be key not found var dict = new ConcurrentDictionary <WittyerVariantType, GenomeIntervalTree <IWittyerSimpleVariant> >(); foreach (var type in WittyerConstants.SupportedSvType) { dict.AddOrUpdate(type, GenomeIntervalTree <IWittyerSimpleVariant> .Create(), (k, old) => GenomeIntervalTree <IWittyerSimpleVariant> .Create()); } return(new TruthForest(dict, new List <IVcfVariant>(), sampleName)); }
/// <inheritdoc /> public void Finalize(WitDecision falseDecision, EvaluationMode mode, GenomeIntervalTree <IContigAndInterval> includedRegions) { bool?isIncluded = null; if (includedRegions != null) { isIncluded = includedRegions.TryGetValue(OriginalVariant.Contig, out var tree) && tree.Search(CiPosInterval).Any() && // or there's overlap in bed regions (ReferenceEquals(OriginalVariant, EndOriginalVariant) || Equals(OriginalVariant.Contig, EndOriginalVariant.Contig) || includedRegions.TryGetValue(EndOriginalVariant.Contig, out tree) && tree.Search(CiEndInterval).Any()); // or end overlaps. } WittyerVariantInternal.Finalize(this, _overlapInfo, falseDecision, mode, isIncluded); }
/// <inheritdoc /> public void AddTarget(IMutableWittyerSimpleVariant variant) { _baseResult.AddTarget(variant); switch (variant) { case IMutableWittyerBnd bnd: BpInsTrees.GetOrAdd(variant.VariantType, _ => GenomeIntervalTree <IMutableWittyerBnd> .Create()).Add(bnd); break; case IMutableWittyerVariant cast: VariantTrees.GetOrAdd(variant.VariantType, _ => GenomeIntervalTree <IMutableWittyerVariant> .Create()).Add(cast); break; default: throw new ArgumentOutOfRangeException( $"Unexepected Variant found that was neither {nameof(IWittyerBnd)} nor {nameof(IWittyerVariant)}!"); } }
/// <inheritdoc /> public void Finalize(WitDecision falseDecision, EvaluationMode mode, GenomeIntervalTree <IContigAndInterval> includedRegions) { bool?isIncluded = null; if (includedRegions != null) { isIncluded = false; if (includedRegions.TryGetValue(Contig, out var tree)) { var startPosition = CiPosInterval.Stop - 1; var endPosition = CiEndInterval.Start; if (startPosition >= endPosition) { // means cipos or ciend goes past each other // so any overlap with Start to Stop should mean included. isIncluded = tree.Search(this).Any(); } else { // ReSharper disable once LoopCanBeConvertedToQuery // prevent closure allocation foreach (var overlap in tree.Search(startPosition)) { if (!overlap.Contains(endPosition)) { continue; } isIncluded = true; break; } } } } Finalize(this, _overlapInfo, falseDecision, mode, isIncluded); }
internal void AddVariantToTrees(IWittyerSimpleVariant variant) { var tree = _trees.GetOrAdd(variant.VariantType, GenomeIntervalTree <IWittyerSimpleVariant> .Create()); tree.Add(variant); }
private IncludeBedFile([NotNull] GenomeIntervalTree <IContigAndInterval> tree, [NotNull] Lazy <FileInfo> fileSource) { IntervalTree = tree; _fileSource = fileSource; }