view catWrapper.xml @ 9:5b1b635232ed draft default tip

planemo upload for repository https://github.com/ARTbio/tools-artbio/tree/main/tools/concat_multi_datasets commit 1b75e5575ec4e5a086ee90da57a611e51af68870
author artbio
date Thu, 13 Jun 2024 17:09:33 +0000
parents 5b2cc63d7a21
children
line wrap: on
line source

<tool id="cat_multi_datasets" name="Concatenate multiple datasets" version="1.4.3">
    <description>tail-to-head while specifying how</description>
    <command><![CDATA[
        #if $headers == 0:
            #set $concat_command = "cat"
        #else:
            #set $concat_command = 'tail -q -n +'+ str(int($headers)+1)
        #end if
        printf "Concatenating files:\n" &&
        #if $global_condition.input_type == "singles":
            #if $dataset_names == "No":
                #for $file in $global_condition.inputs
                    printf "${file.element_identifier}..." &&
                    #if $file.ext:
                        #if $file.ext[-2:] == "gz" and $headers != 0:
                            gzip -dc '$file' | $concat_command | gzip -c >> '$out_file1' &&
                        #else:
                            $concat_command '$file' >> '$out_file1' &&
                        #end if
                     #else:
                        $concat_command '$file' >> '$out_file1' &&
                     #end if
                    printf "Done\n" &&
                #end for
                sleep 1
            #else:
                #for $file in $global_condition.inputs
                    printf "${file.element_identifier}..." &&
                    #if $file.ext[-2:] == "gz" and $headers != 0:
                        printf "# ${file.element_identifier}\n" | gzip -c >> '$out_file1' &&
                        gzip -dc "$file" | $concat_command |gzip -c >> '$out_file1' &&
                    #else:
                        printf "# ${file.element_identifier}\n" >> '$out_file1' &&
                        $concat_command "$file" >> '$out_file1' &&
                    #end if
                    printf "Done\n" &&
                #end for
                sleep 1
            #end if
        #else if $global_condition.input_type == "simple_collections":
                mkdir concatenated &&
                #if $dataset_names == "No":
                    #for $x, $y in zip($global_condition.input_1, $global_condition.input_2):
                        printf "${x.element_identifier} and ${y.element_identifier}..." &&
                        #if $x.ext[-2:] == "gz" and $headers != 0:
                            gzip -dc '$x' | $concat_command | gzip -c > concatenated/'${x.element_identifier}.listed.${x.ext}.listed' &&
                            gzip -dc '$y' | $concat_command | gzip -c >> concatenated/'${x.element_identifier}.listed.${x.ext}.listed' &&
                        #else:
                            $concat_command '$x' '$y' > concatenated/'${x.element_identifier}.listed.${x.ext}.listed' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                    sleep 1
                #else:
                    #for $x, $y in zip($global_condition.input_1, $global_condition.input_2)
                        printf "${x.element_identifier} and ${y.element_identifier}..." &&
                        #if $x.ext[-2:] == "gz" and $headers != 0:
                            printf "# ${x.element_identifier}\n" | gzip -c > concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                            gzip -dc '$x' | $concat_command | gzip -c >> concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                            printf "# ${y.element_identifier}\n" | gzip -c >> concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                            gzip -dc '$y' | $concat_command | gzip -c >> concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                        #else:
                            printf "# ${x.element_identifier}\n" > concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                            $concat_command '$x'>> concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                            printf "# ${y.element_identifier}\n" >> concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                            $concat_command '$y' >> concatenated/'${x.element_identifier}_${y.element_identifier}.listed.${x.ext}.listed' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                sleep 1
                #end if
        #else if $global_condition.input_type == "paired_collection":
            #if $global_condition.paired_cat_type == "by_strand":
                mkdir concatenated &&
                #if $dataset_names == "No":
                    #for $file in $global_condition.inputs
                        printf "${file.element_identifier}- forward and reverse..." &&
                        #if $file['forward'].ext[-2:] == "gz" and $headers != 0:
                            gzip -dc $file['forward'] | $concat_command | gzip -c >> concatenated/forward.listed.${file['forward'].ext}.listed &&
                            gzip -dc $file['reverse'] | $concat_command | gzip -c >> concatenated/reverse.listed.${file['reverse'].ext}.listed &&
                        #else:
                            $concat_command $file['forward'] >> concatenated/forward.listed.${file['forward'].ext}.listed &&
                            $concat_command $file['reverse'] >> concatenated/reverse.listed.${file['reverse'].ext}.listed &&
                        #end if
                        printf "Done\n" &&
                    #end for
                    sleep 1
                #else:
                    #for $file in $global_condition.inputs.keys():
                        printf "$file - forward and reverse..." &&
                        #if $global_condition.inputs[$file]['forward'].ext[-2:] == "gz" and $headers != 0:
                            printf "# ${file}_forward\n" | gzip -c >> concatenated/forward.listed.${global_condition.inputs[$file]['forward'].ext}.listed &&
                            gzip -dc $global_condition.inputs[$file]['forward'] | $concat_command | gzip -c >> concatenated/forward.listed.${global_condition.inputs[$file]['forward'].ext}.listed &&
                            printf "# ${file}_reverse\n" | gzip -c >> concatenated/reverse.listed.${global_condition.inputs[$file]['reverse'].ext}.listed &&
                            gzip -dc $global_condition.inputs[$file]['reverse'] | $concat_command | gzip -c >> concatenated/reverse.listed.${global_condition.inputs[$file]['reverse'].ext}.listed &&
                        #else:
                            printf "# ${file}_forward\n" >> concatenated/forward.listed.${global_condition.inputs[$file]['forward'].ext}.listed &&
                            $concat_command $global_condition.inputs[$file]['forward'] >> concatenated/forward.listed.${global_condition.inputs[$file]['forward'].ext}.listed &&
                            printf "# ${file}_reverse\n" >> concatenated/reverse.listed.${global_condition.inputs[$file]['reverse'].ext}.listed &&
                            $concat_command $global_condition.inputs[$file]['reverse'] >> concatenated/reverse.listed.${global_condition.inputs[$file]['reverse'].ext}.listed &&
                        #end if
                        printf "Done\n" &&
                    #end for
                    sleep 1
                #end if
            #else if $global_condition.paired_cat_type == "by_pair":
                mkdir concatenated &&
                #if $dataset_names == "No":
                    #for $file in $global_condition.inputs.keys():
                        printf "$file - forward and reverse..." &&
                        #if $global_condition.inputs[$file]['forward'].ext[-2:] == "gz" and $headers != 0:
                            gzip -dc $global_condition.inputs[$file]['forward'] | $concat_command | gzip -c
                            > concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            gzip -dc $global_condition.inputs[$file]['reverse'] | $concat_command | gzip -c
                            >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                        #else:
                            $concat_command $global_condition.inputs[$file]['forward']
                            > concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            $concat_command $global_condition.inputs[$file]['reverse']
                            >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                    sleep 1
                #else:
                    #for $file in $global_condition.inputs.keys():
                        printf "$file - forward and reverse..." &&
                        #if $global_condition.inputs[$file]['reverse'].ext[-2:] == "gz" and $headers != 0:
                            printf "# ${file}_forward\n" | gzip -c > concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            gzip -dc $global_condition.inputs[$file]['forward'] | $concat_command | gzip -c
                            >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            printf "# ${file}_reverse\n" | gzip -c >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            gzip -dc $global_condition.inputs[$file]['reverse'] | $concat_command | gzip -c
                            >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                        #else:
                            printf "# ${file}_forward\n" > concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            $concat_command $global_condition.inputs[$file]['forward']
                            >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            printf "# ${file}_reverse\n" >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                            $concat_command $global_condition.inputs[$file]['reverse']
                            >> concatenated/'${file}.listed.${global_condition.inputs[$file]['reverse'].ext}.listed' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                    sleep 1
                #end if
            #else if $global_condition.paired_cat_type == "all":
                mkdir concatenated &&
                #set $base_name=$global_condition.inputs.element_identifier
                #set $extention=$global_condition.inputs[$global_condition.inputs.keys()[0]]['forward'].ext
                #if $dataset_names == "No":
                    #for $file in $global_condition.inputs.keys():
                        printf "$file - forward and reverse..." &&
                        #if $global_condition.inputs[$file]['forward'].ext[-2:] == "gz" and $headers != 0:
                            gzip -dc $global_condition.inputs[$file]['forward'] | $concat_command | gzip -c >> c'$paired_out_file' &&
                            gzip -dc $global_condition.inputs[$file]['reverse'] | $concat_command | gzip -c >> '$paired_out_file' &&
                        #else:
                            $concat_command
                            $global_condition.inputs[$file]['forward']
                            >> '$paired_out_file' &&
                            $concat_command
                            $global_condition.inputs[$file]['reverse']
                            >> '$paired_out_file' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                    sleep 1
                #else:
                    #for $file in $global_condition.inputs.keys():
                        printf "$file - forward and reverse..." &&
                        #if $global_condition.inputs[$file]['forward'].ext[-2:] == "gz" and $headers != 0:
                            printf "# ${file}_forward\n" | gzip -c > '$paired_out_file' &&
                            gzip -dc $global_condition.inputs[$file]['forward'] | $concat_command | gzip -c >> '$paired_out_file' &&
                            printf "# ${file}_reverse\n" | gzip -c >> '$paired_out_file' &&
                            gzip -dc $global_condition.inputs[$file]['reverse'] | $concat_command | gzip -c >> '$paired_out_file' &&
                        #else:
                            printf "# ${file}_forward\n" > '$paired_out_file' &&
                            $concat_command
                            $global_condition.inputs[$file]['forward']
                            >> '$paired_out_file' &&
                            printf "# ${file}_reverse\n" >> '$paired_out_file' &&
                            $concat_command
                            $global_condition.inputs[$file]['reverse']
                            >> '$paired_out_file' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                    sleep 1
                #end if
            #end if
        #else if $global_condition.input_type == "nested_collection":
            mkdir concatenated &&
            #if $dataset_names == "No":
                #for $sub_list in $global_condition.inputs:
                    #set $file_base_name=$sub_list.element_identifier
                    #for $sub_list_element in $sub_list:
                        printf "${file_base_name} - ${sub_list_element.element_identifier}..." &&
                        #if $sub_list_element.ext[-2:] == "gz" and $headers != 0:
                            gzip -dc ${sub_list_element} | $concat_command | gzip -c >> concatenated/'${file_base_name}.listed.${sub_list_element.ext}.listed' &&
                        #else:
                            $concat_command ${sub_list_element} >> concatenated/'${file_base_name}.listed.${sub_list_element.ext}.listed' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                #end for
                sleep 1
            #else:
                #for $sub_list in $global_condition.inputs:
                    #set $file_base_name=$sub_list.element_identifier
                    #for $sub_list_element in $sub_list:
                        printf "${file_base_name} - ${sub_list_element.element_identifier}..." &&
                        #if $sub_list_element.ext[-2:] == "gz" and $headers != 0:
                            printf "# ${sub_list_element.element_identifier}\n" | gzip -c >> concatenated/'${file_base_name}.listed.${sub_list_element.ext}.listed' &&
                            gzip -dc ${sub_list_element} | $concat_command | gzip -c >> concatenated/'${file_base_name}.listed.${sub_list_element.ext}.listed' &&
                        #else:
                            printf "# ${sub_list_element.element_identifier}\n" >> concatenated/'${file_base_name}.listed.${sub_list_element.ext}.listed' &&
                            $concat_command ${sub_list_element} >> concatenated/'${file_base_name}.listed.${sub_list_element.ext}.listed' &&
                        #end if
                        printf "Done\n" &&
                    #end for
                #end for
                sleep 1
            #end if
        #end if
        ]]>
    </command>
    <inputs>
        <conditional name="global_condition">
            <param name="input_type" type="select" label="What type of data do you wish to concatenate?" help="Depending on the type of input selected the concatenation options will differ">
                <option value="singles">Single datasets</option>
                <option value="simple_collections">2 Collections</option>
                <option value="paired_collection">Paired collection</option>
                <option value="nested_collection">Nested collection</option>
            </param>
            <when value="singles">
                <param name="inputs" type="data" label="Concatenate Datasets" multiple="True" format="fastq,fastq.gz,txt,tabular,bed"
                       help="All inputed datasets will be concatenated tail-to-head."/>
            </when>
            <when value="paired_collection">
                <param name="inputs" type="data_collection" collection_type="list:paired" format="fastq,fastq.gz,txt,tabular,bed"
                       label="Input paired collection to concatenate"/>
                <param name="paired_cat_type" type="select" label="What type of concatenation do you wish to perform?">
                    <option value="by_strand">Concatenate all datsets of same strand (outputs a single pair of datasets)</option>
                    <option value="by_pair">Concatenate pairs of datasets (outputs an unpaired collection of datasets)</option>
                    <option value="all">Concatenate all datasets into a single file regardless of strand (outputs a single file)</option>
                </param>
            </when>
            <when value="simple_collections">
                <param name="input_1" type="data_collection" collection_type="list" label="Input first collection" help="The first collection contains the datasets that will be written first in the concatenated file" />
                <param name="input_2" type="data_collection" collection_type="list" label="Input second collection" help="The second collection contains  the datasets that will be written last in the concatenated file" />
            </when>
            <when value="nested_collection">
                <param name="inputs" type="data_collection" collection_type="list:list" label="Input nested collection" help="The Nested collection which items you want to concatenate." />
            </when>
        </conditional>
        <param name="dataset_names" type="boolean" label="Include dataset names?" truevalue="Yes" falsevalue="No" checked="false" help="If 'Yes' is selected '#name of dataset' will be added when concatenating."/>
        <param name="headers" type="integer" label="Number of lines to skip at the beginning of each concatenation:" value="0" help="This paremeter exists so as to not concatenate comments or headers contained at the start of the files."/>
    </inputs>
    <outputs>
        <data name="out_file1" format_source="inputs" metadata_source="inputs" label="Concatenated datasets">
            <filter>global_condition['input_type'] == 'singles'</filter>
        </data>
        <data name="paired_out_file" label="${global_condition.inputs.element_identifier}" auto_format="true">
            <filter>global_condition['input_type'] == 'paired_collection' and global_condition['paired_cat_type'] == 'all'</filter>
        </data>
        <collection name="paired_output" type="paired" label="Concatenation by strand">
            <discover_datasets pattern="(?P&lt;name&gt;.*)\.listed\.(?P&lt;ext&gt;.*)\.listed" format="fastq" visible="false" directory="concatenated"/>
            <filter>global_condition['input_type'] == 'paired_collection' and global_condition['paired_cat_type'] == 'by_strand'</filter>
        </collection>
        <collection name="list_output" type="list" label="Concatenation by pairs">
            <discover_datasets pattern="(?P&lt;identifier_0&gt;.*)\.listed\.(?P&lt;ext&gt;.*)\.listed" format="fastq" visible="false" directory="concatenated"/>
            <filter>(global_condition['input_type'] == 'paired_collection' and global_condition['paired_cat_type'] == 'by_pair') or (global_condition['input_type'] == 'simple_collections') or (global_condition['input_type'] == 'nested_collection')</filter>
        </collection>
    </outputs>
    <tests>
        <!-- Single files concatenation -->
        <test expect_num_outputs="1"> <!-- Test 1 single files concatenation with no other option -->
            <param name="input_type" value="singles" />
            <param name="inputs" value="1.bed,2.bed"/>
            <param name="dataset_names" value="No" />
            <param name="headers" value="0" />
            <output name="out_file1" file="cat_wrapper_out1.bed"/>
        </test>
        <test expect_num_outputs="1"> <!-- Test 2 single files concatenation with dataset names activated -->
            <param name="input_type" value="singles" />
            <param name="inputs" value="1.bed,2.bed"/>
            <param name="dataset_names" value="Yes" />
            <param name="headers" value="0" />
            <output name="out_file1" file="cat_wrapper_out2.bed"/>
        </test>
        <test expect_num_outputs="1"> <!-- Test 3 single files concatenation skipping 1 line -->
            <param name="input_type" value="singles" />
            <param name="inputs" value="1.bed,2.bed"/>
            <param name="dataset_names" value="No" />
            <param name="headers" value="1" />
            <output name="out_file1" file="cat_wrapper_out3.bed"/>
        </test>
        <test expect_num_outputs="1"> <!-- Test 4 gz handling with no options -->
            <param name="input_type" value="singles" />
            <param name="inputs" value="1_f.fastq.gz,1_r.fastq.gz"/>
            <param name="dataset_names" value="No" />
            <param name="headers" value="0" />
            <output name="out_file1" file="1.fastq.gz" decompress="True"/>
        </test>
        <test expect_num_outputs="1"> <!-- Test 5 gz handling with options -->
            <param name="input_type" value="singles" />
            <param name="inputs" value="1_f.fastq.gz,1_r.fastq.gz"/>
            <param name="dataset_names" value="Yes" />
            <param name="headers" value="4" />
            <output name="out_file1" file="1_options.fastq.gz" decompress="True"/>
        </test>
        <!-- Test paired options -->
        <test expect_num_outputs="1"> <!-- Test 6 paired collection concatenation by_pair with no other option -->
            <param name="input_type" value="paired_collection" />
            <param name="paired_cat_type" value="by_pair"/>
            <param name="inputs">
                <collection type="list:paired">
                    <element name="2">
                        <collection type="paired">
                            <element name="forward" value="2_f.fastq"/>
                            <element name="reverse" value="2_r.fastq"/>
                        </collection>
                    </element>
                    <element name="3">
                        <collection type="paired">
                            <element name="forward" value="3_f.fastq"/>
                            <element name="reverse" value="3_r.fastq"/>
                        </collection>
                    </element>
                    <element name="4">
                        <collection type="paired">
                            <element name="forward" value="4_f.fastq"/>
                            <element name="reverse" value="4_r.fastq"/>
                        </collection>
                    </element>
                </collection>
            </param>
            <param name="dataset_names" value="No" />
            <param name="headers" value="0" />
            <output_collection name="list_output" type="list" >
                <element name="2" file="2.fastq"/>
                <element name="3" file="3.fastq"/>
                <element name="4" file="4.fastq"/>
            </output_collection>
        </test>
        <test expect_num_outputs="1"> <!-- Test 7 paired collection concatenation by_strand with no other option -->
            <param name="input_type" value="paired_collection" />
            <param name="paired_cat_type" value="by_strand"/>
            <param name="inputs">
                <collection type="list:paired">
                    <element name="2">
                        <collection type="paired">
                            <element name="forward" value="2_f.fastq"/>
                            <element name="reverse" value="2_r.fastq"/>
                        </collection>
                    </element>
                    <element name="3">
                        <collection type="paired">
                            <element name="forward" value="3_f.fastq"/>
                            <element name="reverse" value="3_r.fastq"/>
                        </collection>
                    </element>
                    <element name="4">
                        <collection type="paired">
                            <element name="forward" value="4_f.fastq"/>
                            <element name="reverse" value="4_r.fastq"/>
                        </collection>
                    </element>
                </collection>
            </param>
            <param name="dataset_names" value="No" />
            <param name="headers" value="0" />
            <output_collection name="paired_output" type="paired" >
                <element name="forward" file="f.fastq"/>
                <element name="reverse" file="r.fastq"/>
            </output_collection>
        </test>
        <test expect_num_outputs="1"> <!-- Test 8 - 2 collections concatenation -->
            <param name="input_type" value="simple_collections" />
            <param name="input_1">
                <collection type="list">
                    <element name="2" value="2_f.fastq"/>
                    <element name="3" value="3_f.fastq"/>
                    <element name="4" value="4_f.fastq"/>
                </collection>
            </param>
            <param name="input_2">
                <collection type="list">
                    <element name="2" value="2_r.fastq"/>
                    <element name="3" value="3_r.fastq"/>
                    <element name="4" value="4_r.fastq"/>
                </collection>
            </param>
            <param name="dataset_names" value="No" />
            <param name="headers" value="0" />
            <output_collection name="list_output" type="list" count="3" >
                <element name="2" file="2.fastq"/>
                <element name="3" file="3.fastq"/>
                <element name="4" file="4.fastq"/>
            </output_collection>
        </test>
        <test expect_num_outputs="1"> <!-- Test 9 - 2 collections concatenation with other options-->
            <param name="input_type" value="simple_collections" />
            <param name="input_1">
                <collection type="list">
                    <element name="1_f.fastq.gz" value="1_f.fastq.gz"/>
                </collection>
            </param>
            <param name="input_2">
                <collection type="list">
                    <element name="1_r.fastq.gz" value="1_r.fastq.gz"/>
                </collection>
            </param>
            <param name="dataset_names" value="Yes" />
            <param name="headers" value="4" />
            <output_collection name="list_output" type="list" count="1" >
                <element name="1_f.fastq.gz_1_r.fastq.gz" file="1_options.fastq.gz" decompress="True"/>
            </output_collection>
        </test>
        <test expect_num_outputs="1"> <!-- Test 10 nested collections concatenation -->
            <param name="input_type" value="nested_collection" />
            <param name="inputs">
                <collection type="list:list">
                    <element name="2">
                        <collection type="list">
                            <element name="2_f" value="2_f.fastq" ftype="fastq"/>
                            <element name="2_r" value="2_r.fastq" ftype="fastq"/>
                        </collection>
                    </element>
                    <element name="3">
                        <collection type="list">
                            <element name="3" value="3.fastq" ftype="fastq"/>
                        </collection>
                    </element>
                </collection>
            </param>
            <param name="dataset_names" value="No" />
            <param name="headers" value="0" />
            <output_collection name="list_output" type="list" count="2" >
                <element name="2" file="2.fastq"/>
                <element name="3" file="3.fastq"/>
            </output_collection>
        </test>
        <test expect_num_outputs="1"> <!-- Test 11 nested collections concatenation with options and gzip-->
            <param name="input_type" value="nested_collection" />
            <param name="inputs">
                <collection type="list:list">
                    <element name="1">
                        <collection type="list">
                            <element name="1_f.fastq.gz" value="1_f.fastq.gz" ftype="fastq.gz"/>
                            <element name="1_r.fastq.gz" value="1_r.fastq.gz" ftype="fastq.gz"/>
                        </collection>
                    </element>
                </collection>
            </param>
            <param name="dataset_names" value="Yes" />
            <param name="headers" value="4" />
            <output_collection name="list_output" type="list" count="1" >
                <element name="1" file="1_options.fastq.gz" decompress="True"/>
            </output_collection>
        </test>
    </tests>
    <help>

