docs: def _read_opm(string):
      """Read of OPM string
  
      Args:
          string (str): Text containing the OPM
      Return:
          Orbit:
      """
  
      maneuvers = []
  
      data = {}
      comments = {}
      for i, line in enumerate(string.splitlines()):
          if not line:
              continue
          if line.startswith("COMMENT"):
              comments[i] = line.split("COMMENT")[-1].strip()
              continue
  
          key, _, value = line.partition("=")
  
          key = key.strip()
          value = value.strip()
  
          if key.startswith('MAN_'):
              if key == "MAN_EPOCH_IGNITION":
                  maneuvers.append({})
                  man_idx = len(maneuvers) - 1
                  if i - 1 in comments:
                      maneuvers[man_idx]["comment"] = comments[i - 1]
              maneuvers[man_idx][key] = value
          else:
              data[key] = value
  
      try:
          name = data['OBJECT_NAME']
          cospar_id = data['OBJECT_ID']
          scale = data['TIME_SYSTEM']
          frame = data['REF_FRAME']
          date = Date.strptime(data['EPOCH'], "%Y-%m-%dT%H:%M:%S.%f", scale=scale)
          vx = _float(data['X_DOT'])
          vy = _float(data['Y_DOT'])
          vz = _float(data['Z_DOT'])
          x = _float(data['X'])
          y = _float(data['Y'])
          z = _float(data['Z'])
      except KeyError as e:
          raise ValueError('Missing mandatory parameter')
  
      orb = Orbit(date, [x, y, z, vx, vy, vz], 'cartesian', frame, None)
      orb.name = name
      orb.cospar_id = cospar_id
  
      for raw_man in maneuvers:
  
          man = {}
          man['date'] = Date.strptime(raw_man['MAN_EPOCH_IGNITION'], "%Y-%m-%dT%H:%M:%S.%f", scale=scale)
          man['duration'] = timedelta(seconds=_float(raw_man['MAN_DURATION']))
          man['frame'] = raw_man['MAN_REF_FRAME'] if raw_man['MAN_REF_FRAME'] != frame else None
          man['delta_mass'] = raw_man['MAN_DELTA_MASS']
          man['comment'] = raw_man.get('comment')
  
          for i in range(1, 4):
              man.setdefault('dv', []).append(_float(raw_man['MAN_DV_{}'.format(i)]))
  
          if man['duration'].total_seconds() == 0:
              orb.maneuvers.append(Maneuver(man['date'], man['dv'], frame=man['frame'], comment=man['comment']))
  
      if 'CX_X' in data:
  
          frame = data.get('COV_REF_FRAME', orb.cov.PARENT_FRAME)
          if frame in ('RSW', 'RTN'):
              frame = "QSW"
  
          values = [
              [data['CX_X'],     data['CY_X'],     data['CZ_X'],     data['CX_DOT_X'],     data['CY_DOT_X'],     data['CZ_DOT_X']],
              [data['CY_X'],     data['CY_Y'],     data['CZ_Y'],     data['CX_DOT_Y'],     data['CY_DOT_Y'],     data['CZ_DOT_Y']],
              [data['CZ_X'],     data['CZ_Y'],     data['CZ_Z'],     data['CX_DOT_Z'],     data['CY_DOT_Z'],     data['CZ_DOT_Z']],
              [data['CX_DOT_X'], data['CX_DOT_Y'], data['CX_DOT_Z'], data['CX_DOT_X_DOT'], data['CY_DOT_X_DOT'], data['CZ_DOT_X_DOT']],
              [data['CY_DOT_X'], data['CY_DOT_Y'], data['CY_DOT_Z'], data['CY_DOT_X_DOT'], data['CY_DOT_Y_DOT'], data['CZ_DOT_Y_DOT']],
              [data['CZ_DOT_X'], data['CZ_DOT_Y'], data['CZ_DOT_Z'], data['CZ_DOT_X_DOT'], data['CZ_DOT_Y_DOT'], data['CZ_DOT_Z_DOT']]
          ]
  
          orb.cov = np.array(values).astype(np.float) * 1e6
          orb.cov._frame = frame
  
      return orb