示例#1
0
        /// <summary>
        /// Для регионов активности и неактивности строит по своему суф.массиву и в результате получает слитые цепочки.
        /// </summary>
        private static void GetCandidateElements(GetCandidateElementsParams pars, IEnumerable<Region> peaks, IEnumerable<Region> noises,
            out ElementGroup[] elPeaks, out ElementGroup[] elNoise)
        {
            var t = DateTime.Now;
            var chrDic = new Dictionary<ChromosomeEnum, Chromosome>();

            // peaks
            var peaksTmp = peaks.Select(p =>
            {
                if (!chrDic.ContainsKey(p.Chr))
                    chrDic.Add(p.Chr, ChrManager.GetChromosome(p.Chr));
                return chrDic[p.Chr].GetPack(p.Start, p.Size);
            }).ToArray();
            TextComparer sfxPeaks = SuffixBuilder.BuildMany2(peaksTmp, pars.MinGroupSize);
            elPeaks = sfxPeaks.GetElementGroups().ToArray();
            Console.WriteLine("Peaks sfx build, dt=" + (DateTime.Now - t) + ", size=" + sfxPeaks.StrokeSize +
                              ", elCnt=" + elPeaks.Length + ", elTotal=" + elPeaks.Sum(p => p.Count));
            // noise
            var noiseTmp = noises.Select(p =>
            {
                if (!chrDic.ContainsKey(p.Chr))
                    chrDic.Add(p.Chr, ChrManager.GetChromosome(p.Chr));
                return chrDic[p.Chr].GetPack(p.Start, p.Size);
            }).ToArray();
            TextComparer sfxNoise = SuffixBuilder.BuildMany2(noiseTmp, pars.MinGroupSize);
            elNoise = sfxNoise.GetElementGroups().ToArray();
            Console.WriteLine("Noise sfx build, dt=" + (DateTime.Now - t) + ", size=" + sfxNoise.StrokeSize +
                              ", elCnt=" + elNoise.Length + ", elTotal=" + elNoise.Sum(p => p.Count));
            Array.Sort(elPeaks);
            Array.Sort(elNoise);
            if (pars.PrintCross)
            {
                Console.WriteLine("TransTest (peaks on peaks)");
                TransTest(sfxPeaks.StrokeSize, elPeaks.Take(10), sfxPeaks);
                Console.WriteLine("TransTest (peaks on empty)");
                TransTest(sfxPeaks.StrokeSize, elPeaks.Take(10), sfxNoise);
                Console.WriteLine("TransTest (empty on peaks)");
                TransTest(sfxNoise.StrokeSize, elNoise.Take(10), sfxPeaks);
            }
            if (pars.DropCross)
            {
                var pc = elPeaks.Length;
                var nc = elNoise.Length;
                Console.WriteLine("Drop cross elements:");
                //elPeaks = elPeaks.Where(p => sfxNoise.GetAllCites(p.Chain, p.Chain.Length).Count() < p.Count/2).ToArray();
                //Console.WriteLine("\tpeaks - was:" + pc + ", now:" + elPeaks.Length + ", dropped=" + (pc - elPeaks.Length));
                elNoise = elNoise.Where(p => sfxPeaks.GetAllCites(p.Chain, p.Chain.Length).Count() < /*p.Count / 2*/1).ToArray();
                Console.WriteLine("\tnoise - was:" + nc + ", now:" + elNoise.Length + ", dropped=" + (nc - elNoise.Length));
            }
        }