class_docstr: The plate data is the data store for the image files
  
  plate_well_site is a 3-level dictionary where the first level
  dictionary has keys that are plate names and whose values are
  dictionaries of wells.
  The second level has keys that are well names and values that are
  dictionaries of sites. The third level has site name as key and
  a list of files at that site as values.
class_docstr_tok: ["The","plate","data","is","the","data","store","for","the","image","files","plate_well_site","is","a","3-level","dictionary","where","the","first","level","dictionary","has","keys","that","are","plate","names","and","whose","values","are","dictionaries","of","wells",".","The","second","level","has","keys","that","are","well","names","and","values","that","are","dictionaries","of","sites",".","The","third","level","has","site","name","as","key","and","a","list","of","files","at","that","site","as","values","."]
code: def on_update(self):
      #
      # Calculate maximum # of planes per well
      #
      self.max_per_well = 0
      for pd in list(self.plate_well_site.values()):
          for wd in list(pd.values()):
              nplanes = sum([len(x) for x in list(wd.values())])
              if nplanes > self.max_per_well:
                  self.max_per_well = nplanes
      for registrant in self.registrants:
          registrant()
  
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 3 for calling the PlateData obj's underlying member method code with example usage: obj.on_update() without return types