A generic term to describe a concrete method, visualizer, or pipeline. +Actions accept parameters and/or files (artifacts or metadata) as input, and generate some kind of output.
+The directory structure of a QIIME 2 Result.
+Contains at least a root directory (named by UUID) and a VERSION
file within that directory.
A QIIME 2 Result that contains data to operate on.
+An installation of QIIME 2 as well as zero-or-more interfaces and plugins. +The collection of interfaces and plugins in a deployment can be defined by a distribution of QIIME 2.
+A string that represents a particular layout of files and or directories as well as how their contents will be structured.
+A collection of QIIME 2 plugins that are designed to be installed together. +These are generally grouped by a theme. For example, the Amplicon Distribution provides a collection of plugins for analysis of microbiome amplicon data, while the Shotgun Distribution provides a collection of plugins for analysis of microbiome shotgun metagenomics data. +When a distribution is installed, that particular installation of QIIME 2 is an example of a deployment.
+A string that represents a particular file format.
+The engine of orchestration that enables QIIME 2 to function together as a cohesive unit.
+A unique value that denotes an individual sample or feature.
+Distinguishes a piece of data. QIIME 2 does not consider a rename (like UNIX mv
) to change identity, however re-running a command, would change identity.
A user-interface responsible for coordinating user-specified intent into framework-driven action.
+Columnar data for annotating additional values to existing data. Operates along Sample IDs or Feature IDs.
+A method accepts some combination of QIIME 2 artifacts and parameters as input, and produces one or more QIIME 2 artifacts as output.
+Objects returned by an action. Can be artifact(s) or visualization(s).
+A value that alters the behavior of an action.
+Data that is meant for primary consumption or interpretation (in contrast to metadata which may be useful retrospectively, but is not primarily useful).
+A pipeline accepts some combination of QIIME 2 artifacts and parameters as input, and produces one or more QIIME 2 artifacts and/or visualizations as output.
+A discrete module that registers some form of additional functionality with the framework, including new methods, visualizers, formats, or transformers.
+A type that is used to communicate parameters to an interface. These are predefined by the framework and cannot be extended.
+A generic term for either a Visualization or an Artifact.
+Data describing how an analysis was performed, captured automatically whenever users perform a QIIME 2 Action. +Provenance information describes the host system, the computing environment, Actions performed, parameters passed, primary sources cited, and more.
+A type that is used to classify artifacts and how they can be used. +These types may be extended by plugins.
+A function registered on the framework capable of converting data in one format into data of another format.
+A term that is used to represent several different ideas in QIIME 2, and which is therefore ambiguous when used on its own. +More specific terms are file type, semantic type, and data type. See Semantic types, data types, and file formats for more information.
+Universally Unique IDentifier, in the context of QIIME 2, almost certainly refers to a Version 4 UUID, which is a randomly generated ID. +See this RFC or this wikipedia entry for details.
+A particular representation of data. This includes on-disk formats and in-memory data structures (objects).
+A QIIME 2 Result that contains an interactive visualization.
+The type of a visualization. +There are no subtyping relations between this type and any other (it is a singleton) and cannot be extended (because it is a singleton).
+A visualizer accepts some combination of QIIME 2 artifacts and parameters as input, and produces exactly one visualization as output.
+The goal of this document is to give the reader a high-level understanding of the components of QIIME 2, and how they are inter-related.
+At the highest level, there are three kinds of components in QIIME 2:
+The interfaces, which are responsible for translating user intent into action.
The framework, whose behavior and purpose will be described in further detail below.
The plugins, which define all domain-specific functionality.
The above diagram illustrates the most important restriction of the architecture. +Interfaces cannot and should not have any particular knowledge about plugins ahead of time. +Instead they must request that information from the framework, which provides a high-level description of all of the actions available via SDK (Software Development Kit) objects.
+At first glance, this restriction may seem onerous. +However, because interfaces cannot communicate directly with plugins, they also never need to coordinate with them. +This means interfaces are entirely decoupled from the plugins and more importantly, plugins are always decoupled from interfaces. +A developer of a plugin, does not need to concern themselves with providing any interface-specific functionality, meaning development of both plugins and interfaces can be done in parallel. +Only changes in the framework itself require coordination between the other two component types. +This key constraint coupled with a set of semantically rich SDK objects allows multiple kinds of interfaces to be dynamically generated. +This allows QIIME 2 to adapt its UI to both the audience and the task at hand.
+A more complete version of the above figure is found below:
+ +Here we observe that interfaces use a particular sub-component of the framework called the SDK. +We also see that one of the interfaces is built into the framework itself (the Artifact API), however it is not any more privileged compared to any of the other interfaces, and none of the other interfaces use it directly.
+Looking now at the plugins we see that they use a sub-component of the framework called the Plugin API. +This is responsible for constructing and registering the relevant SDK objects for use by interfaces. +We also see that plugins can depend on other plugins.
+At this point the rough picture of how an interface uses a plugin can be seen. +Plugins are loaded by the framework’s SDK via an entry-point (more on that later). +This in turn causes the plugin code to interact with the Plugin API, which constructs SDK objects. +These SDK objects are then introspected and manipulated by any number of Interfaces.
+To get a better idea of where the responsibility of these components starts and ends, we can look at a sequence diagram describing the execution of an action by a user.
+ +This figure has four components: a User, an Interface, the Framework, and a Plugin. +We see first, a User invoking some action with some files and parameters. +The Interface receives this and is activated. +It locates the plugin and the action requested from the Framework, receiving SDK objects (not shown). +Then it loads the provided files as QIIME 2 Artifacts. +It is then ready to call the action (an SDK object) with the User’s artifacts and parameters.
+The Framework then provides some input validation (it is much faster to check that the data provided will work for the action requested than to fail halfway through a very long process, requiring the User to start over). +The Framework then identifies what format the data should be in, and invokes relevant code defined by a Plugin (though not necessarily the same one) for converting that data. +Finally, with validated input and a compatible format, the data is provided to the plugin to perform whatever task the User intended.
+Once finished, the Plugin returns the results and the Framework will again convert that data into a particular format for storage using a Plugin.
+The Framework then writes that data into an archive (as /data/
) and records what steps just occurred (in /provenance/
).
+This completed archive is now an artifact and is returned to the Interface.
+The Interface decides to save the artifact to a file and then returns that to the User.
In this example we see that the activation of each component is strictly nested. +It forms a sort of “onion of responsibility” between the component layers. +We also note that the Interface waits for the task to finish before becoming inactive; there are other modes of calling actions which are asynchronous and can be used instead. +In either case, we see that each component is successively responsible for less tasks which become more specific as we move to the right.
+The end result is:
+The Interface need only care about communicating with the User.
The Plugin need only care about manipulating data to some effect.
The Framework concerns itself with coordinating the overall effort and recording the data surrounding the action.
A QIIME 2 plugin action
is any operation that accepts parameters and files (:term:artifact
or metadata) as input, and generates some type of output.
+Actions
are interpreted as “commands” by QIIME 2 interfaces and come in three flavors:
A Method
accepts some combination of QIIME 2 Artifacts
and Parameters
as input, and produces one or more QIIME 2 artifacts as output.
+These output artifacts could subsequently be used as input to other QIIME 2 Methods
or Visualizers
.
+Methods
can produce intermediate or terminal outputs in a QIIME 2 analysis.
+For example, the rarefy
method defined in the q2-feature-table
plugin accepts a feature table artifact and sampling depth as input and produces a rarefied feature table artifact as output.
+This rarefied feature table artifact could then be used in another analysis, such as alpha diversity calculations provided by the alpha
method in q2-diversity
.
A Visualizer
is similar to a Method
in that it accepts some combination of QIIME 2 Artifacts
and Parameters
as input.
+In contrast to a method, a visualizer produces exactly one Visualization
as output.
+Visualizations, by definition, cannot be used as input to other QIIME 2 methods or visualizers.
+Thus, visualizers can only produce terminal output in a QIIME 2 analysis.
A Pipeline
accepts some combination of QIIME 2 Artifacts
and Parameters
as input and produces one or more artifacts and/or visualizations as output.
+It does so by incorporating one or more methods
and/or visualizers
into a single registered action
.