code: def calc_memory_footprint(d, headroom=4., visonly=False, limit=False):
      
  
      toGB = 8/1024.**3   # number of complex64s to GB
      d0 = d.copy()
  
      # limit defined for dm sweep time and max nchunk/nthread ratio
      if limit:
          d0['readints'] = d['t_overlap']/d['inttime']
          d0['nchunk'] = max(d['dtarr'])/min(d['dtarr']) * d['nthread']
  
      vismem = headroom * datasize(d0) * toGB
      if visonly:
          return vismem
      else:
          immem = d0['nthread'] * (d0['readints']/d0['nchunk'] * d0['npixx'] * d0['npixy']) * toGB
          return (vismem, immem)
docs: Given pipeline state dict, this function calculates the memory required
      to store visibilities and make images.
      headroom scales visibility memory size from single data object to all copies (and potential file read needs)
      limit=True returns a the minimum memory configuration
      Returns tuple of (vismem, immem) in units of GB.