diff pm_uep_opt.xml @ 4:ec5f6b22417c draft

planemo upload for repository https://github.com/muon-spectroscopy-computational-project/muon-galaxy-tools/main/pm_uep_opt commit 70a4d37ecdf5d586703cfc509922311e95d3205c
author muon-spectroscopy-computational-project
date Tue, 18 Jul 2023 13:27:15 +0000
parents 523d44fcd03f
children eea73e1f65cb
line wrap: on
line diff
--- a/pm_uep_opt.xml	Fri Feb 03 15:40:08 2023 +0000
+++ b/pm_uep_opt.xml	Tue Jul 18 13:27:15 2023 +0000
@@ -1,32 +1,18 @@
-<tool id="pm_uep_opt" name="PyMuonSuite AIRSS UEP Optimise" version="@TOOL_VERSION@+galaxy@WRAPPER_VERSION@" python_template_version="3.5" profile="22.05" license="MIT">
+<tool id="pm_uep_opt" name="PyMuonSuite AIRSS UEP Optimise" version="@PYMUONSUITE_VERSION@+galaxy@WRAPPER_VERSION@" python_template_version="3.5" profile="22.05" license="MIT">
     <description>run UEP optimisation</description>
     <macros>
-        <!-- version of underlying tool (PEP 440) -->
-        <token name="@TOOL_VERSION@">0.2.3</token>
         <!-- version of this tool wrapper (integer) -->
         <token name="@WRAPPER_VERSION@">0</token>
