changeset 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
files muon_macros.xml pm_uep_opt.xml run.sh test-data/Si.cell test-data/Si.cif test-data/Si.extxyz test-data/Si.xyz test-data/allpos.cell test-data/allpos.cif test-data/allpos.xyz test-data/muonated-default-folder.zip test-data/muonated.zip test-data/tree.txt
diffstat 13 files changed, 517 insertions(+), 135 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/muon_macros.xml	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,29 @@
+<macros>
+    <xml name="dftb_set">
+        <param type="select" name="dftb_set" value="3ob-3-1" display="radio" label="DFTB parameter set" help="The parameter set to use for DFTB+. Currently supported are: 3ob-3-1 and pbc-0-3. See help section at the bottom of the page for details.">
+            <option value="3ob-3-1">3ob-3-1</option>
+            <option value="pbc-0-3">pbc-0-3</option>
+        </param>
+    </xml>
+    <xml name="dftb+">
+        <expand macro="dftb_set"/>
+        <param type="boolean" name="dftb_pbc" label="Use periodic boundary conditions" help="Whether to turn on periodic boundary conditions in DFTB+." checked="true"/>
+    </xml>
+    <xml name="dftb_optionals">
+        <param type="text" argument="dftb_optionals" value="[]" optional="true" label="DFTB optional files" help="Additional optional json files to activate for DFTBArgs (for example, dftd3.json will use DFTD3 dispersion forces for 3ob-3-1 if DFTB+ has been compiled to support them)."/>
+    </xml>
+    <xml name="k_points_grid">
+        <param type="text" argument="k_points_grid" value="[1,1,1]" label="K-points grid" help="List of three integer k-points. Default is [1,1,1].">
+            <validator type="regex" message="Input should only contain whitespace, '[', ']', ',' and digits.">^[\s\d,\[\]]+$</validator>
+        </param>
+    </xml>
+    <!-- version of underlying tool (PEP 440) -->
+    <!-- citation should be updated with every underlying tool version -->
+    <!-- concept is not updated, and should only be used for referencing the idea of the software -->
+    <token name="@MUSPINSIM_VERSION@">2.2.1</token>
+    <token name="@MUSPINSIM_CITATION@">10.5281/zenodo.7733979</token>
+    <token name="@MUSPINSIM_CONCEPT@">10.5281/zenodo.6517626</token>
+    <token name="@PYMUONSUITE_VERSION@">0.3.0</token>
+    <token name="@PYMUONSUITE_CITATION@">10.5281/zenodo.8026711</token>
+    <token name="@PYMUONSUITE_CONCEPT@">10.5281/zenodo.7025643</token>
+</macros>
\ No newline at end of file
--- 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>
--- a/run.sh	Fri Feb 03 15:40:08 2023 +0000
+++ b/run.sh	Tue Jul 18 13:27:15 2023 +0000
@@ -2,14 +2,33 @@
 
 set -o errexit
 
