changeset 0:dfe318d97378 draft

planemo upload commit 4bf97847c35c4dcf9638008b9b4b6c4e10015f19
author iuc
date Tue, 09 Jun 2015 12:22:03 -0400
parents
children 26703988cdb3
files imagej2_base_utils.py imagej2_create_image.py imagej2_create_image.xml imagej2_macros.xml jython_script.py test-data/create_image1.jpg tool_dependencies.xml
diffstat 7 files changed, 375 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagej2_base_utils.py	Tue Jun 09 12:22:03 2015 -0400
@@ -0,0 +1,156 @@
+import os
+import shutil
+import sys
+import tempfile
+
+FIJI_JAR_DIR = os.environ.get( 'FIJI_JAR_DIR', None )
+FIJI_OSX_JAVA3D_DIR = os.environ.get( 'FIJI_OSX_JAVA3D_DIR', None )
+FIJI_PLUGIN_DIR = os.environ.get( 'FIJI_PLUGIN_DIR', None )
+FIJI_ROOT_DIR = os.environ.get( 'FIJI_ROOT_DIR', None )
+
+BUFF_SIZE = 1048576
+
+def cleanup_before_exit( tmp_dir ):
+    """
+    Remove temporary files and directories prior to tool exit.
+    """
+    if tmp_dir and os.path.exists( tmp_dir ):
+        shutil.rmtree( tmp_dir )
+
+def get_base_cmd_bunwarpj( jvm_memory ):
+    if FIJI_JAR_DIR is not None and FIJI_PLUGIN_DIR is not None:
+        if jvm_memory in [ None, 'None' ]:
+            jvm_memory_str = ''
+        else:
+            jvm_memory_str = '-Xmx%s' % jvm_memory
+        bunwarpj_base_cmd = "java %s -cp %s/ij-1.49k.jar:%s/bUnwarpJ_-2.6.1.jar bunwarpj.bUnwarpJ_" % \
+            ( jvm_memory_str, FIJI_JAR_DIR, FIJI_PLUGIN_DIR )
+        return bunwarpj_base_cmd
+    return None
+
+def get_base_command_imagej2( memory_size=None, macro=None, jython_script=None ):
+    imagej2_executable = get_imagej2_executable()
+    if imagej2_executable:
+        cmd = '%s --headless -DXincgc' % imagej2_executable
+        if memory_size is not None:
+            memory_size_cmd = ' -DXms=%s -DXmx=%s' % ( memory_size, memory_size )
+            cmd += memory_size_cmd
+        if macro is not None:
+            cmd += ' --macro %s' % os.path.abspath( macro )
+        if jython_script is not None:
+            cmd += ' --jython -u %s' % os.path.abspath( jython_script )
+        return cmd
+    return None
+
+def get_file_extension( image_format ):
+    """
+    Return a valid bioformats file extension based on the received
+    value of image_format( e.g., "gif" is returned as ".gif".
+    """
+    return '.%s' % image_format
+
+def get_file_name_without_extension( file_path ):
+    """
+    Eliminate the .ext from the received file name, assuming that
+    the file name consists of only a single '.'.
+    """
+    if os.path.exists( file_path ):
+        path, name = os.path.split( file_path )
+        name_items = name.split( '.' )
+        return name_items[ 0 ]
+    return None
+
+def get_imagej2_executable():
+    """
+    Fiji names the ImageJ executable different names for different
+    architectures, so figure out which name we need.
+    """
+    platform_dict = get_platform_info_dict()
+    if platform_dict.get( 'architecture', None ) in [ 'x86_64' ]:
+        if platform_dict.get( 'os', None ) in [ 'darwin' ]:
+            return 'ImageJ-macosx'
+        if platform_dict.get( 'os', None ) in [ 'linux' ]:
+            return 'ImageJ-linux64'
+    return None
+    
+def get_input_image_path( tmp_dir, input_file, image_format ):
+    """
+    Bioformats uses file extensions (e.g., .job, .gif, etc)
+    when reading and writing image files, so the Galaxy dataset
+    naming convention of setting all file extensions as .dat
+    must be handled.
+    """
+    image_path = get_temporary_image_path( tmp_dir, image_format )
+    # Remove the file so we can create a symlink.
+    os.remove( image_path )
+    os.symlink( input_file, image_path )
+    return image_path
+
+def get_max_heap_size_value( max_heap_size_type, max_heap_size ):
+    """
+    Return a string that can be used by the javabridge to set the size
+    of the memory allocation pool used by the JVM.  The value must be
+    determined to be a multiple of 1024 or it will be ignored.
+    """
+    if max_heap_size_type == 'default':
+        return None
+    if max_heap_size_type == 'megabytes':
+        if max_heap_size % 1024 not in [ 0, 256, 512 ]:
+            return None
+        return '%sm' % str( max_heap_size )
+    if max_heap_size_type == 'gigabytes':
+        return '%sg' % str( max_heap_size )
+
+def get_platform_info_dict():
+    '''Return a dict with information about the current platform.'''
+    platform_dict = {}
+    sysname, nodename, release, version, machine = os.uname()
+    platform_dict[ 'os' ] = sysname.lower()
+    platform_dict[ 'architecture' ] = machine.lower()
+    return platform_dict
+
+def get_stderr_exception( tmp_err, tmp_stderr, tmp_stdout ):
+    tmp_stderr.close()
+    """
+    Return a stderr string of reasonable size.
+    """
+    # Get stderr, allowing for case where it's very large.
+    tmp_stderr = open( tmp_err, 'rb' )
+    stderr_str = ''
+    buffsize = BUFF_SIZE
+    try:
+        while True:
+            stderr_str += tmp_stderr.read( buffsize )
+            if not stderr_str or len( stderr_str ) % buffsize != 0:
+                break
+    except OverflowError:
+        pass
+    tmp_stderr.close()
+    tmp_stdout.close()
+    return str( stderr_str )
+
+def get_temp_dir( prefix='tmp-imagej-', dir=None ):
+    """
+    Return a temporary directory.
+    """
+    return tempfile.mkdtemp( prefix=prefix, dir=dir )
+
+def get_tempfilename( dir=None, suffix=None ):
+    """
+    Return a temporary file name.
+    """
+    fd, name = tempfile.mkstemp( suffix=suffix, dir=dir )
+    os.close( fd )
+    return name
+
+def get_temporary_image_path( tmp_dir, image_format ):
+    """
+    Return the path to a temporary file with a valid image format
+    file extension that can be used with bioformats.
+    """
+    file_extension = get_file_extension( image_format )
+    return get_tempfilename( tmp_dir, file_extension )
+
+def stop_err( msg ):
+    sys.stderr.write( msg )
+    sys.exit( 1 )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagej2_create_image.py	Tue Jun 09 12:22:03 2015 -0400
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# Galaxy wrapper for use with Imagej2 by Greg Von Kuster
+"""
+A wrapper script for running ImageJ2 Jython scripts.
+"""
+import argparse
+import shutil
+import subprocess
+import tempfile
+import imagej2_base_utils
+
+if __name__=="__main__":
+    # Parse Command Line.
+    parser = argparse.ArgumentParser()
+    parser.add_argument( '--width', dest='width', type=int, help='Image width in pixels' )
+    parser.add_argument( '--height', dest='height', type=int, help='Image height in pixels' )
+    parser.add_argument( '--depth', dest='depth', type=int, help='Image depth (specifies the number of stack slices)' )
+    parser.add_argument( '--image_type', dest='image_type', help='Image type' )
+    parser.add_argument( '--image_title', dest='image_title', default='', help='Image title' )
+    parser.add_argument( '--max_heap_size_type', dest='max_heap_size_type', help='Type (default or megabytes) of max_heap_size value' )
+    parser.add_argument( '--max_heap_size', dest='max_heap_size', help='Maximum size of the memory allocation pool used by the JVM.' )
+    parser.add_argument( '--output_datatype', dest='output_datatype', help='Output image format' )
+    parser.add_argument( '--jython_script', dest='jython_script', help='Path to the Jython script' )
+    parser.add_argument( '--out_fname', help='Path to the output file' )
+    args = parser.parse_args()
+
+    tmp_dir = imagej2_base_utils.get_temp_dir()
+    tmp_image_path = imagej2_base_utils.get_temporary_image_path( tmp_dir, args.output_datatype )
+    # Set the size of the memory allocation pool used by the JVM.
+    memory_size = imagej2_base_utils.get_max_heap_size_value( args.max_heap_size_type, args.max_heap_size )
+
+    # Define command response buffers.
+    tmp_out = tempfile.NamedTemporaryFile().name
+    tmp_stdout = open( tmp_out, 'wb' )
+    tmp_err = tempfile.NamedTemporaryFile().name
+    tmp_stderr = open( tmp_err, 'wb' )
+    # Build the command line.
+    cmd = imagej2_base_utils.get_base_command_imagej2( memory_size, jython_script=args.jython_script )
+    if cmd is None:
+        imagej2_base_utils.stop_err( "ImageJ not found!" )
+    cmd += ' %s %d %d %d %s %s' % ( args.image_title, args.width, args.height, args.depth, args.image_type, tmp_image_path )
+    proc = subprocess.Popen( args=cmd, stderr=tmp_stderr, stdout=tmp_stdout, shell=True )
+    rc = proc.wait()
+    if rc != 0:
+        error_message = imagej2_base_utils.get_stderr_exception( tmp_err, tmp_stderr, tmp_stdout )
+        imagej2_base_utils.stop_err( error_message )
+    shutil.move( tmp_image_path, args.out_fname )
+    imagej2_base_utils.cleanup_before_exit( tmp_dir )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagej2_create_image.xml	Tue Jun 09 12:22:03 2015 -0400
@@ -0,0 +1,70 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<tool id="imagej2_create_image" name="Create new image" version="1.0.0">
+    <description>with ImageJ2</description>
+    <macros>
+        <import>imagej2_macros.xml</import>
+    </macros>
+    <expand macro="fiji_headless_requirements" />
+    <command>
+<![CDATA[
+    python $__tool_directory__/imagej2_create_image.py
+    --width $width
+    --height $height
+    --depth $depth
+    --image_type $image_type
+    --image_title "$image_title"
+    --max_heap_size_type $set_max_heap_size.max_heap_size_type
+    --max_heap_size $set_max_heap_size.max_heap_size
+    --jython_script $__tool_directory__/jython_script.py
+    --output_datatype $output_datatype
+    --out_fname "$output"
+]]>
+    </command>
+    <inputs>
+        <expand macro="image_type" />
+        <param name="image_title" type="text" size="80" label="Image title" help="Leave blank for no title" />
+        <param name="width" type="integer" value="512" min="1" label="Image width in pixels" />
+        <param name="height" type="integer" value="512" min="1" label="Image height in pixels" />
+        <param name="depth" type="integer" value="1" min="1" label="Image depth" help="Specifies the number of stack slices" />
+        <param name="output_datatype" type="select" label="Save as format">
+            <expand macro="image_datatypes" />
+        </param>
+        <expand macro="max_heap_size_type_conditional" />
+    </inputs>
+    <outputs>
+        <data name="output" format="jpg">
+            <actions>
+                <action type="format">
+                    <option type="from_param" name="output_datatype" />
+                 </action>
+           </actions>
+       </data>
+    </outputs>
+    <tests>
+        <test>
+            <param name="image_type" value="8-bit_ramp" />
+            <param name="image_title" value="MyTitle" />
+            <param name="width" value="256" />
+            <param name="height" value="256" />
+            <param name="depth" value="1" />
+            <param name="output_datatype" value="jpg" />
+            <output name="output" file="create_image1.jpg" ftype="jpg" />
+        </test>
+    </tests>
+    <help>
+**What it does**
+
+<![CDATA[
+Creates a new image based on the following entries.
+
+- **Type** specifies the image type "8-bit", "16-bit", "32-bit" or "RGB" with options
+- **Title** is associated with the image, but not displayed in the image
+- **Width** specifies the width of the image in pixels
+- **Height** specifies the height of the image in pixels
+- **Depth** specifies the number of stack slices
+- **Format** specifies the image format "jpg", "png", etc
+]]>
+
+    </help>
+    <expand macro="fiji_headless_citations" />
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagej2_macros.xml	Tue Jun 09 12:22:03 2015 -0400
@@ -0,0 +1,81 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<macros>
+    <xml name="fiji_headless_requirements">
+        <requirements>
+            <requirement type="package" version="20141125">fiji</requirement>
+        </requirements>
+    </xml>
+    <xml name="python_bioformats_requirements">
+        <requirements>
+            <requirement type="package" version="20141125">fiji</requirement>
+            <requirement type="package" version="1.0.11">javabridge</requirement>
+            <requirement type="package" version="1.9">numpy</requirement>
+            <requirement type="package" version="1.0.4">python_bioformats</requirement>
+        </requirements>
+    </xml>
+    <xml name="stdio">
+        <stdio>
+            <exit_code range="1:"/>
+            <exit_code range=":-1"/>
+            <regex match="Error:"/>
+            <regex match="Exception:"/>
+        </stdio>
+    </xml>
+    <xml name="image_type">
+        <param name="image_type" type="select" label="Image type">
+            <option value="8-bit_white" selected="True">8-bit white</option>
+            <option value="8-bit_black">8-bit black</option>
+            <option value="8-bit_random">8-bit random</option>
+            <option value="8-bit_ramp">8-bit ramp</option>
+            <option value="16-bit_white">16-bit white</option>
+            <option value="16-bit_black">16-bit black</option>
+            <option value="16-bit_random">16-bit random</option>
+            <option value="16-bit_ramp">16-bit ramp</option>
+            <option value="32-bit_white">32-bit white</option>
+            <option value="32-bit_black">32-bit black</option>
+            <option value="32-bit_random">32-bit random</option>
+            <option value="32-bit_ramp">32-bit ramp</option>
+            <option value="RGB_white">RGB white</option>
+            <option value="RGB_black">RGB black</option>
+            <option value="RGB_random">RGB random</option>
+            <option value="RGB_ramp">RGB ramp</option>
+        </param>
+    </xml>
+    <xml name="max_heap_size_type_conditional">
+        <conditional name="set_max_heap_size">
+            <param name="max_heap_size_type" type="select" label="Maximum size of the memory allocation pool used by the JVM" help="This value must be a multiple of 1024 or it will be ignored and the system default will be used.">
+                <option value="default" selected="True">Do not set</option>
+                <option value="megabytes">Set in megabytes</option>
+                <option value="gigabytes">Set in gigabytes</option>
+            </param>
+            <when value="default">
+                <param name="max_heap_size" type="integer" value="0" label="Do not set" help="Use system default"/>
+            </when>
+            <when value="megabytes">
+                <param name="max_heap_size" type="integer" value="512" min="256" label="Maximum size, in megabytes, of the memory allocation pool" help="Examples: 256, 512, etc."/>
+            </when>
+            <when value="gigabytes">
+                <param name="max_heap_size" type="integer" value="1" min="1" label="Maximum size, in gigabytes, of the memory allocation pool" help="Examples: 1, 2, etc."/>
+            </when>
+        </conditional>
+    </xml>
+    <xml name="image_datatypes">
+        <option value="bmp">bmp</option>
+        <option value="gif">gif</option>
+        <option value="jpg">jpg</option>
+        <option value="png" selected="true">png</option>
+        <option value="tiff">tiff</option>
+    </xml>
+    <xml name="fiji_headless_citations">
+        <citations>
+            <citation type="doi">10.1038/nmeth.2102</citation>
+        </citations>
+    </xml>
+    <xml name="citations">
+        <citations>
+            <citation type="doi">10.1038/nmeth.2102</citation>
+            <citation type="doi">10.1038/nmeth.2019</citation>
+            <citation type="doi">10.1083/jcb.201004104</citation>
+        </citations>
+    </xml>
+</macros>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jython_script.py	Tue Jun 09 12:22:03 2015 -0400
@@ -0,0 +1,14 @@
+import sys
+from ij import IJ
+
+# Fiji Jython interpreter implements Python 2.5 which does not
+# provide support for argparse.
+title = sys.argv[ -6 ]
+width = int( sys.argv[ -5 ] )
+height = int( sys.argv[ -4 ] )
+depth = int( sys.argv[ -3 ] )
+type = sys.argv[ -2 ].replace( '_', ' ' )
+tmp_image_path = sys.argv[ -1 ]
+
+imp = IJ.newImage( title, type, width, height, depth )
+IJ.save( imp, "%s" % tmp_image_path )
Binary file test-data/create_image1.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_dependencies.xml	Tue Jun 09 12:22:03 2015 -0400
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<tool_dependency>
+    <package name="fiji" version="20141125">
+        <repository changeset_revision="2957c52b8fe0" name="package_fiji_20141125" owner="iuc" toolshed="https://testtoolshed.g2.bx.psu.edu" />
+    </package>
+</tool_dependency>