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 static Nucleotide ToNucleotide(FastaReader.FastaItem item) { switch (item) { case FastaReader.FastaItem.A: case FastaReader.FastaItem.Alow: return Nucleotide.A; case FastaReader.FastaItem.T: case FastaReader.FastaItem.Tlow: return Nucleotide.T; case FastaReader.FastaItem.G: case FastaReader.FastaItem.Glow: return Nucleotide.G; case FastaReader.FastaItem.C: case FastaReader.FastaItem.Clow: return Nucleotide.C; case FastaReader.FastaItem.Any: return Nucleotide.Any; default: throw new NotSupportedException(); } }