code: def setupimgh5(f: Union[Path, h5py.File],
                 Nframetotal: int, Nrow: int, Ncol: int, dtype=np.uint16,
                 writemode='r+', key='/rawimg', cmdlog: str=None):
      
      if isinstance(f, (str, Path)):  # assume new HDF5 file wanted
          f = Path(f).expanduser()
          if f.is_dir():
              raise IOError(
                  'must provide specific HDF5 filename, not just a directory')
  
          print('creating', f)
          with h5py.File(f, writemode) as F:
              setupimgh5(F, Nframetotal, Nrow, Ncol, dtype, writemode, key)
  
      elif isinstance(f, h5py.File):
          h = f.create_dataset(key,
                               shape=(Nframetotal, Nrow, Ncol),
                               dtype=dtype,
                               chunks=(1, Nrow, Ncol),  # each image is a chunk
                               compression='gzip',
                               # no difference in filesize from 1 to 5, except much faster to use lower numbers!
                               compression_opts=1,
                               shuffle=True,
                               fletcher32=True,
                               track_times=True)
          h.attrs["CLASS"] = np.string_("IMAGE")
          h.attrs["IMAGE_VERSION"] = np.string_("1.2")
          h.attrs["IMAGE_SUBCLASS"] = np.string_("IMAGE_GRAYSCALE")
          h.attrs["DISPLAY_ORIGIN"] = np.string_("LL")
          h.attrs['IMAGE_WHITE_IS_ZERO'] = np.uint8(0)
  
          if cmdlog and isinstance(cmdlog, str):
              f['/cmdlog'] = cmdlog
      else:
          raise TypeError(
              f'{type(f)} is not correct, must be filename or h5py.File HDF5 file handle')
docs: f: HDF5 handle (or filename)
  
      h: HDF5 dataset handle