Classifier failing when it contains a large number of objects

570 views
Skip to first unread message

Thomas Kilvær

unread,
Jan 12, 2018, 4:33:28 AM1/12/18
to QuPath users
Hi
I am not sure if this is a bug, expected behavior or user fault so I post it here for now and may move it to the git at a later point (if it is a bug).

When I make a random trees classifier that holds a large number of objects > 10 000 it randomly crashes and if you save it it will not load again. The other classifier classes behaves the same except for neural networks that causes a crash in qupath and closes down the program without leaving anything in the log. For a weka classifier this threshold is even lower. 

Is this expected behavior or some sort of  bug?

I guess I could try to train my classifiers more specifically with less objects and more to the point selection....

Thomas Kilvær

unread,
Jan 12, 2018, 7:19:21 AM1/12/18
to QuPath users
Here is the log
INFO: Training size: 248x3660
INFO: Responses size: 1x3660
INFO: RTrees classifier termination criteria: { type: 3, maxCount: 50, epsilon: 0.1}
INFO: Will attempt retraining classifier with one sample fewer...
INFO: RTrees classifier termination criteria: { type: 3, maxCount: 50, epsilon: 0.1}
ERROR: QuPath exception
    at org.opencv.ml.StatModel.train_0(Native Method)
    at org.opencv.ml.StatModel.train(StatModel.java:74)
    at qupath.opencv.classify.OpenCvClassifier.createAndTrainClassifier(OpenCvClassifier.java:260)
    at qupath.opencv.classify.ParameterizableOpenCvClassifier.createAndTrainClassifier(ParameterizableOpenCvClassifier.java:84)
    at qupath.opencv.classify.OpenCvClassifier.readExternal(OpenCvClassifier.java:506)
    at qupath.opencv.classify.ParameterizableOpenCvClassifier.readExternal(ParameterizableOpenCvClassifier.java:102)
    at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1806)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
    at qupath.lib.classifiers.PathClassifierTools.loadClassifier(PathClassifierTools.java:86)
    at qupath.lib.gui.panels.classify.PathClassifierPanel.lambda$new$0(PathClassifierPanel.java:80)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8411)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$300(GlassViewEventHandler.java:388)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$450(GtkApplication.java:139)
    at java.lang.Thread.run(Thread.java:745)



Pete

unread,
Jan 12, 2018, 4:01:27 PM1/12/18
to QuPath users
I don't think I've seen exactly this problem before.  From the log, it looks like the classifier has 248 features per object, and 3660 training objects.  Does that sound correct?

Because that would be a lot of features to use, I wonder if there could be an out-of-memory error somewhere.  Is that possible?
The info at https://github.com/qupath/qupath/issues/130#issuecomment-355845333 might help see if you're anywhere close to the memory limits.

micros...@gmail.com

unread,
Jan 12, 2018, 9:16:05 PM1/12/18
to QuPath users
I was just able to run a classifier with only 6 measurements, but with 282558 cells as inputs.  I don't think there is that low of a hard limit to objects at least (9GB memory cap, only hit about 5GB).  And just ran it again with 39 features.  Maybe it is the number of features causing problems?

INFO: Stroma: 2477
INFO: Tumor: 280081
INFO: 282558 objects available for classifier training from 1 images
INFO: Training size: 39x282558
INFO: Responses size: 1x282558
INFO: RTrees classifier termination criteria: { type: 1, maxCount: 50, epsilon: 0.0}
INFO: Classifier trained with 282558 samples
INFO: Classifier training time: 113.74 seconds
INFO: Classification time: 8.71 seconds
INFO: Percentage of correctly classified objects in TRAINING set: 99.22% (n=282558)
WARN: It is *strongly* advised not to report accuracies based on testing using the training set!
INFO: Confusion matrix
          Stroma     Tumor
Stroma       272      2205
 Tumor         0    280081

INFO: Number of reclassified objects: 787 of 833150

Pete

unread,
Jan 13, 2018, 2:24:09 AM1/13/18
to QuPath users
I also ran it with about 300 features and it worked... but then I didn't have very many cells across the image.

One extra thing: if any of the features were calculated outside of normal QuPath commands, i.e. in a custom script, then it's essential to close the measurement list.  Something like the following:

detection.getMeasurementList().putMeasurement('A name', 1)
detection
.getMeasurementList().closeList()