.. class:: warningmark

**WARNINGS:**

- This tool does not check if the datasets being concatenated are in the same format.
- When concatenating 2 collections make sure the first collection is the one with the most items.
- This tool can't handle nested collection deeper than list:list.

-----

**What it does**

Concatenates datasets and paired collections with multiple options:

 - When the input is a paired collection:

   - concatenation by strand : forward and reverse datasets are concatenated separately and a list with a single forward - reverse dataset pair is returned

   - concatenation by pair : forward - reverse dataset pairs are concatenated and a simple dataset collection is returned

   - whole collection concatenation : all datasets in the collection are concatenated and a single dataset is returned

 - When the inputs are 2 collections: datasets are concatenated in a pairwise combination and a single dataset collection is returned

 - When nested collection concatenation: datasets in each sub-collection are concatenated and a simple dataset collection is returned

 - Skipping lines before concatenation to avoid headers

 - Add the name of the concatenated files as separator

-----

**Single datasets concatenation example**

Concatenating Dataset::

    chrX  151087187  151087355  A  0  -
    chrX  151572400  151572481  B  0  +

with Dataset1::

    chr1  151242630  151242955  X  0  +
    chr1  151271715  151271999  Y  0  +
    chr1  151278832  151279227  Z  0  -

and with Dataset2::

    chr2  100000030  200000955  P  0  +
    chr2  100000015  200000999  Q  0  +

