melonora / napari-cell-gater

A napari plugin for cell marker gating.
BSD 3-Clause "New" or "Revised" License
4 stars 1 forks source link

OS Error when loading another marker #21

Closed sfritzs closed 1 month ago

sfritzs commented 3 months ago

Another one :) getting closer

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\app\backends\_qt.py:928, in CanvasBackendDesktop.paintGL(self=<vispy.app.backends._qt.CanvasBackendDesktop object>)
    926 # (0, 0, self.width(), self.height()))
    927 self._vispy_canvas.set_current()
--> 928 self._vispy_canvas.events.draw(region=None)
        self._vispy_canvas = <VispyCanvas (PyQt5) at 0x1d5346468f0>
        self._vispy_canvas.events.draw = <vispy.util.event.EventEmitter object at 0x000001D53464D5A0>
        self = <vispy.app.backends._qt.CanvasBackendDesktop object at 0x000001D534649240>
        self._vispy_canvas.events = <vispy.util.event.EmitterGroup object at 0x000001D53464D510>
    930 # Clear the alpha channel with QOpenGLWidget (Qt >= 5.4), otherwise the
    931 # window is translucent behind non-opaque objects.
    932 # Reference:  MRtrix3/mrtrix3#266
    933 if QT5_NEW_API or PYSIDE6_API or PYQT6_API:

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\util\event.py:453, in EventEmitter.__call__(self=<vispy.util.event.EventEmitter object>, *args=(), **kwargs={'region': None})
    450 if self._emitting > 1:
    451     raise RuntimeError('EventEmitter loop detected!')
--> 453 self._invoke_callback(cb, event)
        event = <DrawEvent blocked=False handled=False native=None region=None source=None sources=[] type=draw>
        self = <vispy.util.event.EventEmitter object at 0x000001D53464D5A0>
        cb = <bound method SceneCanvas.on_draw of <VispyCanvas (PyQt5) at 0x1d5346468f0>>
    454 if event.blocked:
    455     break

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\util\event.py:471, in EventEmitter._invoke_callback(self=<vispy.util.event.EventEmitter object>, cb=<bound method SceneCanvas.on_draw of <VispyCanvas (PyQt5)>>, event=<DrawEvent blocked=False handled=False native=None region=None source=None sources=[] type=draw>)
    469     cb(event)
    470 except Exception:
--> 471     _handle_exception(self.ignore_callback_errors,
        self = <vispy.util.event.EventEmitter object at 0x000001D53464D5A0>
        cb = <bound method SceneCanvas.on_draw of <VispyCanvas (PyQt5) at 0x1d5346468f0>>
        event = <DrawEvent blocked=False handled=False native=None region=None source=None sources=[] type=draw>
        (cb, event) = (<bound method SceneCanvas.on_draw of <VispyCanvas (PyQt5) at 0x1d5346468f0>>, <DrawEvent blocked=False handled=False native=None region=None source=None sources=[] type=draw>)
    472                       self.print_callback_errors,
    473                       self, cb_event=(cb, event))

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\util\event.py:469, in EventEmitter._invoke_callback(self=<vispy.util.event.EventEmitter object>, cb=<bound method SceneCanvas.on_draw of <VispyCanvas (PyQt5)>>, event=<DrawEvent blocked=False handled=False native=None region=None source=None sources=[] type=draw>)
    467 def _invoke_callback(self, cb, event):
    468     try:
--> 469         cb(event)
        cb = <bound method SceneCanvas.on_draw of <VispyCanvas (PyQt5) at 0x1d5346468f0>>
        event = <DrawEvent blocked=False handled=False native=None region=None source=None sources=[] type=draw>
    470     except Exception:
    471         _handle_exception(self.ignore_callback_errors,
    472                           self.print_callback_errors,
    473                           self, cb_event=(cb, event))

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\scene\canvas.py:219, in SceneCanvas.on_draw(self=<VispyCanvas (PyQt5)>, event=<DrawEvent blocked=False handled=False native=None region=None source=None sources=[] type=draw>)
    216 # Now that a draw event is going to be handled, open up the
    217 # scheduling of further updates
    218 self._update_pending = False
--> 219 self._draw_scene()
        self = <VispyCanvas (PyQt5) at 0x1d5346468f0>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\scene\canvas.py:278, in SceneCanvas._draw_scene(self=<VispyCanvas (PyQt5)>, bgcolor=<class 'numpy.ndarray'> (4,) float32)
    276     bgcolor = self._bgcolor
    277 self.context.clear(color=bgcolor, depth=True)
