class_docstr: The containing dialog and controller for the embedding
  and the image viewer that together make up an analysis
  (i.e. a user selection at an hSNE scale). It also
  iterates over the embedding once the analysis is created
  and this is dynamically displayed in the embedding gui.
code: def __init__(
      self,
      demo_type,
      make_new_analysis,
      remove_analysis,
      analysis_stopped,
  ):
      super(QtWidgets.QDialog, self).__init__()
      self.embedding_viewer = EmbeddingViewer(self)
      self.data_gui = None
      self.demo_type = demo_type
      if demo_type == DemoType.LABELLED_DEMO:
          self.data_gui = CompositeImageViewer()
      elif demo_type == DemoType.HYPERSPECTRAL_DEMO:
          self.data_gui = HyperspectralImageViewer()
      elif demo_type == DemoType.POINT_DEMO:
          self.data_gui = MetaDataViewer()
  
      # Callbacks to the ModelController
      self.make_new_analysis = make_new_analysis
      self.remove_analysis = remove_analysis
      self.analysis_stopped = analysis_stopped
      self.meta_path = None
  
      self.__init_ui()
  
      # HSNE Analysis and data
      self.analysis = None  # hsne analysis
      self.data = None  # the original data
      self.image_dimensions = (
          None  # the dimensions if the data rows represent an image
      )
      self.iterations = None  # number of embedding iterations to perform for the layout
  
      # Embedding iteration control
      self.iters_per_frame = (
          1  # frames contain multiple iterations (for rendering speed)
      )
      self.num_frames = 0  # number of render frames
      self._stop_iter = False  # stop iterating flage
      self._iter_count = 0  # current iteration
      self.timer_count = 0  # total number or iterations
      self.timer = None
  
imports: import time
  import numpy
  from PyQt5 import QtWidgets
  from EmbeddingGui import EmbeddingViewer
  from ModelGui import DemoType
  from CompositeImageViewer import CompositeImageViewer
  from HyperspectralImageViewer import HyperspectralImageViewer
  from MetaDataViewer import MetaDataViewer
label_desc: Use image node_id 1 to create a new AnalysisController object from inherited base classes: QtWidgets with example: obj = AnalysisController(demo_type, make_new_analysis, remove_analysis, analysis_stopped)