Merge pull request #22265 from jdavcs/26.0_backport_21939
[26.0] Backport of 21939
@@ -29,8 +29,19 @@
|
||||
<tool file="data_export/export_remote.xml" />
|
||||
</section>
|
||||
<section id="collection_operations" name="Collection Operations">
|
||||
<tool file="${model_tools_path}/unzip_collection.xml" />
|
||||
<tool file="${model_tools_path}/zip_collection.xml" />
|
||||
<label id="collection_build" text="Build" />
|
||||
<tool file="${model_tools_path}/build_list.xml" />
|
||||
<tool file="${model_tools_path}/build_list_1.2.0.xml" />
|
||||
<tool file="${model_tools_path}/duplicate_file_to_collection.xml" />
|
||||
<tool file="${model_tools_path}/convert_sample_sheet.xml" />
|
||||
|
||||
<label id="collection_restructure" text="Restructure" />
|
||||
<tool file="${model_tools_path}/flatten_collection.xml" />
|
||||
<tool file="${model_tools_path}/nest_collection.xml" />
|
||||
<tool file="${model_tools_path}/merge_collection.xml" />
|
||||
<tool file="${model_tools_path}/split_paired_and_unpaired.xml" />
|
||||
|
||||
<label id="collection_filter" text="Filter" />
|
||||
<tool file="${model_tools_path}/filter_failed_collection.xml" />
|
||||
<tool file="${model_tools_path}/filter_failed_collection_1.1.0.xml" />
|
||||
<tool file="${model_tools_path}/filter_empty_collection.xml" />
|
||||
@@ -39,25 +50,25 @@
|
||||
<tool file="${model_tools_path}/filter_null_1.1.0.xml" />
|
||||
<tool file="${model_tools_path}/keep_success_collection.xml" />
|
||||
<tool file="${model_tools_path}/keep_success_collection_1.1.0.xml" />
|
||||
<tool file="${model_tools_path}/flatten_collection.xml" />
|
||||
<tool file="${model_tools_path}/nest_collection.xml" />
|
||||
<tool file="${model_tools_path}/merge_collection.xml" />
|
||||
<tool file="${model_tools_path}/relabel_from_file.xml" />
|
||||
<tool file="${model_tools_path}/filter_from_file.xml" />
|
||||
<tool file="${model_tools_path}/filter_from_file_1.1.0.xml" />
|
||||
<tool file="${model_tools_path}/sort_collection_list.xml" />
|
||||
<tool file="${model_tools_path}/harmonize_two_collections_list.xml" />
|
||||
|
||||
<label id="collection_pair_combine" text="Pair and Combine" />
|
||||
<tool file="${model_tools_path}/zip_collection.xml" />
|
||||
<tool file="${model_tools_path}/unzip_collection.xml" />
|
||||
<tool file="${model_tools_path}/cross_product_flat.xml" />
|
||||
<tool file="${model_tools_path}/cross_product_nested.xml" />
|
||||
<tool file="${model_tools_path}/harmonize_two_collections_list.xml" />
|
||||
|
||||
<label id="collection_sort_label" text="Sort and Label" />
|
||||
<tool file="${model_tools_path}/sort_collection_list.xml" />
|
||||
<tool file="${model_tools_path}/relabel_from_file.xml" />
|
||||
<tool file="${model_tools_path}/tag_collection_from_file.xml" />
|
||||
<tool file="${model_tools_path}/apply_rules.xml" />
|
||||
<tool file="${model_tools_path}/build_list.xml" />
|
||||
<tool file="${model_tools_path}/build_list_1.2.0.xml" />
|
||||
<tool file="${model_tools_path}/sample_sheet_to_tabular.xml" />
|
||||
<tool file="${model_tools_path}/convert_sample_sheet.xml" />
|
||||
|
||||
<label id="collection_extract" text="Extract" />
|
||||
<tool file="${model_tools_path}/extract_dataset.xml" />
|
||||
<tool file="${model_tools_path}/duplicate_file_to_collection.xml" />
|
||||
<tool file="${model_tools_path}/split_paired_and_unpaired.xml" />
|
||||
<tool file="${model_tools_path}/sample_sheet_to_tabular.xml" />
|
||||
<tool file="${model_tools_path}/apply_rules.xml" />
|
||||
</section>
|
||||
<section id="expression_tools" name="Expression Tools">
|
||||
<tool file="expression_tools/parse_values_from_file.xml"/>
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
name="Apply rules"
|
||||
version="1.1.0"
|
||||
tool_type="apply_rules_to_collection">
|
||||
<description>to reorganize a collection using the rule builder</description>
|
||||
<type class="ApplyRulesTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<edam_operations>
|
||||
<edam_operation>operation_2409</edam_operation>
|
||||
<edam_operation>operation_3695</edam_operation>
|
||||
@@ -23,28 +27,53 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
This tool allows one to process an existing Galaxy dataset collection's metadata as tabular data,
|
||||
apply a series of rules to it, and generate a new collection.
|
||||
Reorganizes a collection by applying a chain of rules (filter, sort, rename, nest, flatten, tag) through an interactive rule builder.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
When used interactively in the tool form, a dynamic preview of the processing will be available in a tabular data viewer but this tool
|
||||
may be used in workflows as well where no such preview can be generated.
|
||||
This tool opens an interactive rule builder that lets you manipulate the element identifiers (and nesting structure) of a collection as if they were columns in a spreadsheet. You can chain multiple operations together — for example, split an identifier on a delimiter, use one part as a new nesting level and another as the element name, filter rows by a pattern, and sort the result — all in a single step.
|
||||
|
||||
This tool is an advanced feature but has a lot of flexibility - it can be used to process collections with arbitrary nesting and can do many kinds of filtering, re-sorting, nesting, flattening, and arbitrary combinations thereof not possible with Galaxy's other, more simple
|
||||
collection operation tools.
|
||||
This is an advanced tool that combines the capabilities of many simpler collection operations (sort, relabel, nest, flatten, filter) into one flexible interface. Use it when the simpler tools cannot achieve the reorganization you need.
|
||||
|
||||
More information about the rule processor in general can be found at `our training site`_.
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
.. _our training site: https://training.galaxyproject.org/training-material/search?query=rule+builder
|
||||
**Flatten and re-nest by a different criterion**
|
||||
|
||||
Given a ``list:list`` collection where the outer identifiers are sequencing lanes and inner identifiers are sample names, you could use the rule builder to re-nest so that the outer level is sample name and the inner level is lane — effectively transposing the collection structure.
|
||||
|
||||
-------
|
||||
|
||||
**Extract metadata from identifiers**
|
||||
|
||||
If your element identifiers encode multiple pieces of information (e.g. ``patient01_treatment_rep2``), you can split on ``_`` to create columns, then use those columns to define new nesting levels, group tags, or filters.
|
||||
|
||||
-------
|
||||
|
||||
**Assign tags based on identifier patterns**
|
||||
|
||||
You can add a column derived from an identifier (e.g. extract "treatment" or "control" from the name) and assign it as a group tag, all within the rule builder.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/apply_rules.svg
|
||||
:alt: Apply rules to reorganize a collection
|
||||
:width: 500
|
||||
|
||||
-------
|
||||
|
||||
For detailed tutorials on the rule builder, visit `the Galaxy Training Network`_.
|
||||
|
||||
.. _the Galaxy Training Network: https://training.galaxyproject.org/training-material/search?query=rule+builder
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,16 +2,19 @@
|
||||
name="Build list"
|
||||
version="1.2.0"
|
||||
tool_type="build_list">
|
||||
<description></description>
|
||||
<description>from individual datasets or existing collections</description>
|
||||
<type class="BuildListCollectionTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
<edam_operation>operation_2409</edam_operation>
|
||||
</edam_operations>
|
||||
<inputs>
|
||||
<repeat name="datasets" title="Dataset" help="If collections are provided they should contain the same number of items.">
|
||||
<param type="data" name="input" optional="true" label="Input Dataset" help="If providing a collection here the tool will be run in batch and one collection per element is created."/>
|
||||
<repeat name="datasets" title="Dataset(s)" help="If collections are provided they should contain the same number of items (see case 'c' in the figure below).">
|
||||
<param type="data" name="input" optional="true" label="Input Dataset" help="If you are using this tool to combine multiple collections, they need to contain the same number of datasets (see case 'c' in the figure below)"/>
|
||||
<conditional name="id_cond">
|
||||
<param name="id_select" type="select" label="Label to use" help="">
|
||||
<option value="idx" selected="true">Index</option>
|
||||
@@ -21,7 +24,7 @@
|
||||
<when value="idx"/>
|
||||
<when value="identifier"/>
|
||||
<when value="manual">
|
||||
<param name="identifier" type="text" lable="Identifier"/>
|
||||
<param name="identifier" type="text" label="Identifier"/>
|
||||
</when>
|
||||
</conditional>
|
||||
</repeat>
|
||||
@@ -42,7 +45,7 @@ Builds a new list collection from individual datasets or collections.
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool combines individual datasets or collections into a new collection. The simplest scenario is building a new colection from individual datasets (case **A** in the image below). You can merge a collection with individual dataset(s). In this case (see **B** in the image below) the individual dataset(s) will be merged with each element of the input collection to create a nested collection. Finally, two or more collection can be merged together creating a nested collection (case **C** in the image below).
|
||||
This tool combines individual datasets or collections into a new collection. The simplest scenario is building a new collection from individual datasets (case **A** in the image below). You can merge a collection with individual dataset(s). In this case (see **B** in the image below) the individual dataset(s) will be merged with each element of the input collection to create a nested collection. Finally, two or more collections can be merged together creating a nested collection (case **C** in the image below).
|
||||
|
||||
.. class:: warningmark
|
||||
|
||||
@@ -51,15 +54,14 @@ This tool combines individual datasets or collections into a new collection. The
|
||||
------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/build_list.svg
|
||||
:alt: Build list operation
|
||||
:width: 800
|
||||
:alt: Unzipping operation
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
|
||||
This tool will create a new collection from your history datasets but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
<tests>
|
||||
|
||||
@@ -26,21 +26,83 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Converts a sample sheet collection back to its corresponding list collection type.
|
||||
Strips sample sheet metadata and produces a regular list collection.
|
||||
|
||||
========================
|
||||
What is a sample sheet?
|
||||
========================
|
||||
|
||||
A sample sheet is a special type of Galaxy collection that pairs each dataset with structured metadata — such as replicate number, treatment condition, or tissue type. It works like a regular list collection but with an attached spreadsheet of per-sample information.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool takes a sample sheet collection and produces a regular list collection, removing all sample sheet metadata (column definitions and row values).
|
||||
This tool removes the metadata layer from a sample sheet and converts it to the corresponding regular list collection type. The datasets themselves are unchanged — only the column definitions and row values are discarded.
|
||||
|
||||
The conversion follows this mapping:
|
||||
|
||||
- ``sample_sheet`` becomes ``list``
|
||||
- ``sample_sheet:paired`` becomes ``list:paired``
|
||||
- ``sample_sheet:paired_or_unpaired`` becomes ``list:paired_or_unpaired``
|
||||
- ``sample_sheet`` → ``list``
|
||||
- ``sample_sheet:paired`` → ``list:paired``
|
||||
- ``sample_sheet:paired_or_unpaired`` → ``list:paired_or_unpaired``
|
||||
|
||||
Use this tool when you need to pass a sample sheet to a tool that expects a regular list collection, or when you want to discard the sample sheet metadata.
|
||||
Use this when you need to pass a sample sheet to a tool that only accepts regular list collections.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Flat sample sheet**
|
||||
|
||||
Suppose you have an RNA-seq experiment uploaded as a sample sheet collection with metadata about each sample::
|
||||
|
||||
Sample Sheet: "RNA-seq experiment"
|
||||
Column definitions: replicate (int), treatment (string)
|
||||
|
||||
sample1.fastq | replicate=1, treatment="control"
|
||||
sample2.fastq | replicate=2, treatment="treated"
|
||||
|
||||
Running **Convert sample sheet** strips the metadata and produces a plain list::
|
||||
|
||||
List: "RNA-seq experiment (converted)"
|
||||
|
||||
sample1.fastq
|
||||
sample2.fastq
|
||||
|
||||
Same datasets, same identifiers, but now it is a regular list that any tool can consume.
|
||||
|
||||
-------
|
||||
|
||||
**Paired sample sheet**
|
||||
|
||||
If your sample sheet contains paired-end reads (``sample_sheet:paired``), the tool converts it to ``list:paired``::
|
||||
|
||||
Sample Sheet (paired): "WGS samples"
|
||||
Column definitions: replicate (int)
|
||||
|
||||
sample1 -> [forward, reverse] | replicate=42
|
||||
sample2 -> [forward, reverse] | replicate=43
|
||||
|
||||
After conversion::
|
||||
|
||||
List (paired): "WGS samples (converted)"
|
||||
|
||||
sample1 -> [forward, reverse]
|
||||
sample2 -> [forward, reverse]
|
||||
|
||||
The paired structure is preserved; only the metadata is removed.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/convert_sample_sheet.svg
|
||||
:alt: Convert sample sheet to list collection
|
||||
:width: 500
|
||||
|
||||
-------
|
||||
|
||||
.. class:: warningmark
|
||||
|
||||
If you need to preserve the metadata, use the **Sample sheet to tabular** tool first to export it as a tab-separated table before converting.
|
||||
|
||||
----
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<tool id="__CROSS_PRODUCT_FLAT__"
|
||||
name="Flat Cross Product"
|
||||
version="1.0.0">
|
||||
<description></description>
|
||||
<description>of two collections into flat lists for all-vs-all comparison</description>
|
||||
<type class="CrossProductFlatCollectionTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
@@ -72,72 +72,72 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
@CROSS_PRODUCT_INTRO@
|
||||
Creates two flat lists that, when processed element-wise by a downstream tool, produce every pairwise combination (all-vs-all) of the two input collections.
|
||||
|
||||
====================
|
||||
How to use this tool
|
||||
====================
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
@GALAXY_DOT_PRODUCT_SEMANTICS@
|
||||
This tool takes two list collections and produces two output lists that encode the **Cartesian product** (cross product) of the inputs. Both output lists have the same length (``n * m`` elements, where ``n`` and ``m`` are the sizes of the inputs) and the same element identifiers.
|
||||
|
||||
Running input lists through this tool produces new dataset lists (described in detail below) that when using
|
||||
the same natural element-wise matching "map over" semantics described above produce every combination of the
|
||||
elements of the two lists compared against each other. Running a tool with these two outputs instead of the initial
|
||||
two inputs produces a list of the comparison of each combination of pairs from the respective inputs.
|
||||
When you feed these two outputs into a tool that operates on pairs of datasets, Galaxy's element-wise matching ensures that every combination of one element from Input A and one element from Input B is compared exactly once.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/flat_crossproduct_output.png
|
||||
:alt: The Flat Cartesian Product of Two Collections
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**All-vs-all comparison**
|
||||
|
||||
Given::
|
||||
|
||||
Input A: [a1] [a2]
|
||||
Input B: [b1] [b2]
|
||||
|
||||
The tool produces two flat lists of length 4::
|
||||
|
||||
Output A: [a1_b1 → a1] [a1_b2 → a1] [a2_b1 → a2] [a2_b2 → a2]
|
||||
Output B: [a1_b1 → b1] [a1_b2 → b2] [a2_b1 → b1] [a2_b2 → b2]
|
||||
|
||||
Feeding both outputs to a comparison tool produces::
|
||||
|
||||
Result: [a1_b1 → compare(a1,b1)]
|
||||
[a1_b2 → compare(a1,b2)]
|
||||
[a2_b1 → compare(a2,b1)]
|
||||
[a2_b2 → compare(a2,b2)]
|
||||
|
||||
The identifier separator (default ``_``) can be changed to ``:`` or ``-``.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/cross_product_flat.svg
|
||||
:alt: Flat cross product of two collections
|
||||
:width: 620
|
||||
|
||||
-------
|
||||
|
||||
==================================
|
||||
How element-wise matching works
|
||||
==================================
|
||||
|
||||
Normally, when you connect two lists to a tool that takes two inputs, Galaxy matches them element-wise (dot product): the first element of list 1 is paired with the first element of list 2, and so on. This requires both lists to have the same identifiers.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/dot_product.png
|
||||
:alt: Element-wise (dot product) matching
|
||||
:width: 500
|
||||
|
||||
The result of running a subsequent tool with the outputs produced by this tool will be a much larger list
|
||||
whose element identifiers are the concatenation of the combinations of the elements identifiers from the
|
||||
two input lists.
|
||||
This tool rearranges the inputs so that the same element-wise matching mechanism produces every combination instead.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/flat_crossproduct_separator.png
|
||||
:alt: Flat Cross Product Identifier Separator
|
||||
:width: 500
|
||||
-------
|
||||
|
||||
============================================
|
||||
What this tool does (technical details)
|
||||
============================================
|
||||
.. class:: infomark
|
||||
|
||||
This tool consumes two lists - we will call them ``input_a`` and ``input_b``. If ``input_a``
|
||||
has length ``n`` and dataset elements identified as ``a1``, ``a2``, ... ``an`` and ``input_b``
|
||||
has length ``m`` and dataset elements identified as ``b1``, ``b2``, ... ``bm``, then this tool
|
||||
produces a pair of larger lists - each of size ``n*m``.
|
||||
For a nested (``list:list``) output structure instead of a flat list, use **Nested Cross Product**.
|
||||
|
||||
Both output lists will be the same length and contain the same set of element identifiers in the
|
||||
same order. If the kth input can be described as ``(i-1)*n + (j-1)`` where ``1 <= i <= m`` and ``1 <= j <= n``
|
||||
then the element identifier for this kth element is the concatenation of the element identifier for
|
||||
the ith item of ``input_a`` and the jth item of ``input_b``.
|
||||
|
||||
In the first output list, this kth element will be the ith element of ``input_a``. In the second
|
||||
output list, the kth element will be the jth element of ``input_b``.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/flat_cross_product_outputs.png
|
||||
:alt: Flat Cross Product Outputs
|
||||
:width: 500
|
||||
|
||||
These list structures might appear to be a little odd, but they have the very useful property
|
||||
that if you match up corresponding elements of the lists the result is each combination of
|
||||
elements in ``input_a`` and ``input_b`` are matched up once.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/flat_cross_product_matched.png
|
||||
:alt: Flat Cross Product Matching Datasets
|
||||
:width: 500
|
||||
|
||||
Running a downstream comparison tool that compares two datasets with these two lists produces a
|
||||
new list with every combination of comparisons.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/flat_cross_product_downstream.png
|
||||
:alt: Flat Cross Product All-vs-All Result
|
||||
:width: 500
|
||||
|
||||
----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<tool id="__CROSS_PRODUCT_NESTED__"
|
||||
name="Nested Cross Product"
|
||||
version="1.0.0">
|
||||
<description></description>
|
||||
<description>of two collections into nested lists for all-vs-all comparison</description>
|
||||
<type class="CrossProductNestedCollectionTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
@@ -76,75 +76,89 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
@CROSS_PRODUCT_INTRO@
|
||||
Creates two nested lists (``list:list``) that, when processed element-wise by a downstream tool, produce every pairwise combination (all-vs-all) of the two input collections, organized by the first input.
|
||||
|
||||
====================
|
||||
How to use this tool
|
||||
====================
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
@GALAXY_DOT_PRODUCT_SEMANTICS@
|
||||
This tool takes two flat list collections and produces two ``list:list`` output collections that encode the **Cartesian product** (cross product) of the inputs. The outer list has one element per element of Input A, and each inner list has one element per element of Input B.
|
||||
|
||||
Running input lists through this tool produces new list structures (described in detail below) that when using
|
||||
the same natural element-wise matching "map over" semantics described above produce every combination of the
|
||||
elements of the two lists compared against each other. Running a tool with these two outputs instead of the initial
|
||||
two inputs produces a nested list structure where the jth element of the inner list of the ith element of the outer
|
||||
list is a comparison of the ith element of the first list to the jth element of the second list.
|
||||
Put more simply, the result is a nested list where the identifiers of an element describe which inputs were
|
||||
matched to produce the comparison output found at that element.
|
||||
When you feed these two outputs into a tool that takes two inputs, Galaxy matches elements at each nesting level. The result is a nested list where the outer identifier tells you which element from Input A was used, and the inner identifier tells you which element from Input B was used.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/nested_crossproduct_output.png
|
||||
:alt: The Cartesian Product of Two Collections
|
||||
This is similar to **Flat Cross Product**, but the output preserves structure: results are grouped by the first input, making it easier to see all comparisons for a given element of Input A.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**All-vs-all comparison with nested output**
|
||||
|
||||
Given::
|
||||
|
||||
Input A: [a1] [a2]
|
||||
Input B: [b1] [b2]
|
||||
|
||||
The tool produces two ``list:list`` collections::
|
||||
|
||||
Output A (list:list):
|
||||
|
||||
a1/
|
||||
b1 → a1
|
||||
b2 → a1
|
||||
a2/
|
||||
b1 → a2
|
||||
b2 → a2
|
||||
|
||||
Output B (list:list):
|
||||
|
||||
a1/
|
||||
b1 → b1
|
||||
b2 → b2
|
||||
a2/
|
||||
b1 → b1
|
||||
b2 → b2
|
||||
|
||||
Feeding both outputs to a comparison tool produces::
|
||||
|
||||
Result (list:list):
|
||||
|
||||
a1/
|
||||
b1 → compare(a1, b1)
|
||||
b2 → compare(a1, b2)
|
||||
a2/
|
||||
b1 → compare(a2, b1)
|
||||
b2 → compare(a2, b2)
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/cross_product_nested.svg
|
||||
:alt: Nested cross product of two collections
|
||||
:width: 620
|
||||
|
||||
-------
|
||||
|
||||
==================================
|
||||
How element-wise matching works
|
||||
==================================
|
||||
|
||||
Normally, when you connect two lists to a tool, Galaxy matches them element-wise (dot product). This tool rearranges the inputs so that the same matching mechanism produces every combination instead, with results grouped into a nested structure.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/dot_product.png
|
||||
:alt: Element-wise (dot product) matching
|
||||
:width: 500
|
||||
|
||||
============================================
|
||||
What this tool does (technical details)
|
||||
============================================
|
||||
-------
|
||||
|
||||
This tool consumes two flat lists. We will call the input collections ``input_a`` and ``input_b``. If ``input_a``
|
||||
has length ``n`` and dataset elements identified as ``a1``, ``a2``, ... ``an`` and ``input_b``
|
||||
has length ``m`` and dataset elements identified as ``b1``, ``b2``, ... ``bm``, then this tool
|
||||
produces a pair of output nested lists (specifically of the ``list:list`` collection type) where
|
||||
the outer list is of length ``n`` and each inner list has a length of ``m`` (a ``n X m`` nested list). The jth element
|
||||
inside the outer list's ith element is a pseudo copy of the ith dataset of ``input_a``. One
|
||||
way to think about the output nested lists is as matrices. Here is a diagram of the first output
|
||||
showing the element identifiers of the outer and inner lists along with dataset identifiers being
|
||||
"copied" into this new collection.
|
||||
.. class:: infomark
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/nested_cross_product_out_1.png
|
||||
:alt: Nested Cross Product First Output
|
||||
:width: 500
|
||||
For a flat output list instead of nested, use **Flat Cross Product**.
|
||||
|
||||
The second output is a nested list of pseudo copies of the elements of ``input_b`` instead of
|
||||
``input_a``. In particular the outer list is again of length ``n`` and each inner list is again
|
||||
of length ``m`` but this time the jth element inside the outer list's ith element is a pseudo copy
|
||||
of the jth dataset of ``input_b``. Here is the matrix of these outputs.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/nested_cross_product_out_2.png
|
||||
:alt: Nested Cross Product Second Output
|
||||
:width: 500
|
||||
|
||||
These nested list structures might appear to be a little odd, but they have the very useful property
|
||||
that if you match up corresponding elements of the nested lists the result is each combination of
|
||||
elements in ``input_a`` and ``input_b`` are matched up once. The following diagram describes these matching
|
||||
datasets.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/nested_cross_product_matching.png
|
||||
:alt: Matching Inputs
|
||||
:width: 500
|
||||
|
||||
Running a tool that compares two datasets with these two nested lists produces a new nested list
|
||||
as described above. The following diagram shows the structure of this output and how the element
|
||||
identifiers are preserved and indicate what comparison was performed.
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/nested_cross_product_output.png
|
||||
:alt: Matching Inputs
|
||||
:width: 500
|
||||
|
||||
----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Duplicate file to collection"
|
||||
version="1.0.0"
|
||||
tool_type="duplicate_file_to_collection">
|
||||
<description></description>
|
||||
<description>by duplicating a dataset N times</description>
|
||||
<type class="DuplicateFileToCollectionTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<!-- <edam_operations>
|
||||
@@ -41,16 +44,57 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Creates a collection of arbitrary size by duplicating an input dataset N times, where N is a user-specified integer.
|
||||
Creates a list collection by duplicating a single dataset N times.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool allows creation of a dataset collection of arbitrary size. It takes an input dataset and an integer parameter, which specifies the number of times to duplicate the dataset in the output collection. In addition, the user can specify the base name for the element identifier to use in the output. For example, if `Number` is specified as 3 and `Element identifier` as 'Element', the output collection will contain three identical datasets, with the identifiers `Element 1`, `Element 2` and `Element 3`.
|
||||
This tool takes one input dataset and produces a list collection containing N identical copies of it. You specify the number of copies and a base name for the element identifiers. The copies are numbered automatically — for example, with a count of 3 and base name ``sample``, the output collection will contain ``sample 1``, ``sample 2``, and ``sample 3``.
|
||||
|
||||
This is useful when a workflow or tool expects a list collection as input but you only have a single dataset. Instead of uploading the same file multiple times, you can duplicate it into a collection in one step.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Basic duplication**
|
||||
|
||||
Given a single reference genome file and the settings:
|
||||
|
||||
- *Size of output collection*: ``3``
|
||||
- *Element identifier*: ``ref``
|
||||
|
||||
The output is a list collection containing three identical copies::
|
||||
|
||||
List: "reference.fa (duplicated)"
|
||||
|
||||
ref 1 → reference.fa
|
||||
ref 2 → reference.fa
|
||||
ref 3 → reference.fa
|
||||
|
||||
-------
|
||||
|
||||
**Workflow use case**
|
||||
|
||||
If you have a list of samples and a tool that compares each sample against a reference, you can duplicate the reference to match the number of samples. Galaxy will then pair them element-wise:
|
||||
|
||||
- Sample list: ``[sample1.fq, sample2.fq, sample3.fq]``
|
||||
- Duplicated reference: ``[ref 1, ref 2, ref 3]`` (all pointing to the same file)
|
||||
|
||||
This avoids having to manually create a matched collection.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/duplicate_file_to_collection.svg
|
||||
:alt: Duplicate file to collection
|
||||
:width: 500
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Extract dataset"
|
||||
version="1.0.2"
|
||||
tool_type="extract_element">
|
||||
<description></description>
|
||||
<description>from a collection by index or identifier</description>
|
||||
<type class="ExtractDatasetCollectionTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -44,21 +47,75 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Extracts datasets from a collection based on either position or identifier.
|
||||
Extracts a single dataset from a collection by position or identifier.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
The tool allow extracting datasets based on position (**The first dataset** and **Select by index** options) or name (**Select by element identifier** option). This tool effectively collapses the inner-most collection into a dataset. For nested collections (e.g a list of lists of lists: outer:middle:inner, extracting the inner dataset element) a new list is created where the selected element takes the position of the inner-most collection (so outer:middle, where middle is not a collection but the inner dataset element).
|
||||
This tool pulls one dataset out of a collection and places it in your history as a standalone dataset. You can select the dataset in three ways:
|
||||
|
||||
- **The first dataset** — takes the first element of the collection.
|
||||
- **Select by index** — takes the element at a specific position (starting from 0).
|
||||
- **Select by element identifier** — takes the element whose name matches the given identifier.
|
||||
|
||||
The extracted dataset is a copy of the original, so the input collection is not modified.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Extract from a flat list** (case **A** in the image below)
|
||||
|
||||
Given a list collection with three elements::
|
||||
|
||||
List: "RNA-seq samples"
|
||||
|
||||
control → control.fastq
|
||||
treated → treated.fastq
|
||||
reference → reference.fastq
|
||||
|
||||
Selecting **by element identifier** = ``treated`` produces a single standalone dataset: ``treated.fastq``. Selecting **by index** = ``0`` would extract ``control.fastq`` instead.
|
||||
|
||||
-------
|
||||
|
||||
**Extract from a nested collection** (case **B** in the image below)
|
||||
|
||||
When the input is a nested collection such as ``list:list``, Galaxy automatically maps the extraction over the outer list. The same selection is applied to every inner list, and the result is a flat list — one nesting level is removed.
|
||||
|
||||
For example, given a ``list:list``::
|
||||
|
||||
list:list: "Paired analysis"
|
||||
|
||||
sampleA → [Dataset 1, Dataset 2, Dataset 3]
|
||||
sampleB → [Dataset A, Dataset B, Dataset C]
|
||||
|
||||
Extracting **by index** = ``1`` pulls element 1 from each inner list and produces a flat list::
|
||||
|
||||
List: "Paired analysis (extracted element)"
|
||||
|
||||
sampleA → Dataset 2
|
||||
sampleB → Dataset B
|
||||
|
||||
The outer identifiers (``sampleA``, ``sampleB``) are preserved. The inner lists are replaced by the single extracted element from each.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/extract_dataset.svg
|
||||
:alt: Extract dataset from collection
|
||||
:width: 800
|
||||
|
||||
-------
|
||||
|
||||
.. class:: warningmark
|
||||
|
||||
**Note**: Dataset index (numbering) begins with 0 (zero).
|
||||
|
||||
-----
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
<tests>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Filter empty datasets"
|
||||
version="1.1.0"
|
||||
tool_type="filter_empty_datasets_collection">
|
||||
<description></description>
|
||||
<description>from a collection</description>
|
||||
<type class="FilterEmptyDatasetsTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -39,19 +42,62 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Removes empty elements from a collection.
|
||||
Removes empty (zero-byte) datasets from a collection.
|
||||
|
||||
This tool takes a dataset collection and filters out (removes) empty datasets. This is useful for continuing a multi-sample analysis when downstream tools require datasets to have content.
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool takes a dataset collection and filters out elements that have no content. A dataset is considered empty if it contains zero bytes of actual data (including compressed archives that decompress to nothing).
|
||||
|
||||
This is useful when a multi-sample analysis produces some empty outputs — for example, when a filtering step removes all reads for certain samples. Downstream tools often fail on empty inputs, so removing them lets the rest of the analysis proceed.
|
||||
|
||||
Optionally, you can provide a **replacement dataset**. When specified, empty elements are replaced with that dataset instead of being removed. This preserves the collection size, which is important when element-wise pairing with another collection is needed.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Remove empty elements**
|
||||
|
||||
Given a list collection where one sample produced no output::
|
||||
|
||||
List: "Filtered reads"
|
||||
|
||||
sample1 → reads.fastq (1.2 MB)
|
||||
sample2 → reads.fastq (0 bytes)
|
||||
sample3 → reads.fastq (800 KB)
|
||||
|
||||
The output keeps only non-empty elements::
|
||||
|
||||
List: "Filtered reads (filtered empty datasets)"
|
||||
|
||||
sample1 → reads.fastq (1.2 MB)
|
||||
sample3 → reads.fastq (800 KB)
|
||||
|
||||
-------
|
||||
|
||||
**Replace instead of remove**
|
||||
|
||||
If a replacement dataset is provided, empty elements are swapped rather than dropped, preserving the collection structure::
|
||||
|
||||
List: "Filtered reads (filtered empty datasets)"
|
||||
|
||||
sample1 → reads.fastq (1.2 MB)
|
||||
sample2 → replacement.fastq
|
||||
sample3 → reads.fastq (800 KB)
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/filter_empty.svg
|
||||
:alt: Filter empty datasets from collection
|
||||
:width: 500
|
||||
:alt: Filtering empty datasets
|
||||
|
||||
-----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Filter failed datasets"
|
||||
version="1.1.0"
|
||||
tool_type="filter_failed_datasets_collection">
|
||||
<description></description>
|
||||
<description>from a collection</description>
|
||||
<type class="FilterFailedDatasetsTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -44,23 +47,62 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Removes datasets in error (red) from a collection.
|
||||
Removes datasets in the error (red) state from a collection.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool takes a dataset collection and filters out (removes) datasets in the failed (red) state. This is useful for continuing a multi-sample analysis when one or more of the samples fails at some point.
|
||||
This tool takes a dataset collection and filters out elements whose datasets are in the failed (red) state. A dataset enters this state when the tool that created it encountered an error during execution.
|
||||
|
||||
This is useful when running a multi-sample analysis and one or more samples fail at some step. Rather than restarting the entire analysis, you can remove the failed elements and continue with the samples that succeeded.
|
||||
|
||||
Optionally, you can provide a **replacement dataset**. When specified, failed elements are replaced with that dataset instead of being removed. This preserves the collection size, which is important when element-wise pairing with another collection is needed.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Remove failed elements**
|
||||
|
||||
Given a list collection where one sample's alignment failed::
|
||||
|
||||
List: "Aligned reads"
|
||||
|
||||
sample1 → aligned.bam (ok)
|
||||
sample2 → aligned.bam (error)
|
||||
sample3 → aligned.bam (ok)
|
||||
|
||||
The output keeps only successful elements::
|
||||
|
||||
List: "Aligned reads (filtered failed datasets)"
|
||||
|
||||
sample1 → aligned.bam
|
||||
sample3 → aligned.bam
|
||||
|
||||
-------
|
||||
|
||||
**Replace instead of remove**
|
||||
|
||||
If a replacement dataset is provided, failed elements are swapped rather than dropped, preserving the collection structure::
|
||||
|
||||
List: "Aligned reads (filtered failed datasets)"
|
||||
|
||||
sample1 → aligned.bam
|
||||
sample2 → replacement.bam
|
||||
sample3 → aligned.bam
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/filter_error.svg
|
||||
:alt: Filter failed datasets from collection
|
||||
:width: 500
|
||||
:alt: Filter failed datasets
|
||||
|
||||
-----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Filter collection"
|
||||
version="1.1.0"
|
||||
tool_type="filter_from_file">
|
||||
<description></description>
|
||||
<description>using a list of identifiers from a file</description>
|
||||
<type class="FilterFromFileTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -86,65 +89,58 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Filters elements from a collection using a list supplied in a file.
|
||||
Filters elements from a collection using a list of identifiers supplied in a text file.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tools allow filtering elements from a data collection. It takes an input collection and a text file with names (i.e. identifiers). The tool behavious is controlled by **How should the elements to remove be determined?** drop-down. It has the following options:
|
||||
This tool splits a collection into two: one with elements that pass the filter and one with elements that don't. You provide a text file containing element identifiers (one per line), then choose the filtering mode:
|
||||
|
||||
**Remove if identifiers are ABSENT from file**
|
||||
- **Remove if identifiers are ABSENT from file** — keeps only elements whose identifiers appear in the file. Elements not listed are discarded.
|
||||
- **Remove if identifiers are PRESENT in file** — removes elements whose identifiers appear in the file. Elements not listed are kept.
|
||||
|
||||
Given a collection::
|
||||
The tool always produces **two** output collections: ``(filtered)`` containing the elements that passed, and ``(discarded)`` containing the rest. Identifiers in the file that do not match any element in the collection are silently ignored.
|
||||
|
||||
Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
and a text file::
|
||||
**Keep only listed elements** (Remove if ABSENT)
|
||||
|
||||
A
|
||||
B
|
||||
Z
|
||||
Given a collection with three elements and a text file listing ``A``, ``B``, and ``Z``::
|
||||
|
||||
the tool will return two collections::
|
||||
Collection: Text file:
|
||||
|
||||
(filtered): [Dataset A]
|
||||
[Dataset B]
|
||||
Dataset A A
|
||||
Dataset B B
|
||||
Dataset X Z
|
||||
|
||||
(discarded): [Dataset X]
|
||||
Elements ``A`` and ``B`` are in the file, so they are kept. ``X`` is not in the file, so it is discarded. ``Z`` is in the file but has no matching element, so it is ignored::
|
||||
|
||||
------
|
||||
(filtered): Dataset A, Dataset B
|
||||
(discarded): Dataset X
|
||||
|
||||
**Remove if identifiers are PRESENT in file**
|
||||
-------
|
||||
|
||||
Given a collection::
|
||||
**Remove listed elements** (Remove if PRESENT)
|
||||
|
||||
Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
With the same inputs but switching to PRESENT mode, the logic is inverted — elements ``A`` and ``B`` are in the file, so they are removed. ``X`` is not listed, so it is kept::
|
||||
|
||||
and a text file::
|
||||
(filtered): Dataset X
|
||||
(discarded): Dataset A, Dataset B
|
||||
|
||||
A
|
||||
B
|
||||
Z
|
||||
-------
|
||||
|
||||
the tool will return two collections::
|
||||
.. image:: ${static_path}/images/tools/collection_ops/filter_from_file.svg
|
||||
:alt: Filter collection from file
|
||||
:width: 800
|
||||
|
||||
(filtered): [Dataset X]
|
||||
|
||||
(discarded): [Dataset A]
|
||||
[Dataset B]
|
||||
|
||||
.. class:: warningmark
|
||||
|
||||
**Note** how the tool deals with the ``Z`` entry.
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
<tool id="__FILTER_NULL__" name="Filter null elements" version="1.1.0" tool_type="filter_null">
|
||||
<description/>
|
||||
<description>from a collection</description>
|
||||
<type class="FilterNullTool" module="galaxy.tools"/>
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations" class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
<edam_operation>operation_3695</edam_operation>
|
||||
@@ -35,13 +38,62 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Removes null elements from a collection.
|
||||
Removes null (missing) elements from a collection.
|
||||
|
||||
This tool takes a dataset collection and filters out nulls. This is useful for removing elements that resulted from conditional execution of jobs.
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool takes a dataset collection and filters out null elements. A null element is a placeholder that contains no actual dataset — it appears when a workflow uses conditional steps and a step is skipped, or when an expression tool produces a ``null`` value.
|
||||
|
||||
This is useful for cleaning up collections produced by conditional workflows. Downstream tools cannot process null elements, so removing them ensures the rest of the analysis can proceed.
|
||||
|
||||
Optionally, you can provide a **replacement dataset**. When specified, null elements are replaced with that dataset instead of being removed. This preserves the collection size, which is important when element-wise pairing with another collection is needed.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Remove null elements**
|
||||
|
||||
Given a list collection produced by a conditional workflow where one branch was skipped::
|
||||
|
||||
List: "Workflow outputs"
|
||||
|
||||
sample1 → result.txt (ok)
|
||||
sample2 → (null)
|
||||
sample3 → result.txt (ok)
|
||||
|
||||
The output keeps only real elements::
|
||||
|
||||
List: "Workflow outputs (without null datasets)"
|
||||
|
||||
sample1 → result.txt
|
||||
sample3 → result.txt
|
||||
|
||||
-------
|
||||
|
||||
**Replace instead of remove**
|
||||
|
||||
If a replacement dataset is provided, null elements are swapped rather than dropped, preserving the collection structure::
|
||||
|
||||
List: "Workflow outputs (without null datasets)"
|
||||
|
||||
sample1 → result.txt
|
||||
sample2 → replacement.txt
|
||||
sample3 → result.txt
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/filter_null.svg
|
||||
:alt: Filter null elements from collection
|
||||
:width: 500
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name="Flatten collection"
|
||||
version="1.0.0"
|
||||
tool_type="flatten_collection">
|
||||
<description></description>
|
||||
<description>to a simple list</description>
|
||||
<type class="FlattenTool" module="galaxy.tools" />
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
@@ -48,23 +48,81 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Flattens nested collection into a simple list.
|
||||
Flattens a nested collection into a simple list.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool takes nested collections such as a list of lists or a list of dataset pairs and produces a flat list from the inputs. It effectively "flattens" the hierarchy. The collection identifiers are merged together (using "_" as default) to create new collection identifiers in the flattened result:
|
||||
This tool takes a nested collection — such as a list of lists (``list:list``), a list of dataset pairs (``list:paired``), or even deeper structures — and collapses it into a single flat ``list``. Every dataset in the hierarchy becomes a top-level element in the output.
|
||||
|
||||
Because the hierarchy is removed, the element identifiers from each nesting level are joined together to form new unique names. By default the separator is an underscore (``_``), but you can choose a colon (``:``) or dash (``-``) instead.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Flatten a list of pairs**
|
||||
|
||||
A ``list:paired`` collection with two samples::
|
||||
|
||||
list:paired: "Sequencing reads"
|
||||
|
||||
sample1/
|
||||
forward → reads_R1.fastq
|
||||
reverse → reads_R2.fastq
|
||||
sample2/
|
||||
forward → reads_R1.fastq
|
||||
reverse → reads_R2.fastq
|
||||
|
||||
After flattening with separator ``_``::
|
||||
|
||||
list: "Sequencing reads (flattened)"
|
||||
|
||||
sample1_forward → reads_R1.fastq
|
||||
sample1_reverse → reads_R2.fastq
|
||||
sample2_forward → reads_R1.fastq
|
||||
sample2_reverse → reads_R2.fastq
|
||||
|
||||
-------
|
||||
|
||||
**Flatten a list of lists**
|
||||
|
||||
A ``list:list`` collection::
|
||||
|
||||
list:list: "Batches"
|
||||
|
||||
batch1/
|
||||
Dataset 1
|
||||
Dataset 2
|
||||
batch2/
|
||||
Dataset 3
|
||||
|
||||
After flattening::
|
||||
|
||||
list: "Batches (flattened)"
|
||||
|
||||
batch1_Dataset 1
|
||||
batch1_Dataset 2
|
||||
batch2_Dataset 3
|
||||
|
||||
-------
|
||||
|
||||
**Choosing a different separator**
|
||||
|
||||
With separator set to ``-`` instead of ``_``, the same example would produce ``batch1-Dataset 1``, ``batch1-Dataset 2``, etc.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/flatten.svg
|
||||
:alt: Flatten a nested collection into a simple list
|
||||
:width: 500
|
||||
:alt: Flattening operation
|
||||
|
||||
----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Harmonize two collections"
|
||||
version="1.0.0"
|
||||
tool_type="harmonize_list">
|
||||
<description></description>
|
||||
<description>to match identifiers and order</description>
|
||||
<type class="HarmonizeTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -209,36 +212,70 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Harmonize 2 collections: Inputs are 2 collections. Outputs are 2 collections with:
|
||||
- Same identifiers (identifiers which are specific to one or the other are removed)
|
||||
- Identifiers are in the same order
|
||||
Harmonizes two collections so they contain the same element identifiers in the same order.
|
||||
|
||||
=======
|
||||
Example
|
||||
=======
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
If the inputs are::
|
||||
This tool takes two collections and produces two output collections that share exactly the same set of identifiers in the same order. It performs two operations:
|
||||
|
||||
Collection1: [Horse123]
|
||||
[Donkey543]
|
||||
[Mule176]
|
||||
1. **Intersection** — any identifier that appears in only one of the two input collections is removed from both outputs.
|
||||
2. **Reordering** — the output elements follow the order of the **first** input collection.
|
||||
|
||||
Collection2: [Horse]
|
||||
[Mule176]
|
||||
[Donkey543]
|
||||
The tool will output::
|
||||
This is useful when two collections were produced by independent analyses and you need to pair them element-wise for a downstream tool. Without harmonization, mismatched identifiers or different ordering would cause errors.
|
||||
|
||||
Collection1: [Donkey543]
|
||||
[Mule176]
|
||||
The two input collections do not need to have the same collection type. For example, you can harmonize a ``list`` with a ``list:paired`` — each output preserves the type of its corresponding input.
|
||||
|
||||
Collection2: [Donkey543]
|
||||
[Mule176]
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Keep only shared identifiers**
|
||||
|
||||
Given two collections with partially overlapping identifiers::
|
||||
|
||||
Collection 1 (reference order):
|
||||
|
||||
sampleA → Dataset 1
|
||||
sampleB → Dataset 2
|
||||
sampleC → Dataset 3
|
||||
|
||||
Collection 2 (different order, extra element):
|
||||
|
||||
sampleD → Dataset 4
|
||||
sampleC → Dataset 5
|
||||
sampleA → Dataset 6
|
||||
|
||||
Output 1 (from Collection 1, matching order preserved)::
|
||||
|
||||
sampleA → Dataset 1
|
||||
sampleC → Dataset 3
|
||||
|
||||
Output 2 (from Collection 2, reordered to match Collection 1)::
|
||||
|
||||
sampleA → Dataset 6
|
||||
sampleC → Dataset 5
|
||||
|
||||
``sampleB`` and ``sampleD`` are removed because they are not present in both collections.
|
||||
|
||||
-------
|
||||
|
||||
**No matching identifiers**
|
||||
|
||||
If the two collections share no identifiers at all, both outputs will be empty collections.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/harmonize.svg
|
||||
:alt: Harmonize two collections to match identifiers and order
|
||||
:width: 620
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Keep success"
|
||||
version="1.1.0"
|
||||
tool_type="keep_success_datasets_collection">
|
||||
<description></description>
|
||||
<description>datasets in a collection</description>
|
||||
<type class="KeepSuccessDatasetsTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -14,7 +17,7 @@
|
||||
<param type="data" name="replacement" optional="true" label="Replace unsuccessful elements with this dataset" help="If provided, unsuccessful elements will be replaced with this dataset"/>
|
||||
</inputs>
|
||||
<outputs>
|
||||
<collection name="output" format_source="input" type_source="input" label="${on_string} (only successed datasets)" >
|
||||
<collection name="output" format_source="input" type_source="input" label="${on_string} (only successful datasets)" >
|
||||
</collection>
|
||||
</outputs>
|
||||
<tests>
|
||||
@@ -43,23 +46,66 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Keep datasets in success (green) from a collection.
|
||||
Keeps only datasets in the success (green) state from a collection.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool takes a dataset collection and filters in (keep) datasets in the success (green) state. This is useful for continuing a multi-sample analysis when one of more of the samples fails or is in paused state.
|
||||
This tool takes a dataset collection and retains only elements whose datasets are in the success (green/ok) state. Elements in any other state — failed (red), paused (gray), or still running — are removed from the output collection.
|
||||
|
||||
This is stricter than **Filter failed datasets**, which only removes elements in the error state. **Keep success** removes *anything* that is not ok, including paused datasets that have not yet completed.
|
||||
|
||||
This is useful when a multi-sample workflow has partially completed and you want to continue with just the samples that succeeded, discarding any that failed or stalled.
|
||||
|
||||
Optionally, you can provide a **replacement dataset**. When specified, unsuccessful elements are replaced with that dataset instead of being removed. This preserves the collection size, which is important when element-wise pairing with another collection is needed.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Remove unsuccessful elements**
|
||||
|
||||
Given a collection where one sample failed and another is paused::
|
||||
|
||||
List: "Aligned reads"
|
||||
|
||||
sample1 → aligned.bam (ok)
|
||||
sample2 → aligned.bam (error)
|
||||
sample3 → aligned.bam (ok)
|
||||
sample4 → aligned.bam (paused)
|
||||
|
||||
The output keeps only the successful elements::
|
||||
|
||||
List: "Aligned reads (only successful datasets)"
|
||||
|
||||
sample1 → aligned.bam
|
||||
sample3 → aligned.bam
|
||||
|
||||
-------
|
||||
|
||||
**Replace instead of remove**
|
||||
|
||||
If a replacement dataset is provided, unsuccessful elements are swapped rather than dropped::
|
||||
|
||||
List: "Aligned reads (only successful datasets)"
|
||||
|
||||
sample1 → aligned.bam
|
||||
sample2 → replacement.bam
|
||||
sample3 → aligned.bam
|
||||
sample4 → replacement.bam
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/keep_success.svg
|
||||
:alt: Keep only successful datasets in a collection
|
||||
:width: 500
|
||||
:alt: Keep success datasets
|
||||
|
||||
-----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name="Merge collections"
|
||||
version="1.0.0"
|
||||
tool_type="merge_collection">
|
||||
<description></description>
|
||||
<description>into a single collection</description>
|
||||
<type class="MergeCollectionTool" module="galaxy.tools" />
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
@@ -10,8 +10,9 @@
|
||||
<edam_operation>operation_2409</edam_operation>
|
||||
</edam_operations>
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
<xml name="suffix_param">
|
||||
<param name="suffix_pattern" label="Use the follow suffix pattern:" help="Describe the suffix pattern to use when joing element name and data copy number. For instance, the default is '_#', which will produce _1 as the first suffix used." value="_#" type="text">
|
||||
<param name="suffix_pattern" label="Use the following suffix pattern:" help="Describe the suffix pattern to use when joining element name and data copy number. For instance, the default is '_#', which will produce _1 as the first suffix used." value="_#" type="text">
|
||||
<sanitizer invalid_char="">
|
||||
<valid initial="string.ascii_letters,string.digits">
|
||||
<add value="_" />
|
||||
@@ -60,9 +61,9 @@
|
||||
<conditional name="conflict">
|
||||
<param name="duplicate_options" type="select" label="How should conflicts (or potential conflicts) be handled?"
|
||||
help="Collection elements must have unique element identifiers, when appending how should unique identifiers be assured. See Help section below for examples.">
|
||||
<option value="suffix_conflict">Append suffix to conflicted element identifers</option>
|
||||
<option value="suffix_conflict_rest">Append suffix to conflicted element identifers after first one encountered</option>
|
||||
<option value="suffix_every">Append suffix to every element identifer</option>
|
||||
<option value="suffix_conflict">Append suffix to conflicted element identifiers</option>
|
||||
<option value="suffix_conflict_rest">Append suffix to conflicted element identifiers after first one encountered</option>
|
||||
<option value="suffix_every">Append suffix to every element identifier</option>
|
||||
<option value="keep_first" selected="true">Keep first instance</option>
|
||||
<option value="keep_last">Keep last instance</option>
|
||||
<option value="fail">Fail collection creation</option>
|
||||
@@ -279,148 +280,104 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Takes two or more collections and creates a single collection from them.
|
||||
Concatenates two or more collections into a single collection.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
By default the tool assumes that collections that are being merged have unique dataset names. If it not the case only one (the first) of the datasets with a repeated name will be included in the merged collection. For example, suppose you have two collections. Each has two datasets named "A" and "B"::
|
||||
This tool takes two or more collections and combines their elements into one output collection. The elements from the first collection appear first, followed by the elements from the second, and so on.
|
||||
|
||||
Collection 1: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
Collection 2: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset Y]
|
||||
When the input collections contain elements with the same identifier (name), the tool must decide how to handle the duplicates. The default behavior (``keep first``) retains only the first occurrence and silently drops later duplicates. You can change this under **Advanced Options**.
|
||||
|
||||
Merging them will produce a single collection with only two datasets::
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
Merged Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
[Dataset Y]
|
||||
**Basic merge (no duplicates)**
|
||||
|
||||
This behavior can be changed by clicking on "*Advanced Options*" link. The following options are available:
|
||||
Two collections with unique identifiers::
|
||||
|
||||
**Keep first instance (Default behavior)**
|
||||
|
||||
Input::
|
||||
|
||||
Collection 1: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
Collection 2: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset Y]
|
||||
Collection 1: sampleA, sampleB
|
||||
Collection 2: sampleC, sampleD
|
||||
|
||||
Output::
|
||||
|
||||
Merged Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
[Dataset Y]
|
||||
Merged: sampleA, sampleB, sampleC, sampleD
|
||||
|
||||
Here if two collection have identical dataset names, a dataset is chosen from the *first* collection.
|
||||
-------
|
||||
|
||||
-----
|
||||
.. image:: ${static_path}/images/tools/collection_ops/merge.svg
|
||||
:alt: Merge two collections into one
|
||||
:width: 620
|
||||
|
||||
**Keep first instance**
|
||||
-------
|
||||
|
||||
Input::
|
||||
==================================
|
||||
Handling duplicate identifiers
|
||||
==================================
|
||||
|
||||
Collection 1: [Dataset A]
|
||||
[Dataset B]
|
||||
When two collections share element identifiers, the **Advanced Options** control what happens. All examples below use::
|
||||
|
||||
Collection 1: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
Collection 2: [Dataset A]
|
||||
[Dataset B]
|
||||
Collection 2: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset Y]
|
||||
Output::
|
||||
|
||||
Merged Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
[Dataset Y]
|
||||
**Keep first instance** (default)
|
||||
|
||||
Here if two collection have identical dataset names, a dataset is chosen from the *last* collection.
|
||||
Duplicates are silently dropped — only the copy from the first collection is kept::
|
||||
|
||||
-----
|
||||
Merged: [Dataset A] [Dataset B] [Dataset X] [Dataset Y]
|
||||
|
||||
-------
|
||||
|
||||
**Keep last instance**
|
||||
|
||||
The opposite — the copy from the last collection wins::
|
||||
|
||||
Merged: [Dataset A] [Dataset B] [Dataset X] [Dataset Y]
|
||||
|
||||
-------
|
||||
|
||||
**Append suffix to conflicted element identifiers**
|
||||
|
||||
Input::
|
||||
All copies of a duplicated name get a numbered suffix (``_1``, ``_2``, …). Unique names are left unchanged::
|
||||
|
||||
Collection 1: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
Collection 2: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset Y]
|
||||
Merged: [Dataset A_1] [Dataset B_1] [Dataset X]
|
||||
[Dataset A_2] [Dataset B_2] [Dataset Y]
|
||||
|
||||
Output::
|
||||
-------
|
||||
|
||||
Merged Collection: [Dataset A_1]
|
||||
[Dataset B_1]
|
||||
[Dataset A_2]
|
||||
[Dataset B_2]
|
||||
[Dataset X]
|
||||
[Dataset Y]
|
||||
**Append suffix to conflicted identifiers after first one encountered**
|
||||
|
||||
----
|
||||
The first copy keeps its original name; later copies get a suffix::
|
||||
|
||||
**Append suffix to conflicted element identifiers after first on encountered**
|
||||
Merged: [Dataset A] [Dataset B] [Dataset X]
|
||||
[Dataset A_2] [Dataset B_2] [Dataset Y]
|
||||
|
||||
Input::
|
||||
|
||||
Collection 1: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
Collection 2: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset Y]
|
||||
|
||||
Output::
|
||||
|
||||
Merged Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset A_2]
|
||||
[Dataset B_2]
|
||||
[Dataset X]
|
||||
[Dataset Y]
|
||||
|
||||
------
|
||||
-------
|
||||
|
||||
**Append suffix to every element identifier**
|
||||
|
||||
Input::
|
||||
Every element — even unique ones — gets a suffix indicating which input collection it came from::
|
||||
|
||||
Collection 1: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
Collection 2: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset Y]
|
||||
Merged: [Dataset A_1] [Dataset B_1] [Dataset X_1]
|
||||
[Dataset A_2] [Dataset B_2] [Dataset Y_2]
|
||||
|
||||
Output::
|
||||
|
||||
Merged Collection: [Dataset A_1]
|
||||
[Dataset B_2]
|
||||
[Dataset A_2]
|
||||
[Dataset B_2]
|
||||
[Dataset X_1]
|
||||
[Dataset Y_2]
|
||||
|
||||
-----
|
||||
-------
|
||||
|
||||
**Fail collection creation**
|
||||
|
||||
This option will simply trigger an error.
|
||||
The tool raises an error if any duplicate identifiers are found.
|
||||
|
||||
------
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets for your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name="Nest collection"
|
||||
version="1.0.0"
|
||||
tool_type="nest_collection">
|
||||
<description></description>
|
||||
<description>by adding a nesting level</description>
|
||||
<type class="NestTool" module="galaxy.tools" />
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
@@ -16,7 +16,7 @@
|
||||
<param type="data_collection" collection_type="list,paired" name="input" label="Input Collection" />
|
||||
</inputs>
|
||||
<outputs>
|
||||
<collection name="output" format_source="input" type="list:list" label="${on_string} (flattened)" >
|
||||
<collection name="output" format_source="input" type="list:list" label="${on_string} (nested)" >
|
||||
</collection>
|
||||
</outputs>
|
||||
<tests>
|
||||
@@ -87,33 +87,60 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Nest a collection, i.e. add a nesting level to a collection.
|
||||
Wraps each element of a collection inside its own inner list, adding one nesting level.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool takes a collection and creates a collection of collections where the top level elements are lists each containing one element of the input collection.
|
||||
For instance, for a simple list (of datasets) the tool will produce a list of lists where the inner lists each contain one of the datasets.
|
||||
This tool takes a collection and produces a nested collection (``list:list``) where each top-level element becomes a single-element inner list. The inner list and its sole element share the same identifier.
|
||||
|
||||
For example, a ``list`` with elements ``[A, B, C]`` becomes a ``list:list`` where the outer list has three elements, each containing a one-element inner list: ``[A→[A], B→[B], C→[C]]``.
|
||||
|
||||
If the input is already nested (e.g. ``list:paired``), the output gains one more level of nesting (``list:list:paired``), where each inner ``list`` contains a single paired collection.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Nest a flat list**
|
||||
|
||||
Input ``list``::
|
||||
|
||||
List: "Samples"
|
||||
|
||||
sample1 → Dataset 1
|
||||
sample2 → Dataset 2
|
||||
sample3 → Dataset 3
|
||||
|
||||
Output ``list:list``::
|
||||
|
||||
Nested list: "Samples (nested)"
|
||||
|
||||
sample1/
|
||||
sample1 → Dataset 1
|
||||
sample2/
|
||||
sample2 → Dataset 2
|
||||
sample3/
|
||||
sample3 → Dataset 3
|
||||
|
||||
-------
|
||||
|
||||
**Why is this useful?**
|
||||
|
||||
Some Galaxy tools expect a ``list`` as input — when you feed them a ``list``, Galaxy runs the tool once on the entire list. If you want Galaxy to run the tool separately on each element (map over the collection), you need the input to be a ``list:list`` so that Galaxy maps over the outer list and passes each inner list to the tool individually. Nesting provides that extra level.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/nest.svg
|
||||
:alt: Nest a collection by adding a nesting level
|
||||
:width: 500
|
||||
:alt: Nest operation
|
||||
|
||||
=======
|
||||
Purpose
|
||||
=======
|
||||
|
||||
Assume a tool processes an item of type X (where X can be a dataset, a dataset pair, a collection). Galaxy also allows to input a collection of items of type X.
|
||||
In this case Galaxy will map-over the elements of the collection, i.e. create separete jobs (each processing one item of type X).
|
||||
If X is a list (of datasets, pairs, or lists) then one needs to add an extra nesting level to the collection, such that Galaxy maps-over the elements of X instead
|
||||
of processing the elements of X jointly.
|
||||
|
||||
----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Relabel identifiers"
|
||||
version="1.1.0"
|
||||
tool_type="relabel_from_file">
|
||||
<description></description>
|
||||
<description>of collection elements from a file</description>
|
||||
<type class="RelabelFromFileTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -179,74 +182,75 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Changes identifiers of datasets within a collection using identifiers from a supplied file.
|
||||
Renames collection element identifiers using a mapping from a file.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
New identifiers can be supplied as either a simple list or a tab-delimited file mapping old identifiers to new ones. This is controlled using **How should the new identifiers be specified?** drop-down:
|
||||
This tool changes the element identifiers (names) in a collection without modifying the datasets themselves. The new identifiers are read from a file you provide.
|
||||
|
||||
**Use lines in a simple text file as new identifiers**
|
||||
Three mapping modes are available:
|
||||
|
||||
Given a collection::
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
**Simple text file — positional renaming**
|
||||
|
||||
and a simple text file::
|
||||
Each line in the text file replaces the identifier at the same position in the collection. Given a collection::
|
||||
|
||||
Alpha
|
||||
Beta
|
||||
Gamma
|
||||
List: sampleA, sampleB, sampleC
|
||||
|
||||
the tool will return::
|
||||
and a text file::
|
||||
|
||||
Collection: [Dataset Alpha]
|
||||
[Dataset Beta]
|
||||
[Dataset Gamma]
|
||||
Alpha
|
||||
Beta
|
||||
Gamma
|
||||
|
||||
the output is::
|
||||
|
||||
List: Alpha, Beta, Gamma
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
**Note** that the order and number of entries in the text file must match the order of the items you want to rename in your dataset collection.
|
||||
The text file must have exactly as many lines as the collection has elements (when **Ensure strict mapping** is enabled).
|
||||
|
||||
-------
|
||||
|
||||
**Map original identifiers to new ones using a two-column table**
|
||||
**Two-column tabular file — lookup renaming**
|
||||
|
||||
Given a collection::
|
||||
The first column contains the current identifier, the second column the new one. Order does not matter::
|
||||
|
||||
Collection: [Dataset A]
|
||||
[Dataset B]
|
||||
[Dataset X]
|
||||
sampleB Beta
|
||||
sampleC Gamma
|
||||
sampleA Alpha
|
||||
|
||||
and a simple tabular file (you can see that entries do not have to be in order here)::
|
||||
Output::
|
||||
|
||||
B Beta
|
||||
X Gamma
|
||||
A Alpha
|
||||
|
||||
the tool will return::
|
||||
|
||||
Collection: [Dataset Alpha]
|
||||
[Dataset Beta]
|
||||
[Dataset Gamma]
|
||||
List: Alpha, Beta, Gamma
|
||||
|
||||
-------
|
||||
|
||||
**Map original identifiers to new ones using a two-column table**
|
||||
**Extended tabular — choose which columns to use**
|
||||
|
||||
This mode works exactly as the previous one, but the tabular mapping file is allowed to have more than two columns, and you can specify which of them holds the original and new element identifiers, respectively.
|
||||
Works like the two-column mode, but the file may have additional columns. You select which column holds the original identifiers and which holds the new ones.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/relabel.svg
|
||||
:alt: Relabel collection element identifiers from a file
|
||||
:width: 500
|
||||
|
||||
-------
|
||||
|
||||
.. class:: warningmark
|
||||
|
||||
Valid identifiers must contain only characters (a-z, A-Z), numbers (0-9), dash (-), underscore (_), dot (.), space ( ) and comma (,). Other characters are not allowed.
|
||||
Valid identifiers must contain only letters (a-z, A-Z), numbers (0-9), dash (-), underscore (_), dot (.), space ( ) and comma (,). Other characters are not allowed.
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<tool id="__SAMPLE_SHEET_TO_TABULAR__"
|
||||
name="Sample sheet to tabular"
|
||||
version="1.0.0">
|
||||
<description></description>
|
||||
<description>to extract sample sheet metadata as a table</description>
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<edam_operations>
|
||||
<edam_operation>operation_3359</edam_operation>
|
||||
</edam_operations>
|
||||
@@ -45,13 +48,81 @@ cp '$out_config' '$output'
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Takes a sample sheet dataset collection and converts the sample sheet metadata into a tabular dataset.
|
||||
Exports the metadata from a sample sheet collection as a tab-separated table.
|
||||
|
||||
The output is a tab-separated file where each row corresponds to an element in the sample sheet collection.
|
||||
The first column contains the element identifier, followed by columns for each metadata field defined in the sample sheet.
|
||||
========================
|
||||
What is a sample sheet?
|
||||
========================
|
||||
|
||||
When "Include column headers" is enabled, the first row will contain the column names, with "element_identifier"
|
||||
as the first column followed by the names from the sample sheet column definitions.
|
||||
A sample sheet is a special type of Galaxy collection that pairs each dataset with structured metadata — such as replicate number, treatment condition, or tissue type. It works like a regular list collection but with an attached spreadsheet of per-sample information.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool reads the column definitions and row values from a sample sheet collection and writes them to a tabular dataset. The first column is always the element identifier (sample name). The remaining columns match the metadata fields defined in the sample sheet. The datasets in the collection are not affected — only the metadata is extracted.
|
||||
|
||||
When **Include column headers** is enabled, the first row will contain the column names, with ``element_identifier`` as the first column followed by the names from the sample sheet column definitions.
|
||||
|
||||
You can customize how special values are represented in the output using the replacement parameters for null values, empty strings, and boolean values.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Basic extraction (without headers)**
|
||||
|
||||
Given a sample sheet with three samples and two metadata columns (``replicate`` of type int, ``treatment`` of type string)::
|
||||
|
||||
Sample Sheet: "RNA-seq experiment"
|
||||
|
||||
sample1.fastq | replicate=1, treatment="control"
|
||||
sample2.fastq | replicate=2, treatment="treated"
|
||||
sample3.fastq | replicate=3, treatment="control"
|
||||
|
||||
The output tabular file contains::
|
||||
|
||||
sample1 1 control
|
||||
sample2 2 treated
|
||||
sample3 3 control
|
||||
|
||||
-------
|
||||
|
||||
**With headers enabled**
|
||||
|
||||
Enabling **Include column headers** adds a header row::
|
||||
|
||||
element_identifier replicate treatment
|
||||
sample1 1 control
|
||||
sample2 2 treated
|
||||
sample3 3 control
|
||||
|
||||
-------
|
||||
|
||||
**Replacement parameters**
|
||||
|
||||
If some metadata values are null or boolean, you can control their text representation:
|
||||
|
||||
- *Replace 'null' values with*: converts missing values (default: empty string, or use ``-`` or ``NA``)
|
||||
- *Replace boolean 'true'/'false' values with*: controls how booleans are written (default: ``TRUE`` / ``FALSE``)
|
||||
|
||||
For example, with null replacement set to ``NA``::
|
||||
|
||||
element_identifier replicate is_paired
|
||||
sample1 1 TRUE
|
||||
sample2 NA FALSE
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/sample_sheet_to_tabular.svg
|
||||
:alt: Sample sheet to tabular dataset
|
||||
:width: 500
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool creates a new tabular dataset (not a collection operation), so normal quota usage applies.
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Sort collection"
|
||||
version="1.0.0"
|
||||
tool_type="sort_collection">
|
||||
<description></description>
|
||||
<description>elements alphabetically, numerically, or by a custom order</description>
|
||||
<type class="SortTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -146,53 +149,59 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Sorts dataset collection alphabetically, numerically, or using predetermined order from a supplied file.
|
||||
Reorders elements of a collection alphabetically, numerically, or using a custom order from a file.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
**Numeric sort**
|
||||
This tool takes a collection and produces a new collection with the same elements in a different order. The datasets themselves are not modified — only the element ordering changes.
|
||||
|
||||
The tool sort in ascending order. When *numeric* sort is chosen, the tool ignores non-numeric characters. For example, if a collection contains the following elements::
|
||||
Three sort modes are available:
|
||||
|
||||
Collection: [Horse123]
|
||||
[Donkey543]
|
||||
[Mule176]
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
The tool will output::
|
||||
**Alphabetical sort**
|
||||
|
||||
Collection: [Horse123]
|
||||
[Mule176]
|
||||
[Donkey543]
|
||||
Elements are sorted by their identifiers in ascending alphabetical (lexicographic) order::
|
||||
|
||||
Input: sampleC, sampleA, sampleB
|
||||
Output: sampleA, sampleB, sampleC
|
||||
|
||||
-------
|
||||
|
||||
**Sorting from file**
|
||||
**Numeric sort**
|
||||
|
||||
Alternative, one can supply a single column text file containing elements identifiers in the desired sort order. For example, suppose there a collection::
|
||||
Non-numeric characters are stripped from each identifier, and elements are sorted by the resulting number in ascending order::
|
||||
|
||||
Collection: [Horse123]
|
||||
[Donkey543]
|
||||
[Mule176]
|
||||
Input: sample100, sample3, sample20
|
||||
Output: sample3, sample20, sample100
|
||||
|
||||
and a file specifying sort order::
|
||||
-------
|
||||
|
||||
Donkey543
|
||||
Horse123
|
||||
Mule176
|
||||
|
||||
the output will predictably look like this::
|
||||
**Sort from file**
|
||||
|
||||
Collection: [Donkey543]
|
||||
[Horse123]
|
||||
[Mule176]
|
||||
You supply a single-column text file listing identifiers in the desired order. The file must contain every element identifier exactly once::
|
||||
|
||||
Text file: Output:
|
||||
|
||||
sampleB sampleB
|
||||
sampleC sampleC
|
||||
sampleA sampleA
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/sort.svg
|
||||
:alt: Sort collection elements
|
||||
:width: 500
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Split Paired and Unpaired"
|
||||
version="1.0.0"
|
||||
tool_type="split_paired_and_unpaired">
|
||||
<description></description>
|
||||
<description>into separate paired and unpaired collections</description>
|
||||
<type class="SplitPairedAndUnpairedTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -118,15 +121,55 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Splits a collection into separate paired and unpaired output collections.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
This tool separates a collection that may contain a mix of paired-end and single-end datasets into two output collections:
|
||||
|
||||
- **Paired output** (``list:paired``) — elements that have both forward and reverse components.
|
||||
- **Unpaired output** (``list``) — single (unpaired) elements.
|
||||
|
||||
The tool accepts ``list``, ``list:paired``, or ``list:paired_or_unpaired`` input collections. If the input is a plain ``list`` (all unpaired), all elements go to the unpaired output and the paired output is empty. If the input is ``list:paired`` (all paired), all elements go to the paired output and the unpaired output is empty.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Split a mixed collection**
|
||||
|
||||
Given a ``list:paired_or_unpaired`` collection::
|
||||
|
||||
Input:
|
||||
|
||||
sample1 → forward + reverse (paired)
|
||||
sample2 → single dataset (unpaired)
|
||||
sample3 → single dataset (unpaired)
|
||||
|
||||
The tool produces::
|
||||
|
||||
Paired output (list:paired):
|
||||
|
||||
sample1 → forward + reverse
|
||||
|
||||
Unpaired output (list):
|
||||
|
||||
sample2 → Dataset 1
|
||||
sample3 → Dataset 2
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/split_paired_unpaired.svg
|
||||
:alt: Split paired and unpaired elements
|
||||
:width: 620
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets for your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,15 +2,18 @@
|
||||
name="Tag elements"
|
||||
version="1.0.0"
|
||||
tool_type="tag_from_file">
|
||||
<description></description>
|
||||
<description>from a tabular file of tags</description>
|
||||
<type class="TagFromFileTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
<edam_operation>operation_3096</edam_operation>
|
||||
</edam_operations>
|
||||
<inputs>
|
||||
<param type="data_collection" name="input" label="Input Collection" help="A tabular file indicating how to tag collection elements."/>
|
||||
<param type="data_collection" name="input" label="Input Collection" help="The collection whose elements will be tagged."/>
|
||||
<param type="data" name="tags" format="tabular" label="Tag collection elements according to this file"/>
|
||||
<param name="how" type="select" label="How should the tags be updated">
|
||||
<option value="add">New tags will be added, existing tags will be kept</option>
|
||||
@@ -84,27 +87,91 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Adds tags (including name: and group: tags) to collection elements.
|
||||
Assigns tags to collection elements based on a tabular mapping file.
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
The relationship between element names and tags is specified in a two column tab-delimited file. This file may contain less entries than elements in the collection. In that case only matching list identifiers will be tagged.
|
||||
This tool reads a two-column tab-delimited file and applies tags to the matching elements of a collection. The first column contains the element identifier, the second column contains one or more comma-separated tags.
|
||||
|
||||
To create name: or group: tags prepend them with ``#`` (you can also use ``name:``) or ``group:``, respectively.
|
||||
The file does not need to list every element — only elements with a matching identifier will be tagged. Elements not listed keep their existing tags unchanged.
|
||||
|
||||
===============
|
||||
More about tags
|
||||
===============
|
||||
Three tag update modes are available:
|
||||
|
||||
Galaxy allows tagging datasets to facilitate analyses. There are several types of tags including simple tags, name tags, and group tags. **Simple** tags allow you to attach an alternative label to a dataset, which will make it easier to find it later. **Name** tags allow you to track propagation of a dataset through the analyses: all datasets derived from the initial dataset labeled with a name tag will inherit it. Finally, **group** tags allow you to label group of datasets. This is useful. for example, for differential expression analysis where you can have two groups of datasets labeled as "treatment" and "control".
|
||||
- **Add** — new tags are added alongside any existing tags.
|
||||
- **Set** — existing tags are removed and replaced with the new tags.
|
||||
- **Remove** — the listed tags are removed from matching elements.
|
||||
|
||||
To learn mote about tags go to `our training site`_.
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
.. _our training site: https://training.galaxyproject.org/training-material/search?query=tags
|
||||
**Add group tags for differential expression**
|
||||
|
||||
Given a collection with three samples, and a tag file::
|
||||
|
||||
sample1 group:treatment
|
||||
sample2 group:control
|
||||
sample3 group:treatment
|
||||
|
||||
After running with mode **Add**, each element will carry the specified group tag while keeping any tags it already had.
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/tag_from_file.svg
|
||||
:alt: Tag collection elements from a tabular file
|
||||
:width: 500
|
||||
|
||||
=========
|
||||
Tag types
|
||||
=========
|
||||
|
||||
Galaxy supports three types of tags:
|
||||
|
||||
**Simple tags**
|
||||
|
||||
A plain keyword such as ``mytag`` or ``important``. Simple tags act as labels that help you find and organize datasets in your history. They do not have any special behavior — they are just searchable labels. In the tag file, write the tag name directly::
|
||||
|
||||
sample1 important
|
||||
sample2 batch2,rerun
|
||||
|
||||
-------
|
||||
|
||||
**Name tags**
|
||||
|
||||
A tag prefixed with ``#`` or ``name:`` (e.g. ``#patient42`` or ``name:patient42``). Name tags are *hereditary* — when a dataset with a name tag is used as input to a tool, the output dataset automatically inherits the same name tag. This lets you trace the origin of a dataset through a long analysis. In the tag file::
|
||||
|
||||
sample1 #patient42
|
||||
sample2 name:patient99
|
||||
|
||||
-------
|
||||
|
||||
**Group tags**
|
||||
|
||||
A tag prefixed with ``group:`` (e.g. ``group:treatment`` or ``group:control``). Group tags are used by tools that compare conditions — for example, **DESeq2** reads group tags to determine which samples belong to which experimental condition. In the tag file::
|
||||
|
||||
sample1 group:treatment
|
||||
sample2 group:control
|
||||
sample3 group:treatment
|
||||
|
||||
-------
|
||||
|
||||
You can combine multiple tags of any type by separating them with commas::
|
||||
|
||||
sample1 #patient42,group:treatment,batch1
|
||||
|
||||
-------
|
||||
|
||||
To learn more about tags, visit `the Galaxy Training Network`_.
|
||||
|
||||
.. _the Galaxy Training Network: https://training.galaxyproject.org/training-material/search?query=tags
|
||||
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Unzip collection"
|
||||
version="1.0.0"
|
||||
tool_type="unzip_collection">
|
||||
<description></description>
|
||||
<description>into forward and reverse datasets</description>
|
||||
<type class="UnzipCollectionTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -18,28 +21,49 @@
|
||||
</outputs>
|
||||
<help><![CDATA[
|
||||
|
||||
|
||||
========
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Takes a paired collection and "unzips" it into two simple dataset collections (lists of datasets).
|
||||
Splits a paired dataset into two individual datasets (forward and reverse).
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
Given a paired collection of forward and reverse reads this tool will "unzip" it into two collections containing forward and reverse reads, respectively:
|
||||
This tool takes a single ``paired`` collection and extracts its two components — the **forward** and the **reverse** dataset — as separate output datasets.
|
||||
|
||||
This is the inverse of **Zip collections**, which combines two datasets into a pair.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Unzip a paired collection**
|
||||
|
||||
Input ``paired`` collection::
|
||||
|
||||
Paired: "Sample 1"
|
||||
|
||||
forward → reads_R1.fastq
|
||||
reverse → reads_R2.fastq
|
||||
|
||||
Outputs::
|
||||
|
||||
Forward dataset: reads_R1.fastq
|
||||
Reverse dataset: reads_R2.fastq
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/unzip.svg
|
||||
:alt: Unzip a paired collection into forward and reverse datasets
|
||||
:width: 500
|
||||
:alt: Unzipping operation
|
||||
|
||||
-----
|
||||
-------
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets from your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
name="Zip collections"
|
||||
version="1.0.0"
|
||||
tool_type="zip_collection">
|
||||
<description></description>
|
||||
<description>into a paired collection</description>
|
||||
<type class="ZipCollectionTool" module="galaxy.tools" />
|
||||
<macros>
|
||||
<import>model_operation_macros.xml</import>
|
||||
</macros>
|
||||
<action module="galaxy.tools.actions.model_operations"
|
||||
class="ModelOperationToolAction"/>
|
||||
<edam_operations>
|
||||
@@ -25,24 +28,45 @@
|
||||
Synopsis
|
||||
========
|
||||
|
||||
Takes two collections and creates a paired collection from them.
|
||||
Combines two datasets into a single paired collection (forward + reverse).
|
||||
|
||||
===========
|
||||
Description
|
||||
===========
|
||||
|
||||
If you have one collection containing only forward reads and one containing only reverse, this tools will "zip" them together into a simple paired collection. For example, given two collections with `forward` and `reverse` reads they can be "zipped" into a single paired collection:
|
||||
This tool takes two individual datasets and packages them into a ``paired`` collection, labeling the first as **forward** and the second as **reverse**.
|
||||
|
||||
This is the inverse of **Unzip collection**, which splits a pair back into two separate datasets.
|
||||
|
||||
========
|
||||
Examples
|
||||
========
|
||||
|
||||
**Zip two datasets into a pair**
|
||||
|
||||
Inputs::
|
||||
|
||||
Input 1 (forward): reads_R1.fastq
|
||||
Input 2 (reverse): reads_R2.fastq
|
||||
|
||||
Output ``paired`` collection::
|
||||
|
||||
Paired: "reads (zipped)"
|
||||
|
||||
forward → reads_R1.fastq
|
||||
reverse → reads_R2.fastq
|
||||
|
||||
-------
|
||||
|
||||
.. image:: ${static_path}/images/tools/collection_ops/zip.svg
|
||||
:alt: Zip two datasets into a paired collection
|
||||
:width: 500
|
||||
:alt: Zipping operation
|
||||
|
||||
-------
|
||||
|
||||
-----
|
||||
|
||||
.. class:: infomark
|
||||
|
||||
This tool will create new history datasets for your collection but your quota usage will not increase.
|
||||
@QUOTA_USAGE_NOTE@
|
||||
|
||||
]]></help>
|
||||
</tool>
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 200" width="620" height="200">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: input collection -->
|
||||
<rect x="10" y="10" width="170" height="130" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="95" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="22" y="38" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="56" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">patientA_treat_r1</text>
|
||||
|
||||
<rect x="22" y="70" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="88" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">patientA_ctrl_r1</text>
|
||||
|
||||
<rect x="22" y="102" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">patientB_treat_r1</text>
|
||||
|
||||
<!-- Rules box -->
|
||||
<rect x="40" y="153" width="110" height="35" rx="6" ry="6" fill="#e8d5f5" stroke="#7b4fa0" stroke-width="1"/>
|
||||
<text x="95" y="175" text-anchor="middle" font-family="sans-serif" font-size="10" font-weight="bold" fill="#7b4fa0">Rule Builder</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="195" y1="80" x2="355" y2="80" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="275" y="70" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Apply rules</text>
|
||||
<text x="275" y="98" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">split, nest, tag</text>
|
||||
|
||||
<!-- Right: reorganized nested collection -->
|
||||
<rect x="370" y="10" width="240" height="180" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="490" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Nested list (re-organized)</text>
|
||||
|
||||
<!-- Inner: patientA -->
|
||||
<rect x="382" y="38" width="216" height="62" rx="6" ry="6" fill="#e8f0e3" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="410" y="53" font-family="sans-serif" font-size="10" font-weight="bold" fill="#555">patientA</text>
|
||||
|
||||
<rect x="394" y="58" width="192" height="16" rx="3" ry="3" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="490" y="70" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">treat_r1</text>
|
||||
|
||||
<rect x="394" y="78" width="192" height="16" rx="3" ry="3" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="490" y="90" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">ctrl_r1</text>
|
||||
|
||||
<!-- Inner: patientB -->
|
||||
<rect x="382" y="108" width="216" height="50" rx="6" ry="6" fill="#e8f0e3" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="410" y="123" font-family="sans-serif" font-size="10" font-weight="bold" fill="#555">patientB</text>
|
||||
|
||||
<rect x="394" y="128" width="192" height="16" rx="3" ry="3" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="490" y="140" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">treat_r1</text>
|
||||
|
||||
<text x="490" y="178" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">split on "_", nest by patient</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 10 KiB |
@@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 220" width="620" height="220">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: Sample Sheet container -->
|
||||
<rect x="10" y="10" width="240" height="195" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="130" y="32" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">Sample Sheet: "RNA-seq"</text>
|
||||
|
||||
<!-- Metadata table -->
|
||||
<!-- Header row -->
|
||||
<rect x="22" y="44" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="44" width="36" height="22" fill="#fce5cd" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="44" width="100" height="22" fill="#fce5cd" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="59" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#333">Name</text>
|
||||
<text x="120" y="59" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#b45309">rep</text>
|
||||
<text x="188" y="59" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#b45309">treatment</text>
|
||||
|
||||
<!-- Row 1 -->
|
||||
<rect x="22" y="66" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="66" width="36" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="66" width="100" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="81" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample1</text>
|
||||
<text x="120" y="81" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">1</text>
|
||||
<text x="188" y="81" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">control</text>
|
||||
|
||||
<!-- Row 2 -->
|
||||
<rect x="22" y="88" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="88" width="36" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="88" width="100" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="103" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample2</text>
|
||||
<text x="120" y="103" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">2</text>
|
||||
<text x="188" y="103" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">treated</text>
|
||||
|
||||
<!-- Row 3 -->
|
||||
<rect x="22" y="110" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="110" width="36" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="110" width="100" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="125" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample3</text>
|
||||
<text x="120" y="125" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">3</text>
|
||||
<text x="188" y="125" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">control</text>
|
||||
|
||||
<!-- Metadata label -->
|
||||
<text x="155" y="155" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#b45309">metadata columns</text>
|
||||
<line x1="110" y1="140" x2="110" y2="148" stroke="#b45309" stroke-width="0.8" stroke-dasharray="2,2"/>
|
||||
<line x1="110" y1="148" x2="200" y2="148" stroke="#b45309" stroke-width="0.8" stroke-dasharray="2,2"/>
|
||||
<line x1="200" y1="140" x2="200" y2="148" stroke="#b45309" stroke-width="0.8" stroke-dasharray="2,2"/>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="270" y1="107" x2="360" y2="107" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="315" y="98" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Convert</text>
|
||||
|
||||
<!-- Right: List collection container -->
|
||||
<rect x="380" y="10" width="220" height="195" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="490" y="32" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List: "RNA-seq"</text>
|
||||
|
||||
<!-- Dataset items -->
|
||||
<rect x="400" y="50" width="180" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="490" y="69" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample1.fastq</text>
|
||||
|
||||
<rect x="400" y="86" width="180" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="490" y="105" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample2.fastq</text>
|
||||
|
||||
<rect x="400" y="122" width="180" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="490" y="141" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample3.fastq</text>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="490" y="172" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">same datasets, no metadata</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 310" width="680" height="310">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Input A -->
|
||||
<rect x="10" y="10" width="150" height="90" rx="8" ry="8" fill="#fef3e2" stroke="#d4760a" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="85" y="28" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#d4760a">Input A</text>
|
||||
|
||||
<rect x="22" y="36" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="85" y="51" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#d4760a">a1</text>
|
||||
|
||||
<rect x="22" y="64" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="85" y="79" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#d4760a">a2</text>
|
||||
|
||||
<!-- Input B -->
|
||||
<rect x="10" y="120" width="150" height="90" rx="8" ry="8" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="85" y="138" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#7b4fa0">Input B</text>
|
||||
|
||||
<rect x="22" y="146" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="85" y="161" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#7b4fa0">b1</text>
|
||||
|
||||
<rect x="22" y="174" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="85" y="189" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#7b4fa0">b2</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="175" y1="130" x2="310" y2="130" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="243" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#555">Cross</text>
|
||||
<text x="243" y="148" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#888">product</text>
|
||||
|
||||
<!-- Output A (flat) -->
|
||||
<rect x="325" y="10" width="170" height="140" rx="8" ry="8" fill="#fef3e2" stroke="#d4760a" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="410" y="28" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#d4760a">Output A</text>
|
||||
|
||||
<rect x="337" y="36" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="410" y="50" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a1_b1 → a1</text>
|
||||
|
||||
<rect x="337" y="62" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="410" y="76" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a1_b2 → a1</text>
|
||||
|
||||
<rect x="337" y="88" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="410" y="102" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a2_b1 → a2</text>
|
||||
|
||||
<rect x="337" y="114" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="410" y="128" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a2_b2 → a2</text>
|
||||
|
||||
<!-- Output B (flat) -->
|
||||
<rect x="325" y="165" width="170" height="140" rx="8" ry="8" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="410" y="183" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#7b4fa0">Output B</text>
|
||||
|
||||
<rect x="337" y="191" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="410" y="205" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a1_b1 → b1</text>
|
||||
|
||||
<rect x="337" y="217" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="410" y="231" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a1_b2 → b2</text>
|
||||
|
||||
<rect x="337" y="243" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="410" y="257" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a2_b1 → b1</text>
|
||||
|
||||
<rect x="337" y="269" width="146" height="20" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="410" y="283" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#333">a2_b2 → b2</text>
|
||||
|
||||
<!-- Annotation -->
|
||||
<text x="580" y="80" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">Match element-wise</text>
|
||||
<text x="580" y="95" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">to get all-vs-all</text>
|
||||
|
||||
<!-- Brace-like connector -->
|
||||
<line x1="500" y1="75" x2="530" y2="75" stroke="#aaa" stroke-width="1"/>
|
||||
<line x1="500" y1="230" x2="530" y2="230" stroke="#aaa" stroke-width="1"/>
|
||||
<line x1="530" y1="75" x2="530" y2="230" stroke="#aaa" stroke-width="1"/>
|
||||
<line x1="530" y1="152" x2="545" y2="152" stroke="#aaa" stroke-width="1"/>
|
||||
|
||||
<text x="580" y="140" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a1_b1: compare(a1,b1)</text>
|
||||
<text x="580" y="153" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a1_b2: compare(a1,b2)</text>
|
||||
<text x="580" y="166" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a2_b1: compare(a2,b1)</text>
|
||||
<text x="580" y="179" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a2_b2: compare(a2,b2)</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.9 KiB |
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 320" width="680" height="320">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Input A -->
|
||||
<rect x="10" y="10" width="150" height="90" rx="8" ry="8" fill="#fef3e2" stroke="#d4760a" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="85" y="28" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#d4760a">Input A</text>
|
||||
|
||||
<rect x="22" y="36" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="85" y="51" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#d4760a">a1</text>
|
||||
|
||||
<rect x="22" y="64" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="85" y="79" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#d4760a">a2</text>
|
||||
|
||||
<!-- Input B -->
|
||||
<rect x="10" y="120" width="150" height="90" rx="8" ry="8" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="85" y="138" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#7b4fa0">Input B</text>
|
||||
|
||||
<rect x="22" y="146" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="85" y="161" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#7b4fa0">b1</text>
|
||||
|
||||
<rect x="22" y="174" width="126" height="22" rx="4" ry="4" fill="#fff" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="85" y="189" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#7b4fa0">b2</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="175" y1="130" x2="310" y2="130" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="243" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#555">Cross</text>
|
||||
<text x="243" y="148" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#888">product</text>
|
||||
|
||||
<!-- Output A (nested list:list) -->
|
||||
<rect x="325" y="10" width="170" height="140" rx="8" ry="8" fill="#fef3e2" stroke="#d4760a" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="410" y="28" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#d4760a">Output A (list:list)</text>
|
||||
|
||||
<!-- Inner: a1 -->
|
||||
<rect x="337" y="36" width="146" height="44" rx="5" ry="5" fill="#fff6e8" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="352" y="49" font-family="sans-serif" font-size="9" font-weight="bold" fill="#d4760a">a1</text>
|
||||
|
||||
<rect x="349" y="53" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#d4760a" stroke-width="0.4"/>
|
||||
<text x="410" y="63" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b1 → a1</text>
|
||||
|
||||
<rect x="349" y="69" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#d4760a" stroke-width="0.4"/>
|
||||
<text x="410" y="79" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b2 → a1</text>
|
||||
|
||||
<!-- Inner: a2 -->
|
||||
<rect x="337" y="86" width="146" height="44" rx="5" ry="5" fill="#fff6e8" stroke="#d4760a" stroke-width="0.5"/>
|
||||
<text x="352" y="99" font-family="sans-serif" font-size="9" font-weight="bold" fill="#d4760a">a2</text>
|
||||
|
||||
<rect x="349" y="103" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#d4760a" stroke-width="0.4"/>
|
||||
<text x="410" y="113" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b1 → a2</text>
|
||||
|
||||
<rect x="349" y="119" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#d4760a" stroke-width="0.4"/>
|
||||
<text x="410" y="129" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b2 → a2</text>
|
||||
|
||||
<!-- Output B (nested list:list) -->
|
||||
<rect x="325" y="165" width="170" height="140" rx="8" ry="8" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="410" y="183" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#7b4fa0">Output B (list:list)</text>
|
||||
|
||||
<!-- Inner: a1 -->
|
||||
<rect x="337" y="191" width="146" height="44" rx="5" ry="5" fill="#f5eefa" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="352" y="204" font-family="sans-serif" font-size="9" font-weight="bold" fill="#7b4fa0">a1</text>
|
||||
|
||||
<rect x="349" y="208" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#7b4fa0" stroke-width="0.4"/>
|
||||
<text x="410" y="218" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b1 → b1</text>
|
||||
|
||||
<rect x="349" y="224" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#7b4fa0" stroke-width="0.4"/>
|
||||
<text x="410" y="234" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b2 → b2</text>
|
||||
|
||||
<!-- Inner: a2 -->
|
||||
<rect x="337" y="241" width="146" height="44" rx="5" ry="5" fill="#f5eefa" stroke="#7b4fa0" stroke-width="0.5"/>
|
||||
<text x="352" y="254" font-family="sans-serif" font-size="9" font-weight="bold" fill="#7b4fa0">a2</text>
|
||||
|
||||
<rect x="349" y="258" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#7b4fa0" stroke-width="0.4"/>
|
||||
<text x="410" y="268" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b1 → b1</text>
|
||||
|
||||
<rect x="349" y="274" width="122" height="14" rx="3" ry="3" fill="#fff" stroke="#7b4fa0" stroke-width="0.4"/>
|
||||
<text x="410" y="284" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#333">b2 → b2</text>
|
||||
|
||||
<!-- Annotation -->
|
||||
<text x="580" y="75" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">Results grouped</text>
|
||||
<text x="580" y="90" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">by Input A element</text>
|
||||
|
||||
<!-- Result annotation -->
|
||||
<text x="580" y="150" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a1/b1: compare(a1,b1)</text>
|
||||
<text x="580" y="163" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a1/b2: compare(a1,b2)</text>
|
||||
<text x="580" y="176" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a2/b1: compare(a2,b1)</text>
|
||||
<text x="580" y="189" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#888">a2/b2: compare(a2,b2)</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.6 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 210" width="620" height="210">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: single input dataset -->
|
||||
<rect x="30" y="70" width="180" height="36" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7" filter="url(#shadow)"/>
|
||||
<text x="120" y="93" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#333">reference.fa</text>
|
||||
|
||||
<!-- Settings label -->
|
||||
<text x="120" y="130" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#666">N = 3, identifier = "ref"</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="230" y1="88" x2="340" y2="88" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="285" y="78" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Duplicate</text>
|
||||
|
||||
<!-- Right: List collection -->
|
||||
<rect x="360" y="10" width="240" height="185" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="480" y="30" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<!-- Dataset copies -->
|
||||
<rect x="375" y="42" width="210" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="480" y="61" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">ref 1</text>
|
||||
|
||||
<rect x="375" y="78" width="210" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="480" y="97" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">ref 2</text>
|
||||
|
||||
<rect x="375" y="114" width="210" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="480" y="133" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">ref 3</text>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="480" y="166" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">all copies are identical</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 475" width="800" height="475">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- ==================== CASE A ==================== -->
|
||||
<!-- Flat list → single dataset -->
|
||||
|
||||
<!-- Case label -->
|
||||
<circle cx="22" cy="90" r="14" fill="#555"/>
|
||||
<text x="22" y="95" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#fff">A</text>
|
||||
|
||||
<!-- Left: List collection -->
|
||||
<rect x="50" y="10" width="220" height="170" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="160" y="30" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="65" y="42" width="190" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="75" y="60" font-family="sans-serif" font-size="10" fill="#999">0</text>
|
||||
<text x="160" y="60" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">control</text>
|
||||
|
||||
<!-- Highlighted element -->
|
||||
<rect x="65" y="74" width="190" height="26" rx="4" ry="4" fill="#fff3cd" stroke="#e6a817" stroke-width="1.2"/>
|
||||
<text x="75" y="92" font-family="sans-serif" font-size="10" fill="#999">1</text>
|
||||
<text x="160" y="92" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#333">treated</text>
|
||||
|
||||
<rect x="65" y="106" width="190" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="75" y="124" font-family="sans-serif" font-size="10" fill="#999">2</text>
|
||||
<text x="160" y="124" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">reference</text>
|
||||
|
||||
<text x="160" y="158" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#b45309">identifier = "treated"</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="290" y1="88" x2="400" y2="88" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="345" y="78" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Extract</text>
|
||||
|
||||
<!-- Right: single dataset -->
|
||||
<rect x="420" y="70" width="200" height="36" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7" filter="url(#shadow)"/>
|
||||
<text x="520" y="93" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#333">treated</text>
|
||||
|
||||
<text x="520" y="128" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">standalone dataset in history</text>
|
||||
|
||||
<!-- ==================== SEPARATOR ==================== -->
|
||||
<line x1="10" y1="195" x2="790" y2="195" stroke="#ccc" stroke-width="1" stroke-dasharray="6,4"/>
|
||||
|
||||
<!-- ==================== CASE B ==================== -->
|
||||
<!-- Nested list:list → flat list (maps over outer, extracts from each inner) -->
|
||||
|
||||
<!-- Case label -->
|
||||
<circle cx="22" cy="340" r="14" fill="#555"/>
|
||||
<text x="22" y="345" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#fff">B</text>
|
||||
|
||||
<!-- Left: Nested list collection -->
|
||||
<rect x="50" y="210" width="245" height="248" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="172" y="230" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">Nested list</text>
|
||||
|
||||
<!-- Inner collection 1: sampleA -->
|
||||
<rect x="65" y="240" width="215" height="90" rx="6" ry="6" fill="#e8f0e3" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="75" y="255" font-family="sans-serif" font-size="10" font-weight="bold" fill="#555">sampleA</text>
|
||||
|
||||
<rect x="75" y="260" width="195" height="18" rx="3" ry="3" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<text x="83" y="273" font-family="sans-serif" font-size="9" fill="#999">0</text>
|
||||
<text x="172" y="273" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#333">Dataset 1</text>
|
||||
|
||||
<!-- Highlighted in inner 1 -->
|
||||
<rect x="75" y="284" width="195" height="18" rx="3" ry="3" fill="#fff3cd" stroke="#e6a817" stroke-width="1"/>
|
||||
<text x="83" y="297" font-family="sans-serif" font-size="9" fill="#999">1</text>
|
||||
<text x="172" y="297" text-anchor="middle" font-family="sans-serif" font-size="10" font-weight="bold" fill="#333">Dataset 2</text>
|
||||
|
||||
<rect x="75" y="308" width="195" height="18" rx="3" ry="3" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<text x="83" y="321" font-family="sans-serif" font-size="9" fill="#999">2</text>
|
||||
<text x="172" y="321" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#333">Dataset 3</text>
|
||||
|
||||
<!-- Inner collection 2: sampleB -->
|
||||
<rect x="65" y="340" width="215" height="90" rx="6" ry="6" fill="#e8f0e3" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="75" y="355" font-family="sans-serif" font-size="10" font-weight="bold" fill="#555">sampleB</text>
|
||||
|
||||
<rect x="75" y="360" width="195" height="18" rx="3" ry="3" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<text x="83" y="373" font-family="sans-serif" font-size="9" fill="#999">0</text>
|
||||
<text x="172" y="373" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#333">Dataset A</text>
|
||||
|
||||
<!-- Highlighted in inner 2 -->
|
||||
<rect x="75" y="384" width="195" height="18" rx="3" ry="3" fill="#fff3cd" stroke="#e6a817" stroke-width="1"/>
|
||||
<text x="83" y="397" font-family="sans-serif" font-size="9" fill="#999">1</text>
|
||||
<text x="172" y="397" text-anchor="middle" font-family="sans-serif" font-size="10" font-weight="bold" fill="#333">Dataset B</text>
|
||||
|
||||
<rect x="75" y="408" width="195" height="18" rx="3" ry="3" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<text x="83" y="421" font-family="sans-serif" font-size="9" fill="#999">2</text>
|
||||
<text x="172" y="421" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#333">Dataset C</text>
|
||||
|
||||
<!-- Selection label -->
|
||||
<text x="172" y="450" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#b45309">index = 1</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="315" y1="340" x2="415" y2="340" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="365" y="330" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Extract</text>
|
||||
|
||||
<!-- Right: flat list (one level removed) -->
|
||||
<rect x="435" y="290" width="230" height="105" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="550" y="310" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="450" y="320" width="200" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="550" y="338" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset 2</text>
|
||||
<text x="460" y="338" font-family="sans-serif" font-size="10" font-weight="bold" fill="#555">sampleA</text>
|
||||
|
||||
<rect x="450" y="354" width="200" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="550" y="372" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset B</text>
|
||||
<text x="460" y="372" font-family="sans-serif" font-size="10" font-weight="bold" fill="#555">sampleB</text>
|
||||
|
||||
<text x="550" y="412" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">one nesting level removed</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,130 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 530" width="800" height="530">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- ==================== CASE A ==================== -->
|
||||
<!-- Remove if ABSENT from file (keep listed) -->
|
||||
|
||||
<!-- Case label -->
|
||||
<circle cx="22" cy="100" r="14" fill="#555"/>
|
||||
<text x="22" y="105" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#fff">A</text>
|
||||
|
||||
<!-- Left: input collection -->
|
||||
<rect x="50" y="10" width="170" height="130" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="135" y="30" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="62" y="40" width="146" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="135" y="57" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset A</text>
|
||||
|
||||
<rect x="62" y="70" width="146" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="135" y="87" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset B</text>
|
||||
|
||||
<rect x="62" y="100" width="146" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="135" y="117" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset X</text>
|
||||
|
||||
<!-- Left: text file -->
|
||||
<rect x="50" y="155" width="170" height="72" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7" filter="url(#shadow)"/>
|
||||
<text x="135" y="172" text-anchor="middle" font-family="sans-serif" font-size="10" font-weight="bold" fill="#666">identifiers.txt</text>
|
||||
<text x="100" y="190" font-family="monospace" font-size="10" fill="#333">A</text>
|
||||
<text x="100" y="202" font-family="monospace" font-size="10" fill="#333">B</text>
|
||||
<text x="100" y="214" font-family="monospace" font-size="10" fill="#333">Z</text>
|
||||
|
||||
<!-- Mode label -->
|
||||
<text x="135" y="245" text-anchor="middle" font-family="sans-serif" font-size="9" font-style="italic" fill="#b45309">remove if ABSENT</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="240" y1="100" x2="340" y2="100" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="290" y="90" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Filter</text>
|
||||
|
||||
<!-- Right: filtered output -->
|
||||
<rect x="360" y="10" width="195" height="98" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="457" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#2e7d32">(filtered)</text>
|
||||
|
||||
<rect x="375" y="40" width="165" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="457" y="57" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset A</text>
|
||||
|
||||
<rect x="375" y="70" width="165" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="457" y="87" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset B</text>
|
||||
|
||||
<!-- Right: discarded output -->
|
||||
<rect x="580" y="10" width="195" height="68" rx="8" ry="8" fill="#fce8e6" stroke="#c0392b" stroke-width="0.8" filter="url(#shadow)"/>
|
||||
<text x="677" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#c0392b">(discarded)</text>
|
||||
|
||||
<rect x="595" y="40" width="165" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="677" y="57" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset X</text>
|
||||
|
||||
<!-- Note about Z -->
|
||||
<text x="677" y="98" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#999">Z has no match — ignored</text>
|
||||
|
||||
<!-- ==================== SEPARATOR ==================== -->
|
||||
<line x1="10" y1="258" x2="790" y2="258" stroke="#ccc" stroke-width="1" stroke-dasharray="6,4"/>
|
||||
|
||||
<!-- ==================== CASE B ==================== -->
|
||||
<!-- Remove if PRESENT in file (remove listed) -->
|
||||
|
||||
<!-- Case label -->
|
||||
<circle cx="22" cy="373" r="14" fill="#555"/>
|
||||
<text x="22" y="378" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#fff">B</text>
|
||||
|
||||
<!-- Left: input collection -->
|
||||
<rect x="50" y="281" width="170" height="130" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="135" y="301" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="62" y="311" width="146" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="135" y="328" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset A</text>
|
||||
|
||||
<rect x="62" y="341" width="146" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="135" y="358" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset B</text>
|
||||
|
||||
<rect x="62" y="371" width="146" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="135" y="388" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset X</text>
|
||||
|
||||
<!-- Left: text file -->
|
||||
<rect x="50" y="426" width="170" height="72" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7" filter="url(#shadow)"/>
|
||||
<text x="135" y="443" text-anchor="middle" font-family="sans-serif" font-size="10" font-weight="bold" fill="#666">identifiers.txt</text>
|
||||
<text x="100" y="461" font-family="monospace" font-size="10" fill="#333">A</text>
|
||||
<text x="100" y="473" font-family="monospace" font-size="10" fill="#333">B</text>
|
||||
<text x="100" y="485" font-family="monospace" font-size="10" fill="#333">Z</text>
|
||||
|
||||
<!-- Mode label -->
|
||||
<text x="135" y="516" text-anchor="middle" font-family="sans-serif" font-size="9" font-style="italic" fill="#b45309">remove if PRESENT</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="240" y1="373" x2="340" y2="373" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="290" y="363" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Filter</text>
|
||||
|
||||
<!-- Right: filtered output -->
|
||||
<rect x="360" y="281" width="195" height="68" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="457" y="301" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#2e7d32">(filtered)</text>
|
||||
|
||||
<rect x="375" y="311" width="165" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="457" y="328" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset X</text>
|
||||
|
||||
<!-- Right: discarded output -->
|
||||
<rect x="580" y="281" width="195" height="98" rx="8" ry="8" fill="#fce8e6" stroke="#c0392b" stroke-width="0.8" filter="url(#shadow)"/>
|
||||
<text x="677" y="301" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#c0392b">(discarded)</text>
|
||||
|
||||
<rect x="595" y="311" width="165" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="677" y="328" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset A</text>
|
||||
|
||||
<rect x="595" y="341" width="165" height="24" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="677" y="358" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Dataset B</text>
|
||||
|
||||
<!-- Note about Z -->
|
||||
<text x="677" y="398" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#999">Z has no match — ignored</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.0 KiB |
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 210" width="620" height="210">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: input collection -->
|
||||
<rect x="10" y="10" width="210" height="185" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="115" y="30" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="25" y="42" width="180" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="115" y="61" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample1</text>
|
||||
<text x="195" y="61" text-anchor="end" font-family="sans-serif" font-size="9" fill="#2e7d32">ok</text>
|
||||
|
||||
<!-- Null element (highlighted gray/dashed) -->
|
||||
<rect x="25" y="78" width="180" height="28" rx="4" ry="4" fill="#f0f0f0" stroke="#999" stroke-width="1.2" stroke-dasharray="4,2"/>
|
||||
<text x="115" y="97" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#999">sample2</text>
|
||||
<text x="195" y="97" text-anchor="end" font-family="sans-serif" font-size="9" fill="#999">null</text>
|
||||
|
||||
<rect x="25" y="114" width="180" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="115" y="133" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample3</text>
|
||||
<text x="195" y="133" text-anchor="end" font-family="sans-serif" font-size="9" fill="#2e7d32">ok</text>
|
||||
|
||||
<text x="115" y="166" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#999">sample2 is null</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="240" y1="92" x2="360" y2="92" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="300" y="82" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Filter</text>
|
||||
|
||||
<!-- Right: filtered collection -->
|
||||
<rect x="380" y="10" width="220" height="155" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="490" y="30" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List (filtered)</text>
|
||||
|
||||
<rect x="395" y="42" width="190" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="490" y="61" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample1</text>
|
||||
|
||||
<rect x="395" y="78" width="190" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="490" y="97" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample3</text>
|
||||
|
||||
<text x="490" y="140" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">null element removed</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 4.1 KiB |
@@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 310" width="680" height="310">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: Input Collection 1 (reference order) -->
|
||||
<rect x="10" y="10" width="200" height="135" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="110" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Collection 1</text>
|
||||
|
||||
<rect x="22" y="36" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="110" y="54" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleA</text>
|
||||
|
||||
<rect x="22" y="68" width="176" height="26" rx="4" ry="4" fill="#f0f0f0" stroke="#999" stroke-width="1" stroke-dasharray="4,2"/>
|
||||
<text x="110" y="86" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#999">sampleB</text>
|
||||
<text x="192" y="86" text-anchor="end" font-family="sans-serif" font-size="8" fill="#999">only here</text>
|
||||
|
||||
<rect x="22" y="100" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="110" y="118" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleC</text>
|
||||
|
||||
<!-- Left: Input Collection 2 (different order) -->
|
||||
<rect x="10" y="165" width="200" height="135" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="110" y="183" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Collection 2</text>
|
||||
|
||||
<rect x="22" y="191" width="176" height="26" rx="4" ry="4" fill="#f0f0f0" stroke="#999" stroke-width="1" stroke-dasharray="4,2"/>
|
||||
<text x="110" y="209" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#999">sampleD</text>
|
||||
<text x="192" y="209" text-anchor="end" font-family="sans-serif" font-size="8" fill="#999">only here</text>
|
||||
|
||||
<rect x="22" y="223" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="110" y="241" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleC</text>
|
||||
|
||||
<rect x="22" y="255" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="110" y="273" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleA</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="225" y1="155" x2="440" y2="155" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="333" y="145" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Harmonize</text>
|
||||
<text x="333" y="173" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#888">keep shared, match order</text>
|
||||
|
||||
<!-- Right: Output Collection 1 -->
|
||||
<rect x="460" y="10" width="200" height="105" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="560" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Output 1</text>
|
||||
|
||||
<rect x="472" y="36" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="560" y="54" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleA</text>
|
||||
|
||||
<rect x="472" y="68" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="560" y="86" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleC</text>
|
||||
|
||||
<!-- Right: Output Collection 2 -->
|
||||
<rect x="460" y="165" width="200" height="105" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="560" y="183" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Output 2</text>
|
||||
|
||||
<rect x="472" y="191" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="560" y="209" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleA</text>
|
||||
|
||||
<rect x="472" y="223" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="560" y="241" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleC</text>
|
||||
|
||||
<!-- Annotations -->
|
||||
<text x="560" y="290" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">same identifiers, same order</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.9 KiB |
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 240" width="620" height="240">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: input collection -->
|
||||
<rect x="10" y="10" width="210" height="220" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="115" y="30" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="25" y="42" width="180" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="115" y="61" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample1</text>
|
||||
<text x="195" y="61" text-anchor="end" font-family="sans-serif" font-size="9" fill="#2e7d32">ok</text>
|
||||
|
||||
<!-- Failed element (red) -->
|
||||
<rect x="25" y="78" width="180" height="28" rx="4" ry="4" fill="#fce8e6" stroke="#c0392b" stroke-width="1.2"/>
|
||||
<text x="115" y="97" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#c0392b">sample2</text>
|
||||
<text x="195" y="97" text-anchor="end" font-family="sans-serif" font-size="9" fill="#c0392b">error</text>
|
||||
|
||||
<rect x="25" y="114" width="180" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="115" y="133" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample3</text>
|
||||
<text x="195" y="133" text-anchor="end" font-family="sans-serif" font-size="9" fill="#2e7d32">ok</text>
|
||||
|
||||
<!-- Paused element (gray) -->
|
||||
<rect x="25" y="150" width="180" height="28" rx="4" ry="4" fill="#f0f0f0" stroke="#999" stroke-width="1.2"/>
|
||||
<text x="115" y="169" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#888">sample4</text>
|
||||
<text x="195" y="169" text-anchor="end" font-family="sans-serif" font-size="9" fill="#888">paused</text>
|
||||
|
||||
<text x="115" y="202" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#999">only ok elements kept</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="240" y1="110" x2="360" y2="110" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="300" y="100" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Keep</text>
|
||||
<text x="300" y="128" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#888">success only</text>
|
||||
|
||||
<!-- Right: filtered collection -->
|
||||
<rect x="380" y="10" width="220" height="155" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="490" y="30" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">List (success only)</text>
|
||||
|
||||
<rect x="395" y="42" width="190" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="490" y="61" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample1</text>
|
||||
|
||||
<rect x="395" y="78" width="190" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="490" y="97" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#333">sample3</text>
|
||||
|
||||
<text x="490" y="140" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">failed and paused removed</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 260" width="680" height="260">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Input Collection 1 -->
|
||||
<rect x="10" y="10" width="190" height="105" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="105" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Collection 1</text>
|
||||
|
||||
<rect x="22" y="36" width="166" height="26" rx="4" ry="4" fill="#fef3e2" stroke="#d4760a" stroke-width="0.7"/>
|
||||
<text x="105" y="54" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#d4760a">sampleA</text>
|
||||
|
||||
<rect x="22" y="68" width="166" height="26" rx="4" ry="4" fill="#fef3e2" stroke="#d4760a" stroke-width="0.7"/>
|
||||
<text x="105" y="86" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#d4760a">sampleB</text>
|
||||
|
||||
<!-- Input Collection 2 -->
|
||||
<rect x="10" y="135" width="190" height="105" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="105" y="153" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Collection 2</text>
|
||||
|
||||
<rect x="22" y="161" width="166" height="26" rx="4" ry="4" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="105" y="179" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#7b4fa0">sampleC</text>
|
||||
|
||||
<rect x="22" y="193" width="166" height="26" rx="4" ry="4" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="105" y="211" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#7b4fa0">sampleD</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="215" y1="130" x2="430" y2="130" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="323" y="120" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Merge</text>
|
||||
|
||||
<!-- Output: merged collection -->
|
||||
<rect x="450" y="10" width="210" height="240" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="555" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Merged collection</text>
|
||||
|
||||
<rect x="462" y="36" width="186" height="26" rx="4" ry="4" fill="#fef3e2" stroke="#d4760a" stroke-width="0.7"/>
|
||||
<text x="555" y="54" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#d4760a">sampleA</text>
|
||||
|
||||
<rect x="462" y="68" width="186" height="26" rx="4" ry="4" fill="#fef3e2" stroke="#d4760a" stroke-width="0.7"/>
|
||||
<text x="555" y="86" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#d4760a">sampleB</text>
|
||||
|
||||
<rect x="462" y="100" width="186" height="26" rx="4" ry="4" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="555" y="118" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#7b4fa0">sampleC</text>
|
||||
|
||||
<rect x="462" y="132" width="186" height="26" rx="4" ry="4" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="555" y="150" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#7b4fa0">sampleD</text>
|
||||
|
||||
<text x="555" y="195" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">elements concatenated in order</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 3.7 KiB |
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 210" width="620" height="210">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: input collection -->
|
||||
<rect x="10" y="10" width="170" height="130" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="95" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="22" y="38" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="56" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleA</text>
|
||||
|
||||
<rect x="22" y="70" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="88" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleB</text>
|
||||
|
||||
<rect x="22" y="102" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleC</text>
|
||||
|
||||
<!-- Mapping file -->
|
||||
<rect x="50" y="155" width="100" height="50" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="1"/>
|
||||
<text x="100" y="172" text-anchor="middle" font-family="monospace" font-size="9" fill="#555">sampleA Alpha</text>
|
||||
<text x="100" y="184" text-anchor="middle" font-family="monospace" font-size="9" fill="#555">sampleB Beta</text>
|
||||
<text x="100" y="196" text-anchor="middle" font-family="monospace" font-size="9" fill="#555">sampleC Gamma</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="195" y1="85" x2="385" y2="85" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="290" y="75" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Relabel</text>
|
||||
|
||||
<!-- Right: relabeled collection -->
|
||||
<rect x="400" y="10" width="200" height="130" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="500" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">List (relabelled)</text>
|
||||
|
||||
<rect x="412" y="38" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="500" y="56" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Alpha</text>
|
||||
|
||||
<rect x="412" y="70" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="500" y="88" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Beta</text>
|
||||
|
||||
<rect x="412" y="102" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="500" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">Gamma</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,105 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 220" width="640" height="220">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: Sample Sheet container -->
|
||||
<rect x="10" y="10" width="240" height="195" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="130" y="32" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">Sample Sheet: "RNA-seq"</text>
|
||||
|
||||
<!-- Metadata table -->
|
||||
<!-- Header row -->
|
||||
<rect x="22" y="44" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="44" width="36" height="22" fill="#fce5cd" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="44" width="100" height="22" fill="#fce5cd" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="59" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#333">Name</text>
|
||||
<text x="120" y="59" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#b45309">rep</text>
|
||||
<text x="188" y="59" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#b45309">treatment</text>
|
||||
|
||||
<!-- Row 1 -->
|
||||
<rect x="22" y="66" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="66" width="36" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="66" width="100" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="81" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample1</text>
|
||||
<text x="120" y="81" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">1</text>
|
||||
<text x="188" y="81" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">control</text>
|
||||
|
||||
<!-- Row 2 -->
|
||||
<rect x="22" y="88" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="88" width="36" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="88" width="100" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="103" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample2</text>
|
||||
<text x="120" y="103" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">2</text>
|
||||
<text x="188" y="103" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">treated</text>
|
||||
|
||||
<!-- Row 3 -->
|
||||
<rect x="22" y="110" width="80" height="22" fill="#fff" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="102" y="110" width="36" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<rect x="138" y="110" width="100" height="22" fill="#fff8e1" stroke="#aaa" stroke-width="0.5"/>
|
||||
<text x="62" y="125" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample3</text>
|
||||
<text x="120" y="125" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">3</text>
|
||||
<text x="188" y="125" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#b45309">control</text>
|
||||
|
||||
<!-- Metadata label -->
|
||||
<text x="155" y="155" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#b45309">metadata columns</text>
|
||||
<line x1="110" y1="140" x2="110" y2="148" stroke="#b45309" stroke-width="0.8" stroke-dasharray="2,2"/>
|
||||
<line x1="110" y1="148" x2="200" y2="148" stroke="#b45309" stroke-width="0.8" stroke-dasharray="2,2"/>
|
||||
<line x1="200" y1="140" x2="200" y2="148" stroke="#b45309" stroke-width="0.8" stroke-dasharray="2,2"/>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="270" y1="107" x2="370" y2="107" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="320" y="92" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#555">Extract</text>
|
||||
<text x="320" y="105" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#555">metadata</text>
|
||||
|
||||
<!-- Right: Tabular dataset -->
|
||||
<rect x="390" y="10" width="235" height="195" rx="8" ry="8" fill="#cfe2f3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="507" y="32" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#333">Tabular dataset</text>
|
||||
|
||||
<!-- Table header row -->
|
||||
<rect x="400" y="44" width="90" height="22" fill="#a4c2f4" stroke="#7a9ec7" stroke-width="0.5"/>
|
||||
<rect x="490" y="44" width="40" height="22" fill="#a4c2f4" stroke="#7a9ec7" stroke-width="0.5"/>
|
||||
<rect x="530" y="44" width="85" height="22" fill="#a4c2f4" stroke="#7a9ec7" stroke-width="0.5"/>
|
||||
<text x="445" y="59" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#1a3c6e">element_id</text>
|
||||
<text x="510" y="59" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#1a3c6e">rep</text>
|
||||
<text x="572" y="59" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#1a3c6e">treatment</text>
|
||||
|
||||
<!-- Data row 1 -->
|
||||
<rect x="400" y="66" width="90" height="22" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<rect x="490" y="66" width="40" height="22" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<rect x="530" y="66" width="85" height="22" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<text x="445" y="81" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">sample1</text>
|
||||
<text x="510" y="81" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">1</text>
|
||||
<text x="572" y="81" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">control</text>
|
||||
|
||||
<!-- Data row 2 -->
|
||||
<rect x="400" y="88" width="90" height="22" fill="#f3f6fc" stroke="#bbb" stroke-width="0.5"/>
|
||||
<rect x="490" y="88" width="40" height="22" fill="#f3f6fc" stroke="#bbb" stroke-width="0.5"/>
|
||||
<rect x="530" y="88" width="85" height="22" fill="#f3f6fc" stroke="#bbb" stroke-width="0.5"/>
|
||||
<text x="445" y="103" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">sample2</text>
|
||||
<text x="510" y="103" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">2</text>
|
||||
<text x="572" y="103" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">treated</text>
|
||||
|
||||
<!-- Data row 3 -->
|
||||
<rect x="400" y="110" width="90" height="22" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<rect x="490" y="110" width="40" height="22" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<rect x="530" y="110" width="85" height="22" fill="#fff" stroke="#bbb" stroke-width="0.5"/>
|
||||
<text x="445" y="125" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">sample3</text>
|
||||
<text x="510" y="125" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">3</text>
|
||||
<text x="572" y="125" text-anchor="middle" font-family="monospace" font-size="10" fill="#333">control</text>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="507" y="157" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#555">tab-separated metadata export</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.4 KiB |
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 180" width="620" height="180">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: unsorted collection -->
|
||||
<rect x="10" y="10" width="190" height="155" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="105" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="22" y="38" width="166" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="105" y="56" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleC</text>
|
||||
|
||||
<rect x="22" y="70" width="166" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="105" y="88" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleA</text>
|
||||
|
||||
<rect x="22" y="102" width="166" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="105" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleB</text>
|
||||
|
||||
<text x="105" y="152" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#999">unsorted</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="215" y1="85" x2="385" y2="85" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="300" y="75" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Sort</text>
|
||||
<text x="300" y="103" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#888">alphabetical</text>
|
||||
|
||||
<!-- Right: sorted collection -->
|
||||
<rect x="400" y="10" width="200" height="155" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="500" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">List (sorted)</text>
|
||||
|
||||
<rect x="412" y="38" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="500" y="56" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleA</text>
|
||||
|
||||
<rect x="412" y="70" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="500" y="88" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleB</text>
|
||||
|
||||
<rect x="412" y="102" width="176" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="500" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sampleC</text>
|
||||
|
||||
<text x="500" y="152" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#666">A, B, C order</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 280" width="680" height="280">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: mixed input collection -->
|
||||
<rect x="10" y="10" width="220" height="260" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="120" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">list : paired_or_unpaired</text>
|
||||
|
||||
<!-- Paired element: sample1 -->
|
||||
<rect x="22" y="38" width="196" height="70" rx="6" ry="6" fill="#e8f0e3" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="120" y="54" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#555">sample1 (paired)</text>
|
||||
|
||||
<rect x="34" y="60" width="172" height="18" rx="3" ry="3" fill="#fef3e2" stroke="#d4760a" stroke-width="0.7"/>
|
||||
<text x="120" y="73" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#d4760a">forward</text>
|
||||
|
||||
<rect x="34" y="82" width="172" height="18" rx="3" ry="3" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="120" y="95" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#7b4fa0">reverse</text>
|
||||
|
||||
<!-- Unpaired element: sample2 -->
|
||||
<rect x="22" y="116" width="196" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="120" y="135" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample2 (unpaired)</text>
|
||||
|
||||
<!-- Unpaired element: sample3 -->
|
||||
<rect x="22" y="152" width="196" height="28" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="120" y="171" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample3 (unpaired)</text>
|
||||
|
||||
<text x="120" y="210" text-anchor="middle" font-family="sans-serif" font-size="10" font-style="italic" fill="#999">mixed paired + unpaired</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="245" y1="130" x2="410" y2="130" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="328" y="120" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Split</text>
|
||||
|
||||
<!-- Right top: paired output -->
|
||||
<rect x="430" y="10" width="230" height="105" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="545" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Paired output</text>
|
||||
|
||||
<rect x="442" y="38" width="206" height="60" rx="6" ry="6" fill="#e8f0e3" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="545" y="54" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#555">sample1</text>
|
||||
|
||||
<rect x="454" y="60" width="182" height="14" rx="3" ry="3" fill="#fef3e2" stroke="#d4760a" stroke-width="0.7"/>
|
||||
<text x="545" y="71" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#d4760a">forward</text>
|
||||
|
||||
<rect x="454" y="78" width="182" height="14" rx="3" ry="3" fill="#f0e8f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="545" y="89" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#7b4fa0">reverse</text>
|
||||
|
||||
<!-- Right bottom: unpaired output -->
|
||||
<rect x="430" y="135" width="230" height="105" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="545" y="153" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">Unpaired output</text>
|
||||
|
||||
<rect x="442" y="163" width="206" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="545" y="181" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample2</text>
|
||||
|
||||
<rect x="442" y="195" width="206" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="545" y="213" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample3</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 620 210" width="620" height="210">
|
||||
<defs>
|
||||
<filter id="shadow" x="-4%" y="-4%" width="110%" height="110%">
|
||||
<feGaussianBlur in="SourceAlpha" stdDeviation="2" result="blur"/>
|
||||
<feComponentTransfer in="blur">
|
||||
<feFuncA type="linear" slope="0.3"/>
|
||||
</feComponentTransfer>
|
||||
<feMerge>
|
||||
<feMergeNode/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||
<polygon points="0 0, 10 3.5, 0 7" fill="#555"/>
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<!-- Left: input collection -->
|
||||
<rect x="10" y="10" width="170" height="130" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="95" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">List</text>
|
||||
|
||||
<rect x="22" y="38" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="56" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample1</text>
|
||||
|
||||
<rect x="22" y="70" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="88" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample2</text>
|
||||
|
||||
<rect x="22" y="102" width="146" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="95" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample3</text>
|
||||
|
||||
<!-- Tag file -->
|
||||
<rect x="30" y="155" width="130" height="50" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="1"/>
|
||||
<text x="95" y="172" text-anchor="middle" font-family="monospace" font-size="8" fill="#555">sample1 group:treat</text>
|
||||
<text x="95" y="184" text-anchor="middle" font-family="monospace" font-size="8" fill="#555">sample2 group:ctrl</text>
|
||||
<text x="95" y="196" text-anchor="middle" font-family="monospace" font-size="8" fill="#555">sample3 group:treat</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<line x1="195" y1="85" x2="385" y2="85" stroke="#555" stroke-width="2" marker-end="url(#arrowhead)"/>
|
||||
<text x="290" y="75" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#555">Tag</text>
|
||||
|
||||
<!-- Right: tagged collection -->
|
||||
<rect x="400" y="10" width="205" height="130" rx="8" ry="8" fill="#d9ead3" stroke="#888" stroke-width="1" filter="url(#shadow)"/>
|
||||
<text x="503" y="28" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#333">List (tagged)</text>
|
||||
|
||||
<rect x="412" y="38" width="181" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="475" y="56" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample1</text>
|
||||
<rect x="527" y="43" width="60" height="16" rx="8" ry="8" fill="#e8d5f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="557" y="54" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#7b4fa0">treat</text>
|
||||
|
||||
<rect x="412" y="70" width="181" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="475" y="88" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample2</text>
|
||||
<rect x="527" y="75" width="60" height="16" rx="8" ry="8" fill="#dce8f8" stroke="#2471a3" stroke-width="0.7"/>
|
||||
<text x="557" y="86" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#2471a3">ctrl</text>
|
||||
|
||||
<rect x="412" y="102" width="181" height="26" rx="4" ry="4" fill="#fff" stroke="#aaa" stroke-width="0.7"/>
|
||||
<text x="475" y="120" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#333">sample3</text>
|
||||
<rect x="527" y="107" width="60" height="16" rx="8" ry="8" fill="#e8d5f5" stroke="#7b4fa0" stroke-width="0.7"/>
|
||||
<text x="557" y="118" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#7b4fa0">treat</text>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 5.4 KiB |