--> 278 self.draw_visual(self.scene)
        self = <VispyCanvas (PyQt5) at 0x1d5346468f0>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\scene\canvas.py:316, in SceneCanvas.draw_visual(self=<VispyCanvas (PyQt5)>, visual=<SubScene>, event=None)
    314         else:
    315             if hasattr(node, 'draw'):
--> 316                 node.draw()
        node = <Image at 0x1d542a9dde0>
    317                 prof.mark(str(node))
    318 else:

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\scene\visuals.py:106, in VisualNode.draw(self=<Image>)
    104 if self.picking and not self.interactive:
    105     return
--> 106 self._visual_superclass.draw(self)
        self = <Image at 0x1d542a9dde0>
        self._visual_superclass = <class 'vispy.visuals.image.ImageVisual'>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\visuals\visual.py:514, in Visual.draw(self=<Image>)
    512 self._configure_gl_state()
    513 try:
--> 514     self._program.draw(self._vshare.draw_mode,
        self._vshare.draw_mode = 'triangles'
        self = <Image at 0x1d542a9dde0>
        self._vshare = <vispy.visuals.visual.VisualShare object at 0x000001D542AF79D0>
        self._program = <vispy.visuals.shaders.program.ModularProgram object at 0x000001D518321720>
        self._vshare.index_buffer = None
    515                        self._vshare.index_buffer)
    516 except Exception:
    517     logger.warning("Error drawing visual %r" % self)

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\visuals\shaders\program.py:102, in ModularProgram.draw(self=<vispy.visuals.shaders.program.ModularProgram object>, *args=('triangles', None), **kwargs={})
    100 self.build_if_needed()
    101 self.update_variables()
--> 102 Program.draw(self, *args, **kwargs)
        self = <vispy.visuals.shaders.program.ModularProgram object at 0x000001D518321720>
        args = ('triangles', None)
        kwargs = {}

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\program.py:543, in Program.draw(self=<vispy.visuals.shaders.program.ModularProgram object>, mode='triangles', indices=None, check_error=True)
    539     raise TypeError("Invalid index: %r (must be IndexBuffer)" %
    540                     indices)
    542 # Process GLIR commands
--> 543 canvas.context.flush_commands()
        canvas = <VispyCanvas (PyQt5) at 0x1d5346468f0>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\context.py:172, in GLContext.flush_commands(self=<GLContext>, event=None)
    170         fbo = 0
    171     self.shared.parser.parse([('CURRENT', 0, fbo)])
--> 172 self.glir.flush(self.shared.parser)
        self = <GLContext at 0x1d53464d4e0>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\glir.py:584, in GlirQueue.flush(self=<vispy.gloo.glir.GlirQueue object>, parser=<vispy.gloo.glir.GlirParser object>)
    582 def flush(self, parser):
    583     """Flush all current commands to the GLIR interpreter."""
--> 584     self._shared.flush(parser)
        parser = <vispy.gloo.glir.GlirParser object at 0x000001D53464D840>
        self._shared = <vispy.gloo.glir._GlirQueueShare object at 0x000001D53464D900>
        self = <vispy.gloo.glir.GlirQueue object at 0x000001D53464D8D0>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\glir.py:506, in _GlirQueueShare.flush(self=<vispy.gloo.glir._GlirQueueShare object>, parser=<vispy.gloo.glir.GlirParser object>)
    504     show = self._verbose if isinstance(self._verbose, str) else None
    505     self.show(show)
--> 506 parser.parse(self._filter(self.clear(), parser))
        self = <vispy.gloo.glir._GlirQueueShare object at 0x000001D53464D900>
        parser = <vispy.gloo.glir.GlirParser object at 0x000001D53464D840>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\glir.py:824, in GlirParser.parse(self=<vispy.gloo.glir.GlirParser object>, commands=[('FUNC', 'glClearColor', 0.0, 0.0, 0.0, 1.0), ('FUNC', 'glClear', 17664), ('FUNC', 'glDisable', 'cull_face'), ('FUNC', 'glDisable', 'depth_test'), ('FUNC', 'glEnable', 'blend'), ('FUNC', 'glBlendFuncSeparate', 'src_alpha', 'zero', 'one', 'one'), ('FUNC', 'glBlendEquationSeparate', 'func_add', 'func_add'), ('DRAW', 3487, 'triangles', (0, 6), 1)])
    821     self._objects.pop(id_)
    823 for command in commands:
