code: def load_ply(self, epoch, split, file):
      self._data_name = "data_{}_{}_{}".format(epoch, split, file)
      if not hasattr(self, self._data_name):
          path_to_ply = os.path.join(
              self._viz_path, str(epoch), split, file
          )
          if os.path.exists(path_to_ply):
              plydata = PlyData.read(path_to_ply)
              arr = np.asarray([e.data for e in plydata.elements])
              names = list(arr.dtype.names)
              pos_indices = [names.index(n) for n in self.POS_KEYS]
              non_pos_indices = {
                  n: names.index(n)
                  for n in names
                  if n not in self.POS_KEYS
              }
              arr_ = rfn.structured_to_unstructured(arr).squeeze()
              xyz = arr_[:, pos_indices]
              data = {
                  "xyz": xyz,
                  "columns": non_pos_indices.keys(),
                  "name": self._data_name,
              }
              for n, i in non_pos_indices.items():
                  data[n] = arr_[:, i]
              setattr(self, self._data_name, data)
          else:
              print("The file doesn' t exist: Wierd !")
      else:
          return getattr(self, self._data_name)
  
imports: import os
  from glob import glob
  from collections import defaultdict
  import torch
  from plyfile import PlyData, PlyElement
  from numpy.lib import recfunctions
  from torch_points3d.utils.colors import COLORS
  import numpy
label_desc: Use image node_id 8 for calling the ExperimentFolder obj's underlying member method code with example usage: obj.load_ply(epoch, split, file) and returns: getattr