#!/bin/bash
### ---
### name: 'BIGBIO_QUANTMS:QUANTMS:SUMMARY_PIPELINE'
### container: 'quay.io/biocontainers/pmultiqc:0.0.39--pyhdfd78af_0'
### outputs:
### - '*.html'
### - '*.db'
### - 'versions.yml'
### - '*_data'
### ...
set -e
set -u
NXF_DEBUG=${NXF_DEBUG:=0}; [[ $NXF_DEBUG > 1 ]] && set -x
NXF_ENTRY=${1:-nxf_main}

nxf_tree() {
    local pid=$1

    declare -a ALL_CHILDREN
    while read P PP;do
        ALL_CHILDREN[$PP]+=" $P"
    done < <(ps -e -o pid= -o ppid=)

    pstat() {
        local x_pid=$1
        local STATUS=$(2> /dev/null < /proc/$1/status grep -E 'Vm|ctxt')

        if [ $? = 0 ]; then
        local  x_vsz=$(echo "$STATUS" | grep VmSize | awk '{print $2}' || echo -n '0')
        local  x_rss=$(echo "$STATUS" | grep VmRSS | awk '{print $2}' || echo -n '0')
        local x_peak=$(echo "$STATUS" | grep -E 'VmPeak|VmHWM' | sed 's/^.*:\s*//' | sed 's/[\sa-zA-Z]*$//' | tr '\n' ' ' || echo -n '0 0')
        local x_pmem=$(awk -v rss=$x_rss -v mem_tot=$mem_tot 'BEGIN {printf "%.0f", rss/mem_tot*100*10}' || echo -n '0')
        local vol_ctxt=$(echo "$STATUS" | grep '\bvoluntary_ctxt_switches' | awk '{print $2}' || echo -n '0')
        local inv_ctxt=$(echo "$STATUS" | grep '\bnonvoluntary_ctxt_switches' | awk '{print $2}' || echo -n '0')
        cpu_stat[x_pid]="$x_pid $x_pmem $x_vsz $x_rss $x_peak $vol_ctxt $inv_ctxt"
        fi
    }

    pwalk() {
        pstat $1
        for i in ${ALL_CHILDREN[$1]:=}; do pwalk $i; done
    }

    pwalk $1
}

nxf_stat() {
    cpu_stat=()
    nxf_tree $1

    declare -a sum=(0 0 0 0 0 0 0 0)
    local pid
    local i
    for pid in "${!cpu_stat[@]}"; do
        local row=(${cpu_stat[pid]})
        [ $NXF_DEBUG = 1 ] && echo "++ stat mem=${row[*]}"
        for i in "${!row[@]}"; do
        if [ $i != 0 ]; then
            sum[i]=$((sum[i]+row[i]))
        fi
        done
    done

    [ $NXF_DEBUG = 1 ] && echo -e "++ stat SUM=${sum[*]}"

    for i in {1..7}; do
        if [ ${sum[i]} -lt ${cpu_peak[i]} ]; then
            sum[i]=${cpu_peak[i]}
        else
            cpu_peak[i]=${sum[i]}
        fi
    done

    [ $NXF_DEBUG = 1 ] && echo -e "++ stat PEAK=${sum[*]}\n"
    nxf_stat_ret=(${sum[*]})
}

nxf_mem_watch() {
    set -o pipefail
    local pid=$1
    local trace_file=.command.trace
    local count=0;
    declare -a cpu_stat=(0 0 0 0 0 0 0 0)
    declare -a cpu_peak=(0 0 0 0 0 0 0 0)
    local mem_tot=$(< /proc/meminfo grep MemTotal | awk '{print $2}')
    local timeout
    local DONE
    local STOP=''

    [ $NXF_DEBUG = 1 ] && nxf_sleep 0.2 && ps fx

    while true; do
        nxf_stat $pid
        if [ $count -lt 10 ]; then timeout=1;
        elif [ $count -lt 120 ]; then timeout=5;
        else timeout=30;
        fi
        read -t $timeout -r DONE || true
        [[ $DONE ]] && break
        if [ ! -e /proc/$pid ]; then
            [ ! $STOP ] && STOP=$(nxf_date)
            [ $(($(nxf_date)-STOP)) -gt 10000 ] && break
        fi
        count=$((count+1))
    done

    printf "%s\n" \
        "%mem=${nxf_stat_ret[1]}" \
        "vmem=${nxf_stat_ret[2]}" \
        "rss=${nxf_stat_ret[3]}" \
        "peak_vmem=${nxf_stat_ret[4]}" \
        "peak_rss=${nxf_stat_ret[5]}" \
        "vol_ctxt=${nxf_stat_ret[6]}" \
        "inv_ctxt=${nxf_stat_ret[7]}" >> "$trace_file" || >&2 echo "Error: Failed to append to file: $trace_file"
}

