Exemple #1
0
        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;
        }
Exemple #2
0
        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;
        }
Exemple #3
0
 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;
 }
Exemple #5
0
 /// <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;
 }
Exemple #8
0
        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 = "." });
 }
Exemple #13
0
 /// <summary>
 /// Строит и возвращает суф-массив построенный на всей хромосоме
 /// </summary>
 public static SuffixArray GetSfxArray(ChromosomeEnum chrId)
 {
     var chr = ChrManager.GetChromosome(chrId);
     return SuffixBuilder.BuildOne(chr.GetPack(0, chr.Count));
 }
Exemple #14
0
 public Region(MergedNarrowPeak peak)
 {
     Chr = peak.Chr;
     Start = peak.StartPosMin;
     Size = peak.EndPosMax - Start;
 }
Exemple #15
0
 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);
 }
Exemple #16
0
 public Region(ChromosomeEnum chr, int start, int size)
 {
     Chr = chr;
     Start = start;
     Size = size;
 }
Exemple #17
0
        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;
        }
Exemple #18
0
 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;
 }