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@biotek973:~/Software/fiji-20140226$ md5sum fiji-linux64.tar.gz
36e4373297a5a8c0919a7be094b70a30  fiji-linux64.tar.gz
hajaalin@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@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.jaalin...@helsinki.fi <mailto:harri.jaalin...@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@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

_______________________________________________
ImageJ-devel mailing list
ImageJ-devel@imagej.net
http://imagej.net/mailman/listinfo/imagej-devel

Reply via email to