view macros.xml @ 8:4bb02acaaabc draft

"planemo upload for repository https://github.com/ximg-chess/galaxytools/tools/hexrd commit 15bca193042c05f262db5cb1efe70e2cbd567615-dirty"
author ximgchess
date Thu, 20 Jan 2022 17:56:47 +0000
parents baba452d0613
children e67ad9795525
line wrap: on
line source

<macros>
    <token name="@TOOL_VERSION@">0.8.17</token>
    <token name="@VERSION_SUFFIX@">0</token>
    <token name="@PROFILE@">21.09</token>
    <xml name="requirements">
        <requirements>
        <requirement type="package" version="@TOOL_VERSION@">hexrd</requirement>
            <yield/>
        </requirements>
    </xml>
    <xml name="citations">
        <citations>
            <citation type="doi">10.1016/j.matchar.2020.110366</citation>
            <yield />
        </citations>
    </xml>

    <token name="@CMD_IMPORTS@">
#import re
#import yaml

#set global $img_panel_dict = dict()
#if $detector.panel_assignment == 'panel_table'
#set $fh = open(str($detector.image_panel_table),'r')
#for $line in $fh:
    #set $fields = $line.strip().split('\t')
    #silent $img_panel_dict[$fields[0]] = $fields[1]
#end for
#end if
#set global $panels = $yaml.safe_load(open(str($instrument),'r'))['detectors'].keys()
#def identifier_or_name($input1)
    #if hasattr($input1, 'element_identifier')
        #return $input1.element_identifier
    #elif hasattr($input1, 'name')
        #return $input1.name
    #else
        #return str($input1)
    #end if
#end def
#def clean($name1)
    #set $name_clean = $re.sub('[^\w\-_]', '_', $re.sub('(?i)[.](npz|hexrd|yml|dat|out)$','', $name1.split()[-1]))
    #return $name_clean
#end def
#def ln_name($ds,$ext)
    #set $lname = "%s.%s" % ($clean($identifier_or_name($ds)),$ext)
    #return $lname
#end def
#def get_panel($img_input):
    #set $img_name = $identifier_or_name($img_input)
    #if $img_panel_dict and $img_name in $img_panel_dict:
        #return $img_panel_dict[$img_name]
    #end if
    #for $p in $panels:
        #if $p in $img_name:
            #return $p
        #end if
    #end for
    #return $img_name
