docstr: Keep objects according to rules
  
  workspace - workspace holding the measurements for the rules
  src_objects - filter these objects (uses measurement indexes instead)
  rules - supply pre-generated rules loaded from a classifier model file
  
  Open the rules file indicated by the settings and score the
  objects by the rules. Return the indexes of the objects that pass.
docstr_tok: ["Keep","objects","according","to","rules","workspace","-","workspace","holding","the","measurements","for","the","rules","src_objects","-","filter","these","objects","(","uses","measurement","indexes","instead",")","rules","-","supply","pre-generated","rules","loaded","from","a","classifier","model","file","Open","the","rules","file","indicated","by","the","settings","and","score","the","objects","by","the","rules",".","Return","the","indexes","of","the","objects","that","pass","."]
code: def keep_by_rules(self, workspace, src_objects, rules=None):
      """Keep objects according to rules
  
      workspace - workspace holding the measurements for the rules
      src_objects - filter these objects (uses measurement indexes instead)
      rules - supply pre-generated rules loaded from a classifier model file
  
      Open the rules file indicated by the settings and score the
      objects by the rules. Return the indexes of the objects that pass.
      """
      if not rules:
          rules = self.get_rules()
          rules_class = int(self.rules_class.value) - 1
      else:
          rules_class = self.get_bin_labels().index(
              self.rules_class.value
          )
      scores = rules.score(workspace.measurements)
      if len(scores) > 0:
          is_not_nan = numpy.any(~numpy.isnan(scores), 1)
          best_class = numpy.argmax(scores[is_not_nan], 1).flatten()
          hits = numpy.zeros(scores.shape[0], bool)
          hits[is_not_nan] = best_class == rules_class
          indexes = numpy.argwhere(hits).flatten() + 1
      else:
          indexes = numpy.array([], int)
      return indexes
  
imports: from cellprofiler_core.constants.measurement import M_LOCATION_CENTER_X, M_LOCATION_CENTER_Y, C_CHILDREN, C_PARENT, C_LOCATION, C_NUMBER, FTR_OBJECT_NUMBER, C_COUNT, FTR_CENTER_X, FTR_CENTER_Y, FTR_CENTER_Z
  from cellprofiler_core.module.image_segmentation import ObjectProcessing
  from cellprofiler_core.preferences import DEFAULT_INPUT_FOLDER_NAME, ABSOLUTE_FOLDER_NAME, DEFAULT_INPUT_SUBFOLDER_NAME, DEFAULT_OUTPUT_SUBFOLDER_NAME
  from cellprofiler_core.setting import Divider, HiddenCount, SettingsGroup, Measurement, Binary, ValidationError
  from cellprofiler_core.setting.choice import Choice
  from cellprofiler_core.setting.do_something import DoSomething, RemoveSettingButton
  from cellprofiler_core.setting.subscriber import LabelSubscriber
  from cellprofiler_core.setting.text import Directory, Filename, Float, LabelName
  from cellprofiler.modules import _help
  import logging
  import os
  import numpy
  import scipy
  import scipy.ndimage
  import scipy.sparse
  import cellprofiler.gui.help
  import cellprofiler_core.object
  from cellprofiler.utilities.rules import Rules
label_desc: Use image node_id 24 for calling the FilterObjects obj's underlying member method code with example usage: obj.keep_by_rules(workspace, src_objects, rules) and returns: indexes