code: def resource_usage(bcbio_log, cluster, rawdir, verbose):
      
      data_frames = {}
      hardware_info = {}
      time_frame = log_time_frame(bcbio_log)
  
      for collectl_file in sorted(os.listdir(rawdir)):
          if not collectl_file.endswith('.raw.gz'):
              continue
  
          # Only load filenames within sampling timerange (gathered from bcbio_log time_frame)
          if rawfile_within_timeframe(collectl_file, time_frame):
  
              collectl_path = os.path.join(rawdir, collectl_file)
              data, hardware = load_collectl(
                  collectl_path, time_frame.start, time_frame.end)
  
              if len(data) == 0:
                  #raise ValueError("No data present in collectl file %s, mismatch in timestamps between raw collectl and log file?", collectl_path)
                  continue
  
              host = re.sub(r'-\d{8}-\d{6}\.raw\.gz$', '', collectl_file)
              hardware_info[host] = hardware
              if host not in data_frames:
                  data_frames[host] = data
              else:
                  data_frames[host] = pd.concat([data_frames[host], data])
  
      return (data_frames, hardware_info, time_frame.steps)
docs: Generate system statistics from bcbio runs.
  
      Parse the obtained files and put the information in
      a :class pandas.DataFrame:.
  
      :param bcbio_log:   local path to bcbio log file written by the run
      :param cluster:
      :param rawdir:      directory to put raw data files
      :param verbose:     increase verbosity
  
      :return: a tuple with three dictionaries, the first one contains
               an instance of :pandas.DataFrame: for each host, the second one
               contains information regarding the hardware configuration and
               the last one contains information regarding timing.
      :type return: tuple