docs: def extract(d, whichtables, mode, time):
      """
      LiPD Version 1.3
      Main function to initiate LiPD to TSOs conversion.
  
      Each object has a
      "paleoNumber" or "chronNumber"
      "tableNumber"
      "modelNumber"
      "time_id"
      "mode" - chronData or paleoData
      "tableType" - "meas" "ens" "summ"
  
  
      :param dict d: Metadata for one LiPD file
      :param str whichtables: all, meas, summ, or ens
      :param str mode: paleo or chron mode
      :return list _ts: Time series
      """
      logger_ts.info("enter extract_main")
      _root = {}
      _ts = {}
      # _switch = {"paleoData": "chronData", "chronData": "paleoData"}
      _pc = "paleoData"
      if mode == "chron":
          _pc = "chronData"
      _root["mode"] = _pc
      _root["time_id"] = time
      try:
          # Build the root level data.
          # This will serve as the template for which column data will be added onto later.
          for k, v in d.items():
              if k == "funding":
                  _root = _extract_fund(v, _root)
              elif k == "geo":
                  _root = _extract_geo(v, _root)
              elif k == 'pub':
                  _root = _extract_pub(v, _root)
              # elif k in ["chronData", "paleoData"]:
              #     # Store chronData and paleoData as-is. Need it to collapse without data loss.
              #     _root[k] = copy.deepcopy(v)
              else:
                  if k not in ["chronData", "paleoData"]:
                      _root[k] = v
          # Create tso dictionaries for each individual column (build on root data)
          _ts = _extract_pc(d, _root, _pc, whichtables)
      except Exception as e:
          logger_ts.error("extract: Exception: {}".format(e))
          print("extract: Exception: {}".format(e))
  
      logger_ts.info("exit extract_main")
      return _ts