code: def estimateabundance(self):
          
          logging.info('Estimating abundance of taxonomic groups')
          # Create and start threads
          for i in range(self.cpus):
              # Send the threads to the appropriate destination function
              threads = Thread(target=self.estimate, args=())
              # Set the daemon to true - something to do with thread management
              threads.setDaemon(True)
              # Start the threading
              threads.start()
          with progressbar(self.runmetadata.samples) as bar:
              for sample in bar:
                  try:
                      if sample.general.combined != 'NA':
                          # Set the name of the abundance report
                          sample.general.abundance = sample.general.combined.split('.')[0] + '_abundance.csv'
                          # if not hasattr(sample, 'commands'):
                          if not sample.commands.datastore:
                              sample.commands = GenObject()
  
                          # Define system calls
                          sample.commands.target = self.targetcall
                          sample.commands.classify = self.classifycall
                          sample.commands.abundancecall = \
                              'cd {} && ./estimate_abundance.sh -D {} -F {} > {}'.format(self.clarkpath,
                                                                                         self.databasepath,
                                                                                         sample.general.classification,
                                                                                         sample.general.abundance)
                          self.abundancequeue.put(sample)
                  except KeyError:
                      pass
          self.abundancequeue.join()
docs: Estimate the abundance of taxonomic groups