code: def get_enum_tasks_and_names_and_enum_models(
      cls, data_root: str
  ) -> List[Tuple[int, str, str, List[Tuple[int, str]]]]:
      dirs = [
          d
          for d in os.listdir(data_root)
          if op.isdir(op.join(data_root, d))
      ]
      enum_tasks_and_names_and_enum_models = []
      c = 0
      for d in dirs:
          dir_path = op.join(data_root, d)
          task_name = VizSeqTaskConfigManager(dir_path).task_name
          if len(task_name) == 0:
              task_name = d
          paths = sorted(glob(op.join(dir_path, "pred_*.txt")))
          if len(paths) == 0:
              continue
          models = [
              (i, str(op.splitext(op.basename(p))[0]).split("_", 1)[1])
              for i, p in enumerate(paths)
          ]
          enum_tasks_and_names_and_enum_models.append(
              (c, d, task_name, models)
          )
          c += 1
      return enum_tasks_and_names_and_enum_models
  
imports: from typing import List, Tuple, Iterable
  import math
  import os
  import os.path
  from glob import glob
  import json
  from vizseq._data import VizSeqTaskConfigManager, VizSeqGlobalConfigManager, VizSeqStats, set_g_cred_path, VizSeqTableExporter, VizSeqNGrams, VizSeqTokenization
  from vizseq.scorers import get_scorer_name, get_scorer_ids_and_names
  from .data_view import VizSeqDataPageView, VizSeqPageData
  from .mem_cached_data_getters import _get_src, _get_ref, _get_tag, _get_hypo, _get_scores
label_desc: Use image node_id 5 for calling the VizSeqWebView obj's underlying member method code with example usage: obj.get_enum_tasks_and_names_and_enum_models(cls, data_root) and returns: enum_tasks_and_names_and_enum_models