nxf_write_trace() {
    printf "%s\n" \
        "nextflow.trace/v2" \
        "realtime=$wall_time" \
        "%cpu=$ucpu" \
        "cpu_model=$cpu_model" \
        "rchar=${io_stat1[0]}" \
        "wchar=${io_stat1[1]}" \
        "syscr=${io_stat1[2]}" \
        "syscw=${io_stat1[3]}" \
        "read_bytes=${io_stat1[4]}" \
        "write_bytes=${io_stat1[5]}" >| "$trace_file" || >&2 echo "Error: Failed to write to file: $trace_file"
}

nxf_trace_mac() {
    local start_millis=$(nxf_date)

    /usr/bin/env bash -C -e -u -o pipefail /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/aa/955b875e7ce0fefc87f5fa76b73b61/.command.sh

    local end_millis=$(nxf_date)
    local wall_time=$((end_millis-start_millis))
    local ucpu=''
    local cpu_model=''
    local io_stat1=('' '' '' '' '' '')
    nxf_write_trace
}

nxf_fd() {
    local FD=11
    while [ -e /proc/$$/fd/$FD ]; do FD=$((FD+1)); done
    echo $FD
}

nxf_trace_linux() {
    local pid=$$
    command -v ps &>/dev/null || { >&2 echo "Command 'ps' required by nextflow to collect task metrics cannot be found"; exit 1; }
    local num_cpus=$(< /proc/cpuinfo grep '^processor' -c)
    local cpu_model=$(< /proc/cpuinfo grep '^model name' | head -n 1 | awk 'BEGIN{FS="\t: "} { print $2 }')
    local tot_time0=$(grep '^cpu ' /proc/stat | awk '{sum=$2+$3+$4+$5+$6+$7+$8+$9; printf "%.0f",sum}')
    local cpu_time0=$(2> /dev/null < /proc/$pid/stat awk '{printf "%.0f", ($16+$17)*10 }' || echo -n 'X')
    local io_stat0=($(2> /dev/null < /proc/$pid/io sed 's/^.*:\s*//' | head -n 6 | tr '\n' ' ' || echo -n '0 0 0 0 0 0'))
    local start_millis=$(nxf_date)
    trap 'kill $mem_proc' ERR
    
    /usr/bin/env bash -C -e -u -o pipefail /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/aa/955b875e7ce0fefc87f5fa76b73b61/.command.sh &
    local task=$!

    mem_fd=$(nxf_fd)
    eval "exec $mem_fd> >(nxf_mem_watch $task)"
    local mem_proc=$!

    wait $task

    local end_millis=$(nxf_date)
    local tot_time1=$(grep '^cpu ' /proc/stat | awk '{sum=$2+$3+$4+$5+$6+$7+$8+$9; printf "%.0f",sum}')
    local cpu_time1=$(2> /dev/null < /proc/$pid/stat awk '{printf "%.0f", ($16+$17)*10 }' || echo -n 'X')
    local ucpu=$(awk -v p1=$cpu_time1 -v p0=$cpu_time0 -v t1=$tot_time1 -v t0=$tot_time0 -v n=$num_cpus 'BEGIN { pct=(p1-p0)/(t1-t0)*100*n; printf("%.0f", pct>0 ? pct : 0) }' )

    local io_stat1=($(2> /dev/null < /proc/$pid/io sed 's/^.*:\s*//' | head -n 6 | tr '\n' ' ' || echo -n '0 0 0 0 0 0'))
    local i
    for i in {0..5}; do
        io_stat1[i]=$((io_stat1[i]-io_stat0[i]))
    done

    local wall_time=$((end_millis-start_millis))
    [ $NXF_DEBUG = 1 ] && echo "+++ STATS %CPU=$ucpu TIME=$wall_time I/O=${io_stat1[*]}"

    printf "%s\n" \
        "nextflow.trace/v2" \
        "realtime=$wall_time" \
        "%cpu=$ucpu" \
        "cpu_model=$cpu_model" \
        "rchar=${io_stat1[0]}" \
        "wchar=${io_stat1[1]}" \
        "syscr=${io_stat1[2]}" \
        "syscw=${io_stat1[3]}" \
        "read_bytes=${io_stat1[4]}" \
        "write_bytes=${io_stat1[5]}" >| "$trace_file" || >&2 echo "Error: Failed to write to file: $trace_file"

    [ -e /proc/$mem_proc ] && eval "echo 'DONE' >&$mem_fd" || true
    wait $mem_proc 2>/dev/null || true
    while [ -e /proc/$mem_proc ]; do nxf_sleep 0.1; done
}

