/// <summary> /// Reads gene model features into data structures contained within this library /// </summary> /// <param name="geneModelFile"></param> public void ReadGeneFeatures(string geneModelFile) { foreach (ISequence chromFeatures in SimplerParse(geneModelFile)) { Chromosome chrom = Genome.Chromosomes.FirstOrDefault(x => x.FriendlyName == chromFeatures.ID); if (chrom == null) { continue; } chromFeatures.Metadata.TryGetValue("features", out object f); List <MetadataListItem <List <string> > > features = f as List <MetadataListItem <List <string> > >; for (int i = 0; i < features.Count; i++) { MetadataListItem <List <string> > feature = features[i]; long.TryParse(feature.SubItems["start"][0], out long start); long.TryParse(feature.SubItems["end"][0], out long end); var attributes = SplitAttributes(feature.FreeText); if (feature.FreeText.Contains('=')) { ProcessGff3Feature(feature, start, end, chrom, attributes); } else { ProcessGtfFeature(feature, start, end, chrom, attributes); } } } if (currentTranscript != null) { Transcript.SetRegions(currentTranscript); currentTranscript.FrameCorrection(); } CreateIntergenicRegions(); // possibly check transcript sanity here with Parallel.ForEach(Genes.SelectMany(g => g.Transcripts).ToList(), t => t.SanityCheck()); GenomeForest.Build(); }