code: def get_splitting_stream(self, input_plate_value):
          if not self.splitting_node:
              return None
          if len(self.splitting_node.plates) == 0:
              return self.splitting_node.streams[None]
          if len(self.splitting_node.plates) > 1:
              raise ValueError("Splitting node cannot live on multiple plates for factor {}"
                               .format(self.factor_id))
          if not self.input_plate and len(self.splitting_node.plates) > 0:
              raise ValueError("Splitting node cannot live on a plate if there is no input plate")
          splitting_plate = self.splitting_node.plates[0]
          if self.input_plate == splitting_plate:
              splitting_stream = self.splitting_node.streams[input_plate_value]
          else:
              if splitting_plate.is_child(self.input_plate):
                  ppv = filter(lambda x: all(p in input_plate_value for p in x), self.input_plate.parent.values)
                  if len(ppv) != 1:
                      raise ValueError("Parent plate value not found")
                  splitting_stream = self.splitting_node.streams[ppv[0]]
              elif splitting_plate.is_descendant(self.input_plate):
                  ppv = filter(lambda x: all(p in input_plate_value for p in x), self.input_plate.parent.values)
                  if len(ppv) != 1:
                      raise ValueError("Parent plate value not found")
                  splitting_stream = self.splitting_node.streams[ppv]
              else:
                  raise IncompatiblePlatesError(
                      "Splitting node plate {} does not match input plate {} for factor {}"
                      .format(self.input_plate, self.splitting_node.plates[0], self.factor_id))
          return splitting_stream