class_docstr: The PlateViewer class lets the user view the files associated with plates
  
  The idea here is that the PlateViewer is given a list of image files
  with plate, well and site metadata. The plate viewer organizes the
  files and lets the user browse individual plates.
class_docstr_tok: ["The","PlateViewer","class","lets","the","user","view","the","files","associated","with","plates","The","idea","here","is","that","the","PlateViewer","is","given","a","list","of","image","files","with","plate",",","well","and","site","metadata",".","The","plate","viewer","organizes","the","files","and","lets","the","user","browse","individual","plates","."]
code: def on_plate_motion(self, event):
      assert isinstance(event, wx.MouseEvent)
      x, y = event.GetPosition()
      hit = self.plate_hit_test(x, y)
      if hit is None or self.plate_data is None:
          self.plate_panel.SetToolTip("")
      else:
          row, col = hit
          well_name = "%s%02d" % (well_row_name(row), col + 1)
          well = self.plate_data[row, col]
          if well is None:
              self.plate_panel.SetToolTip("%s: no data" % well_name)
          else:
              text = "%s: %d files" % (
                  well_name,
                  sum([len(v) for v in list(well.values())]),
              )
              self.plate_panel.SetToolTip(text)
  
imports: import multiprocessing
  import threading
  import traceback
  import matplotlib
  import matplotlib.backends.backend_wx
  import matplotlib.backends.backend_wxagg
  import matplotlib.cm
  import matplotlib.figure
  import numpy
  import wx
  import wx.grid
  import scyjava
label_desc: Use image node_id 10 for calling the PlateViewer obj's underlying member method code with example usage: obj.on_plate_motion(event) without return types