<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1d3 20150301//EN" "http://jats.nlm.nih.gov/publishing/1.1d3/JATS-journalpublishing1.dtd">
<article article-type="research-article" dtd-version="1.1d3" xml:lang="en" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<front>
<journal-meta>
<journal-id journal-id-type="nlm-ta">PLoS ONE</journal-id>
<journal-id journal-id-type="publisher-id">plos</journal-id>
<journal-id journal-id-type="pmc">plosone</journal-id>
<journal-title-group>
<journal-title>PLOS ONE</journal-title>
</journal-title-group>
<issn pub-type="epub">1932-6203</issn>
<publisher>
<publisher-name>Public Library of Science</publisher-name>
<publisher-loc>San Francisco, CA USA</publisher-loc>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.1371/journal.pone.0163962</article-id>
<article-id pub-id-type="publisher-id">PONE-D-16-20820</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Research Article</subject>
</subj-group>
<subj-group subj-group-type="Discipline-v3"><subject>Biology and life sciences</subject><subj-group><subject>Molecular biology</subject><subj-group><subject>Molecular biology techniques</subject><subj-group><subject>Sequencing techniques</subject><subj-group><subject>Sequence analysis</subject><subj-group><subject>Sequence motif analysis</subject></subj-group></subj-group></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Research and analysis methods</subject><subj-group><subject>Molecular biology techniques</subject><subj-group><subject>Sequencing techniques</subject><subj-group><subject>Sequence analysis</subject><subj-group><subject>Sequence motif analysis</subject></subj-group></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Biology and life sciences</subject><subj-group><subject>Neuroscience</subject><subj-group><subject>Cognitive science</subject><subj-group><subject>Cognition</subject><subj-group><subject>Memory</subject></subj-group></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Biology and life sciences</subject><subj-group><subject>Neuroscience</subject><subj-group><subject>Learning and memory</subject><subj-group><subject>Memory</subject></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Biology and life sciences</subject><subj-group><subject>Genetics</subject><subj-group><subject>Genomics</subject><subj-group><subject>Repeated sequences</subject></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Computer and information sciences</subject><subj-group><subject>Programming languages</subject></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Biology and life sciences</subject><subj-group><subject>Computational biology</subject><subj-group><subject>Genome analysis</subject><subj-group><subject>Sequence assembly tools</subject></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Biology and life sciences</subject><subj-group><subject>Genetics</subject><subj-group><subject>Genomics</subject><subj-group><subject>Genome analysis</subject><subj-group><subject>Sequence assembly tools</subject></subj-group></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Research and analysis methods</subject><subj-group><subject>Database and informatics methods</subject><subj-group><subject>Database searching</subject><subj-group><subject>FASTA searching</subject></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Computer and information sciences</subject><subj-group><subject>Operating systems</subject></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Biology and life sciences</subject><subj-group><subject>Molecular biology</subject><subj-group><subject>Molecular biology techniques</subject><subj-group><subject>Sequencing techniques</subject><subj-group><subject>Nucleotide sequencing</subject></subj-group></subj-group></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3"><subject>Research and analysis methods</subject><subj-group><subject>Molecular biology techniques</subject><subj-group><subject>Sequencing techniques</subject><subj-group><subject>Nucleotide sequencing</subject></subj-group></subj-group></subj-group></subj-group></article-categories>
<title-group>
<article-title>SeqKit: A Cross-Platform and Ultrafast Toolkit for FASTA/Q File Manipulation</article-title>
<alt-title alt-title-type="running-head">SeqKit: Ultrafast Toolkit for FASTA/Q Format</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author" xlink:type="simple">
<contrib-id authenticated="true" contrib-id-type="orcid">http://orcid.org/0000-0002-8099-8258</contrib-id>
<name name-style="western">
<surname>Shen</surname>
<given-names>Wei</given-names>
</name>
<xref ref-type="aff" rid="aff001"><sup>1</sup></xref>
</contrib>
<contrib contrib-type="author" xlink:type="simple">
<name name-style="western">
<surname>Le</surname>
<given-names>Shuai</given-names>
</name>
<xref ref-type="aff" rid="aff001"><sup>1</sup></xref>
</contrib>
<contrib contrib-type="author" corresp="yes" xlink:type="simple">
<name name-style="western">
<surname>Li</surname>
<given-names>Yan</given-names>
</name>
<xref ref-type="aff" rid="aff002"><sup>2</sup></xref>
<xref ref-type="corresp" rid="cor001">*</xref>
</contrib>
<contrib contrib-type="author" corresp="yes" xlink:type="simple">
<name name-style="western">
<surname>Hu</surname>
<given-names>Fuquan</given-names>
</name>
<xref ref-type="aff" rid="aff001"><sup>1</sup></xref>
<xref ref-type="corresp" rid="cor001">*</xref>
</contrib>
</contrib-group>
<aff id="aff001"><label>1</label> <addr-line>Department of Microbiology, College of Basic Medical Sciences, Third Military Medical University, 30# Gaotanyan St., Shapingba District, Chongqing, China</addr-line></aff>
<aff id="aff002"><label>2</label> <addr-line>Medical Research Center, Southwest hospital, Third Military Medical University, 29# Gaotanyan St., Shapingba District, Chongqing, China</addr-line></aff>
<contrib-group>
<contrib contrib-type="editor" xlink:type="simple">
<name name-style="western">
<surname>Zou</surname>
<given-names>Quan</given-names>
</name>
<role>Editor</role>
<xref ref-type="aff" rid="edit1"/>
</contrib>
</contrib-group>
<aff id="edit1"><addr-line>Tianjin University, CHINA</addr-line></aff>
<author-notes>
<fn fn-type="conflict" id="coi001">
<p>The authors have declared that no competing interests exist.</p>
</fn>
<fn fn-type="con">
<p><list list-type="simple"><list-item><p><bold>Conceptualization:</bold> WS.</p></list-item>
<list-item><p><bold>Data curation:</bold> WS SL.</p></list-item>
<list-item><p><bold>Formal analysis:</bold> WS SL.</p></list-item>
<list-item><p><bold>Funding acquisition:</bold> YL FH.</p></list-item>
<list-item><p><bold>Investigation:</bold> WS SL.</p></list-item>
<list-item><p><bold>Methodology:</bold> WS.</p></list-item>
<list-item><p><bold>Project administration:</bold> WS YL FH.</p></list-item>
<list-item><p><bold>Resources:</bold> WS SL.</p></list-item>
<list-item><p><bold>Software:</bold> WS.</p></list-item>
<list-item><p><bold>Supervision:</bold> YL FH.</p></list-item>
<list-item><p><bold>Validation:</bold> WS.</p></list-item>
<list-item><p><bold>Visualization:</bold> WS.</p></list-item>
<list-item><p><bold>Writing – original draft:</bold> WS.</p></list-item>
<list-item><p><bold>Writing – review &amp; editing:</bold> WS YL FH.</p></list-item></list></p>
</fn>
<corresp id="cor001">* E-mail: <email xlink:type="simple">liyan.com@gmail.com</email> (YL); <email xlink:type="simple">hufuquan2009@aliyun.com</email> (FH)</corresp>
</author-notes>
<pub-date pub-type="epub">
<day>5</day>
<month>10</month>
<year>2016</year>
</pub-date>
<pub-date pub-type="collection">
<year>2016</year>
</pub-date>
<volume>11</volume>
<issue>10</issue>
<elocation-id>e0163962</elocation-id>
<history>
<date date-type="received">
<day>23</day>
<month>5</month>
<year>2016</year>
</date>
<date date-type="accepted">
<day>16</day>
<month>9</month>
<year>2016</year>
</date>
</history>
<permissions>
<copyright-year>2016</copyright-year>
<copyright-holder>Shen et al</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/" xlink:type="simple">
<license-p>This is an open access article distributed under the terms of the <ext-link ext-link-type="uri" xlink:href="http://creativecommons.org/licenses/by/4.0/" xlink:type="simple">Creative Commons Attribution License</ext-link>, which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited.</license-p>
</license>
</permissions>
<self-uri content-type="pdf" xlink:href="info:doi/10.1371/journal.pone.0163962"/>
<abstract>
<p>FASTA and FASTQ are basic and ubiquitous formats for storing nucleotide and protein sequences. Common manipulations of FASTA/Q file include converting, searching, filtering, deduplication, splitting, shuffling, and sampling. Existing tools only implement some of these manipulations, and not particularly efficiently, and some are only available for certain operating systems. Furthermore, the complicated installation process of required packages and running environments can render these programs less user friendly. This paper describes a cross-platform ultrafast comprehensive toolkit for FASTA/Q processing. SeqKit provides executable binary files for all major operating systems, including Windows, Linux, and Mac OSX, and can be directly used without any dependencies or pre-configurations. SeqKit demonstrates competitive performance in execution time and memory usage compared to similar tools. The efficiency and usability of SeqKit enable researchers to rapidly accomplish common FASTA/Q file manipulations. SeqKit is open source and available on Github at <ext-link ext-link-type="uri" xlink:href="https://github.com/shenwei356/seqkit" xlink:type="simple">https://github.com/shenwei356/seqkit</ext-link>.</p>
</abstract>
<funding-group>
<award-group id="award001">
<funding-source>
<institution-wrap>
<institution-id institution-id-type="funder-id">http://dx.doi.org/10.13039/501100001809</institution-id>
<institution>National Natural Science Foundation of China</institution>
</institution-wrap>
</funding-source>
<award-id>81373133</award-id>
<principal-award-recipient>
<name name-style="western">
<surname>Li</surname>
<given-names>Yan</given-names>
</name>
</principal-award-recipient>
</award-group>
<award-group id="award002">
<funding-source>
<institution-wrap>
<institution-id institution-id-type="funder-id">http://dx.doi.org/10.13039/501100001809</institution-id>
<institution>National Natural Science Foundation of China</institution>
</institution-wrap>
</funding-source>
<award-id>31570173</award-id>
<principal-award-recipient>
<name name-style="western">
<surname>Hu</surname>
<given-names>Fuquan</given-names>
</name>
</principal-award-recipient>
</award-group>
<funding-statement>This work was supported by the National Natural Science Foundation of China (grant No. 81373133 to YL and No. 31570173 to FH). The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript.</funding-statement>
</funding-group>
<counts>
<fig-count count="3"/>
<table-count count="2"/>
<page-count count="10"/>
</counts>
<custom-meta-group>
<custom-meta id="data-availability">
<meta-name>Data Availability</meta-name>
<meta-value>All relevant data are within the paper and its Supporting Information files.</meta-value>
</custom-meta>
</custom-meta-group>
</article-meta>
</front>
<body>
<sec id="sec001" sec-type="intro">
<title>Introduction</title>
<p>FASTA and FASTQ are basic and ubiquitous text-based formats for storing nucleotide and protein sequences. FASTA was introduced first in FASTA software [<xref ref-type="bibr" rid="pone.0163962.ref001">1</xref>], and FASTQ was originally developed at the Wellcome Trust Sanger Institute [<xref ref-type="bibr" rid="pone.0163962.ref002">2</xref>]. Common manipulations of FASTA/Q files include converting, cleaning, searching, filtering, deduplication, splitting, shuffling, and sampling. The simplicity of the FASTA/Q formats makes them easy to be parsed and manipulated with programming languages like Python and Perl. However, researchers, especially beginners, repeatedly write scripts for common purposes such as extracting sequences by using an identifiers (IDs) list file. Most of these scripts are not well organized or documented and are not reusable by other researchers. Many tools are available for the manipulation of FASTA/Q files, including fasta_utilities [<xref ref-type="bibr" rid="pone.0163962.ref003">3</xref>], fastx_toolkit [<xref ref-type="bibr" rid="pone.0163962.ref004">4</xref>], pyfaidx [<xref ref-type="bibr" rid="pone.0163962.ref005">5</xref>], seqmagick [<xref ref-type="bibr" rid="pone.0163962.ref006">6</xref>] and seqtk [<xref ref-type="bibr" rid="pone.0163962.ref007">7</xref>]. However, most of these programs implement only some of the above functions necessary for common manipulation and are not efficient for large files. Moreover, some tools require dependencies or running environments for installation or are only available for specific operating systems, which render them less user friendly. With the increasing number of sequences being produced, processing efficiency has become critical. Here, we introduced SeqKit toolkit to address the need for efficient and facile manipulations of FASTA/Q files.</p>
</sec>
<sec id="sec002" sec-type="materials|methods">
<title>Method</title>
<p>In this work, we present a novel FASTA/Q command-line toolkit, SeqKit, which is implemented in the Go programming language, which makes it available for most popular operating systems including Windows, Linux, Mac OS X and FreeBSD. SeqKit is lightweight and can be used out-of-the-box without any dependencies or configurations, which makes it user friendly.</p>
<sec id="sec003">
<title>Program organization</title>
<p>The SeqKit toolkit adopts the structure of “command subcommand”, i.e., users access functions of SeqKit from single entrance, “seqkit,” and specify a detailed function with subcommand name. Many subcommands share similar options (called flags in SeqKit), so these options are refactored as global options/flags. This structure benefits both potential developers and users learning the functionality of SeqKit.</p>
<p>SeqKit consists of nineteen subcommands (<xref ref-type="table" rid="pone.0163962.t001">Table 1</xref>) that provide completely independent functions. All subcommands support plain or gzip-compressed inputs and outputs from either standard streams or local files. Therefore, SeqKit can be easily combined in a command-line pipe to accomplish complex manipulations.</p>
<table-wrap id="pone.0163962.t001" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0163962.t001</object-id>
<label>Table 1</label> <caption><title>Subcommands of SeqKit toolkit.</title></caption>
<alternatives>
<graphic id="pone.0163962.t001g" mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0163962.t001" xlink:type="simple"/>
<table>
<colgroup>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
</colgroup>
<thead>
<tr>
<th align="center">Categories</th>
<th align="center">Subcommands</th>
<th align="center">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">Basic operations</td>
<td align="center">seq</td>
<td align="left">Validating and transforming sequences</td>
</tr>
<tr>
<td align="center"/>
<td align="center">subseq</td>
<td align="left">Getting subsequences by region/GTF/BED</td>
</tr>
<tr>
<td align="center"/>
<td align="center">sliding</td>
<td align="left">Sliding sequences</td>
</tr>
<tr>
<td align="center"/>
<td align="center">stat</td>
<td align="left">Simple statistics</td>
</tr>
<tr>
<td align="center"/>
<td align="center">faidx</td>
<td align="left">Creating FASTA index files</td>
</tr>
<tr>
<td align="center">Format conversion</td>
<td align="center">fx2tab</td>
<td align="left">Converting FASTA/Q to tabular format with extra information</td>
</tr>
<tr>
<td align="center"/>
<td align="center">tab2fx</td>
<td align="left">Converting tabular format to FASTA/Q format</td>
</tr>
<tr>
<td align="center"/>
<td align="center">fq2fa</td>
<td align="left">Converting FASTQ format to FASTA</td>
</tr>
<tr>
<td align="center">Searching</td>
<td align="center">grep</td>
<td align="left">Searching sequences by patterns/IDs/motifs</td>
</tr>
<tr>
<td align="center"/>
<td align="center">locate</td>
<td align="left">Locating subsequences/motifs</td>
</tr>
<tr>
<td align="center">Set operations</td>
<td align="center">rmdup</td>
<td align="left">Removing duplicated sequences by ID/name/seq</td>
</tr>
<tr>
<td align="center"/>
<td align="center">common</td>
<td align="left">Finding common sequences of multiple files by ID/name/seq</td>
</tr>
<tr>
<td align="center"/>
<td align="center">split</td>
<td align="left">Splitting sequences into files by ID/seq region/size/parts</td>
</tr>
<tr>
<td align="center"/>
<td align="center">sample</td>
<td align="left">Sampling sequences by number or proportion</td>
</tr>
<tr>
<td align="center"/>
<td align="center">head</td>
<td align="left">Printing the first N FASTA/Q records</td>
</tr>
<tr>
<td align="center">Edit</td>
<td align="center">replace</td>
<td align="left">Editing name/sequence by regular expression</td>
</tr>
<tr>
<td align="center"/>
<td align="center">rename</td>
<td align="left">Renaming duplicated IDs</td>
</tr>
<tr>
<td align="center">Ordering</td>
<td align="center">shuffle</td>
<td align="left">Shuffling sequences</td>
</tr>
<tr>
<td align="center"/>
<td align="center">sort</td>
<td align="left">Sorting sequences by ID/name/sequence/length</td>
</tr>
</tbody>
</table>
</alternatives>
</table-wrap>
</sec>
<sec id="sec004">
<title>FASTA/Q format parsing</title>
<p>In most cases, file I/O (input and output) is the performance bottleneck of sequence manipulation tools. SeqKit uses the self-implemented lightweight and high-performance bioinformatics package bio [<xref ref-type="bibr" rid="pone.0163962.ref008">8</xref>] for FASTA/Q parsing, which exhibits high performance similar to the widely used klib (kseq.h) [<xref ref-type="bibr" rid="pone.0163962.ref009">9</xref>] (<xref ref-type="fig" rid="pone.0163962.g001">Fig 1</xref>). SeqKit seamlessly supports both FASTA and FASTQ formats, and file type is automatically detected. All subcommands, with the exception of "faidx", can handle both formats. The two-pass mode of some commands (i.e., "subseq, "split", "sort" and "shuffle"), which utilize a FASTA index to improve processing performance for large files, only supports the FASTA format. When input files are plain or gzip-compressed FASTA files, a FASTA index would be optionally used for rapid access of sequences and to reduce memory usage. To restore the original FASTA header information, SeqKit uses a full sequence header as the sequence identifier (ID). Therefore, the FASTA index file (".seqkit.fa") created by SeqKit is slightly different from the ".fai" file created by SAMtools [<xref ref-type="bibr" rid="pone.0163962.ref010">10</xref>]. SeqKit also supports custom IDs using regular expressions, which allows users to customize their experience.</p>
<fig id="pone.0163962.g001" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0163962.g001</object-id>
<label>Fig 1</label>
<caption>
<title>Performance comparison for FASTA/Q file parsing.</title>
<p>Dataset A consists of 67,748 DNA sequences with average length of 41 Kb; dataset B is the human genome with 24 chromosomes, one mitochondrial sequence and 169 scaffolds and dataset C contains 9,186,045 Illumina SE reads. All tests were repeated five times, and the average time or memory usage was computed. See supplementary data for details of test data and commands.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0163962.g001" xlink:type="simple"/>
</fig>
<p>Sequence type (DNA/RNA/Protein) is automatically detected by the leading subsequences of the first record. User can also specify sequence type to validate letters of sequences using subcommand “seq”.</p>
</sec>
<sec id="sec005">
<title>Performance optimization</title>
<p>To utilize the multi-CPU environment of modern computers, most CPU-intensive processes are parallelized by multiple Goroutines in the Go programming language, which are similar to, but lighter weight than, threads. Parallelized processes include 1) validation of sequence letters; 2) computation of reverse complementary nucleotide sequences for long sequences; 3) parsing pattern and GTF/BED files; and 4) converting tabular format to FASTA/Q format.</p>
<p>To improve processing efficiency, SeqKit uses some customized data structures and algorithms. For example, the sequence parsing algorithm uses a custom buffered file reading algorithm instead of the Go standard library “bufio”, which is not memory-efficient for large sequences. This change increased the speed and significantly lowered the memory usage. Additionally, the computation of the reverse complementary sequence utilizes map in Go (also called hash table or dictionary in some other programming language) and is usually used to store the mapping relations of nucleotide bases and their complementary bases. However, the built-in map data structure of Go is inefficient because the key and value data types are bytes, which is actually uint8 (unsigned 8-bit integer). Instead, we use the slice data structure (similar to array in Perl and list in Python) to store complementary sequences with the ASCII code of the byte as the indexing key (Algorithm 1). This algorithm resulted in a ~20× speedup relative to the strategy of map (Table A in <xref ref-type="supplementary-material" rid="pone.0163962.s001">S1 File</xref>). The memory usage is also very low since the size of base alphabet is limited.</p>
<p><bold>Algorithm 1:</bold> Fast reverse complementary sequence</p>
<p specific-use="line"><bold>Function 1:</bold> byte2int(<italic>b</italic>)</p>
<p specific-use="line"><bold>Input:</bold> Byte <italic>b</italic></p>
<p specific-use="line"><bold>return</bold> ASCII value of byte <italic>b</italic></p>
<p specific-use="line"><bold>Function 2:</bold> ReverseComplementarySeq(<italic>A</italic>, <italic>S</italic>)</p>
<p specific-use="line"><bold>Input:</bold> An array of bytes containing alphabet letters: <italic>A</italic> and an array of bytes: <italic>S</italic></p>
<p specific-use="line"><bold>Output:</bold> Reverse complementary sequence of <italic>S</italic>: <italic>RC</italic></p>
<p specific-use="line">Step 1: Creating mapping array <italic>L</italic></p>
<p specific-use="line"><italic>L</italic> ← Initializing an array of 256 bytes with value of null characters ('\0')</p>
<p specific-use="line"><bold>for</bold> <italic>b</italic> <bold>in</bold> <italic>A</italic> <bold>do</bold></p>
<p specific-use="line"> <italic>L</italic>[byte2int(<italic>b</italic>)] ← Complementary base of <italic>b</italic></p>
<p specific-use="line"><bold>end</bold></p>
<p specific-use="line">Step 2: Computing reverse complementary sequence</p>
<p specific-use="line"><italic>RC</italic> ← Reverse array of <italic>S</italic></p>
<p specific-use="line"><bold>for</bold> <italic>i</italic> = 1 to (length of <italic>S</italic>) <bold>do</bold></p>
<p specific-use="line"> <italic>b</italic> ← <italic>S</italic>[<italic>i</italic>]</p>
<p specific-use="line"> <bold>if</bold> byte2int(<italic>b</italic>) &gt; 256 or <italic>L</italic>[byte2int(<italic>b</italic>)] = '\0'</p>
<p specific-use="line">  raise error</p>
<p specific-use="line"> <bold>else</bold></p>
<p specific-use="line">  <italic>RC</italic>[<italic>i</italic>] ← <italic>L</italic>[byte2int(<italic>b</italic>)]</p>
<p specific-use="line"> <bold>end</bold></p>
<p specific-use="line"><bold>end</bold></p>
<p specific-use="line"><bold>return</bold> <italic>RC</italic></p>
<p>Most subcommands of SeqKit do not load all FASTA/Q records in to memory. Some manipulations, such as removing duplicate sequences by sequence content, do need to store whole sequences in memory. SeqKit uses a MD5 digest to represent sequence content, which greatly reduces memory usage. Some subcommands can either read all records in memory, but others, including "sample", "split", "shuffle" and "sort", read the files twice in two-pass mode. This read mode uses the FASTA index for rapid access of sequences and reduces memory usage.</p>
</sec>
<sec id="sec006">
<title>Reproducibility</title>
<p>Reproducibility is very important in scientific tools. The results from all subcommands could be reproduced with the same dataset and arguments across different operating system. The subcommands "sample" and "shuffle" in SeqKit use random functions, so the configurability of the random seed guarantees that the results can be reproduced in different environments using the same data and commands.</p>
</sec>
</sec>
<sec id="sec007" sec-type="conclusions">
<title>Results and Discussion</title>
<p>To address the needs for efficient and easy-to-use manipulations of FASTA/Q files, we present SeqKit here.</p>
<sec id="sec008">
<title>Functions and features</title>
<p>With nineteen subcommands (<xref ref-type="table" rid="pone.0163962.t001">Table 1</xref>), SeqKit provides functions covering most aspects of FASTA/Q (mainly FASTA) manipulation. SeqKit provides more comprehensive features compared to other tools (<xref ref-type="table" rid="pone.0163962.t002">Table 2</xref>). For example, shuffling is a necessary process before splitting FASTA files for the cross-validation of machine learning algorithms. Although the GNU tool “shuf” provides a shuffling function for list files, more shell commands are needed to shuffle FASTA files. In contrast, the subcommand “shuffle” of SeqKit provides an efficient and cross-platform way to achieve this objective. Similarly, no tools provide functions for locating sequence motifs and identifying common sequences between multiple files, which are both common manipulations in research analyses.</p>
<table-wrap id="pone.0163962.t002" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0163962.t002</object-id>
<label>Table 2</label> <caption><title>Overview FASTA/Q processing tool features.</title></caption>
<alternatives>
<graphic id="pone.0163962.t002g" mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0163962.t002" xlink:type="simple"/>
<table>
<colgroup>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
</colgroup>
<thead>
<tr>
<th align="left">Categories</th>
<th align="left">Features</th>
<th align="left">seqkit</th>
<th align="left">fasta_utilities</th>
<th align="left">fastx_toolkit</th>
<th align="left">pyfaidx</th>
<th align="left">seqmagick</th>
<th align="left">seqtk</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Formats supports</td>
<td align="left">Multi-line FASTA</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">FASTQ</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Multi-line FASTQ</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Validating sequences</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Supporting RNA</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left">Functions</td>
<td align="left">Searching by motifs</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Sampling</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Extracting sub-sequence</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Removing duplicates</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Partly</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Splitting</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Partly</td>
<td align="left">--</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Splitting by seq</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Shuffling</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Sorting</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Locating motifs</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Common sequences</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Cleaning bases</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Transcription</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Translation</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Filtering by size</td>
<td align="left">Indirect</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Renaming header</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left">Other features</td>
<td align="left">Cross-platform</td>
<td align="left">Yes</td>
<td align="left">Partly</td>
<td align="left">Partly</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Reading STDIN</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Reading gzipped file</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">Yes</td>
</tr>
<tr>
<td align="left"/>
<td align="left">Writing gzip file</td>
<td align="left">Yes</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">--</td>
<td align="left">Yes</td>
<td align="left">--</td>
</tr>
</tbody>
</table>
</alternatives>
</table-wrap>
<p>For common functions also provided by other tools, SeqKit offers more practical controls with more options. For example, fasta_utilities, seqmagick and SeqKit all support searching sequences by pattern (i.e., regular expression), but SeqKit supports searching with sequence motifs containing degenerate sequences (e.g., TTSAA, the digest site of the restriction enzyme AgsI, is equal to the regular expression TT[CG]AA). SeqKit provides practical extended positioning strategies for obtaining subsequences by region (position range). In addition, for common range notation such as “1:20”, SeqKit can choose more advanced regions. For example, the last 12 bases can be identified using “-12:-1” and the whole sequence by “1:-1”. SeqKit can also extract up-stream and down-stream flanking sequences in GTF/BED files.</p>
<p>As a command-line tool, all subcommands of SeqKit support plain or gzip-compressed input and output from either standard stream or local files. Therefore, it can be easily combined in command-line pipes to accomplish complex manipulations. SeqKit also provides functions for converting FASTA/Q to and from tabular format, which can be conveniently manipulated with other tabular format tools including “cut”, “sort”, and “awk”.</p>
</sec>
<sec id="sec009">
<title>Computational time and memory usage</title>
<p>Computational efficiency and memory usage are critical with the increasing scale of sequencing data. Sequence records parsing is the main bottleneck in the manipulation of FASTA/Q files. SeqKit adopts the authors’ high-performance bioinformatics package[<xref ref-type="bibr" rid="pone.0163962.ref008">8</xref>], which had been successfully applied in a fast sequence processing tool [<xref ref-type="bibr" rid="pone.0163962.ref011">11</xref>], to parse FASTA and FASTQ files. To test the comprehensive performance on FASTA and FASTQ format parsing, three different datasets were used. Dataset A (file size: ~2.7 G) consists of 67,748 DNA sequences with average length of 41 Kb, representing large FASTA files with average sized sequences. Dataset B (file size: ~2.9 G) is the human genome with 24 chromosomes, one mitochondrial sequence and 169 scaffolds and serves as an example of large FASTA file with large sequence sizes. Dataset C (file size: ~2.2 G) contains 9,186,045 Illumina SE reads as an example of typical FASTQ files generated from next-generation sequencing. The benchmark results were compared to the widely used high-performance FASTA/Q parsing C library klib (kseq.h)[<xref ref-type="bibr" rid="pone.0163962.ref009">9</xref>]. SeqKit outperformed seqtk using klib in processing time on the two scales of FASTA file parsing while maintaining reasonable peak memory usage. SeqKit archived approximately 85% speed of seqtk in FASTQ file parsing (<xref ref-type="fig" rid="pone.0163962.g001">Fig 1</xref>).</p>
<p>SeqKit utilizes multiple CPUs to accelerate computationally intensive processes (See <xref ref-type="sec" rid="sec002">Method</xref>). To assess the performance improvement of multiple threads, five tests were performed with a serial number of threads (Goroutine in Go) (Figure A in <xref ref-type="supplementary-material" rid="pone.0163962.s001">S1 File</xref>). The results showed that two threads generally performed better than a single thread and that no further significant improvements were obtained with three or more threads. Therefore, the default number of threads for multi-core computers was two.</p>
<p>To assess the comprehensive performance of SeqKit, five tests of common manipulations on FASTA/Q were performed using different tools on datasets A, B (<xref ref-type="fig" rid="pone.0163962.g002">Fig 2</xref>) and C (Figure B in <xref ref-type="supplementary-material" rid="pone.0163962.s001">S1 File</xref>). For the computation of the reverse complement sequence (<xref ref-type="fig" rid="pone.0163962.g002">Fig 2A</xref>), one of the most basic sequence manipulations, the execution time mainly depends on the efficiency of the development language, the FASTA/Q parsing and the reverse complementary sequence computing algorithm. In general, execution time inversely correlates with the speed of the programming language. Generally, seqtk written in C, and SeqKit, written in Go, required the least amount of time. The FASTA/Q parsing module of seqtk, klib [<xref ref-type="bibr" rid="pone.0163962.ref009">9</xref>], is highly optimized, which makes it very efficient in terms of execution time and memory usage. Interestingly, while SeqKit and the biogo package[<xref ref-type="bibr" rid="pone.0163962.ref012">12</xref>] were both written in Go, SeqKit was approximately 9~11 times faster than the biogo package for FASTA parsing, which indicates the efficiency of the SeqKit algorithm.</p>
<fig id="pone.0163962.g002" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0163962.g002</object-id>
<label>Fig 2</label>
<caption>
<title>Performance comparison on five manipulations of FASTA file.</title>
<p>Dataset A consists of 67,748 DNA sequences with average length of 41 Kb and dataset B is the human genome with 24 chromosomes, one mitochondrial sequence and 169 scaffolds. All tests were repeated three times, and the average time or memory usage was computed. See supplementary data for details of test data and commands.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0163962.g002" xlink:type="simple"/>
</fig>
<p>SeqKit required far less time than all other software with reasonable memory usage for searching sequences by the ID list (<xref ref-type="fig" rid="pone.0163962.g002">Fig 2B</xref>). When a FASTQ file was used (Figure B in <xref ref-type="supplementary-material" rid="pone.0163962.s001">S1 File</xref>), the performance of SeqKit did not change, while the performance of fasta_utilities and seqmagick decreased dramatically. When sampling by sequence number (<xref ref-type="fig" rid="pone.0163962.g002">Fig 2C</xref> and Figure B in <xref ref-type="supplementary-material" rid="pone.0163962.s001">S1 File</xref>), seqtk and Seqkit showed similar computational speeds. However, seqmagick used far more memory than seqtk and SeqKit because it read the whole file into memory, which may exhaust system memory when using larger datasets.</p>
<p>Only two software packages supported removing duplicate sequences by sequence content. SeqKit ran much faster than seqmagick and used less memory (<xref ref-type="fig" rid="pone.0163962.g002">Fig 2D</xref> and Figure B in <xref ref-type="supplementary-material" rid="pone.0163962.s001">S1 File</xref>). When getting subsequences from BED files, SeqKit and seqtk performed similarly in speed but used more memory (<xref ref-type="fig" rid="pone.0163962.g002">Fig 2E</xref>).</p>
<p>Since SeqKit used more memory than seqtk in all cases, we assessed the memory usage of SeqKit on different scales of data. To this end, four tests were performed on a series of files generated by repeating human chromosome 1 N times and renaming each sequence with unique identifiers. In tests of computing reverse complementary sequences and removing duplicated sequences by content, the memory usage increased with file size and stayed at approximately 780 Mb (<xref ref-type="fig" rid="pone.0163962.g003">Fig 3A and 3B</xref>). Similarly, when the FASTA index was used to access FASTA sequences for shuffling and sorting, the peak memory stayed at approximately 750 Mb. These results showed that the peak memory usage of SeqKit is determined by the length of the longest sequence record. Considering the efficiency both in time and memory, SeqKit can meet the need for efficient manipulations of large FASTA and FASTQ files with the growth of data size.</p>
<fig id="pone.0163962.g003" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0163962.g003</object-id>
<label>Fig 3</label>
<caption>
<title>Performance of SeqKit on different data sizes.</title>
<p>The text label represents file size relative to the human genome chromosome 1 (248,956,422 bp, file size: 241.4 Mb). All tests were repeated three times, and the average time or memory usage was computed. See supplementary data for details of test data and commands.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0163962.g003" xlink:type="simple"/>
</fig>
</sec>
<sec id="sec010">
<title>Limitations</title>
<p>Although SeqKit seamlessly supports both FASTA and FASTQ format, most of the subcommands were designed to handle common manipulations. Some manipulations of FASTQ, such as trimming low-quality reads, were not included. SeqKit supports the inter-conversion of three file types, including FASTQ-FASTA and FASTA/Q-tabular format. Other next-generation sequencing formats like BAM/SAM can be converted to FASTQ using tools like bamtofastq of bedtools [<xref ref-type="bibr" rid="pone.0163962.ref013">13</xref>], which then can be processed by SeqKit.</p>
</sec>
</sec>
<sec id="sec011">
<title>Supporting Information</title>
<supplementary-material id="pone.0163962.s001" mimetype="application/pdf" position="float" xlink:href="info:doi/10.1371/journal.pone.0163962.s001" xlink:type="simple">
<label>S1 File</label>
<caption>
<title>SeqKit supplementary data 1.</title>
<p>Benchmark details and results.</p>
<p>(PDF)</p>
</caption>
</supplementary-material>
<supplementary-material id="pone.0163962.s002" mimetype="application/zip" position="float" xlink:href="info:doi/10.1371/journal.pone.0163962.s002" xlink:type="simple">
<label>S2 File</label>
<caption>
<title>SeqKit supplementary data 2.</title>
<p>All data supporting this article including source code, documents, executable binary files, benchmark scripts and plotting scripts.</p>
<p>(ZIP)</p>
</caption>
</supplementary-material>
</sec>
</body>
<back>
<ack>
<p>The authors thank Lei Zhang (Github ID: jameslz) for testing SeqKit, Jim Hester, author of fasta_utilities, for advice on early performance improvements for FASTA parsing and Brian Bushnell, author of BBMaps, for advice on naming SeqKit and adding accuracy evaluation in benchmarks. We also thank Nicholas C. Wu from the Scripps Research Institute, USA for commenting on the manuscript and Guangchuang Yu from State Key Laboratory of Emerging Infectious Diseases, The University of Hong Kong, HK for advice on the manuscript.</p>
</ack>
<ref-list>
<title>References</title>
<ref id="pone.0163962.ref001"><label>1</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Lipman</surname> <given-names>DJ</given-names></name>, <name name-style="western"><surname>Pearson</surname> <given-names>WR</given-names></name>. <article-title>Rapid and sensitive protein similarity searches</article-title>. <source>Science</source>. <year>1985</year>;<volume>227</volume>(<issue>4693</issue>):<fpage>1435</fpage>–<lpage>41</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="http://dx.doi.org/10.1126/science.2983426" xlink:type="simple">10.1126/science.2983426</ext-link></comment> <object-id pub-id-type="pmid">2983426</object-id>.</mixed-citation></ref>
<ref id="pone.0163962.ref002"><label>2</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Cock</surname> <given-names>PJ</given-names></name>, <name name-style="western"><surname>Fields</surname> <given-names>CJ</given-names></name>, <name name-style="western"><surname>Goto</surname> <given-names>N</given-names></name>, <name name-style="western"><surname>Heuer</surname> <given-names>ML</given-names></name>, <name name-style="western"><surname>Rice</surname> <given-names>PM</given-names></name>. <article-title>The Sanger FASTQ file format for sequences with quality scores, and the Solexa/Illumina FASTQ variants</article-title>. <source>Nucleic acids research</source>. <year>2010</year>;<volume>38</volume>(<issue>6</issue>):<fpage>1767</fpage>–<lpage>71</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="http://dx.doi.org/10.1093/nar/gkp1137" xlink:type="simple">10.1093/nar/gkp1137</ext-link></comment> <object-id pub-id-type="pmid">20015970</object-id>; PubMed Central PMCID: PMC2847217.</mixed-citation></ref>
<ref id="pone.0163962.ref003"><label>3</label><mixed-citation publication-type="other" xlink:type="simple">Hester J. A collection of scripts developed to interact with fasta, fastq and sam/bam files. Available from: <ext-link ext-link-type="uri" xlink:href="https://github.com/jimhester/fasta_utilities" xlink:type="simple">https://github.com/jimhester/fasta_utilities</ext-link>.</mixed-citation></ref>
<ref id="pone.0163962.ref004"><label>4</label><mixed-citation publication-type="other" xlink:type="simple">FASTX-Toolkit, FASTQ/A short-reads pre-processing tools. Available from: <ext-link ext-link-type="uri" xlink:href="http://hannonlab.cshl.edu/fastx_toolkit/" xlink:type="simple">http://hannonlab.cshl.edu/fastx_toolkit/</ext-link>.</mixed-citation></ref>
<ref id="pone.0163962.ref005"><label>5</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Shirley</surname> <given-names>MD</given-names></name>, <name name-style="western"><surname>Ma</surname> <given-names>Z</given-names></name>, <name name-style="western"><surname>Pedersen</surname> <given-names>BS</given-names></name>, <name name-style="western"><surname>Wheelan</surname> <given-names>SJ</given-names></name>. <article-title>Efficient "pythonic" access to FASTA files using pyfaidx</article-title>. <source>PeerJ Preprints</source>. <year>2015</year>;<volume>3</volume>:<fpage>e1196</fpage>.</mixed-citation></ref>
<ref id="pone.0163962.ref006"><label>6</label><mixed-citation publication-type="other" xlink:type="simple">seqmagick. Available from: <ext-link ext-link-type="uri" xlink:href="https://http://seqmagick.readthedocs.io/" xlink:type="simple">http://seqmagick.readthedocs.io/</ext-link>.</mixed-citation></ref>
<ref id="pone.0163962.ref007"><label>7</label><mixed-citation publication-type="other" xlink:type="simple">seqtk, Toolkit for processing sequences in FASTA/Q formats. Available from: <ext-link ext-link-type="uri" xlink:href="https://github.com/lh3/seqtk" xlink:type="simple">https://github.com/lh3/seqtk</ext-link>.</mixed-citation></ref>
<ref id="pone.0163962.ref008"><label>8</label><mixed-citation publication-type="other" xlink:type="simple">A lightweight and high-performance bioinformatics package in Go. Available from: <ext-link ext-link-type="uri" xlink:href="https://github.com/shenwei356/bio" xlink:type="simple">https://github.com/shenwei356/bio</ext-link>.</mixed-citation></ref>
<ref id="pone.0163962.ref009"><label>9</label><mixed-citation publication-type="other" xlink:type="simple">A standalone and lightweight C library. Available from: <ext-link ext-link-type="uri" xlink:href="https://github.com/attractivechaos/klib" xlink:type="simple">https://github.com/attractivechaos/klib</ext-link>.</mixed-citation></ref>
<ref id="pone.0163962.ref010"><label>10</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Li</surname> <given-names>H</given-names></name>, <name name-style="western"><surname>Handsaker</surname> <given-names>B</given-names></name>, <name name-style="western"><surname>Wysoker</surname> <given-names>A</given-names></name>, <name name-style="western"><surname>Fennell</surname> <given-names>T</given-names></name>, <name name-style="western"><surname>Ruan</surname> <given-names>J</given-names></name>, <name name-style="western"><surname>Homer</surname> <given-names>N</given-names></name>, <etal>et al</etal>. <article-title>The Sequence Alignment/Map format and SAMtools</article-title>. <source>Bioinformatics</source>. <year>2009</year>;<volume>25</volume>(<issue>16</issue>):<fpage>2078</fpage>–<lpage>9</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="http://dx.doi.org/10.1093/bioinformatics/btp352" xlink:type="simple">10.1093/bioinformatics/btp352</ext-link></comment> <object-id pub-id-type="pmid">19505943</object-id>; PubMed Central PMCID: PMC2723002.</mixed-citation></ref>
<ref id="pone.0163962.ref011"><label>11</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Shen</surname> <given-names>W</given-names></name>, <name name-style="western"><surname>Li</surname> <given-names>Y</given-names></name>. <article-title>A novel algorithm for detecting multiple covariance and clustering of biological sequences</article-title>. <source>Scientific reports</source>. <year>2016</year>;<volume>6</volume>:<fpage>30425</fpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="http://dx.doi.org/10.1038/srep30425" xlink:type="simple">10.1038/srep30425</ext-link></comment> <object-id pub-id-type="pmid">27451921</object-id>.</mixed-citation></ref>
<ref id="pone.0163962.ref012"><label>12</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Kortschak</surname> <given-names>RD</given-names></name>, <name name-style="western"><surname>Adelson</surname> <given-names>DL</given-names></name>. <article-title>bíogo: a simple high-performance bioinformatics toolkit for the Go language</article-title>. <source>BioRxiv Preprint</source>. <year>2015</year>. <ext-link ext-link-type="uri" xlink:href="http://dx.doi.org/10.1101/005033" xlink:type="simple">http://dx.doi.org/10.1101/005033</ext-link>.</mixed-citation></ref>
<ref id="pone.0163962.ref013"><label>13</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Quinlan</surname> <given-names>AR</given-names></name>. <article-title>BEDTools: The Swiss-Army Tool for Genome Feature Analysis</article-title>. <source>Current protocols in Bioinformatics</source>. <year>2014</year>;<volume>47</volume>:<fpage>11 2 1</fpage>–<lpage>34</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="http://dx.doi.org/10.1002/0471250953.bi1112s47" xlink:type="simple">10.1002/0471250953.bi1112s47</ext-link></comment> <object-id pub-id-type="pmid">25199790</object-id>; PubMed Central PMCID: PMC4213956.</mixed-citation></ref>
</ref-list>
</back>
</article>