--> 824     self._parse(command)
        command = ('DRAW', 3487, 'triangles', (0, 6), 1)
        self = <vispy.gloo.glir.GlirParser object at 0x000001D53464D840>

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\glir.py:786, in GlirParser._parse(self=<vispy.gloo.glir.GlirParser object>, command=('DRAW', 3487, 'triangles', (0, 6), 1))
    783 # Triage over command. Order of commands is set so most
    784 # common ones occur first.
    785 if cmd == 'DRAW':  # Program
--> 786     ob.draw(*args)
        args = ('triangles', (0, 6), 1)
        ob = <GlirProgram 3487 at 0x1d512cef100>
    787 elif cmd == 'TEXTURE':  # Program
    788     ob.set_texture(*args)

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\glir.py:1360, in GlirProgram.draw(self=<GlirProgram 3487>, mode=GL_TRIANGLES, selection=(0, 6), instances=1)
   1358             gl.glDrawArraysInstanced(mode, first, count, instances)
   1359         else:
-> 1360             gl.glDrawArrays(mode, first, count)
        mode = GL_TRIANGLES
        count = 6
        gl = <module 'vispy.gloo.gl' from 'C:\\Users\\coscia-lab\\AppData\\Local\\miniforge3\\envs\\napari-env\\lib\\site-packages\\vispy\\gloo\\gl\\__init__.py'>
        first = 0
   1361 # Wrap up
   1362 gl.check_error('Check after draw')

File ~\AppData\Local\miniforge3\envs\napari-env\lib\site-packages\vispy\gloo\gl\_gl2.py:414, in glDrawArrays(mode=GL_TRIANGLES, first=0, count=6)
    412 except AttributeError:
    413     nativefunc = glDrawArrays._native = _get_gl_func("glDrawArrays", None, (ctypes.c_uint, ctypes.c_int, ctypes.c_int,))
--> 414 nativefunc(mode, first, count)
        nativefunc = <_FuncPtr object at 0x000001D54A73E400>
        mode = GL_TRIANGLES
        first = 0
        count = 6

OSError: exception: access violation reading 0x000000000000001C
josenimo commented 3 months ago

obtained same error, I loaded files, I gated a couple of channels, saving the gates, when clicking plot points it fails

josenimo commented 3 months ago

reloading plugin after error does not help

josenimo commented 3 months ago

I load files, go to sample 10, gate ecad, plot points, save gate, go to IDO, gate, plot points, save gate. Go to panCK, gate, plot points -> FAILS here.

josenimo commented 3 months ago

@melonora I have seen this error pop up many times in Napari issues, so I will stop testing for now to hear your opinion. My guess is there is a memory handling issue.

sfritzs commented 3 months ago

Jose here testing a bit more. I do not think it is a memory issue. I just spent 10min or so (before error in 30 seconds or so) changing markers and samples. Visualizing. The error starts as soon as I plot points for a second sample/marker combination.

I could plot as many point as I wanted for one sample/marker combination. Both as soon as I switch and plot points for another sample/marker combination it fails. All of this without saving any gates, loading or saving the dataframe.

josenimo commented 3 months ago

Jose in macOS, I tested thoroughly and cant seem to run into error in MacOS... I will focus on Windows Workstation to understand what is failing

josenimo commented 3 months ago

update: Ran the plugin in a different windows machine and it works. with both cylinter demo dataset, and the large HN dataset. I think the problem is then with that specific machine.

josenimo commented 3 months ago

@melonora

It seems that the point already was being cleared everytime the marker and sample was being loaded. Any other ideas of what it could be?

def _load_images_and_scatter_plot(self):
        self._clear_layers(clear_all=True)
        self._read_data(self.model.active_sample)
        # active marker is a string
        # markers is dict with marker_name_string:index (based on dropdowns)
        self._load_layers(self.model.markers_image_indices[self.model.active_marker])
        logger.debug(f"loading index {self.model.markers_image_indices[self.model.active_marker]}")
        self.update_plot()
        self.update_slider()

def _clear_layers(self, clear_all: bool) -> None:
        """Remove all layers upon changing sample."""
        if clear_all is True:
            self.viewer.layers.select_all()
            self.viewer.layers.remove_selected()
        else:
            for layer in self.viewer.layers:
                if isinstance(layer, Image):
                    self.viewer.layers.remove(layer)
josenimo commented 1 month ago

close for now, but could come up again