Mercurial > repos > imgteam > libcarna_render
diff render.xml @ 0:7d6be2b7e1e2 draft
planemo upload for repository https://github.com/BMCV/galaxy-image-analysis/tree/master/tools/libcarna/ commit 20db59ffe2a97f25d82ba02e451bf73f93ef84ee
| author | imgteam |
|---|---|
| date | Mon, 05 Jan 2026 20:10:28 +0000 |
| parents | |
| children | 22618ff03b3d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/render.xml Mon Jan 05 20:10:28 2026 +0000 @@ -0,0 +1,339 @@ +<tool id="libcarna_render" name="Render 3-D image data" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="20.05"> + <description>with LibCarna</description> + <macros> + <import>creators.xml</import> + <import>validators.xml</import> + <import>colormaps.xml</import> + <token name="@TOOL_VERSION@">0.2.0</token> + <token name="@VERSION_SUFFIX@">0</token> + <xml name="params/intensity" tokens="name,label"> + <section name="@NAME@" title="@LABEL@" expanded="true"> + <param name="type" type="select" label="@LABEL@" + help="For relative intensity values, 0 is the minimum intensity of the image, and 1 is the maximum intensity."> + <option value="absolute" selected="true">Absolute intensity value</option> + <option value="relative">Relative intensity value</option> + </param> + <param name="value" type="float" label="Intensity value"/> + </section> + </xml> + <xml name="params/builtin_cmap"> + <conditional name="ramp"> + <param name="enabled" type="select" label="Ramp function" + help="Use a piecewise linear ramp function for the alpha channel of the colormap."> + <option value="false" selected="true">Disabled</option> + <option value="true">Enabled</option> + </param> + <when value="true"> + <expand macro="params/intensity" name="start" label="Ramp start"/> + <expand macro="params/intensity" name="end" label="Ramp end"/> + </when> + <when value="false"/> + </conditional> + </xml> + <xml name="when/builtin_cmap" tokens="value"> + <when value="@VALUE@"> + <expand macro="params/builtin_cmap"/> + </when> + </xml> + <xml name="test/params"> + <!-- CI tests use software rendering which requires very low sample rates --> + <param name="sample_rate_override" value="5"/> + <param name="width" value="200"/> + <param name="height" value="110"/> + </xml> + <xml name="test/assert_stdout"> + <assert_stdout> + <has_line_matching expression="^EGL Vendor: .+"/> + <yield/> + </assert_stdout> + </xml> + </macros> + <creator> + <expand macro="creators/bmcv"/> + <expand macro="creators/kostrykin"/> + </creator> + <edam_operations> + <edam_operation>operation_3443</edam_operation> + </edam_operations> + <xrefs> + <xref type="bio.tools">galaxy_image_analysis</xref> + <xref type="bio.tools">giatools</xref> + </xrefs> + <requirements> + <!-- + We employ here a custom Docker image until https://github.com/bioconda/bioconda-containers/issues/87 gets a better solution. + + The Docker image is an extension of the BioContainer for the following packages: + + <requirement type="package" version="@TOOL_VERSION@">libcarna-python</requirement> + <requirement type="package" version="1.26.4">numpy</requirement> + <requirement type="package" version="4.3.2">ffmpeg</requirement> + <requirement type="package" version="0.7.3">giatools</requirement> + <requirement type="package" version="0.12.2">ome-zarr</requirement> + <requirement type="package" version="2.3.3">pandas</requirement> + + See https://github.com/kostrykin/LibCarna-Python-Docker for details of the image. + --> + <container type="docker">docker.io/kostrykin/libcarna-python:@TOOL_VERSION@-0</container> + </requirements> + <required_files> + <include type="literal" path="clip_image.py"/> + <exclude type="literal" path="README.md"/> + </required_files> + <command detect_errors="aggressive"><![CDATA[ + + python '$__tool_directory__/render.py' + + #if $intensities.extension == "zarr" + --intensities '$intensities.extra_files_path/$intensities.metadata.store_root' + #else + --intensities '$intensities' + #end if + + #if str($colormap.name) == "custom" + --colormap '$colormap.custom' + #end if + + #if str($mask.enabled) == "true": + #if $mask.image.extension == "zarr" + --mask '$mask.image.extra_files_path/$mask.image.metadata.store_root' + #else + --mask '$mask.image' + #end if + #end if + + --html '$html' + --params '$params' + --verbose + + ]]></command> + <configfiles> + <configfile name="params"><![CDATA[ + { + + #if str($sample_rate_override) != "" + #set $sample_rate = int($sample_rate_override) + #end if + + "sample_rate": $sample_rate, + "axes": "$axes", + "width": $width, + "height": $height, + "mode": "$mode.name", + + "mode_kwargs": { + #if str($mode.name) == "dvr" + "translucency": $mode.translucency, + "diffuse": $mode.diffuse + #end if + }, + + "colormap": "$colormap.name", + + #if str($colormap.name) != "custom" + "ramp": { + #if str($colormap.ramp.enabled) == "true" + "start_type": "$colormap.ramp.start.type", + "start_value": $colormap.ramp.start.value, + "end_type": "$colormap.ramp.end.type", + "end_value": $colormap.ramp.end.value + #end if + }, + #end if + + "camera": { + "distance": $camera.distance, + "kwargs": { + "fov": $camera.fov, + "z_near": $camera.z_near, + "z_far": $camera.z_far + } + }, + "video": { + "frames": $video.frames, + "fps": $video.fps + }, + + "mask": $mask.enabled, + "mask_renderer_kwargs": { + #if str($mask.enabled) == "true" + "color": "$mask.color" + #end if + } + + } + ]]></configfile> + </configfiles> + <inputs> + <param name="intensities" type="data" format="tiff,zarr" label="Input image (3-D)"> + <expand macro="validators/is_single_channel"/> + <expand macro="validators/is_single_frame"/> + <expand macro="validators/is_3d"/> + </param> + <param name="axes" type="select" label="Coordinate system"> + <option value="XZY" selected="true">Point Z to the top</option> + <option value="XYZ">Point Y to the top</option> + </param> + <param name="sample_rate" type="integer" min="100" value="800" label="Sample rate" + help="Samples per pixel for volume rendering (ray marching)."/> + <param name="sample_rate_override" type="hidden" value="0"/><!-- For testing purposes --> + <param name="width" type="integer" min="50" max="1024" value="800" label="Width of the video (in pixels)"/> + <param name="height" type="integer" min="50" max="1024" value="450" label="Height of the video (in pixels)"/> + <conditional name="mode"> + <param name="name" type="select" label="Rendering mode"> + <option value="mip" selected="true">Maximum Intensity Projection (MIP)</option> + <option value="dvr">Direct Volume Rendering (DVR)</option> + </param> + <when value="mip"/> + <when value="dvr"> + <param name="translucency" type="float" min="0" value="1" label="Translucency"/> + <param name="diffuse" type="float" min="0" max="1" value="0.8" label="Directional light" + help="Balances the amount of ambient vs directional light. The light is fully ambient for 0 and fully directional for 1."/> + </when> + </conditional> + <conditional name="colormap"> + <param name="name" type="select" label="Color map"> + <option value="custom">Custom</option> + <expand macro="option/builtin_cmap_list"/> + </param> + <when value="custom"> + <param name="custom" type="data" format="tabular" label="Custom colormap"> + <validator type="dataset_metadata_in_range" metadata_name="columns" min="3" message="Colormap needs to have at least 3 columns."/> + </param> + </when> + <expand macro="when/builtin_cmap_list"/> + </conditional> + <section name="camera" title="Camera parameters" expanded="true"> + <param name="fov" type="float" min="10" max="170" value="90" label="Field of view (in degrees)"/> + <param name="distance" type="float" min="1" value="200" label="Distance" + help="Distance between the camera and the center of the 3-D image."/> + <param name="z_near" type="float" min="0.01" value="10" label="Near clipping plane" + help="Position of the near clipping plane along the z-axis."/> + <param name="z_far" type="float" min="100" value="1000" label="Far clipping plane" + help="Position of the far clipping plane along the z-axis."/> + </section> + <conditional name="mask"> + <param name="enabled" type="select" label="Render mask overlay"> + <option value="false" selected="true">No overlay</option> + <option value="true">Render mask overlay</option> + </param> + <when value="false"/> + <when value="true"> + <param name="image" type="data" format="tiff,zarr" label="Mask overlay (3-D)"> + <expand macro="validators/is_single_channel"/> + <expand macro="validators/is_single_frame"/> + <expand macro="validators/is_3d"/> + </param> + <param name="color" type="color" value="#00ff00" label="Color of the overlay"/> + </when> + </conditional> + <section name="video" title="Video parameters" expanded="false"> + <param name="frames" type="integer" min="10" value="200" label="Frames"/> + <param name="fps" type="integer" min="1" max="60" value="25" label="Frames per second"/> + </section> + </inputs> + <outputs> + <data format="html" name="html"/> + </outputs> + <tests> + <!-- Test with MIP --> + <test> + <param name="intensities" value="input/float32_10z_32y_40x.tiff"/> + <section name="camera"> + <param name="distance" value="50"/> + </section> + <output name="html" ftype="html" value="output/float32_10z_32y_40x-mip.html" compare="sim_size" delta="1000"/> + <expand macro="test/params"/> + <expand macro="test/assert_stdout"/> + </test> + <!-- Test with DVR, ramp colormap, and mask --> + <test> + <param name="intensities" value="input/float32_10z_32y_40x.tiff"/> + <conditional name="mode"> + <param name="name" value="dvr"/> + <param name="translucency" value="0"/> + </conditional> + <conditional name="colormap"> + <param name="name" value="BrBG"/> + <conditional name="ramp"> + <param name="enabled" value="true"/> + <section name="start"> + <param name="type" value="relative"/> + <param name="value" value="0.33"/> + </section> + <section name="end"> + <param name="type" value="relative"/> + <param name="value" value="0.37"/> + </section> + </conditional> + </conditional> + <section name="camera"> + <param name="distance" value="50"/> + </section> + <conditional name="mask"> + <param name="enabled" value="true"/> + <param name="image" value="input/uint8_10z_32y_40x.tiff"/> + </conditional> + <output name="html" ftype="html" value="output/float32_10z_32y_40x-dvr-mask.html" compare="sim_size" delta="1000"/> + <expand macro="test/params"/> + <expand macro="test/assert_stdout"/> + </test> + <!-- Test with custom colormap --> + <test> + <param name="intensities" value="input/float32_10z_32y_40x.tiff"/> + <param name="axes" value="XYZ"/> + <conditional name="colormap"> + <param name="name" value="custom"/> + <param name="custom" value="input/colormap.tsv"/> + </conditional> + <section name="camera"> + <param name="distance" value="50"/> + </section> + <output name="html" ftype="html" value="output/float32_10z_32y_40x-colormap.html" compare="sim_size" delta="1000"/> + <expand macro="test/params"/> + <expand macro="test/assert_stdout"/> + </test> + <!-- Test with Zarr and missing `z_spacing` metadata --> + <test> + <param name="intensities" value="input/float32_5z_16y_20x-no_z_spacing.zarr"/> + <section name="camera"> + <param name="distance" value="50"/> + </section> + <output name="html" ftype="html" value="output/float32_5z_16y_20x.html" compare="sim_size" delta="1000"/> + <expand macro="test/params"/> + <expand macro="test/assert_stdout"/> + </test> + </tests> + <help> + +**Renders videos for visualization of 3-D image data.** + +The image data is rotated to facilitate grasping visual information from different angles. + +LibCarna employs a volume rendering technique called *ray marching* and permits different visualization modes, including *maximum intensity projections* (MIP) and *direct volume rendering* (DVR). In addition, the renderings can be augmented with binary or label masks (e.g., segmentation overlays). + +.. image:: dvr.gif + :width: 438px + :scale: 100% + +An overview of the available colormaps is available at `matplotlib.org`_. + +.. _matplotlib.org: https://matplotlib.org/stable/users/explain/colors/colormaps.html + +When using custom colormaps, a tabular file with at least 3 columns must be used (`intensity`, `type`, `color`). Each pair of consecutive rows defines a linear segment of the colormap. The `intensity` values can be given either as absolute intensity values, or as relative values where 0 and 1 correspond to the minimum and maximum intensities of the image data, respectively. The `type` column indicates whether the corresponding `intensity` value is `absolute` or `relative`. The `color` must be given in hexadecimal notation with a ``#`` prefix and must be either 6 or 8 digits long (6 for RGB and 8 for RGBA). An example is given below. + ++-----------+------------+----------+ +| color | intensity | type | ++-----------+------------+----------+ +| #ff00007f | 0 | absolute | ++-----------+------------+----------+ +| #ffff00ff | 0.5 | absolute | ++-----------+------------+----------+ +| #00ffffff | 1.0 | relative | ++-----------+------------+----------+ + + </help> + <citations> + <citation type="doi">10.1016/j.jbiotec.2017.07.019</citation> + </citations> +</tool>
