changeset 0:3316ac4fd07b draft default tip

"planemo upload for repository https://github.com/ximg-chess/galaxytools/tools/hexrd commit 944c00504583f201b006fb01f7e19fd98fca4a29"
author ximgchess
date Wed, 05 Jan 2022 14:14:56 +0000
parents
children
files hexrd_find_orientations.xml hexrd_fit_grains.xml macros.xml
diffstat 3 files changed, 567 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hexrd_find_orientations.xml	Wed Jan 05 14:14:56 2022 +0000
@@ -0,0 +1,87 @@
+<tool id="hexrd_find_orientations" name="HEXRD find-orientations" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" python_template_version="3.5">
+    <description>Process rotation image series to find grain orientations</description>
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <expand macro="requirements" />
+    <command detect_errors="exit_code"><![CDATA[
+        cp '$config_yml' $config &&
+        cp '$config_yml' config.yml &&
+        ## symlink input files
+        @CMD_LINKS@
+        hexrd find-orientations config.yml &&
+        @CONVERT2TAB@ &&
+        cp find-orientations_analysis_*.log '$log' &&
+        cp  accepted_orientations_analysis_*.dat '$accepted_orientations' &&
+        cp  scored_orientations_analysis_*.npz '$score_orientations' &&
+        cp analysis_*_eta-ome_maps.npz '$ome_maps' 
+    ]]></command>
+    <configfiles>
+        <configfile name="config_yml"><![CDATA[@FIND_ORIENTATIONS_YML@
+]]></configfile>
+    </configfiles>
+
+    <inputs>
+        <expand macro="find_orientations_config"/> 
+    </inputs>
+    <outputs>
+        <data name="config" format="yaml" label="${tool.name} on ${on_string}: ${active_material}_config.yml"/>
+        <data name="log" format="txt" label="${tool.name} on ${on_string}: find-orientations_analysis_${active_material}.log"/>
+        <data name="ome_maps" format="hexrd.eta_ome.npz" label="${tool.name} on ${on_string}: analysis_${active_material}_eta-ome_maps.npz"/>
+        <data name="score_orientations" format="npz" label="${tool.name} on ${on_string}: scored_orientations_analysis_${active_material}.npz"/>
+        <data name="accepted_orientations" format="tabular" label="${tool.name} on ${on_string}: accepted_orientations_analysis_${active_material}.dat"/>
+        <data name="grains" format="tabular" label="${tool.name} on ${on_string}: grains.out" from_work_dir="analysis/grains.out" />
+    </outputs>
+    <tests>
+        <test>
+            <param name="inputs" ftype="hexrd.images.npz" value="RUBY_0000-fc_GE.npz,RUBY_0001-fc_GE.npz,RUBY_0002-fc_GE.npz,RUBY_0003-fc_GE.npz,RUBY_0004-fc_GE.npz,RUBY_0005-fc_GE.npz"/>
+            <conditional name="detector">
+                <param name="panel_assignment" value="infer_from_name"/>
+            </conditional>
+            <param name="instrument" ftype="yaml" value="ge_detector.yml"/>
+            <param name="material" ftype="hexrd.materials.h5" value="materials.h5"/>
+            <param name="active_material" value="ruby"/>
+            <section name="orientation_maps">
+                <param name="threshold" value="25"/>
+                <param name="bin_frames" value="1"/>
+                <param name="active_hkls" value="0,1,2,3,4,5"/>
+            </section>
+            <section name="search_options">
+                <conditional name="search">
+                    <param name="search_type" value="seed_search"/>
+                    <param name="hkl_seeds" value="0,1,2"/>
+                    <param name="fiber_step" value="0.5"/>
+                    <conditional name="params">
+                        <param name="method" value="label"/>
+                        <param name="filter_radius" value="1"/>
+                        <param name="threshold" value="1"/>
+                    </conditional>
+                </conditional>
+            </section>
+            <section name="omega">
+                <param name="omega_tolerance" value="1.0"/>
+            </section>
+            <section name="eta">
+                <param name="eta_tolerance" value="1.0"/>
+                <param name="eta_mask" value="5.0"/>
+            </section>
+            <section name="clustering">
+                <param name="clustering_algorithm" value="dbscan"/>
+                <param name="clustering_radius" value="1.0"/>
+                <param name="clustering_completeness" value="0.85"/>
+            </section>
+            <output name="grains">
+                <assert_contents>
+                    <has_text text="6.6655" />
+                </assert_contents>
+            </output>
+        </test>
+    </tests>
+    <help><![CDATA[
+**HEXRD find-orientations**
+@HEXRD_HELP@
+@COMMON_INPUTS_HELP@
+@FIND_ORIENTATIONS_OUTPUTS_HELP@
+    ]]></help>
+    <expand macro="citations" />
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hexrd_fit_grains.xml	Wed Jan 05 14:14:56 2022 +0000
@@ -0,0 +1,76 @@
+<tool id="hexrd_fit_grains" name="HEXRD fit-grains" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" python_template_version="3.5">
+    <description>Extracts G vectors, grain position and strain</description>
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <expand macro="requirements" />
+    <command detect_errors="exit_code"><![CDATA[
+        cp '$config_yml' $config &&
+        cp '$config_yml' config.yml &&
+        ## symlink input files
+        @FIT_GRAIN_LINKS@
+        hexrd fit-grains config.yml -f &&
+        cp analysis/*.log '$log' && 
+        @CONVERT2TAB@ 
+        && for i in analysis/*/spots*.out; do dest=`echo \${i\#*/} | tr '/' '_'`; mv \${i} analysis/\$dest; done
+    ]]></command>
+    <configfiles>
+        <configfile name="config_yml"><![CDATA[@FIT_GRAINS_YML@
+]]></configfile>
+    </configfiles>
+    <inputs>
+        <expand macro="fit_grains_config"/>
+    </inputs>
+    <outputs>
+        <data name="config" format="yaml" label="${tool.name} on ${on_string}: ${active_material}_config.yml"/>
+        <data name="log" format="txt" label="${tool.name} on ${on_string}:fit_grains_analysis_${active_material}.log"/>
+        <data name="grains" format="tabular" label="${tool.name} on ${on_string}: grains.out" from_work_dir="analysis/grains.out" />
+        <collection name="spots" type="list" label="${tool.name} on ${on_string}:spots">
+            <discover_datasets pattern="(?P&lt;designation&gt;.+_spots.+\.out)" ext="tabular" directory="analysis"/>
+        </collection>
+    </outputs>
+    <tests>
+        <test>
+            <param name="inputs" ftype="hexrd.iamges.npz" value="RUBY_0000-fc_GE.npz,RUBY_0001-fc_GE.npz,RUBY_0002-fc_GE.npz,RUBY_0003-fc_GE.npz,RUBY_0004-fc_GE.npz,RUBY_0005-fc_GE.npz"/>
+            <conditional name="detector">
+                <param name="panel_assignment" value="infer_from_name"/>
+            </conditional>
+            <param name="instrument" ftype="yaml" value="ge_detector.yml"/>
+            <param name="material" ftype="hexrd.materials.h5" value="materials.h5"/>
+            <param name="active_material" value="ruby"/>
+            <param name="ome_map" ftype="hexrd.eta_ome.npz" value="analysis_ruby_eta-ome_maps.npz"/>
+            <param name="accepted_orientations" ftype="tabular" value="accepted_orientations_analysis_ruby.dat"/>
+            <param name="grains_estimate" ftype="tabular" value="grains.out"/>
+            <param name="do_fit" value="true"/>
+            <param name="npdiv" value="2"/>
+            <param name="threshold" value="25"/>
+            <section name="tolerance">
+                <repeat name="tolerance_lists">
+                    <param name="tth" value="0.25"/>
+                    <param name="eta" value="3.0"/>
+                    <param name="omega" value="2.0"/>
+                    <param name="refit" value="1"/>
+                </repeat>
+                <repeat name="tolerance_lists">
+                    <param name="tth" value="0.20"/>
+                    <param name="eta" value="2.0"/>
+                    <param name="omega" value="1.0"/>
+                    <param name="refit" value="1"/>
+                </repeat>
+                <param name="tth_max" value="14.25"/>
+            </section>
+            <output name="grains">
+                <assert_contents>
+                    <has_text text="6.6655" />
+                </assert_contents>
+            </output>
+        </test>
+    </tests>
+    <help><![CDATA[
+**HEXRD fit-grains**
+@HEXRD_HELP@
+@FIT_GRAIN_INPUTS_HELP@
+@FIT_GRAINS_OUTPUTS_HELP@
+    ]]></help>
+    <expand macro="citations" />
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml	Wed Jan 05 14:14:56 2022 +0000
@@ -0,0 +1,404 @@
+<macros>
+    <token name="@TOOL_VERSION@">0.8.12</token>
+    <token name="@VERSION_SUFFIX@">1</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 indeces 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">
+                <validator type="regex" message="">^\d(,\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>