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