/// <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)); } }