#end def
    </token>

    <xml name="common_config" token_multiple_inputs="true" >
        <param name="inputs" type="data" format="hexrd.images.npz" multiple="true" label="Image series frame-cache"/>
        <conditional name="detector">
            <param name="panel_assignment" type="select" label="Assign detector panel to images">
                <option value="infer_from_name" selected="true">Infer the panel from the image name</option>
                <option value="panel_table">Input a table with image panels assignments</option>
            </param>
            <when value="infer_from_name"/>
            <when value="panel_table">
                <param name="image_panel_table" type="data" format="tabular" label="Image panel assignment table">
                    <help>A 2-column table:image dataset name   detector panel name</help>
                </param>
            </when>
        </conditional>
        <param name="instrument" type="data" format="yaml" label="instrument"/>
        <param name="material" type="data" format="hexrd.materials.h5" label="material"/>
        <param name="active_material" type="select" label="active material name">
            <options>
                <filter type="data_meta" ref="material" key="materials"/>
            </options>
        </param>
        <param name="dmin" type="float" value="1.0" min="0" max="10" optional="true" label="dmin angstroms" help="used to figure out the maximum sampling for g-vectors default 1.0"/>
        <param name="tth_width" type="float" value="0.25" min="0" max="10" optional="true" label="tth tolerance in degrees" help="tth_width default 0.25 "/>
        <param name="min_sfac_ratio" type="float" value="" min="0" max="1" optional="true" label="min percentage of max to exclude" help="min_sfac_ratio min percentage of max |F|^2 to exclude; default None"/>
        <!-- 
        <param name="active_material" type="text" value="" label="active material name">
            <validator type="empty_field" />
        </param>
        -->
    </xml>

    <token name="@CMD_LINKS@"><![CDATA[@CMD_IMPORTS@
mkdir -p imageseries &&
ln -s '$material' $ln_name($material,'h5') &&
ln -s '$instrument' $ln_name($instrument,'yml') &&
#for $input in $inputs
ln -s '$input' imageseries/$ln_name($input,'npz') &&
#end for
]]>
    </token>
    <token name="@FIT_GRAIN_LINKS@"><![CDATA[@CMD_LINKS@
ln -s '$ome_map' $ln_name($ome_map,'npz') &&
ln -s '$accepted_orientations' $ln_name($accepted_orientations,'dat') &&
##mkdir -p analysis &&
##cp '$grains_estimate' analysis/$ln_name($grains_estimate,'out') &&
]]>
    </token>

    <token name="@CONVERT2TAB@"><![CDATA[for i in `find analysis -name '[gs]*.out'`; do sed -i.bak "s/[ ][ ][ ]*/\$(printf '\t')/g" \${i}; done]]></token>

    <token name="@COMMON_YML@"><![CDATA[@CMD_IMPORTS@
#slurp
#set instrument_file = $ln_name($instrument,'yml')
analysis_name: analysis

multiprocessing: -1

material:
  definitions: $ln_name($material,'h5')
  active: $active_material
#if $dmin 
  dmin: $dmin  # defaults to 1.0 angstrom
#end if
#if $tth_width 
  tth_width: $tth_width  # defaults to 0.25 degrees
#end if
#if $min_sfac_ratio 
  min_sfac_ratio: $min_sfac_ratio  # min percentage of max |F|^2 to exclude; default None
#end if

image_series:
  format: frame-cache
  data:
#for $input in $inputs
    - file: imageseries/$ln_name($input,'npz')
      args: {}
      panel: $get_panel($input)  # must match detector key
#end for

instrument: $instrument_file

]]></token>

    <xml name="find_orientations_config">
        <expand macro="common_config" token_multiple_inputs="true" />
        <section name="orientation_maps" title="Orientation Maps" expanded="true">
            <param name="threshold" type="integer" value="25" min="1" label="threshold"/>
            <param name="bin_frames" type="integer" value="1" label="bin frames"/>
            <!-- active_hkls should be able to be optional="true" -->
            <param name="active_hkls" type="text" value="" label="active hkl planes"> 
                <help>commas separated list of planes, e.g.: 0,1,2,3,4,5</help>
                <validator type="regex" message="plane indices separated by commas">^\d(,\d)*$</validator>
	    </param> 
        </section>
        <param name="on_map_threshold" type="integer" value="1" min="1" label="on-map threshold used in the scoring"/>
        <section name="search_options" title="Search Options" expanded="true">
            <conditional name="search">
                <param name="search_type" type="select" label="Specify Search">
                    <option value="seed_search" selected="true">use seed search</option>
                    <option value="use_quaternion_grid">use quaternion grid</option>
                </param>
                <when value="seed_search">
                    <!-- hkl_seeds should be able to be optional="true" -->
                    <param name="hkl_seeds" type="text" value="" label="hkl seeds">
                        <help>commas separated list of planes, e.g.: 0,1,2 (subset of active hkl planes)</help>
                        <validator type="regex" message="">^\d(,\d)*$</validator>
    	        </param> 
                    <param name="fiber_step" type="float" value="0.5" min="0" max="10" label="fiber step"/>
                    <conditional name="params">
                        <param name="method" type="select" label="Method">
                            <option value="label" selected="true">label</option>
                            <option value="blob_dog">blob_dog</option>
                            <option value="blob_log">blob_log</option>
                        </param>
                        <when value="label">
                            <param name="filter_radius" type="integer" value="1" min="1" label="label filter radius"/>
                            <param name="threshold" type="integer" value="1" min="1" label="label threshold"/>
                        </when>
                        <when value="blob_dog">
                            <param name="min_sigma" type="float" value="0.5" min="0" max="10" label="blob_dog min_sigma"/>
                            <param name="max_sigma" type="float" value="5.0" min="0" max="10" label="blob_dog max_sigma"/>
                            <param name="sigma_ratio" type="float" value="1.6" min="0" max="10" label="blob_dog sigma_ratio"/>
                            <param name="threshold" type="float" value="0.01" min="0" max="1.0" label="blob_dog threshold"/>
                            <param name="overlap" type="float" value="0.1" min="0" max="1.0" label="blob_dog overlap"/>
                        </when>
                        <when value="blob_log">
                            <param name="min_sigma" type="float" value="0.5" min="0" max="10" label="blob_log min_sigma"/>
                            <param name="max_sigma" type="float" value="5.0" min="0" max="10" label="blob_log max_sigma"/>
                            <param name="num_sigma" type="integer" value="10" min="0" max="20" label="blob_log num_sigma"/>
                            <param name="threshold" type="float" value="0.01" min="0" max="1.0" label="blob_log threshold"/>
                            <param name="overlap" type="float" value="0.1" min="0" max="1.0" label="blob_log overlap"/>
                        </when>
                    </conditional>
                </when>
                <when value="use_quaternion_grid">
                    <param name="quaternion_grid" type="data" format="npz" label="quaterion grid file"/>
                </when>
            </conditional>
        </section>
        <section name="omega" title="Omega" expanded="true">
            <param name="omega_tolerance" type="float" value="1.0" min="0" max="10.0" label="omega tolerance"/>
        </section>
        <section name="eta" title="eta" expanded="true">
            <param name="eta_tolerance" type="float" value="1.0" min="0" max="10.0" label="eta tolerance"/>
            <param name="eta_mask" type="float" value="5.0" min="0" max="10.0" label="eta mask"/>
        </section>
        <section name="clustering" title="Clustering" expanded="true">
            <param name="clustering_algorithm" type="select" label="Clustering algorithm">
                <option value="dbscan" selected="true">dbscan</option>
                <option value="sph-dbscan">sph-dbscan</option>
                <option value="ort-dbscan">ort-dbscan</option>
                <option value="fclusterdata">fclusterdata (won't work for large problems)</option>
            </param>
            <param name="clustering_radius" type="float" value="1.0" min="0" max="10" label="clustering radius"/>
            <param name="clustering_completeness" type="float" value="0.85" min="0" max="1" label="clustering completeness threshold"/>
        </section>
        <!-- 
        -->
    </xml>

    <token name="@FIND_ORIENTATIONS_YML@"><![CDATA[@COMMON_YML@

#set active_hkls = 'all'
#if $orientation_maps.active_hkls:
#set active_hkls = '[' + str($orientation_maps.active_hkls) + ']'
#end if
find_orientations:
  orientation_maps:
    # A file name must be specified. If it doesn't exist, one will be created
    file: null

    threshold: $orientation_maps.threshold
    bin_frames: $orientation_maps.bin_frames # defaults to 1

    # "all", or a list of hkl orders used to find orientations
    # defaults to all orders listed in the material definition
    active_hkls: $active_hkls

  # either search full quaternion grid, or seed search based on sparse
  # orientation maps.  For input search space:
  #
  # use_quaternion_grid: some/file/name
  #
  # otherwise defaults to seeded search
#if $search_options.search.search_type == 'use_quaternion_grid'
  use_quaternion_grid: 
#elif $search_options.search.search_type == 'seed_search'
#set hkl_seeds = '[' + str($search_options.search.hkl_seeds) + ']'
  seed_search: # this section is ignored if use_quaternion_grid is defined
    hkl_seeds: $hkl_seeds # hkls ids to use, must be defined for seeded search
    fiber_step: $search_options.search.fiber_step # degrees, defaults to ome tolerance
    # Method selection:
    #   Now 3 choices: label (the original), 'blob_dog', and 'blob_log'
    #   Each has its own parameter names, examples below.
    #
    method:
    #if $search_options.search.params.method == 'label'
      label:
        filter_radius: $search_options.search.params.filter_radius
        threshold: $search_options.search.params.threshold
    #elif $search_options.search.params.method == 'blob_dog'
      blob_dog:
        min_sigma: $search_options.search.params.min_sigma
        max_sigma: $search_options.search.params.max_sigma
        sigma_ratio: $search_options.search.params.sigma_ratio
        threshold: $search_options.search.params.threshold
        overlap: $search_options.search.params.overlap
    #elif $search_options.search.params.method == 'blob_log'
      blob_log:
        min_sigma: $search_options.search.params.min_sigma
        max_sigma: $search_options.search.params.max_sigma
        num_sigma: $search_options.search.params.num_sigma
        threshold: $search_options.search.params.threshold
        overlap: $search_options.search.params.overlap
    #end if
  # this is the on-map threshold using in the scoring
  # defaults to 1
#end if
  threshold: $on_map_threshold

  omega:
    tolerance: $omega.omega_tolerance  # in degrees, defaults to 2x ome step

  eta:
    tolerance: $eta.eta_tolerance  # in degrees, defaults to 2x ome step
    mask: $eta.eta_mask  # degrees, mask angles close to ome rotation axis, defaults to 5

  clustering:
    # algorithm choices are
    #   sph-dbscan
    #   ort-dbscn
    #   dbscan <default>
    #   fclusterdata; this is a fallback and won't work for large problems
    algorithm: $clustering.clustering_algorithm
    radius: $clustering.clustering_radius
    completeness: $clustering.clustering_completeness

]]></token>

    <xml name="fit_grains_config">
        <expand macro="common_config" token_multiple_inputs="true"/>
        <param name="ome_map" type="data" format="hexrd.eta_ome.npz" label="analysis eta-ome_maps.npz from find_orientations"/>
        <param name="accepted_orientations" type="data" format="tabular" label="accepted_orientations from find_orientations"/>
        <param name="grains_estimate" type="data" format="tabular" label="grains.out from find_orientations"/>
        <param name="do_fit" type="boolean" truevalue="true" falsevalue="false" checked="true" label="fit grains" help="if false, extracts grains but doesn't fit"/>
        <param name="npdiv" type="integer" value="2" min="1" label="number of polar pixel grid subdivisions"/>
        <param name="threshold" type="integer" value="25" min="1" label="threshold"/>
        <section name="tolerance" title="Fit Grain Tolerance" expanded="true">
            <repeat name="tolerance_lists" title="Tolerance values" min="1">
                <param name="tth" type="float" value="" min="0" label="tth"/>
                <param name="eta" type="float" value="" min="0" label="eta"/>
                <param name="omega" type="float" value="" min="0" label="omega"/>
            </repeat>
            <param name="refit" type="text" value="1" label="refit" help="float values separated by commas">
                <validator type="regex" message="">^[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?(,[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?)*$</validator>
            </param>
            <conditional name="max_tth">
                <param name="tth_max_value" type="select" label="Set tth_max">
                    <option value="true" selected="true">true</option>
                    <option value="false">false</option>
                    <option value="entered">enter value</option>
		</param> 
                <when value="true"/>
                <when value="false"/>
                <when value="entered">
                    <param name="tth_max" type="float" value="14.25" label="tth_max"/>
	        </when>
	  </conditional>
        </section>
    </xml>

    <token name="@FIT_GRAINS_YML@"><![CDATA[@COMMON_YML@
find_orientations:
  orientation_maps:
    # A file name must be specified. If it doesn't exist, one will be created
    file: $ln_name($ome_map,'npz')

fit_grains:
  do_fit: $do_fit # if false, extracts grains but doesn't fit. defaults to true
  # estimate: null
  npdiv: $npdiv # number of polar pixel grid subdivisions, defaults to 2
  threshold: $threshold

#set $tth = []
#set $eta = []
#set $omega = []
#set $refit = '[' + str($tolerance.refit) + ']'
#for $tol in $tolerance.tolerance_lists
#silent $tth.append(float($tol.tth))
#silent $eta.append(float($tol.eta))
#silent $omega.append(float($tol.omega))
#end for
  tolerance:
    tth: $tth # tolerance lists must be identical length
    eta: $eta
    omega: $omega

  refit: $refit
  #if $tolerance.max_tth.tth_max_value == 'entered':
  tth_max: $tolerance.max_tth.tth_max # true, false, or a non-negative value, defaults to true
  #else
  tth_max: $tolerance.max_tth.tth_max_value # true, false, or a non-negative value, defaults to true
  #end if
]]></token>
    <token name="@HEXRD_HELP@"><![CDATA[
HEXRD_ provides analysis of x-ray diffraction data, especially high-energy x-ray diffraction. HEXRD is comprised of a library and API for writing scripts, a command line interface, and an interactive graphical user interface.

.. _HEXRD: https://github.com/HEXRD/hexrd
]]></token>

    <token name="@COMMON_INPUTS_HELP@"><![CDATA[

**INPUTS** 

  - imageseries - Detector image files converted to sparse matrix compressed numpy arrays.  
  - instrument - A yaml file that decribes the instrument 
  - materials.hexrd - A "pickled" hexrd Materials object that desscribes the sample material
]]></token>
    <token name="@FIT_GRAIN_INPUTS_HELP@"><![CDATA[@COMMON_INPUTS_HELP@
  - analysis eta-ome_maps.npz from find_orientations
  - accepted_orientations from find_orientations

]]></token>

    <token name="@COMMON_OUTPUTS_HELP@"><![CDATA[

**OUTPUTS**

  - config yaml - parameter for hexrd
  - log - the hexrd logging output
  - grains.out
]]></token>
    <token name="@FIND_ORIENTATIONS_OUTPUTS_HELP@"><![CDATA[@COMMON_OUTPUTS_HELP@
  - analysis eta-ome_maps.npz *(used as input for hexrd fit-grains)*
  - analysis accepted_orientations_analysis.dat *(used as input for hexrd fit-grains)*
  - analysis scored_orientations_analysis.npz
]]></token>
    <token name="@FIT_GRAINS_OUTPUTS_HELP@"><![CDATA[@COMMON_OUTPUTS_HELP@
  - Collection of spots.out
]]></token>


</macros>