class_docstr: Evaluation class for measuring Precision, Recall and F-measure of notes.
  
  Parameters
  ----------
  detections : str, list or numpy array
      Detected notes.
  annotations : str, list or numpy array
      Annotated ground truth notes.
  window : float, optional
      F-measure evaluation window [seconds]
  delay : float, optional
      Delay the detections `delay` seconds for evaluation.
docstr: Parameters
  ----------
  notes : bool, optional
      Display detailed output for all individual notes.
  
  Returns
  -------
  str
      Evaluation metrics formatted as a human readable string.
docstr_tok: ["Parameters","--","--","--","--","--","notes",":","bool",",","optional","Display","detailed","output","for","all","individual","notes",".","Returns","--","--","--","-","str","Evaluation","metrics","formatted","as","a","human","readable","string","."]
code: def tostring(self, notes=False, **kwargs):
      """
  
      Parameters
      ----------
      notes : bool, optional
          Display detailed output for all individual notes.
  
      Returns
      -------
      str
          Evaluation metrics formatted as a human readable string.
  
      """
      ret = ""
      if self.name is not None:
          ret += "%s\n  " % self.name
      # add statistics for the individual note
      if notes:
          # determine which notes are present
          notes = []
          if self.tp.any():
              notes = np.append(notes, np.unique(self.tp[:, 1]))
          if self.fp.any():
              notes = np.append(notes, np.unique(self.fp[:, 1]))
          if self.tn.any():
              notes = np.append(notes, np.unique(self.tn[:, 1]))
          if self.fn.any():
              notes = np.append(notes, np.unique(self.fn[:, 1]))
          # evaluate them individually
          for note in sorted(np.unique(notes)):
              # detections and annotations for this note (only onset times)
              det = self.detections[self.detections[:, 1] == note][:, 0]
              ann = self.annotations[self.annotations[:, 1] == note][
                  :, 0
              ]
              name = "MIDI note %s" % note
              e = OnsetEvaluation(det, ann, self.window, name=name)
              # append to the output string
              ret += "  %s\n" % e.tostring(notes=False)
      # normal formatting
      ret += (
          "Notes: %5d TP: %5d FP: %4d FN: %4d "
          "Precision: %.3f Recall: %.3f F-measure: %.3f "
          "Acc: %.3f mean: %5.1f ms std: %5.1f ms"
          % (
              self.num_annotations,
              self.num_tp,
              self.num_fp,
              self.num_fn,
              self.precision,
              self.recall,
              self.fmeasure,
              self.accuracy,
              self.mean_error * 1000.0,
              self.std_error * 1000.0,
          )
      )
      # return
      return ret
  
imports: from __future__ import absolute_import, division, print_function
  import warnings
  import numpy
  from .None import evaluation_io, MultiClassEvaluation, SumEvaluation, MeanEvaluation
  from .onsets import onset_evaluation, OnsetEvaluation
  from ..io import load_notes
label_desc: Use image node_id 4 for calling the NoteEvaluation obj's underlying member method code with example usage: obj.tostring(notes) and returns: ret