[ImageJ-devel] [fiji-devel] Re: jython scripting, No compatible service: io.scif.SCIFIOService
Harri Jäälinoja
harri.jaalinoja at helsinki.fi
Thu Feb 27 04:50:14 CST 2014
On 26/02/14 17:53, Mark Hiner wrote:
>
> But if you don't want to use the config, like I said, it is not
> required unless you find the default behavior to be insufficient. Just
> wanted to share my discoveries :)
>
Hi Mark,
thanks, good to know, also the importing tricks.
> Now it sort of works, but I still don't see the image. I get an
> icon with the Java guy on the launcher bar, with the image name
> and "(V) (3.1%)". If I click that, all other windows disappear and
> there a small stick-like artefact on the top of the screen, but
> nothing more.
>
>
> A good litmus test here would be to open your Fiji installation that
> you're harvesting your dependencies from, run Help > Switch to Modern
> Mode, and try using File > Open on your dataset. That should go
> through the same/very similar SCIFIO API you're testing in your jython
> script.
I downloaded a fresh Fiji today. The image opens with File > Open, but
all channels and slices end up in one time-series. With the LOCI
Bio-Formats importer plugin the image opens correctly as a stack of four
colors.
Then I used the jars from the new Fiji and the script that works for you:
hajaalin at biotek973:~/Software/fiji-20140226$ md5sum fiji-linux64.tar.gz
36e4373297a5a8c0919a7be094b70a30 fiji-linux64.tar.gz
hajaalin at biotek973:~/Software/fiji-20140226$ export CLASSPATH=`find
/home/hajaalin/Software/fiji-20140226/Fiji.app/jars -name '*.jar' |sed
':a;N;$!ba;s/\n/:/g'`
With the stack the script crashes:
hajaalin at biotek973:~/Software/fiji-20140226$ jython
/home/hajaalin/Software/fiji-20140219/Fiji.app/macros/imglib1.py
/home/hajaalin/Data/Misha/composite1.ome.tif
First there is one error:
[ERROR] Cannot create plugin: class='io.scif.bf.BioFormatsFormat',
priority=10000.0, enabled=true, pluginType=Format
java.lang.IllegalAccessError: tried to access field
io.scif.AbstractFormat.suffixes from class io.scif.bf.BioFormatsFormat
at io.scif.bf.BioFormatsFormat.<init>(BioFormatsFormat.java:107)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at org.scijava.plugin.PluginInfo.createInstance(PluginInfo.java:308)
at
org.scijava.plugin.DefaultPluginService.createInstance(DefaultPluginService.java:236)
at
org.scijava.plugin.DefaultPluginService.createInstances(DefaultPluginService.java:225)
at
org.scijava.plugin.DefaultPluginService.createInstancesOfType(DefaultPluginService.java:216)
at
io.scif.services.DefaultFormatService.initializeSingletons(DefaultFormatService.java:369)
at
io.scif.services.DefaultFormatService.formats(DefaultFormatService.java:322)
at
io.scif.services.DefaultFormatService.getFormatList(DefaultFormatService.java:287)
at
io.scif.services.DefaultFormatService.getFormat(DefaultFormatService.java:270)
at
io.scif.services.DefaultInitializeService.initializeReader(DefaultInitializeService.java:91)
at io.scif.img.ImgOpener.createReader(ImgOpener.java:377)
at io.scif.img.ImgOpener.openImg(ImgOpener.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at
org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:175)
at org.python.core.PyObject.__call__(PyObject.java:355)
at org.python.core.PyMethod.__call__(PyMethod.java:215)
at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:221)
at org.python.core.PyMethod.__call__(PyMethod.java:206)
at org.python.core.PyObject.__call__(PyObject.java:414)
at org.python.core.PyObject.__call__(PyObject.java:418)
at
org.python.pycode._pyx0.f$0(/home/hajaalin/Software/fiji-20140219/Fiji.app/macros/imglib1.py:22)
at
org.python.pycode._pyx0.call_function(/home/hajaalin/Software/fiji-20140219/Fiji.app/macros/imglib1.py)
at org.python.core.PyTableCode.call(PyTableCode.java:165)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1204)
at
org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:200)
at org.python.util.jython.run(jython.java:246)
at org.python.util.jython.main(jython.java:129)
And the a problem in the script:
Traceback (most recent call last):
File
"/home/hajaalin/Software/fiji-20140219/Fiji.app/macros/imglib1.py", line
20, in <module>
img = opener.openImg( filename, config )
at
io.scif.ome.xml.meta.OMEXMLFormat$Checker.<init>(OMEXMLFormat.java:244)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at io.scif.AbstractFormat.createObject(AbstractFormat.java:209)
at
io.scif.AbstractFormat.createContextualObject(AbstractFormat.java:170)
at io.scif.AbstractFormat.createChecker(AbstractFormat.java:118)
at
io.scif.services.DefaultFormatService.getFormatList(DefaultFormatService.java:288)
at
io.scif.services.DefaultFormatService.getFormat(DefaultFormatService.java:270)
at
io.scif.services.DefaultInitializeService.initializeReader(DefaultInitializeService.java:91)
at io.scif.img.ImgOpener.createReader(ImgOpener.java:377)
at io.scif.img.ImgOpener.openImg(ImgOpener.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
java.lang.NoSuchFieldError: java.lang.NoSuchFieldError: suffixNecessary
With a simple test image I get again the first error, but the script
runs without problem.
jython /home/hajaalin/Software/fiji-20140219/Fiji.app/macros/imglib1.py
/home/hajaalin/Downloads/joo.jpg
At this point there is the Java elf on the toolbar, but no image.
>
> Also, feel free to upload your dataset
> <http://fiji.sc/Upload_Sample_Image>. I can then take a closer look at
> what's going on, and see if I can reproduce the display error you saw.
>
I will send the test images and the screenshot.
Harri
> - Mark
>
>
> On Wed, Feb 26, 2014 at 9:19 AM, Harri Jäälinoja
> <harri.jaalinoja at helsinki.fi <mailto:harri.jaalinoja at helsinki.fi>> wrote:
>
> Hi Mark,
>
> thanks a lot, setting CLASSPATH did the trick, after I removed the
> unnecessary lines. I didn't understand them anyway, I was just
> parroting http://fiji.sc/ImgLib2_Examples.
>
> Now it sort of works, but I still don't see the image. I get an
> icon with the Java guy on the launcher bar, with the image name
> and "(V) (3.1%)". If I click that, all other windows disappear and
> there a small stick-like artefact on the top of the screen, but
> nothing more.
>
> Good progress anyway, more tomorrow.
>
> Harri
>
>
> On 26/02/14 16:41, Mark Hiner wrote:
>> Hi Harri,
>>
>> java.lang.
>> IllegalArgumentException: java.lang.IllegalArgumentException:
>> No compatible service: io.scif.SCIFIOService
>> hajaalin at biotek973:~/Software/
>> mvn-IJ2$ jar tvf target/dependency/scifio-0.9.2.jar |grep
>> SCIFIOService
>> 150 Fri Feb 14 16:24:24 EET 2014 io/scif/SCIFIOService.class
>>
>>
>> So this exception may be slightly misleading. SCIFIOService is a
>> marker interface for all the services that are part of SCIFIO.
>> When an org.scijava.Context is initialized as it is here, it's
>> typically given a set of base service interfaces and then loads
>> all implementations of that service. So it seems like the Context
>> knows about the SCIFIOService interface, but didn't discover any
>> implementations (things like DefaultFormatService,
>> DefaultImgUtilityService).
>>
>> So this brings me to my next point: I think there is either a) a
>> bug in jython where annotations are not preserved or b) a bug
>> with the class loading logic used by Fiji/IJ2. I am leaning
>> towards a) right now.
>>
>> I am using an Ubuntu 12.04 64-bit VM. I installed Jython 2.5.3,
>> but I suspect you can get this working with 2.5.1.
>>
>> Anyway, I went back to OSX and tested jython with the
>> -Dpython.path option, and got the same missing service exception.
>> But! If I set $CLASSPATH (java automatically picks up the
>> $CLASSPATH environment variable) and run the equivalent of:
>>
>> jython macros/imglib0.py /home/hajaalin/Data/Misha/composite1.ome.tif
>>
>> it works! Thus I believe that python.path has a bug and although
>> jython supports discovery of classes on python.path, it does not
>> preserve their annotations (or some similar metadata is being lost).
>>
>> So instead of setting CP and passing it via -Dpython.path, just use:
>>
>> export CLASSPATH=`find
>> /home/hajaalin/Software/fiji-20140219/Fiji.app/jars -name '*.jar'
>> |sed ':a;N;$!ba;s/\n/:/g'`
>>
>> A simple rule of thumb is, try running a random SCIFIO class like
>> "java io.scif.SCIFIOService" from the command line. If you get a
>> NoClassDef error, your CLASSPATH is not configured correctly. If
>> you get a "NoSuchMethodError: main", your CLASSPATH is correct
>> and your jython will pick up all the desired classes.
>>
>> Moving on...
>>
>> jython macros/imglib0.py /home/hajaalin/Data/Misha/composite1.ome.tif
>>
>> ^ That then works a bit better with my CLASSPATH set, except I
>> get a different runtime error about how ImgMode.CELL can't be
>> coerced to ImgMode. (same error I get when running using Fiji).
>>
>> I notice that you aren't actually using the SCIFIOConfig you
>> construct, so if you delete those lines and I'm finally able to
>> open an image. The SCIFIOConfig isn't strictly necessary either -
>> SCIFIO will open it as a CellImg automatically if it needs to. I
>> will try to investigate further as to how to get the types
>> working for a nested enum in jython..
>>
>> You may see yet another error message about
>> io.scif.bf.BioFormatsFormat failing. This is because some jars in
>> Fiji are out of date, but that shouldn't cause catastrophic
>> failure (it just means that some proprietary formats won't be
>> supported right now). These jars should be updated this week.
>>
>> I hope this helps. Let me know if you can't get this working on
>> your end.
>>
>> - Mark
>
>
> --
> __________________________________________________
> Harri Jäälinoja
> Light Microscopy Unit
> Institute of Biotechnology, University of Helsinki
> http://www.biocenter.helsinki.fi/bi/lmu/
> +358 9 191 59370 <tel:%2B358%209%20191%2059370> fax+358 9 191 59366 <tel:%2B358%209%20191%2059366>
>
>
--
__________________________________________________
Harri Jäälinoja
Light Microscopy Unit
Institute of Biotechnology, University of Helsinki
http://www.biocenter.helsinki.fi/bi/lmu/
+358 9 191 59370 fax +358 9 191 59366
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://imagej.net/pipermail/imagej-devel/attachments/20140227/d12ef9fd/attachment-0001.html>
More information about the ImageJ-devel
mailing list