will result in the following::

    chrX  151087187  151087355  A  0  -
    chrX  151572400  151572481  B  0  +
    chr1  151242630  151242955  X  0  +
    chr1  151271715  151271999  Y  0  +
    chr1  151278832  151279227  Z  0  -
    chr2  100000030  200000955  P  0  +
    chr2  100000015  200000999  Q  0  +

-----

**2 Collections concatenation**

1rst collection::

    a
    b
    c
    d

2nd collection::

    1
    2
    3
    4

Concatenation result::

    A single collection containing:

    a concatenated with 1
    b concatenated with 2
    c concatenated with 3
    d concatenated with 4

-----

**Paired collection concatenation example**

1rst pair::

    forward - reverse

2nd pair::

    forward - reverse

- Concatenation by strand::

    concatenates:

    1rst forward + 2nd forward
    1rst reverse + 2nd reverse

    outputs:

    1 pair

- Concatenation by pair::

    concatenates:

    1rst forward + 1rst reverse
    2nd forward + 2nd reverse

    outputs:

    2 datasets

- Concatenate all::

    concatenates:

    1rst forward + 1rst reverse + 2nd forward + 2nd reverse

    outputs:

    1 dataset

-----

**Nested collection concatenation example**

Nested collection:

    - Experiment

        - Sample_1

            - Sample_1_file_1
            - Sample_1_file_2

        - Sample_2

            - Sample_2_file_1
            - Sample_2_file_2
            - Sample_2_file_3

