Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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)}!");
            }
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        internal void AddVariantToTrees(IWittyerSimpleVariant variant)
        {
            var tree = _trees.GetOrAdd(variant.VariantType, GenomeIntervalTree <IWittyerSimpleVariant> .Create());

            tree.Add(variant);
        }
Пример #7
0
 private IncludeBedFile([NotNull] GenomeIntervalTree <IContigAndInterval> tree,
                        [NotNull] Lazy <FileInfo> fileSource)
 {
     IntervalTree = tree;
     _fileSource  = fileSource;
 }