docs: def evaluate(self, reference_scene_list, estimated_scene_list=None, estimated_scene_probabilities=None):
          """Evaluate file pair (reference and estimated)
  
          Parameters
          ----------
  
          reference_scene_list : list of dict or dcase_util.containers.MetaDataContainer
              Reference scene list.
              Default value None
  
          estimated_scene_list : list of dict or dcase_util.containers.MetaDataContainer
              Estimated scene list.
              Default value None
  
          estimated_scene_probabilities : dcase_util.containers.ProbabilityContainer
              Estimated scene probabilities. Currently not used.
              Default value None
  
          Returns
          -------
          self
  
          """
  
          if estimated_scene_list is None and estimated_scene_probabilities is None:
              raise ValueError("Nothing to evaluate, give at least estimated_scene_list or estimated_scene_probabilities")
  
          # Make sure reference_scene_list is dcase_util.containers.MetaDataContainer
          if not isinstance(estimated_scene_list, dcase_util.containers.MetaDataContainer):
              reference_scene_list = dcase_util.containers.MetaDataContainer(reference_scene_list)
  
          # Make sure estimated_scene_list is dcase_util.containers.MetaDataContainer
          if not isinstance(estimated_scene_list, dcase_util.containers.MetaDataContainer):
              estimated_scene_list = dcase_util.containers.MetaDataContainer(estimated_scene_list)
  
          # Make sure estimated_tag_probabilities is dcase_util.containers.ProbabilityContainer
          if estimated_scene_probabilities is not None:
              if not isinstance(estimated_scene_probabilities, dcase_util.containers.ProbabilityContainer):
                  estimated_scene_probabilities = dcase_util.containers.ProbabilityContainer(estimated_scene_probabilities)
  
          # Translate "file" field to "filename"
          for item in reference_scene_list:
              if 'filename' not in item and 'file' in item:
                  item['filename'] = item['file']
  
          for item in estimated_scene_list:
              if 'filename' not in item and 'file' in item:
                  item['filename'] = item['file']
  
          y_true = []
          y_pred = []
  
          for estimated_item in estimated_scene_list:
              reference_item_matched = {}
              for reference_item in reference_scene_list:
                  if estimated_item['filename'] == reference_item['filename']:
                      reference_item_matched = reference_item
                      break
  
              if not reference_item_matched:
                  raise ValueError(
                      "Cannot find reference_item for estimated item [{item}]".format(item=estimated_item['file'])
                  )
  
              y_true.append(reference_item_matched['scene_label'])
              y_pred.append(estimated_item['scene_label'])
  
          y_true = numpy.array(y_true)
          y_pred = numpy.array(y_pred)
  
          Ncorr_overall = 0
          for scene_id, scene_label in enumerate(self.scene_label_list):
              true_id = numpy.where(y_true == scene_label)[0]
              pred_id = numpy.where(y_pred == scene_label)[0]
  
              Ncorr = 0
              for id in true_id:
                  if id in pred_id:
                      Ncorr += 1
  
              Ncorr_overall += Ncorr
              self.scene_wise[scene_label]['Ncorr'] += Ncorr
              self.scene_wise[scene_label]['Nref'] += true_id.shape[0]
              self.scene_wise[scene_label]['Nsys'] += pred_id.shape[0]
  
          self.overall['Ncorr'] += Ncorr_overall
          self.overall['Nref'] += y_true.shape[0]
          self.overall['Nsys'] += y_pred.shape[0]
  
          return self