docs: def link(self):
          """Ensure that an appropriate link to the cellpy-files exists for
          each cell.
  
          The experiment will then contain a CellpyData object for each cell
          (in the cell_data_frames attribute) with only the step-table stored.
  
          Remark that running update persists the summary frames instead (or
          everything in case you specify all_in_memory=True).
          This might be considered "a strange and unexpected behaviour". Sorry
          for that (but the authors of this package is also a bit strange...).
  
          """
          logging.info("[estblishing links]")
          logging.debug("checking and establishing link to data")
          cell_data_frames = dict()
          counter = 0
          errors = []
          try:
              for indx, row in self.journal.pages.iterrows():
  
                  counter += 1
                  l_txt = "starting to process file # %i (index=%s)" % (counter, indx)
                  logging.debug(l_txt)
                  logging.info(f"linking cellpy-file: {row.cellpy_file_names}")
  
                  if not os.path.isfile(row.cellpy_file_names):
                      logging.error("File does not exist")
                      raise IOError
  
                  cell_data_frames[indx] = cellreader.CellpyData(initialize=True)
  
                  step_table = helper.look_up_and_get(
                      row.cellpy_file_names,
                      "step_table"
                  )
  
                  cell_data_frames[indx].dataset.step_table = step_table
  
              self.cell_data_frames = cell_data_frames
  
          except IOError as e:
              logging.warning(e)
              e_txt = "links not established - try update"
              logging.warning(e_txt)
              errors.append(e_txt)
  
          self.errors["link"] = errors