-        <!-- citation should be updated with every underlying tool version -->
-        <!-- typical fields to update are version, month, year, and doi -->
-        <token name="@TOOL_CITATION@">
-            @software{Sturniolo_pymuon-suite_2022,
-                author = {Sturniolo, Simone and Liborio, Leandro and Chadwick, Eli and Murgatroyd, Laura and Laverack, Adam and Mudaraddi, Anish and {Muon Spectroscopy Computational Project}},
-                license = {GPL-3.0},
-                month = {8},
-                title = {{pymuon-suite}},
-                url = {https://github.com/muon-spectroscopy-computational-project/pymuon-suite},
-                version = {v0.2.3},
-                doi = {10.5281/zenodo.7025644},
-                year = {2022}
-            }
-        </token>
+        <import>muon_macros.xml</import>
     </macros>
     <creator>
         <person givenName="Jyothish" familyName="Thomas" identifier="https://orcid.org/0000-0003-4724-6924"/>
         <person givenName="Eli" familyName="Chadwick" url="https://github.com/elichad" identifier="https://orcid.org/0000-0002-0035-6475"/>
+        <person givenName="Patrick" familyName="Austin" url="https://github.com/patrick-austin" identifier="https://orcid.org/0000-0002-6279-7823"/>
         <organization url="https://muon-spectroscopy-computational-project.github.io/index.html" name="The Muon Spectroscopy Computational Project"/>
     </creator>
     <requirements>
-        <requirement type="package" version="@TOOL_VERSION@">pymuonsuite</requirement>
+        <requirement type="package" version="@PYMUONSUITE_VERSION@">pymuonsuite</requirement>
         <requirement type="package" version="3.0">zip</requirement>
     </requirements>
     <required_files>
@@ -34,101 +20,230 @@
         <include type="literal" path="get_out_folder.py"/>
     </required_files>
     <command detect_errors="exit_code"><![CDATA[
-        unzip '$muonated_structures' &&
-        if test -f "params.yaml"; then echo "params.yaml present"; else echo "params.yaml missing" && exit 64; fi &&
-        if ( test -f input_structure.* ) ; then echo "input structure present"; else echo "input structure missing" && exit 64; fi &&
-        ## PyMuonSuite will attempt to load '<chden_seed>.den_fmt' and
-        ## '<chden_seed>.castep', but $charge_density.name may or may not end
-        ## with '.den_fmt' so strip any extension and manually include 'den_fmt'
-        ## and '.castep' in the linked file names
-        charge_density_name=\$(sed 's/ //g' <<< '$charge_density.name') &&
-        charge_density_seed=\${charge_density_name%%.*} &&
-        echo "Calculated seed name \$charge_density_seed" &&
-        ln -s '$charge_density' \$charge_density_seed.den_fmt && 
-        ln -s '$castep_log' \$charge_density_seed.castep &&
+        cat $params_yaml > params.yaml &&
+        structure_name_internal='input_structure.$structure.ext' &&
+        ln -s '$structure' \$structure_name_internal &&
+        pm-muairss -t w \$structure_name_internal params.yaml &&
+        #if $generation_params.allpos_ext != "none":
+            mv allpos.$generation_params.allpos_ext $allpos_file &&
+        #end if
+        ln -s '$charge_density' input_structure.den_fmt && 
+        ln -s '$castep_log' input_structure.castep &&
         out_folder="`python '${__tool_directory__}/get_out_folder.py'`" &&
         find \$out_folder -type f -name "*.yaml" | xargs sed -i "s#^chden_path: .*#chden_path: .\/#g" &&
-        find \$out_folder -type f -name "*.yaml" | xargs sed -i "s#^chden_seed: .*#chden_seed: \$charge_density_seed#g" &&
+        find \$out_folder -type f -name "*.yaml" | xargs sed -i "s#^chden_seed: .*#chden_seed: input_structure#g" &&
         bash '${__tool_directory__}/run.sh' \$out_folder &&
-        zip -r out_zip.zip \$out_folder params.yaml input_structure.* &&
+        zip -r out_zip.zip \$out_folder params.yaml \$structure_name_internal &&
         find \$out_folder > tree.txt
     ]]></command>
+    <configfiles>
+        <configfile name="params_yaml">poisson_r: $generation_params.poisson_r
+vdw_scale: $generation_params.vdw_scale
+#if $generation_params.random_seed:
+random_seed: $generation_params.random_seed
+#end if
+#if $generation_params.allpos_ext!="none":
+allpos_filename: allpos.$generation_params.allpos_ext
+#end if
+calculator: uep
+charged: true
+geom_steps: $optimisation_params.geom_steps
+geom_force_tol: $optimisation_params.geom_force_tol
+uep_gw_factor: $optimisation_params.uep_gw_factor</configfile>
+    </configfiles>
     <inputs>
-        <param type="data" name="muonated_structures" label="Muonated structures (.zip)" format="zip" help="A zip folder containing muonated structures, as generated by the 'Generate muonated structures' tool or pm-muairss."/>
+        <param type="data" name="structure" label="Structure file" format="cell, cif, extxyz" help="The structure to add muons to. The original file will be preserved. Accepted file types: CELL, CIF, XYZ (extended only)."/>
         <param type="data" name="charge_density" label="Charge density file (.den_fmt)" format="den_fmt" help="The charge density file created by CASTEP during your initial DFT simulation for the structure."/>
         <param type="data" name="castep_log" label="CASTEP log (.castep)" format="castep" help="The CASTEP log for your initial DFT simulation for the structure."/>
+        <section name="generation_params" expanded="true" title="Generation Parameters">
+            <param type="float" argument="poisson_r" value="0.8" min="0.0" label="Poisson radius" help=" Poisson sphere radius to use for random generation. No two starting muon positions will be closer than this distance. Smaller values make for bigger structure sets."/>
+            <param type="float" argument="vdw_scale" value="0.5" min="0.0" label="Van der Waals scale" help="Van der Waals scaling factor to use when generating muon sites to avoid existing atoms. Smaller values will allow muons to get closer to the other ions."/>
+            <param type="integer" argument="random_seed" label="Random Seed" optional="true" help="Seed used to randomise the positions of the muons in the generated structures."/>
+            <param type="select" name="allpos_ext" value="none" label="Format for file containing all muon positions (optional)" help="If set, generates an extra output file containing all the muon positions using the specified file type.">
+                <option value="none">Do not generate</option>
+                <option value="cell">CELL</option>
+                <option value="cif">CIF</option>
+                <option value="xyz">XYZ</option>
+            </param>
+        </section>
+        <section name="optimisation_params" expanded="true" title="Optimisation Parameters">
+            <param type="integer" argument="geom_steps" value="30" min="0" label="Geometry optimization steps" help="Maximum number of geometry optimisation steps."/>
+            <param type="float" argument="geom_force_tol" value="0.05" min="0.0" label="Geometry optimization tolerance" help="Tolerance on geometry optimisation in units of eV/Å."/>
+            <param type="float" argument="uep_gw_factor" optional="true" value="5.0" min="0.0" label="Gaussian width factor" help="Gaussian width factor for UEP calculation. Higher values will make the potential of atomic nuclei closer to the point-like approximation but may introduce artifacts."/>
+        </section>
         <param type="hidden" name="testing" label="Test mode" value="false"/>
     </inputs>
     <outputs>
-        <data label="UEP results for $muonated_structures.name" name="uep_results" format="zip" from_work_dir="out_zip.zip"/>
+        <data name="uep_results" format="zip" from_work_dir="out_zip.zip"/>
+        <data label="File containing the positions of all muon sites" name="allpos_file" auto_format="true">
+            <filter>(generation_params["allpos_ext"] != "none")</filter>
+        </data>
         <data label="File tree (testing only)" name="file_tree" format="txt" from_work_dir="tree.txt" hidden="true">
             <filter>(testing == "true")</filter>
         </data>
     </outputs>
     <tests>
-        <test expect_num_outputs="2">
+        <!-- UEP with CELL -->
+        <test expect_num_outputs="3">
             <param name="testing" value="true"/>
-            <param name="muonated_structures" value="muonated.zip" ftype="zip"/>
+            <param name="structure" value="Si.cell" ftype="cell"/>
             <param name="charge_density" value="Si.den_fmt" ftype="den_fmt"/>
             <param name="castep_log" value="Si.castep" ftype="castep"/>
+            <section name="generation_params">
+                <param name="poisson_r" value="1.18"/>
+                <param name="vdw_scale" value="0.25"/>
+                <param name="random_seed" value="7357"/>
+                <param name="allpos_ext" value="cell"/>
+            </section>
+            <section name="optimisation_params">
+                <param name="geom_steps" value="300"/>
+                <param name="uep_gw_factor" value="4.0"/>
+            </section>
+            <output name="allpos_file" file="allpos.cell"/>
             <output name="file_tree" file="tree.txt" ftype="txt" sort="true">
                 <assert_contents>
-                    <has_size value="1780"/>
+                    <has_size value="3280"/>
                 </assert_contents>
             </output>
         </test>
-        <test expect_num_outputs="2">
+        <!-- UEP with XYZ -->
+        <test expect_failure="true">
             <param name="testing" value="true"/>
-            <param name="muonated_structures" value="muonated-default-folder.zip" ftype="zip"/>
+            <param name="structure" value="Si.xyz" ftype="xyz"/>
+            <param name="charge_density" value="Si.den_fmt" ftype="den_fmt"/>
+            <param name="castep_log" value="Si.castep" ftype="castep"/>
+            <section name="generation_params">
+                <param name="poisson_r" value="1.18"/>
+                <param name="vdw_scale" value="0.25"/>
+                <param name="random_seed" value="7357"/>
+            </section>
+            <section name="optimisation_params">
+                <param name="geom_steps" value="300"/>
+                <param name="uep_gw_factor" value="4.0"/>
+            </section>
+            <assert_stderr>
+                <has_text text="TypeError: cannot unpack non-iterable NoneType object"/>
+            </assert_stderr>
+        </test>
+        <!-- UEP with extended XYZ -->
+        <test expect_num_outputs="3">
+            <param name="testing" value="true"/>
+            <param name="structure" value="Si.extxyz" ftype="extxyz"/>
             <param name="charge_density" value="Si.den_fmt" ftype="den_fmt"/>
             <param name="castep_log" value="Si.castep" ftype="castep"/>
-            <output name="file_tree" file="tree-default-folder.txt" sort="true"/>
+            <section name="generation_params">
+                <param name="poisson_r" value="1.18"/>
+                <param name="vdw_scale" value="0.25"/>
+                <param name="random_seed" value="7357"/>
+                <param name="allpos_ext" value="xyz"/>
+            </section>
+            <section name="optimisation_params">
+                <param name="geom_steps" value="300"/>
+                <param name="uep_gw_factor" value="4.0"/>
+            </section>
+            <output name="allpos_file" file="allpos.xyz"/>
+            <output name="file_tree" file="tree.txt" ftype="txt" sort="true">
+                <assert_contents>
+                    <has_size value="3280"/>
+                </assert_contents>
+            </output>
         </test>
+        <!-- UEP with CIF -->
+        <test expect_num_outputs="3">
+            <param name="testing" value="true"/>
+            <param name="structure" value="Si.cif" ftype="cif"/>
+            <param name="charge_density" value="Si.den_fmt" ftype="den_fmt"/>
+            <param name="castep_log" value="Si.castep" ftype="castep"/>
+            <section name="generation_params">
+                <param name="poisson_r" value="1.18"/>
+                <param name="vdw_scale" value="0.25"/>
+                <param name="random_seed" value="7357"/>
+                <param name="allpos_ext" value="cif"/>
+            </section>
+            <section name="optimisation_params">
+                <param name="geom_steps" value="300"/>
+                <param name="uep_gw_factor" value="4.0"/>
+            </section>
+            <output name="allpos_file" file="allpos.cif"/>
+            <output name="file_tree" file="tree.txt" ftype="txt" sort="true">
+                <assert_contents>
+                    <has_size value="3280"/>
+                </assert_contents>
+            </output>
+        </test>
+        <!-- Expect total failure for badly formatted den_fmt -->
         <test expect_failure="true">
             <param name="testing" value="true"/>
-            <param name="muonated_structures" value="muonated-default-folder.zip" ftype="zip"/>
+            <param name="structure" value="Si.cell" ftype="cell"/>
             <param name="castep_log" value="Si.castep" ftype="castep"/>
             <param name="charge_density" value="Sifail.den_fmt" ftype="den_fmt"/>
             <assert_stderr>
                 <has_text text="Error:  FMT file has no header"/>
+                <has_text text="ERROR: All optimisations failed"/>
             </assert_stderr>
         </test>
         <!-- check that file_tree filter works -->
         <test expect_num_outputs="1">
             <param name="testing" value="false"/>
-            <param name="muonated_structures" value="muonated.zip" ftype="zip"/>
+            <param name="structure" value="Si.cell" ftype="cell"/>
             <param name="charge_density" value="Si.den_fmt" ftype="den_fmt"/>
             <param name="castep_log" value="Si.castep" ftype="castep"/>
+            <section name="generation_params">
+                <param name="poisson_r" value="1.18"/>
+                <param name="vdw_scale" value="0.25"/>
+                <param name="random_seed" value="7357"/>
+            </section>
+            <section name="optimisation_params">
+                <param name="geom_steps" value="300"/>
+                <param name="uep_gw_factor" value="4.0"/>
+            </section>
         </test>
         <!-- Check that the chden parameters are set correctly when $charge_density.name does not have the .den_fmt extension -->
         <test expect_num_outputs="2">
             <param name="testing" value="true"/>
-            <param name="muonated_structures" value="muonated.zip" ftype="zip"/>
+            <param name="structure" value="Si.cell" ftype="cell"/>
             <param name="charge_density" value="Si_den_fmt" ftype="den_fmt"/>
             <param name="castep_log" value="Si.castep" ftype="castep"/>
+            <section name="generation_params">
+                <param name="poisson_r" value="1.18"/>
+                <param name="vdw_scale" value="0.25"/>
+                <param name="random_seed" value="7357"/>
+            </section>
+            <section name="optimisation_params">
+                <param name="geom_steps" value="300"/>
+                <param name="uep_gw_factor" value="4.0"/>
+            </section>
             <output name="file_tree" file="tree.txt" ftype="txt" sort="true">
                 <assert_contents>
-                    <has_size value="1780"/>
+                    <has_size value="3280"/>
                 </assert_contents>
             </output>
         </test>
     </tests>
     <help><![CDATA[
-        Given a set of input muonated structures (structures containing a muon), applies UEP optimisation to refine them.
+        Given an input structure, this tool generates a set of duplicate structures,
+        each with a single muon added in a random location.
+        These are known as "muonated" structures.
+        Following this, UEP optimisation is used to refine the positions of the muons.
 
-        This tool requires CASTEP inputs for the UEP method, meaning your initial DFT simulation must have been done with CASTEP.
-        The structure you used as input to the '`Generate muonated structures`_' tool or pm-muairss beforehand should come from the same simulation run.
+        This tool requires CASTEP inputs in order to perform the UEP method,
+        meaning your initial DFT simulation must have been done with CASTEP.
+        This simulation should have used the same structure as is used here.
 
-        Command-line usage: pm-uep-opt [-h] [-t {r,w}] structures parameter_file
+        Following this, the individual refined positions can be clustered to
+        represent potential stopping sites by using '`PyMuonSuite AIRSS Cluster`_'.
 
-        .. _Generate muonated structures: /tool_runner?tool_id=pm_muairss_write
+        Command-line usage (generation): pm-muairss [-h] -t w structures parameter_file
+        
+        Command-line usage (optimisation): pm-uep-opt [-h] parameter_file
 
-        PyMuonSuite is distributed under the GPLv3 license. This tool wrapper is distributed under the MIT license.
+        .. _PyMuonSuite AIRSS Cluster: /tool_runner?tool_id=pm_muairss_read
+
+        PyMuonSuite is distributed under the GPLv3 license.
+        This tool wrapper is distributed under the MIT license.
     ]]></help>
     <citations>
-        <citation type="bibtex">
-            @TOOL_CITATION@
-        </citation>
+        <citation type="doi">@PYMUONSUITE_CITATION@</citation>
         <citation type="doi">10.1063/1.5024450</citation>
         <citation type="doi">10.1063/1.5085197</citation>
         <citation type="doi">10.1063/5.0012381</citation>