docs: def write_biom(self, sample_names, read_taxonomies, biom_file_io):
          '''Write the OTU info to a biom IO output stream
          
          Parameters
          ----------
          sample_names: String
              names of each sample (sample_ids for biom)
          read_taxonomies: Array of hashes as per _iterate_otu_table_rows()
          biom_file_io: io
              open writeable stream to write biom contents to
              
          Returns True if successful, else False'''
          counts = []
          observ_metadata = []
          otu_ids = []
          for otu_id, tax, count in self._iterate_otu_table_rows(read_taxonomies):
              if len(count) != len(sample_names):
                  raise Exception("Programming error: mismatched sample names and counts")
              counts.append(count)
              observ_metadata.append({'taxonomy': tax})
              otu_ids.append(str(otu_id))
          if len(counts) == 0:
              logging.info("Not writing BIOM file since no sequences were assigned taxonomy")
              return True
          table = Table(np.array(counts),
                        otu_ids, sample_names, observ_metadata,
                        [{}]*len(sample_names), table_id='GraftM Taxonomy Count Table')
          try:
              table.to_hdf5(biom_file_io, 'GraftM graft')
              return True
          except RuntimeError as e:
              logging.warn("Error writing BIOM output, file not written. The specific error was: %s" % e)
              return False