[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