nxf_trace() {
    local trace_file=.command.trace
    touch $trace_file
    if [[ $(uname) = Darwin ]]; then
        nxf_trace_mac
    else
        nxf_trace_linux
    fi
}
nxf_container_env() {
cat << EOF
export PYTHONNOUSERSITE="1"
export R_PROFILE_USER="/.Rprofile"
export R_ENVIRON_USER="/.Renviron"
export JULIA_DEPOT_PATH="/usr/local/share/julia"
export PATH="\$PATH:/data_5t/lilin/pipelines-preuse/quantms/quantms-1.7.0/bin"
EOF
}

nxf_sleep() {
  sleep $1 2>/dev/null || sleep 1;
}

nxf_date() {
    local ts=$(date +%s%3N);
    if [[ ${#ts} == 10 ]]; then echo ${ts}000
    elif [[ $ts == *%3N ]]; then echo ${ts/\%3N/000}
    elif [[ $ts == *3N ]]; then echo ${ts/3N/000}
    elif [[ ${#ts} == 13 ]]; then echo $ts
    else echo "Unexpected timestamp value: $ts"; exit 1
    fi
}

nxf_env() {
    echo '============= task environment ============='
    env | sort | sed "s/\(.*\)AWS\(.*\)=\(.\{6\}\).*/\1AWS\2=\3xxxxxxxxxxxxx/"
    echo '============= task output =================='
}

nxf_kill() {
    declare -a children
    while read P PP;do
        children[$PP]+=" $P"
    done < <(ps -e -o pid= -o ppid=)

    kill_all() {
        [[ $1 != $$ ]] && kill $1 2>/dev/null || true
        for i in ${children[$1]:=}; do kill_all $i; done
    }

    kill_all $1
}

nxf_mktemp() {
    local base=${1:-/tmp}
    mkdir -p "$base"
    if [[ $(uname) = Darwin ]]; then mktemp -d $base/nxf.XXXXXXXXXX
    else TMPDIR="$base" mktemp -d -t nxf.XXXXXXXXXX
    fi
}

nxf_fs_copy() {
  local source=$1
  local target=$2
  local basedir=$(dirname $1)
  mkdir -p $target/$basedir
  cp -fRL $source $target/$basedir
}

nxf_fs_move() {
  local source=$1
  local target=$2
  local basedir=$(dirname $1)
  mkdir -p $target/$basedir
  mv -f $source $target/$basedir
}

nxf_fs_rsync() {
  rsync -rRl $1 $2
}

nxf_fs_rclone() {
  rclone copyto $1 $2/$1
}

nxf_fs_fcp() {
  fcp $1 $2/$1
}

on_exit() {
    local last_err=$?
    local exit_status=${nxf_main_ret:=0}
    [[ ${exit_status} -eq 0 && ${nxf_unstage_ret:=0} -ne 0 ]] && exit_status=${nxf_unstage_ret:=0}
    [[ ${exit_status} -eq 0 && ${last_err} -ne 0 ]] && exit_status=${last_err}
    printf -- $exit_status > /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/aa/955b875e7ce0fefc87f5fa76b73b61/.exitcode
    set +u
    docker rm $NXF_BOXID &>/dev/null || true
    exit $exit_status
}

on_term() {
    set +e
    docker stop $NXF_BOXID
}

nxf_launch() {
    docker run -i --cpu-shares 12288 --memory 73728m -e "NXF_TASK_WORKDIR" -e "NXF_DEBUG=${NXF_DEBUG:=0}" -v /data_5t/lilin:/data_5t/lilin -w "$NXF_TASK_WORKDIR" -u $(id -u):$(id -g) --name $NXF_BOXID quay.io/biocontainers/pmultiqc:0.0.39--pyhdfd78af_0 /bin/bash -c "eval $(nxf_container_env); bash -C -e -u -o pipefail /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/aa/955b875e7ce0fefc87f5fa76b73b61/.command.run nxf_trace"
}

nxf_stage() {
    true
    # stage input files
    rm -f results/UPS1_12500amol_R3_comet_perc.idXML
    rm -f results/UPS1_50amol_R1_comet_perc.idXML
    rm -f results/UPS1_2500amol_R1_ms_info.parquet
    rm -f results/UPS1_50000amol_R3_comet_perc.idXML
    rm -f results/UPS1_250amol_R2_ms_info.parquet
    rm -f results/UPS1_50amol_R2_ms_info.parquet
    rm -f results/UPS1_500amol_R3_ms_info.parquet
    rm -f results/UPS1_25000amol_R1_ms_info.parquet
    rm -f results/UPS1_125amol_R1_comet_perc.idXML
    rm -f results/UPS1_50amol_R2_comet_perc.idXML
    rm -f results/UPS1_5000amol_R1_comet_perc.idXML
    rm -f results/UPS1_125amol_R2_ms_info.parquet
    rm -f results/UPS1_2500amol_R1_comet_perc.idXML
    rm -f results/UPS1_125amol_R2_comet_perc.idXML
    rm -f results/UPS1_250amol_R1_ms_info.parquet
    rm -f results/UPS1_50amol_R3_ms_info.parquet
    rm -f results/UPS1_50000amol_R3_ms_info.parquet
    rm -f results/UPS1_12500amol_R1_comet_perc.idXML
    rm -f results/UPS1_25000amol_R3_ms_info.parquet
    rm -f results/UPS1_2500amol_R2_comet_perc.idXML
    rm -f results/UPS1_250amol_R1_comet_perc.idXML
    rm -f results/UPS1_25000amol_R3_comet_perc.idXML
    rm -f results/UPS1_125amol_R3_ms_info.parquet
    rm -f results/UPS1_50amol_R3_comet_perc.idXML
    rm -f results/UPS1_50000amol_R1_comet_perc.idXML
    rm -f results/UPS1_25000amol_R1_comet_perc.idXML
    rm -f results/UPS1_2500amol_R3_ms_info.parquet
    rm -f results/UPS1_5000amol_R3_comet_perc.idXML
    rm -f results/PXD001819_v1.sdrf_openms_design_openms.mzTab
    rm -f results/UPS1_500amol_R2_comet_perc.idXML
    rm -f results/UPS1_500amol_R2_ms_info.parquet
    rm -f results/UPS1_12500amol_R1_ms_info.parquet
    rm -f results/UPS1_5000amol_R1_ms_info.parquet
    rm -f results/UPS1_250amol_R3_comet_perc.idXML
    rm -f results/nf_core_quantms_software_mqc_versions.yml
    rm -f results/UPS1_50000amol_R2_ms_info.parquet
    rm -f results/workflow_summary_mqc.yaml
    rm -f results/UPS1_500amol_R3_comet_perc.idXML
    rm -f results/UPS1_12500amol_R2_ms_info.parquet
    rm -f results/UPS1_5000amol_R2_ms_info.parquet
    rm -f results/UPS1_250amol_R2_comet_perc.idXML
    rm -f results/multiqc_config.yml
    rm -f results/UPS1_25000amol_R2_comet_perc.idXML
    rm -f results/UPS1_12500amol_R3_ms_info.parquet
    rm -f results/UPS1_5000amol_R3_ms_info.parquet
    rm -f results/UPS1_500amol_R1_ms_info.parquet
    rm -f results/UPS1_5000amol_R2_comet_perc.idXML
    rm -f results/UPS1_500amol_R1_comet_perc.idXML
    rm -f results/PXD001819_v1.sdrf_openms_design_msstats_in.csv
    rm -f results/PXD001819_v1.sdrf_openms_design.tsv
    rm -f results/UPS1_125amol_R3_comet_perc.idXML
    rm -f results/UPS1_2500amol_R2_ms_info.parquet
    rm -f results/UPS1_50amol_R1_ms_info.parquet
    rm -f nf-core-quantms_logo_light.png
    rm -f results/UPS1_50000amol_R1_ms_info.parquet
    rm -f results/UPS1_12500amol_R2_comet_perc.idXML
    rm -f results/UPS1_25000amol_R2_ms_info.parquet
    rm -f results/UPS1_250amol_R3_ms_info.parquet
    rm -f results/UPS1_2500amol_R3_comet_perc.idXML
    rm -f results/UPS1_125amol_R1_ms_info.parquet
    rm -f results/UPS1_50000amol_R2_comet_perc.idXML
    rm -f results/methods_description_mqc.yaml
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/89/ce2a9c32b865d26b73f677c6705063/UPS1_12500amol_R3_comet_perc.idXML results/UPS1_12500amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/d5/feb7b5d1b51c3337407e73b858e8cc/UPS1_50amol_R1_comet_perc.idXML results/UPS1_50amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/75/eac25d8c1742ede54aa1a5302758b7/UPS1_2500amol_R1_ms_info.parquet results/UPS1_2500amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/2e/9a5de6cb98320484d8dc5268580a49/UPS1_50000amol_R3_comet_perc.idXML results/UPS1_50000amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/32/dafe6f26de95b38c4922d08d6aeaa7/UPS1_250amol_R2_ms_info.parquet results/UPS1_250amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/9f/acdb2741628c70690b45a8ca7e1b3c/UPS1_50amol_R2_ms_info.parquet results/UPS1_50amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/ac/69f4ea11677602e790fe7877ec84bd/UPS1_500amol_R3_ms_info.parquet results/UPS1_500amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/69/ab575b7fbe47fec7e5b2dd293e1817/UPS1_25000amol_R1_ms_info.parquet results/UPS1_25000amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/9b/0fee0edab42b978ab955671989b00b/UPS1_125amol_R1_comet_perc.idXML results/UPS1_125amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/90/1fa0fe78e779b8a86b393d059a4dec/UPS1_50amol_R2_comet_perc.idXML results/UPS1_50amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/c1/5c070468aa1f62ffcd2d1dcb4e46da/UPS1_5000amol_R1_comet_perc.idXML results/UPS1_5000amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/3a/ad1d86623658f551d31173caf66355/UPS1_125amol_R2_ms_info.parquet results/UPS1_125amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/3e/8f93036e433d0cd0894e7fa4edbdf7/UPS1_2500amol_R1_comet_perc.idXML results/UPS1_2500amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/62/44973de1c16e350dd5ebc12a45aa21/UPS1_125amol_R2_comet_perc.idXML results/UPS1_125amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/81/818c9677163287ca3d649f971b75d2/UPS1_250amol_R1_ms_info.parquet results/UPS1_250amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/c1/6a9198f127f541921bea7b36aed92e/UPS1_50amol_R3_ms_info.parquet results/UPS1_50amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/f2/223314c7ecf6ffb586302167fa2be9/UPS1_50000amol_R3_ms_info.parquet results/UPS1_50000amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/94/09cb7a86ce5cc9123a9039eabf79f1/UPS1_12500amol_R1_comet_perc.idXML results/UPS1_12500amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/19/b07c0890090e25d0bb6d4fc4d103f7/UPS1_25000amol_R3_ms_info.parquet results/UPS1_25000amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/be/4102253576509e17efc3966ec2b98c/UPS1_2500amol_R2_comet_perc.idXML results/UPS1_2500amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/20/0c8a2d77b01770889b0aa28d8685d1/UPS1_250amol_R1_comet_perc.idXML results/UPS1_250amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/5c/5c07ea917c62d4b5798fa6a9a9d5a6/UPS1_25000amol_R3_comet_perc.idXML results/UPS1_25000amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/bf/61c0a67864e7200076b2318998e108/UPS1_125amol_R3_ms_info.parquet results/UPS1_125amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/e0/a406a737aac687bb34c56979c7d9e7/UPS1_50amol_R3_comet_perc.idXML results/UPS1_50amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/a9/5abcbb7a5fd1f55c21e4f0b9ac8057/UPS1_50000amol_R1_comet_perc.idXML results/UPS1_50000amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/c3/f0a3fe0458905391be71947c181c1e/UPS1_25000amol_R1_comet_perc.idXML results/UPS1_25000amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/23/3cc3065c4f76687890042a2f2b2d2f/UPS1_2500amol_R3_ms_info.parquet results/UPS1_2500amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/1e/4af57c7cf02c3a008d14beb160a30b/UPS1_5000amol_R3_comet_perc.idXML results/UPS1_5000amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/4c/ba9ea1e21b884ab18326a10d53a743/PXD001819_v1.sdrf_openms_design_openms.mzTab results/PXD001819_v1.sdrf_openms_design_openms.mzTab
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/5e/2e6b8918f67e5bdff95b8b4b7f6605/UPS1_500amol_R2_comet_perc.idXML results/UPS1_500amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/1a/988d78ecb0a48e0fed4592de33d050/UPS1_500amol_R2_ms_info.parquet results/UPS1_500amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/20/13d376a0cd88746caadfc97a3b8b5f/UPS1_12500amol_R1_ms_info.parquet results/UPS1_12500amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/74/6a07e5c27a17edf94dd4d2080440d5/UPS1_5000amol_R1_ms_info.parquet results/UPS1_5000amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/a2/167a38287a4c02a18cff9f146352b1/UPS1_250amol_R3_comet_perc.idXML results/UPS1_250amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/results/pipeline_info/nf_core_quantms_software_mqc_versions.yml results/nf_core_quantms_software_mqc_versions.yml
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/da/a518d8715db0278c7335d424a33015/UPS1_50000amol_R2_ms_info.parquet results/UPS1_50000amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/tmp/68/a4604597b942f703dad5161030bda7/workflow_summary_mqc.yaml results/workflow_summary_mqc.yaml
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/a6/d32e572cba606707214aa790869cb4/UPS1_500amol_R3_comet_perc.idXML results/UPS1_500amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/51/860071cecfd8e30fb66a33a613d67a/UPS1_12500amol_R2_ms_info.parquet results/UPS1_12500amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/7a/7ba3d0caf99614502ae87e7efe21fb/UPS1_5000amol_R2_ms_info.parquet results/UPS1_5000amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/25/792d30d75fc0e5694eeffc195c4a82/UPS1_250amol_R2_comet_perc.idXML results/UPS1_250amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-preuse/quantms/quantms-1.7.0/assets/multiqc_config.yml results/multiqc_config.yml
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/aa/daa6ebcd5f80ed86e2c1da268ce3a0/UPS1_25000amol_R2_comet_perc.idXML results/UPS1_25000amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/b9/6bf5b7b6ff6f13cb1dd4827d495b52/UPS1_12500amol_R3_ms_info.parquet results/UPS1_12500amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/25/c54f682de1db39f11709f5fd64d960/UPS1_5000amol_R3_ms_info.parquet results/UPS1_5000amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/ac/2091b3fff845a07cc0ec39fed36930/UPS1_500amol_R1_ms_info.parquet results/UPS1_500amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/55/e59cacb4f13bd4ec489d9f4fcde226/UPS1_5000amol_R2_comet_perc.idXML results/UPS1_5000amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/4a/86ddc529524c7668e60c49547bd657/UPS1_500amol_R1_comet_perc.idXML results/UPS1_500amol_R1_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/4c/ba9ea1e21b884ab18326a10d53a743/PXD001819_v1.sdrf_openms_design_msstats_in.csv results/PXD001819_v1.sdrf_openms_design_msstats_in.csv
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/f3/caaadd4c132cdc3fd9ddda2be56935/PXD001819_v1.sdrf_openms_design.tsv results/PXD001819_v1.sdrf_openms_design.tsv
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/86/2270d4bd22b41ad7a46a64e971532a/UPS1_125amol_R3_comet_perc.idXML results/UPS1_125amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/4f/44ed32ed21961eac2ffa2835afa461/UPS1_2500amol_R2_ms_info.parquet results/UPS1_2500amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/7c/d1d27d448c21ee809207668e81ba17/UPS1_50amol_R1_ms_info.parquet results/UPS1_50amol_R1_ms_info.parquet
    ln -s /data_5t/lilin/pipelines-preuse/quantms/quantms-1.7.0/assets/nf-core-quantms_logo_light.png nf-core-quantms_logo_light.png
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/9e/d4de8fa1aaabde85990bef03c349e5/UPS1_50000amol_R1_ms_info.parquet results/UPS1_50000amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/83/68ae002c66368c966e62bbdedd90ca/UPS1_12500amol_R2_comet_perc.idXML results/UPS1_12500amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/33/106fc097f1de13b0f8b480da731124/UPS1_25000amol_R2_ms_info.parquet results/UPS1_25000amol_R2_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/06/e0a151a119a9df302e39da6c147b54/UPS1_250amol_R3_ms_info.parquet results/UPS1_250amol_R3_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/29/74411c399ed8f765845b5f5b7ae2ea/UPS1_2500amol_R3_comet_perc.idXML results/UPS1_2500amol_R3_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/62/ae98b3dd4b46dd500a5b8cb3409e24/UPS1_125amol_R1_ms_info.parquet results/UPS1_125amol_R1_ms_info.parquet
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/45/5c45efa27c170853933743867a968b/UPS1_50000amol_R2_comet_perc.idXML results/UPS1_50000amol_R2_comet_perc.idXML
    mkdir -p results && ln -s /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/tmp/c8/6c63991218d81010add2b44e083b1f/methods_description_mqc.yaml results/methods_description_mqc.yaml
}

nxf_unstage_outputs() {
    true
}

nxf_unstage_controls() {
    true
}

nxf_unstage() {
    if [[ ${nxf_main_ret:=0} == 0 ]]; then
        (set -e -o pipefail; (nxf_unstage_outputs | tee -a .command.out) 3>&1 1>&2 2>&3 | tee -a .command.err)
        nxf_unstage_ret=$?
    fi
    nxf_unstage_controls
}

nxf_main() {
    trap on_exit EXIT
    trap on_term TERM INT USR2
    trap '' USR1

    [[ "${NXF_CHDIR:-}" ]] && cd "$NXF_CHDIR"
    export NXF_BOXID="nxf-$(dd bs=18 count=1 if=/dev/urandom 2>/dev/null | base64 | tr +/ 0A | tr -d '\r\n')"
    NXF_SCRATCH=''
    [[ $NXF_DEBUG > 0 ]] && nxf_env
    touch /data_5t/lilin/pipelines-test/quantms1.7.0_lfq_comet/work/aa/955b875e7ce0fefc87f5fa76b73b61/.command.begin
    set +u
    set -u
    [[ $NXF_SCRATCH ]] && cd $NXF_SCRATCH
    export NXF_TASK_WORKDIR="$PWD"
    nxf_stage

    set +e
    (set -o pipefail; (nxf_launch | tee .command.out) 3>&1 1>&2 2>&3 | tee .command.err) &
    pid=$!
    wait $pid || nxf_main_ret=$?
    nxf_unstage
}

$NXF_ENTRY
