docs: def add_orthologs_by_gene_group(self, graph, gene_ids):
          """
          This will get orthologies between human and other vertebrate genomes
          based on the gene_group annotation pipeline from NCBI.
          More information 9can be learned here:
          http://www.ncbi.nlm.nih.gov/news/03-13-2014-gene-provides-orthologs-regions/
          The method for associations is described in
          [PMCID:3882889](http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3882889/)
          == [PMID:24063302](http://www.ncbi.nlm.nih.gov/pubmed/24063302/).
          Because these are only between human and vertebrate genomes,
          they will certainly miss out on very distant orthologies,
          and should not be considered complete.
  
          We do not run this within the NCBI parser itself;
          rather it is a convenience function for others parsers to call.
  
          :param graph:
          :param gene_ids:  Gene ids to fetch the orthology
          :return:
  
          """
          src_key = 'gene_group'
          LOG.info("getting gene groups")
          src_file = '/'.join((self.rawdir, self.files[src_key]['file']))
          found_counter = 0
          # because many of the orthologous groups are grouped by human gene,
          # we need to do this by generating two-way hash
  
          # group_id => orthologs
          # ortholog id => group
          # this will be the fastest approach, though not memory-efficient.
          geno = Genotype(graph)
          model = Model(graph)
          group_to_orthology = {}
          gene_to_group = {}
          gene_to_taxon = {}
          col = self.files[src_key]['columns']
  
          with gzip.open(src_file, 'rb') as tsv:
              # none of the other files use csv ...
              # tsv = csv.reader(
              #    io.TextIOWrapper(tsvfile, newline=""), delimiter='\t', quotechar='\"')
              # row = tsv.readline()
  
              row = tsv.readline().decode().strip().split('\t')
              row[0] = row[0][1:]  # strip octothorp
              if col != row:
                  LOG.info(
                      '%s\nExpected Headers:\t%s\nRecived Headers:\t %s\n',
                      src_key, col, row)
              for row in tsv:
                  row = row.decode().strip().split('\t')
                  tax_a = row[col.index('tax_id')]
                  gene_a = row[col.index('GeneID')]
                  rel = row[col.index('relationship')]
                  tax_b = row[col.index('Other_tax_id')]
                  gene_b = row[col.index('Other_GeneID')]
  
                  if rel != 'Ortholog':
                      continue
  
                  if gene_a not in group_to_orthology:
                      group_to_orthology[gene_a] = set()
                  group_to_orthology[gene_a].add(gene_b)
  
                  if gene_b not in gene_to_group:
                      gene_to_group[gene_b] = set()
                  gene_to_group[gene_b].add(gene_a)
  
                  gene_to_taxon[gene_a] = tax_a
                  gene_to_taxon[gene_b] = tax_b
  
                  # also add the group lead as a member of the group
                  group_to_orthology[gene_a].add(gene_a)
  
              # end loop through gene_group file
          LOG.debug("Finished hashing gene groups")
          LOG.debug("Making orthology associations")
          for gid in gene_ids:
              gene_num = re.sub(r'NCBIGene:', '', gid)
              group_nums = gene_to_group.get(gene_num)
              if group_nums is not None:
                  for group_num in group_nums:
                      orthologs = group_to_orthology.get(group_num)
                      if orthologs is not None:
                          for orth in orthologs:
                              oid = 'NCBIGene:' + str(orth)
                              model.addClassToGraph(oid, None, self.globaltt['gene'])
                              otaxid = 'NCBITaxon:' + str(gene_to_taxon[orth])
                              geno.addTaxon(otaxid, oid)
                              assoc = OrthologyAssoc(graph, self.name, gid, oid)
                              assoc.add_source('PMID:24063302')
                              assoc.add_association_to_graph()
                              # todo get gene label for orthologs -
                              # this could get expensive
                              found_counter += 1
  
              # finish loop through annotated genes
          LOG.info(
              "Made %d orthology relationships for %d genes",
              found_counter, len(gene_ids))
          return