This allows QuPath to look for objects with the same names of measurements in the same order, and just store one list of names instead of one for each object.  This can help with performance and memory requirements.  Not sure if it's relevant here though.


micros...@gmail.com

unread,
Jan 13, 2018, 8:58:18 PM1/13/18
to QuPath users
Come to think of it, I have seen the "INFO: Will attempt retraining classifier with one sample fewer..." before, but I forget when and why.  It did not end up preventing me from using the classifier, that I recall, but I wondered about it.  Do you know offhand what triggers this message? 
Message has been deleted

Thomas Kilvær

unread,
Jan 15, 2018, 5:49:33 AM1/15/18
to QuPath users
Thanks for the suggestions and sorry that I did not have time to work on this before now. I now see that this message is flashed briefly on the screen
cv::Exception: /home/pete/Downloads/opencv-3.1.0/modules/ml/src/tree.cpp:1190: error: (-215) (int)_sleft.size() < n && (int)_sright.size() < n in function calcDir
This seems to be an issue with openCV and not QuPath
Apparently this issue was fixed some time in 2016. If I am not mistaken QuPath uses OpenCV 3.1 (~2015) while the current version is 3.4 (late 2017). I find that the chance of this error decreases if the number of similar features kept low (eg. OD mean, smoothened OD mean... etc).

However, I am also experiencing some other issues.

The classifier I try to make is for DoG superpixels created by the following script automation
setImageType('BRIGHTFIELD_H_DAB');
setColorDeconvolutionStains
('{"Name" : "H-DAB-CD3", "Stain 1" : "Hematoxylin", "Values 1" : "0.88752 0.4188 0.19214 ", "Stain 2" : "DAB", "Values 2" : "0.11833 0.33642 0.93425 ", "Background" : " 255 255 255 "}');
selectTMACores
();
runPlugin
('qupath.imagej.detect.tissue.SimpleTissueDetection2', '{"threshold": 254,  "requestedPixelSizeMicrons": 1.0,  "minAreaMicrons": 1000.0,  "maxHoleAreaMicrons": 1000000.0,  "darkBackground": false,  "smoothImage": true,  "medianCleanup": true,  "dilateBoundaries": false,  "smoothCoordinates": true,  "excludeOnBoundary": false,  "singleAnnotation": true}');


selectAnnotations
();
runPlugin
('qupath.imagej.superpixels.DoGSuperpixelsPlugin', '{"downsampleFactor": 3.0,  "sigmaMicrons": 5.0,  "minThreshold": 10.0,  "maxThreshold": 253.0,  "noiseThreshold": 1.0}');
selectDetections
();
runPlugin
('qupath.lib.algorithms.IntensityFeaturesPlugin', '{"pixelSizeMicrons": 0.25,  "region": "ROI",  "tileSizeMicrons": 25.0,  "colorOD": true,  "colorStain1": true,  "colorStain2": false,  "colorStain3": false,  "colorRed": false,  "colorGreen": false,  "colorBlue": false,  "colorHue": false,  "colorSaturation": false,  "colorBrightness": false,  "doMean": false,  "doStdDev": true,  "doMinMax": true,  "doMedian": true,  "doHaralick": true,  "haralickDistance": 1,  "haralickBins": 32}');
selectDetections
();
runPlugin
('qupath.lib.algorithms.CoherenceFeaturePlugin', '{"magnification": 1.0,  "stainChoice": "H-DAB (8-bit)",  "tileSizeMicrons": 25.0,  "includeStats": true,  "doCircular": false}');
selectDetections
();
runPlugin
('qupath.lib.algorithms.LocalBinaryPatternsPlugin', '{"magnification": 1.0,  "stainChoice": "H-DAB (8-bit)",  "tileSizeMicrons": 25.0,  "includeStats": true,  "doCircular": false}');
selectDetections
();
runPlugin
('qupath.lib.plugins.objects.SmoothFeaturesPlugin', '{"fwhmMicrons": 25.0,  "smoothWithinClasses": false,  "useLegacyNames": false}');
selectDetections
();
runPlugin
('qupath.lib.plugins.objects.SmoothFeaturesPlugin', '{"fwhmMicrons": 50.0,  "smoothWithinClasses": false,  "useLegacyNames": false}');

At this point I delete the simple tissue detection annotations and start training the classifier. Aside from the issue with RTrees in OpenCV the following problems occur
  • Training a classifier using weka works and it will classify the superpixels on a open image, but I am not able to load the classification back into QuPath for subsequent use.
  • Training a classifier using OpenCV Neural Networks will result in QuPath instantly shutting down without throwing any error messages.

