class_docstr: The base evaluator defines a simple evaluations that iterates through
  subjects and computes each metric in sequence
  
  Sub-classes should overload the default_evaluation_list with
  application-specific metrics
  If a particular ordering of computations per subject is needed, sub-class
  can override the evaluate_next method; if a particular ordering of
  subjects is needed, subclasses can override the evaluate method.
class_docstr_tok: ["The","base","evaluator","defines","a","simple","evaluations","that","iterates","through","subjects","and","computes","each","metric","in","sequence","Sub-classes","should","overload","the","default_evaluation_list","with","application-specific","metrics","If","a","particular","ordering","of","computations","per","subject","is","needed",",","sub-class","can","override","the","evaluate_next","method",";","if","a","particular","ordering","of","subjects","is","needed",",","subclasses","can","override","the","evaluate","method","."]
code: def __init__(self, reader, app_param, eval_param):
      self.reader = reader
      self.app_param = app_param
      self.eval_param = eval_param
      if eval_param.evaluations:
          eval_list = eval_param.evaluations.split(",")
      else:
          eval_list = self.default_evaluation_list()
      evaluation_classes = [
          EvaluationFactory.create(e) for e in eval_list
      ]
      self.evaluations = [
          e(reader, app_param, eval_param) for e in evaluation_classes
      ]
  
imports: from __future__ import absolute_import, division, print_function
  import itertools
  from itertools import groupby
  from collections import defaultdict
  import pandas
  from niftynet.engine.application_factory import EvaluationFactory
  from niftynet.utilities.util_common import cache
label_desc: Use image node_id 1 to create a new BaseEvaluator object from inherited base classes: object with example: obj = BaseEvaluator(reader, app_param, eval_param)