From f9d549b6b97555f06d42e3589a1e4aaf75716aa9 Mon Sep 17 00:00:00 2001 From: martinahansen Date: Fri, 27 Jun 2008 05:29:57 +0000 Subject: [PATCH] new wiki usage test git-svn-id: http://biopieces.googlecode.com/svn/trunk@54 74ccb610-7750-0410-82ae-013aeee3265d --- bp_doc/00README | 2 + bp_doc/biopieces_cookbook.lyx~ | 7258 +++++++++++++++++++++++++++++++ bp_doc/biotools_cookbook.lyx~ | 7337 ++++++++++++++++++++++++++++++++ bp_doc/chrdist.png | Bin 0 -> 16785 bytes bp_doc/dotplot.png | Bin 0 -> 56457 bytes bp_doc/karyogram.png | Bin 90569 -> 64528 bytes bp_doc/lendist.png | Bin 0 -> 13513 bytes bp_doc/seqlogo.png | Bin 40470 -> 36968 bytes bp_usage/read_fasta.wiki | 82 + code_perl/Maasha/Biopieces.pm | 6 +- 10 files changed, 14682 insertions(+), 3 deletions(-) create mode 100644 bp_doc/00README create mode 100644 bp_doc/biopieces_cookbook.lyx~ create mode 100644 bp_doc/biotools_cookbook.lyx~ create mode 100644 bp_doc/chrdist.png create mode 100644 bp_doc/dotplot.png create mode 100644 bp_doc/lendist.png create mode 100644 bp_usage/read_fasta.wiki diff --git a/bp_doc/00README b/bp_doc/00README new file mode 100644 index 0000000..cdbed61 --- /dev/null +++ b/bp_doc/00README @@ -0,0 +1,2 @@ +# Adding stuff to the wiki, like images and documents +svn co https://biopieces.googlecode.com/svn/wiki wiki --username martinahansen diff --git a/bp_doc/biopieces_cookbook.lyx~ b/bp_doc/biopieces_cookbook.lyx~ new file mode 100644 index 0000000..1090825 --- /dev/null +++ b/bp_doc/biopieces_cookbook.lyx~ @@ -0,0 +1,7258 @@ +#LyX 1.5.1 created this file. For more info see http://www.lyx.org/ +\lyxformat 276 +\begin_document +\begin_header +\textclass scrartcl +\begin_preamble +\usepackage[colorlinks=true, urlcolor=blue, linkcolor=black]{hyperref} +\end_preamble +\language english +\inputencoding auto +\font_roman default +\font_sans default +\font_typewriter default +\font_default_family default +\font_sc false +\font_osf false +\font_sf_scale 100 +\font_tt_scale 100 +\graphics default +\paperfontsize default +\spacing single +\papersize default +\use_geometry false +\use_amsmath 1 +\use_esint 1 +\cite_engine basic +\use_bibtopic false +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation skip +\defskip medskip +\quotes_language english +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\author "" +\author "" +\end_header + +\begin_body + +\begin_layout Title +Biopieces Cookbook +\end_layout + +\begin_layout Author +Martin Asser Hansen +\end_layout + +\begin_layout Publishers +John Mattick Group +\newline +Institute for Molecular Bioscience +\newline +University of Queensland +\newline +Aust +ralia +\newline +E-mail: mail@maasha.dk +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Standard + + +\backslash +thispagestyle{empty} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\newpage + +\end_layout + +\begin_layout Standard +\begin_inset LatexCommand tableofcontents + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FloatList figure + +\end_inset + + +\end_layout + +\begin_layout Standard + +\newpage + +\end_layout + +\begin_layout Section +Introduction +\end_layout + +\begin_layout Standard +Biopieces is a collection of simple tools that can be linked together (piped + as we shall call it) in a very flexible manner to perform both simple and + complex tasks. + The fundamental idea is that biopieces work on a data stream that will + only terminate at the end of an analysis and that this data stream can + be passed through several different biopieces, each performing one specific + task. + The advantage of this approach is that a user can perform simple and complex + tasks without having to write advanced code. + Moreover, since the data format used to pass data between biopieces is + text based, biopieces can be written by different developers in their favorite + programming language --- and still the biopieces will be able to work together. +\end_layout + +\begin_layout Standard +In the most simple form bioools can be piped together on the command line + like this (using the pipe character '|'): +\end_layout + +\begin_layout LyX-Code +read_data | calculate_something | write_result +\end_layout + +\begin_layout Standard +However, a more comprehensive analysis could be composed: +\end_layout + +\begin_layout LyX-Code +read_data | select_entries | convert_entries | search_database +\end_layout + +\begin_layout LyX-Code +evaluate_results | plot_diagram | plot_another_diagram | +\end_layout + +\begin_layout LyX-Code +load_to_database +\end_layout + +\begin_layout Standard +The data stream that is piped through the biopieces consists of records + of key/value pairs in the same way a hash does in order to keep as simple + a structure as possible. + An example record can be seen below: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +REC_TYPE: PATSCAN +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +MATCH: AGATCAAGTG +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +S_BEG: 7 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +S_END: 16 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +ALIGN_LEN: 9 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +S_ID: piR-t6 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +STRAND: + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +PATTERN: AGATCAAGTG +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +--- +\end_layout + +\begin_layout Standard +The ' +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\backslash +/- +\end_layout + +\end_inset + +' denotes the delimiter of the records, and each key is a word followed + by a ':' and a white-space and then the value. + By convention the biopieces only uses upper case keys (a list of used keys + can be seen in Appendix\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sec:Keys" + +\end_inset + +). + Since the records basically are hash structures this mean that the order + of the keys in the stream is unordered, and in the above example it is + pure coincidence that HIT_BEG is displayed before HIT_END, however, when + the order of the keys is importent, the biopieces will automagically see + to that. +\end_layout + +\begin_layout Standard +All of the biopieces are able to read and write a data stream to and from + file as long as the records are in the biopieces format. + This means that if you are undertaking a lengthy analysis where one of + the steps is time consuming, you may save the stream after this step, and + subsequently start one or more analysis from that last step +\begin_inset Foot +status collapsed + +\begin_layout Standard +It is a goal that the biopieces at some point will be able to dump the data + stream to file in case one of the tools fail critically. +\end_layout + +\end_inset + +. + If you are running a lengthy analysis it is highly recommended that you + create a small test sample of the data and run that through the pipeline + --- and once you are satisfied with the result proceed with the full data + set (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-select-a-few-records" + +\end_inset + +). +\end_layout + +\begin_layout Standard +All of the biopieces can be supplied with long arguments prefixed with +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + + switches or single character arguments prefixed with - switches that can + be grouped together (e.g. + -xok). + In this cookbook only the long switches are used to emphasize what these + switches do. +\end_layout + +\begin_layout Section +Setup +\end_layout + +\begin_layout Standard +In order to get the biopieces to work, you need to add environment settings + to include the code binaries, scripts, and modules that constitute the + biopieces package. + Assuming that you are using bash, add the following to your '~/.bashrc' + file using your favorite editor. + After the changes has been saved you need to either run 'source ~/.bashrc' + or relogin. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +if [ -f "/home/m.hansen/maasha/conf/bashrc" ]; then +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + source "/home/m.hansen/maasha/conf/bashrc" +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +fi +\end_layout + +\begin_layout Section +Getting Started +\end_layout + +\begin_layout Standard +The biopiece +\series bold +list_biopieces +\series default + lists all the biopieces along with a description: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +list_biopieces +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +align_seq Align sequences in stream using Muscle. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +analyze_seq Analysis the residue composition of each sequence + in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +analyze_vals Determine type, count, min, max, sum and mean for + values in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +blast_seq BLAST sequences in stream against a specified database. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +blat_seq BLAT sequences in stream against a specified genome. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +complement_seq Complement sequences in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_records Count the number of records in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_seq Count sequences in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_vals Count the number of times values of given keys exists + in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +create_blast_db Create a BLAST database from sequences in stream for + use with BLAST. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +... +\end_layout + +\begin_layout Standard +To list the biopieces for writing different formats, you can use unix's + grep like this: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +list_biopieces | grep write +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_align Write aligned sequences in pretty alignment format. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_bed Write records from stream as BED lines. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_blast Write BLAST records from stream in BLAST tabular format + (-m8 and 9). +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_fasta Write sequences in FASTA format. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_psl Write records from stream in PSL format. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_tab Write records from stream as tab separated table. +\end_layout + +\begin_layout Standard +In order to find out how a specific biopiece works, you just type the program + name without any arguments and press return and the usage of the biopiece + will be displayed. + E.g. + +\series bold +read_fasta +\series default + : +\end_layout + +\begin_layout Standard +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +status open + +\begin_layout LyX-Code + +\size scriptsize +Program name: read_fasta +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Author: Martin Asser Hansen - Copyright (C) - All rights reserved +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Contact: mail@maasha.dk +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Date: August 2007 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +License: GNU General Public License version 2 (http://www.gnu.org/copyleft/ +gpl.html) +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Description: Read FASTA entries. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Usage: read_fasta [options] -i +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Options: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-i | --data_in=] - Comma separated list of files + to read. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-n | --num=] - Limit number of records to read. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-I | --stream_in=] - Read input stream from file + - Default=STDIN +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-O | --stream_out=] - Write output stream to file + - Default=STDOUT +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Examples: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i test.fna - Read FASTA entries from file. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i test1.fna,test2,fna - Read FASTA entries from files. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i '*.fna' - Read FASTA entries from files. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i test.fna -n 10 - Read first 10 FASTA entries from + file. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +The Data Stream +\end_layout + +\begin_layout Subsection +How to read the data stream from file? +\begin_inset LatexCommand label +name "sub:How-to-read-stream" + +\end_inset + + +\end_layout + +\begin_layout Standard +You want to read a data stream that you previously have saved to file in + biopieces format. + This can be done implicetly or explicitly. + The implicit way uses the 'stdout' stream of the Unix terminal: +\end_layout + +\begin_layout LyX-Code +cat | +\end_layout + +\begin_layout Standard +cat is the Unix command that reads a file and output the result to 'stdout' + --- which in this case is piped to any biopiece represented by the . + It is also possible to read the data stream using '<' to direct the 'stdout' + stream into the biopiece like this: +\end_layout + +\begin_layout LyX-Code + < +\end_layout + +\begin_layout Standard +However, that will not work if you pipe more biopieces together. + Then it is much safer to read the stream from a file explicitly like this: +\end_layout + +\begin_layout LyX-Code + --stream_in= +\end_layout + +\begin_layout Standard +Here the filename is explicetly given to the biopiece + with the switch +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_in. + This switch works with all biopieces. + It is also possible to read in data from multiple sources by repeating + the explicit read step: +\end_layout + +\begin_layout LyX-Code + --stream_in= | --stream_in= +\end_layout + +\begin_layout Subsection +How to write the data stream to file? +\begin_inset LatexCommand label +name "sub:How-to-write-stream" + +\end_inset + + +\end_layout + +\begin_layout Standard +In order to save the output stream from a biopiece to file, so you can read + in the stream again at a later time, you can do one of two things: +\end_layout + +\begin_layout LyX-Code + > +\end_layout + +\begin_layout Standard +All, the biopieces write the data stream to 'stdout' by default which can + be written to a file by redirecting 'stdout' to file using '>' , however, + if one of the biopieces for writing other formats is used then the both + the biopieces records as well as the result output will go to 'stdout' + in a mixture causing havock! To avoid this you must use the switch +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_out that explictly tells the biopiece to write the output stream + to file: +\end_layout + +\begin_layout LyX-Code + --stream_out= +\end_layout + +\begin_layout Standard +The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_out switch works with all biopieces. +\end_layout + +\begin_layout Subsection +How to terminate the data stream? +\end_layout + +\begin_layout Standard +The data stream is never stops unless the user want to save the stream or + by supplying the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch that will terminate the stream: +\end_layout + +\begin_layout LyX-Code + --no_stream +\end_layout + +\begin_layout Standard +The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch only works with those biopieces where it makes sense that + the user might want to terminale the data stream, +\emph on +i.e +\emph default +. + after an analysis step where the user wants to output the result, but not + the data stream. +\end_layout + +\begin_layout Subsection +How to write my results to file? +\begin_inset LatexCommand label +name "sub:How-to-write-result" + +\end_inset + + +\end_layout + +\begin_layout Standard +Saving the result of an analysis to file can be done implicitly or explicitly. + The implicit way: +\end_layout + +\begin_layout LyX-Code + --no_stream > +\end_layout + +\begin_layout Standard +If you use '>' to redirect 'stdout' to file then it is important to use + the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch to avoid writing a mix of biopieces records and result + to the same file causing havock. + The safe way is to use the +\begin_inset ERT +status open + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out switch which explicetly tells the biopiece to write the result + to a given file: +\end_layout + +\begin_layout LyX-Code + --result_out= +\end_layout + +\begin_layout Standard +Using the above method will not terminate the stream, so it is possible + to pipe that into another biopiece generating different results: +\end_layout + +\begin_layout LyX-Code + --result_out= | --result_out= +\end_layout + +\begin_layout Standard +And still the data stream will continue unless terminated with +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream: +\end_layout + +\begin_layout LyX-Code + --result_out= --no_stream +\end_layout + +\begin_layout Standard +Or written to file using implicitly or explicity +\begin_inset LatexCommand eqref +reference "sub:How-to-write-result" + +\end_inset + +. + The explicit way: +\end_layout + +\begin_layout LyX-Code + --result_out= --stream_out= +\end_layout + +\begin_layout Subsection +How to read data from multiple sources? +\end_layout + +\begin_layout Standard +To read multiple data sources, with the same type or different type of data + do: +\end_layout + +\begin_layout LyX-Code + --data_in= | --data_in= +\end_layout + +\begin_layout Standard +where type is the data type a specific biopiece reads. +\end_layout + +\begin_layout Section +Reading input +\end_layout + +\begin_layout Subsection +How to read biopieces input? +\end_layout + +\begin_layout Standard +See +\begin_inset LatexCommand eqref +reference "sub:How-to-read-stream" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +How to read in data? +\end_layout + +\begin_layout Standard +Data in different formats can be read with the appropriate biopiece for + that format. + The biopieces are typicalled named 'read_' such as +\series bold +read_fasta +\series default +, +\series bold +read_bed +\series default +, +\series bold +read_tab +\series default +, etc., and all behave in a similar manner. + Data can be read by supplying the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +data_in switch and a file name to the file containing the data: +\end_layout + +\begin_layout LyX-Code + --data_in= +\end_layout + +\begin_layout Standard +It is also possible to read in a saved biopieces stream (see +\begin_inset LatexCommand ref +reference "sub:How-to-read-stream" + +\end_inset + +) as well as reading data in one go: +\end_layout + +\begin_layout LyX-Code + --stream_in= --data_in= +\end_layout + +\begin_layout Standard +If you want to read data from several files you can do this: +\end_layout + +\begin_layout LyX-Code + --data_in= | --data_in= +\end_layout + +\begin_layout Standard +If you have several data files you can read in all explicitly with a comma + separated list: +\end_layout + +\begin_layout LyX-Code + --data_in=file1,file2,file3 +\end_layout + +\begin_layout Standard +And it is also possible to use file globbing +\begin_inset Foot +status open + +\begin_layout Standard +using the short option will only work if you quote the argument -i '*.fna' +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout LyX-Code + --data_in=*.fna +\end_layout + +\begin_layout Standard +Or in a combination: +\end_layout + +\begin_layout LyX-Code + --data_in=file1,/dir/*.fna +\end_layout + +\begin_layout Standard +Finally, it is possible to read in data in different formats using the appropria +te biopiece for each format: +\end_layout + +\begin_layout LyX-Code + --data_in= | --data_in= ... +\end_layout + +\begin_layout Subsection +How to read FASTA input? +\end_layout + +\begin_layout Standard +Sequences in FASTA format can be read explicitly using +\series bold +read_fasta +\series default +: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= +\end_layout + +\begin_layout Subsection +How to read alignment input? +\end_layout + +\begin_layout Standard +If your alignment if FASTA formatted then you can +\series bold +read_align +\series default +. + It is also possible to use +\series bold +read_fasta +\series default + since the data is FASTA formatted, however, with +\series bold +read_fasta +\series default + the key ALIGN will be omitted. + The ALIGN key is used to determine which sequences belong to what alignment + which is required for +\series bold +write_align +\series default +. +\end_layout + +\begin_layout LyX-Code +read_align --data_in= +\end_layout + +\begin_layout Subsection +How to read tabular input? +\begin_inset LatexCommand label +name "sub:How-to-read-table" + +\end_inset + + +\end_layout + +\begin_layout Standard +Tabular input can be read with +\series bold +read_tab +\series default + which will read in all rows and chosen columns (separated by a given delimter) + from a table in text format. +\end_layout + +\begin_layout Standard +The table below: +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Standard +Human +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +ATACGTCAG +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +23524 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Dog +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +AGCATGAC +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +2442 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Mouse +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +GACTG +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +234 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Cat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +AAATGCA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +2342 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Standard +Can be read using the command: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= +\end_layout + +\begin_layout Standard +Which will result in four records, one for each row, where the keys V0, + V1, V2 are the default keys for the organism, sequence, and count, respectively. + It is possible to select a subset of colums to read by using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +cols switch which takes a comma separated list of columns numbers (first + column is designated 0) as argument. + So to read in only the sequence and the count so that the count comes before + the sequence do: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= --cols=2,1 +\end_layout + +\begin_layout Standard +It is also possible to name the columns with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys switch: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= --cols=2,1 --keys=COUNT,SEQ +\end_layout + +\begin_layout Subsection +How to read BED input? +\end_layout + +\begin_layout Standard +The BED (Browser Extensible Data +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://genome.ucsc.edu/FAQ/FAQformat" + +\end_inset + + +\end_layout + +\end_inset + +) format is a tabular format for data pertaining to one of the Eukaryotic + genomes in the UCSC genome brower +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://genome.ucsc.edu/" + +\end_inset + + +\end_layout + +\end_inset + +. + The BED format consists of up to 12 columns, where the first three are + mandatory CHR, CHR_BEG, and CHR_END. + The mandatory columns and any of the optional columns can all be read in + easily with the +\series bold +read_bed +\series default + biopiece. +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= +\end_layout + +\begin_layout Standard +It is also possible to read the BED file with +\series bold +read_tab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-read-table" + +\end_inset + +), however, that will be more cumbersome because you need to specify the + keys: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= --keys=CHR,CHR_BEG,CHR_END ... +\end_layout + +\begin_layout Subsection +How to read PSL input? +\end_layout + +\begin_layout Standard +The PSL format is the output from BLAT and contains 21 mandatory fields + that can be read with +\series bold +read_psl +\series default +: +\end_layout + +\begin_layout LyX-Code +read_psl --data_in= +\end_layout + +\begin_layout Section +Writing output +\end_layout + +\begin_layout Standard +All result output can be written explicitly to file using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out switch which all result generating biopieces have. + It is also possible to write the result to file implicetly by directing + 'stdout' to file using '>', however, that requires the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream swich to prevent a mixture of data stream and results in the file. + The explicit (and safe) way: +\end_layout + +\begin_layout LyX-Code +... + | --result_out= +\end_layout + +\begin_layout Standard +The implicit way: +\end_layout + +\begin_layout LyX-Code +... + | --no_stream > +\end_layout + +\begin_layout Subsection +How to write biopieces output? +\end_layout + +\begin_layout Standard +See +\begin_inset LatexCommand eqref +reference "sub:How-to-write-stream" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +How to write FASTA output? +\begin_inset LatexCommand label +name "sub:How-to-write-fasta" + +\end_inset + + +\end_layout + +\begin_layout Standard +FASTA output can be written with +\series bold +write_fasta +\series default +. +\end_layout + +\begin_layout LyX-Code +... + | write_fasta --result_out= +\end_layout + +\begin_layout Standard +It is also possible to wrap the sequences to a given width using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +wrap switch allthough wrapping of sequence is generally an evil thing: +\end_layout + +\begin_layout LyX-Code +... + | write_fasta --no_stream --wrap=80 +\end_layout + +\begin_layout Subsection +How to write alignment output? +\begin_inset LatexCommand label +name "sub:How-to-write-alignment" + +\end_inset + + +\end_layout + +\begin_layout Standard +Pretty alignments with ruler +\begin_inset Foot +status collapsed + +\begin_layout Standard +'.' for every 10 residues, ':' for every 50, and '|' for every 100 +\end_layout + +\end_inset + + and consensus sequence +\begin_inset Note Note +status collapsed + +\begin_layout Standard +which reminds me to make that an option. +\end_layout + +\end_inset + + can be created with +\series bold +write_align +\series default +, what also have the optional +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +wrap switch to break the alignment into blocks of a given width: +\end_layout + +\begin_layout LyX-Code +... + | write_align --result_out= --wrap=80 +\end_layout + +\begin_layout Standard +If the number of sequnces in the alignment is 2 then a pairwise alignment + will be output otherwise a multiple alignment. + And if the sequence type, determined automagically, is protein, then residues + and symbols (+,\InsetSpace ~ +:,\InsetSpace ~ +.) will be used to show consensus according to the Blosum62 + matrix. +\end_layout + +\begin_layout Subsection +How to write tabular output? +\begin_inset LatexCommand label +name "sub:How-to-write-tab" + +\end_inset + + +\end_layout + +\begin_layout Standard +Outputting the data stream as a table can be done with +\series bold +write_tab +\series default +, which will write generate one row per record with the values as columns. + If you supply the optional +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +comment switch, when the first row in the table will be a 'comment' line + prefixed with a '#': +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --comment +\end_layout + +\begin_layout Standard +You can also change the delimiter from the default (tab) to +\emph on +e.g. + +\emph default + ',': +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --delimit=',' +\end_layout + +\begin_layout Standard +If you want the values output in a specific order you have to supply a comma + separated list using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys switch that will print only those keys in that order: +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --keys=SEQ_NAME,COUNT +\end_layout + +\begin_layout Standard +Alternatively, if you have some keys that you don't want in the tabular + output, use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_keys switch. + So to print all keys except SEQ and SEQ_TYPE do: +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --no_keys=SEQ,SEQ_TYPE +\end_layout + +\begin_layout Standard +Finally, if you have a stream containing a mix of different records types, + +\emph on +e.g. + +\emph default + records with sequences and records with matches, then you can use +\series bold +write_tab +\series default + to output all the records in tabluar format, however, the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +comment, +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys, and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_keys switches will only respond to records of the first type encountered. + The reason is that outputting mixed records is probably not what you want + anyway, and you should remove all the unwanted records from the stream + before outputting the table: +\series bold +grab +\series default + is your friend (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-grab" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to write a BED output? +\begin_inset LatexCommand label +name "sub:How-to-write-BED" + +\end_inset + + +\end_layout + +\begin_layout Standard +Data in BED format can be output if the records contain the mandatory keys + CHR, CHR_BEG, and CHR_END using +\series bold +write_bed +\series default +. + If the optional keys are also present, they will be output as well: +\end_layout + +\begin_layout LyX-Code +write_bed --result_out= +\end_layout + +\begin_layout Subsection +How to write PSL output? +\begin_inset LatexCommand label +name "sub:How-to-write-PSL" + +\end_inset + + +\end_layout + +\begin_layout Standard +Data in PSL format can be output using +\series bold +write_psl: +\end_layout + +\begin_layout LyX-Code +write_psl --result_out= +\end_layout + +\begin_layout Section +Manipulating Records +\end_layout + +\begin_layout Subsection +How to select a few records? +\begin_inset LatexCommand label +name "sub:How-to-select-a-few-records" + +\end_inset + + +\end_layout + +\begin_layout Standard +To quickly get an overview of your data you can limit the data stream to + show a few records. + This also very useful to test the pipeline with a few records if you are + setting up a complex analysis using several biopieces. + That way you can inspect that all goes well before analyzing and waiting + for the full data set. + All of the read_ biopieces have the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num switch which will take a number as argument and only that number of + records will be read. + So to read in the first 10 FASTA entries from a file: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna --num=10 +\end_layout + +\begin_layout Standard +Another way of doing this is to use +\series bold +head_records +\series default + will limit the stream to show the first 10 records (default): +\end_layout + +\begin_layout LyX-Code +... + | head_records +\end_layout + +\begin_layout Standard +Using +\series bold +head_records +\series default + directly after one of the read_ biopieces will be a lot slower than + using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num switch with the read_ biopieces, however, +\series bold +head_records +\series default + can also be used to limit the output from all the other biopieces. + It is also possible to give +\series bold +head_records +\series default + a number of records to show using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num switch. + So to display the first 100 records do: +\end_layout + +\begin_layout LyX-Code +... + | head_records --num=100 +\end_layout + +\begin_layout Subsection +How to select random records? +\begin_inset LatexCommand label +name "sub:How-to-select-random-records" + +\end_inset + + +\end_layout + +\begin_layout Standard +If you want to inspect a number of random records from the stream this can + be done with the +\series bold +random_records +\series default + biopiece. + So if you have 1 mio records in the stream and you want to select 1000 + random records do: +\end_layout + +\begin_layout LyX-Code +... + | random_records --num=1000 +\end_layout + +\begin_layout Subsection +How to count all records in the data stream? +\end_layout + +\begin_layout Standard +To count all the records in the data stream use +\series bold +count_records +\series default +, which adds one record (which is not included in the count) to the data + stream. + So to count the number of sequences in a FASTA file you can do this: +\end_layout + +\begin_layout LyX-Code +cat test.fna | read_fasta | count_records --no_stream +\end_layout + +\begin_layout Standard +Which will write the last record containing the count to 'stdout': +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_records: 630 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +--- +\end_layout + +\begin_layout Standard +It is also possible to write the count to file using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out switch. +\end_layout + +\begin_layout Subsection +How to get the length of record values? +\begin_inset LatexCommand label +name "sub:How-to-get-value_length" + +\end_inset + + +\end_layout + +\begin_layout Standard +Use the +\series bold +length_vals +\series default + biopiece to get the length of each value for a comma separated list of + keys: +\end_layout + +\begin_layout LyX-Code +... + | length_vals --keys=HIT,PATTERN +\end_layout + +\begin_layout Subsection +How to grab specific records? +\begin_inset LatexCommand label +name "sub:How-to-grab" + +\end_inset + + +\end_layout + +\begin_layout Standard +The biopiece +\series bold +grab +\series default + is related to the Unix grep and locates records based on matching keys + and/or values using either a pattern, a Perl regex, or a numerical evaluation. + To easily +\series bold +grab +\series default + all records in the stream that has any mentioning of the pattern 'human' + just pipe the data stream through +\series bold +grab +\series default + like this: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human +\end_layout + +\begin_layout Standard +This will search for the pattern 'human' in all keys and all values. + The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern switch takes a comma separated list of patterns, so in order to + match multiple patterns do: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human,mouse +\end_layout + +\begin_layout Standard +It is also possible to use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in switch instead of +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern. + +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in is used to read a file with one pattern per line: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern_in=patterns.txt +\end_layout + +\begin_layout Standard +If you want the opposite result --- to find all records that does not match + the patterns, add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +invert switch, which not only works with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern switch, but also with +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +regex and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +eval: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human --invert +\end_layout + +\begin_layout Standard +If you want to search the record keys only, +\emph on +e.g. + +\emph default + to find all records containing the key SEQ you can add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys_only switch. + This will prevent matching of SEQ in any record value, and in fact SEQ + is a not uncommon peptide sequence you could get an unwanted record. + Also, this will give an increase in speed since only the keys are searched: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=SEQ --keys_only +\end_layout + +\begin_layout Standard +However, if you are interested in finding the peptide sequence SEQ and not + the SEQ key, just add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +vals_only switch instead: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=SEQ --vals_only +\end_layout + +\begin_layout Standard +Also, if you want to grab for certain key/value pairs you can supply a comma + separated list of keys whos values will then be searched using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys switch. + This is handy if your records contain large genomic sequences and you dont + want to search the entire sequence for +\emph on +e.g. + +\emph default + the organism name --- it is much faster to tell +\series bold +grab +\series default + which keys to search the value for: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human --keys=SEQ_NAME +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout Standard +It is also possible to invoke flexible matching using regex (regular expressions +) instead of simple pattern matching. + In +\series bold +grab +\series default + the regex engine is Perl based and allows use of different type of wild + cards, alternatives, +\emph on +etc +\emph default + +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://perldoc.perl.org/perlreref.html" + +\end_inset + + +\end_layout + +\end_inset + +. + If you want to +\series bold +grab +\series default + records withs the sequence ATCG or GCTA you can do this: +\end_layout + +\begin_layout LyX-Code +... + | grab --regex='ATCG|GCTA' +\end_layout + +\begin_layout Standard +Or if you want to find sequences beginning with ATCG: +\end_layout + +\begin_layout LyX-Code +... + | grab --regex='^ATCG' +\end_layout + +\begin_layout Standard +You can also use +\series bold +grab +\series default + to locate records that fulfill a numerical property using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +eval switch witch takes an expression in three parts. + The first part is the key that holds the value we want to evaluate, the + second part holds one the six operators: +\end_layout + +\begin_layout Enumerate +Greater than: > +\end_layout + +\begin_layout Enumerate +Greater than or equal to: >= +\end_layout + +\begin_layout Enumerate +Less than: < +\end_layout + +\begin_layout Enumerate +Less than or equal to: <= +\end_layout + +\begin_layout Enumerate +Equal to: = +\end_layout + +\begin_layout Enumerate +Not equal to: != +\end_layout + +\begin_layout Enumerate +String wise equal to: eq +\end_layout + +\begin_layout Enumerate +String wise not equal to: ne +\end_layout + +\begin_layout Standard +And finally comes the number used in the evaluation. + So to +\series bold +grab +\series default + all records with a sequence length greater than 30: +\end_layout + +\begin_layout LyX-Code +... + length_seq | grab --eval='SEQ_LEN > 30' +\end_layout + +\begin_layout Standard +If you want to locate all records containing the pattern 'human' and where + the sequence length is greater that 30, you do this by running the stream + through +\series bold +grab +\series default + twice: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern='human' | length_seq | grab --eval='SEQ_LEN > 30' +\end_layout + +\begin_layout Standard +Finally, it is possible to do fast matching of expressions from a file using + the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +exact switch. + Each of these expressions has to be matched exactly over the entrie length, + which if useful if you have a file with accession numbers, that you want + to locate in the stream: +\end_layout + +\begin_layout LyX-Code +... + | grab --exact acc_no.txt | ... +\end_layout + +\begin_layout Standard +Using +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +exact is much faster than using +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in, because with +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +exact the expression has to be complete matches, where +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in looks for subpatterns. +\end_layout + +\begin_layout Standard +NB! To get the best speed performance, use the most restrictive +\series bold +grab +\series default + first. +\end_layout + +\begin_layout Subsection +How to remove keys from records? +\end_layout + +\begin_layout Standard +To remove one or more specific keys from all records in the data stream + use +\series bold +remove_keys +\series default + like this: +\end_layout + +\begin_layout LyX-Code +... + | remove_keys --keys=SEQ,SEQ_NAME +\end_layout + +\begin_layout Standard +In the above example SEQ and SEQ_NAME will be removed from all records if + they exists in these. + If all keys are removed from a record, then the record will be removed. +\end_layout + +\begin_layout Subsection +How to rename keys in records? +\end_layout + +\begin_layout Standard +Sometimes you want to rename a record key, +\emph on +e.g. + +\emph default + if you have read in a two column table with sequence name and sequence + in each column (see +\begin_inset LatexCommand ref +reference "sub:How-to-read-table" + +\end_inset + +) without specifying the key names, then the sequence name will be called + V0 and the sequence V1 as default in the +\series bold +read_tab +\series default + biopiece. + To rename the V0 and V1 keys we need to run the stream through +\series bold +rename_keys +\series default + twice (one for each key to rename): +\end_layout + +\begin_layout LyX-Code +... + | rename_keys --keys=V0,SEQ_NAME | rename_keys --keys=V1,SEQ +\end_layout + +\begin_layout Standard +The first instance of +\series bold +rename_keys +\series default + replaces all the V0 keys with SEQ_NAME, and the second instance of +\series bold +rename_keys +\series default + replaces all the V1 keys with SEQ. + +\emph on +Et viola +\emph default + the data can now be used in the biopieces that requires these keys. +\end_layout + +\begin_layout Section +Manipulating Sequences +\end_layout + +\begin_layout Subsection +How to get sequence lengths? +\end_layout + +\begin_layout Standard +The length for sequences in records can be determined with +\series bold +length_seq +\series default +, which adds the key SEQ_LEN to each record with the sequence length as + the value. + It also generates an extra record that is emitted last with the key TOTAL_SEQ_L +EN showing the total length of all the sequences. +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_seq +\end_layout + +\begin_layout Standard +It is also possible to determine the sequence length using the generic tool + +\series bold +length_vals +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-get-value_length" + +\end_inset + +, which determines the length of the values for a given list of keys: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_vals --keys=SEQ +\end_layout + +\begin_layout Standard +To obtain the total length of all sequences use +\series bold +sum_vals +\series default + like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_vals --keys=SEQ +\end_layout + +\begin_layout LyX-Code +| sum_vals --keys=SEQ_LEN +\end_layout + +\begin_layout Standard +The biopiece +\series bold +analyze_seq +\series default + will also determine the length of each sequence (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-analyze" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to analyze sequence composition? +\begin_inset LatexCommand label +name "sub:How-to-analyze" + +\end_inset + + +\end_layout + +\begin_layout Standard +If you want to find out the sequence type, composition, length, as well + as GC content, indel content and proportions of soft and hard masked sequence, + then use +\series bold +analyze_seq +\series default +. + This handy biopiece will determine all these things per sequence from which + it is easy to get an overview using the +\series bold +write_tab +\series default + biopiece to output a table (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-tab" + +\end_inset + +). + So in order to determine the sequence composition of a FASTA file with + just one entry containing the sequence 'ATCG' we just read the data with + +\series bold +read_fasta +\series default + and run the output through +\series bold +analyze_seq +\series default + which will add the analysis to the record like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq ... +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:D: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +MIX_INDEX: 0.55 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:W: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:G: 16 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SOFT_MASK%: 63.75 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:B: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:V: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +HARD_MASK%: 0.00 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:H: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:S: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:N: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:.: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +GC%: 35.00 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:A: 8 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:Y: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:M: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:T: 44 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SEQ_TYPE: DNA +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:K: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:~: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SEQ: TTTCAGTTTGGGACGGAGTAAGGCCTTCCtttttttttttttttttttttttttttttgagaccgagtcttgctc +tgtcg +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SEQ_LEN: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +80 RES:R: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:C: 12 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:-: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:U: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +--- +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout Standard +Now to make a table of how may As, Ts, Cs, and Gs you can add the following: +\end_layout + +\begin_layout LyX-Code +... + | analyze_seq | write_tab --keys=RES:A,RES:T,RES:C,RES:G +\end_layout + +\begin_layout Standard +Or if you want to see the proportions of hard and soft masked sequence: +\end_layout + +\begin_layout LyX-Code +... + | analyse_seq | write_tab --keys=HARD_MASK%,SOFT_MASK% +\end_layout + +\begin_layout Standard +If you have a stack of sequences in one file and you want to determine the + mean GC content you can do it using the +\series bold +mean_vals +\series default + biopiece: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq | mean_vals --keys=GC% +\end_layout + +\begin_layout Standard +Or if you want the total count of Ns you can use +\series bold +sum_vals +\series default + like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq | sum_vals --keys=RES:N +\end_layout + +\begin_layout Standard +The MIX_INDEX key is calculated as the count of the most common residue + over the sequence length, and can be used as a cut-off for removing sequence + tags consisting of mostly one nucleotide: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq | grab --eval='MIX_INDEX<0.85' +\end_layout + +\begin_layout Subsection +How to extract subsequences? +\begin_inset LatexCommand label +name "sub:How-to-extract" + +\end_inset + + +\end_layout + +\begin_layout Standard +In order to extract a subsequence from a longer sequence use the biopiece + extract_seq, which will replace the sequence in the record with the subsequence + (this behaviour should probably be modified to be dependant of a +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +replace or a +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_replace switch +\begin_inset Note Note +status collapsed + +\begin_layout Standard +also in split_seq +\end_layout + +\end_inset + +). + So to extract the first 20 residues from all sequences do (first residue + is designated 1): +\end_layout + +\begin_layout LyX-Code +... + | extract_seq --beg=1 --len=20 +\end_layout + +\begin_layout Standard +You can also specify a begin and end coordinate set: +\end_layout + +\begin_layout LyX-Code +... + | extract_seq --beg=20 --end=40 +\end_layout + +\begin_layout Standard +If you want the subsequences from position 20 to the sequence end do: +\end_layout + +\begin_layout LyX-Code +... + | extract_seq --beg=20 +\end_layout + +\begin_layout Standard +If you want to extract subsequences a given distance from the sequence end + you can do this by reversing the sequence with the biopiece +\series bold +reverse_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-reverse-seq" + +\end_inset + +, followed by +\series bold +extract_seq +\series default + to get the subsequence, and then +\series bold +reverse_seq +\series default + again to get the subsequence back in the original orientation: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | reverse_seq +\end_layout + +\begin_layout LyX-Code +| extract_seq --beg=10 --len=10 | reverse_seq +\end_layout + +\begin_layout Subsection +How to get genomic sequence? +\begin_inset LatexCommand label +name "sub:How-to-get-genomic-sequence" + +\end_inset + + +\end_layout + +\begin_layout Standard +The biopiece +\series bold +get_genomic_seq +\series default + can extract subsequences for a given genome specified with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +genome switch explicitly using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +beg and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +end/ +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +len switches: +\end_layout + +\begin_layout LyX-Code +get_genome_seq --genome= --beg=1 --len=100 +\end_layout + +\begin_layout Standard +Alternatively, +\series bold +get_genome_seq +\series default + can be used to append the corresponding sequence to BED, PSL, and BLAST + records: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= | get_genome_seq --genome= +\end_layout + +\begin_layout Standard +It is also possible to include flaking sequence using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +flank switch. + So to include 50 nucleotides upstream and 50 nucleotides downstream for + each BED entry do: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= | get_genome_seq --genome= --flank=50 +\end_layout + +\begin_layout Subsection +How to upper-case sequences? +\end_layout + +\begin_layout Standard +Sequences can be shifted from lower case to upper case using +\series bold +uppercase_seq +\series default +: +\end_layout + +\begin_layout LyX-Code +... + | uppercase_seq +\end_layout + +\begin_layout Subsection +How to reverse sequences? +\begin_inset LatexCommand label +name "sub:How-to-reverse-seq" + +\end_inset + + +\end_layout + +\begin_layout Standard +The order of residues in a sequence can be reversed using reverse_seq: +\end_layout + +\begin_layout LyX-Code +... + | reverse_seq +\end_layout + +\begin_layout Standard +Note that in order to reverse/complement a sequence you also need the +\series bold +complement_seq +\series default + biopiece (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-complement" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to complement sequences? +\begin_inset LatexCommand label +name "sub:How-to-complement" + +\end_inset + + +\end_layout + +\begin_layout Standard +DNA and RNA sequences can be complemented with +\series bold +complement_seq +\series default +, which automagically determines the sequence type: +\end_layout + +\begin_layout LyX-Code +... + | complement_seq +\end_layout + +\begin_layout Standard +Note that in order to reverse/complement a sequence you also need the +\series bold +reverse_seq +\series default + biopiece (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-reverse-seq" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to remove indels from sequnces? +\end_layout + +\begin_layout Standard +Indels can be removed from sequences with the +\series bold +remove_indels +\series default + biopiece. + This is useful if you have aligned some sequences (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-align" + +\end_inset + +) and extracted (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-extract" + +\end_inset + +) a block of subsequences from the alignment and you want to use these sequence + in a search where you need to remove the indels first. + '-', '~', and '.' are considered indels: +\end_layout + +\begin_layout LyX-Code +... + | remove_indels +\end_layout + +\begin_layout Subsection +How to shuffle sequences? +\end_layout + +\begin_layout Standard +All residues in sequences in the stream can be shuffled to random positions + using the +\series bold +shuffle_seq +\series default + biopiece: +\end_layout + +\begin_layout LyX-Code +... + | shuffle_seq +\end_layout + +\begin_layout Subsection +How to split sequences into overlapping subsequences? +\end_layout + +\begin_layout Standard +Sequences can be slit into overlapping subsequences with the +\series bold +split_seq +\series default + biopiece. +\end_layout + +\begin_layout LyX-Code +... + | split_seq --word_size=20 --uniq +\end_layout + +\begin_layout Subsection +How to determine the oligo frequency? +\end_layout + +\begin_layout Standard +In order to determine if any oligo usage is over represented in one or more + sequences you can determine the frequency of oligos of a given size with + +\series bold +oligo_freq +\series default +: +\end_layout + +\begin_layout LyX-Code +... + | oligo_freq --word_size=4 +\end_layout + +\begin_layout Standard +And if you have more than one sequence and want to accumulate the frequences + you need the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +all switch: +\end_layout + +\begin_layout LyX-Code +... + | oligo_freq --word_size=4 --all +\end_layout + +\begin_layout Standard +To get a meaningful result you need to write the resulting frequencies as + a table with +\series bold +write_tab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-tab" + +\end_inset + +), but first it is important to +\series bold +grab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-grab" + +\end_inset + +) the records with the frequencies to avoid full length sequences in the + table: +\end_layout + +\begin_layout LyX-Code +... + | oligo_freq --word_size=4 --all | grab --pattern=OLIGO --keys_only +\end_layout + +\begin_layout LyX-Code +| write_tab --no_stream +\end_layout + +\begin_layout Standard +And the resulting frequency table can be sorted with Unix sort (man sort). +\end_layout + +\begin_layout Subsection +How to search for sequences in genomes? +\end_layout + +\begin_layout Standard +See the following biopiece: +\end_layout + +\begin_layout Itemize + +\series bold +patscan_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-patscan" + +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +blat_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAT" + +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +blast_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAST" + +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +vmatch_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-Vmatch" + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to search sequences for a pattern? +\begin_inset LatexCommand label +name "sub:How-to-use-patscan" + +\end_inset + + +\end_layout + +\begin_layout Standard +It is possible to search sequences in the data stream for patterns using + the +\series bold +patscan_seq +\series default + biopiece which utilizes the powerful scan_for_matches engine. + Consult the documentation for scan_for_matches in order to learn how to + define patterns (the documentation is included in Appendix\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sec:scan_for_matches-README" + +\end_inset + +). +\end_layout + +\begin_layout Standard +To search all sequences for a simple pattern consisting of the sequence + ATCGATCG allowing for 3 mismatches, 2 insertions and 1 deletion: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | patscan_seq --pattern='ATCGATCG[3,2,1]' +\end_layout + +\begin_layout Standard +The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern switch takes a comma seperated list of patterns, so if you want + to search for more that one pattern do: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern='ATCGATCG[3,2,1],GCTAGCTA[3,2,1]' +\end_layout + +\begin_layout Standard +It is also possible to have a list of different patterns to search for in + a file with one pattern per line. + In order to get +\series bold +patscan_seq +\series default + to read these patterns use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in switch: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern_in= +\end_layout + +\begin_layout Standard +To also scan the complementary strand in nucleotide sequences ( +\series bold +patscan_seq +\series default + automagically determines the sequence type) you need to add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +comp switch: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern= --comp +\end_layout + +\begin_layout Standard +It is also possible to use +\series bold +patscan_seq +\series default + to output those records that does not contain a certain pattern by using + the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +invert switch: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern= --invert +\end_layout + +\begin_layout Standard +Finally, +\series bold +patscan_seq +\series default + can also scan for patterns in a given genome sequence, instead of sequences + in the stream, using the +\begin_inset ERT +status open + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +genome switch: +\end_layout + +\begin_layout LyX-Code +patscan --pattern= --genome= +\end_layout + +\begin_layout Subsection +How to use BLAT for sequence search? +\begin_inset LatexCommand label +name "sub:How-to-use-BLAT" + +\end_inset + + +\end_layout + +\begin_layout Standard +Sequences in the data stream can be matched against supported genomes using + +\series bold +blat_seq +\series default + which is a biopiece using BLAT as the name might suggest. + Currently only Mouse and Human genomes are available and it is not possible + to use OOC files since there is still a need for a local repository for + genome files. + Otherwise it is just: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | blat_seq --genome= +\end_layout + +\begin_layout Standard +The search results can then be written to file with +\series bold +write_psl +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-PSL" + +\end_inset + +) or +\series bold +write_bed +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-BED" + +\end_inset + +) allthough with +\series bold +write_bed +\series default + some information will be lost). + It is also possible to plot chromosome distribution of the search results + using +\series bold +plot_chrdist +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-plot-chrdist" + +\end_inset + +) or the distribution of the match lengths using +\series bold +plot_lendist +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-plot-lendist" + +\end_inset + +) or a karyogram with the hits using +\series bold +plot_karyogram +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-plot-karyogram" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to use BLAST for sequence search? +\begin_inset LatexCommand label +name "sub:How-to-use-BLAST" + +\end_inset + + +\end_layout + +\begin_layout Standard +Two biopieces exist for blasting sequences: +\series bold +create_blast_db +\series default + is used to create the BLAST database required for BLAST which is queried + using the biopiece +\series bold +blast_seq +\series default +. + So in order to create a BLAST database from sequences in the data stream + you simple run: +\end_layout + +\begin_layout LyX-Code +... + | create_blast_db --database=my_database --no_stream +\end_layout + +\begin_layout Standard +The type of sequence to use for the database is automagically determined + by +\series bold +create_blast_db +\series default +, but don't have a mixture of peptide and nucleic acids sequences in the + stream. + The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +database switch takes a path as argument, but will default to 'blastdb_ if not set. +\end_layout + +\begin_layout Standard +The resulting database can now be queried with sequences in another data + stream using +\series bold +blast_seq +\series default +: +\end_layout + +\begin_layout LyX-Code +... + | blast_seq --database=my_database +\end_layout + +\begin_layout Standard +Again, the sequence type is determined automagically and the appropriate + BLAST program is guessed (see below table), however, the program name can + be overruled with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +program switch. +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Standard +Subject sequence +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Query sequence +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Program guess +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +blastn +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +blastp +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +blastx +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +tblastn +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Standard +Finally, it is also possible to use +\series bold +blast_seq +\series default + for blasting sequences agains a preformatted genome using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +genome switch instead of the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +database switch: +\end_layout + +\begin_layout LyX-Code +... + | blast_seq --genome= +\end_layout + +\begin_layout Subsection +How to use Vmatch for sequence search? +\begin_inset LatexCommand label +name "sub:How-to-use-Vmatch" + +\end_inset + + +\end_layout + +\begin_layout Standard +The powerful suffix array software package Vmatch +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://www.vmatch.de/" + +\end_inset + + +\end_layout + +\end_inset + + can be used for exact mapping of sequences against indexed genomes using + the biopiece +\series bold +vmatch_seq +\series default +, which will e.g. + map 700000 ESTs to the human genome locating all 160 mio hits in less than + an hour. + Only nucleotide sequences and sequences longer than 11 nucleotides will + be mapped. + It is recommended that sequences consisting of mostly one nucleotide type + are removed. + This can be done with the +\series bold +analyze_seq +\series default + biopiece +\begin_inset LatexCommand eqref +reference "sub:How-to-analyze" + +\end_inset + +. +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= +\end_layout + +\begin_layout Standard +It is also possible to allow for mismatches using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +hamming_dist switch. + So to allow for 2 mismatches: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=2 +\end_layout + +\begin_layout Standard +Or to allow for 10% mismathing nucleotides: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=10p +\end_layout + +\begin_layout Standard +To allow both indels and mismatches use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +edit_dist switch. + So to allow for one mismatch or one indel: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=1 +\end_layout + +\begin_layout Standard +Or to allow for 5% indels or mismatches: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=5p +\end_layout + +\begin_layout Standard +Note that using +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +hamming_dist or +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +edit_dist greatly slows down vmatch considerably --- use with care. +\end_layout + +\begin_layout Standard +The resulting SCORE key can be replaced to hold the number of genome matches + of a given sequence (multi-mappers) is the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +count switch is given. +\end_layout + +\begin_layout Subsection +How to find all matches between sequences? +\begin_inset LatexCommand label +name "sub:How-to-find-matches" + +\end_inset + + +\end_layout + +\begin_layout Standard +All matches between two sequences can be determined with the biopiece +\series bold +match_seq +\series default +. + The match finding engine underneath the hood of +\series bold +match_seq +\series default + is the super fast suffix tree program MUMmer +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://mummer.sourceforge.net/" + +\end_inset + + +\end_layout + +\end_inset + +, which will locate all forward and reverse matches between huge sequences + in a matter of minutes (if the repeat count is not too high and if the + word size used is appropriate). + Matching two +\emph on +Helicobacter pylori +\emph default + genomes (1.7Mbp) takes around 10 seconds: +\end_layout + +\begin_layout LyX-Code +... + | match_seq --word_size=20 --direction=both +\end_layout + +\begin_layout Standard +The output from +\series bold +match_seq +\series default + can be used to generate a dot plot with +\series bold +plot_matches +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-generate-dotplot" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to align sequences? +\begin_inset LatexCommand label +name "sub:How-to-align" + +\end_inset + + +\end_layout + +\begin_layout Standard +Sequences in the stream can be aligned with the +\series bold +align_seq +\series default + biopiece that uses Muscle +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://www.drive5.com/muscle/muscle.html" + +\end_inset + + +\end_layout + +\end_inset + + as aligment engine. + Currently you cannot change any of the Muscle alignment parameters and + +\series bold +align_seq +\series default + will create an alignment based on the defaults (which are really good!): +\end_layout + +\begin_layout LyX-Code +... + | align_seq +\end_layout + +\begin_layout Standard +The aligned output can be written to file in FASTA format using +\series bold +write_fasta +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-fasta" + +\end_inset + +) or in pretty text using +\series bold +write_align +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-alignment" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to create a weight matrix? +\end_layout + +\begin_layout Standard +If you want a weight matrix to show the sequence composition of a stack + of sequences you can use the biopiece create_weight_matrix: +\end_layout + +\begin_layout LyX-Code +... + | create_weight_matrix +\end_layout + +\begin_layout Standard +The result can be output in percent using the +\begin_inset ERT +status open + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +percent switch: +\end_layout + +\begin_layout LyX-Code +... + | create_weight_matrix --percent +\end_layout + +\begin_layout Standard +The weight matrix can be written as tabular output with +\series bold +write_tab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-tab" + +\end_inset + +) after removeing the records containing SEQ with +\series bold +grab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-grab" + +\end_inset + +): +\end_layout + +\begin_layout LyX-Code +... + | create_weight_matrix | grab --invert --keys=SEQ --keys_only +\end_layout + +\begin_layout LyX-Code +| write_tab --no_stream +\end_layout + +\begin_layout Standard +The V0 column will hold the residue, while the rest of the columns will + hold the frequencies for each sequence position. +\end_layout + +\begin_layout Section +Plotting +\end_layout + +\begin_layout Standard +There exists several biopieces for plotting. + Some of these are based on GNUplot +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://www.gnuplot.info/" + +\end_inset + + +\end_layout + +\end_inset + +, which is an extremely powerful platform to generate all sorts of plots + and even though GNUplot has quite a steep learning curve, the biopieces + utilizing GNUplot are simple to use. + GNUplot is able to output a lot of different formats (called terminals + in GNUplot), but the biopieces focusses on three formats only: +\end_layout + +\begin_layout Enumerate +The 'dumb' terminal is default to the GNUplot based biopieces and will output + a plot in crude ASCII text (Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Dumb-terminal" + +\end_inset + +). + This is quite nice for a quick and dirty plot to get an overview of your + data . +\end_layout + +\begin_layout Enumerate +The 'post' or 'postscript' terminal output postscript code which is publication + grade graphics that can be viewed with applications such as Ghostview, + Photoshop, and Preview. +\end_layout + +\begin_layout Enumerate +The 'svg' terminal output's scalable vector graphics (SVG) which is a vector + based format. + SVG is great because you can edit the resulting plot using Photoshop or + Inkscape +\begin_inset Foot +status collapsed + +\begin_layout Standard +Inkscape is a really handy drawing program that is free and open source. + Availble at +\begin_inset LatexCommand htmlurl +target "http://www.inkscape.org" + +\end_inset + + +\end_layout + +\end_inset + + if you want to add additional labels, captions, arrows, and so on and then + save the result in different formats, such as postscript without loosing + resolution. +\end_layout + +\begin_layout Standard +The biopieces for plotting that are not based on GNUplot only output SVG + (that may change in the future). +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename lendist_ascii.png + lyxscale 70 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Dumb-terminal" + +\end_inset + +Dumb terminal +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +The output of a length distribution plot in the default 'dumb terminal' + to the terminal window. + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a histogram? +\begin_inset LatexCommand label +name "How-to-plot-histogram" + +\end_inset + + +\end_layout + +\begin_layout Standard +A generic histogram for a given value can be plotted with the biopiece +\series bold +plot_histogram +\series default + (Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Histogram" + +\end_inset + +): +\end_layout + +\begin_layout LyX-Code +... + | plot_histogram --key=TISSUE --no_stream +\end_layout + +\begin_layout Standard +(Figure missing) +\end_layout + +\begin_layout Standard +\noindent +\align left +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename histogram.png + lyxscale 70 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Histogram" + +\end_inset + +Histogram +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a length distribution? +\begin_inset LatexCommand label +name "sub:How-to-plot-lendist" + +\end_inset + + +\end_layout + +\begin_layout Standard +Plotting of length distributions, weather sequence lengths, patterns lengths, + hit lengths, +\emph on +etc. + +\emph default + is a really handy thing and can be done with the the biopiece +\series bold +plot_lendist +\series default +. + If you have a file with FASTA entries and want to plot the length distribution + you do it like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_seq +\end_layout + +\begin_layout LyX-Code +| plot_lendist --key=SEQ_LEN --no_stream +\end_layout + +\begin_layout Standard +The result will be written to the default dumb terminal and will look like + Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Dumb-terminal" + +\end_inset + +. +\end_layout + +\begin_layout Standard +If you instead want the result in postscript format you can do: +\end_layout + +\begin_layout LyX-Code +... + | plot_lendist --key=SEQ_LEN --terminal=post --result_out=file.ps +\end_layout + +\begin_layout Standard +That will generate the plot and save it to file, but not interrupt the data + stream which can then be used in further analysis. + You can also save the plot implicetly using '>', however, it is then important + to terminate the stream with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch: +\end_layout + +\begin_layout LyX-Code +... + | plot_lendist --key=SEQ_LEN --terminal=post --no_stream > file.ps +\end_layout + +\begin_layout Standard +The resulting plot can be seen in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Length-distribution" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename lendist.ps + lyxscale 50 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Length-distribution" + +\end_inset + +Length distribution +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +Length distribution of 630 piRNA like RNAs. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a chromosome distribution? +\begin_inset LatexCommand label +name "sub:How-to-plot-chrdist" + +\end_inset + + +\end_layout + +\begin_layout Standard +If you have the result of a sequence search against a multi chromosome genome, + it is very practical to be able to plot the distribution of search hits + on the different chromosomes. + This can be done with +\series bold +plot_chrdist +\series default +: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | blat_genome | plot_chrdist --no_stream +\end_layout + +\begin_layout Standard +The above example will result in a crude plot using the 'dumb' terminal, + and if you want to mess around with the results from the BLAT search you + probably want to save the result to file first (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-PSL" + +\end_inset + +). + To plot the chromosome distribution from the saved search result you can + do: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in=file.bed | plot_chrdist --terminal=post --result_out=plot.ps +\end_layout + +\begin_layout Standard +That will result in the output show in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Chromosome-distribution" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename chrdist.ps + lyxscale 50 + width 12cm + rotateAngle 90 + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Chromosome-distribution" + +\end_inset + +Chromosome distribution +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to generate a dotplot? +\begin_inset LatexCommand label +name "sub:How-to-generate-dotplot" + +\end_inset + + +\end_layout + +\begin_layout Standard +A dotplot is a powerful way to get an overview of the size and location + of sequence insertions, deletions, and duplications between two sequences. + Generating a dotplot with biopieces is a two step process where you initially + find all matches between two sequences using the tool +\series bold +match_seq +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-find-matches" + +\end_inset + +) and plot the resulting matches with +\series bold +plot_matches +\series default +. + Matching and plotting two +\emph on +Helicobacter pylori +\emph default + genomes (1.7Mbp) takes around 10 seconds: +\end_layout + +\begin_layout LyX-Code +... + | match_seq | plot_matches --terminal=post --result_out=plot.ps +\end_layout + +\begin_layout Standard +The resulting dotplot is in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Dotplot" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename dotplot.ps + lyxscale 50 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Dotplot" + +\end_inset + +Dotplot +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +Forward matches are displayed in green while reverse matches are displayed + in red. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a sequence logo? +\end_layout + +\begin_layout Standard +Sequence logos can be generate with +\series bold +plot_seqlogo +\series default +. + The sequnce type is determined automagically and an entropy scale of 2 + bits and 4 bits is used for nucleotide and peptide sequences, respectively +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand htmlurl +target "http://www.ccrnp.ncifcrf.gov/~toms/paper/hawaii/latex/node5.html" + +\end_inset + + +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout LyX-Code +... + | plot_seqlogo --no_stream --result_out=seqlogo.svg +\end_layout + +\begin_layout Standard +An example of a sequence logo can be seen in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Sequence-logo" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename seqlogo.png + lyxscale 50 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Sequence-logo" + +\end_inset + +Sequence logo +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a karyogram? +\begin_inset LatexCommand label +name "sub:How-to-plot-karyogram" + +\end_inset + + +\end_layout + +\begin_layout Standard +To plot search hits on genomes use +\series bold +plot_karyogram +\series default +, which will output a nice karyogram in SVG graphics: +\end_layout + +\begin_layout LyX-Code +... + | plot_karyogram --result_out=karyogram.svg +\end_layout + +\begin_layout Standard +The banding data is taken from the UCSC genome browser database and currently + only Human and Mouse is supported. + Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Karyogram" + +\end_inset + + shows the distribution of piRNA like RNAs matched to the Human genome. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename karyogram.png + lyxscale 35 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Karyogram" + +\end_inset + +Karyogram +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +Hits from a search of piRNA like RNAs in the Human genome is displayed as + short horizontal bars. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Uploading Results +\end_layout + +\begin_layout Subsection +How do I display my results in the UCSC Genome Browser? +\end_layout + +\begin_layout Standard +Results from the list of biopieces below can be uploaded directly to a local + mirror of the UCSC Genome Browser using the biopiece +\series bold +upload_to_ucsc +\series default +: +\end_layout + +\begin_layout Itemize +patscan_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-patscan" + +\end_inset + + +\end_layout + +\begin_layout Itemize +blat_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAT" + +\end_inset + + +\end_layout + +\begin_layout Itemize +blast_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAST" + +\end_inset + + +\end_layout + +\begin_layout Itemize +vmatch_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-Vmatch" + +\end_inset + + +\end_layout + +\begin_layout Standard +The syntax for uploading data the most simple way requires two mandatory + switches: +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +database, which is the UCSC database name (such as hg18, mm9, etc.) and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +table which should be the users initials followed by an underscore and a + short description of the data: +\end_layout + +\begin_layout LyX-Code +... + | upload_to_ucsc --database=hg18 --table=mah_snoRNAs +\end_layout + +\begin_layout Standard +The +\series bold +upload_to_ucsc +\series default + biopiece modifies the users ~/ucsc/my_tracks.ra file automagically (a backup + is created with the name ~/ucsc/my_tracks.ra~) with default values that + can be overridden using the following switches: +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +short_label - Short label for track - Default=database->table +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +long_label - Long label for track - Default=database->table +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +group - Track group name - Default= +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +priority - Track display priority - Default=1 +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +color - Track color - Default=147,73,42 +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +chunk_size - Chunks for loading - Default=10000000 +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +visibility - Track visibility - Default=pack +\end_layout + +\begin_layout Standard +Also, data in BED or PSL format can be uploaded with +\series bold +upload_to_ucsc +\series default + as long as these reference to genomes and chromosomes existing in the UCSC + Genome Browser: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= | upload_to_ucsc ... +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +read_psl --data_in= | upload_to_ucsc ... +\end_layout + +\begin_layout Section +Power Scripting +\end_layout + +\begin_layout Standard +It is possible to do commandline scripting of biopiece records using Perl. + Because a biopiece record essentially is a hash structure, you can pass + records to +\series bold +bioscript +\series default + command, which is a wrapper around the Perl executable that allows direct + manipulations of the records using the power of Perl. +\end_layout + +\begin_layout Standard +In the below example we replace in all records the value to the CHR key + with a forthrunning number: +\end_layout + +\begin_layout LyX-Code +... + | bioscript 'while($r=get_record( +\backslash +*STDIN)){$r->{CHR}=$i++; put_record($r)}' +\end_layout + +\begin_layout Standard +Something more useful would probably be to create custom FASTA headers. + E.g. + if we read in a BED file, lookup the genomic sequence, create a custom + FASTA header with +\series bold +bioscript +\series default + and output FASTA entries: +\end_layout + +\begin_layout LyX-Code +... + | bioscript 'while($r=get_record( +\backslash +*STDIN)){$r->{SEQ_NAME}= // +\end_layout + +\begin_layout LyX-Code +join("_",$r->{CHR},$r->{CHR_BEG},$r->{CHR_END}); put_record($r)}' +\end_layout + +\begin_layout Standard +And the output: +\end_layout + +\begin_layout LyX-Code +>chr2L_21567527_21567550 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_693380_693403 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_13859534_13859557 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_9005090_9005113 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_2106825_2106848 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_14649031_14649054 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout Section +Trouble shooting +\end_layout + +\begin_layout Standard +Shoot the messenger! +\end_layout + +\begin_layout Section +\start_of_appendix +Keys +\begin_inset LatexCommand label +name "sec:Keys" + +\end_inset + + +\end_layout + +\begin_layout Standard +HIT +\end_layout + +\begin_layout Standard +HIT_BEG +\end_layout + +\begin_layout Standard +HIT_END +\end_layout + +\begin_layout Standard +HIT_LEN +\end_layout + +\begin_layout Standard +HIT_NAME +\end_layout + +\begin_layout Standard +PATTERN +\end_layout + +\begin_layout Section +Switches +\begin_inset LatexCommand label +name "sec:Switches" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_in +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_out +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +data_in +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num +\end_layout + +\begin_layout Section +scan_for_matches README +\begin_inset LatexCommand label +name "sec:scan_for_matches-README" + +\end_inset + + +\end_layout + +\begin_layout LyX-Code + scan_for_matches: +\end_layout + +\begin_layout LyX-Code + A Program to Scan Nucleotide or Protein Sequences for Matching Patterns +\end_layout + +\begin_layout LyX-Code + Ross Overbeek +\end_layout + +\begin_layout LyX-Code + MCS +\end_layout + +\begin_layout LyX-Code + Argonne National Laboratory +\end_layout + +\begin_layout LyX-Code + Argonne, IL 60439 +\end_layout + +\begin_layout LyX-Code + USA +\end_layout + +\begin_layout LyX-Code +Scan_for_matches is a utility that we have written to search for +\end_layout + +\begin_layout LyX-Code +patterns in DNA and protein sequences. + I wrote most of the code, +\end_layout + +\begin_layout LyX-Code +although David Joerg and Morgan Price wrote sections of an +\end_layout + +\begin_layout LyX-Code +earlier version. + The whole notion of pattern matching has a rich +\end_layout + +\begin_layout LyX-Code +history, and we borrowed liberally from many sources. + However, it is +\end_layout + +\begin_layout LyX-Code +worth noting that we were strongly influenced by the elegant tools +\end_layout + +\begin_layout LyX-Code +developed and distributed by David Searls. + My intent is to make the +\end_layout + +\begin_layout LyX-Code +existing tool available to anyone in the research community that might +\end_layout + +\begin_layout LyX-Code +find it useful. + I will continue to try to fix bugs and make suggested +\end_layout + +\begin_layout LyX-Code +enhancements, at least until I feel that a superior tool exists. +\end_layout + +\begin_layout LyX-Code +Hence, I would appreciate it if all bug reports and suggestions are +\end_layout + +\begin_layout LyX-Code +directed to me at Overbeek@mcs.anl.gov. + +\end_layout + +\begin_layout LyX-Code +I will try to log all bug fixes and report them to users that send me +\end_layout + +\begin_layout LyX-Code +their email addresses. + I do not require that you give me your name +\end_layout + +\begin_layout LyX-Code +and address. + However, if you do give it to me, I will try to notify +\end_layout + +\begin_layout LyX-Code +you of serious problems as they are discovered. +\end_layout + +\begin_layout LyX-Code +Getting Started: +\end_layout + +\begin_layout LyX-Code + The distribution should contain at least the following programs: +\end_layout + +\begin_layout LyX-Code + README - This document +\end_layout + +\begin_layout LyX-Code + ggpunit.c - One of the two source files +\end_layout + +\begin_layout LyX-Code + scan_for_matches.c - The second source file +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + run_tests - A perl script to test things +\end_layout + +\begin_layout LyX-Code + show_hits - A handy perl script +\end_layout + +\begin_layout LyX-Code + test_dna_input - Test sequences for DNA +\end_layout + +\begin_layout LyX-Code + test_dna_patterns - Test patterns for DNA scan +\end_layout + +\begin_layout LyX-Code + test_output - Desired output from test +\end_layout + +\begin_layout LyX-Code + test_prot_input - Test protein sequences +\end_layout + +\begin_layout LyX-Code + test_prot_patterns - Test patterns for proteins +\end_layout + +\begin_layout LyX-Code + testit - a perl script used for test +\end_layout + +\begin_layout LyX-Code + Only the first three files are required. + The others are useful, +\end_layout + +\begin_layout LyX-Code + but only if you have Perl installed on your system. + If you do +\end_layout + +\begin_layout LyX-Code + have Perl, I suggest that you type +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + which perl +\end_layout + +\begin_layout LyX-Code + to find out where it installed. + On my system, I get the following +\end_layout + +\begin_layout LyX-Code + response: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + clone% which perl +\end_layout + +\begin_layout LyX-Code + /usr/local/bin/perl +\end_layout + +\begin_layout LyX-Code + indicating that Perl is installed in /usr/local/bin. + Anyway, once +\end_layout + +\begin_layout LyX-Code + you know where it is installed, edit the first line of files +\end_layout + +\begin_layout LyX-Code + testit +\end_layout + +\begin_layout LyX-Code + show_hits +\end_layout + +\begin_layout LyX-Code + replacing /usr/local/bin/perl with the appropriate location. + I +\end_layout + +\begin_layout LyX-Code + will assume that you can do this, although it is not critical (it +\end_layout + +\begin_layout LyX-Code + is needed only to test the installation and to use the "show_hits" +\end_layout + +\begin_layout LyX-Code + utility). + Perl is not required to actually install and run +\end_layout + +\begin_layout LyX-Code + scan_for_matches. + +\end_layout + +\begin_layout LyX-Code + If you do not have Perl, I suggest you get it and install it (it +\end_layout + +\begin_layout LyX-Code + is a wonderful utility). + Information about Perl and how to get it +\end_layout + +\begin_layout LyX-Code + can be found in the book "Programming Perl" by Larry Wall and +\end_layout + +\begin_layout LyX-Code + Randall L. + Schwartz, published by O'Reilly & Associates, Inc. +\end_layout + +\begin_layout LyX-Code + To get started, you will need to compile the program. + I do this +\end_layout + +\begin_layout LyX-Code + using +\end_layout + +\begin_layout LyX-Code + gcc -O -o scan_for_matches ggpunit.c scan_for_matches.c +\end_layout + +\begin_layout LyX-Code + If you do not use GNU C, use +\end_layout + +\begin_layout LyX-Code + cc -O -DCC -o scan_for_matches ggpunit.c scan_for_matches.c +\end_layout + +\begin_layout LyX-Code + which works on my Sun. + +\end_layout + +\begin_layout LyX-Code + Once you have compiled scan_for_matches, you can verify that it +\end_layout + +\begin_layout LyX-Code + works with +\end_layout + +\begin_layout LyX-Code + clone% run_tests tmp +\end_layout + +\begin_layout LyX-Code + clone% diff tmp test_output +\end_layout + +\begin_layout LyX-Code + You may get a few strange lines of the sort +\end_layout + +\begin_layout LyX-Code + clone% run_tests tmp +\end_layout + +\begin_layout LyX-Code + rm: tmp: No such file or directory +\end_layout + +\begin_layout LyX-Code + clone% diff tmp test_output +\end_layout + +\begin_layout LyX-Code + These should cause no concern. + However, if the "diff" shows that +\end_layout + +\begin_layout LyX-Code + tmp and test_output are different, contact me (you have a +\end_layout + +\begin_layout LyX-Code + problem). + +\end_layout + +\begin_layout LyX-Code + You should now be able to use scan_for_matches by following the +\end_layout + +\begin_layout LyX-Code + instructions given below (which is all the normal user should have +\end_layout + +\begin_layout LyX-Code + to understand, once things are installed properly). +\end_layout + +\begin_layout LyX-Code + ============================================================== +\end_layout + +\begin_layout LyX-Code +How to run scan_for_matches: +\end_layout + +\begin_layout LyX-Code + To run the program, you type need to create two files +\end_layout + +\begin_layout LyX-Code + 1. + the first file contains the pattern you wish to scan for; I'll +\end_layout + +\begin_layout LyX-Code + call this file pat_file in what follows (but any name is ok) +\end_layout + +\begin_layout LyX-Code + 2. + the second file contains a set of sequences to scan. + These +\end_layout + +\begin_layout LyX-Code + should be in "fasta format". + Just look at the contents of +\end_layout + +\begin_layout LyX-Code + test_dna_input to see examples of this format. + Basically, +\end_layout + +\begin_layout LyX-Code + each sequence begins with a line of the form +\end_layout + +\begin_layout LyX-Code + >sequence_id +\end_layout + +\begin_layout LyX-Code + and is followed by one or more lines containing the sequence. +\end_layout + +\begin_layout LyX-Code + Once these files have been created, you just use +\end_layout + +\begin_layout LyX-Code + scan_for_matches pat_file < input_file +\end_layout + +\begin_layout LyX-Code + to scan all of the input sequences for the given pattern. + As an +\end_layout + +\begin_layout LyX-Code + example, suppose that pat_file contains a single line of the form +\end_layout + +\begin_layout LyX-Code + p1=4...7 3...8 ~p1 +\end_layout + +\begin_layout LyX-Code + Then, +\end_layout + +\begin_layout LyX-Code + scan_for_matches pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + should produce two "hits". + When I run this on my machine, I get +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + >tst1:[6,27] +\end_layout + +\begin_layout LyX-Code + cguaacc ggttaacc gguuacg +\end_layout + +\begin_layout LyX-Code + >tst2:[6,27] +\end_layout + +\begin_layout LyX-Code + CGUAACC GGTTAACC GGUUACG +\end_layout + +\begin_layout LyX-Code + clone% +\end_layout + +\begin_layout LyX-Code +Simple Patterns Built by Matching Ranges and Reverse Complements +\end_layout + +\begin_layout LyX-Code + Let me first explain this simple pattern: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + p1=4...7 3...8 ~p1 +\end_layout + +\begin_layout LyX-Code + The pattern consists of three "pattern units" separated by spaces. +\end_layout + +\begin_layout LyX-Code + The first pattern unit is +\end_layout + +\begin_layout LyX-Code + p1=4...7 +\end_layout + +\begin_layout LyX-Code + which means "match 4 to 7 characters and call them p1". + The +\end_layout + +\begin_layout LyX-Code + second pattern unit is +\end_layout + +\begin_layout LyX-Code + 3...8 +\end_layout + +\begin_layout LyX-Code + which means "then match 3 to 8 characters". + The last pattern unit +\end_layout + +\begin_layout LyX-Code + is +\end_layout + +\begin_layout LyX-Code + ~p1 +\end_layout + +\begin_layout LyX-Code + which means "match the reverse complement of p1". + The first +\end_layout + +\begin_layout LyX-Code + reported hit is shown as +\end_layout + +\begin_layout LyX-Code + >tst1:[6,27] +\end_layout + +\begin_layout LyX-Code + cguaacc ggttaacc gguuacg +\end_layout + +\begin_layout LyX-Code + which states that characters 6 through 27 of sequence tst1 were +\end_layout + +\begin_layout LyX-Code + matched. + "cguaac" matched the first pattern unit, "ggttaacc" the +\end_layout + +\begin_layout LyX-Code + second, and "gguuacg" the third. + This is an example of a common +\end_layout + +\begin_layout LyX-Code + type of pattern used to search for sections of DNA or RNA that +\end_layout + +\begin_layout LyX-Code + would fold into a hairpin loop. +\end_layout + +\begin_layout LyX-Code +Searching Both Strands +\end_layout + +\begin_layout LyX-Code + Now for a short aside: scan_for_matches only searched the +\end_layout + +\begin_layout LyX-Code + sequences in the input file; it did not search the opposite +\end_layout + +\begin_layout LyX-Code + strand. + With a pattern of the sort we just used, there is not +\end_layout + +\begin_layout LyX-Code + need o search the opposite strand. + However, it is normally the +\end_layout + +\begin_layout LyX-Code + case that you will wish to search both the sequence and the +\end_layout + +\begin_layout LyX-Code + opposite strand (i.e., the reverse complement of the sequence). +\end_layout + +\begin_layout LyX-Code + To do that, you would just use the "-c" command line. + For example, +\end_layout + +\begin_layout LyX-Code + scan_for_matches -c pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + Hits on the opposite strand will show a beginning location greater +\end_layout + +\begin_layout LyX-Code + than te end location of the match. +\end_layout + +\begin_layout LyX-Code +Defining Pairing Rules and Allowing Mismatches, Insertions, and Deletions +\end_layout + +\begin_layout LyX-Code + Let us stop now and ask "What additional features would one need to +\end_layout + +\begin_layout LyX-Code + really find the kinds of loop structures that characterize tRNAs, +\end_layout + +\begin_layout LyX-Code + rRNAs, and so forth?" I can immediately think of two: +\end_layout + +\begin_layout LyX-Code + a) you will need to be able to allow non-standard pairings +\end_layout + +\begin_layout LyX-Code + (those other than G-C and A-U), and +\end_layout + +\begin_layout LyX-Code + b) you will need to be able to tolerate some number of +\end_layout + +\begin_layout LyX-Code + mismatches and bulges. +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + Let me first show you how to handle non-standard "rules for +\end_layout + +\begin_layout LyX-Code + pairing in reverse complements". + Consider the following pattern, +\end_layout + +\begin_layout LyX-Code + which I show as two line (you may use as many lines as you like in +\end_layout + +\begin_layout LyX-Code + forming a pattern, although you can only break a pattern at points +\end_layout + +\begin_layout LyX-Code + where space would be legal): +\end_layout + +\begin_layout LyX-Code + r1={au,ua,gc,cg,gu,ug,ga,ag} +\end_layout + +\begin_layout LyX-Code + p1=2...3 0...4 p2=2...5 1...5 r1~p2 0...4 ~p1 +\end_layout + +\begin_layout LyX-Code + The first "pattern unit" does not actually match anything; rather, +\end_layout + +\begin_layout LyX-Code + it defines a "pairing rule" in which standard pairings are +\end_layout + +\begin_layout LyX-Code + allowed, as well as G-A and A-G (in case you wondered, Us and Ts +\end_layout + +\begin_layout LyX-Code + and upper and lower case can be used interchangably; for example +\end_layout + +\begin_layout LyX-Code + r1={AT,UA,gc,cg} could be used to define the "standard rule" for +\end_layout + +\begin_layout LyX-Code + pairings). + The second line consists of six pattern units which +\end_layout + +\begin_layout LyX-Code + may be interpreted as follows: +\end_layout + +\begin_layout LyX-Code + p1=2...3 match 2 or 3 characters (call it p1) +\end_layout + +\begin_layout LyX-Code + 0...4 match 0 to 4 characters +\end_layout + +\begin_layout LyX-Code + p2=2...5 match 2 to 5 characters (call it p2) +\end_layout + +\begin_layout LyX-Code + 1...5 match 1 to 5 characters +\end_layout + +\begin_layout LyX-Code + r1~p2 match the reverse complement of p2, +\end_layout + +\begin_layout LyX-Code + allowing G-A and A-G pairs +\end_layout + +\begin_layout LyX-Code + 0...4 match 0 to 4 characters +\end_layout + +\begin_layout LyX-Code + ~p1 match the reverse complement of p1 +\end_layout + +\begin_layout LyX-Code + allowing only G-C, C-G, A-T, and T-A pairs +\end_layout + +\begin_layout LyX-Code + Thus, r1~p2 means "match the reverse complement of p2 using rule r1". +\end_layout + +\begin_layout LyX-Code + Now let us consider the issue of tolerating mismatches and bulges. +\end_layout + +\begin_layout LyX-Code + You may add a "qualifier" to the pattern unit that gives the +\end_layout + +\begin_layout LyX-Code + tolerable number of "mismatches, deletions, and insertions". +\end_layout + +\begin_layout LyX-Code + Thus, +\end_layout + +\begin_layout LyX-Code + p1=10...10 3...8 ~p1[1,2,1] +\end_layout + +\begin_layout LyX-Code + means that the third pattern unit must match 10 characters, +\end_layout + +\begin_layout LyX-Code + allowing one "mismatch" (a pairing other than G-C, C-G, A-T, or +\end_layout + +\begin_layout LyX-Code + T-A), two deletions (a deletion is a character that occurs in p1, +\end_layout + +\begin_layout LyX-Code + but has been "deleted" from the string matched by ~p1), and one +\end_layout + +\begin_layout LyX-Code + insertion (an "insertion" is a character that occurs in the string +\end_layout + +\begin_layout LyX-Code + matched by ~p1, but not for which no corresponding character +\end_layout + +\begin_layout LyX-Code + occurs in p1). + In this case, the pattern would match +\end_layout + +\begin_layout LyX-Code + ACGTACGTAC GGGGGGGG GCGTTACCT +\end_layout + +\begin_layout LyX-Code + which is, you must admit, a fairly weak loop. + It is common to +\end_layout + +\begin_layout LyX-Code + allow mismatches, but you will find yourself using insertions and +\end_layout + +\begin_layout LyX-Code + deletions much more rarely. + In any event, you should note that +\end_layout + +\begin_layout LyX-Code + allowing mismatches, insertions, and deletions does force the +\end_layout + +\begin_layout LyX-Code + program to try many additional possible pairings, so it does slow +\end_layout + +\begin_layout LyX-Code + things down a bit. +\end_layout + +\begin_layout LyX-Code +How Patterns Are Matched +\end_layout + +\begin_layout LyX-Code + Now is as good a time as any to discuss the basic flow of control +\end_layout + +\begin_layout LyX-Code + when matching patterns. + Recall that a "pattern" is a sequence of +\end_layout + +\begin_layout LyX-Code + "pattern units". + Suppose that the pattern units were +\end_layout + +\begin_layout LyX-Code + u1 u2 u3 u4 ... + un +\end_layout + +\begin_layout LyX-Code + The scan of a sequence S begins by setting the current position +\end_layout + +\begin_layout LyX-Code + to 1. + Then, an attempt is made to match u1 starting at the +\end_layout + +\begin_layout LyX-Code + current position. + Each attempt to match a pattern unit can +\end_layout + +\begin_layout LyX-Code + succeed or fail. + If it succeeds, then an attempt is made to match +\end_layout + +\begin_layout LyX-Code + the next unit. + If it fails, then an attempt is made to find an +\end_layout + +\begin_layout LyX-Code + alternative match for the immediately preceding pattern unit. + If +\end_layout + +\begin_layout LyX-Code + this succeeds, then we proceed forward again to the next unit. + If +\end_layout + +\begin_layout LyX-Code + it fails we go back to the preceding unit. + This process is called +\end_layout + +\begin_layout LyX-Code + "backtracking". + If there are no previous units, then the current +\end_layout + +\begin_layout LyX-Code + position is incremented by one, and everything starts again. + This +\end_layout + +\begin_layout LyX-Code + proceeds until either the current position goes past the end of +\end_layout + +\begin_layout LyX-Code + the sequence or all of the pattern units succeed. + On success, +\end_layout + +\begin_layout LyX-Code + scan_for_matches reports the "hit", the current position is set +\end_layout + +\begin_layout LyX-Code + just past the hit, and an attempt is made to find another hit. +\end_layout + +\begin_layout LyX-Code + If you wish to limit the scan to simply finding a maximum of, say, +\end_layout + +\begin_layout LyX-Code + 10 hits, you can use the -n option (-n 10 would set the limit to +\end_layout + +\begin_layout LyX-Code + 10 reported hits). + For example, +\end_layout + +\begin_layout LyX-Code + scan_for_matches -c -n 1 pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + would search for just the first hit (and would stop searching the +\end_layout + +\begin_layout LyX-Code + current sequences or any that follow in the input file). +\end_layout + +\begin_layout LyX-Code +Searching for repeats: +\end_layout + +\begin_layout LyX-Code + In the last section, I discussed almost all of the details +\end_layout + +\begin_layout LyX-Code + required to allow you to look for repeats. + Consider the following +\end_layout + +\begin_layout LyX-Code + set of patterns: +\end_layout + +\begin_layout LyX-Code + p1=6...6 3...8 p1 (find exact 6 character repeat separated +\end_layout + +\begin_layout LyX-Code + by to 8 characters) +\end_layout + +\begin_layout LyX-Code + p1=6...6 3..8 p1[1,0,0] (allow one mismatch) +\end_layout + +\begin_layout LyX-Code + p1=3...3 p1[1,0,0] p1[1,0,0] p1[1,0,0] +\end_layout + +\begin_layout LyX-Code + (match 12 characters that are the remains +\end_layout + +\begin_layout LyX-Code + of a 3-character sequence occurring 4 times) +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + p1=4...8 0...3 p2=6...8 p1 0...3 p2 +\end_layout + +\begin_layout LyX-Code + (This would match things like +\end_layout + +\begin_layout LyX-Code + ATCT G TCTTT ATCT TG TCTTT +\end_layout + +\begin_layout LyX-Code + ) +\end_layout + +\begin_layout LyX-Code +Searching for particular sequences: +\end_layout + +\begin_layout LyX-Code + Occasionally, one wishes to match a specific, known sequence. +\end_layout + +\begin_layout LyX-Code + In such a case, you can just give the sequence (along with an +\end_layout + +\begin_layout LyX-Code + optional statement of the allowable mismatches, insertions, and +\end_layout + +\begin_layout LyX-Code + deletions). + Thus, +\end_layout + +\begin_layout LyX-Code + p1=6...8 GAGA ~p1 (match a hairpin with GAGA as the loop) +\end_layout + +\begin_layout LyX-Code + RRRRYYYY (match 4 purines followed by 4 pyrimidines) +\end_layout + +\begin_layout LyX-Code + TATAA[1,0,0] (match TATAA, allowing 1 mismatch) +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +Matches against a "weight matrix": +\end_layout + +\begin_layout LyX-Code + I will conclude my examples of the types of pattern units +\end_layout + +\begin_layout LyX-Code + available for matching against nucleotide sequences by discussing a +\end_layout + +\begin_layout LyX-Code + crude implemetation of matching using a "weight matrix". + While I +\end_layout + +\begin_layout LyX-Code + am less than overwhelmed with the syntax that I chose, I think that +\end_layout + +\begin_layout LyX-Code + the reader should be aware that I was thinking of generating +\end_layout + +\begin_layout LyX-Code + patterns containing such pattern units automatically from +\end_layout + +\begin_layout LyX-Code + alignments (and did not really plan on typing such things in by +\end_layout + +\begin_layout LyX-Code + hand very often). + Anyway, suppose that you wanted to match a +\end_layout + +\begin_layout LyX-Code + sequence of eight characters. + The "consensus" of these eight +\end_layout + +\begin_layout LyX-Code + characters is GRCACCGS, but the actual "frequencies of occurrence" +\end_layout + +\begin_layout LyX-Code + are given in the matrix below. + Thus, the first character is an A +\end_layout + +\begin_layout LyX-Code + 16% the time and a G 84% of the time. + The second is an A 57% of +\end_layout + +\begin_layout LyX-Code + the time, a C 10% of the time, a G 29% of the time, and a T 4% of +\end_layout + +\begin_layout LyX-Code + the time. + +\end_layout + +\begin_layout LyX-Code + C1 C2 C3 C4 C5 C6 C7 C8 +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + A 16 57 0 95 0 18 0 0 +\end_layout + +\begin_layout LyX-Code + C 0 10 80 0 100 60 0 50 +\end_layout + +\begin_layout LyX-Code + G 84 29 0 0 0 20 100 50 +\end_layout + +\begin_layout LyX-Code + T 0 4 20 5 0 2 0 0 +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + One could use the following pattern unit to search for inexact +\end_layout + +\begin_layout LyX-Code + matches related to such a "weight matrix": +\end_layout + +\begin_layout LyX-Code + {(16,0,84,0),(57,10,29,4),(0,80,0,20),(95,0,0,5), +\end_layout + +\begin_layout LyX-Code + (0,100,0,0),(18,60,20,2),(0,0,100,0),(0,50,50,0)} > 450 +\end_layout + +\begin_layout LyX-Code + This pattern unit will attempt to match exactly eight characters. +\end_layout + +\begin_layout LyX-Code + For each character in the sequence, the entry in the corresponding +\end_layout + +\begin_layout LyX-Code + tuple is added to an accumulated sum. + If the sum is greater than +\end_layout + +\begin_layout LyX-Code + 450, the match succeeds; else it fails. +\end_layout + +\begin_layout LyX-Code + Recently, this feature was upgraded to allow ranges. + Thus, +\end_layout + +\begin_layout LyX-Code + 600 > {(16,0,84,0),(57,10,29,4),(0,80,0,20),(95,0,0,5), +\end_layout + +\begin_layout LyX-Code + (0,100,0,0),(18,60,20,2),(0,0,100,0),(0,50,50,0)} > 450 +\end_layout + +\begin_layout LyX-Code + will work, as well. +\end_layout + +\begin_layout LyX-Code +Allowing Alternatives: +\end_layout + +\begin_layout LyX-Code + Very occasionally, you may wish to allow alternative pattern units +\end_layout + +\begin_layout LyX-Code + (i.e., "match either A or B"). + You can do this using something +\end_layout + +\begin_layout LyX-Code + like +\end_layout + +\begin_layout LyX-Code + ( GAGA | GCGCA) +\end_layout + +\begin_layout LyX-Code + which says "match either GAGA or GCGCA". + You may take +\end_layout + +\begin_layout LyX-Code + alternatives of a list of pattern units, for example +\end_layout + +\begin_layout LyX-Code + (p1=3...3 3...8 ~p1 | p1=5...5 4...4 ~p1 GGG) +\end_layout + +\begin_layout LyX-Code + would match one of two sequences of pattern units. + There is one +\end_layout + +\begin_layout LyX-Code + clumsy aspect of the syntax: to match a list of alternatives, you +\end_layout + +\begin_layout LyX-Code + need to fully the request. + Thus, +\end_layout + +\begin_layout LyX-Code + (GAGA | (GCGCA | TTCGA)) +\end_layout + +\begin_layout LyX-Code + would be needed to try the three alternatives. +\end_layout + +\begin_layout LyX-Code +One Minor Extension +\end_layout + +\begin_layout LyX-Code + Sometimes a pattern will contain a sequence of distinct ranges, +\end_layout + +\begin_layout LyX-Code + and you might wish to limit the sum of the lengths of the matched +\end_layout + +\begin_layout LyX-Code + subsequences. + For example, suppose that you basically wanted to +\end_layout + +\begin_layout LyX-Code + match something like +\end_layout + +\begin_layout LyX-Code + ARRYYTT p1=0...5 GCA[1,0,0] p2=1...6 ~p1 4...8 ~p2 p3=4...10 CCT +\end_layout + +\begin_layout LyX-Code + but that the sum of the lengths of p1, p2, and p3 must not exceed +\end_layout + +\begin_layout LyX-Code + eight characters. + To do this, you could add +\end_layout + +\begin_layout LyX-Code + length(p1+p2+p3) < 9 +\end_layout + +\begin_layout LyX-Code + as the last pattern unit. + It will just succeed or fail (but does +\end_layout + +\begin_layout LyX-Code + not actually match any characters in the sequence). +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +Matching Protein Sequences +\end_layout + +\begin_layout LyX-Code + Suppose that the input file contains protein sequences. + In this +\end_layout + +\begin_layout LyX-Code + case, you must invoke scan_for_matches with the "-p" option. + You +\end_layout + +\begin_layout LyX-Code + cannot use aspects of the language that relate directly to +\end_layout + +\begin_layout LyX-Code + nucleotide sequences (e.g., the -c command line option or pattern +\end_layout + +\begin_layout LyX-Code + constructs referring to the reverse complement of a previously +\end_layout + +\begin_layout LyX-Code + matched unit). + +\end_layout + +\begin_layout LyX-Code + You also have two additional constructs that allow you to match +\end_layout + +\begin_layout LyX-Code + either "one of a set of amino acids" or "any amino acid other than +\end_layout + +\begin_layout LyX-Code + those a given set". + For example, +\end_layout + +\begin_layout LyX-Code + p1=0...4 any(HQD) 1...3 notany(HK) p1 +\end_layout + +\begin_layout LyX-Code + would successfully match a string like +\end_layout + +\begin_layout LyX-Code + YWV D AA C YWV +\end_layout + +\begin_layout LyX-Code +Using the show_hits Utility +\end_layout + +\begin_layout LyX-Code + When viewing a large set of complex matches, you might find it +\end_layout + +\begin_layout LyX-Code + convenient to post-process the scan_for_matches output to get a +\end_layout + +\begin_layout LyX-Code + more readable version. + We provide a simple post-processor called +\end_layout + +\begin_layout LyX-Code + "show_hits". + To see its effect, just pipe the output of a +\end_layout + +\begin_layout LyX-Code + scan_for_matches into show_hits: +\end_layout + +\begin_layout LyX-Code + Normal Output: +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches -c pat_file < tmp +\end_layout + +\begin_layout LyX-Code + >tst1:[1,28] +\end_layout + +\begin_layout LyX-Code + gtacguaacc ggttaac cgguuacgtac +\end_layout + +\begin_layout LyX-Code + >tst1:[28,1] +\end_layout + +\begin_layout LyX-Code + gtacgtaacc ggttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + >tst2:[2,31] +\end_layout + +\begin_layout LyX-Code + CGTACGUAAC C GGTTAACC GGUUACGTACG +\end_layout + +\begin_layout LyX-Code + >tst2:[31,2] +\end_layout + +\begin_layout LyX-Code + CGTACGTAAC C GGTTAACC GGTTACGTACG +\end_layout + +\begin_layout LyX-Code + >tst3:[3,32] +\end_layout + +\begin_layout LyX-Code + gtacguaacc g gttaactt cgguuacgtac +\end_layout + +\begin_layout LyX-Code + >tst3:[32,3] +\end_layout + +\begin_layout LyX-Code + gtacgtaacc g aagttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + Piped Through show_hits: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches -c pat_file < tmp | show_hits +\end_layout + +\begin_layout LyX-Code + tst1:[1,28]: gtacguaacc ggttaac cgguuacgtac +\end_layout + +\begin_layout LyX-Code + tst1:[28,1]: gtacgtaacc ggttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + tst2:[2,31]: CGTACGUAAC C GGTTAACC GGUUACGTACG +\end_layout + +\begin_layout LyX-Code + tst2:[31,2]: CGTACGTAAC C GGTTAACC GGTTACGTACG +\end_layout + +\begin_layout LyX-Code + tst3:[3,32]: gtacguaacc g gttaactt cgguuacgtac +\end_layout + +\begin_layout LyX-Code + tst3:[32,3]: gtacgtaacc g aagttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + clone% +\end_layout + +\begin_layout LyX-Code + Optionally, you can specify which of the "fields" in the matches +\end_layout + +\begin_layout LyX-Code + you wish to sort on, and show_hits will sort them. + The field +\end_layout + +\begin_layout LyX-Code + numbers start with 0. + So, you might get something like +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches -c pat_file < tmp | show_hits 2 1 +\end_layout + +\begin_layout LyX-Code + tst2:[2,31]: CGTACGUAAC C GGTTAACC GGUUACGTACG +\end_layout + +\begin_layout LyX-Code + tst2:[31,2]: CGTACGTAAC C GGTTAACC GGTTACGTACG +\end_layout + +\begin_layout LyX-Code + tst3:[32,3]: gtacgtaacc g aagttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + tst1:[1,28]: gtacguaacc ggttaac cgguuacgtac +\end_layout + +\begin_layout LyX-Code + tst1:[28,1]: gtacgtaacc ggttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + tst3:[3,32]: gtacguaacc g gttaactt cgguuacgtac +\end_layout + +\begin_layout LyX-Code + clone% +\end_layout + +\begin_layout LyX-Code + In this case, the hits have been sorted on fields 2 and 1 (that is, +\end_layout + +\begin_layout LyX-Code + the third and second matched subfields). +\end_layout + +\begin_layout LyX-Code + show_hits is just one possible little post-processor, and you +\end_layout + +\begin_layout LyX-Code + might well wish to write a customized one for yourself. +\end_layout + +\begin_layout LyX-Code +Reducing the Cost of a Search +\end_layout + +\begin_layout LyX-Code + The scan_for_matches utility uses a fairly simple search, and may +\end_layout + +\begin_layout LyX-Code + consume large amounts of CPU time for complex patterns. + Someday, +\end_layout + +\begin_layout LyX-Code + I may decide to optimize the code. + However, until then, let me +\end_layout + +\begin_layout LyX-Code + mention one useful technique. + +\end_layout + +\begin_layout LyX-Code + When you have a complex pattern that includes a number of varying +\end_layout + +\begin_layout LyX-Code + ranges, imprecise matches, and so forth, it is useful to +\end_layout + +\begin_layout LyX-Code + "pipeline" matches. + That is, form a simpler pattern that can be +\end_layout + +\begin_layout LyX-Code + used to scan through a large database extracting sections that +\end_layout + +\begin_layout LyX-Code + might be matched by the more complex pattern. + Let me illustrate +\end_layout + +\begin_layout LyX-Code + with a short example. + Suppose that you really wished to match the +\end_layout + +\begin_layout LyX-Code + pattern +\end_layout + +\begin_layout LyX-Code + p1=3...5 0...8 ~p1[1,1,0] p2=6...7 3...6 AGC 3...5 RYGC ~p2[1,0,0] +\end_layout + +\begin_layout LyX-Code + In this case, the pattern units AGC 3...5 RYGC can be used to rapidly +\end_layout + +\begin_layout LyX-Code + constrain the overall search. + You can preprocess the overall +\end_layout + +\begin_layout LyX-Code + database using the pattern: +\end_layout + +\begin_layout LyX-Code + 31...31 AGC 3...5 RYGC 7...7 +\end_layout + +\begin_layout LyX-Code + Put the complex pattern in pat_file1 and the simpler pattern in +\end_layout + +\begin_layout LyX-Code + pat_file2. + Then use, +\end_layout + +\begin_layout LyX-Code + scan_for_matches -c pat_file2 < nucleotide_database | +\end_layout + +\begin_layout LyX-Code + scan_for_matches pat_file1 +\end_layout + +\begin_layout LyX-Code + The output will show things like +\end_layout + +\begin_layout LyX-Code + >seqid:[232,280][2,47] +\end_layout + +\begin_layout LyX-Code + matches pieces +\end_layout + +\begin_layout LyX-Code + Then, the actual section of the sequence that was matched can be +\end_layout + +\begin_layout LyX-Code + easily computed as [233,278] (remember, the positions start from +\end_layout + +\begin_layout LyX-Code + 1, not 0). +\end_layout + +\begin_layout LyX-Code + Let me finally add, you should do a few short experiments to see +\end_layout + +\begin_layout LyX-Code + whether or not such pipelining actually improves performance -- it +\end_layout + +\begin_layout LyX-Code + is not always obvious where the time is going, and I have +\end_layout + +\begin_layout LyX-Code + sometimes found that the added complexity of pipelining actually +\end_layout + +\begin_layout LyX-Code + slowed things up. + It gets its best improvements when there are +\end_layout + +\begin_layout LyX-Code + exact matches of more than just a few characters that can be +\end_layout + +\begin_layout LyX-Code + rapidly used to eliminate large sections of the database. +\end_layout + +\begin_layout LyX-Code +============= +\end_layout + +\begin_layout LyX-Code +Additions: +\end_layout + +\begin_layout LyX-Code +Feb 9, 1995: the pattern units ^ and $ now work as in normal regular +\end_layout + +\begin_layout LyX-Code + expressions. + That is +\end_layout + +\begin_layout LyX-Code + TTF $ +\end_layout + +\begin_layout LyX-Code + matches only TTF at the end of the string and +\end_layout + +\begin_layout LyX-Code + ^ TTF +\end_layout + +\begin_layout LyX-Code + matches only an initial TTF +\end_layout + +\begin_layout LyX-Code + The pattern unit +\end_layout + +\begin_layout LyX-Code + >>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +# Stuff that enables biotools. +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +export TOOLS_DIR="/home/m.hansen/tools" # Contains binaries for BLAST + and Vmatch. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +export INST_DIR="/home/m.hansen/maasha" # Contains scripts and modules. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +export DATA_DIR="/home/m.hansen/DATA" # Contains genomic data etc. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +export TMP_DIR="/home/m.hansen/maasha/tmp" # Required temporary directory. +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +export PATH="$PATH:$TOOLS_DIR/blast-2.2.17/bin:$TOOLS_DIR/vmatch.distribution" +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +export PATH="$INST_DIR/bin/:$INST_DIR/perl_scripts/:$INST_DIR/perl_scripts/b +iotools:$PATH" +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +export PERL5LIB="$PERL5LIB:$INST_DIR" +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +# Alias allowing power scripting with biotools +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +alias bioscript="perl -I $INST_DIR/Maasha -MBiotools=read_stream,get_recor +d,put_record -e" +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +# >>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<< +\end_layout + +\begin_layout Section +Getting Started +\end_layout + +\begin_layout Standard +The biotool +\series bold +list_biotools +\series default + lists all the biotools along with a description: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +list_biotools +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +align_seq Align sequences in stream using Muscle. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +analyze_seq Analysis the residue composition of each sequence + in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +analyze_vals Determine type, count, min, max, sum and mean for + values in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +blast_seq BLAST sequences in stream against a specified database. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +blat_seq BLAT sequences in stream against a specified genome. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +complement_seq Complement sequences in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_records Count the number of records in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_seq Count sequences in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_vals Count the number of times values of given keys exists + in stream. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +create_blast_db Create a BLAST database from sequences in stream for + use with BLAST. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +... +\end_layout + +\begin_layout Standard +To list the biotools for writing different formats, you can use unix's grep + like this: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +list_biotools | grep write +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_align Write aligned sequences in pretty alignment format. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_bed Write records from stream as BED lines. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_blast Write BLAST records from stream in BLAST tabular format + (-m8 and 9). +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_fasta Write sequences in FASTA format. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_psl Write records from stream in PSL format. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +write_tab Write records from stream as tab separated table. +\end_layout + +\begin_layout Standard +In order to find out how a specific biotool works, you just type the program + name without any arguments and press return and the usage of the biotool + will be displayed. + E.g. + +\series bold +read_fasta +\series default + : +\end_layout + +\begin_layout Standard +\begin_inset Box Frameless +position "t" +hor_pos "c" +has_inner_box 1 +inner_pos "t" +use_parbox 0 +width "100col%" +special "none" +height "1in" +height_special "totalheight" +status open + +\begin_layout LyX-Code + +\size scriptsize +Program name: read_fasta +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Author: Martin Asser Hansen - Copyright (C) - All rights reserved +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Contact: mail@maasha.dk +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Date: August 2007 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +License: GNU General Public License version 2 (http://www.gnu.org/copyleft/ +gpl.html) +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Description: Read FASTA entries. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Usage: read_fasta [options] -i +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Options: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-i | --data_in=] - Comma separated list of files + to read. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-n | --num=] - Limit number of records to read. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-I | --stream_in=] - Read input stream from file + - Default=STDIN +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + [-O | --stream_out=] - Write output stream to file + - Default=STDOUT +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +Examples: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i test.fna - Read FASTA entries from file. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i test1.fna,test2,fna - Read FASTA entries from files. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i '*.fna' - Read FASTA entries from files. +\end_layout + +\begin_layout LyX-Code + +\size scriptsize + read_fasta -i test.fna -n 10 - Read first 10 FASTA entries from + file. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +The Data Stream +\end_layout + +\begin_layout Subsection +How to read the data stream from file? +\begin_inset LatexCommand label +name "sub:How-to-read-stream" + +\end_inset + + +\end_layout + +\begin_layout Standard +You want to read a data stream that you previously have saved to file in + biotools format. + This can be done implicetly or explicitly. + The implicit way uses the 'stdout' stream of the Unix terminal: +\end_layout + +\begin_layout LyX-Code +cat | +\end_layout + +\begin_layout Standard +cat is the Unix command that reads a file and output the result to 'stdout' + --- which in this case is piped to any biotool represented by the . + It is also possible to read the data stream using '<' to direct the 'stdout' + stream into the biotool like this: +\end_layout + +\begin_layout LyX-Code + < +\end_layout + +\begin_layout Standard +However, that will not work if you pipe more biotools together. + Then it is much safer to read the stream from a file explicitly like this: +\end_layout + +\begin_layout LyX-Code + --stream_in= +\end_layout + +\begin_layout Standard +Here the filename is explicetly given to the biotool with + the switch +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_in. + This switch works with all biotools. + It is also possible to read in data from multiple sources by repeating + the explicit read step: +\end_layout + +\begin_layout LyX-Code + --stream_in= | --stream_in= +\end_layout + +\begin_layout Subsection +How to write the data stream to file? +\begin_inset LatexCommand label +name "sub:How-to-write-stream" + +\end_inset + + +\end_layout + +\begin_layout Standard +In order to save the output stream from a biotool to file, so you can read + in the stream again at a later time, you can do one of two things: +\end_layout + +\begin_layout LyX-Code + > +\end_layout + +\begin_layout Standard +All, the biotools write the data stream to 'stdout' by default which can + be written to a file by redirecting 'stdout' to file using '>' , however, + if one of the biotools for writing other formats is used then the both + the biotools records as well as the result output will go to 'stdout' in + a mixture causing havock! To avoid this you must use the switch +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_out that explictly tells the biotool to write the output stream to + file: +\end_layout + +\begin_layout LyX-Code + --stream_out= +\end_layout + +\begin_layout Standard +The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_out switch works with all biotools. +\end_layout + +\begin_layout Subsection +How to terminate the data stream? +\end_layout + +\begin_layout Standard +The data stream is never stops unless the user want to save the stream or + by supplying the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch that will terminate the stream: +\end_layout + +\begin_layout LyX-Code + --no_stream +\end_layout + +\begin_layout Standard +The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch only works with those biotools where it makes sense that + the user might want to terminale the data stream, +\emph on +i.e +\emph default +. + after an analysis step where the user wants to output the result, but not + the data stream. +\end_layout + +\begin_layout Subsection +How to write my results to file? +\begin_inset LatexCommand label +name "sub:How-to-write-result" + +\end_inset + + +\end_layout + +\begin_layout Standard +Saving the result of an analysis to file can be done implicitly or explicitly. + The implicit way: +\end_layout + +\begin_layout LyX-Code + --no_stream > +\end_layout + +\begin_layout Standard +If you use '>' to redirect 'stdout' to file then it is important to use + the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch to avoid writing a mix of biotools records and result to + the same file causing havock. + The safe way is to use the +\begin_inset ERT +status open + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out switch which explicetly tells the biotool to write the result + to a given file: +\end_layout + +\begin_layout LyX-Code + --result_out= +\end_layout + +\begin_layout Standard +Using the above method will not terminate the stream, so it is possible + to pipe that into another biotool generating different results: +\end_layout + +\begin_layout LyX-Code + --result_out= | --result_out= +\end_layout + +\begin_layout Standard +And still the data stream will continue unless terminated with +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream: +\end_layout + +\begin_layout LyX-Code + --result_out= --no_stream +\end_layout + +\begin_layout Standard +Or written to file using implicitly or explicity +\begin_inset LatexCommand eqref +reference "sub:How-to-write-result" + +\end_inset + +. + The explicit way: +\end_layout + +\begin_layout LyX-Code + --result_out= --stream_out= +\end_layout + +\begin_layout Subsection +How to read data from multiple sources? +\end_layout + +\begin_layout Standard +To read multiple data sources, with the same type or different type of data + do: +\end_layout + +\begin_layout LyX-Code + --data_in= | --data_in= +\end_layout + +\begin_layout Standard +where type is the data type a specific biotool reads. +\end_layout + +\begin_layout Section +Reading input +\end_layout + +\begin_layout Subsection +How to read biotools input? +\end_layout + +\begin_layout Standard +See +\begin_inset LatexCommand eqref +reference "sub:How-to-read-stream" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +How to read in data? +\end_layout + +\begin_layout Standard +Data in different formats can be read with the appropriate biotool for that + format. + The biotools are typicalled named 'read_' such as +\series bold +read_fasta +\series default +, +\series bold +read_bed +\series default +, +\series bold +read_tab +\series default +, etc., and all behave in a similar manner. + Data can be read by supplying the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +data_in switch and a file name to the file containing the data: +\end_layout + +\begin_layout LyX-Code + --data_in= +\end_layout + +\begin_layout Standard +It is also possible to read in a saved biotools stream (see +\begin_inset LatexCommand ref +reference "sub:How-to-read-stream" + +\end_inset + +) as well as reading data in one go: +\end_layout + +\begin_layout LyX-Code + --stream_in= --data_in= +\end_layout + +\begin_layout Standard +If you want to read data from several files you can do this: +\end_layout + +\begin_layout LyX-Code + --data_in= | --data_in= +\end_layout + +\begin_layout Standard +If you have several data files you can read in all explicitly with a comma + separated list: +\end_layout + +\begin_layout LyX-Code + --data_in=file1,file2,file3 +\end_layout + +\begin_layout Standard +And it is also possible to use file globbing +\begin_inset Foot +status open + +\begin_layout Standard +using the short option will only work if you quote the argument -i '*.fna' +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout LyX-Code + --data_in=*.fna +\end_layout + +\begin_layout Standard +Or in a combination: +\end_layout + +\begin_layout LyX-Code + --data_in=file1,/dir/*.fna +\end_layout + +\begin_layout Standard +Finally, it is possible to read in data in different formats using the appropria +te biotool for each format: +\end_layout + +\begin_layout LyX-Code + --data_in= | --data_in= ... +\end_layout + +\begin_layout Subsection +How to read FASTA input? +\end_layout + +\begin_layout Standard +Sequences in FASTA format can be read explicitly using +\series bold +read_fasta +\series default +: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= +\end_layout + +\begin_layout Subsection +How to read alignment input? +\end_layout + +\begin_layout Standard +If your alignment if FASTA formatted then you can +\series bold +read_align +\series default +. + It is also possible to use +\series bold +read_fasta +\series default + since the data is FASTA formatted, however, with +\series bold +read_fasta +\series default + the key ALIGN will be omitted. + The ALIGN key is used to determine which sequences belong to what alignment + which is required for +\series bold +write_align +\series default +. +\end_layout + +\begin_layout LyX-Code +read_align --data_in= +\end_layout + +\begin_layout Subsection +How to read tabular input? +\begin_inset LatexCommand label +name "sub:How-to-read-table" + +\end_inset + + +\end_layout + +\begin_layout Standard +Tabular input can be read with +\series bold +read_tab +\series default + which will read in all rows and chosen columns (separated by a given delimter) + from a table in text format. +\end_layout + +\begin_layout Standard +The table below: +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Standard +Human +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +ATACGTCAG +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +23524 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Dog +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +AGCATGAC +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +2442 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Mouse +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +GACTG +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +234 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Cat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +AAATGCA +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +2342 +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Standard +Can be read using the command: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= +\end_layout + +\begin_layout Standard +Which will result in four records, one for each row, where the keys V0, + V1, V2 are the default keys for the organism, sequence, and count, respectively. + It is possible to select a subset of colums to read by using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +cols switch which takes a comma separated list of columns numbers (first + column is designated 0) as argument. + So to read in only the sequence and the count so that the count comes before + the sequence do: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= --cols=2,1 +\end_layout + +\begin_layout Standard +It is also possible to name the columns with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys switch: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= --cols=2,1 --keys=COUNT,SEQ +\end_layout + +\begin_layout Subsection +How to read BED input? +\end_layout + +\begin_layout Standard +The BED (Browser Extensible Data +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://genome.ucsc.edu/FAQ/FAQformat" + +\end_inset + + +\end_layout + +\end_inset + +) format is a tabular format for data pertaining to one of the Eukaryotic + genomes in the UCSC genome brower +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://genome.ucsc.edu/" + +\end_inset + + +\end_layout + +\end_inset + +. + The BED format consists of up to 12 columns, where the first three are + mandatory CHR, CHR_BEG, and CHR_END. + The mandatory columns and any of the optional columns can all be read in + easily with the +\series bold +read_bed +\series default + biotool. +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= +\end_layout + +\begin_layout Standard +It is also possible to read the BED file with +\series bold +read_tab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-read-table" + +\end_inset + +), however, that will be more cumbersome because you need to specify the + keys: +\end_layout + +\begin_layout LyX-Code +read_tab --data_in= --keys=CHR,CHR_BEG,CHR_END ... +\end_layout + +\begin_layout Subsection +How to read PSL input? +\end_layout + +\begin_layout Standard +The PSL format is the output from BLAT and contains 21 mandatory fields + that can be read with +\series bold +read_psl +\series default +: +\end_layout + +\begin_layout LyX-Code +read_psl --data_in= +\end_layout + +\begin_layout Section +Writing output +\end_layout + +\begin_layout Standard +All result output can be written explicitly to file using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out switch which all result generating biotools have. + It is also possible to write the result to file implicetly by directing + 'stdout' to file using '>', however, that requires the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream swich to prevent a mixture of data stream and results in the file. + The explicit (and safe) way: +\end_layout + +\begin_layout LyX-Code +... + | --result_out= +\end_layout + +\begin_layout Standard +The implicit way: +\end_layout + +\begin_layout LyX-Code +... + | --no_stream > +\end_layout + +\begin_layout Subsection +How to write biotools output? +\end_layout + +\begin_layout Standard +See +\begin_inset LatexCommand eqref +reference "sub:How-to-write-stream" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +How to write FASTA output? +\begin_inset LatexCommand label +name "sub:How-to-write-fasta" + +\end_inset + + +\end_layout + +\begin_layout Standard +FASTA output can be written with +\series bold +write_fasta +\series default +. +\end_layout + +\begin_layout LyX-Code +... + | write_fasta --result_out= +\end_layout + +\begin_layout Standard +It is also possible to wrap the sequences to a given width using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +wrap switch allthough wrapping of sequence is generally an evil thing: +\end_layout + +\begin_layout LyX-Code +... + | write_fasta --no_stream --wrap=80 +\end_layout + +\begin_layout Subsection +How to write alignment output? +\begin_inset LatexCommand label +name "sub:How-to-write-alignment" + +\end_inset + + +\end_layout + +\begin_layout Standard +Pretty alignments with ruler +\begin_inset Foot +status collapsed + +\begin_layout Standard +'.' for every 10 residues, ':' for every 50, and '|' for every 100 +\end_layout + +\end_inset + + and consensus sequence +\begin_inset Note Note +status collapsed + +\begin_layout Standard +which reminds me to make that an option. +\end_layout + +\end_inset + + can be created with +\series bold +write_align +\series default +, what also have the optional +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +wrap switch to break the alignment into blocks of a given width: +\end_layout + +\begin_layout LyX-Code +... + | write_align --result_out= --wrap=80 +\end_layout + +\begin_layout Standard +If the number of sequnces in the alignment is 2 then a pairwise alignment + will be output otherwise a multiple alignment. + And if the sequence type, determined automagically, is protein, then residues + and symbols (+,\InsetSpace ~ +:,\InsetSpace ~ +.) will be used to show consensus according to the Blosum62 + matrix. +\end_layout + +\begin_layout Subsection +How to write tabular output? +\begin_inset LatexCommand label +name "sub:How-to-write-tab" + +\end_inset + + +\end_layout + +\begin_layout Standard +Outputting the data stream as a table can be done with +\series bold +write_tab +\series default +, which will write generate one row per record with the values as columns. + If you supply the optional +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +comment switch, when the first row in the table will be a 'comment' line + prefixed with a '#': +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --comment +\end_layout + +\begin_layout Standard +You can also change the delimiter from the default (tab) to +\emph on +e.g. + +\emph default + ',': +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --delimit=',' +\end_layout + +\begin_layout Standard +If you want the values output in a specific order you have to supply a comma + separated list using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys switch that will print only those keys in that order: +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --keys=SEQ_NAME,COUNT +\end_layout + +\begin_layout Standard +Alternatively, if you have some keys that you don't want in the tabular + output, use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_keys switch. + So to print all keys except SEQ and SEQ_TYPE do: +\end_layout + +\begin_layout LyX-Code +... + | write_tab --result_out= --no_keys=SEQ,SEQ_TYPE +\end_layout + +\begin_layout Standard +Finally, if you have a stream containing a mix of different records types, + +\emph on +e.g. + +\emph default + records with sequences and records with matches, then you can use +\series bold +write_tab +\series default + to output all the records in tabluar format, however, the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +comment, +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys, and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_keys switches will only respond to records of the first type encountered. + The reason is that outputting mixed records is probably not what you want + anyway, and you should remove all the unwanted records from the stream + before outputting the table: +\series bold +grab +\series default + is your friend (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-grab" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to write a BED output? +\begin_inset LatexCommand label +name "sub:How-to-write-BED" + +\end_inset + + +\end_layout + +\begin_layout Standard +Data in BED format can be output if the records contain the mandatory keys + CHR, CHR_BEG, and CHR_END using +\series bold +write_bed +\series default +. + If the optional keys are also present, they will be output as well: +\end_layout + +\begin_layout LyX-Code +write_bed --result_out= +\end_layout + +\begin_layout Subsection +How to write PSL output? +\begin_inset LatexCommand label +name "sub:How-to-write-PSL" + +\end_inset + + +\end_layout + +\begin_layout Standard +Data in PSL format can be output using +\series bold +write_psl: +\end_layout + +\begin_layout LyX-Code +write_psl --result_out= +\end_layout + +\begin_layout Section +Manipulating Records +\end_layout + +\begin_layout Subsection +How to select a few records? +\begin_inset LatexCommand label +name "sub:How-to-select-a-few-records" + +\end_inset + + +\end_layout + +\begin_layout Standard +To quickly get an overview of your data you can limit the data stream to + show a few records. + This also very useful to test the pipeline with a few records if you are + setting up a complex analysis using several biotools. + That way you can inspect that all goes well before analyzing and waiting + for the full data set. + All of the read_ biotools have the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num switch which will take a number as argument and only that number of + records will be read. + So to read in the first 10 FASTA entries from a file: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna --num=10 +\end_layout + +\begin_layout Standard +Another way of doing this is to use +\series bold +head_records +\series default + will limit the stream to show the first 10 records (default): +\end_layout + +\begin_layout LyX-Code +... + | head_records +\end_layout + +\begin_layout Standard +Using +\series bold +head_records +\series default + directly after one of the read_ biotools will be a lot slower than + using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num switch with the read_ biotools, however, +\series bold +head_records +\series default + can also be used to limit the output from all the other biotools. + It is also possible to give +\series bold +head_records +\series default + a number of records to show using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num switch. + So to display the first 100 records do: +\end_layout + +\begin_layout LyX-Code +... + | head_records --num=100 +\end_layout + +\begin_layout Subsection +How to select random records? +\begin_inset LatexCommand label +name "sub:How-to-select-random-records" + +\end_inset + + +\end_layout + +\begin_layout Standard +If you want to inspect a number of random records from the stream this can + be done with the +\series bold +random_records +\series default + biotool. + So if you have 1 mio records in the stream and you want to select 1000 + random records do: +\end_layout + +\begin_layout LyX-Code +... + | random_records --num=1000 +\end_layout + +\begin_layout Subsection +How to count all records in the data stream? +\end_layout + +\begin_layout Standard +To count all the records in the data stream use +\series bold +count_records +\series default +, which adds one record (which is not included in the count) to the data + stream. + So to count the number of sequences in a FASTA file you can do this: +\end_layout + +\begin_layout LyX-Code +cat test.fna | read_fasta | count_records --no_stream +\end_layout + +\begin_layout Standard +Which will write the last record containing the count to 'stdout': +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +count_records: 630 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +--- +\end_layout + +\begin_layout Standard +It is also possible to write the count to file using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out switch. +\end_layout + +\begin_layout Subsection +How to get the length of record values? +\begin_inset LatexCommand label +name "sub:How-to-get-value_length" + +\end_inset + + +\end_layout + +\begin_layout Standard +Use the +\series bold +length_vals +\series default + biotool to get the length of each value for a comma separated list of keys: +\end_layout + +\begin_layout LyX-Code +... + | length_vals --keys=HIT,PATTERN +\end_layout + +\begin_layout Subsection +How to grab specific records? +\begin_inset LatexCommand label +name "sub:How-to-grab" + +\end_inset + + +\end_layout + +\begin_layout Standard +The biotool +\series bold +grab +\series default + is related to the Unix grep and locates records based on matching keys + and/or values using either a pattern, a Perl regex, or a numerical evaluation. + To easily +\series bold +grab +\series default + all records in the stream that has any mentioning of the pattern 'human' + just pipe the data stream through +\series bold +grab +\series default + like this: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human +\end_layout + +\begin_layout Standard +This will search for the pattern 'human' in all keys and all values. + The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern switch takes a comma separated list of patterns, so in order to + match multiple patterns do: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human,mouse +\end_layout + +\begin_layout Standard +It is also possible to use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in switch instead of +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern. + +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in is used to read a file with one pattern per line: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern_in=patterns.txt +\end_layout + +\begin_layout Standard +If you want the opposite result --- to find all records that does not match + the patterns, add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +invert switch, which not only works with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern switch, but also with +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +regex and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +eval: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human --invert +\end_layout + +\begin_layout Standard +If you want to search the record keys only, +\emph on +e.g. + +\emph default + to find all records containing the key SEQ you can add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys_only switch. + This will prevent matching of SEQ in any record value, and in fact SEQ + is a not uncommon peptide sequence you could get an unwanted record. + Also, this will give an increase in speed since only the keys are searched: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=SEQ --keys_only +\end_layout + +\begin_layout Standard +However, if you are interested in finding the peptide sequence SEQ and not + the SEQ key, just add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +vals_only switch instead: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=SEQ --vals_only +\end_layout + +\begin_layout Standard +Also, if you want to grab for certain key/value pairs you can supply a comma + separated list of keys whos values will then be searched using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +keys switch. + This is handy if your records contain large genomic sequences and you dont + want to search the entire sequence for +\emph on +e.g. + +\emph default + the organism name --- it is much faster to tell +\series bold +grab +\series default + which keys to search the value for: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern=human --keys=SEQ_NAME +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout Standard +It is also possible to invoke flexible matching using regex (regular expressions +) instead of simple pattern matching. + In +\series bold +grab +\series default + the regex engine is Perl based and allows use of different type of wild + cards, alternatives, +\emph on +etc +\emph default + +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://perldoc.perl.org/perlreref.html" + +\end_inset + + +\end_layout + +\end_inset + +. + If you want to +\series bold +grab +\series default + records withs the sequence ATCG or GCTA you can do this: +\end_layout + +\begin_layout LyX-Code +... + | grab --regex='ATCG|GCTA' +\end_layout + +\begin_layout Standard +Or if you want to find sequences beginning with ATCG: +\end_layout + +\begin_layout LyX-Code +... + | grab --regex='^ATCG' +\end_layout + +\begin_layout Standard +You can also use +\series bold +grab +\series default + to locate records that fulfill a numerical property using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +eval switch witch takes an expression in three parts. + The first part is the key that holds the value we want to evaluate, the + second part holds one the six operators: +\end_layout + +\begin_layout Enumerate +Greater than: > +\end_layout + +\begin_layout Enumerate +Greater than or equal to: >= +\end_layout + +\begin_layout Enumerate +Less than: < +\end_layout + +\begin_layout Enumerate +Less than or equal to: <= +\end_layout + +\begin_layout Enumerate +Equal to: = +\end_layout + +\begin_layout Enumerate +Not equal to: != +\end_layout + +\begin_layout Enumerate +String wise equal to: eq +\end_layout + +\begin_layout Enumerate +String wise not equal to: ne +\end_layout + +\begin_layout Standard +And finally comes the number used in the evaluation. + So to +\series bold +grab +\series default + all records with a sequence length greater than 30: +\end_layout + +\begin_layout LyX-Code +... + length_seq | grab --eval='SEQ_LEN > 30' +\end_layout + +\begin_layout Standard +If you want to locate all records containing the pattern 'human' and where + the sequence length is greater that 30, you do this by running the stream + through +\series bold +grab +\series default + twice: +\end_layout + +\begin_layout LyX-Code +... + | grab --pattern='human' | length_seq | grab --eval='SEQ_LEN > 30' +\end_layout + +\begin_layout Standard +Finally, it is possible to do fast matching of expressions from a file using + the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +exact switch. + Each of these expressions has to be matched exactly over the entrie length, + which if useful if you have a file with accession numbers, that you want + to locate in the stream: +\end_layout + +\begin_layout LyX-Code +... + | grab --exact acc_no.txt | ... +\end_layout + +\begin_layout Standard +Using +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +exact is much faster than using +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in, because with +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +exact the expression has to be complete matches, where +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in looks for subpatterns. +\end_layout + +\begin_layout Standard +NB! To get the best speed performance, use the most restrictive +\series bold +grab +\series default + first. +\end_layout + +\begin_layout Subsection +How to remove keys from records? +\end_layout + +\begin_layout Standard +To remove one or more specific keys from all records in the data stream + use +\series bold +remove_keys +\series default + like this: +\end_layout + +\begin_layout LyX-Code +... + | remove_keys --keys=SEQ,SEQ_NAME +\end_layout + +\begin_layout Standard +In the above example SEQ and SEQ_NAME will be removed from all records if + they exists in these. + If all keys are removed from a record, then the record will be removed. +\end_layout + +\begin_layout Subsection +How to rename keys in records? +\end_layout + +\begin_layout Standard +Sometimes you want to rename a record key, +\emph on +e.g. + +\emph default + if you have read in a two column table with sequence name and sequence + in each column (see +\begin_inset LatexCommand ref +reference "sub:How-to-read-table" + +\end_inset + +) without specifying the key names, then the sequence name will be called + V0 and the sequence V1 as default in the +\series bold +read_tab +\series default + biotool. + To rename the V0 and V1 keys we need to run the stream through +\series bold +rename_keys +\series default + twice (one for each key to rename): +\end_layout + +\begin_layout LyX-Code +... + | rename_keys --keys=V0,SEQ_NAME | rename_keys --keys=V1,SEQ +\end_layout + +\begin_layout Standard +The first instance of +\series bold +rename_keys +\series default + replaces all the V0 keys with SEQ_NAME, and the second instance of +\series bold +rename_keys +\series default + replaces all the V1 keys with SEQ. + +\emph on +Et viola +\emph default + the data can now be used in the biotools that requires these keys. +\end_layout + +\begin_layout Section +Manipulating Sequences +\end_layout + +\begin_layout Subsection +How to get sequence lengths? +\end_layout + +\begin_layout Standard +The length for sequences in records can be determined with +\series bold +length_seq +\series default +, which adds the key SEQ_LEN to each record with the sequence length as + the value. + It also generates an extra record that is emitted last with the key TOTAL_SEQ_L +EN showing the total length of all the sequences. +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_seq +\end_layout + +\begin_layout Standard +It is also possible to determine the sequence length using the generic tool + +\series bold +length_vals +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-get-value_length" + +\end_inset + +, which determines the length of the values for a given list of keys: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_vals --keys=SEQ +\end_layout + +\begin_layout Standard +To obtain the total length of all sequences use +\series bold +sum_vals +\series default + like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_vals --keys=SEQ +\end_layout + +\begin_layout LyX-Code +| sum_vals --keys=SEQ_LEN +\end_layout + +\begin_layout Standard +The biotool +\series bold +analyze_seq +\series default + will also determine the length of each sequence (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-analyze" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to analyze sequence composition? +\begin_inset LatexCommand label +name "sub:How-to-analyze" + +\end_inset + + +\end_layout + +\begin_layout Standard +If you want to find out the sequence type, composition, length, as well + as GC content, indel content and proportions of soft and hard masked sequence, + then use +\series bold +analyze_seq +\series default +. + This handy biotool will determine all these things per sequence from which + it is easy to get an overview using the +\series bold +write_tab +\series default + biotool to output a table (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-tab" + +\end_inset + +). + So in order to determine the sequence composition of a FASTA file with + just one entry containing the sequence 'ATCG' we just read the data with + +\series bold +read_fasta +\series default + and run the output through +\series bold +analyze_seq +\series default + which will add the analysis to the record like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq ... +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:D: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +MIX_INDEX: 0.55 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:W: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:G: 16 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SOFT_MASK%: 63.75 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:B: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:V: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +HARD_MASK%: 0.00 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:H: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:S: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:N: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:.: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +GC%: 35.00 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:A: 8 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:Y: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:M: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:T: 44 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SEQ_TYPE: DNA +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:K: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:~: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SEQ: TTTCAGTTTGGGACGGAGTAAGGCCTTCCtttttttttttttttttttttttttttttgagaccgagtcttgctc +tgtcg +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +SEQ_LEN: +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +80 RES:R: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:C: 12 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:-: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +RES:U: 0 +\end_layout + +\begin_layout LyX-Code + +\size scriptsize +--- +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout Standard +Now to make a table of how may As, Ts, Cs, and Gs you can add the following: +\end_layout + +\begin_layout LyX-Code +... + | analyze_seq | write_tab --keys=RES:A,RES:T,RES:C,RES:G +\end_layout + +\begin_layout Standard +Or if you want to see the proportions of hard and soft masked sequence: +\end_layout + +\begin_layout LyX-Code +... + | analyse_seq | write_tab --keys=HARD_MASK%,SOFT_MASK% +\end_layout + +\begin_layout Standard +If you have a stack of sequences in one file and you want to determine the + mean GC content you can do it using the +\series bold +mean_vals +\series default + biotool: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq | mean_vals --keys=GC% +\end_layout + +\begin_layout Standard +Or if you want the total count of Ns you can use +\series bold +sum_vals +\series default + like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq | sum_vals --keys=RES:N +\end_layout + +\begin_layout Standard +The MIX_INDEX key is calculated as the count of the most common residue + over the sequence length, and can be used as a cut-off for removing sequence + tags consisting of mostly one nucleotide: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | analyze_seq | grab --eval='MIX_INDEX<0.85' +\end_layout + +\begin_layout Subsection +How to extract subsequences? +\begin_inset LatexCommand label +name "sub:How-to-extract" + +\end_inset + + +\end_layout + +\begin_layout Standard +In order to extract a subsequence from a longer sequence use the biotool + extract_seq, which will replace the sequence in the record with the subsequence + (this behaviour should probably be modified to be dependant of a +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +replace or a +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_replace switch +\begin_inset Note Note +status collapsed + +\begin_layout Standard +also in split_seq +\end_layout + +\end_inset + +). + So to extract the first 20 residues from all sequences do (first residue + is designated 1): +\end_layout + +\begin_layout LyX-Code +... + | extract_seq --beg=1 --len=20 +\end_layout + +\begin_layout Standard +You can also specify a begin and end coordinate set: +\end_layout + +\begin_layout LyX-Code +... + | extract_seq --beg=20 --end=40 +\end_layout + +\begin_layout Standard +If you want the subsequences from position 20 to the sequence end do: +\end_layout + +\begin_layout LyX-Code +... + | extract_seq --beg=20 +\end_layout + +\begin_layout Standard +If you want to extract subsequences a given distance from the sequence end + you can do this by reversing the sequence with the biotool +\series bold +reverse_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-reverse-seq" + +\end_inset + +, followed by +\series bold +extract_seq +\series default + to get the subsequence, and then +\series bold +reverse_seq +\series default + again to get the subsequence back in the original orientation: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in=test.fna | reverse_seq +\end_layout + +\begin_layout LyX-Code +| extract_seq --beg=10 --len=10 | reverse_seq +\end_layout + +\begin_layout Subsection +How to get genomic sequence? +\begin_inset LatexCommand label +name "sub:How-to-get-genomic-sequence" + +\end_inset + + +\end_layout + +\begin_layout Standard +The biotool +\series bold +get_genomic_seq +\series default + can extract subsequences for a given genome specified with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +genome switch explicitly using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +beg and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +end/ +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +len switches: +\end_layout + +\begin_layout LyX-Code +get_genome_seq --genome= --beg=1 --len=100 +\end_layout + +\begin_layout Standard +Alternatively, +\series bold +get_genome_seq +\series default + can be used to append the corresponding sequence to BED, PSL, and BLAST + records: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= | get_genome_seq --genome= +\end_layout + +\begin_layout Standard +It is also possible to include flaking sequence using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +flank switch. + So to include 50 nucleotides upstream and 50 nucleotides downstream for + each BED entry do: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= | get_genome_seq --genome= --flank=50 +\end_layout + +\begin_layout Subsection +How to upper-case sequences? +\end_layout + +\begin_layout Standard +Sequences can be shifted from lower case to upper case using +\series bold +uppercase_seq +\series default +: +\end_layout + +\begin_layout LyX-Code +... + | uppercase_seq +\end_layout + +\begin_layout Subsection +How to reverse sequences? +\begin_inset LatexCommand label +name "sub:How-to-reverse-seq" + +\end_inset + + +\end_layout + +\begin_layout Standard +The order of residues in a sequence can be reversed using reverse_seq: +\end_layout + +\begin_layout LyX-Code +... + | reverse_seq +\end_layout + +\begin_layout Standard +Note that in order to reverse/complement a sequence you also need the +\series bold +complement_seq +\series default + biotool (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-complement" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to complement sequences? +\begin_inset LatexCommand label +name "sub:How-to-complement" + +\end_inset + + +\end_layout + +\begin_layout Standard +DNA and RNA sequences can be complemented with +\series bold +complement_seq +\series default +, which automagically determines the sequence type: +\end_layout + +\begin_layout LyX-Code +... + | complement_seq +\end_layout + +\begin_layout Standard +Note that in order to reverse/complement a sequence you also need the +\series bold +reverse_seq +\series default + biotool (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-reverse-seq" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to remove indels from sequnces? +\end_layout + +\begin_layout Standard +Indels can be removed from sequences with the +\series bold +remove_indels +\series default + biotool. + This is useful if you have aligned some sequences (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-align" + +\end_inset + +) and extracted (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-extract" + +\end_inset + +) a block of subsequences from the alignment and you want to use these sequence + in a search where you need to remove the indels first. + '-', '~', and '.' are considered indels: +\end_layout + +\begin_layout LyX-Code +... + | remove_indels +\end_layout + +\begin_layout Subsection +How to shuffle sequences? +\end_layout + +\begin_layout Standard +All residues in sequences in the stream can be shuffled to random positions + using the +\series bold +shuffle_seq +\series default + biotool: +\end_layout + +\begin_layout LyX-Code +... + | shuffle_seq +\end_layout + +\begin_layout Subsection +How to split sequences into overlapping subsequences? +\end_layout + +\begin_layout Standard +Sequences can be slit into overlapping subsequences with the +\series bold +split_seq +\series default + biotool. +\end_layout + +\begin_layout LyX-Code +... + | split_seq --word_size=20 --uniq +\end_layout + +\begin_layout Subsection +How to determine the oligo frequency? +\end_layout + +\begin_layout Standard +In order to determine if any oligo usage is over represented in one or more + sequences you can determine the frequency of oligos of a given size with + +\series bold +oligo_freq +\series default +: +\end_layout + +\begin_layout LyX-Code +... + | oligo_freq --word_size=4 +\end_layout + +\begin_layout Standard +And if you have more than one sequence and want to accumulate the frequences + you need the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +all switch: +\end_layout + +\begin_layout LyX-Code +... + | oligo_freq --word_size=4 --all +\end_layout + +\begin_layout Standard +To get a meaningful result you need to write the resulting frequencies as + a table with +\series bold +write_tab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-tab" + +\end_inset + +), but first it is important to +\series bold +grab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-grab" + +\end_inset + +) the records with the frequencies to avoid full length sequences in the + table: +\end_layout + +\begin_layout LyX-Code +... + | oligo_freq --word_size=4 --all | grab --pattern=OLIGO --keys_only +\end_layout + +\begin_layout LyX-Code +| write_tab --no_stream +\end_layout + +\begin_layout Standard +And the resulting frequency table can be sorted with Unix sort (man sort). +\end_layout + +\begin_layout Subsection +How to search for sequences in genomes? +\end_layout + +\begin_layout Standard +See the following biotool: +\end_layout + +\begin_layout Itemize + +\series bold +patscan_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-patscan" + +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +blat_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAT" + +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +blast_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAST" + +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +vmatch_seq +\series default + +\begin_inset LatexCommand eqref +reference "sub:How-to-use-Vmatch" + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to search sequences for a pattern? +\begin_inset LatexCommand label +name "sub:How-to-use-patscan" + +\end_inset + + +\end_layout + +\begin_layout Standard +It is possible to search sequences in the data stream for patterns using + the +\series bold +patscan_seq +\series default + biotool which utilizes the powerful scan_for_matches engine. + Consult the documentation for scan_for_matches in order to learn how to + define patterns (the documentation is included in Appendix\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sec:scan_for_matches-README" + +\end_inset + +). +\end_layout + +\begin_layout Standard +To search all sequences for a simple pattern consisting of the sequence + ATCGATCG allowing for 3 mismatches, 2 insertions and 1 deletion: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | patscan_seq --pattern='ATCGATCG[3,2,1]' +\end_layout + +\begin_layout Standard +The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern switch takes a comma seperated list of patterns, so if you want + to search for more that one pattern do: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern='ATCGATCG[3,2,1],GCTAGCTA[3,2,1]' +\end_layout + +\begin_layout Standard +It is also possible to have a list of different patterns to search for in + a file with one pattern per line. + In order to get +\series bold +patscan_seq +\series default + to read these patterns use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +pattern_in switch: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern_in= +\end_layout + +\begin_layout Standard +To also scan the complementary strand in nucleotide sequences ( +\series bold +patscan_seq +\series default + automagically determines the sequence type) you need to add the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +comp switch: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern= --comp +\end_layout + +\begin_layout Standard +It is also possible to use +\series bold +patscan_seq +\series default + to output those records that does not contain a certain pattern by using + the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +invert switch: +\end_layout + +\begin_layout LyX-Code +... + | patscan_seq --pattern= --invert +\end_layout + +\begin_layout Standard +Finally, +\series bold +patscan_seq +\series default + can also scan for patterns in a given genome sequence, instead of sequences + in the stream, using the +\begin_inset ERT +status open + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +genome switch: +\end_layout + +\begin_layout LyX-Code +patscan --pattern= --genome= +\end_layout + +\begin_layout Subsection +How to use BLAT for sequence search? +\begin_inset LatexCommand label +name "sub:How-to-use-BLAT" + +\end_inset + + +\end_layout + +\begin_layout Standard +Sequences in the data stream can be matched against supported genomes using + +\series bold +blat_seq +\series default + which is a biotool using BLAT as the name might suggest. + Currently only Mouse and Human genomes are available and it is not possible + to use OOC files since there is still a need for a local repository for + genome files. + Otherwise it is just: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | blat_seq --genome= +\end_layout + +\begin_layout Standard +The search results can then be written to file with +\series bold +write_psl +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-PSL" + +\end_inset + +) or +\series bold +write_bed +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-BED" + +\end_inset + +) allthough with +\series bold +write_bed +\series default + some information will be lost). + It is also possible to plot chromosome distribution of the search results + using +\series bold +plot_chrdist +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-plot-chrdist" + +\end_inset + +) or the distribution of the match lengths using +\series bold +plot_lendist +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-plot-lendist" + +\end_inset + +) or a karyogram with the hits using +\series bold +plot_karyogram +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-plot-karyogram" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to use BLAST for sequence search? +\begin_inset LatexCommand label +name "sub:How-to-use-BLAST" + +\end_inset + + +\end_layout + +\begin_layout Standard +Two biotools exist for blasting sequences: +\series bold +create_blast_db +\series default + is used to create the BLAST database required for BLAST which is queried + using the biotool +\series bold +blast_seq +\series default +. + So in order to create a BLAST database from sequences in the data stream + you simple run: +\end_layout + +\begin_layout LyX-Code +... + | create_blast_db --database=my_database --no_stream +\end_layout + +\begin_layout Standard +The type of sequence to use for the database is automagically determined + by +\series bold +create_blast_db +\series default +, but don't have a mixture of peptide and nucleic acids sequences in the + stream. + The +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +database switch takes a path as argument, but will default to 'blastdb_ if not set. +\end_layout + +\begin_layout Standard +The resulting database can now be queried with sequences in another data + stream using +\series bold +blast_seq +\series default +: +\end_layout + +\begin_layout LyX-Code +... + | blast_seq --database=my_database +\end_layout + +\begin_layout Standard +Again, the sequence type is determined automagically and the appropriate + BLAST program is guessed (see below table), however, the program name can + be overruled with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +program switch. +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Standard +Subject sequence +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Query sequence +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Program guess +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +blastn +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +blastp +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +blastx +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Standard +Nucleotide +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +Protein +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Standard +tblastn +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Standard +Finally, it is also possible to use +\series bold +blast_seq +\series default + for blasting sequences agains a preformatted genome using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +genome switch instead of the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +database switch: +\end_layout + +\begin_layout LyX-Code +... + | blast_seq --genome= +\end_layout + +\begin_layout Subsection +How to use Vmatch for sequence search? +\begin_inset LatexCommand label +name "sub:How-to-use-Vmatch" + +\end_inset + + +\end_layout + +\begin_layout Standard +The powerful suffix array software package Vmatch +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://www.vmatch.de/" + +\end_inset + + +\end_layout + +\end_inset + + can be used for exact mapping of sequences against indexed genomes using + the biotool +\series bold +vmatch_seq +\series default +, which will e.g. + map 700000 ESTs to the human genome locating all 160 mio hits in less than + an hour. + Only nucleotide sequences and sequences longer than 11 nucleotides will + be mapped. + It is recommended that sequences consisting of mostly one nucleotide type + are removed. + This can be done with the +\series bold +analyze_seq +\series default + biotool +\begin_inset LatexCommand eqref +reference "sub:How-to-analyze" + +\end_inset + +. +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= +\end_layout + +\begin_layout Standard +It is also possible to allow for mismatches using the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +hamming_dist switch. + So to allow for 2 mismatches: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=2 +\end_layout + +\begin_layout Standard +Or to allow for 10% mismathing nucleotides: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=10p +\end_layout + +\begin_layout Standard +To allow both indels and mismatches use the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +edit_dist switch. + So to allow for one mismatch or one indel: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=1 +\end_layout + +\begin_layout Standard +Or to allow for 5% indels or mismatches: +\end_layout + +\begin_layout LyX-Code +... + | vmatch_seq --genome= --hamming_dist=5p +\end_layout + +\begin_layout Standard +Note that using +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +hamming_dist or +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +edit_dist greatly slows down vmatch considerably --- use with care. +\end_layout + +\begin_layout Standard +The resulting SCORE key can be replaced to hold the number of genome matches + of a given sequence (multi-mappers) is the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +count switch is given. +\end_layout + +\begin_layout Subsection +How to find all matches between sequences? +\begin_inset LatexCommand label +name "sub:How-to-find-matches" + +\end_inset + + +\end_layout + +\begin_layout Standard +All matches between two sequences can be determined with the biotool +\series bold +match_seq +\series default +. + The match finding engine underneath the hood of +\series bold +match_seq +\series default + is the super fast suffix tree program MUMmer +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://mummer.sourceforge.net/" + +\end_inset + + +\end_layout + +\end_inset + +, which will locate all forward and reverse matches between huge sequences + in a matter of minutes (if the repeat count is not too high and if the + word size used is appropriate). + Matching two +\emph on +Helicobacter pylori +\emph default + genomes (1.7Mbp) takes around 10 seconds: +\end_layout + +\begin_layout LyX-Code +... + | match_seq --word_size=20 --direction=both +\end_layout + +\begin_layout Standard +The output from +\series bold +match_seq +\series default + can be used to generate a dot plot with +\series bold +plot_matches +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-generate-dotplot" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to align sequences? +\begin_inset LatexCommand label +name "sub:How-to-align" + +\end_inset + + +\end_layout + +\begin_layout Standard +Sequences in the stream can be aligned with the +\series bold +align_seq +\series default + biotool that uses Muscle +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://www.drive5.com/muscle/muscle.html" + +\end_inset + + +\end_layout + +\end_inset + + as aligment engine. + Currently you cannot change any of the Muscle alignment parameters and + +\series bold +align_seq +\series default + will create an alignment based on the defaults (which are really good!): +\end_layout + +\begin_layout LyX-Code +... + | align_seq +\end_layout + +\begin_layout Standard +The aligned output can be written to file in FASTA format using +\series bold +write_fasta +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-fasta" + +\end_inset + +) or in pretty text using +\series bold +write_align +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-alignment" + +\end_inset + +). +\end_layout + +\begin_layout Subsection +How to create a weight matrix? +\end_layout + +\begin_layout Standard +If you want a weight matrix to show the sequence composition of a stack + of sequences you can use the biotool create_weight_matrix: +\end_layout + +\begin_layout LyX-Code +... + | create_weight_matrix +\end_layout + +\begin_layout Standard +The result can be output in percent using the +\begin_inset ERT +status open + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +percent switch: +\end_layout + +\begin_layout LyX-Code +... + | create_weight_matrix --percent +\end_layout + +\begin_layout Standard +The weight matrix can be written as tabular output with +\series bold +write_tab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-tab" + +\end_inset + +) after removeing the records containing SEQ with +\series bold +grab +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-grab" + +\end_inset + +): +\end_layout + +\begin_layout LyX-Code +... + | create_weight_matrix | grab --invert --keys=SEQ --keys_only +\end_layout + +\begin_layout LyX-Code +| write_tab --no_stream +\end_layout + +\begin_layout Standard +The V0 column will hold the residue, while the rest of the columns will + hold the frequencies for each sequence position. +\end_layout + +\begin_layout Section +Plotting +\end_layout + +\begin_layout Standard +There exists several biotools for plotting. + Some of these are based on GNUplot +\begin_inset Foot +status open + +\begin_layout Standard +\begin_inset LatexCommand url +target "http://www.gnuplot.info/" + +\end_inset + + +\end_layout + +\end_inset + +, which is an extremely powerful platform to generate all sorts of plots + and even though GNUplot has quite a steep learning curve, the biotools + utilizing GNUplot are simple to use. + GNUplot is able to output a lot of different formats (called terminals + in GNUplot), but the biotools focusses on three formats only: +\end_layout + +\begin_layout Enumerate +The 'dumb' terminal is default to the GNUplot based biotools and will output + a plot in crude ASCII text (Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Dumb-terminal" + +\end_inset + +). + This is quite nice for a quick and dirty plot to get an overview of your + data . +\end_layout + +\begin_layout Enumerate +The 'post' or 'postscript' terminal output postscript code which is publication + grade graphics that can be viewed with applications such as Ghostview, + Photoshop, and Preview. +\end_layout + +\begin_layout Enumerate +The 'svg' terminal output's scalable vector graphics (SVG) which is a vector + based format. + SVG is great because you can edit the resulting plot using Photoshop or + Inkscape +\begin_inset Foot +status collapsed + +\begin_layout Standard +Inkscape is a really handy drawing program that is free and open source. + Availble at +\begin_inset LatexCommand htmlurl +target "http://www.inkscape.org" + +\end_inset + + +\end_layout + +\end_inset + + if you want to add additional labels, captions, arrows, and so on and then + save the result in different formats, such as postscript without loosing + resolution. +\end_layout + +\begin_layout Standard +The biotools for plotting that are not based on GNUplot only output SVG + (that may change in the future). +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename lendist_ascii.png + lyxscale 70 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Dumb-terminal" + +\end_inset + +Dumb terminal +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +The output of a length distribution plot in the default 'dumb terminal' + to the terminal window. + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a histogram? +\begin_inset LatexCommand label +name "How-to-plot-histogram" + +\end_inset + + +\end_layout + +\begin_layout Standard +A generic histogram for a given value can be plotted with the biotool +\series bold +plot_histogram +\series default + (Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Histogram" + +\end_inset + +): +\end_layout + +\begin_layout LyX-Code +... + | plot_histogram --key=TISSUE --no_stream +\end_layout + +\begin_layout Standard +(Figure missing) +\end_layout + +\begin_layout Standard +\noindent +\align left +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename histogram.png + lyxscale 70 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Histogram" + +\end_inset + +Histogram +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a length distribution? +\begin_inset LatexCommand label +name "sub:How-to-plot-lendist" + +\end_inset + + +\end_layout + +\begin_layout Standard +Plotting of length distributions, weather sequence lengths, patterns lengths, + hit lengths, +\emph on +etc. + +\emph default + is a really handy thing and can be done with the the biotool +\series bold +plot_lendist +\series default +. + If you have a file with FASTA entries and want to plot the length distribution + you do it like this: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | length_seq +\end_layout + +\begin_layout LyX-Code +| plot_lendist --key=SEQ_LEN --no_stream +\end_layout + +\begin_layout Standard +The result will be written to the default dumb terminal and will look like + Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Dumb-terminal" + +\end_inset + +. +\end_layout + +\begin_layout Standard +If you instead want the result in postscript format you can do: +\end_layout + +\begin_layout LyX-Code +... + | plot_lendist --key=SEQ_LEN --terminal=post --result_out=file.ps +\end_layout + +\begin_layout Standard +That will generate the plot and save it to file, but not interrupt the data + stream which can then be used in further analysis. + You can also save the plot implicetly using '>', however, it is then important + to terminate the stream with the +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream switch: +\end_layout + +\begin_layout LyX-Code +... + | plot_lendist --key=SEQ_LEN --terminal=post --no_stream > file.ps +\end_layout + +\begin_layout Standard +The resulting plot can be seen in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Length-distribution" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename lendist.ps + lyxscale 50 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Length-distribution" + +\end_inset + +Length distribution +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +Length distribution of 630 piRNA like RNAs. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a chromosome distribution? +\begin_inset LatexCommand label +name "sub:How-to-plot-chrdist" + +\end_inset + + +\end_layout + +\begin_layout Standard +If you have the result of a sequence search against a multi chromosome genome, + it is very practical to be able to plot the distribution of search hits + on the different chromosomes. + This can be done with +\series bold +plot_chrdist +\series default +: +\end_layout + +\begin_layout LyX-Code +read_fasta --data_in= | blat_genome | plot_chrdist --no_stream +\end_layout + +\begin_layout Standard +The above example will result in a crude plot using the 'dumb' terminal, + and if you want to mess around with the results from the BLAT search you + probably want to save the result to file first (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-write-PSL" + +\end_inset + +). + To plot the chromosome distribution from the saved search result you can + do: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in=file.bed | plot_chrdist --terminal=post --result_out=plot.ps +\end_layout + +\begin_layout Standard +That will result in the output show in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Chromosome-distribution" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard + +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename chrdist.ps + lyxscale 50 + width 12cm + rotateAngle 90 + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Chromosome-distribution" + +\end_inset + +Chromosome distribution +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to generate a dotplot? +\begin_inset LatexCommand label +name "sub:How-to-generate-dotplot" + +\end_inset + + +\end_layout + +\begin_layout Standard +A dotplot is a powerful way to get an overview of the size and location + of sequence insertions, deletions, and duplications between two sequences. + Generating a dotplot with biotools is a two step process where you initially + find all matches between two sequences using the tool +\series bold +match_seq +\series default + (see\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "sub:How-to-find-matches" + +\end_inset + +) and plot the resulting matches with +\series bold +plot_matches +\series default +. + Matching and plotting two +\emph on +Helicobacter pylori +\emph default + genomes (1.7Mbp) takes around 10 seconds: +\end_layout + +\begin_layout LyX-Code +... + | match_seq | plot_matches --terminal=post --result_out=plot.ps +\end_layout + +\begin_layout Standard +The resulting dotplot is in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Dotplot" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename dotplot.ps + lyxscale 50 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Dotplot" + +\end_inset + +Dotplot +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +Forward matches are displayed in green while reverse matches are displayed + in red. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a sequence logo? +\end_layout + +\begin_layout Standard +Sequence logos can be generate with +\series bold +plot_seqlogo +\series default +. + The sequnce type is determined automagically and an entropy scale of 2 + bits and 4 bits is used for nucleotide and peptide sequences, respectively +\begin_inset Foot +status collapsed + +\begin_layout Standard +\begin_inset LatexCommand htmlurl +target "http://www.ccrnp.ncifcrf.gov/~toms/paper/hawaii/latex/node5.html" + +\end_inset + + +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout LyX-Code +... + | plot_seqlogo --no_stream --result_out=seqlogo.svg +\end_layout + +\begin_layout Standard +An example of a sequence logo can be seen in Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Sequence-logo" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename seqlogo.png + lyxscale 50 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Sequence-logo" + +\end_inset + +Sequence logo +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to plot a karyogram? +\begin_inset LatexCommand label +name "sub:How-to-plot-karyogram" + +\end_inset + + +\end_layout + +\begin_layout Standard +To plot search hits on genomes use +\series bold +plot_karyogram +\series default +, which will output a nice karyogram in SVG graphics: +\end_layout + +\begin_layout LyX-Code +... + | plot_karyogram --result_out=karyogram.svg +\end_layout + +\begin_layout Standard +The banding data is taken from the UCSC genome browser database and currently + only Human and Mouse is supported. + Fig.\InsetSpace ~ + +\begin_inset LatexCommand ref +reference "fig:Karyogram" + +\end_inset + + shows the distribution of piRNA like RNAs matched to the Human genome. +\end_layout + +\begin_layout Standard +\begin_inset Float figure +wide false +sideways false +status open + +\begin_layout Standard +\noindent +\align center +\begin_inset Graphics + filename karyogram.png + lyxscale 35 + width 12cm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Caption + +\begin_layout Standard +\begin_inset LatexCommand label +name "fig:Karyogram" + +\end_inset + +Karyogram +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Quote +Hits from a search of piRNA like RNAs in the Human genome is displayed as + short horizontal bars. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Uploading Results +\end_layout + +\begin_layout Subsection +How do I display my results in the UCSC Genome Browser? +\end_layout + +\begin_layout Standard +Results from the list of biotools below can be uploaded directly to a local + mirror of the UCSC Genome Browser using the biotool +\series bold +upload_to_ucsc +\series default +: +\end_layout + +\begin_layout Itemize +patscan_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-patscan" + +\end_inset + + +\end_layout + +\begin_layout Itemize +blat_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAT" + +\end_inset + + +\end_layout + +\begin_layout Itemize +blast_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-BLAST" + +\end_inset + + +\end_layout + +\begin_layout Itemize +vmatch_seq +\begin_inset LatexCommand eqref +reference "sub:How-to-use-Vmatch" + +\end_inset + + +\end_layout + +\begin_layout Standard +The syntax for uploading data the most simple way requires two mandatory + switches: +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +database, which is the UCSC database name (such as hg18, mm9, etc.) and +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +table which should be the users initials followed by an underscore and a + short description of the data: +\end_layout + +\begin_layout LyX-Code +... + | upload_to_ucsc --database=hg18 --table=mah_snoRNAs +\end_layout + +\begin_layout Standard +The +\series bold +upload_to_ucsc +\series default + biotool modifies the users ~/ucsc/my_tracks.ra file automagically (a backup + is created with the name ~/ucsc/my_tracks.ra~) with default values that + can be overridden using the following switches: +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +short_label - Short label for track - Default=database->table +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +long_label - Long label for track - Default=database->table +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +group - Track group name - Default= +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +priority - Track display priority - Default=1 +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +color - Track color - Default=147,73,42 +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +chunk_size - Chunks for loading - Default=10000000 +\end_layout + +\begin_layout Itemize +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +visibility - Track visibility - Default=pack +\end_layout + +\begin_layout Standard +Also, data in BED or PSL format can be uploaded with +\series bold +upload_to_ucsc +\series default + as long as these reference to genomes and chromosomes existing in the UCSC + Genome Browser: +\end_layout + +\begin_layout LyX-Code +read_bed --data_in= | upload_to_ucsc ... +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +read_psl --data_in= | upload_to_ucsc ... +\end_layout + +\begin_layout Section +Power Scripting +\end_layout + +\begin_layout Standard +It is possible to do commandline scripting of biotool records using Perl. + Because a biotool record essentially is a hash structure, you can pass + records to +\series bold +bioscript +\series default + command, which is a wrapper around the Perl executable that allows direct + manipulations of the records using the power of Perl. +\end_layout + +\begin_layout Standard +In the below example we replace in all records the value to the CHR key + with a forthrunning number: +\end_layout + +\begin_layout LyX-Code +... + | bioscript 'while($r=get_record( +\backslash +*STDIN)){$r->{CHR}=$i++; put_record($r)}' +\end_layout + +\begin_layout Standard +Something more useful would probably be to create custom FASTA headers. + E.g. + if we read in a BED file, lookup the genomic sequence, create a custom + FASTA header with +\series bold +bioscript +\series default + and output FASTA entries: +\end_layout + +\begin_layout LyX-Code +... + | bioscript 'while($r=get_record( +\backslash +*STDIN)){$r->{SEQ_NAME}= // +\end_layout + +\begin_layout LyX-Code +join("_",$r->{CHR},$r->{CHR_BEG},$r->{CHR_END}); put_record($r)}' +\end_layout + +\begin_layout Standard +And the output: +\end_layout + +\begin_layout LyX-Code +>chr2L_21567527_21567550 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_693380_693403 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_13859534_13859557 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_9005090_9005113 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_2106825_2106848 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout LyX-Code +>chr2L_14649031_14649054 +\end_layout + +\begin_layout LyX-Code +taccaaacggatgcctcagacatc +\end_layout + +\begin_layout Section +Trouble shooting +\end_layout + +\begin_layout Standard +Shoot the messenger! +\end_layout + +\begin_layout Section +\start_of_appendix +Keys +\begin_inset LatexCommand label +name "sec:Keys" + +\end_inset + + +\end_layout + +\begin_layout Standard +HIT +\end_layout + +\begin_layout Standard +HIT_BEG +\end_layout + +\begin_layout Standard +HIT_END +\end_layout + +\begin_layout Standard +HIT_LEN +\end_layout + +\begin_layout Standard +HIT_NAME +\end_layout + +\begin_layout Standard +PATTERN +\end_layout + +\begin_layout Section +Switches +\begin_inset LatexCommand label +name "sec:Switches" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_in +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +stream_out +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +no_stream +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +data_in +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +result_out +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +- +\backslash +/- +\end_layout + +\end_inset + +num +\end_layout + +\begin_layout Section +scan_for_matches README +\begin_inset LatexCommand label +name "sec:scan_for_matches-README" + +\end_inset + + +\end_layout + +\begin_layout LyX-Code + scan_for_matches: +\end_layout + +\begin_layout LyX-Code + A Program to Scan Nucleotide or Protein Sequences for Matching Patterns +\end_layout + +\begin_layout LyX-Code + Ross Overbeek +\end_layout + +\begin_layout LyX-Code + MCS +\end_layout + +\begin_layout LyX-Code + Argonne National Laboratory +\end_layout + +\begin_layout LyX-Code + Argonne, IL 60439 +\end_layout + +\begin_layout LyX-Code + USA +\end_layout + +\begin_layout LyX-Code +Scan_for_matches is a utility that we have written to search for +\end_layout + +\begin_layout LyX-Code +patterns in DNA and protein sequences. + I wrote most of the code, +\end_layout + +\begin_layout LyX-Code +although David Joerg and Morgan Price wrote sections of an +\end_layout + +\begin_layout LyX-Code +earlier version. + The whole notion of pattern matching has a rich +\end_layout + +\begin_layout LyX-Code +history, and we borrowed liberally from many sources. + However, it is +\end_layout + +\begin_layout LyX-Code +worth noting that we were strongly influenced by the elegant tools +\end_layout + +\begin_layout LyX-Code +developed and distributed by David Searls. + My intent is to make the +\end_layout + +\begin_layout LyX-Code +existing tool available to anyone in the research community that might +\end_layout + +\begin_layout LyX-Code +find it useful. + I will continue to try to fix bugs and make suggested +\end_layout + +\begin_layout LyX-Code +enhancements, at least until I feel that a superior tool exists. +\end_layout + +\begin_layout LyX-Code +Hence, I would appreciate it if all bug reports and suggestions are +\end_layout + +\begin_layout LyX-Code +directed to me at Overbeek@mcs.anl.gov. + +\end_layout + +\begin_layout LyX-Code +I will try to log all bug fixes and report them to users that send me +\end_layout + +\begin_layout LyX-Code +their email addresses. + I do not require that you give me your name +\end_layout + +\begin_layout LyX-Code +and address. + However, if you do give it to me, I will try to notify +\end_layout + +\begin_layout LyX-Code +you of serious problems as they are discovered. +\end_layout + +\begin_layout LyX-Code +Getting Started: +\end_layout + +\begin_layout LyX-Code + The distribution should contain at least the following programs: +\end_layout + +\begin_layout LyX-Code + README - This document +\end_layout + +\begin_layout LyX-Code + ggpunit.c - One of the two source files +\end_layout + +\begin_layout LyX-Code + scan_for_matches.c - The second source file +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + run_tests - A perl script to test things +\end_layout + +\begin_layout LyX-Code + show_hits - A handy perl script +\end_layout + +\begin_layout LyX-Code + test_dna_input - Test sequences for DNA +\end_layout + +\begin_layout LyX-Code + test_dna_patterns - Test patterns for DNA scan +\end_layout + +\begin_layout LyX-Code + test_output - Desired output from test +\end_layout + +\begin_layout LyX-Code + test_prot_input - Test protein sequences +\end_layout + +\begin_layout LyX-Code + test_prot_patterns - Test patterns for proteins +\end_layout + +\begin_layout LyX-Code + testit - a perl script used for test +\end_layout + +\begin_layout LyX-Code + Only the first three files are required. + The others are useful, +\end_layout + +\begin_layout LyX-Code + but only if you have Perl installed on your system. + If you do +\end_layout + +\begin_layout LyX-Code + have Perl, I suggest that you type +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + which perl +\end_layout + +\begin_layout LyX-Code + to find out where it installed. + On my system, I get the following +\end_layout + +\begin_layout LyX-Code + response: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + clone% which perl +\end_layout + +\begin_layout LyX-Code + /usr/local/bin/perl +\end_layout + +\begin_layout LyX-Code + indicating that Perl is installed in /usr/local/bin. + Anyway, once +\end_layout + +\begin_layout LyX-Code + you know where it is installed, edit the first line of files +\end_layout + +\begin_layout LyX-Code + testit +\end_layout + +\begin_layout LyX-Code + show_hits +\end_layout + +\begin_layout LyX-Code + replacing /usr/local/bin/perl with the appropriate location. + I +\end_layout + +\begin_layout LyX-Code + will assume that you can do this, although it is not critical (it +\end_layout + +\begin_layout LyX-Code + is needed only to test the installation and to use the "show_hits" +\end_layout + +\begin_layout LyX-Code + utility). + Perl is not required to actually install and run +\end_layout + +\begin_layout LyX-Code + scan_for_matches. + +\end_layout + +\begin_layout LyX-Code + If you do not have Perl, I suggest you get it and install it (it +\end_layout + +\begin_layout LyX-Code + is a wonderful utility). + Information about Perl and how to get it +\end_layout + +\begin_layout LyX-Code + can be found in the book "Programming Perl" by Larry Wall and +\end_layout + +\begin_layout LyX-Code + Randall L. + Schwartz, published by O'Reilly & Associates, Inc. +\end_layout + +\begin_layout LyX-Code + To get started, you will need to compile the program. + I do this +\end_layout + +\begin_layout LyX-Code + using +\end_layout + +\begin_layout LyX-Code + gcc -O -o scan_for_matches ggpunit.c scan_for_matches.c +\end_layout + +\begin_layout LyX-Code + If you do not use GNU C, use +\end_layout + +\begin_layout LyX-Code + cc -O -DCC -o scan_for_matches ggpunit.c scan_for_matches.c +\end_layout + +\begin_layout LyX-Code + which works on my Sun. + +\end_layout + +\begin_layout LyX-Code + Once you have compiled scan_for_matches, you can verify that it +\end_layout + +\begin_layout LyX-Code + works with +\end_layout + +\begin_layout LyX-Code + clone% run_tests tmp +\end_layout + +\begin_layout LyX-Code + clone% diff tmp test_output +\end_layout + +\begin_layout LyX-Code + You may get a few strange lines of the sort +\end_layout + +\begin_layout LyX-Code + clone% run_tests tmp +\end_layout + +\begin_layout LyX-Code + rm: tmp: No such file or directory +\end_layout + +\begin_layout LyX-Code + clone% diff tmp test_output +\end_layout + +\begin_layout LyX-Code + These should cause no concern. + However, if the "diff" shows that +\end_layout + +\begin_layout LyX-Code + tmp and test_output are different, contact me (you have a +\end_layout + +\begin_layout LyX-Code + problem). + +\end_layout + +\begin_layout LyX-Code + You should now be able to use scan_for_matches by following the +\end_layout + +\begin_layout LyX-Code + instructions given below (which is all the normal user should have +\end_layout + +\begin_layout LyX-Code + to understand, once things are installed properly). +\end_layout + +\begin_layout LyX-Code + ============================================================== +\end_layout + +\begin_layout LyX-Code +How to run scan_for_matches: +\end_layout + +\begin_layout LyX-Code + To run the program, you type need to create two files +\end_layout + +\begin_layout LyX-Code + 1. + the first file contains the pattern you wish to scan for; I'll +\end_layout + +\begin_layout LyX-Code + call this file pat_file in what follows (but any name is ok) +\end_layout + +\begin_layout LyX-Code + 2. + the second file contains a set of sequences to scan. + These +\end_layout + +\begin_layout LyX-Code + should be in "fasta format". + Just look at the contents of +\end_layout + +\begin_layout LyX-Code + test_dna_input to see examples of this format. + Basically, +\end_layout + +\begin_layout LyX-Code + each sequence begins with a line of the form +\end_layout + +\begin_layout LyX-Code + >sequence_id +\end_layout + +\begin_layout LyX-Code + and is followed by one or more lines containing the sequence. +\end_layout + +\begin_layout LyX-Code + Once these files have been created, you just use +\end_layout + +\begin_layout LyX-Code + scan_for_matches pat_file < input_file +\end_layout + +\begin_layout LyX-Code + to scan all of the input sequences for the given pattern. + As an +\end_layout + +\begin_layout LyX-Code + example, suppose that pat_file contains a single line of the form +\end_layout + +\begin_layout LyX-Code + p1=4...7 3...8 ~p1 +\end_layout + +\begin_layout LyX-Code + Then, +\end_layout + +\begin_layout LyX-Code + scan_for_matches pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + should produce two "hits". + When I run this on my machine, I get +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + >tst1:[6,27] +\end_layout + +\begin_layout LyX-Code + cguaacc ggttaacc gguuacg +\end_layout + +\begin_layout LyX-Code + >tst2:[6,27] +\end_layout + +\begin_layout LyX-Code + CGUAACC GGTTAACC GGUUACG +\end_layout + +\begin_layout LyX-Code + clone% +\end_layout + +\begin_layout LyX-Code +Simple Patterns Built by Matching Ranges and Reverse Complements +\end_layout + +\begin_layout LyX-Code + Let me first explain this simple pattern: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + p1=4...7 3...8 ~p1 +\end_layout + +\begin_layout LyX-Code + The pattern consists of three "pattern units" separated by spaces. +\end_layout + +\begin_layout LyX-Code + The first pattern unit is +\end_layout + +\begin_layout LyX-Code + p1=4...7 +\end_layout + +\begin_layout LyX-Code + which means "match 4 to 7 characters and call them p1". + The +\end_layout + +\begin_layout LyX-Code + second pattern unit is +\end_layout + +\begin_layout LyX-Code + 3...8 +\end_layout + +\begin_layout LyX-Code + which means "then match 3 to 8 characters". + The last pattern unit +\end_layout + +\begin_layout LyX-Code + is +\end_layout + +\begin_layout LyX-Code + ~p1 +\end_layout + +\begin_layout LyX-Code + which means "match the reverse complement of p1". + The first +\end_layout + +\begin_layout LyX-Code + reported hit is shown as +\end_layout + +\begin_layout LyX-Code + >tst1:[6,27] +\end_layout + +\begin_layout LyX-Code + cguaacc ggttaacc gguuacg +\end_layout + +\begin_layout LyX-Code + which states that characters 6 through 27 of sequence tst1 were +\end_layout + +\begin_layout LyX-Code + matched. + "cguaac" matched the first pattern unit, "ggttaacc" the +\end_layout + +\begin_layout LyX-Code + second, and "gguuacg" the third. + This is an example of a common +\end_layout + +\begin_layout LyX-Code + type of pattern used to search for sections of DNA or RNA that +\end_layout + +\begin_layout LyX-Code + would fold into a hairpin loop. +\end_layout + +\begin_layout LyX-Code +Searching Both Strands +\end_layout + +\begin_layout LyX-Code + Now for a short aside: scan_for_matches only searched the +\end_layout + +\begin_layout LyX-Code + sequences in the input file; it did not search the opposite +\end_layout + +\begin_layout LyX-Code + strand. + With a pattern of the sort we just used, there is not +\end_layout + +\begin_layout LyX-Code + need o search the opposite strand. + However, it is normally the +\end_layout + +\begin_layout LyX-Code + case that you will wish to search both the sequence and the +\end_layout + +\begin_layout LyX-Code + opposite strand (i.e., the reverse complement of the sequence). +\end_layout + +\begin_layout LyX-Code + To do that, you would just use the "-c" command line. + For example, +\end_layout + +\begin_layout LyX-Code + scan_for_matches -c pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + Hits on the opposite strand will show a beginning location greater +\end_layout + +\begin_layout LyX-Code + than te end location of the match. +\end_layout + +\begin_layout LyX-Code +Defining Pairing Rules and Allowing Mismatches, Insertions, and Deletions +\end_layout + +\begin_layout LyX-Code + Let us stop now and ask "What additional features would one need to +\end_layout + +\begin_layout LyX-Code + really find the kinds of loop structures that characterize tRNAs, +\end_layout + +\begin_layout LyX-Code + rRNAs, and so forth?" I can immediately think of two: +\end_layout + +\begin_layout LyX-Code + a) you will need to be able to allow non-standard pairings +\end_layout + +\begin_layout LyX-Code + (those other than G-C and A-U), and +\end_layout + +\begin_layout LyX-Code + b) you will need to be able to tolerate some number of +\end_layout + +\begin_layout LyX-Code + mismatches and bulges. +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + Let me first show you how to handle non-standard "rules for +\end_layout + +\begin_layout LyX-Code + pairing in reverse complements". + Consider the following pattern, +\end_layout + +\begin_layout LyX-Code + which I show as two line (you may use as many lines as you like in +\end_layout + +\begin_layout LyX-Code + forming a pattern, although you can only break a pattern at points +\end_layout + +\begin_layout LyX-Code + where space would be legal): +\end_layout + +\begin_layout LyX-Code + r1={au,ua,gc,cg,gu,ug,ga,ag} +\end_layout + +\begin_layout LyX-Code + p1=2...3 0...4 p2=2...5 1...5 r1~p2 0...4 ~p1 +\end_layout + +\begin_layout LyX-Code + The first "pattern unit" does not actually match anything; rather, +\end_layout + +\begin_layout LyX-Code + it defines a "pairing rule" in which standard pairings are +\end_layout + +\begin_layout LyX-Code + allowed, as well as G-A and A-G (in case you wondered, Us and Ts +\end_layout + +\begin_layout LyX-Code + and upper and lower case can be used interchangably; for example +\end_layout + +\begin_layout LyX-Code + r1={AT,UA,gc,cg} could be used to define the "standard rule" for +\end_layout + +\begin_layout LyX-Code + pairings). + The second line consists of six pattern units which +\end_layout + +\begin_layout LyX-Code + may be interpreted as follows: +\end_layout + +\begin_layout LyX-Code + p1=2...3 match 2 or 3 characters (call it p1) +\end_layout + +\begin_layout LyX-Code + 0...4 match 0 to 4 characters +\end_layout + +\begin_layout LyX-Code + p2=2...5 match 2 to 5 characters (call it p2) +\end_layout + +\begin_layout LyX-Code + 1...5 match 1 to 5 characters +\end_layout + +\begin_layout LyX-Code + r1~p2 match the reverse complement of p2, +\end_layout + +\begin_layout LyX-Code + allowing G-A and A-G pairs +\end_layout + +\begin_layout LyX-Code + 0...4 match 0 to 4 characters +\end_layout + +\begin_layout LyX-Code + ~p1 match the reverse complement of p1 +\end_layout + +\begin_layout LyX-Code + allowing only G-C, C-G, A-T, and T-A pairs +\end_layout + +\begin_layout LyX-Code + Thus, r1~p2 means "match the reverse complement of p2 using rule r1". +\end_layout + +\begin_layout LyX-Code + Now let us consider the issue of tolerating mismatches and bulges. +\end_layout + +\begin_layout LyX-Code + You may add a "qualifier" to the pattern unit that gives the +\end_layout + +\begin_layout LyX-Code + tolerable number of "mismatches, deletions, and insertions". +\end_layout + +\begin_layout LyX-Code + Thus, +\end_layout + +\begin_layout LyX-Code + p1=10...10 3...8 ~p1[1,2,1] +\end_layout + +\begin_layout LyX-Code + means that the third pattern unit must match 10 characters, +\end_layout + +\begin_layout LyX-Code + allowing one "mismatch" (a pairing other than G-C, C-G, A-T, or +\end_layout + +\begin_layout LyX-Code + T-A), two deletions (a deletion is a character that occurs in p1, +\end_layout + +\begin_layout LyX-Code + but has been "deleted" from the string matched by ~p1), and one +\end_layout + +\begin_layout LyX-Code + insertion (an "insertion" is a character that occurs in the string +\end_layout + +\begin_layout LyX-Code + matched by ~p1, but not for which no corresponding character +\end_layout + +\begin_layout LyX-Code + occurs in p1). + In this case, the pattern would match +\end_layout + +\begin_layout LyX-Code + ACGTACGTAC GGGGGGGG GCGTTACCT +\end_layout + +\begin_layout LyX-Code + which is, you must admit, a fairly weak loop. + It is common to +\end_layout + +\begin_layout LyX-Code + allow mismatches, but you will find yourself using insertions and +\end_layout + +\begin_layout LyX-Code + deletions much more rarely. + In any event, you should note that +\end_layout + +\begin_layout LyX-Code + allowing mismatches, insertions, and deletions does force the +\end_layout + +\begin_layout LyX-Code + program to try many additional possible pairings, so it does slow +\end_layout + +\begin_layout LyX-Code + things down a bit. +\end_layout + +\begin_layout LyX-Code +How Patterns Are Matched +\end_layout + +\begin_layout LyX-Code + Now is as good a time as any to discuss the basic flow of control +\end_layout + +\begin_layout LyX-Code + when matching patterns. + Recall that a "pattern" is a sequence of +\end_layout + +\begin_layout LyX-Code + "pattern units". + Suppose that the pattern units were +\end_layout + +\begin_layout LyX-Code + u1 u2 u3 u4 ... + un +\end_layout + +\begin_layout LyX-Code + The scan of a sequence S begins by setting the current position +\end_layout + +\begin_layout LyX-Code + to 1. + Then, an attempt is made to match u1 starting at the +\end_layout + +\begin_layout LyX-Code + current position. + Each attempt to match a pattern unit can +\end_layout + +\begin_layout LyX-Code + succeed or fail. + If it succeeds, then an attempt is made to match +\end_layout + +\begin_layout LyX-Code + the next unit. + If it fails, then an attempt is made to find an +\end_layout + +\begin_layout LyX-Code + alternative match for the immediately preceding pattern unit. + If +\end_layout + +\begin_layout LyX-Code + this succeeds, then we proceed forward again to the next unit. + If +\end_layout + +\begin_layout LyX-Code + it fails we go back to the preceding unit. + This process is called +\end_layout + +\begin_layout LyX-Code + "backtracking". + If there are no previous units, then the current +\end_layout + +\begin_layout LyX-Code + position is incremented by one, and everything starts again. + This +\end_layout + +\begin_layout LyX-Code + proceeds until either the current position goes past the end of +\end_layout + +\begin_layout LyX-Code + the sequence or all of the pattern units succeed. + On success, +\end_layout + +\begin_layout LyX-Code + scan_for_matches reports the "hit", the current position is set +\end_layout + +\begin_layout LyX-Code + just past the hit, and an attempt is made to find another hit. +\end_layout + +\begin_layout LyX-Code + If you wish to limit the scan to simply finding a maximum of, say, +\end_layout + +\begin_layout LyX-Code + 10 hits, you can use the -n option (-n 10 would set the limit to +\end_layout + +\begin_layout LyX-Code + 10 reported hits). + For example, +\end_layout + +\begin_layout LyX-Code + scan_for_matches -c -n 1 pat_file < test_dna_input +\end_layout + +\begin_layout LyX-Code + would search for just the first hit (and would stop searching the +\end_layout + +\begin_layout LyX-Code + current sequences or any that follow in the input file). +\end_layout + +\begin_layout LyX-Code +Searching for repeats: +\end_layout + +\begin_layout LyX-Code + In the last section, I discussed almost all of the details +\end_layout + +\begin_layout LyX-Code + required to allow you to look for repeats. + Consider the following +\end_layout + +\begin_layout LyX-Code + set of patterns: +\end_layout + +\begin_layout LyX-Code + p1=6...6 3...8 p1 (find exact 6 character repeat separated +\end_layout + +\begin_layout LyX-Code + by to 8 characters) +\end_layout + +\begin_layout LyX-Code + p1=6...6 3..8 p1[1,0,0] (allow one mismatch) +\end_layout + +\begin_layout LyX-Code + p1=3...3 p1[1,0,0] p1[1,0,0] p1[1,0,0] +\end_layout + +\begin_layout LyX-Code + (match 12 characters that are the remains +\end_layout + +\begin_layout LyX-Code + of a 3-character sequence occurring 4 times) +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + p1=4...8 0...3 p2=6...8 p1 0...3 p2 +\end_layout + +\begin_layout LyX-Code + (This would match things like +\end_layout + +\begin_layout LyX-Code + ATCT G TCTTT ATCT TG TCTTT +\end_layout + +\begin_layout LyX-Code + ) +\end_layout + +\begin_layout LyX-Code +Searching for particular sequences: +\end_layout + +\begin_layout LyX-Code + Occasionally, one wishes to match a specific, known sequence. +\end_layout + +\begin_layout LyX-Code + In such a case, you can just give the sequence (along with an +\end_layout + +\begin_layout LyX-Code + optional statement of the allowable mismatches, insertions, and +\end_layout + +\begin_layout LyX-Code + deletions). + Thus, +\end_layout + +\begin_layout LyX-Code + p1=6...8 GAGA ~p1 (match a hairpin with GAGA as the loop) +\end_layout + +\begin_layout LyX-Code + RRRRYYYY (match 4 purines followed by 4 pyrimidines) +\end_layout + +\begin_layout LyX-Code + TATAA[1,0,0] (match TATAA, allowing 1 mismatch) +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +Matches against a "weight matrix": +\end_layout + +\begin_layout LyX-Code + I will conclude my examples of the types of pattern units +\end_layout + +\begin_layout LyX-Code + available for matching against nucleotide sequences by discussing a +\end_layout + +\begin_layout LyX-Code + crude implemetation of matching using a "weight matrix". + While I +\end_layout + +\begin_layout LyX-Code + am less than overwhelmed with the syntax that I chose, I think that +\end_layout + +\begin_layout LyX-Code + the reader should be aware that I was thinking of generating +\end_layout + +\begin_layout LyX-Code + patterns containing such pattern units automatically from +\end_layout + +\begin_layout LyX-Code + alignments (and did not really plan on typing such things in by +\end_layout + +\begin_layout LyX-Code + hand very often). + Anyway, suppose that you wanted to match a +\end_layout + +\begin_layout LyX-Code + sequence of eight characters. + The "consensus" of these eight +\end_layout + +\begin_layout LyX-Code + characters is GRCACCGS, but the actual "frequencies of occurrence" +\end_layout + +\begin_layout LyX-Code + are given in the matrix below. + Thus, the first character is an A +\end_layout + +\begin_layout LyX-Code + 16% the time and a G 84% of the time. + The second is an A 57% of +\end_layout + +\begin_layout LyX-Code + the time, a C 10% of the time, a G 29% of the time, and a T 4% of +\end_layout + +\begin_layout LyX-Code + the time. + +\end_layout + +\begin_layout LyX-Code + C1 C2 C3 C4 C5 C6 C7 C8 +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + A 16 57 0 95 0 18 0 0 +\end_layout + +\begin_layout LyX-Code + C 0 10 80 0 100 60 0 50 +\end_layout + +\begin_layout LyX-Code + G 84 29 0 0 0 20 100 50 +\end_layout + +\begin_layout LyX-Code + T 0 4 20 5 0 2 0 0 +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + One could use the following pattern unit to search for inexact +\end_layout + +\begin_layout LyX-Code + matches related to such a "weight matrix": +\end_layout + +\begin_layout LyX-Code + {(16,0,84,0),(57,10,29,4),(0,80,0,20),(95,0,0,5), +\end_layout + +\begin_layout LyX-Code + (0,100,0,0),(18,60,20,2),(0,0,100,0),(0,50,50,0)} > 450 +\end_layout + +\begin_layout LyX-Code + This pattern unit will attempt to match exactly eight characters. +\end_layout + +\begin_layout LyX-Code + For each character in the sequence, the entry in the corresponding +\end_layout + +\begin_layout LyX-Code + tuple is added to an accumulated sum. + If the sum is greater than +\end_layout + +\begin_layout LyX-Code + 450, the match succeeds; else it fails. +\end_layout + +\begin_layout LyX-Code + Recently, this feature was upgraded to allow ranges. + Thus, +\end_layout + +\begin_layout LyX-Code + 600 > {(16,0,84,0),(57,10,29,4),(0,80,0,20),(95,0,0,5), +\end_layout + +\begin_layout LyX-Code + (0,100,0,0),(18,60,20,2),(0,0,100,0),(0,50,50,0)} > 450 +\end_layout + +\begin_layout LyX-Code + will work, as well. +\end_layout + +\begin_layout LyX-Code +Allowing Alternatives: +\end_layout + +\begin_layout LyX-Code + Very occasionally, you may wish to allow alternative pattern units +\end_layout + +\begin_layout LyX-Code + (i.e., "match either A or B"). + You can do this using something +\end_layout + +\begin_layout LyX-Code + like +\end_layout + +\begin_layout LyX-Code + ( GAGA | GCGCA) +\end_layout + +\begin_layout LyX-Code + which says "match either GAGA or GCGCA". + You may take +\end_layout + +\begin_layout LyX-Code + alternatives of a list of pattern units, for example +\end_layout + +\begin_layout LyX-Code + (p1=3...3 3...8 ~p1 | p1=5...5 4...4 ~p1 GGG) +\end_layout + +\begin_layout LyX-Code + would match one of two sequences of pattern units. + There is one +\end_layout + +\begin_layout LyX-Code + clumsy aspect of the syntax: to match a list of alternatives, you +\end_layout + +\begin_layout LyX-Code + need to fully the request. + Thus, +\end_layout + +\begin_layout LyX-Code + (GAGA | (GCGCA | TTCGA)) +\end_layout + +\begin_layout LyX-Code + would be needed to try the three alternatives. +\end_layout + +\begin_layout LyX-Code +One Minor Extension +\end_layout + +\begin_layout LyX-Code + Sometimes a pattern will contain a sequence of distinct ranges, +\end_layout + +\begin_layout LyX-Code + and you might wish to limit the sum of the lengths of the matched +\end_layout + +\begin_layout LyX-Code + subsequences. + For example, suppose that you basically wanted to +\end_layout + +\begin_layout LyX-Code + match something like +\end_layout + +\begin_layout LyX-Code + ARRYYTT p1=0...5 GCA[1,0,0] p2=1...6 ~p1 4...8 ~p2 p3=4...10 CCT +\end_layout + +\begin_layout LyX-Code + but that the sum of the lengths of p1, p2, and p3 must not exceed +\end_layout + +\begin_layout LyX-Code + eight characters. + To do this, you could add +\end_layout + +\begin_layout LyX-Code + length(p1+p2+p3) < 9 +\end_layout + +\begin_layout LyX-Code + as the last pattern unit. + It will just succeed or fail (but does +\end_layout + +\begin_layout LyX-Code + not actually match any characters in the sequence). +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +Matching Protein Sequences +\end_layout + +\begin_layout LyX-Code + Suppose that the input file contains protein sequences. + In this +\end_layout + +\begin_layout LyX-Code + case, you must invoke scan_for_matches with the "-p" option. + You +\end_layout + +\begin_layout LyX-Code + cannot use aspects of the language that relate directly to +\end_layout + +\begin_layout LyX-Code + nucleotide sequences (e.g., the -c command line option or pattern +\end_layout + +\begin_layout LyX-Code + constructs referring to the reverse complement of a previously +\end_layout + +\begin_layout LyX-Code + matched unit). + +\end_layout + +\begin_layout LyX-Code + You also have two additional constructs that allow you to match +\end_layout + +\begin_layout LyX-Code + either "one of a set of amino acids" or "any amino acid other than +\end_layout + +\begin_layout LyX-Code + those a given set". + For example, +\end_layout + +\begin_layout LyX-Code + p1=0...4 any(HQD) 1...3 notany(HK) p1 +\end_layout + +\begin_layout LyX-Code + would successfully match a string like +\end_layout + +\begin_layout LyX-Code + YWV D AA C YWV +\end_layout + +\begin_layout LyX-Code +Using the show_hits Utility +\end_layout + +\begin_layout LyX-Code + When viewing a large set of complex matches, you might find it +\end_layout + +\begin_layout LyX-Code + convenient to post-process the scan_for_matches output to get a +\end_layout + +\begin_layout LyX-Code + more readable version. + We provide a simple post-processor called +\end_layout + +\begin_layout LyX-Code + "show_hits". + To see its effect, just pipe the output of a +\end_layout + +\begin_layout LyX-Code + scan_for_matches into show_hits: +\end_layout + +\begin_layout LyX-Code + Normal Output: +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches -c pat_file < tmp +\end_layout + +\begin_layout LyX-Code + >tst1:[1,28] +\end_layout + +\begin_layout LyX-Code + gtacguaacc ggttaac cgguuacgtac +\end_layout + +\begin_layout LyX-Code + >tst1:[28,1] +\end_layout + +\begin_layout LyX-Code + gtacgtaacc ggttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + >tst2:[2,31] +\end_layout + +\begin_layout LyX-Code + CGTACGUAAC C GGTTAACC GGUUACGTACG +\end_layout + +\begin_layout LyX-Code + >tst2:[31,2] +\end_layout + +\begin_layout LyX-Code + CGTACGTAAC C GGTTAACC GGTTACGTACG +\end_layout + +\begin_layout LyX-Code + >tst3:[3,32] +\end_layout + +\begin_layout LyX-Code + gtacguaacc g gttaactt cgguuacgtac +\end_layout + +\begin_layout LyX-Code + >tst3:[32,3] +\end_layout + +\begin_layout LyX-Code + gtacgtaacc g aagttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + Piped Through show_hits: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches -c pat_file < tmp | show_hits +\end_layout + +\begin_layout LyX-Code + tst1:[1,28]: gtacguaacc ggttaac cgguuacgtac +\end_layout + +\begin_layout LyX-Code + tst1:[28,1]: gtacgtaacc ggttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + tst2:[2,31]: CGTACGUAAC C GGTTAACC GGUUACGTACG +\end_layout + +\begin_layout LyX-Code + tst2:[31,2]: CGTACGTAAC C GGTTAACC GGTTACGTACG +\end_layout + +\begin_layout LyX-Code + tst3:[3,32]: gtacguaacc g gttaactt cgguuacgtac +\end_layout + +\begin_layout LyX-Code + tst3:[32,3]: gtacgtaacc g aagttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + clone% +\end_layout + +\begin_layout LyX-Code + Optionally, you can specify which of the "fields" in the matches +\end_layout + +\begin_layout LyX-Code + you wish to sort on, and show_hits will sort them. + The field +\end_layout + +\begin_layout LyX-Code + numbers start with 0. + So, you might get something like +\end_layout + +\begin_layout LyX-Code + clone% scan_for_matches -c pat_file < tmp | show_hits 2 1 +\end_layout + +\begin_layout LyX-Code + tst2:[2,31]: CGTACGUAAC C GGTTAACC GGUUACGTACG +\end_layout + +\begin_layout LyX-Code + tst2:[31,2]: CGTACGTAAC C GGTTAACC GGTTACGTACG +\end_layout + +\begin_layout LyX-Code + tst3:[32,3]: gtacgtaacc g aagttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + tst1:[1,28]: gtacguaacc ggttaac cgguuacgtac +\end_layout + +\begin_layout LyX-Code + tst1:[28,1]: gtacgtaacc ggttaac cggttacgtac +\end_layout + +\begin_layout LyX-Code + tst3:[3,32]: gtacguaacc g gttaactt cgguuacgtac +\end_layout + +\begin_layout LyX-Code + clone% +\end_layout + +\begin_layout LyX-Code + In this case, the hits have been sorted on fields 2 and 1 (that is, +\end_layout + +\begin_layout LyX-Code + the third and second matched subfields). +\end_layout + +\begin_layout LyX-Code + show_hits is just one possible little post-processor, and you +\end_layout + +\begin_layout LyX-Code + might well wish to write a customized one for yourself. +\end_layout + +\begin_layout LyX-Code +Reducing the Cost of a Search +\end_layout + +\begin_layout LyX-Code + The scan_for_matches utility uses a fairly simple search, and may +\end_layout + +\begin_layout LyX-Code + consume large amounts of CPU time for complex patterns. + Someday, +\end_layout + +\begin_layout LyX-Code + I may decide to optimize the code. + However, until then, let me +\end_layout + +\begin_layout LyX-Code + mention one useful technique. + +\end_layout + +\begin_layout LyX-Code + When you have a complex pattern that includes a number of varying +\end_layout + +\begin_layout LyX-Code + ranges, imprecise matches, and so forth, it is useful to +\end_layout + +\begin_layout LyX-Code + "pipeline" matches. + That is, form a simpler pattern that can be +\end_layout + +\begin_layout LyX-Code + used to scan through a large database extracting sections that +\end_layout + +\begin_layout LyX-Code + might be matched by the more complex pattern. + Let me illustrate +\end_layout + +\begin_layout LyX-Code + with a short example. + Suppose that you really wished to match the +\end_layout + +\begin_layout LyX-Code + pattern +\end_layout + +\begin_layout LyX-Code + p1=3...5 0...8 ~p1[1,1,0] p2=6...7 3...6 AGC 3...5 RYGC ~p2[1,0,0] +\end_layout + +\begin_layout LyX-Code + In this case, the pattern units AGC 3...5 RYGC can be used to rapidly +\end_layout + +\begin_layout LyX-Code + constrain the overall search. + You can preprocess the overall +\end_layout + +\begin_layout LyX-Code + database using the pattern: +\end_layout + +\begin_layout LyX-Code + 31...31 AGC 3...5 RYGC 7...7 +\end_layout + +\begin_layout LyX-Code + Put the complex pattern in pat_file1 and the simpler pattern in +\end_layout + +\begin_layout LyX-Code + pat_file2. + Then use, +\end_layout + +\begin_layout LyX-Code + scan_for_matches -c pat_file2 < nucleotide_database | +\end_layout + +\begin_layout LyX-Code + scan_for_matches pat_file1 +\end_layout + +\begin_layout LyX-Code + The output will show things like +\end_layout + +\begin_layout LyX-Code + >seqid:[232,280][2,47] +\end_layout + +\begin_layout LyX-Code + matches pieces +\end_layout + +\begin_layout LyX-Code + Then, the actual section of the sequence that was matched can be +\end_layout + +\begin_layout LyX-Code + easily computed as [233,278] (remember, the positions start from +\end_layout + +\begin_layout LyX-Code + 1, not 0). +\end_layout + +\begin_layout LyX-Code + Let me finally add, you should do a few short experiments to see +\end_layout + +\begin_layout LyX-Code + whether or not such pipelining actually improves performance -- it +\end_layout + +\begin_layout LyX-Code + is not always obvious where the time is going, and I have +\end_layout + +\begin_layout LyX-Code + sometimes found that the added complexity of pipelining actually +\end_layout + +\begin_layout LyX-Code + slowed things up. + It gets its best improvements when there are +\end_layout + +\begin_layout LyX-Code + exact matches of more than just a few characters that can be +\end_layout + +\begin_layout LyX-Code + rapidly used to eliminate large sections of the database. +\end_layout + +\begin_layout LyX-Code +============= +\end_layout + +\begin_layout LyX-Code +Additions: +\end_layout + +\begin_layout LyX-Code +Feb 9, 1995: the pattern units ^ and $ now work as in normal regular +\end_layout + +\begin_layout LyX-Code + expressions. + That is +\end_layout + +\begin_layout LyX-Code + TTF $ +\end_layout + +\begin_layout LyX-Code + matches only TTF at the end of the string and +\end_layout + +\begin_layout LyX-Code + ^ TTF +\end_layout + +\begin_layout LyX-Code + matches only an initial TTF +\end_layout + +\begin_layout LyX-Code + The pattern unit +\end_layout + +\begin_layout LyX-Code + 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 V_|jPc|1$vOshITR9Fdpr{|C9nwhRCO literal 0 HcmV?d00001 diff --git a/bp_doc/dotplot.png b/bp_doc/dotplot.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fc4d1f61ac988ecdafc64c5d3c622cf65c2b94 GIT binary patch literal 56457 zcmZ^~by!th6eoNL=?3XiknWZgK}4im8l<}$=@Kac>FzE8>5}g5k`|Ee`Zn*(Gc#YE zKYXrwx!iO1+H3u4hsw*oM@Jz>fglL|gQU131i{)u5KI>mEcloEG^KI~!uV(=CMN$u zOpH?A-p1I>(g=cFQ{vRzxbXfFe+f>kjP%<7=C#t3=CnWOf>w^R>QGYTwxj2el{m^*4EQ!W7$_8vj1b1> z^)mT_u1`#4@vqWeMKdO{Iw{_y48EIVsOP_?2~_RU$yL}S zieu(Bc0xv%k#X^?QjNRdOeGU?^U7-P@=}s8=r)Y;FfIx3->PG-FDaPrtS!2goAq+2 zaIkbVc0qRW+G5$j{&zh}vcB$}F?`ub(JmsQw~FPFLAC2Rs>kLKLjRiQC%Yw$pTM{v zLz?}1Z=BpM7U@->yIFa?VsuSJ&A)M^c@tpT0(Q zMSUmRn>xwF!Dpml={0}-t>;s^!}u{y(tnWE7RFXYI9m9NkJzKFOez86XA79;2Qf35kq@LQ2u?~A$8Z8KI/}Ron@jyVtXQd5}hyS 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 G5Bh&!1_mGi literal 0 HcmV?d00001 diff --git a/bp_doc/karyogram.png b/bp_doc/karyogram.png index ec722928116fef5d5797797db72346c7b93455f4..40c72f193d6244d9d3b7318deb0b10871a54cc5b 100644 GIT binary patch literal 64528 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