-for x in $1/*/*/*.yaml 
-do 
-    
-    if ! out=$(pm-uep-opt $x)
-    then 
-    echo 1>&2 "$out"; exit 1
+run(){
+    if ! out=$(pm-uep-opt $1); then 
+        echo 1>&2 "$out"; exit 1
     else
-    echo "$out"
+        echo "$out"
     fi
-done || exit
-#pm-uep-opt 
\ No newline at end of file
+}
+
+pids=()
+for x in $1/*/*/*.yaml; do 
+    run $x & pids+=($!)
+done
+
+declare -i failed=0
+for pid in ${pids[@]}; do
+    if ! wait $pid; then
+        failed+=1
+    fi
+done
+
+if [ $failed -eq ${#pids[@]} ]; then
+    >&2 echo "ERROR: All optimisations failed"
+    exit 1
+elif [ $failed -eq 0 ]; then
+    echo "All optimisations succeeded"
+    exit 0
+else
+    echo "WARNING: $failed optimisation(s) failed"
+    exit 0
+fi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Si.cell	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,43 @@
+# CELL file written 11:14:42 (GMT-0.0) 17th February 2021 from run Si
+
+%BLOCK lattice_cart
+   ANG
+       5.47538171155659       0.530767321973160E-35  -0.131324260787022E-34
+      0.530767321973160E-35    5.47538171155659       0.313104997179767E-35
+     -0.131324260787022E-34   0.313104997179767E-35    5.47538171155659    
+%ENDBLOCK lattice_cart
+
+%BLOCK cell_constraints
+      1   1   1
+      0   0   0
+%ENDBLOCK cell_constraints
+
+%BLOCK positions_frac
+   Si             0.000000000000000       0.000000000000000       0.000000000000000
+   Si             0.000000000000000       0.500000000000000       0.500000000000000
+   Si             0.250000000000000       0.250000000000000       0.250000000000000
+   Si             0.500000000000000       0.000000000000000       0.500000000000000
+   Si             0.250000000000000       0.750000000000000       0.750000000000000
+   Si             0.750000000000000       0.250000000000000       0.750000000000000
+   Si             0.750000000000000       0.750000000000000       0.250000000000000
+   Si             0.500000000000000       0.500000000000000       0.000000000000000
+%ENDBLOCK positions_frac
+
+FIX_COM : true
+
+%BLOCK species_pot
+   Si      3|1.8|5|6|7|30:31:32
+%ENDBLOCK species_pot
+
+SYMMETRY_TOL :     0.001000
+
+%BLOCK symmetry_ops
+# Symm. op. 1       E
+          1.000000000000000       0.000000000000000       0.000000000000000
+          0.000000000000000       1.000000000000000       0.000000000000000
+          0.000000000000000       0.000000000000000       1.000000000000000
+          0.000000000000000       0.000000000000000       0.000000000000000
+%ENDBLOCK symmetry_ops
+
+kpoint_mp_grid :    2   2   2
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Si.cif	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,33 @@
+data_image0
+_chemical_formula_structural       Si8
+_chemical_formula_sum              "Si8"
+_cell_length_a       5.47545
+_cell_length_b       5.47545
+_cell_length_c       5.47545
+_cell_angle_alpha    90
+_cell_angle_beta     90
+_cell_angle_gamma    90
+
+_space_group_name_H-M_alt    "P 1"
+_space_group_IT_number       1
+
+loop_
+  _space_group_symop_operation_xyz
+  'x, y, z'
+
+loop_
+  _atom_site_type_symbol
+  _atom_site_label
+  _atom_site_symmetry_multiplicity
+  _atom_site_fract_x
+  _atom_site_fract_y
+  _atom_site_fract_z
+  _atom_site_occupancy
+  Si  Si1       1.0  0.00000  0.00000  0.00000  1.0000
+  Si  Si2       1.0  0.75000  0.75000  0.25000  1.0000
+  Si  Si3       1.0  0.50000  0.00000  0.50000  1.0000
+  Si  Si4       1.0  0.75000  0.25000  0.75000  1.0000
+  Si  Si5       1.0  0.00000  0.50000  0.50000  1.0000
+  Si  Si6       1.0  0.25000  0.25000  0.25000  1.0000
+  Si  Si7       1.0  0.25000  0.75000  0.75000  1.0000
+  Si  Si8       1.0  0.50000  0.50000  0.00000  1.0000
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Si.extxyz	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,10 @@
+8
+Lattice="5.47545112629462 4.96819156878786e-36 1.10608096941637e-36 4.96819156878786e-36 5.47545112629462 -3.12695835139248e-36 1.10608096941637e-36 -3.12695835139248e-36 5.47545112629462" Properties=species:S:1:pos:R:3:initial_magmoms:R:1:castep_labels:S:1 pbc="T T T"
+Si       0.00000000       0.00000000       0.00000000       0.00000000 NULL
+Si       4.10658834       4.10658834       1.36886278       0.00000000 NULL
+Si       2.73772556       0.00000000       2.73772556       0.00000000 NULL
+Si       4.10658834       1.36886278       4.10658834       0.00000000 NULL
+Si       0.00000000       2.73772556       2.73772556       0.00000000 NULL
+Si       1.36886278       1.36886278       1.36886278       0.00000000 NULL
+Si       1.36886278       4.10658834       4.10658834       0.00000000 NULL
+Si       2.73772556       2.73772556      -0.00000000       0.00000000 NULL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Si.xyz	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,10 @@
+8
+Generated by cif2cell 2.0.0.  :  Kitano, A. et al., Physical Review, Serie 3. B - Condensed Matter (18,1978-) 64, 0452061-0452069 (2001).
+Si    0.000000000000000   0.000000000000000   0.000000000000000
+Si    4.035750000000000   4.035750000000000   1.345250000000000
+Si    2.690500000000000   0.000000000000000   2.690500000000000
+Si    4.035750000000000   1.345250000000000   4.035750000000000
+Si    0.000000000000000   2.690500000000000   2.690500000000000
+Si    1.345250000000000   1.345250000000000   1.345250000000000
+Si    1.345250000000000   4.035750000000000   4.035750000000000
+Si    2.690500000000000   2.690500000000000   0.000000000000000
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/allpos.cell	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,38 @@
+#######################################################
+#CASTEP cell file: allpos.cell
+#Created using the Atomic Simulation Environment (ASE)#
+#######################################################
+
+%BLOCK LATTICE_CART
+ 5.475382  0.000000 -0.000000
+ 0.000000  5.475382  0.000000
+-0.000000  0.000000  5.475382
+%ENDBLOCK LATTICE_CART
+
+%BLOCK POSITIONS_ABS
+Si  0.000000  0.000000  0.000000
+Si -0.000000  2.737691  2.737691
+Si  1.368845  1.368845  1.368845
+Si  2.737691  0.000000  2.737691
+Si  1.368845  4.106536  4.106536
+Si  4.106536  1.368845  4.106536
+Si  4.106536  4.106536  1.368845
+Si  2.737691  2.737691 -0.000000
+H:mu  3.125152  3.041799  2.994236
+H:mu  4.170048  2.685234  3.919204
+H:mu  2.896190  3.055878  1.069474
+H:mu  2.499357  2.738732  5.011782
+H:mu  1.856384  1.305645  0.684300
+H:mu  0.710100  1.663543  1.366143
+H:mu  2.926805  4.554958  3.173796
+H:mu  4.041556  2.285971  2.357787
+H:mu  2.153772  1.685845  2.712357
+H:mu  3.369247  0.881320  2.641127
+H:mu  4.631185  3.830276  4.640470
+H:mu  2.828731  1.963913  1.697286
+H:mu  2.176625  2.144297  3.912156
+H:mu  1.805850  2.882961  2.746759
+H:mu  1.403305  0.559980  1.522521
+H:mu  3.251047  3.565876  4.157223
+%ENDBLOCK POSITIONS_ABS
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/allpos.cif	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,49 @@
+data_image0
+_chemical_formula_structural       Si8H16
+_chemical_formula_sum              "Si8 H16"
+_cell_length_a       5.47545
+_cell_length_b       5.47545
+_cell_length_c       5.47545
+_cell_angle_alpha    90
+_cell_angle_beta     90
+_cell_angle_gamma    90
+
+_space_group_name_H-M_alt    "P 1"
+_space_group_IT_number       1
+
+loop_
+  _space_group_symop_operation_xyz
+  'x, y, z'
+
+loop_
+  _atom_site_type_symbol
+  _atom_site_label
+  _atom_site_symmetry_multiplicity
+  _atom_site_fract_x
+  _atom_site_fract_y
+  _atom_site_fract_z
+  _atom_site_occupancy
+  Si  Si1       1.0  0.00000  0.00000  0.00000  1.0000
+  Si  Si2       1.0  0.75000  0.75000  0.25000  1.0000
+  Si  Si3       1.0  0.50000  0.00000  0.50000  1.0000
+  Si  Si4       1.0  0.75000  0.25000  0.75000  1.0000
+  Si  Si5       1.0  0.00000  0.50000  0.50000  1.0000
+  Si  Si6       1.0  0.25000  0.25000  0.25000  1.0000
+  Si  Si7       1.0  0.25000  0.75000  0.75000  1.0000
+  Si  Si8       1.0  0.50000  0.50000  0.00000  1.0000
+  H   H1        1.0  0.57076  0.55554  0.54685  1.0000
+  H   H2        1.0  0.76160  0.49042  0.71579  1.0000
+  H   H3        1.0  0.52895  0.55811  0.19532  1.0000
+  H   H4        1.0  0.45647  0.50019  0.91533  1.0000
+  H   H5        1.0  0.33904  0.23846  0.12498  1.0000
+  H   H6        1.0  0.12969  0.30382  0.24951  1.0000
+  H   H7        1.0  0.53454  0.83190  0.57965  1.0000
+  H   H8        1.0  0.73813  0.41750  0.43062  1.0000
+  H   H9        1.0  0.39336  0.30790  0.49537  1.0000
+  H   H10       1.0  0.61534  0.16096  0.48236  1.0000
+  H   H11       1.0  0.84582  0.69955  0.84752  1.0000
+  H   H12       1.0  0.51663  0.35868  0.30999  1.0000
+  H   H13       1.0  0.39753  0.39163  0.71450  1.0000
+  H   H14       1.0  0.32981  0.52653  0.50166  1.0000
+  H   H15       1.0  0.25629  0.10227  0.27807  1.0000
+  H   H16       1.0  0.59376  0.65126  0.75926  1.0000
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/allpos.xyz	Tue Jul 18 13:27:15 2023 +0000
@@ -0,0 +1,26 @@
+24
+Lattice="5.47545112629462 4.96819156878786e-36 1.10608096941637e-36 4.96819156878786e-36 5.47545112629462 -3.12695835139248e-36 1.10608096941637e-36 -3.12695835139248e-36 5.47545112629462" Properties=species:S:1:pos:R:3:initial_magmoms:R:1:castep_labels:S:1:masses:R:1:castep_custom_species:S:1 pbc="T T T"
+Si       0.00000000       0.00000000       0.00000000       0.00000000 NULL      28.08500000 Si
+Si       4.10658834       4.10658834       1.36886278       0.00000000 NULL      28.08500000 Si
+Si       2.73772556       0.00000000       2.73772556       0.00000000 NULL      28.08500000 Si
+Si       4.10658834       1.36886278       4.10658834       0.00000000 NULL      28.08500000 Si
+Si       0.00000000       2.73772556       2.73772556       0.00000000 NULL      28.08500000 Si
+Si       1.36886278       1.36886278       1.36886278       0.00000000 NULL      28.08500000 Si
+Si       1.36886278       4.10658834       4.10658834       0.00000000 NULL      28.08500000 Si
+Si       2.73772556       2.73772556      -0.00000000       0.00000000 NULL      28.08500000 Si
+H        3.12519205       3.04183727       2.99427396       0.00000000 0       0.11342893 H:mu
+H        4.17010122       2.68526782       3.91925381       0.00000000 0       0.11342893 H:mu
+H        2.89622675       3.05591660       1.06948758       0.00000000 0       0.11342893 H:mu
+H        2.49938846       2.73876636       5.01184564       0.00000000 0       0.11342893 H:mu
+H        1.85640768       1.30566198       0.68430879       0.00000000 0       0.11342893 H:mu
+H        0.71010928       1.66356372       1.36616075       0.00000000 0       0.11342893 H:mu
+H        2.92684216       4.55501571       3.17383586       0.00000000 0       0.11342893 H:mu
+H        4.04160737       2.28599955       2.35781702       0.00000000 0       0.11342893 H:mu
+H        2.15379948       1.68586666       2.71239184       0.00000000 0       0.11342893 H:mu
+H        3.36928999       0.88133137       2.64116057       0.00000000 0       0.11342893 H:mu
+H        4.63124403       3.83032454       4.64052920       0.00000000 0       0.11342893 H:mu
+H        2.82876687       1.96393752       1.69730779       0.00000000 0       0.11342893 H:mu
+H        2.17665215       2.14432399       3.91220567       0.00000000 0       0.11342893 H:mu
+H        1.80587242       2.88299761       2.74679403       0.00000000 0       0.11342893 H:mu
+H        1.40332274       0.55998727       1.52254060       0.00000000 0       0.11342893 H:mu
+H        3.25108839       3.56592083       4.15727584       0.00000000 0       0.11342893 H:mu
Binary file test-data/muonated-default-folder.zip has changed
Binary file test-data/muonated.zip has changed
--- a/test-data/tree.txt	Fri Feb 03 15:40:08 2023 +0000
+++ b/test-data/tree.txt	Tue Jul 18 13:27:15 2023 +0000
@@ -1,73 +1,83 @@
-Si-out
-Si-out/uep
-Si-out/uep/Si_1
-Si-out/uep/Si_1/Si_1.yaml
-Si-out/uep/Si_1/Si_1.uep
-Si-out/uep/Si_1/Si_1.uep.pkl
-Si-out/uep/Si_1/Si_1.xyz
-Si-out/uep/Si_2
-Si-out/uep/Si_2/Si_2.yaml
-Si-out/uep/Si_2/Si_2.uep
-Si-out/uep/Si_2/Si_2.uep.pkl
-Si-out/uep/Si_2/Si_2.xyz
-Si-out/uep/Si_3
-Si-out/uep/Si_3/Si_3.yaml
-Si-out/uep/Si_3/Si_3.uep
-Si-out/uep/Si_3/Si_3.uep.pkl
-Si-out/uep/Si_3/Si_3.xyz
-Si-out/uep/Si_4
-Si-out/uep/Si_4/Si_4.yaml
-Si-out/uep/Si_4/Si_4.uep
-Si-out/uep/Si_4/Si_4.uep.pkl
-Si-out/uep/Si_4/Si_4.xyz
-Si-out/uep/Si_5
-Si-out/uep/Si_5/Si_5.yaml
-Si-out/uep/Si_5/Si_5.uep
-Si-out/uep/Si_5/Si_5.uep.pkl
-Si-out/uep/Si_5/Si_5.xyz
-Si-out/uep/Si_6
-Si-out/uep/Si_6/Si_6.yaml
-Si-out/uep/Si_6/Si_6.uep
-Si-out/uep/Si_6/Si_6.uep.pkl
-Si-out/uep/Si_6/Si_6.xyz
-Si-out/uep/Si_7
-Si-out/uep/Si_7/Si_7.yaml
-Si-out/uep/Si_7/Si_7.uep
-Si-out/uep/Si_7/Si_7.uep.pkl
-Si-out/uep/Si_7/Si_7.xyz
-Si-out/uep/Si_8
-Si-out/uep/Si_8/Si_8.yaml
-Si-out/uep/Si_8/Si_8.uep
-Si-out/uep/Si_8/Si_8.uep.pkl
-Si-out/uep/Si_8/Si_8.xyz
-Si-out/uep/Si_9
-Si-out/uep/Si_9/Si_9.yaml
-Si-out/uep/Si_9/Si_9.uep
-Si-out/uep/Si_9/Si_9.uep.pkl
-Si-out/uep/Si_9/Si_9.xyz
-Si-out/uep/Si_10
-Si-out/uep/Si_10/Si_10.yaml
-Si-out/uep/Si_10/Si_10.uep
-Si-out/uep/Si_10/Si_10.uep.pkl
-Si-out/uep/Si_10/Si_10.xyz
-Si-out/uep/Si_11
-Si-out/uep/Si_11/Si_11.yaml
-Si-out/uep/Si_11/Si_11.uep
-Si-out/uep/Si_11/Si_11.uep.pkl
-Si-out/uep/Si_11/Si_11.xyz
-Si-out/uep/Si_12
-Si-out/uep/Si_12/Si_12.yaml
-Si-out/uep/Si_12/Si_12.uep
-Si-out/uep/Si_12/Si_12.uep.pkl
-Si-out/uep/Si_12/Si_12.xyz
-Si-out/uep/Si_13
-Si-out/uep/Si_13/Si_13.yaml
-Si-out/uep/Si_13/Si_13.uep
-Si-out/uep/Si_13/Si_13.uep.pkl
-Si-out/uep/Si_13/Si_13.xyz
-Si-out/uep/Si_14
-Si-out/uep/Si_14/Si_14.yaml
-Si-out/uep/Si_14/Si_14.uep
-Si-out/uep/Si_14/Si_14.uep.pkl
-Si-out/uep/Si_14/Si_14.xyz
-Si-out/uep/.collection
+muon-airss-out
+muon-airss-out/uep
+muon-airss-out/uep/struct_1
+muon-airss-out/uep/struct_1/struct_1.yaml
+muon-airss-out/uep/struct_1/struct_1.uep
+muon-airss-out/uep/struct_1/struct_1.uep.pkl
+muon-airss-out/uep/struct_1/struct_1.xyz
+muon-airss-out/uep/struct_2
+muon-airss-out/uep/struct_2/struct_2.yaml
+muon-airss-out/uep/struct_2/struct_2.uep
+muon-airss-out/uep/struct_2/struct_2.uep.pkl
+muon-airss-out/uep/struct_2/struct_2.xyz
+muon-airss-out/uep/struct_3
+muon-airss-out/uep/struct_3/struct_3.yaml
+muon-airss-out/uep/struct_3/struct_3.uep
+muon-airss-out/uep/struct_3/struct_3.uep.pkl
+muon-airss-out/uep/struct_3/struct_3.xyz
+muon-airss-out/uep/struct_4
+muon-airss-out/uep/struct_4/struct_4.yaml
+muon-airss-out/uep/struct_4/struct_4.uep
+muon-airss-out/uep/struct_4/struct_4.uep.pkl
+muon-airss-out/uep/struct_4/struct_4.xyz
+muon-airss-out/uep/struct_5
+muon-airss-out/uep/struct_5/struct_5.yaml
+muon-airss-out/uep/struct_5/struct_5.uep
+muon-airss-out/uep/struct_5/struct_5.uep.pkl
+muon-airss-out/uep/struct_5/struct_5.xyz
+muon-airss-out/uep/struct_6
+muon-airss-out/uep/struct_6/struct_6.yaml
+muon-airss-out/uep/struct_6/struct_6.uep
+muon-airss-out/uep/struct_6/struct_6.uep.pkl
+muon-airss-out/uep/struct_6/struct_6.xyz
+muon-airss-out/uep/struct_7
+muon-airss-out/uep/struct_7/struct_7.yaml
+muon-airss-out/uep/struct_7/struct_7.uep
+muon-airss-out/uep/struct_7/struct_7.uep.pkl
+muon-airss-out/uep/struct_7/struct_7.xyz
+muon-airss-out/uep/struct_8
+muon-airss-out/uep/struct_8/struct_8.yaml
+muon-airss-out/uep/struct_8/struct_8.uep
+muon-airss-out/uep/struct_8/struct_8.uep.pkl
+muon-airss-out/uep/struct_8/struct_8.xyz
+muon-airss-out/uep/struct_9
+muon-airss-out/uep/struct_9/struct_9.yaml
+muon-airss-out/uep/struct_9/struct_9.uep
+muon-airss-out/uep/struct_9/struct_9.uep.pkl
+muon-airss-out/uep/struct_9/struct_9.xyz
+muon-airss-out/uep/struct_10
+muon-airss-out/uep/struct_10/struct_10.yaml
+muon-airss-out/uep/struct_10/struct_10.uep
+muon-airss-out/uep/struct_10/struct_10.uep.pkl
+muon-airss-out/uep/struct_10/struct_10.xyz
+muon-airss-out/uep/struct_11
+muon-airss-out/uep/struct_11/struct_11.yaml
+muon-airss-out/uep/struct_11/struct_11.uep
+muon-airss-out/uep/struct_11/struct_11.uep.pkl
+muon-airss-out/uep/struct_11/struct_11.xyz
+muon-airss-out/uep/struct_12
+muon-airss-out/uep/struct_12/struct_12.yaml
+muon-airss-out/uep/struct_12/struct_12.uep
+muon-airss-out/uep/struct_12/struct_12.uep.pkl
+muon-airss-out/uep/struct_12/struct_12.xyz
+muon-airss-out/uep/struct_13
+muon-airss-out/uep/struct_13/struct_13.yaml
+muon-airss-out/uep/struct_13/struct_13.uep
+muon-airss-out/uep/struct_13/struct_13.uep.pkl
+muon-airss-out/uep/struct_13/struct_13.xyz
+muon-airss-out/uep/struct_14
+muon-airss-out/uep/struct_14/struct_14.yaml
+muon-airss-out/uep/struct_14/struct_14.uep
+muon-airss-out/uep/struct_14/struct_14.uep.pkl
+muon-airss-out/uep/struct_14/struct_14.xyz
+muon-airss-out/uep/struct_15
+muon-airss-out/uep/struct_15/struct_15.yaml
+muon-airss-out/uep/struct_15/struct_15.uep
+muon-airss-out/uep/struct_15/struct_15.uep.pkl
+muon-airss-out/uep/struct_15/struct_15.xyz
+muon-airss-out/uep/struct_16
+muon-airss-out/uep/struct_16/struct_16.yaml
+muon-airss-out/uep/struct_16/struct_16.uep
+muon-airss-out/uep/struct_16/struct_16.uep.pkl
+muon-airss-out/uep/struct_16/struct_16.xyz
+muon-airss-out/uep/.collection