changeset 5:a19e844b82ad draft default tip

planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/openms commit 5c080b1e2b99f1c88f4557e9fec8c45c9d23b906
author galaxyp
date Fri, 14 Jun 2024 21:31:16 +0000
parents 92864c71ac6a
children
files NucleicAcidSearchEngine.xml fill_ctd_clargs.py generate-foo.sh get_tests.py macros.xml prepare_test_data_manual.sh readme.md test-data.sh
diffstat 8 files changed, 808 insertions(+), 590 deletions(-) [+]
line wrap: on
line diff
--- a/NucleicAcidSearchEngine.xml	Thu Dec 01 19:13:13 2022 +0000
+++ b/NucleicAcidSearchEngine.xml	Fri Jun 14 21:31:16 2024 +0000
@@ -1,8 +1,7 @@
-<?xml version='1.0' encoding='UTF-8'?>
 <!--This is a configuration file for the integration of a tools into Galaxy (https://galaxyproject.org/). This file was automatically generated using CTDConverter.-->
-<!--Proposed Tool Section: [Utilities]-->
+<!--Proposed Tool Section: [RNA]-->
 <tool id="NucleicAcidSearchEngine" name="NucleicAcidSearchEngine" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="21.05">
-  <description>Annotate nucleic acid identifications to MS/MS spectra.</description>
+  <description>Annotate nucleic acid identifications to MS/MS spectra</description>
   <macros>
     <token name="@EXECUTABLE@">NucleicAcidSearchEngine</token>
     <import>macros.xml</import>
@@ -15,14 +14,14 @@
 
 ## Preprocessing
 mkdir in &&
-ln -s '$in' 'in/${re.sub("[^\w\-_]", "_", $in.element_identifier)}.$gxy2omsext($in.ext)' &&
+cp '$in' 'in/${re.sub("[^\w\-_]", "_", $in.element_identifier)}.$gxy2omsext($in.ext)' &&
 #if $database:
   mkdir database &&
-  ln -s '$database' 'database/${re.sub("[^\w\-_]", "_", $database.element_identifier)}.$gxy2omsext($database.ext)' &&
+  cp '$database' 'database/${re.sub("[^\w\-_]", "_", $database.element_identifier)}.$gxy2omsext($database.ext)' &&
 #end if
 #if $digest:
   mkdir digest &&
-  ln -s '$digest' 'digest/${re.sub("[^\w\-_]", "_", $digest.element_identifier)}.$gxy2omsext($digest.ext)' &&
+  cp '$digest' 'digest/${re.sub("[^\w\-_]", "_", $digest.element_identifier)}.$gxy2omsext($digest.ext)' &&
 #end if
 mkdir out &&
 #if "id_out_FLAG" in str($OPTIONAL_OUTPUTS).split(',')
@@ -118,37 +117,37 @@
     <configfile name="hardcoded_json"><![CDATA[{"log": "log.txt", "threads": "\${GALAXY_SLOTS:-1}", "no_progress": true}]]></configfile>
   </configfiles>
   <inputs>
-    <param argument="-in" type="data" format="mzml" optional="false" label="Input file: spectra" help=" select mzml data sets(s)"/>
+    <param argument="-in" type="data" format="mzml" label="Input file: spectra" help=" select mzml data sets(s)"/>
     <param argument="-database" type="data" format="fasta" optional="true" label="Input file: sequence database" help="Required unless 'digest' is set select fasta data sets(s)"/>
     <param argument="-digest" type="data" format="sqlite" optional="true" label="Input file: pre-digested sequence database" help="Can be used instead of 'database'. Sets all 'oligo:...' parameters select sqlite data sets(s)"/>
     <section name="precursor" title="Precursor (parent ion) options" help="" expanded="false">
-      <param name="mass_tolerance" argument="-precursor:mass_tolerance" type="float" optional="true" value="10.0" label="Precursor mass tolerance (+/- around uncharged precursor mass)" help=""/>
-      <param name="mass_tolerance_unit" argument="-precursor:mass_tolerance_unit" type="select" optional="true" label="Unit of precursor mass tolerance" help="">
+      <param name="mass_tolerance" argument="-precursor:mass_tolerance" type="float" value="10.0" label="Precursor mass tolerance (+/- around uncharged precursor mass)" help=""/>
+      <param name="mass_tolerance_unit" argument="-precursor:mass_tolerance_unit" type="select" label="Unit of precursor mass tolerance" help="">
         <option value="Da">Da</option>
         <option value="ppm" selected="true">ppm</option>
         <expand macro="list_string_san" name="mass_tolerance_unit"/>
       </param>
-      <param name="min_charge" argument="-precursor:min_charge" type="integer" optional="true" value="-1" label="Minimum precursor charge to be considered" help=""/>
-      <param name="max_charge" argument="-precursor:max_charge" type="integer" optional="true" value="-20" label="Maximum precursor charge to be considered" help=""/>
+      <param name="min_charge" argument="-precursor:min_charge" type="integer" value="-1" label="Minimum precursor charge to be considered" help=""/>
+      <param name="max_charge" argument="-precursor:max_charge" type="integer" value="-20" label="Maximum precursor charge to be considered" help=""/>
       <param name="include_unknown_charge" argument="-precursor:include_unknown_charge" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Include MS2 spectra with unknown precursor charge - try to match them in any possible charge between 'min_charge' and 'max_charge', at the risk of a higher error rate" help=""/>
       <param name="use_avg_mass" argument="-precursor:use_avg_mass" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Use average instead of monoisotopic precursor masses (appropriate for low-resolution instruments)" help=""/>
       <param name="use_adducts" argument="-precursor:use_adducts" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Consider possible salt adducts (see 'precursor:potential_adducts') when matching precursor masses" help=""/>
-      <param name="potential_adducts" argument="-precursor:potential_adducts" type="text" optional="true" value="Na:+" label="Adducts considered to explain mass differences" help="Format: 'Element:Charge(+/-)', i.e. the number of '+' or '-' indicates the charge, e.g. 'Ca:++' indicates +2. Only used if 'precursor:use_adducts' is set (space separated list, in order to allow for spaces in list items surround them by single quotes)">
+      <param name="potential_adducts" argument="-precursor:potential_adducts" type="text" value="Na:+" label="Adducts considered to explain mass differences" help="Format: 'Element:Charge(+/-)', i.e. the number of '+' or '-' indicates the charge, e.g. 'Ca:++' indicates +2. Only used if 'precursor:use_adducts' is set (space separated list, in order to allow for spaces in list items surround them by single quotes)">
         <expand macro="list_string_val" name="potential_adducts"/>
         <expand macro="list_string_san" name="potential_adducts"/>
       </param>
-      <param name="isotopes" argument="-precursor:isotopes" type="text" optional="true" value="0 1 2 3 4" label="Correct for mono-isotopic peak misassignments" help="E.g.: 1 = precursor may be misassigned to the first isotopic peak. Ignored if 'use_avg_mass' is set (space separated list, in order to allow for spaces in list items surround them by single quotes)">
+      <param name="isotopes" argument="-precursor:isotopes" type="text" value="0 1 2 3 4" label="Correct for mono-isotopic peak misassignments" help="E.g.: 1 = precursor may be misassigned to the first isotopic peak. Ignored if 'use_avg_mass' is set (space separated list, in order to allow for spaces in list items surround them by single quotes)">
         <expand macro="list_integer_valsan" name="isotopes"/>
       </param>
     </section>
     <section name="fragment" title="Fragment (Product Ion) Options" help="" expanded="false">
-      <param name="mass_tolerance" argument="-fragment:mass_tolerance" type="float" optional="true" value="10.0" label="Fragment mass tolerance (+/- around fragment m/z)" help=""/>
-      <param name="mass_tolerance_unit" argument="-fragment:mass_tolerance_unit" type="select" optional="true" label="Unit of fragment mass tolerance" help="">
+      <param name="mass_tolerance" argument="-fragment:mass_tolerance" type="float" value="10.0" label="Fragment mass tolerance (+/- around fragment m/z)" help=""/>
+      <param name="mass_tolerance_unit" argument="-fragment:mass_tolerance_unit" type="select" label="Unit of fragment mass tolerance" help="">
         <option value="Da">Da</option>
         <option value="ppm" selected="true">ppm</option>
         <expand macro="list_string_san" name="mass_tolerance_unit"/>
       </param>
-      <param name="ions" argument="-fragment:ions" multiple="true" type="select" optional="true" label="Fragment ions to include in theoretical spectra" help="">
+      <param name="ions" argument="-fragment:ions" type="select" multiple="true" optional="false" label="Fragment ions to include in theoretical spectra" help="">
         <option value="a-B" selected="true">a-B</option>
         <option value="a" selected="true">a</option>
         <option value="b" selected="true">b</option>
@@ -162,182 +161,337 @@
       </param>
     </section>
     <section name="modifications" title="Modification options" help="" expanded="false">
-      <param name="variable" argument="-modifications:variable" multiple="true" type="select" optional="true" label="Variable modifications" help="">
-        <option value="m1Am">m1Am</option>
-        <option value="m1Gm">m1Gm</option>
-        <option value="m1Im">m1Im</option>
-        <option value="m1acp3Y">m1acp3Y</option>
-        <option value="m1A">m1A</option>
-        <option value="m1G">m1G</option>
-        <option value="m1I">m1I</option>
-        <option value="m1Y">m1Y</option>
-        <option value="m28A">m28A</option>
-        <option value="msms2i6A">msms2i6A</option>
-        <option value="ges2U">ges2U</option>
+      <param name="variable" argument="-modifications:variable" type="select" multiple="true" optional="true" label="Variable modifications" help="">
+        <option value="io6A">io6A</option>
+        <option value="s2U">s2U</option>
         <option value="k2C">k2C</option>
-        <option value="m2A">m2A</option>
-        <option value="ms2ct6A">ms2ct6A</option>
+        <option value="m2Gm">m2Gm</option>
+        <option value="Ym">Ym</option>
+        <option value="f5Cm">f5Cm</option>
+        <option value="Qbase">Qbase</option>
+        <option value="ac4Cm">ac4Cm</option>
+        <option value="imG-14">imG-14</option>
+        <option value="cm5s2U">cm5s2U</option>
+        <option value="mnm5s2U">mnm5s2U</option>
+        <option value="m227G">m227G</option>
+        <option value="yW-58">yW-58</option>
+        <option value="I">I</option>
+        <option value="g6A">g6A</option>
+        <option value="nm5U">nm5U</option>
+        <option value="m7G">m7G</option>
+        <option value="s2Um">s2Um</option>
+        <option value="Y">Y</option>
+        <option value="hm5C">hm5C</option>
+        <option value="m5U">m5U</option>
+        <option value="preQ0">preQ0</option>
+        <option value="o2yW">o2yW</option>
+        <option value="m5Um">m5Um</option>
+        <option value="preQ1">preQ1</option>
+        <option value="m66Am">m66Am</option>
+        <option value="ac6A">ac6A</option>
         <option value="ms2io6A">ms2io6A</option>
-        <option value="ms2hn6A">ms2hn6A</option>
-        <option value="ms2i6A">ms2i6A</option>
-        <option value="ms2m6A">ms2m6A</option>
-        <option value="ms2t6A">ms2t6A</option>
-        <option value="se2U">se2U</option>
-        <option value="s2Um">s2Um</option>
-        <option value="s2C">s2C</option>
-        <option value="s2U">s2U</option>
         <option value="Am">Am</option>
-        <option value="Cm">Cm</option>
-        <option value="Gm">Gm</option>
         <option value="Im">Im</option>
-        <option value="Ym">Ym</option>
-        <option value="Um">Um</option>
-        <option value="mcmo5Um">mcmo5Um</option>
-        <option value="Ar(p)">Ar(p)</option>
-        <option value="Gr(p)">Gr(p)</option>
-        <option value="(pN)2'3'&gt;p">(pN)2'3'&gt;p</option>
-        <option value="hm5Cm">hm5Cm</option>
-        <option value="m3Um">m3Um</option>
+        <option value="mnm5U">mnm5U</option>
+        <option value="m22G">m22G</option>
+        <option value="t6A">t6A</option>
+        <option value="m8A">m8A</option>
+        <option value="m7GpppN">m7GpppN</option>
+        <option value="m27GpppN">m27GpppN</option>
+        <option value="m227GpppN">m227GpppN</option>
+        <option value="mpppN">mpppN</option>
+        <option value="m28A">m28A</option>
         <option value="acp3D">acp3D</option>
         <option value="acp3Y">acp3Y</option>
-        <option value="acp3U">acp3U</option>
-        <option value="m3C">m3C</option>
+        <option value="imG">imG</option>
+        <option value="D">D</option>
+        <option value="N">N</option>
+        <option value="C+">C+</option>
+        <option value="m27Gm">m27Gm</option>
+        <option value="ho5C">ho5C</option>
+        <option value="inm5U">inm5U</option>
+        <option value="inm5Um">inm5Um</option>
+        <option value="inm5s2U">inm5s2U</option>
+        <option value="pppN">pppN</option>
+        <option value="GpppN">GpppN</option>
+        <option value="CoApN">CoApN</option>
+        <option value="m44C">m44C</option>
+        <option value="acCoApN">acCoApN</option>
+        <option value="malonyl-CoApN">malonyl-CoApN</option>
+        <option value="succinyl-CoApN">succinyl-CoApN</option>
+        <option value="ppN">ppN</option>
+        <option value="NADpN">NADpN</option>
+        <option value="m6t6A">m6t6A</option>
+        <option value="OHyWy">OHyWy</option>
+        <option value="pG(pN)">pG(pN)</option>
+        <option value="ncm5s2U">ncm5s2U</option>
+        <option value="nchm5U">nchm5U</option>
+        <option value="mchm5Um">mchm5Um</option>
+        <option value="pN">pN</option>
+        <option value="ges2U">ges2U</option>
+        <option value="cmnm5ges2U">cmnm5ges2U</option>
+        <option value="mnm5ges2U">mnm5ges2U</option>
+        <option value="nm5ges2U">nm5ges2U</option>
+        <option value="m5D">m5D</option>
+        <option value="mmpN">mmpN</option>
+        <option value="mpN">mpN</option>
+        <option value="5'-OH-N">5'-OH-N</option>
+        <option value="N2'3'cp">N2'3'cp</option>
+        <option value="ct6A">ct6A</option>
+        <option value="hm6A">hm6A</option>
+        <option value="f6A">f6A</option>
+        <option value="cnm5U">cnm5U</option>
+        <option value="mcmo5Um">mcmo5Um</option>
+        <option value="m5C">m5C</option>
+        <option value="ms2ct6A">ms2ct6A</option>
+        <option value="ht6A">ht6A</option>
+        <option value="msms2i6A">msms2i6A</option>
+        <option value="hm5Cm">hm5Cm</option>
+        <option value="pY">pY</option>
+        <option value="pm5C">pm5C</option>
+        <option value="ps2U">ps2U</option>
+        <option value="hn6A">hn6A</option>
+        <option value="pD">pD</option>
+        <option value="pm2G">pm2G</option>
+        <option value="pm66A">pm66A</option>
+        <option value="pGm">pGm</option>
+        <option value="pm5U">pm5U</option>
+        <option value="pm22G">pm22G</option>
+        <option value="pm3U">pm3U</option>
+        <option value="m5Cm">m5Cm</option>
+        <option value="Ar(p)">Ar(p)</option>
+        <option value="pac4C">pac4C</option>
+        <option value="pCm">pCm</option>
+        <option value="pppG">pppG</option>
+        <option value="pm7G">pm7G</option>
+        <option value="pm1A">pm1A</option>
+        <option value="pUm">pUm</option>
+        <option value="pAm">pAm</option>
+        <option value="pm4Cm">pm4Cm</option>
+        <option value="pC2'3'cp">pC2'3'cp</option>
+        <option value="tm5U">tm5U</option>
+        <option value="pm6A">pm6A</option>
+        <option value="pyW">pyW</option>
+        <option value="pm1G">pm1G</option>
+        <option value="pA2'3'cp">pA2'3'cp</option>
+        <option value="ps4U">ps4U</option>
+        <option value="pI">pI</option>
+        <option value="ppG">ppG</option>
+        <option value="pm2A">pm2A</option>
+        <option value="m1G">m1G</option>
+        <option value="pmcm5s2U">pmcm5s2U</option>
+        <option value="cmnm5Um">cmnm5Um</option>
+        <option value="pse2U">pse2U</option>
+        <option value="pt6A">pt6A</option>
+        <option value="pf5C">pf5C</option>
+        <option value="pppA">pppA</option>
+        <option value="pG">pG</option>
+        <option value="pG2'3'cp">pG2'3'cp</option>
+        <option value="pms2i6A">pms2i6A</option>
+        <option value="pcmo5U">pcmo5U</option>
+        <option value="Xm">Xm</option>
+        <option value="pm44C">pm44C</option>
+        <option value="pi6A">pi6A</option>
+        <option value="phm5C">phm5C</option>
+        <option value="pU">pU</option>
+        <option value="pAr(p)">pAr(p)</option>
+        <option value="pac4Cm">pac4Cm</option>
+        <option value="pGp">pGp</option>
+        <option value="m1I">m1I</option>
+        <option value="pU2'3'cp">pU2'3'cp</option>
+        <option value="mcm5U">mcm5U</option>
+        <option value="Gm">Gm</option>
+        <option value="pm4C">pm4C</option>
+        <option value="ncm5Um">ncm5Um</option>
+        <option value="pm5Um">pm5Um</option>
+        <option value="pmnm5U">pmnm5U</option>
+        <option value="pm3C">pm3C</option>
+        <option value="m5s2U">m5s2U</option>
+        <option value="yW">yW</option>
+        <option value="pC">pC</option>
+        <option value="pm6t6A">pm6t6A</option>
+        <option value="f5C">f5C</option>
+        <option value="pAp">pAp</option>
+        <option value="m1Am">m1Am</option>
+        <option value="m1Im">m1Im</option>
+        <option value="ApppN">ApppN</option>
+        <option value="AppppN">AppppN</option>
+        <option value="ApppppN">ApppppN</option>
+        <option value="m6ApppN">m6ApppN</option>
+        <option value="m6AppppN">m6AppppN</option>
+        <option value="m6ApppppN">m6ApppppN</option>
+        <option value="m7GppppN">m7GppppN</option>
+        <option value="Gr(p)">Gr(p)</option>
+        <option value="pm1Am">pm1Am</option>
+        <option value="pm1Gm">pm1Gm</option>
+        <option value="pm1Im">pm1Im</option>
+        <option value="pm1acp3Y">pm1acp3Y</option>
+        <option value="pm1I">pm1I</option>
+        <option value="pm1Y">pm1Y</option>
+        <option value="pk2C">pk2C</option>
+        <option value="ps2C">ps2C</option>
+        <option value="pm3Y">pm3Y</option>
+        <option value="nm5s2U">nm5s2U</option>
+        <option value="pm5Cm">pm5Cm</option>
+        <option value="pmchm5U">pmchm5U</option>
+        <option value="pinm5Um">pinm5Um</option>
+        <option value="pinm5s2U">pinm5s2U</option>
+        <option value="pinm5U">pinm5U</option>
+        <option value="pnm5U">pnm5U</option>
+        <option value="pncm5U">pncm5U</option>
+        <option value="pchm5U">pchm5U</option>
+        <option value="pcmnm5U">pcmnm5U</option>
+        <option value="pcm5U">pcm5U</option>
+        <option value="m2G">m2G</option>
+        <option value="pho5U">pho5U</option>
+        <option value="pmcm5Um">pmcm5Um</option>
+        <option value="pmcm5U">pmcm5U</option>
+        <option value="pmo5U">pmo5U</option>
+        <option value="pm5D">pm5D</option>
+        <option value="pmimG">pmimG</option>
+        <option value="phm5Cm">phm5Cm</option>
+        <option value="pIm">pIm</option>
+        <option value="pYm">pYm</option>
+        <option value="pmcmo5Um">pmcmo5Um</option>
+        <option value="m2A">m2A</option>
+        <option value="pGr(p)">pGr(p)</option>
+        <option value="pm28A">pm28A</option>
+        <option value="pmsms2i6A">pmsms2i6A</option>
+        <option value="pges2U">pges2U</option>
+        <option value="pms2ct6A">pms2ct6A</option>
+        <option value="pms2io6A">pms2io6A</option>
+        <option value="pms2hn6A">pms2hn6A</option>
+        <option value="pms2m6A">pms2m6A</option>
+        <option value="pms2t6A">pms2t6A</option>
+        <option value="ps2Um">ps2Um</option>
+        <option value="pm3Um">pm3Um</option>
+        <option value="pacp3D">pacp3D</option>
+        <option value="pacp3U">pacp3U</option>
+        <option value="pimG-14">pimG-14</option>
+        <option value="pmchm5Um">pmchm5Um</option>
+        <option value="pnm5ges2U">pnm5ges2U</option>
+        <option value="pnm5se2U">pnm5se2U</option>
+        <option value="pnm5s2U">pnm5s2U</option>
+        <option value="pnchm5U">pnchm5U</option>
+        <option value="pncm5Um">pncm5Um</option>
+        <option value="m4Cm">m4Cm</option>
+        <option value="pncm5s2U">pncm5s2U</option>
+        <option value="pcm5s2U">pcm5s2U</option>
+        <option value="pcmnm5Um">pcmnm5Um</option>
+        <option value="pcmnm5ges2U">pcmnm5ges2U</option>
+        <option value="pcmnm5se2U">pcmnm5se2U</option>
+        <option value="pcmnm5s2U">pcmnm5s2U</option>
+        <option value="pcnm5U">pcnm5U</option>
+        <option value="pf5Cm">pf5Cm</option>
+        <option value="pho5C">pho5C</option>
+        <option value="pm5s2U">pm5s2U</option>
+        <option value="m27G">m27G</option>
+        <option value="m22Gm">m22Gm</option>
+        <option value="pmnm5ges2U">pmnm5ges2U</option>
+        <option value="pmnm5se2U">pmnm5se2U</option>
+        <option value="pmnm5s2U">pmnm5s2U</option>
+        <option value="ptm5s2U">ptm5s2U</option>
+        <option value="ptm5U">ptm5U</option>
+        <option value="pyW-86">pyW-86</option>
+        <option value="pyW-72">pyW-72</option>
+        <option value="pyW-58">pyW-58</option>
+        <option value="ppreQ1">ppreQ1</option>
+        <option value="ppreQ0">ppreQ0</option>
+        <option value="m66A">m66A</option>
+        <option value="pm8A">pm8A</option>
+        <option value="pC+">pC+</option>
+        <option value="pG+">pG+</option>
+        <option value="pct6A">pct6A</option>
+        <option value="poQ">poQ</option>
+        <option value="pgalQ">pgalQ</option>
+        <option value="pgluQ">pgluQ</option>
+        <option value="pht6A">pht6A</option>
+        <option value="pOHyW">pOHyW</option>
+        <option value="pimG2">pimG2</option>
+        <option value="gluQ">gluQ</option>
+        <option value="pmanQ">pmanQ</option>
+        <option value="pOHyWy">pOHyWy</option>
+        <option value="pm27Gm">pm27Gm</option>
+        <option value="pQ">pQ</option>
+        <option value="pOHyWx">pOHyWx</option>
+        <option value="pmcmo5U">pmcmo5U</option>
+        <option value="pimG">pimG</option>
+        <option value="pm44Cm">pm44Cm</option>
+        <option value="pm2Gm">pm2Gm</option>
+        <option value="pm22Gm">pm22Gm</option>
+        <option value="ncm5U">ncm5U</option>
+        <option value="pm6Am">pm6Am</option>
+        <option value="pm66Am">pm66Am</option>
+        <option value="pio6A">pio6A</option>
+        <option value="pac6A">pac6A</option>
+        <option value="pf6A">pf6A</option>
+        <option value="pg6A">pg6A</option>
+        <option value="phm6A">phm6A</option>
+        <option value="phn6A">phn6A</option>
+        <option value="cm5U">cm5U</option>
+        <option value="pm27G">pm27G</option>
+        <option value="pm227G">pm227G</option>
+        <option value="pA">pA</option>
+        <option value="cmnm5s2U">cmnm5s2U</option>
+        <option value="cmo5U">cmo5U</option>
         <option value="m3Y">m3Y</option>
         <option value="m3U">m3U</option>
-        <option value="imG-14">imG-14</option>
-        <option value="s4U">s4U</option>
-        <option value="m5Cm">m5Cm</option>
-        <option value="m5Um">m5Um</option>
-        <option value="mchm5Um">mchm5Um</option>
-        <option value="mchm5U">mchm5U</option>
-        <option value="inm5s2U">inm5s2U</option>
-        <option value="inm5Um">inm5Um</option>
-        <option value="inm5U">inm5U</option>
-        <option value="nm5ges2U">nm5ges2U</option>
-        <option value="nm5se2U">nm5se2U</option>
-        <option value="nm5s2U">nm5s2U</option>
-        <option value="nm5U">nm5U</option>
-        <option value="nchm5U">nchm5U</option>
-        <option value="ncm5s2U">ncm5s2U</option>
-        <option value="ncm5Um">ncm5Um</option>
-        <option value="ncm5U">ncm5U</option>
-        <option value="chm5U">chm5U</option>
-        <option value="cm5s2U">cm5s2U</option>
-        <option value="cmnm5ges2U">cmnm5ges2U</option>
+        <option value="ms2m6A">ms2m6A</option>
+        <option value="Um">Um</option>
+        <option value="ms2i6A">ms2i6A</option>
+        <option value="m3C">m3C</option>
         <option value="cmnm5se2U">cmnm5se2U</option>
-        <option value="cmnm5s2U">cmnm5s2U</option>
-        <option value="cmnm5Um">cmnm5Um</option>
-        <option value="cmnm5U">cmnm5U</option>
-        <option value="cm5U">cm5U</option>
-        <option value="cnm5U">cnm5U</option>
-        <option value="f5Cm">f5Cm</option>
-        <option value="f5C">f5C</option>
-        <option value="ho5C">ho5C</option>
-        <option value="hm5C">hm5C</option>
+        <option value="ms2t6A">ms2t6A</option>
+        <option value="i6A">i6A</option>
+        <option value="m3Um">m3Um</option>
+        <option value="mcmo5U">mcmo5U</option>
+        <option value="mimG">mimG</option>
+        <option value="oQ">oQ</option>
+        <option value="preQ1base">preQ1base</option>
+        <option value="nm5se2U">nm5se2U</option>
+        <option value="m1Gm">m1Gm</option>
         <option value="ho5U">ho5U</option>
+        <option value="Q">Q</option>
+        <option value="xG">xG</option>
         <option value="mcm5s2U">mcm5s2U</option>
-        <option value="mcm5Um">mcm5Um</option>
-        <option value="mcm5U">mcm5U</option>
+        <option value="m44Cm">m44Cm</option>
+        <option value="s4U">s4U</option>
+        <option value="xC">xC</option>
+        <option value="yW-86">yW-86</option>
+        <option value="xA">xA</option>
+        <option value="chm5U">chm5U</option>
         <option value="mo5U">mo5U</option>
-        <option value="m5s2U">m5s2U</option>
-        <option value="mnm5ges2U">mnm5ges2U</option>
-        <option value="mnm5se2U">mnm5se2U</option>
-        <option value="mnm5s2U">mnm5s2U</option>
-        <option value="mnm5U">mnm5U</option>
-        <option value="m5C">m5C</option>
-        <option value="m5D">m5D</option>
-        <option value="m5U">m5U</option>
-        <option value="tm5s2U">tm5s2U</option>
-        <option value="tm5U">tm5U</option>
-        <option value="CoA(pN)">CoA(pN)</option>
-        <option value="acCoA(pN)">acCoA(pN)</option>
-        <option value="malonyl-CoA(pN)">malonyl-CoA(pN)</option>
-        <option value="succinyl-CoA(pN)">succinyl-CoA(pN)</option>
-        <option value="p(pN)">p(pN)</option>
-        <option value="5'-OH-N">5'-OH-N</option>
-        <option value="(pN)">(pN)</option>
-        <option value="NAD(pN)">NAD(pN)</option>
-        <option value="pp(pN)">pp(pN)</option>
-        <option value="yW-86">yW-86</option>
+        <option value="acp3U">acp3U</option>
+        <option value="xU">xU</option>
         <option value="yW-72">yW-72</option>
-        <option value="yW-58">yW-58</option>
-        <option value="preQ1tRNA">preQ1tRNA</option>
-        <option value="preQ0tRNA">preQ0tRNA</option>
-        <option value="m7G">m7G</option>
-        <option value="m7Gpp(pN)">m7Gpp(pN)</option>
-        <option value="m8A">m8A</option>
-        <option value="m2Gm">m2Gm</option>
-        <option value="m27Gm">m27Gm</option>
-        <option value="m27G">m27G</option>
-        <option value="m27Gpp(pN)">m27Gpp(pN)</option>
-        <option value="m22Gm">m22Gm</option>
-        <option value="m227G">m227G</option>
-        <option value="m227Gpp(pN)">m227Gpp(pN)</option>
-        <option value="m22G">m22G</option>
-        <option value="m2G">m2G</option>
-        <option value="m4Cm">m4Cm</option>
-        <option value="m44Cm">m44Cm</option>
-        <option value="m44C">m44C</option>
-        <option value="ac4Cm">ac4Cm</option>
+        <option value="mnm5se2U">mnm5se2U</option>
+        <option value="ms2hn6A">ms2hn6A</option>
+        <option value="m1acp3Y">m1acp3Y</option>
+        <option value="mcm5Um">mcm5Um</option>
         <option value="ac4C">ac4C</option>
+        <option value="m6Am">m6Am</option>
+        <option value="m1A">m1A</option>
+        <option value="Cm">Cm</option>
+        <option value="mchm5U">mchm5U</option>
+        <option value="galQ">galQ</option>
+        <option value="cmnm5U">cmnm5U</option>
+        <option value="m1Y">m1Y</option>
+        <option value="imG2">imG2</option>
         <option value="m4C">m4C</option>
-        <option value="m6Am">m6Am</option>
-        <option value="m66Am">m66Am</option>
-        <option value="m66A">m66A</option>
-        <option value="io6A">io6A</option>
-        <option value="ac6A">ac6A</option>
-        <option value="f6A">f6A</option>
-        <option value="g6A">g6A</option>
-        <option value="hm6A">hm6A</option>
-        <option value="hn6A">hn6A</option>
-        <option value="i6A">i6A</option>
-        <option value="m6t6A">m6t6A</option>
+        <option value="manQ">manQ</option>
+        <option value="tm5s2U">tm5s2U</option>
+        <option value="s2C">s2C</option>
+        <option value="OHyWx">OHyWx</option>
+        <option value="se2U">se2U</option>
+        <option value="preQ0base">preQ0base</option>
         <option value="m6A">m6A</option>
-        <option value="t6A">t6A</option>
-        <option value="Qbase">Qbase</option>
-        <option value="C+">C+</option>
-        <option value="mm(pN)">mm(pN)</option>
-        <option value="m(pN)">m(pN)</option>
+        <option value="OHyW">OHyW</option>
+        <option value="xX">xX</option>
         <option value="G+">G+</option>
-        <option value="ct6A">ct6A</option>
-        <option value="D">D</option>
-        <option value="oQ">oQ</option>
-        <option value="galQ">galQ</option>
-        <option value="mpp(pN)">mpp(pN)</option>
-        <option value="gluQ">gluQ</option>
-        <option value="pG(pN)">pG(pN)</option>
-        <option value="Gpp(pN)">Gpp(pN)</option>
-        <option value="ht6A">ht6A</option>
-        <option value="OHyW">OHyW</option>
-        <option value="I">I</option>
-        <option value="imG2">imG2</option>
-        <option value="manQ">manQ</option>
-        <option value="OHyWy">OHyWy</option>
-        <option value="mimG">mimG</option>
-        <option value="o2yW">o2yW</option>
-        <option value="preQ0base">preQ0base</option>
-        <option value="preQ1base">preQ1base</option>
-        <option value="Y">Y</option>
-        <option value="Q">Q</option>
-        <option value="OHyWx">OHyWx</option>
-        <option value="Xm">Xm</option>
-        <option value="xX">xX</option>
-        <option value="xA">xA</option>
-        <option value="xC">xC</option>
-        <option value="xG">xG</option>
-        <option value="xU">xU</option>
-        <option value="N">N</option>
-        <option value="cmo5U">cmo5U</option>
-        <option value="mcmo5U">mcmo5U</option>
-        <option value="yW">yW</option>
-        <option value="imG">imG</option>
-        <option value="dA">dA</option>
-        <option value="dC">dC</option>
-        <option value="dG">dG</option>
-        <option value="dU">dU</option>
-        <option value="dT">dT</option>
         <option value="3'-p">3'-p</option>
         <option value="5'-p">5'-p</option>
+        <option value="5'-p*">5'-p*</option>
+        <option value="3'-c">3'-c</option>
         <option value="mA">mA</option>
         <option value="mC">mC</option>
         <option value="mG">mG</option>
@@ -365,43 +519,57 @@
         <option value="mmmG?">mmmG?</option>
         <option value="ac4C/f5Cm?">ac4C/f5Cm?</option>
         <option value="acp3U/cmnm5Um?">acp3U/cmnm5Um?</option>
+        <option value="dA">dA</option>
+        <option value="dC">dC</option>
+        <option value="dG">dG</option>
+        <option value="dU">dU</option>
+        <option value="dT">dT</option>
+        <option value="A*">A*</option>
+        <option value="C*">C*</option>
+        <option value="G*">G*</option>
+        <option value="U*">U*</option>
+        <option value="dA*">dA*</option>
+        <option value="dC*">dC*</option>
+        <option value="dG*">dG*</option>
+        <option value="dU*">dU*</option>
+        <option value="dT*">dT*</option>
         <expand macro="list_string_san" name="variable"/>
       </param>
-      <param name="variable_max_per_oligo" argument="-modifications:variable_max_per_oligo" type="integer" optional="true" value="2" label="Maximum number of residues carrying a variable modification per candidate oligonucleotide" help=""/>
+      <param name="variable_max_per_oligo" argument="-modifications:variable_max_per_oligo" type="integer" value="2" label="Maximum number of residues carrying a variable modification per candidate oligonucleotide" help=""/>
       <param name="resolve_ambiguities" argument="-modifications:resolve_ambiguities" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Attempt to resolve ambiguous modifications" help="(e.g. 'mA?' for 'mA'/'Am') based on a-B ions.. This incurs a performance cost because two modifications have to be considered for each case.. Requires a-B ions to be enabled in parameter 'fragment:ions'"/>
     </section>
     <section name="oligo" title="Oligonucleotide (digestion) options (ignored if 'digest' input is used)" help="" expanded="false">
-      <param name="min_size" argument="-oligo:min_size" type="integer" optional="true" value="5" label="Minimum size an oligonucleotide must have after digestion to be considered in the search" help=""/>
-      <param name="max_size" argument="-oligo:max_size" type="integer" optional="true" value="0" label="Maximum size an oligonucleotide must have after digestion to be considered in the search, leave at 0 for no limit" help=""/>
-      <param name="missed_cleavages" argument="-oligo:missed_cleavages" type="integer" optional="true" value="1" label="Number of missed cleavages" help=""/>
-      <param name="enzyme" argument="-oligo:enzyme" type="select" optional="true" label="The enzyme used for RNA digestion" help="">
-        <option value="RNase_T1">RNase_T1</option>
-        <option value="cusativin">cusativin</option>
+      <param name="min_size" argument="-oligo:min_size" type="integer" value="5" label="Minimum size an oligonucleotide must have after digestion to be considered in the search" help=""/>
+      <param name="max_size" argument="-oligo:max_size" type="integer" value="0" label="Maximum size an oligonucleotide must have after digestion to be considered in the search, leave at 0 for no limit" help=""/>
+      <param name="missed_cleavages" argument="-oligo:missed_cleavages" type="integer" value="1" label="Number of missed cleavages" help=""/>
+      <param name="enzyme" argument="-oligo:enzyme" type="select" label="The enzyme used for RNA digestion" help="">
+        <option value="RNase_A">RNase_A</option>
+        <option value="RNase_MC1">RNase_MC1</option>
         <option value="RNase_H">RNase_H</option>
         <option value="mazF">mazF</option>
+        <option value="cusativin">cusativin</option>
+        <option value="RNase_T1">RNase_T1</option>
         <option value="colicin_E5">colicin_E5</option>
         <option value="no cleavage" selected="true">no cleavage</option>
+        <option value="unspecific cleavage">unspecific cleavage</option>
         <option value="RNase_U2">RNase_U2</option>
-        <option value="RNase_A">RNase_A</option>
-        <option value="RNase_MC1">RNase_MC1</option>
-        <option value="unspecific cleavage">unspecific cleavage</option>
         <expand macro="list_string_san" name="enzyme"/>
       </param>
     </section>
     <section name="report" title="Reporting Options" help="" expanded="false">
-      <param name="top_hits" argument="-report:top_hits" type="integer" optional="true" min="0" value="1" label="Maximum number of top-scoring hits per spectrum that are reported ('0' for all hits)" help=""/>
+      <param name="top_hits" argument="-report:top_hits" type="integer" min="0" value="1" label="Maximum number of top-scoring hits per spectrum that are reported ('0' for all hits)" help=""/>
     </section>
     <section name="fdr" title="False Discovery Rate options" help="" expanded="false">
       <param name="decoy_pattern" argument="-fdr:decoy_pattern" type="text" optional="true" value="" label="String used as part of the accession to annotate decoy sequences" help="(e.g. 'DECOY_'). Leave empty to skip the FDR/q-value calculation">
         <expand macro="list_string_san" name="decoy_pattern"/>
       </param>
-      <param name="cutoff" argument="-fdr:cutoff" type="float" optional="true" min="0.0" max="1.0" value="1.0" label="Cut-off for FDR filtering; search hits with higher q-values will be removed" help=""/>
+      <param name="cutoff" argument="-fdr:cutoff" type="float" min="0.0" max="1.0" value="1.0" label="Cut-off for FDR filtering; search hits with higher q-values will be removed" help=""/>
       <param name="remove_decoys" argument="-fdr:remove_decoys" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Do not score hits to decoy sequences and remove them when filtering" help=""/>
     </section>
     <expand macro="adv_opts_macro">
       <param argument="-decharge_ms2" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Decharge the MS2 spectra for scoring" help=""/>
       <param argument="-force" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Overrides tool-specific checks" help=""/>
-      <param argument="-test" type="hidden" optional="true" value="False" label="Enables the test mode (needed for internal use only)" help="">
+      <param argument="-test" type="hidden" value="False" label="Enables the test mode (needed for internal use only)" help="" optional="true">
         <expand macro="list_string_san" name="test"/>
       </param>
     </expand>
@@ -439,7 +607,8 @@
       <filter>OPTIONAL_OUTPUTS is not None and "ctd_out_FLAG" in OPTIONAL_OUTPUTS</filter>
     </data>
   </outputs>
-  <tests><!-- UTILS_NucleicAcidSearchEngine_1 -->
+  <tests>
+    <!-- TOPP_NucleicAcidSearchEngine_1 -->
     <test expect_num_outputs="5">
       <section name="adv_opts">
         <param name="decharge_ms2" value="false"/>
@@ -448,10 +617,10 @@
       </section>
       <param name="in" value="NucleicAcidSearchEngine_1.mzML"/>
       <param name="database" value="NucleicAcidSearchEngine_1.fasta"/>
-      <output name="out" file="NucleicAcidSearchEngine_12_out.mzTab" compare="sim_size" delta_frac="0.7" ftype="mztab"/>
-      <output name="id_out" file="NucleicAcidSearchEngine_11_out.idXML" compare="sim_size" delta_frac="0.7" ftype="idxml"/>
-      <output name="db_out" file="NucleicAcidSearchEngine_13_out.tmp" compare="sim_size" delta_frac="0.7" ftype="sqlite"/>
-      <output name="digest_out" file="NucleicAcidSearchEngine_1_digest.oms" compare="sim_size" delta_frac="0.7" ftype="sqlite"/>
+      <output name="out" value="NucleicAcidSearchEngine_12_out.mzTab" compare="sim_size" delta_frac="0.7" ftype="mztab"/>
+      <output name="id_out" value="NucleicAcidSearchEngine_11_out.idXML" compare="sim_size" delta_frac="0.7" ftype="idxml"/>
+      <output name="db_out" value="NucleicAcidSearchEngine_13_out.tmp" compare="sim_size" delta_frac="0.7" ftype="sqlite"/>
+      <output name="digest_out" value="NucleicAcidSearchEngine_1_digest.oms" compare="sim_size" delta_frac="0.7" ftype="sqlite"/>
       <section name="precursor">
         <param name="mass_tolerance" value="5.0"/>
         <param name="mass_tolerance_unit" value="ppm"/>
@@ -459,7 +628,7 @@
         <param name="max_charge" value="-14"/>
         <param name="include_unknown_charge" value="true"/>
         <param name="use_avg_mass" value="false"/>
-        <param name="use_adducts" value="false"/>
+        <param name="use_adducts" value="true"/>
         <param name="potential_adducts" value="&quot;K:+&quot; &quot;Na:+&quot; &quot;Na2:++&quot; &quot;K2:++&quot; &quot;NaK:++&quot; &quot;K3:+++&quot; &quot;Na3:+++&quot; &quot;NaK2:+++&quot; &quot;Na2K:+++&quot;"/>
         <param name="isotopes" value="0 1 2"/>
       </section>
@@ -469,7 +638,6 @@
         <param name="ions" value="a-B,c,w,y"/>
       </section>
       <section name="modifications">
-        <param name="variable"/>
         <param name="variable_max_per_oligo" value="2"/>
         <param name="resolve_ambiguities" value="false"/>
       </section>
@@ -493,8 +661,11 @@
           <is_valid_xml/>
         </assert_contents>
       </output>
+      <assert_stdout>
+        <has_text_matching expression="@EXECUTABLE@ took .* \(wall\), .* \(CPU\), .* \(system\), .* \(user\)(; Peak Memory Usage: 32 MB)?."/>
+      </assert_stdout>
     </test>
-    <!-- UTILS_NucleicAcidSearchEngine_2 -->
+    <!-- TOPP_NucleicAcidSearchEngine_2 -->
     <test expect_num_outputs="4">
       <section name="adv_opts">
         <param name="decharge_ms2" value="false"/>
@@ -503,9 +674,9 @@
       </section>
       <param name="in" value="NucleicAcidSearchEngine_1.mzML"/>
       <param name="digest" value="NucleicAcidSearchEngine_1_digest.oms"/>
-      <output name="out" file="NucleicAcidSearchEngine_12_out.mzTab" compare="sim_size" delta_frac="0.7" ftype="mztab"/>
-      <output name="id_out" file="NucleicAcidSearchEngine_11_out.idXML" compare="sim_size" delta_frac="0.7" ftype="idxml"/>
-      <output name="db_out" file="NucleicAcidSearchEngine_23_out.tmp" compare="sim_size" delta_frac="0.7" ftype="sqlite"/>
+      <output name="out" value="NucleicAcidSearchEngine_12_out.mzTab" compare="sim_size" delta_frac="0.7" ftype="mztab"/>
+      <output name="id_out" value="NucleicAcidSearchEngine_11_out.idXML" compare="sim_size" delta_frac="0.7" ftype="idxml"/>
+      <output name="db_out" value="NucleicAcidSearchEngine_23_out.tmp" compare="sim_size" delta_frac="0.7" ftype="sqlite"/>
       <section name="precursor">
         <param name="mass_tolerance" value="5.0"/>
         <param name="mass_tolerance_unit" value="ppm"/>
@@ -513,7 +684,7 @@
         <param name="max_charge" value="-14"/>
         <param name="include_unknown_charge" value="true"/>
         <param name="use_avg_mass" value="false"/>
-        <param name="use_adducts" value="false"/>
+        <param name="use_adducts" value="true"/>
         <param name="potential_adducts" value="&quot;K:+&quot; &quot;Na:+&quot; &quot;Na2:++&quot; &quot;K2:++&quot; &quot;NaK:++&quot; &quot;K3:+++&quot; &quot;Na3:+++&quot; &quot;NaK2:+++&quot; &quot;Na2K:+++&quot;"/>
         <param name="isotopes" value="0 1 2"/>
       </section>
@@ -523,7 +694,6 @@
         <param name="ions" value="a-B,c,w,y"/>
       </section>
       <section name="modifications">
-        <param name="variable"/>
         <param name="variable_max_per_oligo" value="2"/>
         <param name="resolve_ambiguities" value="false"/>
       </section>
@@ -547,11 +717,14 @@
           <is_valid_xml/>
         </assert_contents>
       </output>
+      <assert_stdout>
+        <has_text_matching expression="@EXECUTABLE@ took .* \(wall\), .* \(CPU\), .* \(system\), .* \(user\)(; Peak Memory Usage: 32 MB)?."/>
+      </assert_stdout>
     </test>
   </tests>
   <help><![CDATA[Annotate nucleic acid identifications to MS/MS spectra.
 
 
-For more information, visit http://www.openms.de/doxygen/release/2.8.0/html/UTILS_NucleicAcidSearchEngine.html]]></help>
+For more information, visit https://openms.de/doxygen/release/3.1.0/html/TOPP_NucleicAcidSearchEngine.html]]></help>
   <expand macro="references"/>
 </tool>
--- a/fill_ctd_clargs.py	Thu Dec 01 19:13:13 2022 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-#!/usr/bin/env python3
-
-import operator
-from argparse import ArgumentParser
-from functools import reduce  # forward compatibility for Python 3
-from io import StringIO
-
-from CTDopts.CTDopts import (
-    _Null,
-    CTDModel,
-    ModelTypeError,
-    Parameters
-)
-
-
-def getFromDict(dataDict, mapList):
-    return reduce(operator.getitem, mapList, dataDict)
-
-
-def setInDict(dataDict, mapList, value):
-    getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value
-
-
-if __name__ == "__main__":
-    # note add_help=False since otherwise arguments starting with -h will
-    # trigger an error (despite allow_abbreviate)
-    parser = ArgumentParser(prog="fill_ctd_clargs",
-                            description="fill command line arguments"
-                            "into a CTD file and write the CTD file to stdout",
-                            add_help=False, allow_abbrev=False)
-    parser.add_argument("--ini_file", dest="ini_file", help="input ini file",
-                        metavar='INI', default=None, required=True)
-    parser.add_argument("--ctd_file", dest="ctd_file", help="input ctd file"
-                        "if given then optional parameters from the ini file"
-                        "will be filled with the defaults from this CTD file",
-                        metavar='CTD', default=None, required=False)
-    args, cliargs = parser.parse_known_args()
-
-    # load CTDModel
-    ini_model = None
-    try:
-        ini_model = CTDModel(from_file=args.ini_file)
-    except ModelTypeError:
-        pass
-    try:
-        ini_model = Parameters(from_file=args.ini_file)
-    except ModelTypeError:
-        pass
-    assert ini_model is not None, "Could not parse %s, seems to be no CTD/PARAMS" % (args.ini_file)
-
-    # get a dictionary of the ctd arguments where the values of the parameters
-    # given on the command line are overwritten
-    ini_values = ini_model.parse_cl_args(cl_args=cliargs, ignore_required=True)
-
-    if args.ctd_file:
-        ctd_model = CTDModel(from_file=args.ctd_file)
-        ctd_values = ctd_model.get_defaults()
-        for param in ini_model.get_parameters():
-            if not param.required and (param.default is None or type(param.default) is _Null):
-                lineage = param.get_lineage(name_only=True)
-                try:
-                    default = getFromDict(ctd_values, lineage)
-                except KeyError:
-                    continue
-                setInDict(ini_values, lineage, default)
-
-    # write the ctd with the values taken from the dictionary
-    out = StringIO()
-    ctd_tree = ini_model.write_ctd(out, ini_values)
-    print(out.getvalue())
--- a/generate-foo.sh	Thu Dec 01 19:13:13 2022 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-#!/usr/bin/env bash
-
-# parse test definitions from OpenMS sources for a tool with a given id
-function get_tests2 {
-    id=$1
-    >&2 echo "generate tests for $id"
-    echo '<xml name="autotest_'"$id"'">'
-
-    # get the tests from the CMakeLists.txt
-    # 1st remove some tests
-    # - OpenSwathMzMLFileCacher with -convert_back argument https://github.com/OpenMS/OpenMS/issues/4399
-    # - IDRipper PATH gets empty causing problems. TODO But overall the option needs to be handled differentlt
-    # - several tools with duplicated input (leads to conflict when linking)
-    # - MaRaCluster with -consensus_out (parameter blacklister: https://github.com/OpenMS/OpenMS/issues/4456)
-    # - FileMerger with mixed dta dta2d input (ftype can not be specified in the test, dta can not be sniffed)
-    # - some input files are originally in a subdir (degenerated cases/), but not in test-data
-    # - OpenSwathAnalyzer 9/10: cachedMzML (not supported yet)
-    # - SiriusAdapter_4 depends on online service which may timeout .. so keep disabled https://github.com/OpenMS/OpenMS/pull/5010
-    # - SiriusAdapter_10 should work in >2.8 https://github.com/OpenMS/OpenMS/issues/5869
-    CMAKE=$(cat $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake  |
-        sed 's@${DATA_DIR_SHARE}/@@g' |
-        grep -v 'OpenSwathMzMLFileCacher .*-convert_back' |
-        sed 's/${TMP_RIP_PATH}/""/' |
-        grep -v "MaRaClusterAdapter.*-consensus_out"|
-        grep -v "FileMerger_1_input1.dta2d.*FileMerger_1_input2.dta " |
-        sed 's@degenerate_cases/@@g' |
-        egrep -v 'TOPP_OpenSwathAnalyzer_test_3"|TOPP_OpenSwathAnalyzer_test_4"' |
-        sed 's/\("TOPP_SiriusAdapter_4".*\)-sirius:database all\(.*\)/\1-sirius:database pubchem\2/' |
-        grep -v '"TOPP_SiriusAdapter_10"')
-
-    # 1st part is a dirty hack to join lines containing a single function call, e.g.
-    # addtest(....
-    #         ....)
-    echo "$CMAKE" | sed 's/#.*//; s/^\s*//; s/\s*$//' | grep -v "^#" | grep -v "^$"  | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | 
-        grep -iE "add_test\(\"(TOPP|UTILS)_.*/$id " | egrep -v "_prepare\"|_convert|WRITEINI|WRITECTD|INVALIDVALUE"  | while read -r line
-    do
-        line=$(echo "$line" | sed 's/add_test("\([^"]\+\)"/\1/; s/)$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g')
-        # >&2 echo $line
-        test_id=$(echo "$line" | cut -d" " -f 1)
-        tool_id=$(echo "$line" | cut -d" " -f 2)
-        # >&2 echo "test_id $test_id"
-        if [[ $test_id =~ _out_?[0-9]? ]]; then
-            >&2 echo "    skip $test_id $line"
-            continue
-        fi
-        if [[ ${id,,} != ${tool_id,,} ]]; then
-            >&2 echo "    skip $test_id ($id != $tool_id) $line"
-            continue
-        fi
-
-        #remove tests with set_tests_properties(....PROPERTIES WILL_FAIL 1)
-        if grep -lq "$test_id"'\".* PROPERTIES WILL_FAIL 1' $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake; then
-            >&2 echo "    skip failing "$test_id
-            continue
-        fi
-        tes="  <test>\n"
-        line=$(fix_tmp_files "$line")
-        line=$(unique_files "$line")
-        # >&2 echo LINE $line
-        #if there is an ini file then we use this to generate the test
-        #otherwise the ctd file is used
-        #other command line parameters are inserted later into this xml
-        if grep -lq "\-ini" <<<"$line"; then
-            ini=$(echo $line | sed 's/.*-ini \([^ ]\+\).*/\1/')
-            ini="test-data/$ini"
-        else
-            ini="ctd/$tool_id.ctd"
-        fi
-        # >&2 echo "========================================================"
-        # >&2 echo "USING ini $ini"
-        cli=$(echo $line |cut -d" " -f3- | sed 's/-ini [^ ]\+//')
-
-        ctdtmp=$(mktemp)
-        # using eval: otherwise for some reason quoted values are not used properly ('A B' -> ["'A", "B'"])
-        # >&2 echo "python3 fill_ctd_clargs.py --ini_file $ini $cli" 
-        eval "python3 fill_ctd_clargs.py --ini_file $ini $cli" > "$ctdtmp"
-        # >&2 echo $ctdtmp
-        # >&2 cat $ctdtmp
-        testtmp=$(mktemp)
-        # >&2 echo CTDConverter galaxy -i $ctdtmp -o $testtmp -s aux/tools_blacklist.txt -f "$FILETYPES" -m macros.xml -t tool.conf  -p aux/hardcoded_params.json --tool-version $VERSION --test-only --test-unsniffable csv tsv txt dta dta2d edta mrm splib --test-condition "compare=sim_size" "delta_frac=0.7"
-        CTDConverter galaxy -i $ctdtmp -o $testtmp -s aux/tools_blacklist.txt -f "$FILETYPES" -m macros.xml -t tool.conf  -p aux/hardcoded_params.json --tool-version $VERSION --test-only --test-unsniffable csv tsv txt dta dta2d edta mrm splib --test-condition "compare=sim_size" "delta_frac=0.7" > /dev/null
-        echo "<!-- $test_id -->"
-        cat $testtmp | grep -v '<output.*file=""' # | grep -v 'CHEMISTRY/'
-
-        rm "$ctdtmp" "$testtmp"
-
-        #> /dev/null
-
-        #rm $testtmp
-    done 
-    echo '</xml>'
-}
-
-#some tests use the same file twice which does not work in planemo tests
-#hence we create symlinks for each file used twice
-function unique_files {
-    line=$@
-    for arg in $@
-    do
-        if [[ ! -f "test-data/$arg" ]]; then
-            continue
-        fi
-        cnt=$(grep -c $arg <<< $(echo "$line" | tr ' ' '\n'))
-        while [[ $cnt -gt 1 ]]; do
-            new_arg=$(echo $arg | sed "s/\(.*\)\./\1_$cnt./")
-            ln -fs $arg test-data/$new_arg
-            line=$(echo $line | sed "s/\($arg.*\)$arg/\1$new_arg/")
-            cnt=$(grep -c $arg <<< $(echo "$line" | tr ' ' '\n'))
-        done
-    done
-
-    echo $line
-}
-
-# options of out_type selects need to be fixed to Galaxy data types
-function fix_out_type {
-    grep "^$1" "$2" | awk '{print $2}'
-}
-
-#OpenMS tests output to tmp files and compare with FuzzyDiff to the expected file.
-#problem: the extension of the tmp files is unusable for test generation.
-#unfortunately the extensions used in the DIFF lines are not always usable for the CLI
-#(e.g. for prepare_test_data, e.g. CLI expects csv but test file is txt)
-#this function replaces the tmp file by the expected file. 
-function fix_tmp_files {
-    # >&2 echo "FIX $line"
-    ret=""
-    for a in $@; do
-        # >&2 echo "    a "$a
-        if [[ ! $a =~ .tmp$ ]] && [[ ! $a =~ _tmp_ ]]; then
-            ret="$ret $a"
-            continue
-        fi
-        diff_line=$(cat $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | grep '\${DIFF}.*'"$a")
-        # >&2 echo "    diff_line "$diff_line
-        in1=$(sed 's/.*-in1 \([^ ]\+\).*/\1/' <<<$diff_line)
-        # >&2 echo "    in1 "$in1
-        if [[  "$a" != "$in1" ]]; then
-            ret="$ret $a"
-            continue
-        fi
-        in2=$(sed 's/.*-in2 \([^ ]\+\).*/\1/' <<<$diff_line)
-        in2=$(basename $in2 | sed 's/)$//')
-        # >&2 echo "    in2 "$in2
-        if [[ -f "test-data/$in2" ]]; then
-            ln -fs "$in1" "test-data/$in2"
-            ret="$ret $in2"
-        else
-            ret="$ret $a"
-        fi
-    done
-#    >&2 echo "--> $ret"
-    echo "$ret"
-}
-
-function link_tmp_files {
-    # note this also considers commented lines (starting with a #)
-    # because of tests where the diff command is commented and we
-    # still want to use the extension of these files
-    cat $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake | sed 's/^\s*//; s/\s*$//' | grep -v "^$"  | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | grep "\${DIFF}" | while read -r line
-    do
-        in1=$(sed 's/.*-in1 \([^ ]\+\).*/\1/' <<<$line)
-        in1=$(basename $in1 | sed 's/)$//')
-        in2=$(sed 's/.*-in2 \([^ ]\+\).*/\1/' <<<$line)
-        in2=$(basename $in2 | sed 's/)$//')
-        if [[ "$in1" == "$in2" ]]; then
-            >&2 echo "not linking equal $in1 $in2"
-            continue
-        fi
-        ln -f -s $in1 test-data/$in2
-    done
-    
-    find test-data/ -name "*.tmp" -print0 | 
-    while IFS= read -r -d '' i; do 
-        if [ ! -e test-data/$(basename $i .tmp) ]; then
-            ln -s $(basename $i) test-data/$(basename $i .tmp)
-        else
-            ln -fs $(basename $i) test-data/$(basename $i .tmp)
-        fi
-    done
-}
-
-
-
-# parse data preparation calls from OpenMS sources for a tool with a given id
-function prepare_test_data {
-#     id=$1
-# | egrep -i "$id\_.*[0-9]+(_prepare\"|_convert)?"
-
-    # TODO SiriusAdapter depends on online service which may timeout .. so keep disabled https://github.com/OpenMS/OpenMS/pull/5010
-    cat $OPENMSGIT/src/tests/topp/CMakeLists.txt  $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake | sed 's/#.*$//'| sed 's/^\s*//; s/\s*$//' | grep -v "^$"  | awk '{printf("%s@NEWLINE@", $0)}' | sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | 
-        sed 's/degenerate_cases\///' | 
-        egrep -v "WRITEINI|WRITECTD|INVALIDVALUE|DIFF" | 
-        grep add_test | 
-        egrep "TOPP|UTILS" |
-        sed 's@${DATA_DIR_SHARE}/@@g;'|
-        sed 's@${TMP_RIP_PATH}@./@g'|
-        sed 's@TOFCalibration_ref_masses @TOFCalibration_ref_masses.txt @g; s@TOFCalibration_const @TOFCalibration_const.csv @'| 
-	sed 's/\("TOPP_SiriusAdapter_4".*\)-sirius:database all\(.*\)/\1-sirius:database pubchem\2/' |
-    while read line
-    do
-        test_id=$(echo "$line" | sed 's/add_test(//; s/"//g;  s/)[^)]*$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g' | cut -d" " -f1)
-
-        if grep -lq "$test_id"'\".* PROPERTIES WILL_FAIL 1' $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake; then
-            >&2 echo "    skip failing "$test_id
-            continue
-        fi
-
-        line=$(echo "$line" | sed 's/add_test("//; s/)[^)]*$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g' | cut -d" " -f2-)
-        # line="$(fix_tmp_files $line)"
-        echo 'echo executing "'$test_id'"'
-	echo "$line > $test_id.stdout 2> $test_id.stderr"
-        echo "if [[ \"\$?\" -ne \"0\" ]]; then >&2 echo '$test_id failed'; >&2 echo -e \"stderr:\n\$(cat $test_id.stderr | sed 's/^/    /')\"; echo -e \"stdout:\n\$(cat $test_id.stdout)\";fi"    
-    done
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/get_tests.py	Fri Jun 14 21:31:16 2024 +0000
@@ -0,0 +1,344 @@
+#!/usr/bin/env python
+
+import argparse
+import os.path
+import re
+import shlex
+import sys
+import tempfile
+from typing import (
+    Dict,
+    List,
+    Optional,
+    TextIO,
+    Tuple,
+)
+
+from ctdconverter.common.utils import (
+    ParameterHardcoder,
+    parse_hardcoded_parameters,
+    parse_input_ctds,
+)
+from ctdconverter.galaxy.converter import convert_models
+from CTDopts.CTDopts import (
+    CTDModel,
+    ModelTypeError,
+    Parameters,
+)
+
+SKIP_LIST = [
+    r"_prepare\"",
+    r"_convert",
+    r"WRITEINI",
+    r"WRITECTD",
+    r"INVALIDVALUE",
+    r"\.ini\.json",
+    r"OpenSwathMzMLFileCacher .*-convert_back",  # - OpenSwathMzMLFileCacher with -convert_back argument https://github.com/OpenMS/OpenMS/issues/4399
+    r"MaRaClusterAdapter.*-consensus_out",  # - MaRaCluster with -consensus_out (parameter blacklister: https://github.com/OpenMS/OpenMS/issues/4456)
+    r"FileMerger_1_input1.dta2d.*FileMerger_1_input2.dta ",  # - FileMerger with mixed dta dta2d input (ftype can not be specified in the test, dta can not be sniffed)
+    r'^(TOPP_OpenSwathAnalyzer_test_3|TOPP_OpenSwathAnalyzer_test_4)$',  # no  suppert for cached mzML
+    r'TOPP_SiriusAdapter_[0-9]+$',  # Do not test SiriusAdapter https://github.com/OpenMS/OpenMS/issues/7000 .. will be removed anyway
+    r'TOPP_AssayGeneratorMetabo_(7|8|9|10|11|12|13|14|15|16|17|18)$'  # Skip AssayGeneratorMetabo tests using Sirius  https://github.com/OpenMS/OpenMS/issues/7150 (will be replaced by two tools)
+]
+
+
+def get_failing_tests(cmake: List[str]) -> List[str]:
+    failing_tests = []
+    re_fail = re.compile(r"set_tests_properties\(\"([^\"]+)\" PROPERTIES WILL_FAIL 1\)")
+
+    for cmake in args.cmake:
+        with open(cmake) as cmake_fh:
+            for line in cmake_fh:
+                match = re_fail.search(line)
+                if match:
+                    failing_tests.append(match.group(1))
+    return failing_tests
+
+
+def fix_tmp_files(line: str, diff_pairs: Dict[str, str]) -> str:
+    """
+    OpenMS tests output to tmp files and compare with FuzzyDiff to the expected file.
+    problem: the extension of the tmp files is unusable for test generation.
+    unfortunately the extensions used in the DIFF lines are not always usable for the CLI
+    (e.g. for prepare_test_data, e.g. CLI expects csv but test file is txt)
+    this function replaces the tmp file by the expected file.
+    """
+    cmd = shlex.split(line)
+    for i, e in enumerate(cmd):
+        if e in diff_pairs:
+            dst = os.path.join("test-data", diff_pairs[e])
+            if os.path.exists(dst):
+                os.unlink(dst)
+            sys.stderr.write(f"symlink {e} {dst}\n")
+            os.symlink(e, dst)
+            cmd[i] = diff_pairs[e]
+    return shlex.join(cmd)
+
+
+def get_ini(line: str, tool_id: str) -> Tuple[str, str]:
+    """
+    if there is an ini file then we use this to generate the test
+    otherwise the ctd file is used
+    other command line parameters are inserted later into this xml
+    """
+    cmd = shlex.split(line)
+    ini = None
+    for i, e in enumerate(cmd):
+        if e == "-ini":
+            ini = cmd[i + 1]
+            cmd = cmd[:i] + cmd[i + 2:]
+    if ini:
+        return os.path.join("test-data", ini), shlex.join(cmd)
+    else:
+        return os.path.join("ctd", f"{tool_id}.ctd"), line
+
+
+def unique_files(line: str):
+    """
+    some tests use the same file twice which does not work in planemo tests
+    hence we create symlinks for each file used twice
+    """
+    cmd = shlex.split(line)
+    # print(f"{cmd}")
+    files = {}
+    # determine the list of indexes where each file argument (anything appearing in test-data/) appears
+    for idx, e in enumerate(cmd):
+        p = os.path.join("test-data", e)
+        if not os.path.exists(p) and not os.path.islink(p):
+            continue
+        try:
+            files[e].append(idx)
+        except KeyError:
+            files[e] = [idx]
+    # print(f"{files=}")
+    for f in files:
+        if len(files[f]) < 2:
+            continue
+        for i, idx in enumerate(files[f]):
+            f_parts = f.split(".")
+            f_parts[0] = f"{f_parts[0]}_{i}"
+            new_f = ".".join(f_parts)
+            # if os.path.exists(os.path.join("test-data", new_f)):
+            #     os.unlink(os.path.join("test-data", new_f))
+            sys.stderr.write(
+                f'\tsymlink {os.path.join("test-data", new_f)} {f}\n'
+            )
+            try:
+                os.symlink(f, os.path.join("test-data", new_f))
+            except FileExistsError:
+                pass
+            cmd[idx] = new_f
+    return shlex.join(cmd)
+
+
+def fill_ctd_clargs(ini: str, line: str, ctd_tmp: TextIO) -> None:
+    cmd = shlex.split(line)
+
+    # load CTDModel
+    ini_model = None
+    try:
+        ini_model = CTDModel(from_file=ini)
+    except ModelTypeError:
+        pass
+    try:
+        ini_model = Parameters(from_file=ini)
+    except ModelTypeError:
+        pass
+    assert ini_model is not None, "Could not parse %s, seems to be no CTD/PARAMS" % (
+        args.ini_file
+    )
+
+    # get a dictionary of the ctd arguments where the values of the parameters
+    # given on the command line are overwritten
+    ini_values = ini_model.parse_cl_args(cl_args=cmd, ignore_required=True)
+    ini_model.write_ctd(ctd_tmp, ini_values)
+
+
+def process_test_line(
+    id: str,
+    line: str,
+    failing_tests: List[str],
+    skip_list: List[str],
+    diff_pairs: Dict[str, str],
+) -> Optional[str]:
+
+    re_test_id = re.compile(r"add_test\(\"([^\"]+)\" ([^ ]+) (.*)")
+    re_id_out_test = re.compile(r"_out_?[0-9]?")
+
+    # TODO auto extract from  set(OLD_OSW_PARAM ... lin
+    line = line.replace(
+        "${OLD_OSW_PARAM}",
+        " -test -mz_extraction_window 0.05 -mz_extraction_window_unit Th -ms1_isotopes 0 -Scoring:TransitionGroupPicker:compute_peak_quality -Scoring:Scores:use_ms1_mi false -Scoring:Scores:use_mi_score false",
+    )
+
+    line = line.replace("${TOPP_BIN_PATH}/", "")
+    line = line.replace("${DATA_DIR_TOPP}/", "")
+    line = line.replace("THIRDPARTY/", "")
+    line = line.replace("${DATA_DIR_SHARE}/", "")
+    # IDRipper PATH gets empty causing problems. TODO But overall the option needs to be handled differently
+    line = line.replace("${TMP_RIP_PATH}/", "")
+    # some input files are originally in a subdir (degenerated cases/), but not in test-data
+    line = line.replace("degenerate_cases/", "")
+    # determine the test and tool ids and remove the 1) add_test("TESTID" 2) trailing )
+    match = re_test_id.match(line)
+    if not match:
+        sys.exit(f"Ill formated test line {line}\n")
+    test_id = match.group(1)
+    tool_id = match.group(2)
+
+    line = f"{match.group(2)} {match.group(3)}"
+
+    if test_id in failing_tests:
+        sys.stderr.write(f"    skip failing {test_id} {line}\n")
+        return
+
+    if id != tool_id:
+        sys.stderr.write(f"    skip {test_id} ({id} != {tool_id}) {line}\n")
+        return
+
+    if re_id_out_test.search(test_id):
+        sys.stderr.write(f"    skip {test_id} {line}\n")
+        return
+
+    for skip in skip_list:
+        if re.search(skip, line):
+            return
+        if re.search(skip, test_id):
+            return
+
+    line = fix_tmp_files(line, diff_pairs)
+    # print(f"fix {line=}")
+    line = unique_files(line)
+    # print(f"unq {line=}")
+    ini, line = get_ini(line, tool_id)
+
+    from dataclasses import dataclass, field
+
+    @dataclass
+    class CTDConverterArgs:
+        input_files: list
+        output_destination: str
+        default_executable_path: Optional[str] = None
+        hardcoded_parameters: Optional[str] = None
+        parameter_hardcoder: Optional[ParameterHardcoder] = None
+        xsd_location: Optional[str] = None
+        formats_file: Optional[str] = None
+        add_to_command_line: str = ""
+        required_tools_file: Optional[str] = None
+        skip_tools_file: Optional[str] = None
+        macros_files: Optional[List[str]] = field(default_factory=list)
+        test_macros_files: Optional[List[str]] = field(default_factory=list)
+        test_macros_prefix: Optional[List[str]] = field(default_factory=list)
+        test_test: bool = False
+        test_only: bool = False
+        test_unsniffable: Optional[List[str]] = field(default_factory=list)
+        test_condition: Optional[List[str]] = ("compare=sim_size", "delta_frac=0.05")
+        tool_version: str = None
+        tool_profile: str = None
+        bump_file: str = None
+
+    # create an ini/ctd file where the values are equal to the arguments from the command line
+    # and transform it to xml
+    test = [f"<!-- {test_id} -->\n"]
+    with tempfile.NamedTemporaryFile(
+        mode="w+", delete_on_close=False
+    ) as ctd_tmp, tempfile.NamedTemporaryFile(
+        mode="w+", delete_on_close=False
+    ) as xml_tmp:
+        fill_ctd_clargs(ini, line, ctd_tmp)
+        ctd_tmp.close()
+        xml_tmp.close()
+        parsed_ctd = parse_input_ctds(None, [ctd_tmp.name], xml_tmp.name, "xml")
+        ctd_args = CTDConverterArgs(
+            input_files=[ctd_tmp.name],
+            output_destination=xml_tmp.name,
+            macros_files=["macros.xml"],
+            skip_tools_file="aux/tools_blacklist.txt",
+            formats_file="aux/filetypes.txt",
+            # tool_conf_destination = "tool.conf",
+            hardcoded_parameters="aux/hardcoded_params.json",
+            tool_version="3.1",
+            test_only=True,
+            test_unsniffable=[
+                "csv",
+                "tsv",
+                "txt",
+                "dta",
+                "dta2d",
+                "edta",
+                "mrm",
+                "splib",
+            ],
+            test_condition=["compare=sim_size", "delta_frac=0.7"],
+        )
+        ctd_args.parameter_hardcoder = parse_hardcoded_parameters(
+            ctd_args.hardcoded_parameters
+        )
+        convert_models(ctd_args, parsed_ctd)
+        xml_tmp = open(xml_tmp.name, "r")
+        for l in xml_tmp:
+            test.append(l)
+
+    return "".join(test)
+
+
+parser = argparse.ArgumentParser(description="Create Galaxy tests for a OpenMS tools")
+parser.add_argument("--id", dest="id", help="tool id")
+parser.add_argument("--cmake", nargs="+", help="OpenMS test CMake files")
+args = parser.parse_args()
+sys.stderr.write(f"generate tests for {args.id}\n")
+
+re_comment = re.compile("#.*")
+re_empty_prefix = re.compile(r"^\s*")
+re_empty_suffix = re.compile(r"\s*$")
+re_add_test = re.compile(r"add_test\(\"(TOPP|UTILS)_.*/" + args.id)
+re_diff = re.compile(r"\$\{DIFF\}.* -in1 ([^ ]+) -in2 ([^ ]+)")
+failing_tests = get_failing_tests(args.cmake)
+tests = []
+
+# process the given CMake files and compile lists of
+# - test lines .. essentially add_test(...)
+# - and pairs of files that are diffed
+jline = ""
+test_lines = []
+diff_pairs = {}
+for cmake in args.cmake:
+    with open(cmake) as cmake_fh:
+        for line in cmake_fh:
+            # remove comments, empty prefixes and suffixes
+            line = re_comment.sub("", line)
+            line = re_empty_prefix.sub("", line)
+            line = re_empty_suffix.sub("", line)
+            # skip empty lines
+            if line == "":
+                continue
+
+            # join test statements that are split over multiple lines
+            if line.endswith(")"):
+                jline += " " + line[:-1]
+            else:
+                jline = line
+                continue
+            line, jline = jline.strip(), ""
+            match = re_diff.search(line)
+            if match:
+                in1 = match.group(1).split("/")[-1]
+                in2 = match.group(2).split("/")[-1]
+                if in1 != in2:
+                    diff_pairs[in1] = in2
+            elif re_add_test.match(line):
+                test_lines.append(line)
+
+for line in test_lines:
+    test = process_test_line(args.id, line, failing_tests, SKIP_LIST, diff_pairs)
+    if test:
+        tests.append(test)
+
+tests = "\n".join(tests)
+print(
+    f"""
+<xml name="autotest_{args.id}">
+{tests}
+</xml>
+"""
+)
--- a/macros.xml	Thu Dec 01 19:13:13 2022 +0000
+++ b/macros.xml	Fri Jun 14 21:31:16 2024 +0000
@@ -3,19 +3,19 @@
      You can edit this file to add your own macros, if you so desire, or you can
      add additional macro files using the m/macros parameter -->
 <macros>
-  <token name="@TOOL_VERSION@">2.8</token>
+  <token name="@TOOL_VERSION@">3.1</token>
   <token name="@VERSION_SUFFIX@">0</token>
+  <token name="@TEST_DATA_LOCATION@"/>
   <xml name="requirements">
     <requirements>
       <requirement type="package" version="@TOOL_VERSION@">openms</requirement>
       <requirement type="package" version="@TOOL_VERSION@">openms-thirdparty</requirement>
       <!-- omssa (which has been excluded from 3rdparty) and makeblastdb for OMSSAAdapter -->
-      <requirement type="package" version="2.1.9">omssa</requirement>
-      <requirement type="package" version="2.13.0">blast</requirement>
+      <requirement type="package" version="2.14.1">blast</requirement>
       <!--<requirement type="package" version="5.0.0">tpp</requirement>-->
       <!-- for realpath (used e.g. in LuciphorAdapter) -->
 	  <!--<requirement type="package" version="8.25">coreutils</requirement>-->
-	  <requirement type="package" version="1.4">ctdopts</requirement>
+	  <requirement type="package" version="1.5">ctdopts</requirement>
       <yield/>
     </requirements>
   </xml>
@@ -26,6 +26,8 @@
       <regex match="Could not allocate metaspace" level="fatal_oom" description="Java memory Exception"/>
       <regex match="Cannot create VM thread" level="fatal_oom" description="Java memory Exception"/>
       <regex match="qUncompress: could not allocate enough memory to uncompress data" level="fatal_oom" description="Java memory Exception"/>
+      <regex match="OMSSA ran out of RAM" level="fatal_oom" description="Could not allocate memory"/>
+      <regex match="comet' crashed hard (segfault-like). Please check the log." level="fatal_oom" description="Could not allocate memory"/>
     </stdio>
   </xml>
   <xml name="references">
@@ -113,11 +115,11 @@
   </token>
 
 <token name="@EXT_FOO@"><![CDATA[#def oms2gxyext(o)
-    #set m={'txt': 'txt', 'tsv': 'tabular', 'bioml': 'xml', 'consensusXML': 'consensusxml', 'csv': 'csv', 'dta': 'dta', 'dta2d': 'dta2d', 'edta': 'edta', 'fa': 'fasta', 'fas': 'fasta', 'fasta': 'fasta', 'FASTA': 'fasta', 'featureXML': 'featurexml', 'featurexml': 'featurexml', 'html': 'html', 'HTML': 'html', 'idXML': 'idxml', 'json': 'json', 'kroenik': 'kroenik', 'mascotXML': 'mascotxml', 'mgf': 'mgf', 'mrm': 'mrm', 'ms': 'sirius.ms', 'ms2': 'ms2', 'msp': 'msp', 'mzData': 'mzdata', 'mzid': 'mzid', 'mzML': 'mzml', 'mzml': 'mzml', 'mzq': 'mzq', 'mzQC': 'mzqc', 'mzTab': 'mztab', 'mzXML': 'mzxml', 'novor': 'txt', 'obo': 'obo', 'oms': 'sqlite', 'omssaXML': 'idxml', 'osw': 'osw', 'OSW': 'osw', 'params': 'txt', 'paramXML': 'paramxml', 'peplist': 'peplist', 'pep.xml': 'pepxml', 'pepXML': 'pepxml', 'png': 'png', 'PNG': 'png', 'protXML': 'protxml', 'psms': 'psms', 'pqp': 'pqp', 'qcML': 'qcml', 'spec.xml': 'spec.xml', 'splib': 'splib', 'sqMass': 'sqmass', 'tandem.xml': 'tandem', 'trafoXML': 'trafoxml', 'traML': 'traml', 'TraML': 'traml', 'tab': 'tabular', 'raw': 'thermo.raw', 'xls': 'tsv', 'XML': 'xml', 'xml': 'xml', 'xquest.xml': 'xquest.xml', 'xsd': 'xml'}
+    #set m={'txt': 'txt', 'tsv': 'tabular', 'bioml': 'xml', 'consensusXML': 'consensusxml', 'csv': 'csv', 'dta': 'dta', 'dta2d': 'dta2d', 'edta': 'edta', 'fa': 'fasta', 'fas': 'fasta', 'fasta': 'fasta', 'FASTA': 'fasta', 'featureXML': 'featurexml', 'featurexml': 'featurexml', 'html': 'html', 'HTML': 'html', 'idXML': 'idxml', 'json': 'json', 'kroenik': 'kroenik', 'mascotXML': 'mascotxml', 'mgf': 'mgf', 'mrm': 'mrm', 'ms': 'sirius.ms', 'ms2': 'ms2', 'msp': 'msp', 'mzData': 'mzdata', 'mzid': 'mzid', 'mzML': 'mzml', 'mzml': 'mzml', 'mzq': 'mzq', 'mzQC': 'mzqc', 'mzTab': 'mztab', 'mzXML': 'mzxml', 'novor': 'txt', 'obo': 'obo', 'oms': 'sqlite', 'omssaXML': 'idxml', 'osw': 'osw', 'OSW': 'osw', 'params': 'txt', 'paramXML': 'paramxml', 'peplist': 'peplist', 'pep.xml': 'pepxml', 'pepXML': 'pepxml', 'png': 'png', 'PNG': 'png', 'protXML': 'protxml', 'psms': 'psms', 'pqp': 'pqp', 'qcML': 'qcml', 'spec.xml': 'spec.xml', 'splib': 'splib', 'sqMass': 'sqmass', 'tandem.xml': 'tandem', 'trafoXML': 'trafoxml', 'traML': 'traml', 'TraML': 'traml', 'tab': 'tabular', 'raw': 'thermo.raw', 'xls': 'tsv', 'XML': 'xml', 'xml': 'xml', 'xquest.xml': 'xquest.xml', 'xsd': 'xsd', 'zip': 'zip'}
     #return m[o]
 #end def
 #def gxy2omsext(g)
-    #set m={'txt': 'txt', 'tabular': 'tsv', 'xml': 'bioml', 'consensusxml': 'consensusXML', 'csv': 'csv', 'dta': 'dta', 'dta2d': 'dta2d', 'edta': 'edta', 'fasta': 'fa', 'featurexml': 'featureXML', 'html': 'html', 'idxml': 'idXML', 'json': 'json', 'kroenik': 'kroenik', 'mascotxml': 'mascotXML', 'mgf': 'mgf', 'mrm': 'mrm', 'sirius.ms': 'ms', 'ms2': 'ms2', 'msp': 'msp', 'mzdata': 'mzData', 'mzid': 'mzid', 'mzml': 'mzML', 'mzq': 'mzq', 'mzqc': 'mzQC', 'mztab': 'mzTab', 'mzxml': 'mzXML', 'obo': 'obo', 'sqlite': 'oms', 'osw': 'osw', 'paramxml': 'paramXML', 'peff': 'fasta', 'peplist': 'peplist', 'pepxml': 'pep.xml', 'png': 'png', 'protxml': 'protXML', 'psms': 'psms', 'pqp': 'pqp', 'qcml': 'qcML', 'spec.xml': 'spec.xml', 'splib': 'splib', 'sqmass': 'sqMass', 'tandem': 'tandem.xml', 'trafoxml': 'trafoXML', 'traml': 'traML', 'thermo.raw': 'raw', 'tsv': 'xls', 'xquest.xml': 'xquest.xml'}
+    #set m={'txt': 'txt', 'tabular': 'tsv', 'xml': 'bioml', 'consensusxml': 'consensusXML', 'csv': 'csv', 'dta': 'dta', 'dta2d': 'dta2d', 'edta': 'edta', 'fasta': 'fa', 'featurexml': 'featureXML', 'html': 'html', 'idxml': 'idXML', 'json': 'json', 'kroenik': 'kroenik', 'mascotxml': 'mascotXML', 'mgf': 'mgf', 'mrm': 'mrm', 'sirius.ms': 'ms', 'ms2': 'ms2', 'msp': 'msp', 'mzdata': 'mzData', 'mzid': 'mzid', 'mzml': 'mzML', 'mzq': 'mzq', 'mzqc': 'mzQC', 'mztab': 'mzTab', 'mzxml': 'mzXML', 'obo': 'obo', 'sqlite': 'oms', 'osw': 'osw', 'paramxml': 'paramXML', 'peff': 'fasta', 'peplist': 'peplist', 'pepxml': 'pep.xml', 'png': 'png', 'protxml': 'protXML', 'psms': 'psms', 'pqp': 'pqp', 'qcml': 'qcML', 'spec.xml': 'spec.xml', 'splib': 'splib', 'sqmass': 'sqMass', 'tandem': 'tandem.xml', 'trafoxml': 'trafoXML', 'traml': 'traML', 'thermo.raw': 'raw', 'tsv': 'xls', 'xquest.xml': 'xquest.xml', 'xsd': 'xsd', 'zip': 'zip'}
     #return m[g]
 #end def
 ]]></token></macros>
--- a/prepare_test_data_manual.sh	Thu Dec 01 19:13:13 2022 +0000
+++ b/prepare_test_data_manual.sh	Fri Jun 14 21:31:16 2024 +0000
@@ -1,8 +1,3 @@
-MSSimulator -test -in DecoyDatabase_1.fasta -out MSsimulator.mzml -algorithm:RandomNumberGenerators:biological reproducible -algorithm:RandomNumberGenerators:technical reproducible > MSSimulator_1.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'MSSimulator_1 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
-MSSimulator -test -in DecoyDatabase_1.fasta -out MSsimulator_MALDI.mzml -algorithm:RandomNumberGenerators:biological reproducible -algorithm:RandomNumberGenerators:technical reproducible -algorithm:MSSim:Global:ionization_type MALDI > MSSimulator_2.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'MSSimulator_2 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
 ClusterMassTracesByPrecursor -test -in_ms1 ConsensusMapNormalizer_input.consensusXML -in_swath ConsensusMapNormalizer_input.consensusXML -out ClusterMassTracesByPrecursor.mzml > ClusterMassTracesByPrecursor.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'ClusterMassTracesByPrecursor failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
@@ -13,8 +8,7 @@
 CVInspector -test -cv_files CHEMISTRY/XLMOD.obo -cv_names XLMOD -mapping_file MAPPING/ms-mapping.xml -html CVInspector.html > CVInspector.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'CVInspector failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
-DeMeanderize -test -in MSsimulator_MALDI.mzml -out DeMeanderize.mzml > DeMeanderize.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'DeMeanderize failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
+# TODO DeMeanderize
 
 # TODO DigestorMotif
 
@@ -30,26 +24,17 @@
 if [[ "$?" -ne "0" ]]; then >&2 echo 'FeatureFinderIsotopeWavelet failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
 
-FFEval -test -in  FeatureFinderCentroided_1_output.featureXML -truth  FeatureFinderCentroided_1_output.featureXML -out  FFEval.featureXML -out_roc FFEval_roc.csv  > FFEval.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'FFEval failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
 # TODO? deprecated IDDecoyProbability
 
 IDExtractor -test -in MSGFPlusAdapter_1_out.idXML -best_hits -number_of_peptides  1 -out  IDExtractor.idXML   > IDExtractor.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'IDExtractor failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
-LabeledEval -test -in  FeatureLinkerLabeled_1_input.featureXML -truth  FeatureLinkerLabeled_1_output.consensusXML> LabeledEval.txt > LabeledEval.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'LabeledEval failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
 MapStatistics -test -in SiriusAdapter_3_input.featureXML -out MapStatistics.txt > MapStatistics_1.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'MapStatistics_1 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
 MapStatistics -test -in ConsensusXMLFile_1.consensusXML -out MapStatistics2.txt > MapStatistics_2.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'MapStatistics_2 failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
-MetaboliteAdductDecharger -test -in Decharger_input.featureXML -out_cm MetaboliteAdductDecharger_cm.consensusXML -out_fm MetaboliteAdductDecharger_fm.featureXML -outpairs MetaboliteAdductDecharger_pairs.consensusXML > MetaboliteAdductDecharger.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'MetaboliteAdductDecharger failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
 MetaboliteSpectralMatcher -test -in spectra.mzML -database MetaboliteSpectralDB.mzML -out MetaboliteSpectralMatcher.mzTab > MetaboliteSpectralMatcher.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'MetaboliteSpectralMatcher failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
@@ -68,20 +53,6 @@
 OpenSwathRewriteToFeatureXML -featureXML OpenSwathFeatureXMLToTSV_input.featureXML -out OpenSwathRewriteToFeatureXML.featureXML > OpenSwathRewriteToFeatureXML.stdout 2> stderr
 # if [[ "$?" -ne "0" ]]; then >&2 echo 'OpenSwathRewriteToFeatureXML failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
-# adapted from the commented tests in OpenMS TODO may be removed later https://github.com/OpenMS/OpenMS/issues/4719
-FileConverter -in PepNovo.mzXML -out PepNovo_1.mzML > /dev/null 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'FileConverter failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
-PepNovoAdapter -ini PepNovoAdapter_1_parameters.ini -in PepNovo_1.mzML -out PepNovoAdapter_3_output.idXML -model_directory pepnovo_models/ -pepnovo_executable pepnovo > PepNovo_1.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'PhosphoScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
-FileConverter -in PepNovo.mzData -out PepNovo_4.mzML > /dev/null 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'FileConverter failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-PepNovoAdapter -ini PepNovoAdapter_1_parameters.ini -in PepNovo_4.mzML -out PepNovoAdapter_4_output.idXML -model_directory pepnovo_models/ -pepnovo_executable pepnovo > PepNovo_1.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'PhosphoScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
-#PepNovoAdapter -ini PepNovoAdapter_5_parameters.ini -in PepNovoAdapter_5_output.pepnovo_out -out PepNovoAdapter_5_output.idXML -model_directory pepnovo_models/ 
-
 # TODO PhosphoScoring 
 PhosphoScoring -in spectra.mzML -id MSGFPlusAdapter_1_out1.tmp -out PhosphoScoring.idxml > PhosphoScoring.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'PhosphoScoring failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
@@ -118,9 +89,6 @@
 RNPxlXICFilter -test -control FileFilter_1_input.mzML -treatment FileFilter_1_input.mzML -out RNPxlXICFilter.mzML > RNPxlXICFilter.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'RNPxlXICFilter failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
-RTEvaluation -in PeptideIndexer_1.idXML -out RTEvaluation.tsv > RTEvaluation.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'RTEvaluation failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
 SemanticValidator -test -in FileFilter_1_input.mzML -mapping_file MAPPING/ms-mapping.xml > SemanticValidator.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'SemanticValidator failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
@@ -152,13 +120,8 @@
 SpectraFilterThresholdMower -test -in  SpectraFilterSqrtMower_1_input.mzML -out  SpectraFilterThresholdMower.mzML > SpectraFilterThresholdMower.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraFilterThresholdMower failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
-SpectraMerger -test -in NovorAdapter_in.mzML -out SpectraMerger_1.mzML > SpectraMerger.stdout 2> stderr
+SpectraMerger -test -in NovorAdapter_in.mzML -out SpectraMerger_1.mzML -algorithm:average_gaussian:ms_level 2 > SpectraMerger.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'SpectraMerger failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
 
-# TODO SvmTheoreticalSpectrumGeneratorTrainer
-
-TransformationEvaluation -test -in FileInfo_16_input.trafoXML -out TransformationEvaluation.trafoXML > TransformationEvaluation.stdout 2> stderr
-if [[ "$?" -ne "0" ]]; then >&2 echo 'TransformationEvaluation failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
-
 XMLValidator -test -in FileFilter_1_input.mzML > XMLValidator.stdout 2> stderr
 if [[ "$?" -ne "0" ]]; then >&2 echo 'XMLValidator failed'; >&2 echo -e "stderr:\n$(cat stderr | sed 's/^/    /')"; fi
--- a/readme.md	Thu Dec 01 19:13:13 2022 +0000
+++ b/readme.md	Fri Jun 14 21:31:16 2024 +0000
@@ -11,7 +11,7 @@
  * https://www.openms.de/
 
 The wrappers for these tools and most of their tests are automatically
-generated using the `generate.sh` script. The generation of the tools is
+generated using the `./aux/generate.sh` script. The generation of the tools is
 based on the CTDConverter (https://github.com/WorkflowConversion/CTDConverter)
 which can be fine tuned via the `hardcoded_params.json` file. This file allows
 to blacklist and hardcode parameters and to modify or set arbitrary
@@ -129,15 +129,6 @@
 Open problems
 =============
 
-Some tools stall in CI testing using `--biocontainers` which is why the OpenMS
-tools are currently listed in `.tt_biocontainer_skip`. This is
-
-- AssayGeneratorMetabo and SiriusAdapter (both depend on sirius)
-- OMSSAAdapter
-
-Using `docker -t` seems to solve the problem (see
-https://github.com/galaxyproject/galaxy/issues/10153).
-
 Licence (MIT)
 =============
 
--- a/test-data.sh	Thu Dec 01 19:13:13 2022 +0000
+++ b/test-data.sh	Fri Jun 14 21:31:16 2024 +0000
@@ -1,11 +1,10 @@
 #!/usr/bin/env bash
 
-VERSION=2.8
+# set -x
+
+VERSION=3.1
 FILETYPES="aux/filetypes.txt"
-CONDAPKG="https://anaconda.org/bioconda/openms/2.8.0/download/linux-64/openms-2.8.0-h7ca0330_0.tar.bz2"
-
-# import the magic
-. ./generate-foo.sh
+CONDAPKG="https://anaconda.org/bioconda/openms/3.1.0/download/linux-64/openms-3.1.0-h8964181_1.tar.bz2"
 
 # install conda
 if [ -z "$tmp" ]; then
@@ -45,17 +44,20 @@
 
 echo "Clone OpenMS $VERSION sources"
 if [[ ! -d $OPENMSGIT ]]; then
-    # TODO >2.8 reenable original release branch .. also in else branch
-    # the plus branch contains commits from https://github.com/OpenMS/OpenMS/pull/5920 and https://github.com/OpenMS/OpenMS/pull/5917
-    # git clone -b release/$VERSION.0 https://github.com/OpenMS/OpenMS.git $OPENMSGIT
-    git clone -b release/$VERSION.0-plus https://github.com/bernt-matthias/OpenMS.git $OPENMSGIT
-    cd $OPENMSGIT
-    git submodule init
-    git submodule update
-    cd -
+    if [[ "$created" == "yes" ]]; then
+        GIT_DIR=$(mktemp -d --dry-run)
+        GIT_EXTRA_OPTS="--separate-git-dir=$GIT_DIR"
+    fi
+    git clone -b release/$VERSION.0 --depth 1 --recurse-submodules=THIRDPARTY --shallow-submodules $GIT_EXTRA_OPTS https://github.com/OpenMS/OpenMS.git $OPENMSGIT
+    ## save some space by just keeping the needed binaries
+    find $OPENMSGIT/THIRDPARTY/ -type f -not \( -name maracluster -o -name spectrast \) -delete
+    find $OPENMSGIT/THIRDPARTY/ -empty -type d -delete
+    if [[ "$created" == "yes" ]]; then
+        rm -rf $GIT_DIR
+    fi
 else
     cd $OPENMSGIT
-    git pull origin release/$VERSION.0-plus
+    git pull origin release/$VERSION.0
     cd -
 fi
 
@@ -65,7 +67,7 @@
 if conda env list | grep "$OPENMSENV"; then
     true
 else
-    conda create -y --quiet --override-channels --channel iuc --channel conda-forge --channel bioconda --channel defaults -n $OPENMSENV openms=$VERSION openms-thirdparty=$VERSION omssa=2.1.9 ctdopts=1.5 lxml
+    conda create -y --quiet --solver libmamba --override-channels --strict-channel-priority --channel conda-forge --channel bioconda -n $OPENMSENV openms=$VERSION openms-thirdparty=$VERSION ctdopts=1.5 lxml
 # chmod -R u-w $OPENMSENV 
 fi
 ###############################################################################
@@ -101,33 +103,34 @@
 conda deactivate
 
 
-# ###############################################################################
-# ## copy all the test data files to test-data
-# ## most of it (outputs) will be overwritten later, but its needed for
-# ## prepare_test_data
-# ###############################################################################
+# # ###############################################################################
+# # ## copy all the test data files to test-data
+# # ## most of it (outputs) will be overwritten later, but its needed for
+# # ## prepare_test_data
+# # ###############################################################################
 echo "Get test data"
-find test-data -type f,l,d ! -name "*fa" ! -name "*loc" ! -name "test-data" -delete
+find test-data -type f,l,d ! -name "*fa" ! -name "*loc" ! -name "test-data" ! -name MetaboliteSpectralDB.mzML -delete
 
 cp $(find $OPENMSGIT/src/tests/topp/ -type f | grep -Ev "third_party_tests.cmake|CMakeLists.txt|check_ini") test-data/
 cp -r $OPENMSGIT/share/OpenMS/MAPPING/ test-data/
 cp -r $OPENMSGIT/share/OpenMS/CHEMISTRY test-data/
 cp -r $OPENMSGIT/share/OpenMS/examples/ test-data/
 if [ ! -f test-data/MetaboliteSpectralDB.mzML ]; then 
-    wget -nc https://abibuilder.cs.uni-tuebingen.de/archive/openms/Tutorials/Data/latest/Example_Data/Metabolomics/databases/MetaboliteSpectralDB.mzML
+    wget -nc https://raw.githubusercontent.com/sneumann/OpenMS/master/share/OpenMS/CHEMISTRY/MetaboliteSpectralDB.mzML
+    # wget -nc https://abibuilder.cs.uni-tuebingen.de/archive/openms/Tutorials/Data/latest/Example_Data/Metabolomics/databases/MetaboliteSpectralDB.mzML
     mv MetaboliteSpectralDB.mzML test-data/
 fi
 ln -fs TOFCalibration_ref_masses test-data/TOFCalibration_ref_masses.txt
 ln -fs TOFCalibration_const test-data/TOFCalibration_const.csv
 
-if [ ! -d test-data/pepnovo_models/ ]; then
-    mkdir -p /tmp/pepnovo
-    wget -nc http://proteomics.ucsd.edu/Software/PepNovo/PepNovo.20120423.zip
-    unzip PepNovo.20120423.zip -d /tmp/pepnovo/
-    mv /tmp/pepnovo/Models test-data/pepnovo_models/
-    rm PepNovo.20120423.zip
-    rm -rf /tmp/pepnovo
-fi
+# if [ ! -d test-data/pepnovo_models/ ]; then
+#     mkdir -p /tmp/pepnovo
+#     wget -nc http://proteomics.ucsd.edu/Software/PepNovo/PepNovo.20120423.zip
+#     unzip PepNovo.20120423.zip -d /tmp/pepnovo/
+#     mv /tmp/pepnovo/Models test-data/pepnovo_models/
+#     rm PepNovo.20120423.zip
+#     rm -rf /tmp/pepnovo
+# fi
 ###############################################################################
 ## generate ctd files using the binaries in the conda package 
 ###############################################################################
@@ -170,6 +173,47 @@
 ###############################################################################
 ## create script to create results for the tests and run it
 ###############################################################################
+# parse data preparation calls from OpenMS sources for a tool with a given id
+function prepare_test_data {
+#     id=$1
+# | egrep -i "$id\_.*[0-9]+(_prepare\"|_convert)?"
+
+    OLD_OSW_PARAM=$(cat $OPENMSGIT/src/tests/topp/CMakeLists.txt |sed 's/#.*$//'| sed 's/^\s*//; s/\s*$//' |awk '{printf("%s@NEWLINE@", $0)}' |  sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | grep OLD_OSW_PARAM | head -n 1 | sed 's/^[^"]\+//; s/)$//; s/"//g')
+    # TODO SiriusAdapter depends on online service which may timeout .. so keep disabled https://github.com/OpenMS/OpenMS/pull/5010
+    cat $OPENMSGIT/src/tests/topp/CMakeLists.txt  $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake |
+        sed "s/\${OLD_OSW_PARAM}/$OLD_OSW_PARAM/" |
+        grep -v "\.ini\.json" |
+        sed 's/.ini.json /ini /' | 
+        sed 's/#.*$//'| 
+        sed 's/^\s*//; s/\s*$//' | 
+        grep -v "^$"  | 
+        awk '{printf("%s@NEWLINE@", $0)}' | 
+        sed 's/)@NEWLINE@/)\n/g' | sed 's/@NEWLINE@/ /g' | 
+        sed 's/degenerate_cases\///' | 
+        egrep -v "WRITEINI|WRITECTD|INVALIDVALUE|DIFF" | 
+        grep add_test | 
+        egrep "TOPP|UTILS" |
+        sed 's@${DATA_DIR_SHARE}/@@g;'|
+        sed 's@${TMP_RIP_PATH}@./@g'|
+        sed 's@TOFCalibration_ref_masses @TOFCalibration_ref_masses.txt @g; s@TOFCalibration_const @TOFCalibration_const.csv @'| 
+	sed 's/\("TOPP_SiriusAdapter_4".*\)-sirius:database all\(.*\)/\1-sirius:database pubchem\2/' |
+    while read line
+    do
+        test_id=$(echo "$line" | sed 's/add_test(//; s/"//g;  s/)[^)]*$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g' | cut -d" " -f1)
+
+        if grep -lq "$test_id"'\".* PROPERTIES WILL_FAIL 1' $OPENMSGIT/src/tests/topp/CMakeLists.txt $OPENMSGIT/src/tests/topp/THIRDPARTY/third_party_tests.cmake; then
+            >&2 echo "    skip failing "$test_id
+            continue
+        fi
+
+        line=$(echo "$line" | sed 's/add_test("//; s/)[^)]*$//; s/\${TOPP_BIN_PATH}\///g;s/\${DATA_DIR_TOPP}\///g; s#THIRDPARTY/##g' | cut -d" " -f2-)
+        # line="$(fix_tmp_files $line)"
+        echo 'echo executing "'$test_id'"'
+        echo "$line > $test_id.stdout 2> $test_id.stderr"
+        echo "if [[ \"\$?\" -ne \"0\" ]]; then >&2 echo '$test_id failed'; >&2 echo -e \"stderr:\n\$(cat $test_id.stderr | sed 's/^/    /')\"; echo -e \"stdout:\n\$(cat $test_id.stdout)\";fi"    
+    done
+}
+
 echo "Create test shell script"
 
 echo -n "" > prepare_test_data.sh
@@ -180,31 +224,19 @@
 echo 'export LUCIPHOR_BINARY="$(dirname $(realpath $(which luciphor2)))/luciphor2.jar"' >> prepare_test_data.sh
 
 echo 'export MARACLUSTER_BINARY="'"$OPENMSGIT"'/THIRDPARTY/Linux/64bit/MaRaCluster/maracluster"'>> prepare_test_data.sh
-echo 'export MSFRAGGER_BINARY="/home/berntm/Downloads/MSFragger-20171106/MSFragger-20171106.jar"'>> prepare_test_data.sh
+echo 'export MSFRAGGER_BINARY="/home/berntm/Downloads/MSFragger-3.5/MSFragger-3.5.jar"'>> prepare_test_data.sh
 echo 'export MSGFPLUS_BINARY="$(msgf_plus -get_jar_path)"' >> prepare_test_data.sh
 echo 'export MYRIMATCH_BINARY="myrimatch"'>> prepare_test_data.sh
 echo 'export NOVOR_BINARY="/home/berntm/Downloads/novor/lib/novor.jar"' >> prepare_test_data.sh
-echo 'export OMSSA_BINARY="$(dirname $(realpath $(which omssacl)))/omssacl"'>> prepare_test_data.sh
 echo 'export PERCOLATOR_BINARY="percolator"'>> prepare_test_data.sh
 echo 'export SIRIUS_BINARY="$(which sirius)"' >> prepare_test_data.sh
 echo 'export SPECTRAST_BINARY="'"$OPENMSGIT"'/THIRDPARTY/Linux/64bit/SpectraST/spectrast"' >> prepare_test_data.sh
 echo 'export XTANDEM_BINARY="xtandem"' >> prepare_test_data.sh
 echo 'export THERMORAWFILEPARSER_BINARY="ThermoRawFileParser.exe"' >> prepare_test_data.sh
+echo 'export SAGE_BINARY=sage' >> prepare_test_data.sh
 
 prepare_test_data >> prepare_test_data.sh #tmp_test_data.sh
 
-## prepare_test_data > tmp_test_data.sh
-## # remove calls not needed for the tools listed in any .list file
-## echo LIST $LIST
-## if [ ! -z "$LIST" ]; then
-##     REX=$(echo $LIST | sed 's/ /\n/g' | sed 's@.*/\([^/]\+\).xml$@\1@' | tr '\n' '|' | sed 's/|$//')
-## else
-##     REX=".*"
-## fi
-## echo REX $REX
-## cat tmp_test_data.sh | egrep "($REX)" >> prepare_test_data.sh
-## rm tmp_test_data.sh
-
 echo "Execute test shell script"
 chmod u+x prepare_test_data.sh
 cd ./test-data || exit
@@ -234,14 +266,11 @@
 for i in $(ls ctd/*ctd)
 do
     b=$(basename "$i" .ctd)
-    get_tests2 "$b" >> "$autotests"
+    ./get_tests.py --id "$b" --cmake "$OPENMSGIT"/src/tests/topp/CMakeLists.txt "$OPENMSGIT"/src/tests/topp/THIRDPARTY/third_party_tests.cmake >> "$autotests"
+    wc -l "$autotests"
 done
 echo "</macros>" >> "$autotests"
 
-# echo "Create test data links"
-# Breaks DecoyDatabase
-# link_tmp_files
-
 # tests for tools using output_prefix parameters can not be auto generated
 # hence we output the tests for manual curation in macros_test.xml
 # and remove them from the autotests
@@ -255,6 +284,7 @@
 #
 # not able to specify composite test data  
 # -> SpectraSTSearchAdapter 
+echo "Discard some tests"
 if [[ ! -z "$1" ]]; then
     echo "" > macros_discarded_auto.xml
     for i in OpenSwathFileSplitter IDRipper MzMLSplitter SeedListGenerator MSFraggerAdapter MaRaClusterAdapter NovorAdapter SpectraSTSearchAdapter
@@ -272,7 +302,7 @@
 ## remove broken symlinks in test-data
 find test-data/ -xtype l -delete
 
-if [ ! -z "$created" ]; then
+if [[ "$created" == "yes" ]]; then
     echo "Removing temporary directory"
     rm -rf "$tmp"
 fi