w{ErVS8{Q47s9@?va#K` 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 r1ZRKhu98v-Sy{jTKIGFC~HaE586KP6uMS{fy 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 F{}1?=X!!sD literal 40470 zcmb@sV{~Lu*DhMII(E`=$F}Ws?2c{QR>!u}v2EM#*tV@x@4feYZ{PF#jIl?J+O>DB zwWjBM=KL)$D-I8f0}B8E;3XwQ6afH;65w|eXi(s1UgnN50D$n*Tv%9MQdpQ!-oe(y z+zR-UTV|4)I}6$+j*lthV{J@Ut7?TRAPxdGUc3*IkJ>c zU1C1UiVsm?#fnn;Td3#NRi@_@@6-BG^^xc1UDlQMr&~9aUxY}}Y+oz@2_IR;wTW%m z)5Co)jUND)>jwc2kVFW}PvhiV>Gd6ag%SV&I+Td!&Ga4nTZU%upsQUwl@*-@(>Hy) zp#T8&w&E0afDks|Inbqr5^znhzEcJ0A;6T0fD`}+1NaIsq=EWLKmv^0%9)V?3h;pC zT)a&HU^$Sx0}fDA3nDlR2qOY~vjq>v0qNm^@?$Il7lQ!kC4u+}{f32x>d6KHd|h8l zzye%g0BE3Q_htY(B7pqO{q4}zAL$hUg8-Ob$k$(?KL87S&@jo5%29p@Bx11jjgRK0 z-EYtUf$dEZytz4W002Cc6EM#aSW67mqXnqRn$~+S(_?6=2F(=%$qt4Xm@)iXp$E^$ z-1g0KwfH2LhX(urD8e83A((IlwDx$V6h=9RStom^CBRdUkPcS%8TMEXnGRo3ZTsJ$ ze?!WLofpX$DHt>u*dvYqF@KG%h&?xKEIXFH>8x`Z@6{^QxSO>BFO@Y0Mul2-c4~z) zm#(2<6ZGT4Aq#&)##9zw$sZrh#?In%AC6_tzn6Os z2#zQAsLqIYZl}Qyk88RY^`}4Yxlgt{W2t-M6p^0E!f2NxaZnX;xsazY^^vi~+r8a5 zVDT#P_b@YXpMLm|#gUJ4q`CZ|DP(qLv1amqJzlRZj69flsJK8qwu(;R;RJ2nEk={I zJiyLo94ALV=RWh9dh4*&7eH?0xEDGWJteh}lrX19vChW1)QIMmcKux6sL*U>_w{}49qIpkRf}20#lbyGx8d))*_U$MnV+X6 z&oOQ&Y9?)(&k=VL>3}}_;fmaDzmdTEq*K&YcY%KXar@ev5y^MtGy3_`JiU3){e&xz zz5IIZP-7PMu5hq7y@N^OUT|r+YnU@^`I+xK_j2!;Z_Z>srf2ct_~CSmSzldJy}{hN z^}Wl{*Oy(B<%pA>g}*_*^909)9)NI`LWd>#Hvvh{#9-glSYO-ZV}f_w9`lj76}=j@E1n$06=#?9 zCx^fMI*6b+QGQKVSaeBUYI;jqQ1lZH8J(W~!zC&C?ABkrIqjRPOkqc+(h~qKd*#={2b@$4JURk_7sn&n?d|D^?E) zker9DY{lQ@JP%(oZ>EdUf-<9c#JT0@BWc1ZinO7--HzjZf18%h8;>((IV4e2p^vGd zS5vA|DUWKWR3^6)c`6+y?_1a6#A)ns3%Np^x?S0C9C`S8kNlc`2`dI!qFDHGuYM2H z_3N|LBI1$xL-md=)aB~vjk`j3TbIVw#Wl$(^eMFy&5QG^tl+8d?3#Um@22bFbF&%! zYIl?Sn*?Ho_c1;VcKEv)+XOQYn}a8ddnC&gGvBS+U~w$W;_t%IkW%KHz+#y$XrHvN zSFgjq=CG^e`o8+DqwI+s4UU?Uwr9)IJMrGStMJ{i+taH3NK==!Ld?jyI+mB`8is=cY5-+P7ED>vnE zb}$v&uMoB{#?WtJB@s-&5yDl%hb7dd93-Q6s0;fF;f)xW2#jpcrQ#eD)Kv8pp39b7 z+ci!S9U8`bR2*4VoEhO&qu?jaD}DNyFWR{Z+g3bkUyZ=H`*}UD#jpxU_dpUti%cgC zCQC&S;i!M|Qgd1op`e;?9A;b$cWS#lJgOiJMz6@;yai-#XrF7rZzOJz^4eu*>PS?p zT-m;ndxs!)JY76kKKV-7@GYa+#W=7sydm+9(5H&1z#+pJBWT0DecvRwVW~@2wQq^_ zA*SNv;uvE8OEkryLn}xX#}AX$5dVHMa+X+J+B`Q^Sd7o>G{G1c`+Ho-$ohK@KVuTF zR~>yZbMwhU*8HM7sj0)Q5}cVS<D$d|KX z{bq)aN+)}X3T@IX5?i;!?y$0QAZ^gQ& z+xcItN878O?g$1T@j@N=x^Q-I9|$bpBd(NA2Tqk=Ssuq9u#2yF>In`lG2wjos}rjh zt-V(Iz8=34`t$(j=X?M_B!YnbH@_orKSxr5O*TJJC_oiX&u`Qo6#^t{cfXb-80fnW z-wQ;504UtGA9#r$Op6efQLl;{!aOuv5Lq9TJ?O08a|oJv8<8A|r#uY>3Ki6142Gc6 zjI$YJ0?E8eQ4SXQgp3IbbJ`1b1ll-bGPbJcUoJM}rf*H0E{Kn82r|)%vL;hlQ<4=V zO=&-Wm#1c=aff>b4F4`pQ~TYV8uObz#5R2^xLZX)JNNr=#Q4Am+BekqAN!>DV#^xO zX(RY?9twD~WQ>NjZ1(YPIYGq(4L`Kw{il=SW83JhNqC78evH#=HjkSx)oI0b)V?PQ zRpoc>rfeJ~(Il!SmMeRy1S`KS)GgAo3KaZeRvFLqBW^G^JzYMLIwpF+xQBvY{dRR# z%ED!uX^vuwV}POO<9BQzSjW=LRLe%1wwk)Caphch*M#Vl%ZcwuwW@Zse!;X8Vwdt% z^Avekc8!0(!=<;4yX`vF9o2zCD0c%-!?l1LnWqtI6#5wADBdETJdbf=qQE)pJBYGd zwwhNN4d++<&tL(LFCdjO9k(tS+cpkS(KIB1;v%sDZcOEyGG~q z-9_4yc3^7EKwM_+teiu_Xbx1@<)@30i$$-?$q?+D#=_7MZTXfQR%BKVc#S_`BmiMq zknm4Gx>=|#v`!Es@ppv~ECB~%$q|};I5g@pWR;+F0qQ)|*(_-x>0W6WESiw;6C+il zDU)ntdjt0#s$P%G2dE5oP0V&SPY5XbVa90ZDZ(jzpv;qgW}J~Ve|r+ex5?h)@pUtF zPkAZvLVbUG;fLmczTd8}s|*kefEQ{LiV12AvJ_+=! zs^5($bot4f;F6G?FdCl}YrTHZWvN{yu_^B(LL{T0b2EAAM%tm6;*c1gIOe(djg_`> z`cxF>N0jxXMj4is!X5s#{|#B6S5?RSaO>x zxFx9Mu-MvPv+AU*gwE!EqG9mjb#Ij^TDrh0+{<13!|WZM!Od!~RD_Z@k7v9mUxDmz z+r_bk-9>sc-5Dm^&8^59$l2|BR=0gx{sz20tlgAx1oDuL6T-*?x4R1goOzy z6Ai@$NU$3rJA5Y%4HxSah{)TU0h9KSKEPs=Mls3eOm&YR%rVY<0Gx5G2{xI#P`#mu ze}@WW#*OG#wJWu6w7c5NKIH5hpVk~Voo1iTq0gme2p>mZC*dG>l6lSzs~GV+HfN0I z5PDA&3ID^1A9a<;MbfD&CTJqlfdLD6XbU=xKi zNnGjFM`R6^#oLDC(e^3^Sro$N$rCv;lt)%uG(0htp-aBmY*zohCY?0TI>@T=sclts z1(Sov?)yrpJz2|h>tU<2Cn3*dhhitUH#oxbOVKmyGyQkvZ@Kbipr!%)0sSR1dB+S( z*VM@64V|Io$B|~$sY4t)&n-dCl0o}*XwnvT8e0l|wRO@~s^>RxR%Z#7t(V1Yx3_nV zutQUY7*d$dTF{+8H0C@wb2C4r_7-EMKFg|38#1_>4=t#!YQp05V>wrI_$gVnqVbCLKOVtN1jx|p{RyH z4|PDkL9bvX2&td?7Q#ShTp&ik^bk>Ms^p66Zr2v_^fK|ZXh9a!2frJ z(ZNyj{m&hAz;WIG)yENa1t@H3(km+~P>A@_a&kGGjzwYxClr$ZZdv9OIXHYWUra8S z{k|8&Pew-O^Ky`asqLhoudg2}A@twVi(rZkVObviz%~qogx9Dw7!1bL8433Kcv!mX z{`xGE$yoh`^1mqq?$E}Dr+1^ErRDXs;o9Da4=|a^OiM{ItyN#u#rpR(2HL2Fz7WTV1+uvO@Z}|X^aQ3${q3ist zx|`4a_Rl?Qfp|C4n=^^_WK|CfeU61JN?-;e7QX+SF8T~e7h1B5=!q>uT-^U!TAk$?(%k&M}SUPMF9D{r6Y_&p&4w z!()Ieb+xoS-%azUjB^LOs{D5`!nPlHxvp+NB7aIrZMyA6t*)+~I`X_<_a7V_T+n~} zhbP*p2sO`kTvei* zry|twFWD`~%j-RGphSbcypG}j#Nu|Tc&iY~1M=6J4(}gMiBJRAJ$7oFnVAU>hrP6W zy4(ONl5-BP%elITheyUw@qaZM_K%mBbPk_4@aTXkpp>?I{E37^TI8%(8_eIIZ~o7v z<)tz`PfLsGx}JBv-yT1JL{0O(S*fdI0fv_UR%+^cUNrWHA~vVQ{v!w^e?sG%*H^+@OXQ1_sjE$X|{rZPR$7m9?&d4HU3FeKfO-RB2uG9j2LiEq89MwdF z|Jts0vH%*v!^6Yf;Urue#lI)-6_vWtXG#Ot&N+2zL#I}qacTPJv6I6eG=k=Jhw-T_ z?m=1a_nTpB5|n=>VHd0DrB0Ll`s&fElt3=WXSXe|7AEo!`;otcI@zqYyIzrqM}w=O z{i_|@D7m}BbSW9qMcd*3xIJ)Wtwev(wHkfltIf_pYFI%h#+7g`paiS*!_n&{*r zXNHh0?pjZFGTDJJWIWm^c2UviQ|kL;f6FR=rXH%OV;W^;y$g+?5QD!oK|xLpEI^7b zBFjM*&-5pS2M%T)EEUiW1t!TB@C2HFBCU>U90O|5x6j$-orLe5W4|CWKp^K`QeB9w zSo+AF8W=X!@ATgx$0S6wp<1g73eE8*qSJNdeX(|wkUaFoe+oCCf);?cZ(KTYfwXAR zWla8^ndxaKq^3SgQqyt2?uA+t76{CPy4#5SdqjNt@ z3sEXw56vqO8|1wWTh5A*zh}vA>V*`5T=_nM9W@K^8HmZ*VZOxSy@#vG#chM2=5F2$ zN2dk|&kF*OXcN9UMO zcH7P!mjQ5opy5Y1Ubgp;*OYu4e(>w8_F2ypV(1nwc+<{VEvoXHXhwaW~5YOV7<-?)I99x17lRmsG@D1m~Dt1(HauXBwbLfAvb)fB8h> zhPH75)LW2n*>c5Wwi8WylxcN!?&jq#g^iV!Z{MyWw9ozaww_(l%Ub%)Q(fR}KkdT7a)40eJ|liI1HgDlG<@DF-z%GWnibAk&Em>{3mpcVL17r|=$s#X7L$A!cYNys zpEq=?fMnHrwwmZdQFBQR^HtgG!F{WVdE0{WKGete(^%jO8MaUu58evOC^Bp_rSUX3 zze$j5ccP~T0-jf!;Id+!sPqb4`g=V4PFul6ApYaNbWV| zA3Cw~4UTq8iki7=m#>7qCYI17grIG+Zu@_(A+h9 zydA?mfRa2P_-ax@ke)R+Pj(l_r9VU$=pDr0w~TvdVQTEq`;;WoLkGTcJ$Uc;ayby& zOhvXCY<=D?*psCG*zk%=NsX0Pcbz)4s-JP#ZTG;@cWm2nXt)zZQ&)GO^aR161~{+> zn87C{(U1m%$aKS?rp}MPKADoCei;DEc<${NZZ3nMfl0Mm6@2!g&T}0)FUX7?>@I(6 zXjK;--wkSdChWC_-`+P68Qe=}Oqh!X0|K%*dfS}u;xGPcVjI$MazeLe41VH>6pXFDkkqHlHo#4bV{8h&xcQdZLk3RWI;WVNdaRPJRK$=HQCQ5J zL971zc`~jyu#-=&b=|lzT-!I!*ghE;$;rV39xgJXh@;6f3&w7aWl#8c7Q%GOu~&zt(M<}(b)JNaln;D#ka{k;PKipFsT$v z{B%7v57*hkZ!X~oRhB0!q)6@9tDqf)sT-sL{1|ZE(tmYg2=TlMo*kKv_*SRGw6-@)H9}-1@%y_gyEmy8QczbaMI*zjU05RR4#wn*r3Yu%6q4v<#REjopwIZA@=v>=>hO@h zqNH44*}-dIye%FyATT&)>pKSMII~4=d@ioPe-JCcH*#xjuSv^>te2P5d{}#I3PPZ( zt(E8ATE&T$PnOZ^ZNkgY-@gL9yT$L}{or04x61;R{-Cf}53e-J4-vW(y?#WtcmkcT zkw zSZ`l}YQ)@&h>!#d_eJ)%Y*#z>fsI+-Z~6gCb|t8&#yC-?67{T=OkC-vNJJaLmgw-s z3a<$JL=qmzA3lQbd$E)Xw>YPA(8(qM_)y)#6Vcv1yI;u8@UKOs9S}{7#o)@Ih4huDB_*m4oDo2|$|& zE|_EI7Eu!xqGWPDUC{M;DWqMX)oijVEiX5WjKX5p02kl%Kgtb?4BZ7W7n<8?&Yxx#QM-2<7u3<*|Bu8 zp~(p=qanVE>FRSe9W?Ix?$OPTtPLBZArI9ngla=)F_VrU?YiVjXQtw6JyB8VLW3pk z;mjl1%hf?NST<)MM5dXrM<(^FG}%0ALcQN&-5=qQfoV_tyufmqH5=41HMJDjAdJtt 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' followed by the sequence name on a line of +its own, followed by one or my lines of sequence until the next entry or the end of the file. The resulting biopiece record consists of the following record type: + +{{{ +SEQ_NAME: test +SEQ_LEN: 10 +SEQ: ATCGATCGAC +--- +}}} + +For more about the FASTA format: + +http://en.wikipedia.org/wiki/Fasta_format + +==Usage== + +{{{ +read_fasta [options] -i +}}} + +==Options== + +{{{ +[-i | --data_in=] - Comma separated list of files or glob expression to read. +[-n | --num=] - Limit number of records to read. +[-I | --stream_in=] - Read input stream from file - Default=STDIN +[-O | --stream_out=] - Write output stream to file - Default=STDOUT +}}} + +==Examples= + +To read all FASTA entries from a file: + +{{{ +read_fasta -i test.fna +}}} + +To read in only 10 records from a FASTA file: + +{{{ +read_fasta -n 10 -i test.fna +}}} + +To read all FASTA entries from multiple files: + +{{{ +read_fasta -i test1.fna,test2.fna +}}} + +To read FASTS entries from multiple files using a glob expression: + +{{{ +read_fasta -i '*.fna' +}}} + + +==Author== + +Martin Asser Hansen - Copyright (C) - All rights reserved. +mail@maasha.dk +August 2007 + +==License== + +GNU General Public License version 2 + +http://www.gnu.org/copyleft/gpl.html + +==Help== + +*read_fasta* is part of the Biopieces framework. + +http://code.google.com/p/biopieces/ + diff --git a/code_perl/Maasha/Biopieces.pm b/code_perl/Maasha/Biopieces.pm index 3841595..e3b765c 100644 --- a/code_perl/Maasha/Biopieces.pm +++ b/code_perl/Maasha/Biopieces.pm @@ -23,7 +23,7 @@ package Maasha::Biopieces; # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DESCRIPTION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -# Routines for manipulation, parsing and emitting of human/machine readable biotool records. +# Routines for manipulation, parsing and emitting of human/machine readable biopieces records. # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -5656,12 +5656,12 @@ sub read_stream if ( not -t STDIN ) { $fh = &Maasha::Common::read_stdin(); } elsif ( not $path ) { -# &Maasha::Common::error( qq(no data stream) ); + &Maasha::Common::error( qq(no data stream) ); } else { $fh = &Maasha::Common::read_open( $path ); } -# $fh->autoflush(1) if $fh; +# $fh->autoflush(1) if $fh; # Disable file buffer for debugging. return $fh; } -- 2.39.5