docs: def apply(self, hits, no_copy=False):
          """Add x, y, z, t0 (and du, floor if DataFrame) columns to the hits.
  
          """
          if not no_copy:
              hits = hits.copy()
          if istype(hits, 'DataFrame'):
              # do we ever see McHits here?
              hits = Table.from_template(hits, 'Hits')
          if hasattr(hits, 'dom_id') and hasattr(hits, 'channel_id'):
              dir_x, dir_y, dir_z, du, floor, pos_x, pos_y, pos_z, t0 = _get_calibration_for_hits(
                  hits, self._calib_by_dom_and_channel
              )
  
              if hasattr(hits, 'time'):
                  if hits.time.dtype != t0.dtype:
                      time = hits.time.astype('f4') + t0.astype('f4')
                      hits = hits.drop_columns(['time'])
                      hits = hits.append_columns(['time'], [time])
                  else:
                      hits.time += t0
  
              hits_data = {}
              for colname in hits.dtype.names:
                  hits_data[colname] = hits[colname]
              calib = {
                  'dir_x': dir_x,
                  'dir_y': dir_y,
                  'dir_z': dir_z,
                  'du': du.astype(np.uint8),
                  'floor': du.astype(np.uint8),
                  'pos_x': pos_x,
                  'pos_y': pos_y,
                  'pos_z': pos_z,
                  't0': t0,
              }
              hits_data.update(calib)
              return Table(
                  hits_data,
                  h5loc=hits.h5loc,
                  split_h5=hits.split_h5,
                  name=hits.name
              )
  
          elif hasattr(hits, 'pmt_id'):
              dir_x, dir_y, dir_z, du, floor, pos_x, pos_y, pos_z, t0 = _get_calibration_for_mchits(
                  hits, self._calib_by_pmt_id
              )
              if hasattr(hits, 'time'):
                  if hits.time.dtype != t0.dtype:
                      time = hits.time.astype('f4') + t0.astype('f4')
                      hits = hits.drop_columns(['time'])
                      hits = hits.append_columns(['time'], [time])
                  else:
                      hits.time += t0
  
              hits_data = {}
              for colname in hits.dtype.names:
                  hits_data[colname] = hits[colname]
              calib = {
                  'dir_x': dir_x,
                  'dir_y': dir_y,
                  'dir_z': dir_z,
                  'du': du.astype(np.uint8),
                  'floor': du.astype(np.uint8),
                  'pos_x': pos_x,
                  'pos_y': pos_y,
                  'pos_z': pos_z,
                  't0': t0,
              }
              hits_data.update(calib)
              return Table(
                  hits_data,
                  h5loc=hits.h5loc,
                  split_h5=hits.split_h5,
                  name=hits.name
              )
          else:
              raise TypeError(
                  "Don't know how to apply calibration to '{0}'. "
                  "We need at least 'dom_id' and 'channel_id', or "
                  "'pmt_id'.".format(hits.name)
              )