class_docstr: Class to represent a sequence of 3d scans (possibly acquired on a
  slice-by-slice basis).
  
  Object remains empty until the data array is actually loaded in memory.
  
  Parameters
  ----------
    data : nd array or proxy (function that actually gets the array)
class_docstr_tok: ["Class","to","represent","a","sequence","of","3d","scans","(","possibly","acquired","on","a","slice-by-slice","basis",")",".","Object","remains","empty","until","the","data","array","is","actually","loaded","in","memory",".","Parameters","--","--","--","--","--","data",":","nd","array","or","proxy","(","function","that","actually","gets","the","array",")"]
docstr: tv = scanner_time(zv, t)
  zv, tv are grid coordinates; t is an actual time value.
docstr_tok: ["tv","=","scanner_time","(","zv",",","t",")","zv",",","tv","are","grid","coordinates",";","t","is","an","actual","time","value","."]
code: def scanner_time(self, zv, t):
      """
      tv = scanner_time(zv, t)
      zv, tv are grid coordinates; t is an actual time value.
      """
      corr = interp_slice_times(
          self.z_to_slice(zv), self.slice_times, self.tr
      )
      return (t - corr) / self.tr
  
imports: import os
  import warnings
  import numpy
  from nibabel import io_orientation
  from nibabel.affines import apply_affine
  from ...core.image.image_spaces import as_xyz_image, make_xyz_image, xyz_affine
  from ...io.nibcompat import get_header
  from ..slicetiming import timefuncs
  from ._registration import _cspline_sample3d, _cspline_sample4d, _cspline_transform
  from .affine import Affine, Rigid
  from .optimizer import configure_optimizer, use_derivatives
  from .type_check import check_type, check_type_and_shape
label_desc: Use image node_id 7 for calling the Image4d obj's underlying member method code with example usage: obj.scanner_time(zv, t) and returns: unknown