docs: def load_retinotopy_cache(sdir, sid, alignment='MSMAll'):
      '''
      Returns the subject's retinotopy cache as a lazy map, or None if no cache exists. The hemi keys
      in the returned map will spell out the cortex name (e.g., lh_native_MSMAll or rh_LR32k_MSMAll).
      '''
      fs = {h:{(k,kk):os.path.join(sdir, 'retinotopy', v % (h, alignment))
               for (kk,vv) in six.iteritems(_retinotopy_cache_tr)
               for (k,v)   in six.iteritems(vv)}
            for h in ('lh','rh')}
      files = {}
      for h in ['lh','rh']:
          for ((k,kk),v) in six.iteritems(fs[h]):
              if not os.path.isfile(v): continue
              hh = _retinotopy_cache_surf_tr[v.split('.')[-2]] % (h, alignment)
              if hh not in files: files[hh] = {}
              files[hh][k] = v
      if len(files) == 0: return files
      def _loader(fls, h, k): return (lambda:nyio.load(fls[h][k]))
      return {h:pimms.lazy_map({k:_loader(files, h, k) for k in six.iterkeys(v)})
              for (h,v) in six.iteritems(files)}