code: def create_node_creation_factor(self, tool, source, output_plate, plate_manager):
          
          # if isinstance(tool, dict):
          #     tool = self.channels.get_tool(**tool)
  
          if not isinstance(tool, PlateCreationTool):
              raise ValueError("Expected PlateCreationTool, got {}".format(type(tool)))
  
          input_plates = source.plates if source else []
  
          if len(input_plates) > 1:
              raise NotImplementedError
  
          factor = NodeCreationFactor(
              tool=tool,
              source_node=source,
              input_plate=input_plates[0] if input_plates else None,
              output_plate=output_plate,
              plate_manager=plate_manager
          )
  
          self._add_factor(factor)
          return factor
docs: Creates a factor that itself creates an output node, and ensures that the plate for the output node exists
          along with all relevant meta-data
  
          :param tool: The tool
          :param source: The source node
          :param output_plate: The details of the plate that will be created (dict)
          :param plate_manager: The hyperstream plate manager
          :type output_plate: dict
          :type plate_manager: PlateManager
          :return: The created factor