code: def analyse_cache_dir(self, jobhandler=None, batchsize=1, **kwargs):
          
          if jobhandler is None:
              jobhandler = SequentialJobHandler()
          files = glob.glob(os.path.join(self.cache_dir, '*.phy'))
          #logger.debug('Files - {}'.format(files))
          records = []
          outfiles = []
          dna = self.collection[0].is_dna() # THIS IS ONLY A GUESS AT SEQ TYPE!!
          for infile in files:
              id_ = fileIO.strip_extensions(infile)
              outfile = self.get_result_file(id_)
              #logger.debug('Looking for {}: {}'.format(outfile, os.path.exists(outfile)))
              if not os.path.exists(outfile):
                  record = Alignment(infile, 'phylip', True)
                  records.append(record)
                  outfiles.append(outfile)
  
          if len(records) == 0:
              return []
  
          args, to_delete = self.task_interface.scrape_args(records, outfiles=outfiles, **kwargs)
          # logger.debug('Args - {}'.format(args))
  
          with fileIO.TempFileList(to_delete):
              result = jobhandler(self.task_interface.get_task(), args, 'Cache dir analysis', batchsize)
              for (out, res) in zip(outfiles, result):
                  if not os.path.exists(out) and res:
                      with open(out, 'w') as outfl:
                          json.dump(res, outfl)
  
          return result
docs: Scan the cache directory and launch analysis for all unscored alignments
          using associated task handler. KWargs are passed to the tree calculating
          task managed by the TaskInterface in self.task_interface.
          Example kwargs:
            TreeCollectionTaskInterface: scale=1, guide_tree=None, 
                                         niters=10, keep_topology=False
            RaxmlTaskInterface: -------- partition_files=None, model=None, threads=1
            FastTreeTaskInterface: ----- No kwargs