class_docstr: Interface for NiftyNet evaluations used with
  CachedSubanalysisEvaluator so that evaluations are run in a way that is
  friendly for caching intermediate computations. Each evaluation defines
  sub-analyses to run, and all subanalysis are run at the same time then
  the cache is cleared
docstr: Performs one sub-analysis
  
  :param subject_id: subject identifier string
  :param data: a data dictionary as built by ImageReader
  :param subanalysis: dictionary containing information specifying the
  analysis to run
  :return: a list of pandas.DataFrame objects
code: def layer_op(self, subject_id, data, subanalysis):
      """
      Performs one sub-analysis
  
      :param subject_id: subject identifier string
      :param data: a data dictionary as built by ImageReader
      :param subanalysis: dictionary containing information specifying the
      analysis to run
      :return: a list of pandas.DataFrame objects
      """
      raise NotImplementedError("not implemented in abstract class")
  
file_path: NiftyNet/niftynet/evaluation/base_evaluations.py
imports: from __future__ import absolute_import, division, print_function
  import pandas
  from niftynet.layer.base_layer import Layer
label_desc: Use image node_id 2 for calling the CachedSubanalysisEvaluation obj's underlying member method code with example usage: obj.layer_op(subject_id, data, subanalysis) without return types