It does not seem to be a memory issue. I have ~22gb available for QuPath and the program has never tried to use more  than 14

Pete

unread,
Jan 16, 2018, 3:44:24 PM1/16/18
to QuPath users
Thanks for clarifying - the original error does look familiar, and good to rule out memory issues.  Also good that there should be a fix in OpenCV.

I will look into updating the version of OpenCV in the next few days.  My preferred way to do that would be to switch to using the JavaCPP presets for OpenCV.  This would be a fairly substantial change, requiring all the QuPath code that uses OpenCV to be updated.  However my impression is that it would really be worth it and make future updates a lot easier and faster to manage.  It should also help resolve a few other difficulties that I had with using the 'original' Java bindings.

I'll report back here once I've investigated some more...

Pete

unread,
May 12, 2018, 4:55:19 AM5/12/18
to QuPath users
Looking through my old emails, I saw I claimed I'd report back and then never did - sorry...

So I made the switch in QuPath to use OpenCV via JavaCPP and all seems well - that makes updating the OpenCV version much easier.  It's currently on a development branch of my own fork, so... rather far away.  It should make it into a future release, but realistically that is still some months away.  It should include a whole lot of other changes and improvements too (e.g. moving to Java 10... or possible Java 11 if it comes out first).

I create a blog to have a mechanism to describe a bit more what is going on: https://petebankhead.github.io

Thomas Kilvær

unread,
Aug 24, 2018, 6:07:38 AM8/24/18
to QuPath users
Sorry for opening this again, but I noticed something new.

1: In a fresh QuPath OpenCV neural networks will work for the normal watershed detection + features + smoothened features
2: When adding intensity features + smoothing features neural network will break
3: After neural networks has broken it will no longer work as in 1.

Pete

unread,
Aug 24, 2018, 6:40:45 AM8/24/18
to QuPath users
Thanks, I'll look out for this behavior.

Do you think including direct access to the neural network for the object classifier is very beneficial?  I always tend to revert back to RTrees myself.  It is tempting to expose fewer possible classifiers if they are not actually very useful, and have the potential to cause confusion or need extra support... on the other hand, I don't want to remove something too hastily just because I haven't recognised its usefulness.

As I recall, QuPath doesn't handle the possible parameters supported by the OpenCV ANN classifier very well and this needs to be fixed.  Additionally, with the move to JavaCPP it should be possible to seralize/deserialize the classifiers using the proper method in OpenCV (yaml or xml).  This is much nicer than the current awkward workaround, which is to serialize the features and parameters and then rebuild the classifier when it's needed... mostly because the OpenCV Java bindings at the time would throw an exception when trying to serialize the classifier normally.

I'm thinking of making this change, although it will be a little bit fiddly and time consuming.  However, it has the advantage of meaning that potentially the same classifier could be accessed and/or created elsewhere where OpenCV is used.  This opens the possibility of exporting features from QuPath, exploring them in Python and saving a classifier using OpenCV's Python bindings, then bringing this back into QuPath.  It won't support other Python-based classifiers (e.g. from sklearn), but it might help if you want to dive more into the classification e.g. to look at performance and feature selection.

Implementing it will take a bit more effort, because QuPath needs extra information that isn't included in the OpenCV yaml/xml (e.g. the names of the features, and any normalization methods).  So the actual format would need to package this up as well.

Anyway, I wanted to ask: do you think this would be worthwhile?  Would you want the ability to create QuPath classifiers outside QuPath itself (even if this is limited to OpenCV classifiers)?

Thomas Kilvær

unread,
Aug 24, 2018, 8:39:05 AM8/24/18
to QuPath users
Fast reply (as always)

1: Why QuPath break down on NN
Why QuPath breaks down when attempting 1 after breaking down on 2 is a mystery for me. It happens even after recompiling and changing the datafiles in the project with those from my base project (should only be TMA dearrayed...). Some setting seems to be retained.

2: Move to OpenCV 3.4 or 4... /exposing different classfiers
Seems worthwhile as it will close some other bugs using classifiers with large amounts of  parameters. For me NN seems to give more accurate results. It may be that my way of annotating cells is more tuned towards this algorithm. I do get great results with RTs too. Nevertheless, hiding the access to NN (and other less used classifiers) may be the right choice. Especially if the implementation is quirky.