Concatenation result::

    A single collection containing:

        - Sample_1: (Sample_1_file_1 + Sample_1_file_2)
        - Sample_2: (Sample_2_file_1 + Sample_2_file_2 + Sample_2_file_3)

-----

**When selecting "Include dataset names" when concatenating files**:

1rst file name="first_tabular"::

    chrX  151087187  151087355  A  0  -
    chrX  151572400  151572481  B  0  +

2nd file name="second_tabular"::

    chr1  151242630  151242955  X  0  +
    chr1  151271715  151271999  Y  0  +
    chr1  151278832  151279227  Z  0  -

output::

    # first_tabular
    chrX  151087187  151087355  A  0  -
    chrX  151572400  151572481  B  0  +
    # second_tabular
    chr1  151242630  151242955  X  0  +
    chr1  151271715  151271999  Y  0  +
    chr1  151278832  151279227  Z  0  -

-----

**Skiping lines**

1rst file::

    chrX  151087187  151087355  A  0  -
    chrX  151572400  151572481  B  0  +

2nd file::

    chr1  151242630  151242955  X  0  +
    chr1  151271715  151271999  Y  0  +
    chr1  151278832  151279227  Z  0  -

skipping 1 line

output::

    chrX  151572400  151572481  B  0  +
    chr1  151271715  151271999  Y  0  +
    chr1  151278832  151279227  Z  0  -

-----

Adapted from galaxy's catWrapper.xml to allow multiple input files.

    </help>
    <citations>
        <citation type="doi">10.1186/gb-2010-11-8-r86</citation>
    </citations>
</tool>