public static Dictionary<ClassifiedRegion.MotifContainsStatus, List<ClassifiedRegion>> GetClassifiedRegions( ChromosomeEnum chr, Dictionary<string, string> filterAttrs, bool keepUnknownRegions) { var sense = GetSensitivityResults(filterAttrs, chr); var max = sense.Items.Max(p => p.Value2); var presList = new List<ClassifiedRegion>(); var npresList = new List<ClassifiedRegion>(); var unkList = new List<ClassifiedRegion>(); var thresholdMin = max*0.1; var thresholdMax = max*0.9; foreach (var item in sense.Items) { if(item.Value2 > thresholdMax) presList.Add(new ClassifiedRegion(true, item.StartPos, item.EndPos, item.Value1, item.Value2)); else if(item.Value2 < thresholdMin) npresList.Add(new ClassifiedRegion(false, item.StartPos, item.EndPos, item.Value1, item.Value2)); else if(keepUnknownRegions) unkList.Add(new ClassifiedRegion(null, item.StartPos, item.EndPos, item.Value1, item.Value2)); } var ret = new Dictionary<ClassifiedRegion.MotifContainsStatus, List<ClassifiedRegion>>(); ret.Add(ClassifiedRegion.MotifContainsStatus.Present, presList); ret.Add(ClassifiedRegion.MotifContainsStatus.NotPresent, npresList); if(keepUnknownRegions) ret.Add(ClassifiedRegion.MotifContainsStatus.Unknown, unkList); return ret; }
public static Chromosome GetChromosome(ChromosomeEnum chId) { const string srcBaseRoot = @"http://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/"; const string dataFolder = "chromosomes"; var chIdStr = chId.ToString().ToLower(); if (!Directory.Exists(dataFolder)) Directory.CreateDirectory(dataFolder); var protoPath = Path.Combine(dataFolder, chIdStr + ".proto"); if (File.Exists(protoPath)) // если уже есть заготовка, то берём её и не паримся return Deserialize(protoPath); // ищем локальную копию или подгружаем из инета var fazName = chIdStr + ".fa.gz"; var d = new Downloader(srcBaseRoot + fazName, dataFolder); var faPath = d.Get(); // вычитываем в своё представление var sw = Stopwatch.StartNew(); var faReader = new FastaReader(faPath); var chr = new Chromosome(chId); foreach (var f in faReader.ReadFlow()) chr.AddRange(f.Select(ToNucleotide).ToArray()); Debug.Assert(faReader.Description == chIdStr); Logs.Instance.Trace("FASTA to Chromosome converted, dt=" + sw.Elapsed.ToHuman() + ", " + chr.Count.ToHuman("pairs")); chr.Serialize(protoPath);// сериализуем в свою заготовку на будущее return chr; }
private Chromosome(ChromosomeEnum id) : this() { ChromosomeId = id; _mask = new byte[0]; _data = new byte[0]; }
public SensitivityResults(string fpath, KeyValuePair<string, string>[] pars = null, ChromosomeEnum? onlyChr = null) { Items = File.ReadLines(fpath) .Select(p => new Item(p)) .Where(p => !onlyChr.HasValue || p.Chr == onlyChr.Value) .ToArray(); Chr = onlyChr; Params = pars; }
/// <summary> /// Строит и возвращает суф-массив построенный на цепочках класса присутствия. /// </summary> public static SuffixArray GetSfxArray(ChromosomeEnum chrId, Dictionary<string, string> dnaseFilterAttrs) { var regions = DNaseIManager.GetClassifiedRegions(chrId, dnaseFilterAttrs, false); var chr = ChrManager.GetChromosome(chrId); var present = regions[ClassifiedRegion.MotifContainsStatus.Present].Select( p => chr.GetPack(p.StartPos, p.EndPos - p.StartPos)).ToArray(); return SuffixBuilder.BuildMany(present); }
public MergedNarrowPeak(string line, short cellId) { //chr1 566760 566910 . 0 . 339 157.884 -1 -1 var parts = line.Split('\t'); Debug.Assert(parts.Length >= 9); Chr = (ChromosomeEnum)Enum.Parse(typeof(ChromosomeEnum), parts[0], true); StartPosMin = StartPosMax = StartPos = int.Parse(parts[1]); EndPosMin = EndPosMax = EndPos = int.Parse(parts[2]); Values1 = new []{float.Parse(parts[6], new NumberFormatInfo { CurrencyDecimalSeparator = "." })}; Values2 = new []{float.Parse(parts[7], new NumberFormatInfo { CurrencyDecimalSeparator = "." })}; CellIds = new[] {cellId}; }
public MergedNarrowPeak(ChromosomeEnum chr, int start, int end, IEnumerable<float> v1, IEnumerable<float> v2, int minStart, int maxStart, int minEnd, int maxEnd, short[] cellIds) { Debug.Assert(start >= 0); Debug.Assert(end > 0); Chr = chr; StartPos = start; EndPos = end; Values1 = v1.ToArray(); Values2 = v2.ToArray(); StartPosMin = minStart; EndPosMax = maxEnd; StartPosMax = maxStart; EndPosMin = minEnd; CellIds = cellIds; }
public static Chromosome GetChromosome(ChromosomeEnum id) { if (!Directory.Exists(DataRoot)) throw new DirectoryNotFoundException("Не найдена директория для данных. Она уже должна существовать."); var chrDir = Path.Combine(DataRoot, ChromosomeFolder); if (!Directory.Exists(chrDir)) Directory.CreateDirectory(chrDir); var chrName = id.ToString().ToLower() + ".fa"; var chrPath = Path.Combine(chrDir, chrName); if (File.Exists(chrPath + ".proto"))// файл есть return Chromosome.Deserialize(chrPath + ".proto"); var chrPath2 = GetChromosomeFaPath(id); Debug.Assert(chrPath2 == chrPath); Console.WriteLine("Запускаем конвертацию во внутреннее представление файла " + chrPath + ", размер: " + new FileInfo(chrPath).Length + "B"); // конвертация файла в наш формат var chr = new Chromosome(id); bool isFirst = true; foreach (var line in File.ReadLines(chrPath)) { if (isFirst) { if(line != ">" + id.ToString().ToLower()) throw new Exception("Заголовок файла не верен: " + line); isFirst = false; continue; } chr.AddRange(line.Select(CharToNucleotide).ToArray()); } Console.WriteLine("Конвертация завершена. Осталось только сериализовать для последующего испольования."); // сериализация его var serL = chr.Serialize(chrPath + ".proto"); Console.WriteLine("Хромосома в новом представлении сериализована. Размер: " + serL + "B"); return chr; }
/// <summary> /// Возвращает отсортированные в порядке положения участки с пиками. /// </summary> private static IEnumerable<MergedNarrowPeak> GetNarrowPeak(string filePath, ChromosomeEnum? onlyChr, short cellId) { return File.ReadLines(filePath) .Select(p => new MergedNarrowPeak(p, cellId)) .Where(p => !onlyChr.HasValue || p.Chr == onlyChr.Value); }
private static IEnumerable<MergedNarrowPeak> GetMergedNarrowPeaks(string[] filePaths, ChromosomeEnum? onlyChr) { var tmp = filePaths.Select((p,i) => GetNarrowPeak(p, onlyChr, (short)i)).ToArray(); return Merge(tmp); }
/// <summary> /// Объединяет результаты классификации пиков по разным клеткам /// </summary> /// <param name="onlyChr">Фиксированная хромосома, либо вся ДНК.</param> /// <param name="maxCellsCount">Максимальное число типов клеток.</param> /// <returns>Последовательность слитых пиков.</returns> public static IEnumerable<MergedNarrowPeak> GetMergedNarrowPeaks(ChromosomeEnum? onlyChr, int maxCellsCount) { var filter = new Dictionary<string, string> { { "type", "narrowPeak" }, {"view", "Peaks"} }; var files = DNaseIManager.GetFiles(filter, maxCellsCount).ToArray(); return GetMergedNarrowPeaks(files, onlyChr); }
public Item(string line) { //chr1 566760 566910 . 0 . 339 157.884 -1 -1 var parts = line.Split('\t'); Debug.Assert(parts.Length >= 9); Chr = (ChromosomeEnum)Enum.Parse(typeof(ChromosomeEnum), parts[0], true); StartPos = int.Parse(parts[1]); EndPos = int.Parse(parts[2]); Value1 = float.Parse(parts[6], new NumberFormatInfo { CurrencyDecimalSeparator = "." }); Value2 = float.Parse(parts[7], new NumberFormatInfo { CurrencyDecimalSeparator = "." }); }
/// <summary> /// Строит и возвращает суф-массив построенный на всей хромосоме /// </summary> public static SuffixArray GetSfxArray(ChromosomeEnum chrId) { var chr = ChrManager.GetChromosome(chrId); return SuffixBuilder.BuildOne(chr.GetPack(0, chr.Count)); }
public Region(MergedNarrowPeak peak) { Chr = peak.Chr; Start = peak.StartPosMin; Size = peak.EndPosMax - Start; }
public static SensitivityResults GetSensitivityResults(Dictionary<string, string> filterAttrs, ChromosomeEnum? chr) { string type; if (!filterAttrs.TryGetValue("type", out type) || !new[] { "narrowPeak", "broadPeak" }.Contains(type)) throw new ArgumentException("Тип данных эксперимента должен быть narrowPeak либо broadPeak."); var flistPath = GetFileListPath(); var flist = new FileList(flistPath); var items = flist.Items.Where(p => p.Filter(filterAttrs)).ToArray(); if(items.Length == 0) throw new Exception("Не найдены данные эксперимента, удовлетворяющих заданному фильтру."); if(items.Length > 1) throw new Exception("Заданному фильтру удовлетворяет " + items.Length + " элементов."); var item = items[0]; var fpathGz = Path.Combine(GetDir(), item.FileName); var fpath = fpathGz.Substring(0, fpathGz.Length - 3); if (!File.Exists(fpath)) { if (!File.Exists(fpathGz)) { var url = SrcBaseRoot + item.FileName; Console.WriteLine("Запускаем загрузку из инета по адресу: " + url); try { using (var c = new WebClient()) c.DownloadFile(url, fpathGz); } catch (Exception ex) { File.Delete(fpathGz); throw new Exception("Не удалось загрузить файл", ex); } Console.WriteLine("Файл локально сохранён по пути " + fpathGz); } try { Console.WriteLine("Запускаем разархивацию файла по пути " + fpathGz); using (var gf = File.OpenRead(fpathGz)) { using (var gz = new GZipStream(gf, CompressionMode.Decompress)) { var tmp = new byte[1024 * 1024 * 10]; using (var f = File.Create(fpath)) { int l; while ((l = gz.Read(tmp, 0, tmp.Length)) > 0) { f.Write(tmp, 0, l); if (l != tmp.Length) break; } f.Flush(); } } } Console.WriteLine("Разархивация завершена по пути " + fpath); } catch (Exception ex) { File.Delete(fpath); throw new Exception("Не удалось распаковать файл", ex); } } return new SensitivityResults(fpath, filterAttrs.ToArray(), chr); }
public Region(ChromosomeEnum chr, int start, int size) { Chr = chr; Start = start; Size = size; }
public static string GetChromosomeFaPath(ChromosomeEnum id) { if (!Directory.Exists(DataRoot)) throw new DirectoryNotFoundException("Не найдена директория для данных. Она уже должна существовать."); var chrDir = Path.Combine(DataRoot, ChromosomeFolder); if (!Directory.Exists(chrDir)) Directory.CreateDirectory(chrDir); var chrName = id.ToString().ToLower() + ".fa"; var chrPath = Path.Combine(chrDir, chrName); if (File.Exists(chrPath)) return chrPath; var chrPathGz = chrPath + ".gz"; // если нет ни гзипованной, ни разгзипованной версии, то загрузим из инета гзипованную if (!File.Exists(chrPathGz) && !File.Exists(chrPath)) { var url = SrcBaseRoot + chrName + ".gz"; Console.WriteLine("Файлов с хромосомой локально не обнаружен. Запускаем загрузку из инета по адресу: " + url); try { using (var c = new WebClient()) c.DownloadFile(url, chrPathGz); } catch (Exception ex) { File.Delete(chrPathGz); throw new Exception("Не удалось загрузить файл", ex); } Console.WriteLine("Архив с хромосомой локально сохранён по пути " + chrPathGz + ", размер: " + new FileInfo(chrPathGz).Length + "B"); } // если нет разгзипованной версии, то разгзипуем то, что уже скачали if (!File.Exists(chrPath)) try { Console.WriteLine("Запускаем разархивацию хромосомы по пути " + chrPathGz + ", размер: " + new FileInfo(chrPathGz).Length + "B"); using (var gf = File.OpenRead(chrPathGz)) { using (var gz = new GZipStream(gf, CompressionMode.Decompress)) { var tmp = new byte[1024 * 1024 * 10]; using (var f = File.Create(chrPath)) { int l; while ((l = gz.Read(tmp, 0, tmp.Length)) > 0) { f.Write(tmp, 0, l); if (l != tmp.Length) break; } f.Flush(); } } } Console.WriteLine("Разархивация завершена по пути " + chrPath + ", размер: " + new FileInfo(chrPath).Length + "B"); } catch (Exception ex) { File.Delete(chrPath); throw new Exception("Не удалось распаковать файл", ex); } return chrPath; }
public Chromosome(ChromosomeEnum id) : this() { ChromosomeId = id; }
public Item(ChromosomeEnum chr, int start, int end, float v1, float v2) { Chr = chr; StartPos = start; EndPos = end; Value1 = v1; Value2 = v2; }