Model exploration, feature extraction and classifier optimalization can already be done by in the weka extension. Although I guess this is indirectly (at least for NN) as you cannot access the exact same NN model from within QuPath?


Pete

unread,
Aug 24, 2018, 8:48:06 AM8/24/18
to QuPath users
Yes, you're right about the exploration being possible from Weka.  I don't think the Weka extension is used much though... but maybe it should be?  It's always interesting for me what people are actually using / find useful.

I like the tools of Weka, but I remember it was quite hard to get QuPath and Weka to play together nicely, not least because they use quite different GUI libraries.

Thomas Kilvær

unread,
Sep 12, 2018, 4:16:56 PM9/12/18
to QuPath users
Hi
Since I am of the impression that I get more robust performance from NN I made a small alteration to so that the weka extension now exposes multilayer perceptron I get really good performance. I think it might be possible to expose DL4J too and then also get it to run on GPU. However. I am stil not, and have never been (even with the unmodified plugin) able to load weka classfiers back into qupath. This behavior is a bit tiresome when I try to run sequential classfiers.

Have you ever been able to load weka classifiers back into qupath (eg. am I missing something) or is the save classifier feature just inherited from the classfier panel constructor and have no real value for weka classifiers (as of yet)? 


Pete

unread,
Sep 20, 2018, 12:50:02 PM9/20/18
to QuPath users
Saving/reloading should work... but I have kind of ignored the Weka extension for a rather long time.  It was once the default classifier, but then I wanted to keep down dependencies (and support requirements) and switched to make OpenCV the main one.  I believe it did work at some point in the past, but then it appears that some breaking changes got introduced and never recognised...

I've had a quick look, and suspect two issues are responsible:
  • the Weka extension isn't on the main classpath (but rather only the extensions classpath), and so deserialization fails
  • the deserialization fails because of an erroneous cast to the wrong kind of map
A hack to get around the first of these: somewhere within your QuPath installation you should find a file called 'QuPath.cfg'.  Inside this, you should see 

app.classpath=qupath/qupath-core-0.1.2.jar
... and so on.  At the end of this list, add the paths to the Weka-related .jar files, e.g. on a Mac I might append /Users/myname/QuPath/extensions/qupath-weka-extension.jar:/Users/myname/QuPath/extensions/weka.jar

I've made that change, and it results in a 'better' error appearing when I try to load a classifier.

For this error, the problematic line appears to be this:

You can switch 
pathClassMap = (HashMap<String, PathClass>)in.readObject();
to become
pathClassMap = (Map<String, PathClass>)in.readObject();

I haven't tested this, because I don't currently have the extension set up for development on my computer and so I don't know how far that will go towards fixing the problem - but if you want to try it out, please let me know what happens.

At some point, I want to find the time to revisit and update the OpenCV classifiers.  When I do that, I'll start exploring Weka again and see if I can fix the issues and update them both together.

Thomas Kilvær

unread,
Sep 27, 2018, 8:07:47 AM9/27/18
to QuPath users
Hi thanks for the pointers. When I do step 1 and 2 in Qupath Outside Eclipse it fails to load the classifier and gives no log. In eclipse I am afraid, that being a newbie, I have not found a way to add weka to main classpath, but I am able to do step 2. The result is this error (probably the same you got?) saying that wekaclassifier cannot be found and then a bunch of other errors

java.lang.ClassNotFoundException: qupath.extensions.weka.classifiers.WekaClassifierRandomForests
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at java.base/java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:685)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1877)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1763)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2051)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1585)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at qupath.lib.classifiers.PathClassifierTools.loadClassifier(PathClassifierTools.java:86)
at qupath.lib.gui.panels.classify.PathClassifierPanel.lambda$0(PathClassifierPanel.java:80)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8863)
at javafx.controls/javafx.scene.control.Button.fire(Button.java:200)
at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206)
at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3876)
at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Scene.java:3604)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1874)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2613)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
at java.base/java.lang.Thread.run(Thread.java:844)


Pete

unread,
Sep 27, 2018, 3:14:25 PM9/27/18
to QuPath users
That does look familiar.  You should be able to add external jars to the classpath through 'Run configurations'... although I wouldn't trust me too much on this, since I haven't managed to solve my own eclipse problems since switching to Java 11 this week.  This is my main task currently, before then trying to update everything else so that it works again (or, if it didn't work before, just 'works').
Reply all
Reply to author
Forward
0 new messages