view macros.xml @ 7:b4f6df8fa89b draft

planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/fragpipe commit 9d8b2338a6a513124bc58223637ee4c5813e0bb4
author galaxyp
date Wed, 01 Oct 2025 22:20:54 +0000
parents 59fec1e2a6c3
children
line wrap: on
line source

<macros>
    <import>msfragger_macros.xml</import>
    <token name="@TOOL_VERSION@">23.0</token>
    <token name="@VERSION_SUFFIX@">0</token>

    <!--
        These keys were generated ONLY for use by the Galaxy tool wrapper, and only after
        the user has selected agreed to the academic-use only terms in the tool wrapper.
    -->
    <token name="@MSFRAGGER_ACADEMIC_USE_KEY@">f28c4be2-759b0a11-6c1ea652-1240565a</token>
    <token name="@IONQUANT_ACADEMIC_USE_KEY@">b6c0ad83-9a4e8900-3e83d29c-aeba3bfb</token>
    <token name="@DIATRACER_ACADEMIC_USE_KEY@">8de4daf3-a090ed0d-0acdb00a-1485d8a7</token>
    <xml name="requirements">
        <requirements>
            <requirement type="package" version="@TOOL_VERSION@">fragpipe</requirement>
        </requirements>
    </xml>

    <!-- TMT-n uses the following n first labels from TMT-18 -->
    <token name="@TMT_LABELS@">['126', '127N', '127C', '128N', '128C', '129N', '129C', '130N', '130C', '131N', '131C', '132N', '132C', '133N', '133C', '134N', '134C', '135N']</token>
    <token name="@iTRAQ-4_LABELS@">['114', '115', '116', '117']</token>
    <token name="@iTRAQ-8_LABELS@">['113', '114', '115', '116', '117', '118', '119', '121']</token>

    <!--
      User specifies input file format and selects sample files as are included by the scan_inputs macro

      User must also supply their own manifest file, a TSV file of the format:
      name, experiment, bioreplicate, data type
    -->
    <xml name="samples">
        <param name="inputs" type="data" format="mzml,mzxml,thermo.raw" multiple="true" label="Proteomics Spectrum files"  help="All input scan files must be named with one of the following extensions: .mzML, .mzXML, or .raw"/>
        <param name="input_prefix" type="text" value="" optional="true" label="File name prefix" help="Names inputs: prefix_rep#.mzXML Leave blank to use History names of inputs">
              <validator type="regex" message="">[a-zA-Z][a-zA-Z0-9_-]*</validator>
        </param>
        <param name="manifest" type="data" format="tabular" label="Manifest file" help="TSV file with entries for each input scan file: Name (Name of input Galaxy history item. Extension in the name must be .mzML, .mzXML, or .raw.), Experiment (empty, alphanumeric, or _), Bioreplicate (empty or integer), Data type (DDA, DIA, GPF-DIA, DIA-Quant, or DIA-lib)"/>
    </xml>

    <!--
      Prepares enviroment variables for FragPipe.
    -->
    <token name="@PREPARE_ENVIRONMENT@"><![CDATA[
        env_location="\$(dirname \$(which philosopher))/.." &&
        cp -r \${env_location}/share/fragpipe*/ fragpipe_local/ &&
        mkdir .cache .config tmp &&
        export XDG_CONFIG_HOME=\$(pwd)/.config &&
        export XDG_CACHE_HOME=\$(pwd)/.cache &&
        export JAVA_OPTS="\$JAVA_OPTS -Djava.io.tmpdir=\$(pwd)/tmp" &&
        export LD_LIBRARY_PATH="\$LD_LIBRARY_PATH:/usr/local/lib" &&
    ]]></token>

    <!--
      Prepares input scan files.

      Scans and moved to a scan directory and linked.

      Annotation files are copied into the scan directory for TMT workflows.
    -->
    <token name="@LINK_SAMPLES@"><![CDATA[
        CWD=\$(pwd | sed 's@/@\\/@g') &&

        mkdir -p scans &&
        #if $wf.workflow_name == "TMT10" or $wf.workflow_name == "TMT11"
            cp -p '$wf.annotation' 'scans/annotation.txt' &&
        #end if

        sed "s@^@\$CWD/scans/@" $manifest > fp.manifest &&

        #for $sf in $inputs
            #set $i_name = $ln_name($sf)

            ## speclib library does not follow links
            #if $wf.workflow_name == "DIA_SpecLib_Quant"
                cp '$sf' 'scans/${i_name}' &&
            #else
                ln -s '$sf' 'scans/${i_name}' &&
            #end if

        #end for
    ]]></token>

    <!--
      Prepares input files, excluding database.
    -->
    <token name="@PREPARE_INPUTS@"><![CDATA[
        mkdir -p outputs &&
        @CMD_IMPORTS@
        @LINK_SAMPLES@
    ]]></token>

    <!--
      Prepares database.

      First genericizes unknown sequence headers in the database.
      Then adds decoys, or decoys and contaminants depending on user selection.
    -->
    <token name="@PREPARE_DATABASE@"><![CDATA[
        '$__tool_directory__/genericize_db.py' $database_name genericized_db.fas &&

        #if str($database_options) != 'none'
            philosopher workspace --init &&
            philosopher database --custom genericized_db.fas --prefix rev_
            #if str($database_options) == 'decoy_and_contam'
                --contam
            #end if
            --contamprefix &&
            ln -s *-decoys-*.fas final_db.fas &&
        #else
            ln -s genericized_db.fas final_db.fas &&
        #end if
    ]]></token>

    <!--
      Prepares outputs.

      Creates log file symlink, makes a new directory for "combined" outputs and creates "concatenated" results.
    -->
    <token name="@PREPARE_OUTPUTS@"><![CDATA[
        cd outputs &&

        #if $output_options and 'combined_outputs' in $output_options
            mkdir combined_outputs &&
            find . -name 'combined*tsv' | xargs -I {} mv {} combined_outputs &&
        #end if

        ## For each category of results - psm, ion, peptide, protein - this loop concatenates results from each sample into a single result.
        ## For example, the entries sample1/psm.tsv and sample2/psm.tsv would be combined to concat_psm.tsv, a single psm.tsv header as its first line.
        for f in psm.tsv ion.tsv peptide.tsv protein.tsv; do
            n=0;
            for i in \$(find * -name \${f}); do
                d=\${i%/*};
                if [[ \$n == 0 ]]; then
                    awk 'NR==1{printf("Experiment\t%s\n",\$0);}' \$i > concat_\${f};
                fi;
                awk 'NR>1{printf("'"\${d}"'\t%s\n",\$0);}' \$i >> concat_\${f}; t=\$(echo \${i} | tr '/' '.');
                if [[ \${i} == \${t} ]]; then
                    mv \${i} 1.\${i};
                else
                    mv \${i} \${t};
                fi;
                n=\$((n+1));
            done;
        done
    ]]></token>

    <!-- Input database for MSFragger -->
    <xml name="fragger_database">
        <param name="database_name" type="data" format="fasta" label="Proteomics Search Database in FASTA format" help="Generic sequence headers in the input FASTA file that are not formatted according to the UniProt, NCBI, or ENSEMBL formats will be automatically prefixed with '>generic|' to avoid being misinterpreted by Philosopher."/>
        <!-- Whether to add decoys and contaminants to the database with Philosopher -->
        <param name="database_options"
               type="select"
               label="Decoys and contaminants"
               help="The default decoy prefix is &quot;rev_&quot;.">
            <option value="decoy_and_contam" selected="true">Add decoys and contaminants</option>
            <option value="decoy">Add decoys</option>
            <option value="none">Don't add decoys or contaminants</option>
        </param>

        <!-- Database may be split into chunks for performance benefits -->
        <param name="num_slices" type="integer" label="Split database" value="1" help="The number of chunks in which to split the database."/>
    </xml>

    <!--
      The following macro allows users to select their FragPipe workfow.

      For a given workflow selection, the relevant parameter sections are expanded. Options specific to the selected workflow
      are passed to the parameter definitions in the expand element.

      The Galaxy parameters overwrite a workflow file provided by FragPipe for the selected workflow. As a result, any parameters
      that are not defined in the Galaxy tool will fall back on the FragPipe defaults for that workflow. This logic is defined
      in the <configfile> element.
    -->
    <xml name="workflow">
        <conditional name="wf">
            <param name="workflow_name" type="select" label="Workflow">
                <option value="Basic-Search">Basic-Search</option>
                <option value="Open">Open</option>
                <option value="Nonspecific-HLA">Nonspecific-HLA</option>
                <option value="LFQ-MBR">LFQ-MBR</option>
                <option value="TMT10">TMT10</option>
                <option value="TMT11">TMT11</option>
                <option value="DIA_SpecLib_Quant">DIA_SpecLib_Quant</option>
            </param>

            <when value="Basic-Search">
                <section name="msfragger" expanded="false" title="MSFragger Options">
                    <expand macro="msfragger_default"/>
                </section>
                <expand macro="validation"
                  pep="false"
                  perc="false"
                  boost="true"
                  no="false"
                  masswidth="5"
                  clevel="0"
                  accmass="true"
                  decoyprobs="true"
                  nonparam="true"
                  expectscore="true"
                  ppm="true"
                  combined_pepxml="false"/>
                <expand macro="label_free_quantification" yes="false" no="true"/>
                <expand macro="ptm_shepherd" yes="false" no="true" c="true" z="true"/>
                <expand macro="isobaric_quantification" yes="false" no="true"/>
                <expand macro="diann_quantification" yes="false" no="true"/>
                <expand macro="dia_pseuedo_ms2"/>
            </when>

            <when value="Open">
                <section name="msfragger" expanded="false" title="MSFragger Options">
                    <expand macro="msfragger_open"/>
                </section>
                <expand macro="validation"
                  pep="true"
                  perc="false"
                  boost="false"
                  no="false"
                  masswidth="1000"
                  clevel="-2"
                  accmass="false"
                  decoyprobs="true"
                  nonparam="true"
                  expectscore="true"
                  ppm="false"
                  combined_pepxml="true">
                    <expand macro="crystalc"/>
                </expand>
                <expand macro="label_free_quantification" yes="false" no="true"/>
                <expand macro="ptm_shepherd" yes="true" no="false"/>
                <expand macro="isobaric_quantification" yes="false" no="true" bridge="false" pool="true"/>
                <expand macro="diann_quantification" yes="false" no="true"/>
                <expand macro="dia_pseuedo_ms2"/>
            </when>

            <when value="Nonspecific-HLA">
                <section name="msfragger" expanded="false" title="MSFragger Options">
                    <expand macro="msfragger_nonspecific_HLA"/>
                </section>
                <expand macro="validation"
                  pep="false"
                  perc="false"
                  boost="true"
                  no="true"
                  masswidth="5"
                  clevel="0"
                  accmass="true"
                  decoyprobs="true"
                  nonparam="true"
                  expectscore="true"
                  ppm="true"
                  combined_pepxml="false"/>
                <expand macro="label_free_quantification" yes="false" no="true"/>
                <expand macro="ptm_shepherd" yes="false" no="true"/>
                <expand macro="isobaric_quantification" yes="false" no="true"/>
                <expand macro="diann_quantification" yes="false" no="true"/>
                <expand macro="dia_pseuedo_ms2"/>
            </when>

            <when value="LFQ-MBR">
                <section name="msfragger" expanded="false" title="MSFragger Options">
                    <expand macro="msfragger_LFQ_MBR"/>
                </section>
                <expand macro="validation"
                  pep="false"
                  perc="false"
                  boost="true"
                  no="true"
                  masswidth="5"
                  clevel="0"
                  accmass="true"
                  decoyprobs="true"
                  nonparam="true"
                  expectscore="true"
                  ppm="true"
                  combined_pepxml="false"/>
                <expand macro="label_free_quantification" yes="true" no="false"/>
                <expand macro="ptm_shepherd" yes="false" no="true"/>
                <expand macro="isobaric_quantification" yes="false" no="true"/>
                <expand macro="diann_quantification" yes="false" no="true"/>
                <expand macro="dia_pseuedo_ms2"/>
            </when>

            <when value="DIA_SpecLib_Quant">
                <section name="msfragger" expanded="false" title="MSFragger Options">
                    <expand macro="msfragger_dia_speclib_quant"/>
                </section>
                <expand macro="validation"
                  pep="false"
                  perc="false"
                  boost="true"
                  no="false"
                  masswidth="5"
                  clevel="0"
                  accmass="true"
                  decoyprobs="true"
                  nonparam="true"
                  expectscore="true"
                  ppm="true"
                  combined_pepxml="false"
                  protp_minprob="0.5"
                  perc_minprob="0.7"/>
                <expand macro="label_free_quantification" yes="false" no="true"/>
                <expand macro="ptm_shepherd" yes="false" no="true" c="true" z="true"/>
                <expand macro="isobaric_quantification" yes="false" no="true"/>
                <expand macro="diann_quantification" yes="true" no="false"/>
                <expand macro="dia_pseuedo_ms2"/>
            </when>

            <when value="TMT10">
              <expand macro="tmt_options" plex="TMT-10"/>
            </when>

            <!-- TMT11 is not in FragPipe GUI -->
            <when value="TMT11">
              <expand macro="tmt_options" plex="TMT-11"/>
            </when>
        </conditional>
    </xml>

    <!-- Options for TMT workflows -->
    <xml name="tmt_options" token_plex="">
        <param name="annotation" type="data" format="txt" optional="false" label="annotation file" help=""/>
        <section name="msfragger" expanded="false" title="MSFragger Options">
            <expand macro="msfragger_TMT"/>
        </section>
        <expand macro="validation"
          pep="false"
          perc="false"
          boost="true"
          no="false"
          masswidth="5"
          clevel="0"
          accmass="true"
          decoyprobs="true"
          nonparam="true"
          expectscore="true"
          ppm="true"
          combined_pepxml="false"
          protp_minprob="0.5"/>
        <expand macro="isobaric_quantification" yes="true" no="false" plex="@PLEX@" level="2" ref_tag="Bridge" mod_tag="none"/>
        <expand macro="label_free_quantification" yes="false" no="true"/>
        <expand macro="ptm_shepherd" yes="false" no="true" token_unimod="false" token_common="true"/>
        <expand macro="diann_quantification" yes="false" no="true"/>
        <expand macro="dia_pseuedo_ms2"/>
    </xml>

    <!-- Generates the FragPipe workflow-->
    <xml name="workflow_configfile">
        <configfile name="workflow_configfile"><![CDATA[#slurp
            ## Create a fragpipe params dictionary from a file
            #set $comments = []
            #set $wfdict = {}
            #set $wfpath = $__tool_directory__ + '/workflows/' + str($wf.workflow_name) + '.workflow'
            #set $fh = open($wfpath, 'r')
            #for $line in $fh:
                #if $line.startswith('#')
                    #silent $comments.append($line)
                #elif $line.strip() != ''
                    #set $kv = $line.strip().split('=')
                    #if len($kv) < 2
                        #silent $kv.append('')
                    #end if
                    #set $wfdict[$kv[0]] = '='.join($kv[1:])
                #end if
            #end for

            #set $wfdict['database.db-path'] = 'final_db.fas'
            #set $wfdict['msfragger.misc.slice-db'] = $num_slices

            ## Get the MSFragger Params (shared with the MSFragger tool)
            #set $prefix = $wf.msfragger

            @MSFRAGGER_PARAM_DICT@
            #if len($vmods) > 0
              #set $msfragger_dict['table.var-mods'] = '; '.join([$re.sub('^(.*,)(\d)$','\\1true,\\2',m) for m in $vmods])
            #end if

            #set $fmod_items = [
                ("add_Cterm_peptide", "C-Term Peptide"),
                ("add_Nterm_peptide", "N-Term Peptide"),
                ("add_Cterm_protein", "C-Term Protein"),
                ("add_Nterm_protein", "N-Term Protein"),
                ("add_G_glycine","G (glycine)"),
                ("add_A_alanine", "A (alanine)"),
                ("add_S_serine", "S (serine)"),
                ("add_P_proline", "P (proline)"),
                ("add_V_valine", "V (valine)"),
                ("add_T_threonine", "T (threonine)"),
                ("add_C_cysteine", "C (cysteine)"),
                ("add_L_leucine", "L (leucine)"),
                ("add_I_isoleucine", "I (isoleucine)"),
                ("add_N_asparagine", "N (asparagine)"),
                ("add_D_aspartic_acid", "D (aspartic acid)"),
                ("add_Q_glutamine", "Q (glutamine)"),
                ("add_K_lysine", "K (lysine)"),
                ("add_E_glutamic_acid", "E (glutamic acid)"),
                ("add_M_methionine", "M (methionine)"),
                ("add_H_histidine", "H (histidine)"),
                ("add_F_phenylalanine", "F (phenylalanine)"),
                ("add_R_arginine", "R (arginine)"),
                ("add_Y_tyrosine", "Y (tyrosine)"),
                ("add_W_tryptophan", "W (tryptophan)"),
                ("add_B_user_amino_acid", "B "),
                ("add_J_user_amino_acid", "J"),
                ("add_O_user_amino_acid", "O"),
                ("add_U_user_amino_acid", "U"),
                ("add_X_user_amino_acid", "X"),
                ("add_Z_user_amino_acid", "Z")
            ]
            #set $fmod_string = ""
            #for $m in $fmod_items
                #set fmod_var_name = $m[0]
                #set fmod_wf_name = $m[1]
                #set $fmod_bool = $fmod_bools.get($fmod_var_name + "_bool")
                #set $fmod_val = $fmod_vals.get($fmod_var_name)
                #set $fmod_string += "; " + ",".join([str($fmod_val),str($fmod_wf_name),str($fmod_bool),"-1"])
            #end for
            #set $fmod_string = $fmod_string[2:]
            #set $msfragger_dict['table.fix-mods'] = $fmod_string

            #for $k in $msfragger_dict.keys()
                #set $kv = $k + '=' + str($msfragger_dict[$k])
                #set $wfk = 'msfragger.' + $k
                #set $wfdict[$wfk] = str($msfragger_dict[$k])
            #end for

            @VALIDATION@
            @PTM_SHEPHERD@
            @LABEL_FREE_QUANTIFICATION@
            @ISOBARIC_QUANTIFICATION@
            @DIANN_QUANTIFICATION@
            @DIA_PSEUDO_MS2@

            ## These values are specifically set by the GUI when running DIA_SpecLib_Quant
            #if $wf.workflow_name == "DIA_SpecLib_Quant"
                #set $wfdict["ptmshepherd.annotate_assigned_mods"] = "false"
                #set $wfdict["ptmshepherd.use_msfragger_localization"] = "true"
            #end if

            ## Populate the workflow with configuration and comment dictionary entries populated by tool params.
            #for $comment in $comments
$comment
            #end for

            #for $k in sorted($wfdict.keys())
              #set $kv = $k + '=' + str($wfdict[$k])
$kv
            #end for
#slurp]]></configfile>
    </xml>

    <!-- Percolator options -->
    <xml name="percolator" token_perc_minprob="0.5">
        <section name="percolator" expanded="true" title="Percolator">
            <param name="keep_tsv_files" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Keep intermediate files"/>
            <param name="min_prob" type="float" value="@PERC_MINPROB@" label="Minimum probability (default 0.5)"/>
        </section>
    </xml>

    <!-- Set Percolator workflow options -->
    <token name="@PERCOLATOR@"><![CDATA[
        #set $prc = $wf.validation.validation_tab.psm_validation.percolator
        #set $wfdict['percolator.run-percolator'] = 'true'
        #set $wfdict['percolator.keep-tsv-files'] = str($prc.keep_tsv_files)
        #set $wfdict['percolator.min-prob'] = str($prc.min_prob)
    ]]></token>

    <xml name="msbooster">
        <section name="msbooster" expanded="true" title="MSBooster">
            <param name="predict_rt" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Predict RT"/>
            <param name="predict_spectra" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Predict spectra"/>
            <param name="predict_im" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Predict IM"/>
            <param name="use_koina" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Use Koina server" help="The public server used is https://koina.wilhelmlab.org:443/v2/models"/>
            <param name="find_best_rt_model" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Find best RT model (requires Koina server)"/>
            <param name="find_best_im_model" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Find best IM model if applicable (requires Koina server)"/>
            <param name="find_best_spectra_model" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Find best spectral model (requires Koina server)"/>
        </section>
    </xml>
    <token name="@MSBOOSTER@"><![CDATA[
        #set $prfx = $wf.validation.validation_tab.psm_validation.msbooster
        #set $wfdict['msbooster.run-msbooster'] = 'true'
        #set $wfdict['msbooster.predict-rt'] = $prfx.predict_rt
        #set $wfdict['msbooster.predict-spectra'] = $prfx.predict_spectra
        #set $wfdict['msbooster.predict-im'] = $prfx.predict_im
        #if $prfx.use_koina == 'true'
            #set $wfdict['msbooster.koina-url'] = 'https://koina.wilhelmlab.org:443/v2/models/'
        #end if
        #set $wfdict['msbooster.find-best-rt-model'] = $prfx.find_best_rt_model
        #set $wfdict['msbooster.find-best-spectra-model'] = $prfx.find_best_spectra_model
        #set $wfdict['msbooster.find-best-im-model'] = $prfx.find_best_im_model
    ]]></token>


    <!-- Philosopher Report (phi-report) options -->
    <xml name="phi_report">
        <conditional name="phi_report">
            <param name="run_phi_report" type="select" label="Generate Philosopher Reports">
                <option value="true" selected="true">Yes</option>
                <option value="false">No</option>
            </param>
            <when value="true">
              <section name="phi_report_opts" expanded="false" title="FDR Filter and Report">
                  <param name="dont_use_prot_proph_file" type="boolean" truevalue="true" falsevalue="false" checked="false"/>
                  <param name="print_decoys" type="boolean" truevalue="true" falsevalue="false" checked="false"/>
              </section>
            </when>
            <when value="false"/>
        </conditional>
    </xml>

    <!-- Set Philosopher Report (phi-report) workflow options -->
    <token name="@PHIREPORT@"><![CDATA[
        #set $prfx = $wf.validation.validation_tab.phi_report
        #if $prfx.run_phi_report == 'true'
          #set $wfdict['phi-report.run-report'] = 'true'
          #set $prfx = $wf.validation.validation_tab.phi_report.phi_report_opts
          #set $wfdict['phi-report.print-decoys'] = $prfx.print_decoys
          #set $wfdict['phi-report.dont-use-prot-proph-file'] = $prfx.dont_use_prot_proph_file
        #else
          #set $wfdict['phi-report.run-report'] = 'false'
        #end if
    ]]></token>

    <!-- PeptideProphet options -->
    <xml name="peptide_prophet" token_masswidth="5" token_clevel="0" token_accmass="true" token_decoyprobs="true" token_nonparam="true" token_expectscore="true" token_ppm="true" token_combined_pepxml="false">
        <section name="peptide_prophet" expanded="true" title="PeptideProphet">
            <param name="combined_pepxml" type="boolean" truevalue="true" falsevalue="false" checked="@COMBINED_PEPXML@" label="Single combined pepxml per experiment or group"/>
            <param argument="--decoyprobs" type="boolean" truevalue="--decoyprobs" falsevalue="" checked="@DECOYPROBS@" label="compute possible non-zero probabilities for Decoy entries on the last iteration"/>
            <param argument="--ppm" type="boolean" truevalue="--ppm" falsevalue="" checked="@PPM@" label="use PPM mass error instead of Dalton for mass modeling"/>
            <param argument="--accmass" type="boolean" truevalue="--accmass" falsevalue="" checked="@ACCMASS@" label="use Accurate Mass model binning"/>
            <param argument="--nonparam" type="boolean" truevalue="--nonparam" falsevalue="" checked="@NONPARAM@" label="use semi-parametric modeling, must be used in conjunction with --decoy option"/>
            <param argument="--expectscore" type="boolean" truevalue="--expectscore" falsevalue="" checked="@EXPECTSCORE@" label="use expectation value as the only contributor to the f-value for modeling"/>
            <param argument="--masswidth" type="float" value="@MASSWIDTH@" label="model mass width (default 5)"/>
            <param argument="--clevel" type="integer" value="@CLEVEL@" label="set Conservative Level in neg_stdev from the neg_mean, low numbers are less conservative, high numbers are more conservative"/>
            <param argument="--glyc" type="boolean" truevalue="--glyc" falsevalue="" checked="false" label="enable peptide Glyco motif model"/>
            <param argument="--combine" type="boolean" truevalue="--combine" falsevalue="" checked="false" label="combine the results from PeptideProphet into a single result file" />
            <param argument="--minpeplen" type="integer" value="7" label="minimum peptide length not rejected (default 7)" />
            <param argument="--minprob" type="float" value="0.05" label="report results with minimum probability" />
            <param argument="--nomass" type="boolean" truevalue="--nomass" falsevalue="" checked="false" label="disable mass model" />
            <param argument="--nonmc" type="boolean" truevalue="--nonmc" falsevalue="" checked="false" label="disable NMC missed cleavage model" />
            <param argument="--nontt" type="boolean" truevalue="--nontt" falsevalue="" checked="false" label="disable NTT enzymatic termini model" />
            <param argument="--phospho" type="boolean" truevalue="--phospho" falsevalue="" checked="false" label="enable peptide phospho motif model" />
        </section>
    </xml>
    <token name="@PEPTIDEPROPHET@"><![CDATA[
        #set $prfx = $wf.validation.validation_tab.psm_validation.peptide_prophet
        #set $wfdict['peptide-prophet.run-peptide-prophet'] = 'true'
        #set $wfdict['peptide-prophet.combine-pepxml'] = str($prfx.combined_pepxml)
        #set $cmd_opts = [str($prfx.accmass),str($prfx.combine),str($prfx.decoyprobs),str($prfx.expectscore),str($prfx.glyc),str($prfx.nomass),str($prfx.nonmc),str($prfx.nonparam),str($prfx.nontt),str($prfx.phospho),str($prfx.ppm)]
        #silent $cmd_opts.append('--clevel ' + str($prfx.clevel))
        #silent $cmd_opts.append('--masswidth ' + str($prfx.masswidth))
        #silent $cmd_opts.append('--minpeplen ' + str($prfx.minpeplen))
        #silent $cmd_opts.append('--minprob ' + str($prfx.minprob))
        #set $wfdict['peptide-prophet.cmd-opts'] = ' '.join($cmd_opts).strip()
    ]]></token>

    <!-- CrystalC options -->
    <xml name="crystalc">
        <param name="run_crystalc" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Run Crystal-C" help="Recommend for open searches for additional resuts cleanup"/>
    </xml>

    <!-- Protein Prophet options -->
    <xml name="protein_prophet" token_protp_minprob="0.05">
        <conditional name="protein_prophet">
            <param name="run_protein_prophet" type="select" label="Run Protein Prophet">
                <option value="true" selected="true">Yes</option>
                <option value="false">No</option>
            </param>
            <when value="true">
              <section name="protein_prophet_opts" expanded="true" title="Protein Prophet">
                <param argument="--iprophet" type="boolean" truevalue="--iprophet" falsevalue="" checked="false" label="input is from iProphet" />
                <param argument="--maxppmdiff" type="integer" value="2000000" label="maximum peptide mass difference in ppm (default 2000000)" />
                <param argument="--minprob" type="float" value="@PROTP_MINPROB@" label="PeptideProphet probability threshold (default 0.05)" />
                <param argument="--nonsp" type="boolean" truevalue="--nonsp" falsevalue="" checked="false" label="do not use NSP model" />
                <param argument="--subgroups" type="boolean" truevalue="--subgroups" falsevalue="" checked="false" label="do not use NOGROUPS" />
                <param argument="--unmapped" type="boolean" truevalue="--unmapped" falsevalue="" checked="false" label="report results for UNMAPPED proteins" />
              </section>
            </when>
            <when value="false"/>
        </conditional>
    </xml>

    <!-- Set ProteinProphet workflow options -->
    <token name="@PROTEINPROPHET@"><![CDATA[
        #set $prfx = $wf.validation.validation_tab.protein_prophet
        #if $prfx.run_protein_prophet == 'true'
            #set $prfx = $wf.validation.validation_tab.protein_prophet.protein_prophet_opts
            #set $wfdict['protein-prophet.run-protein-prophet'] = 'true'
            #set $cmd_opts = [str($prfx.iprophet),str($prfx.nonsp),str($prfx.subgroups),str($prfx.unmapped)]
            #silent $cmd_opts.append('--maxppmdiff ' + str($prfx.maxppmdiff))
            #silent $cmd_opts.append('--minprob ' + str($prfx.minprob))
            #set $wfdict['protein-prophet.cmd-opts'] = ' '.join($cmd_opts).strip()
        #else
            #set $wfdict['protein-prophet.run-protein-prophet'] = 'false'
        #end if
    ]]></token>

    <!-- Validation options. Includes PeptideProphet, Percolator, MSBooster, ProteinProphet, and CrystalC -->
    <xml name="validation" token_expand="false" token_pep="false" token_perc="false" token_boost="false" token_no="true" token_masswidth="5" token_clevel="0" token_accmass="true" token_decoyprobs="true" token_nonparam="true" token_expectscore="true" token_ppm="true" token_combined_pepxml="false" token_protp_minprob="0.05" token_perc_minprob="0.5">
        <section name="validation" expanded="@EXPAND@" title="Validation">
            <conditional name="validation_tab">
                <param name="run_validation" type="select" label="Run Validation">
                    <option value="true" selected="true">Yes</option>
                    <option value="false">No</option>
                </param>
                <when value="true">
                    <yield/> <!-- crystalc -->
                    <conditional name="psm_validation">
                        <param name="run_psm_validation" type="select" label="PSM Validation">
                            <option value="peptide_prophet" selected="@PEP@">Run PeptideProphet</option>
                            <option value="percolator" selected="@PERC@">Run Percolator</option>
                            <option value="msbooster_percolator" selected="@BOOST@">Run MSBooster and Percolator</option>
                            <option value="no" selected="@NO@">Use workflow values</option>
                        </param>
                        <when value="peptide_prophet">
                            <expand macro="peptide_prophet" masswidth="@MASSWIDTH@" clevel="@CLEVEL@" accmass="@ACCMASS@" decoyprobs="@DECOYPROBS@" nonparam="@NONPARAM@" expectscore="@EXPECTSCORE@" ppm="@PPM@" combined_pepxml="@COMBINED_PEPXML@"/>
                        </when>
                        <when value="percolator">
                            <expand macro="percolator" perc_minprob="@PERC_MINPROB@"/>
                        </when>
                        <when value="msbooster_percolator">
                            <expand macro="msbooster"/>
                            <expand macro="percolator" perc_minprob="@PERC_MINPROB@"/>
                        </when>
                        <when value="no">
                        </when>
                    </conditional>
                    <expand macro="protein_prophet" protp_minprob="@PROTP_MINPROB@"/>
                    <expand macro="phi_report"/>
                </when>
                <when value="false">
                </when>
            </conditional>
        </section>
    </xml>

    <!-- Set validation workflow options -->
    <token name="@VALIDATION@"><![CDATA[
        #if $wf.validation.validation_tab.run_validation == "true"
            #set $prfx = $wf.validation.validation_tab.psm_validation
            #if $prfx.run_psm_validation == 'peptide_prophet'
                #set $wfdict['run-psm-validation'] = 'true'
                #set $wfdict['msbooster.run-msbooster'] = 'false'
                #set $wfdict['percolator.run-percolator'] = 'false'
                @PEPTIDEPROPHET@
            #elif $prfx.run_psm_validation == 'percolator'
                #set $wfdict['run-psm-validation'] = 'true'
                #set $wfdict['msbooster.run-msbooster'] = 'false'
                #set $wfdict['peptide-prophet.run-peptide-prophet'] = 'false'
                @PERCOLATOR@
            #elif $prfx.run_psm_validation == 'msbooster_percolator'
                #set $wfdict['run-psm-validation'] = 'true'
                #set $wfdict['peptide-prophet.run-peptide-prophet'] = 'false'
                @MSBOOSTER@
                @PERCOLATOR@
            #end if
            @PROTEINPROPHET@
            @PHIREPORT@
        #else
            #set $wfdict['run-psm-validation'] = 'false'
            #set $wfdict['msbooster.run-msbooster'] = 'false'
            #set $wfdict['peptide-prophet.run-peptide-prophet'] = 'false'
            #set $wfdict['percolator.run-percolator'] = 'false'
            #set $wfdict['protein-prophet.run-protein-prophet'] = 'false'
            #set $wfdict['phi-report.run-report'] = 'false'
        #end if
    ]]></token>

    <!-- PTM-Sheperd options -->
    <xml name="ptm_shepherd" token_expand="false" token_yes="true" token_no="false" token_a="false" token_b="true" token_c="false" token_x="false" token_y="true" token_z="false" token_unimod="true" token_common="false" token_glyco="false" token_custom="false">
        <section name="ptms" expanded="false" title="PTMs">
            <conditional name="ptm_shepherd">
                <param name="run_ptm_shepherd" type="select" label="Run PTM Shepherd">
                    <option value="yes" selected="@YES@">yes</option>
                    <option value="no" selected="@NO@">no</option>
                </param>
                <when value="yes">
                    <param name="output_extended" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Extended output"/>
                    <section name="ptm_profiling" expanded="false" title="PTM Profiling">
                        <param name="histo_smoothbins" type="integer" value="" min="0" optional="true" label="Smoothing factor" help="ptmshepherd.histo_smoothbins"/>
                        <param name="precursor_mass_units" type="select" label="Precursor Mass tolerance units" help="ptmshepherd.precursor_mass_units">
                            <option value="1" selected="true">ppm</option>
                            <option value="0" selected="false">Daltons</option>
                        </param>
                        <param name="precursor_tol" type="float" value="" min="0" optional="true" label="Precursor tolerance" help="ptmshepherd.precursor_tol"/>
                        <param name="peakpicking_promRatio" type="float" value="" min="0" optional="true" label="Prominece ratio" help="ptmshepherd.peakpicking_promRatio"/>
                        <param name="peakpicking_mass_units" type="select" label="Peakpicking Mass tolerance units" help="ptmshepherd.peakpicking_mass_units">
                            <option value="1" selected="true">ppm</option>
                            <option value="0" selected="false">Daltons</option>
                        </param>
                        <param name="peakpicking_width" type="float" value="" min="0" optional="true" label="Peak picking width" help="ptmshepherd.peakpicking_width"/>
                        <param name="peakpicking_minPsm" type="integer" value="" min="0" optional="true" label="Peak minimum PSMs" help="ptmshepherd.peakpicking_minPsm"/>
                        <param name="spectra_ppmtol" type="float" value="" min="0" optional="true" label="Fragment Mass tolerance (PPM)" help="ptmshepherd.spectra_ppmtol"/>
                        <param name="normalization" type="select" optional="true" label="Normalize data to" help="ptmshepherd.normalization-psms ptmshepherd.normalization-scans">
                            <option value="psms" selected="true">PSMs</option>
                            <option value="scans" selected="false">MS2 scans</option>
                        </param>
                        <param name="varmod_masses" type="select" optional="true" label="Custom mass shifts" help="ptmshepherd.varmod_masses">
                            <option value="Failed_Carbamidomethylation\:-57.021464">Failed_Carbamidomethylation:-57.021464</option>
                        </param>
                    </section>
                    <section name="ptm_annotation" expanded="true" title="PTM Annotation">
                        <param name="annotation_tol" type="float" value="" min="0" optional="true" label="Annotation tolerance (Da)" help="ptmshepherd.annotation_tol"/>
                        <conditional name="annotation">
                            <param name="annotation_source" type="select" label="Annotation source" help="ptmshepherd.annotation">
                                <option value="unimod" selected="@UNIMOD@">Unimod</option>
                                <option value="common" selected="@COMMON@">Common mass shifts</option>
                                <option value="glyco" selected="@GLYCO@">Glyco mass shifts</option>
                                <option value="custom" selected="@CUSTOM@">Custom annotation file</option>
                            </param>
                            <when value="unimod"/>
                            <when value="common"/>
                            <when value="glyco"/>
                            <when value="custom">
                                <param name="annotation_file" type="data" format="txt" label="Custom annotation file"/>
                            </when>
                        </conditional>
                    </section>
                    <section name="ptm_localization" expanded="false" title="PTM Localization">
                        <param name="nions" type="select" multiple="true" optional="true" label="Use specified N-term ions" help="(default: a,b for CID, c for ETD)">
                            <option value="a" selected="@A@">a</option>
                            <option value="b" selected="@B@">b</option>
                            <option value="c" selected="@C@">c</option>
                        </param>
                        <param name="cions" type="select" multiple="true" optional="true" label="use specified C-term ions" help="(default: y for CID, z for ETD)">
                            <option value="x" selected="@X@">x</option>
                            <option value="y" selected="@Y@">y</option>
                            <option value="z" selected="@Z@">z</option>
                        </param>
                        <param name="spectra_maxfragcharge" type="integer" value="" min="0" optional="true" label="Max fragment charge" help="ptmshepherd.spectra_maxfragcharge"/>
                        <param name="localization_allowed_res" type="select" label="Restrict localization to" help="ptmshepherd.localization_allowed_res">
                            <option value="" selected="true">none</option>
                            <option value="all">all</option>
                            <option value="N">N</option>
                            <option value="ST">ST</option>
                        </param>
                    </section>
                    <!-- Not yet implemented
                    <section name="ion_discovery" expanded="false" title="Diagnostic Ion Discovery">
                    </section>
                    <section name="glycan" expanded="false" title="Gyclan Assignment and FDR">
                    </section>
                    -->
                </when>
                <when value="no"/>
            </conditional>
        </section>
    </xml>

    <!-- Set PTM-Sheperd workflow options -->
    <token name="@PTM_SHEPHERD@"><![CDATA[
        #set $prfx = $wf.ptms.ptm_shepherd
        #if $prfx.run_ptm_shepherd == 'yes'
            #set $wfdict['ptmshepherd.run-shepherd'] = 'true'
            #set $cxt = $prfx.ptm_profiling
            #set $wfdict['ptmshepherd.output_extended'] = $prfx.output_extended
            #if $cxt.histo_smoothbins != ''
                #set $wfdict['ptmshepherd.histo_smoothbins'] = $cxt.histo_smoothbins
            #end if
            #if $cxt.precursor_tol != ''
                #set $wfdict['ptmshepherd.precursor_mass_units'] = $cxt.precursor_mass_units
                #set $wfdict['ptmshepherd.precursor_tol'] = $cxt.precursor_tol
            #end if
            #if $cxt.peakpicking_promRatio != ''
                #set $wfdict['ptmshepherd.peakpicking_promRatio'] = $cxt.peakpicking_promRatio
            #end if
            #if $cxt.peakpicking_width != ''
                #set $wfdict['ptmshepherd.peakpicking_mass_units'] = $cxt.peakpicking_mass_units
                #set $wfdict['ptmshepherd.peakpicking_width'] = $cxt.peakpicking_width
            #end if
            #if $cxt.peakpicking_minPsm != ''
                #set $wfdict['ptmshepherd.peakpicking_minPsm'] = $cxt.peakpicking_minPsm
            #end if
            #if $cxt.spectra_ppmtol != ''
                #set $wfdict['ptmshepherd.spectra_ppmtol'] = $cxt.spectra_ppmtol
            #end if
            #if $cxt.normalization != 'None'
                #if $cxt.normalization == "psms"
                    #set $wfdict['ptmshepherd.normalization-psms'] = 'true'
                    #set $wfdict['ptmshepherd.normalization-scans'] = 'false'
                #else
                    #set $wfdict['ptmshepherd.normalization-psms'] = 'false'
                    #set $wfdict['ptmshepherd.normalization-scans'] = 'true'
                #end if
            #end if
            #if $cxt.varmod_masses != 'None'
                #set $wfdict['ptmshepherd.varmod_masses'] = $cxt.varmod_masses
            #end if
            #set $cxt = $prfx.ptm_annotation
            #if $cxt.annotation_tol != ''
                #set $wfdict['ptmshepherd.annotation_tol'] = $cxt.annotation_tol
            #end if
            #if $cxt.annotation.annotation_source == 'unimod'
                #set $wfdict['ptmshepherd.annotation-unimod'] = 'true'
                #set $wfdict['ptmshepherd.annotation-common'] = 'false'
                #set $wfdict['ptmshepherd.annotation-glyco'] = 'false'
                #set $wfdict['ptmshepherd.annotation-custom'] = 'false'
            #elif $cxt.annotation.annotation_source == 'common'
                #set $wfdict['ptmshepherd.annotation-unimod'] = 'false'
                #set $wfdict['ptmshepherd.annotation-common'] = 'true'
                #set $wfdict['ptmshepherd.annotation-glyco'] = 'false'
                #set $wfdict['ptmshepherd.annotation-custom'] = 'false'
            #elif $cxt.annotation.annotation_source == 'glyco'
                #set $wfdict['ptmshepherd.annotation-unimod'] = 'false'
                #set $wfdict['ptmshepherd.annotation-common'] = 'false'
                #set $wfdict['ptmshepherd.annotation-glyco'] = 'true'
                #set $wfdict['ptmshepherd.annotation-custom'] = 'false'
            #elif $cxt.annotation.annotation_source == 'custom'
                #set $wfdict['ptmshepherd.annotation-unimod'] = 'false'
                #set $wfdict['ptmshepherd.annotation-common'] = 'false'
                #set $wfdict['ptmshepherd.annotation-glyco'] = 'false'
                #set $wfdict['ptmshepherd.annotation-custom'] = 'true'
                #set $wfdict['ptmshepherd.annotation_file'] = $cxt.annotation.annotation_file
            #end if
            #set $cxt = $prfx.ptm_localization
            #if $cxt.nions is not None
                #set $wfdict['ptmshepherd.iontype_a'] = str('a' in $cxt.nions).lower()
                #set $wfdict['ptmshepherd.iontype_b'] = str('b' in $cxt.nions).lower()
                #set $wfdict['ptmshepherd.iontype_c'] = str('c' in $cxt.nions).lower()
            #end if
            #if $cxt.cions is not None
                #set $wfdict['ptmshepherd.iontype_x'] = str('x' in $cxt.cions).lower()
                #set $wfdict['ptmshepherd.iontype_y'] = str('y' in $cxt.cions).lower()
                #set $wfdict['ptmshepherd.iontype_z'] = str('z' in $cxt.cions).lower()
            #end if
            #if $cxt.spectra_maxfragcharge != ''
                #set $wfdict['ptmshepherd.spectra_maxfragcharge'] = $cxt.spectra_maxfragcharge
            #end if
            #set $wfdict['ptmshepherd.localization_allowed_res'] = $cxt.localization_allowed_res
        #else
            #set $wfdict['ptmshepherd.run-shepherd'] = 'false'
        #end if
    ]]></token>

    <token name="@RE_EXCLUDEMOD@">@RE_AA@,@RE_FLOAT@</token>
    <token name="@RE_EXCLUDEMODS@">@RE_EXCLUDEMOD@(;\s*@RE_EXCLUDEMOD@)*</token>

    <!-- Label-free quantification options -->
    <xml name="label_free_quantification" token_expand="false">
       <section name="quant_ms1" expanded="@EXPAND@" title="Quant (MS1)">
            <conditional name="label_free_quantification">
                <param name="label_free_quantification_run" type="select" label="Perform Label-Free Quantification">
                    <option value="default" selected="true">Use workflow default</option>
                    <option value="no">No Label-Free Quantification</option>
                    <option value="ionquant">Run IonQuant</option>
                    <option value="freequant">Run FreeQuant</option>
                </param>
                <when value="default"/>
                <when value="no"/>
                <when value="ionquant">
                    <section name="ionquant" expanded="false" title="IonQuant Label-Free Quantification">
                        <param name="mbr_select" type="select" optional="true" label="Match between runs (MBR)" help="ionquant.mbr">
                            <option value="0">No</option>
                            <option value="1">Yes</option>
                        </param>
                        <param name="normalization" type="select" optional="true" label="Normalize" help="ionquant.normalization">
                            <option value="0">No</option>
                            <option value="1">Yes</option>
                        </param>
                        <section name="feature_detection" expanded="false" title="Feature detection">
                            <param name="mztol" type="integer" value="" optional="true" label="m/z tolerance in ppm" help="ionquant.mztol (default 10)"/>
                            <param name="rttol" type="float" value="" optional="true" label="RT tolerance (minutes)" help="ionquant.rttol (default 0.4)"/>
                            <param name="imtol" type="float" value="" optional="true" label="IM tolerance (1/k0)" help="ionquant.imtol (default 0.05)"/>
                        </section>
                        <section name="mbr" expanded="false" title="Match between runs (MBR)">
                            <param name="mbrrttol" type="float" value="" optional="true" label="MBR RT tolerance (minutes)" help="ionquant.mbrrttol"/>
                            <param name="mbrimtol" type="float" value="" optional="true" label="MBR IM tolerance (1/k0)" help="ionquant.mbrimtol"/>
                            <param name="mbrmincorr" type="float" value="" optional="true" label="MBR min correlation" help="ionquant.mbrmincorr"/>
                            <param name="mbrtoprun" type="integer" value="" optional="true" label="MBR top runs" help="ionquant.mbrtoprun"/>
                            <param name="ionfdr" type="float" value="" min="0.00001" max="1.0" optional="true" label="MBR ion FDR" help="ionquant.ionfdr"/>
                            <param name="peptidefdr" type="float" value="" min="0.00001" max="1.0" optional="true" label="MBR peptide FDR" help="ionquant.peptidefdr"/>
                            <param name="proteinfdr" type="float" value="" min="0.00001" max="1.0" optional="true" label="MBR protein FDR" help="ionquant.proteinfdr"/>
                        </section>
                        <section name="topn" expanded="false" title="Top-N options">
                            <param name="tp" type="integer" value="" min="0" optional="true" label="Top N ions" help="ionquant.tp"/>
                            <param name="minfreq" type="float" value="" min="0.0" max="1.0" optional="true" label="Min freq" help="ionquant.minfreq"/>
                        </section>
                        <conditional name="labeling_conditional">
                            <param name="labeling_option" type="select" label="Labeling option">
                              <option value="lfq" selected="true">LFQ</option>
                              <option value="labeling">Labeling</option>
                            </param>
                            <when value="lfq">
                              <section name="lfq" expanded="false" title="LFQ">
                                <param name="maxlfq" type="select" optional="true" label="MaxLFQ" help="ionquant.maxlfq">
                                    <option value="0">No</option>
                                    <option value="1">Yes</option>
                                </param>
                                <param name="minions" type="integer" value="" optional="true" label="Min ions" help="ionquant.minions"/>
                              </section>
                            </when>
                            <when value="labeling">
                              <section name="labeling" expanded="false" title="Labeling-based quant">
                                  <param name="light" type="select" label="Light" help="ionquant.light">
                                      <option value="" selected="true">none</option>
                                      <option value="C463.2366">C463.2366</option>
                                      <option value="C464.28596">C464.28596</option>
                                      <option value="C561.3387">C561.3387</option>
                                      <option value="K0;R0">K0;R0</option>
                                  </param>
                                  <param name="medium" type="select" label="Medium" help="ionquant.medium">
                                      <option value="" selected="true">none</option>
                                      <option value="K4.025107;R6.020129">K4.025107;R6.020129</option>
                                  </param>
                                  <param name="heavy" type="select" label="Heavy" help="ionquant.heavy">
                                      <option value="" selected="true">none</option>
                                      <option value="C467.2529">C467.2529</option>
                                      <option value="C470.29977">C470.29977</option>
                                      <option value="C567.3462">C567.3462</option>
                                      <option value="K8.014199;R10.008269">K8.014199;R10.008269</option>
                                  </param>
                                  <param name="requantify" type="select" label="Re-quantify" help="ionquant.requantify">
                                      <option value="0">No</option>
                                      <option value="1" selected="true">Yes</option>
                                  </param>
                              </section>
                            </when>
                        </conditional>
                        <section name="advanced" expanded="false" title="Advanced options">
                            <param name="excludemods" type="text" optional="true" label="excludemods" help="ionquant.excludemods">
                                <validator type="regex">^\s*@RE_EXCLUDEMODS@\s*$</validator>
                            </param>
                            <param name="minscans" type="integer" value="" min="0" optional="true" label="Min scans" help="ionquant.minscans"/>
                            <param name="minisotopes" type="integer" value="" min="1" max="3" optional="true" label="Min isotopes" help="ionquant.minisotopes"/>
                            <param name="locprob" type="float" value="" min="0.0" max="1.0" optional="true" label="Min site probability" help="ionquant.locprob"/>
                            <param name="writeindex" type="select" optional="true" label="Write index" help="ionquant.writeindex">
                                <option value="0">No</option>
                                <option value="1">Yes</option>
                            </param>
                        </section>
                    </section>
                </when>
                <when value="freequant">
                    <section name="freequant" expanded="false" title="IonQuant Label-Free Quantification">
                        <param name="rt_tol" type="float" value="" min="0" optional="true" label="RT Window (minutes)"/>
                        <param name="mz_tol" type="integer" value="" min="1" optional="true" label="m/z Window (ppm)"/>
                    </section>
                </when>
            </conditional>
        </section>
    </xml>

    <!-- Set label-free quantification workflow options -->
    <token name="@LABEL_FREE_QUANTIFICATION@"><![CDATA[
        #set $prfx = $wf.quant_ms1.label_free_quantification
        #if $prfx.label_free_quantification_run == 'no'
            #set $wfdict['quantitation.run-label-free-quant'] = 'false'
            #set $wfdict['ionquant.run-ionquant'] = 'false'
            #set $wfdict['freequant.run-freequant'] = 'false'
        #elif $prfx.label_free_quantification_run == 'ionquant'
            #set $wfdict['quantitation.run-label-free-quant'] = 'true'
            #set $wfdict['ionquant.run-ionquant'] = 'true'
            #set $wfdict['freequant.run-freequant'] = 'false'
            #set $cxt = $prfx.ionquant
            #if $cxt.mbr_select != 'None'
                #set $wfdict['ionquant.mbr'] = $cxt.mbr_select
            #end if
            #if $cxt.normalization != 'None'
                #set $wfdict['ionquant.normalization'] = $cxt.normalization
            #end if
            #set $cxt = $prfx.ionquant.feature_detection
            #if $cxt.mztol != ''
                #set $wfdict['ionquant.mztol'] = $cxt.mztol
            #end if
            #if $cxt.rttol != ''
                #set $wfdict['ionquant.rttol'] = $cxt.rttol
            #end if
            #if $cxt.imtol != ''
                #set $wfdict['ionquant.imtol'] = $cxt.imtol
            #end if
            #set $cxt = $prfx.ionquant.mbr
            #if $cxt.mbrrttol != ''
                #set $wfdict['ionquant.mbrrttol'] = $cxt.mbrrttol
            #end if
            #if $cxt.mbrimtol != ''
                #set $wfdict['ionquant.mbrimtol'] = $cxt.mbrimtol
            #end if
            #if $cxt.mbrmincorr != ''
                #set $wfdict['ionquant.mbrmincorr'] = $cxt.mbrmincorr
            #end if
            #if $cxt.mbrtoprun != ''
                #set $wfdict['ionquant.mbrtoprun'] = $cxt.mbrtoprun
            #end if
            #if $cxt.ionfdr != ''
                #set $wfdict['ionquant.ionfdr'] = $cxt.ionfdr
            #end if
            #if $cxt.peptidefdr != ''
                #set $wfdict['ionquant.peptidefdr'] = $cxt.peptidefdr
            #end if
            #if $cxt.proteinfdr != ''
                #set $wfdict['ionquant.proteinfdr'] = $cxt.proteinfdr
            #end if
            #set $cxt = $prfx.ionquant.topn
            #if $cxt.tp != ''
                #set $wfdict['ionquant.tp'] = $cxt.tp
            #end if
            #if $cxt.minfreq != ''
                #set $wfdict['ionquant.minfreq'] = $cxt.minfreq
            #end if
            #set $cxt = $prfx.ionquant.labeling_conditional
            #if $cxt.labeling_option == 'labeling'
                #set $cxt = $prfx.ionquant.labeling_conditional.labeling
                #set $wfdict['ionquant.use-labeling'] = 'true'
                #set $wfdict['ionquant.use-lfq'] = 'false'
                #set $wfdict['ionquant.light'] = $cxt.light
                #set $wfdict['ionquant.medium'] = $cxt.medium
                #set $wfdict['ionquant.heavy'] = $cxt.heavy
                #set $wfdict['ionquant.requantify'] = $cxt.requantify
            #else
                #set $cxt = $prfx.ionquant.labeling_conditional.lfq
                #set $wfdict['ionquant.use-labeling'] = 'false'
                #set $wfdict['ionquant.use-lfq'] = 'true'
                #if $cxt.maxlfq != 'None'
                    #set $wfdict['ionquant.maxlfq'] = $cxt.maxlfq
                #end if
                #if $cxt.minions != ''
                    #set $wfdict['ionquant.minions'] = $cxt.minions
                #end if
            #end if
            #set $cxt = $prfx.ionquant.advanced
            #if $cxt.excludemods != ''
                #set $wfdict['ionquant.excludemods'] = $cxt.excludemods
            #end if
            #if $cxt.minscans != ''
                #set $wfdict['ionquant.minscans'] = $cxt.minscans
            #end if
            #if $cxt.minisotopes != ''
                #set $wfdict['ionquant.minisotopes'] = $cxt.minisotopes
            #end if
            #if $cxt.locprob != ''
                #set $wfdict['ionquant.locprob'] = $cxt.locprob
            #end if
            #if $cxt.writeindex != 'None'
                #set $wfdict['ionquant.writeindex'] = $cxt.writeindex
            #end if
        #elif $prfx.label_free_quantification_run == 'freequant'
            #set $wfdict['quantitation.run-label-free-quant'] = 'true'
            #set $wfdict['ionquant.run-ionquant'] = 'false'
            #set $wfdict['freequant.run-freequant'] = 'true'
            #set $cxt = $prfx.freequant
            #if $cxt.rt_tol != ''
                #set $wfdict['freequant.rt-tol'] = $cxt.rt_tol
            #end if
            #if $cxt.mz_tol != ''
                #set $wfdict['freequant.mz-tol'] = $cxt.mz_tol
            #end if
        #end if
    ]]></token>

    <!--
      Isobaric quantification options

      TMT-n uses the following n first labels from TMT-18
      TMT-18 "126, 127N, 127C, 128N, 128C, 129N, 129C, 130N, 130C, 131N, 131C, 132N, 132C, 133N, 133C, 134N, 134C, 135N"
      iTRAQ-4 "114, 115, 116, 117"
      iTRAQ-8 "113, 114, 115, 116, 117, 118, 119, 121"
    -->
    <xml name="isobaric_quantification" token_expand="false" token_yes="true" token_no="false" token_plex="" token_level="2" token_virtual="false" token_pool="false" token_bridge="true">
        <section name="quant_iso" expanded="@EXPAND@" title="Quant (Isobaric)">
            <conditional name="isobaric_quantification">
                <param name="isobaric_quantification_step" type="select" label="Perform Isobaric Quantification">
                    <option value="default">Use workflow defaults</option>
                    <option value="yes" selected="@YES@">yes</option>
                    <option value="no" selected="@NO@">no</option>
                </param>
                <when value="default"/>
                <when value="no"/>
                <when value="yes">
                    <section name="options" expanded="true" title="Isobaric Quantification">
                        <param name="quant_level" type="integer" value="@LEVEL@" min="1" max="3" label="MS level for the quantification"/>
                        <param name="channel_num" type="text" value="@PLEX@" optional="true" label="Number of channels">
                            <validator type="regex" message="">^TMT-\d?</validator>
                        </param>
                        <param name="ref_tag" type="select" label="Set Unique tag to identify reference channels">
                            <help>Virtual or specify a Reference sample tag: pool or Bridge</help>
                            <option value="Virtual" selected="@VIRTUAL@">Virtual - Add an artificial reference channel</option>
                            <option value="pool" selected="@POOL@">pool</option>
                            <option value="Bridge" selected="@BRIDGE@">Bridge</option>
                        </param>
                        <param name="groupby" type="select" optional="true" label="Group by level of summarization">
                            <option value="0">Gene level</option>
                            <option value="1">Protein</option>
                            <option value="2">Peptide sequence</option>
                            <option value="3">Multiple PTM sites</option>
                            <option value="4">Single PTM site</option>
                            <option value="-1">All</option>
                        </param>
                        <param name="log2transformed" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Log2 transform the intensity"/>
                        <param name="prot_norm" type="select" optional="true" label="normalization">
                            <option value="0">None</option>
                            <option value="1">MC (median centering)</option>
                            <option value="2">GN (median centering + variance scaling)</option>
                            <option value="-1">generate reports with all normalization options</option>
                        </param>
                        <conditional name="glycan_conditional">
                            <param name="use_glycan_composition" type="select" label="Perform Isobaric Quantification">
                                <option value="default">Use workflow defaults</option>
                                <option value="no">no</option>
                                <option value="yes">yes</option>
                            </param>
                            <when value="default"/>
                            <when value="no"/>
                            <when value="yes">
                              <param name="mod_tag" type="select" optional="true" label="PTM Mod tag">
                                  <option value="none">none</option>
                                  <option value="N-glyco">N-glyco</option>
                                  <option value="C(239.1629)">C(239.1629)</option>
                                  <option value="K(-187.1524)">K(-187.1524)</option>
                                  <option value="K(-262.1966)">K(-262.1966)</option>
                                  <option value="K(114.0429),K(-115.12)">K(114.0429),K(-115.12)</option>
                                  <option value="S(79.9663),T(79.9663),Y(79.9663)">S(79.9663),T(79.9663),Y(79.9663)</option>
                              </param>
                              <param name="min_site_prob" type="float" min="-1.0" max="1.0" optional="true" label="Minimum site probability">
                                  <help>site localization confidence thresholdr: -1 for global, 0 for search engine determined, above 0 for probability</help>
                              </param>
                              <param name="glyco_qval" type="integer" value="-1" optional="true" label="Glycan FDR filter"/>
                            </when>
                        </conditional>
                        <param name="unique_gene" type="select" optional="true" label="Peptide-Gene uniqueness">
                            <option value="0">0: allow all PSMs</option>
                            <option value="1">1: remove PSMs mapping to more than one GENE with evidence of expression in the dataset</option>
                            <option value="2">2: remove all PSMs mapping to more than one GENE in the fasta file</option>
                        </param>
                        <param name="unique_pep" type="select" optional="true" label="Peptide-Protein uniqueness">
                            <option value="false">unique plus razor peptides</option>
                            <option value="true">allow PSMs with unique peptides only</option>
                        </param>
                        <param name="min_pep_prob" type="float" min="0" max="1.0" optional="true" label="only use PSMs with a minimum probability score"
                            help="minimum PSM probability threshold (in addition to FDR-based filtering by Philosopher)"/>
                        <param name="min_purity" type="float" min="0" max="1.0" optional="true" label="ion purity threshold (default 0.5)"/>
                        <param name="min_percent" type="float" min="0" max="1.0" optional="true" label="ignore the lower % PSMs based on their summed abundances"
                            help="e.g. value of 0.05 indicates removal of PSMs with the summed TMT reporter ions intensity in the lowest 5% of all PSMs"/>
                        <param name="max_pep_prob_thres" type="float" min="0" max="1.0" optional="true" label="threshold for maximum peptide probability"/>
                        <param name="min_ntt" type="integer" min="0" max="2" optional="true" label="minimum allowed number of enzymatic termini"/>
                        <param name="aggregation_method" type="select" optional="true" label="the aggregation method from the PSM level to the specified level">
                            <option value="0">0: median</option>
                            <option value="1">1: weighted-ratio</option>
                        </param>
                        <param name="prot_exclude" type="text" optional="true" label="Exclude proteins with specified tags at the beginning of the accession number"
                            help="e.g. none: no exclusion; sp|,tr| : exclude protein with sp| or tr|">
                            <validator type="regex">^(none|[a-zA-Z]+\|)$</validator>
                        </param>
                        <param name="best_psm" type="select" optional="true" label="keep the best PSM only (highest summed TMT intensity) among all redundant PSMs within the same LC-MS run">
                            <option value="true">Yes</option>
                            <option value="false">No</option>
                        </param>
                        <param name="psm_norm" type="select" optional="true" label="perform additional retention time-based normalization at the PSM level">
                            <option value="false">No</option>
                            <option value="true">Yes</option>
                        </param>
                        <param name="allow_overlabel" type="select" optional="true" label="allow PSMs with TMT on S (when overlabeling on S was allowed in the database search)">
                            <option value="true">Yes</option>
                            <option value="false">No</option>
                        </param>
                        <param name="allow_unlabeled" type="select" optional="true" label="allow PSMs without TMT tag or acetylation on the peptide n-terminus">
                            <option value="true">Yes</option>
                            <option value="false">No</option>
                        </param>
                        <param name="outlier_removal" type="select" optional="true" label="perform outlier removal">
                            <option value="true">Yes</option>
                            <option value="false">No</option>
                        </param>
                        <param name="ms1_int" type="select" optional="true" label="MS1 precursor ion intensity for reference sample abundance estimation">
                            <option value="true">Yes - use MS1 precursor ion intensity</option>
                            <option value="false">No - use MS2 reference intensity</option>
                        </param>
                        <param name="tolerance" type="integer" optional="true" label="Tolerance"/>
                        <param name="top3_pep" type="select" optional="true" label="use top 3 most intense peptide ions as part of the reference sample abundance estimation">
                            <option value="true">Yes</option>
                            <option value="false">No</option>
                        </param>
                        <param name="print_RefInt" type="select" optional="true" label="print individual reference sample abundance estimates for each multiplex in the final reports">
                            <option value="false">No</option>
                            <option value="true">Yes</option>
                        </param>
                    </section>
                </when>
            </conditional>
        </section>
    </xml>

    <!-- Set isobaric quantification workflow options -->
    <token name="@ISOBARIC_QUANTIFICATION@"><![CDATA[
        #set $prfx = $wf.quant_iso.isobaric_quantification
        #if $prfx.isobaric_quantification_step == 'no'
            #set $wfdict['tmtintegrator.run-tmtintegrator'] = 'false'
        #elif $prfx.isobaric_quantification_step == 'yes'
            #set $wfdict['tmtintegrator.run-tmtintegrator'] = 'true'
            #set $cxt = $prfx.options
            #set $wfdict['tmtintegrator.quant_level'] = $cxt.quant_level
            #set $wfdict['tmtintegrator.channel_num'] = $cxt.channel_num
            #if $cxt.ref_tag == 'Virtual'
                #set $wfdict['tmtintegrator.add_Ref'] = -1
            #else
                #set $wfdict['tmtintegrator.add_Ref'] = 1
                #set $wfdict['tmtintegrator.ref_tag'] = $cxt.ref_tag
            #end if
            #if $cxt.groupby != 'None'
                #set $wfdict['tmtintegrator.groupby'] = $cxt.groupby
            #end if
            #set $wfdict['tmtintegrator.log2transformed'] = $cxt.log2transformed
            #if $cxt.prot_norm != 'None'
                #set $wfdict['tmtintegrator.prot_norm'] = $cxt.prot_norm
            #end if
            #if $cxt.glycan_conditional.use_glycan_composition == 'no'
                #set $wfdict['tmtintegrator.use_glycan_composition'] = 'false'
            #elif $cxt.glycan_conditional.use_glycan_composition == 'yes'
                #set $wfdict['tmtintegrator.use_glycan_composition'] = 'true'
                #if $cxt.glycan_conditional.mod_tag != 'None'
                    #set $wfdict['tmtintegrator.mod_tag'] = $cxt.glycan_conditional.mod_tag
                #end if
                #if $cxt.glycan_conditional.min_site_prob != ''
                    #set $wfdict['tmtintegrator.min_site_prob'] = $cxt.glycan_conditional.min_site_prob
                #end if
                #if $cxt.glycan_conditional.glyco_qval != ''
                    #set $wfdict['tmtintegrator.glyco_qval'] = $cxt.glycan_conditional.glyco_qval
                #end if
            #end if
            #if $cxt.unique_gene != 'None'
                #set $wfdict['tmtintegrator.unique_gene'] = $cxt.unique_gene
            #end if
            #if $cxt.unique_pep != 'None'
                #set $wfdict['tmtintegrator.unique_pep'] = $cxt.unique_pep
            #end if
            #if $cxt.min_pep_prob != ''
                #set $wfdict['tmtintegrator.min_pep_prob'] = $cxt.min_pep_prob
            #end if
            #if $cxt.min_purity != ''
                #set $wfdict['tmtintegrator.min_purity'] = $cxt.min_purity
            #end if
            #if $cxt.min_percent != ''
                #set $wfdict['tmtintegrator.min_percent'] = $cxt.min_percent
            #end if
            #if $cxt.max_pep_prob_thres != ''
                #set $wfdict['tmtintegrator.max_pep_prob_thres'] = $cxt.max_pep_prob_thres
            #end if
            #if $cxt.min_ntt != ''
                #set $wfdict['tmtintegrator.min_ntt'] = $cxt.min_ntt
            #end if
            #if $cxt.aggregation_method != 'None'
                #set $wfdict['tmtintegrator.aggregation_method'] = $cxt.aggregation_method
            #end if
            #if $cxt.prot_exclude != ''
                #set $wfdict['tmtintegrator.prot_exclude'] = $cxt.prot_exclude
            #end if
            #if $cxt.best_psm != 'None'
                #set $wfdict['tmtintegrator.best_psm'] = $cxt.best_psm
            #end if
            #if $cxt.psm_norm != 'None'
                #set $wfdict['tmtintegrator.psm_norm'] = $cxt.psm_norm
            #end if
            #if $cxt.allow_overlabel != 'None'
                #set $wfdict['tmtintegrator.allow_overlabel'] = $cxt.allow_overlabel
            #end if
            #if $cxt.allow_unlabeled != 'None'
                #set $wfdict['tmtintegrator.allow_unlabeled'] = $cxt.allow_unlabeled
            #end if
            #if $cxt.outlier_removal != 'None'
                #set $wfdict['tmtintegrator.outlier_removal'] = $cxt.outlier_removal
            #end if
            #if $cxt.ms1_int != 'None'
                #set $wfdict['tmtintegrator.ms1_int'] = $cxt.ms1_int
            #end if
            #if $cxt.tolerance != ''
                #set $wfdict['tmtintegrator.tolerance'] = $cxt.tolerance
            #end if
            #if $cxt.top3_pep != 'None'
                #set $wfdict['tmtintegrator.top3_pep'] = $cxt.top3_pep
            #end if
            #if $cxt.print_RefInt != 'None'
                #set $wfdict['tmtintegrator.print_RefInt'] = $cxt.print_RefInt
            #end if
        #end if
    ]]></token>

    <xml name="dia_pseuedo_ms2" token_expand="false" token_yes="false" token_no="true">
        <section name="dia_pseudo" expanded="@EXPAND@" title="DIA Pseudo MS2">
            <conditional name="diatracer">
                <param name="diatracer_step" type="select" label="Run diaTracer">
                    <option value="default">Use workflow defaults</option>
                    <option value="yes" selected="@YES@">yes</option>
                    <option value="no" selected="@NO@">no</option>
                </param>
                <when value="default"/>
                <when value="no"/>
                <when value="yes">
                    <section name="options" expanded="true" title="diaPASEF Spectrum Deconvolution">
                        <param name="corr_threshold" type="float" value="0.3" label="Corr Threshold"/>
                        <param name="delta_apex_im" type="float" value="0.01" label="Delta Apex IM"/>
                        <param name="delta_apex_rt" type="integer" value="3" label="Delta Apex RT"/>
                        <param name="rf_max" type="integer" value="500" label="RF max" />
                        <param name="mass_defect_offset" type="float" value="0.1" label="Mass Defect Offset"/>
                        <param name="mass_defect_filter" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Mass Defect Filter"/>
                    </section>
                </when>
            </conditional>
        </section>
    </xml>
    <token name="@DIA_PSEUDO_MS2@"><![CDATA[
#set $prfx = $wf.dia_pseudo.diatracer
#if $prfx.diatracer_step == 'no'
  #set $wfdict['diatracer.run-diatracer'] = 'false'
#elif $prfx.diatracer_step == 'yes'
  #set $wfdict['diatracer.run-diatracer'] = 'true'
  #set $cxt = $prfx.options
  #set $wfdict['diatracer.corr-threshold'] = $cxt.corr_threshold
  #set $wfdict['diatracer.delta-apex-im'] = $cxt.delta_apex_im
  #set $wfdict['diatracer.delta-apex-rt'] = $cxt.delta_apex_rt
  #set $wfdict['diatracer.rf-max'] = $cxt.rf_max
  #set $wfdict['diatracer.mass-defect-offset'] = $cxt.mass_defect_offset
  #set $wfdict['diatracer.mass-defect-filter'] = $cxt.mass_defect_filter
#end if
]]></token>

    <xml name="diann_quantification" token_expand="false" token_yes="true" token_no="false">
        <section name="quant_dia" expanded="@EXPAND@" title="Quant (DIA)">
            <conditional name="diann_quantification">
                <param name="diann_quantification_step" type="select" label="Perform DIA Quantification with DIA-NN">
                    <option value="default">Use workflow defaults</option>
                    <option value="yes" selected="@YES@">yes</option>
                    <option value="no" selected="@NO@">no</option>
                </param>
                <when value="default"/>
                <when value="no"/>
                <when value="yes">
                    <section name="options" expanded="true" title="Isobaric Quantification">
                        <param name="qvalue" type="float" value="0.01" min="0.0" max="1.0" optional="true" label="Precursor FDR" help="default 0.01"/>
                        <param name="generate_msstats" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Generate MSStats input"/>
                        <param name="unrelated_runs" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Unrelated runs"/>
                        <param name="use_predicted_spectra" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Replace library spectra with predicted"/>
                        <param name="library" type="data" format="csv,tsv,xls,txt,binary" optional="true" label="Spectral Library"/>
                        <param name="quantification_strategy" type="select" optional="true" label="Quantification strategy" help="default: Robust LC (high precision)">
                            <option value="0">Any LC (high accuracy)</option>
                            <option value="1">Any LC (high precision)</option>
                            <option value="2">Robust LC (high accuracy)</option>
                            <option value="3">Robust LC (high precision)</option>
                        </param>
                    </section>
                </when>
            </conditional>
        </section>
    </xml>
    <token name="@DIANN_QUANTIFICATION@"><![CDATA[
#set $prfx = $wf.quant_dia.diann_quantification
#if $prfx.diann_quantification_step == 'no'
  #set $wfdict['diann.run-dia-nn'] = 'false'
#elif $prfx.diann_quantification_step == 'yes'
  #set $wfdict['diann.run-dia-nn'] = 'true'
  #set $cxt = $prfx.options
  #if $cxt.qvalue != ''
    #set $wfdict['diann.q-value'] = $cxt.qvalue
  #end if
  #set $wfdict['diann.generate-msstats'] = $cxt.generate_msstats
  #set $wfdict['diann.unrelated-runs'] = $cxt.unrelated_runs
  #set $wfdict['diann.use-predicted-spectra'] = $cxt.use_predicted_spectra
  #if $cxt.quantification_strategy != ''
    #set $wfdict['diann.quantification-strategy'] = $cxt.quantification_strategy
  #end if
  #if $cxt.library
    ln -s '$cxt.library' './diann_lib.speclib'
    #set $wfdict['diann.library'] = 'diann_lib.speclib'
  #end if
#end if
]]></token>



    <!-- License agreement texts. -->
    <token name="@MSFRAGGER_LICENSE_AGREEMENT@">
MSFragger is available freely for academic research and educational purposes only. I have read the ACADEMIC license for MSFragger software: http://msfragger-upgrader.nesvilab.org/upgrader/LICENSE-ACADEMIC.pdf. This license provides with non-exclusive, non-transferable right to use MSFragger solely for academic research, non-commercial or educational purposes. I agree to be subject to the terms and conditions of this license. I understand that to use MSFragger for other purposes requires a commercial license from the University of Michigan Office of Tech Transfer.
    </token>
    <token name="@IONQUANT_LICENSE_AGREEMENT@">
IonQuant is available freely for academic research and educational purposes only. I have read the ACADEMIC license for MSFragger software: https://msfragger-upgrader.nesvilab.org/ionquant/LICENSE-ACADEMIC.pdf
    </token>
    <token name="@THERMO_RAW_READER_LICENSE_AGREEMENT@">
I agree to the terms of Thermo (c) Raw File Reader License Agreement: http://msfragger-upgrader.nesvilab.org/upgrader/RawFileRdr_License_Agreement_RevA.pdf
    </token>
    <token name="@BRUKER_LICENSE_AGREEMENT@">
I agree to the terms of Bruker SDK library distribution conditions: http://msfragger-upgrader.nesvilab.org/upgrader/EULA%20TDF-SDK.pdf
    </token>
    <token name="@LICENSE_AGREEMENTS@">
@MSFRAGGER_LICENSE_AGREEMENT@
@IONQUANT_LICENSE_AGREEMENT@
@THERMO_RAW_READER_LICENSE_AGREEMENT@
@BRUKER_LICENSE_AGREEMENT@
    </token>

    <!-- User must check box agreeing to MSFragger license agreement. -->
    <xml name="license_agreements">
      <param name="license_agreements" type="boolean" truevalue="true" falsevalue="false" checked="false" label="I understand that these tools, including MSFragger, IonQuant, Bruker, and Thermo Raw File Reader, are available freely for academic research and educational purposes only, and agree to the following terms.">
        <validator type="expression" message="You must agree to the MSFragger license!">value == True</validator>
        <help><![CDATA[
@MSFRAGGER_LICENSE_AGREEMENT@
<br/><br/>
@IONQUANT_LICENSE_AGREEMENT@
<br/><br/>
@THERMO_RAW_READER_LICENSE_AGREEMENT@
<br/><br/>
@BRUKER_LICENSE_AGREEMENT@
        ]]></help>
      </param>
    </xml>

    <xml name="citations">
        <citations>
            <citation type="doi">10.1038/s41592-020-0912-y</citation>
            <citation type="doi">10.1038/nmeth.4256</citation>
            <citation type="doi">10.1038/s41467-020-17921-y</citation>
            <citation type="doi">10.1038/s41592-020-0967-9</citation>
            <citation type="doi">10.1021/acs.jproteome.0c00119</citation>
            <citation type="doi">10.1074/mcp.TIR120.002216</citation>
            <citation type="doi">10.1074/mcp.TIR120.002048</citation>
            <citation type="doi">10.1016/j.mcpro.2021.100077</citation>
            <citation type="doi">10.1021/acs.jproteome.0c00544</citation>
            <citation type="doi">10.1038/nmeth.3255</citation>
            <yield />
        </citations>
    </xml>
</macros>