Louis BECQUEY

doc

......@@ -2,6 +2,6 @@
CPLEXDir="/opt/ibm/ILOG/CPLEX_Studio128"
IEIGEN="/usr/local/include/eigen3"
INUPACK="/usr/local/include/nupack"
biorseoDir="/nhome/siniac/lbecquey/Software/biorseo"
jar3dexec="/nhome/siniac/lbecquey/Software/jar3dbin/jar3d_2014-12-11.jar"
bypdir="/nhome/siniac/lbecquey/Software/BayesPairing/bayespairing/src"
biorseoDir="/home/persalteas/Software/biorseo"
jar3dexec="/home/persalteas/Software/jar3dbin/jar3d_2014-12-11.jar"
bypdir="/home/persalteas/Software/BayesPairing/bayespairing/src"
......
No preview for this file type
% algorithm2e.sty --- style file for algorithms
%% Copyright 1996-2005 Christophe Fiorio
%
% This program may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
% This program consists of the files algorithm2e.sty and algorithm2e.tex
%
% Report bugs and comments to:
% fiorio@lirmm.fr
%
% $Id: algorithm2e.sty,v 3.9 2005/10/04 12:34:52 fiorio Exp $
%
% PACKAGES REQUIRED:
%
% - float (in contrib/supported/float)
% - ifthen (in base)
% - xspace (in packages/tools)
%
%%%%%%%%%%%%%%% Release 3.9
%
% History:
%
% - October 04 2005 - revision 3.9 -
% * ADD: - \setalcaphskip command which set the horizontal skip before Algorithm: in caption when
% used in ruled algorithm.
% * ADD: - SetAlgoInsideSkip command which allows to add an extra vertical space before and after
% the core of the algorithm (ie: \SetAlgoInsideSkip{bigskip})
% * CHANGE: - caption, when used with figure option, is no more controlled by algorithm2e package
% and so follows the exact behaviour of figures. The drawback is that you cannot change
% the typo with AlTitleFnt or CapFnt. The avantage is that if you use caption package,
% it works.
% * FIX: - problem with numbering line and pdflatex
% * FIX: - error when algorithm2e package was used with beamer and listings together
% - February 12 2005 - revision 3.8 -
% * FIX: - extra line with noend option.
% - February 10 2005 - revision 3.7 -
% * ADD: - sidecomment: different macros allowing to put text right after code
% on the same line. They are defined in the same time comment macros
% are defined with a star after the macro name. By default comments
% are right justified but this can be change with appropriate option
% in the macro. Ex:
% . default: \tcc*{side comment}
% . same as previous: \tcc*[r]{side comment}
% . left justify: \tcc*[l]{side comment}
% . here: \tcc*[h]{side comment} don't put the end of line mark before
% comment (; by default) and don't end the line.
% . flushed: \tcc*[f]{side comment} same as the precedent but right
% justified
% * ADD: - scright OPTION (default): right justified side comments (side comments
% are flushed to the righr)
% * ADD: - scleft OPTION: left justified side comments (side comments are
% put right after the code line)
% * ADD: - \SetSideCommentLeft acts as scleft option
% * ADD: - \SetSideCommentRight acts as scright option
% * ADD: - block like macro side text: all macro defining a block allows now
% to put text right after key words by putting text into (). Done to
% be used with sidecomment macros, but all text can be used. Ex:
% \eIf(\tcc*[f]{then comment}){test}{then text}(else side text){else text}
% * ADD: - fillcomment OPTION (default): end mark of comment is flushed to the
% right so comments fill all the width of text
% * ADD: - nofillcomment OPTION: end mark of comment is put right after the
% comment
% * ADD: - \SetNoFillComment acts as nofillcomment option.
% * ADD: - \SetFillComment acts as fillcomment option.
% * ADD: - dotocloa OPTION which adds an entry in the toc for the list of
% algorithms. This option load package tocbibind if not already done
% and so list of figures and list of tables are also added in the toc.
% If you want to control which ones of the lists will be added in the
% toc, please load package tocbibind before package algorithm and give
% it the options you want.
% * FIX: - vertical spacing for uif macro with noend option
% * FIX: - all the compatibility problems between caption and other packages
% * FIX: - typographical differences between list of algorithms and other lists
% when in report or book
%
% - January 24 2005 - revision 3.6 -
% * FIX: - vertical spacing and space characters at the beginning or end of
% comments.
% line numbers of comments not in the nlsty.
% Thanks to Arnaud Giersch for his comments and suggestions.
% * FIX: - Set*Sty macro: the styles defined was not protected and was modified
% by surrounding context. For example KwTo in a \For{}{} was in bold AND
% italic instead of just in bold.
% * FIX: - line number misplacement after \Indp
%
% - January 21 2005 - revision 3.5 -
% * ADD: - hidden numbering of the lines. Lines are auto-numbered but numbers
% are shown only on lines you specify:
% * linesnumberedhidden option or \linesnumberedhidden macro activate
% this functionnality.
% * \showln and \showlnlabel{lab} macros make the number visible on
% the line. \showlnlabel{lab} allows to set a label for this line.
% Thanks to Samson de Jager who makes this suggestion and provides the
% macros.
% * ADD: - \AlCapFnt and \SetAlCapFnt which allow to have a different font for
% caption. Works like \AlFnt and \SetAlFnt and by default is the same.
% * ADD: - \AlCapSkip skip length. This vertical space is added before caption
% in plain ou boxed mode. It allows to change distance between text
% and caption.
% * FIX: - caption compatible with IEEEtran class.
% * FIX: - some vertical spacing error with \uIf macros (Thanks to Arnaud Giersch)
% * FIX: - Procedure and Function: lines are also numbered like algorithms
% * FIX: - CommentSty was not used for Comments
%
% - January 10 2005 - revision 3.4 -
% * FIX: - caption compatible with new release of Beamer class.
%
% - June 16 2004 - revision 3.3 -
% * FIX: - Hyperlink references of Hyperref package works now if compiled with pdflatex
% and [naturalnames] option of hyperref package is used.
% * FIX: - algorithm[H] had problem in an list environment - corrected
% * FIX: - interline was not so regular in nested blocks - corrected
% * ADD - \Setvlineskip macro which set the vertical skip after the little horizontal
% rule which closes a block in Vlined mode. By default 0.8ex
%
% - June 11 2004 - revision 3.2 - AUTO NUMBERING LINES !!!
% * ADD: auto numbering of the lines (the so asked and so long awaiting feature)
% this feature is managed by 3 options and 3 commands:
% - linesnumbered option: lines of the algo are numbered except for comments and
% input/output (KwInput and KwInOut)
% - commentsnumbered option: makes comments be numbered
% - inoutnumbered option: makes data input/output be numbered
% - \nllabel{lab} labels the line so you can cite with \ref{lab}
% - \linesnumbered make the following algorithms having auto-numbered lines
% - \linesnotnumbered make the following algorithms having no auto-numbered lines
% * Change: algo2e option renames listofalgorithm in listofalgorithme
% * FIX: new solution for compatibility with color package, more robust and not tricky.
% Many thanks to David Carlisle for his advices
%
% - June 09 2004 - revision 3.1 -
% * Change: \SetKwSwitch command defines an additionnal
% macro \uCase and \Case prints end
% * Change: now macros SetKw* do a renewcommand if the
% keyword is already defined. So you can redefine
% default definition at your own convenience or
% change your definition without introducing a
% new macro and changing your text.
% * ADD: new macro \SetKwIF which do \SetKwIf and
% \SetKwIfElseIf.The following default definition has been added:
% \SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{endif}
% and so you get the macros;
% \If \eIf \lIf \uIf \ElseIf \uElseIf \lElseIf \Else
% \uElse \lElse
% * ADD: new macro \SetAlgoSkip which allow to fix the
% vertical skip before and after the algorithms.
% Default is smallskip, do \SetAlgoSkip{} if you
% don't want an extra space or \SetAlgoSkip{medskip}
% or \SetAlgoSkip{bigskip} if you want bigger space.
% * ADD: macro \SetKwIf defines in addition a new macro
% \uElse (depending on wat name you
% have given in #2 arg).
% * ADD: macro \SetKwIfElseIf defines in addition a new macro
% \uElse and \ugElseIf (depending on what name you
% have given in #2 and #3 arg).
% * Change: baseline of algorithm is now top, so two
% algorithms can be put side by side.
% * FIX: Compatibility with color package solved. The problem
% was due to a redefinition of standard macros by color package
% This solves compatibility problem with other packages
% as pstcol or colortbl.
% (notified by Dirk Fressmann, Antti Tarvainen and Koby Crammer)
% * Fix: extra little shift to the right with boxed style
% algorithm removed (notified by P. Tanovski)
% * Fix: algoln option was buggy (notified bye Jiaying Shen)
% * Fix: german and portuges option didn't work due to bad
% typo (notified by Martin Sievers, Thorsten Vitt
% and Jeronimo Pellegrini)
%
% - February 13 2004 - revision 3.0 -
% * Major revision which makes the package independent from
% float.sty, so now
% - algorithm* works better, in particular can be used in
% multicols environments
% - (known bug corrected)
% [H] works now for all sort of environment but is
% handled differently for classic environment and star
% environment (algorithm, figure, procedure and
% function). For star environment, H acts like for
% classical figure environment, so it doesn't stay here
% absolutely.
% - (known bug corrected)
% you can use now floatflt package with algorithm
% package and even with figure option. Beware that if
% you want to put an algorithm inside a floatingfigure,
% it cannot be floating, so [H] is required and then
% figure option should not be used, since standard
% figure[H] are still floating with LaTeX.
% * boxruled: a new style added. Possible now since no
% style no more defined by the float package.
% * nocaptionofalgo: dosen't print Algorithm #: in the
% caption for algorithm in ruled or algoruled style.
% note: this is just documentation of a macro which was
% already in the package.
% - December 14 2003 - revision 2.52 -
% * output message shorter
% * french keyword macro \PourTous was missing for
% longend option, it has been added.
% * TitleofAlgo prints Function or Procedure in
% corresponding environments.
%
% - October 27 2003 - revision 2.51 - Revision submitted to CTAN archive
% * correction of a minor which make caption in procedure
% and function to be blanck with pdfscreen package
% (thanks to Joel Gossens for the notification)
% * add two internal definition to avoid some errors when
% used with Hyperref package (Hyperref package need to
% define new counter macro from existing ones, and
% don't do it for algorithm2e package, so we do it)
%
% - October 17 2003 - revision 2.50 - first revision for CTAN archive
%
% * add \AlFnt and \SetAlFnt{font} macros:
% \AlFnt is used at the beginning of the caption and the
% body of algorithm in order to define the fonts used
% for typesetting algorithms. You can use it elsewhere
% you want to typeset text as algorithm. For example
% you can do \SetAlFnt{\small\sf} to have algorithms
% typeset in small sf font. Default is nothing so
% algorithm is typeset as the text of the document.
% * add \AlTitleFnt{text} and \SetAlTitleFnt{font} macros:
% The {Algorithm: } in the caption is typeset with
% \AlTitleFnt{Algorithm:}. You can use it to have text
% typeset as {Algorithm:} of captions. Default is
% textbf.
% Default can be redefined by \SetAlTitleFnt{font}.
% * add CommentSty typo for text comment.
% * add some compatibility with hyperref package (still
% an error on multiply defined refs but pdf correctly
% generated)
% * flush text to left in order to have correct
% indentation even with class as amsart which center
% all figures
% * add german, portugues and czech options for title of
% algorithms and typo.
% * add portuguese translation of predefined keywords
% * add czech translation of some predefined keywords
%
% - December 23 2002 - revision 2.40
% * add some french keyword missing
% * add function* and procedure* environment like
% algorithme* environment: print in one column even
% if twocolumn option is specified for the document.
% * add a new macro \SetKwComment to define macro which
% writes comments in the text. First argument is the
% name of the macro, second is the text put before the
% comment, third is the text put at the end of the
% comment.Default are \tcc and \tcp
% * add new options to change the way algo are numbered:
% [algopart] algo are numbered within part (counter must exist)
% [algochapter] algo are numbered within chapter
% [algosection] algo are numbered within section
%
% - March 27 2002 - revision 2.39
% * Gilles Geeraerts: added the \SetKwIfElseIf to manage
% if (c)
% i;
% else if (c)
% i;
% ...
% else
% i;
% end
% * Also added \gIf \gElsIf \gElse.
%
% - January 02 2001 - revision 2.38
% * bugs related to the caption in procedure and function
% environment are corrected.
% * bug related to option noend (extra vertical space added
% after block command as If or For) is corrected.
% * czech option language added (thanks to Libor Bus: l.bus@sh.cvut.cz).
%
% - October 16 2000 - revision 2.37
% * option algo2e added: change the name of environment
% algorithm into algorithm2e. So allow to use the package
% with some journal style which already define an algorithm
% environment.
%
% - September 13 2000 - revision 2.36
% * option slide added: require package color
% * Hack for slide class in order to have correct
% margins
%
% - November 25 1999 - revision 2.35
% * revision number match RCS number
% * Thanks to David A. Bader, a new option is added:
% noend: no end keywords are printed.
%
% - November 19 1999 - revision 2.32
% * minor bug on longend option corrected.
%
% - August 26 1999 - revision 2.31
% * add an option : figure
% this option makes algorithms be figure and so are numbered
% as figures, have Figure as caption and are put in
% the \listoffigures
%
% - January 21 1999 - revision 2.3 beta
% add 2 new environments: procedure and function.
% These environments works like algorithm environment but:
% - the ruled (or algoruled) style is imperative.
% - the caption now writes Procedure name....
% - the syntax of the \caption command is restricted as
% follow: you MUST put a name followed by 2 braces like
% this ``()''. You can put arguments inside the braces and
% text after. If no argument is given, the braces will be
% removed in the title.
% - label now puts the name (the text before the braces in the
% caption) of the procedure or function as reference (not
% the number like a classic algorithm environment).
% There are also two new styles : ProcNameSty and
% ProcArgSty. These style are by default the same as FuncSty
% and ArgSty but are used in the caption of a procedure or a
% function.
%
% - November 28 1996 - revision 2.22
% add a new macro \SetKwInParam{arg1}{arg2}{arg3}:
% it defines a macro \arg1{name}{arg} which prints name in keyword
% style followed byt arg surrounded by arg2 and arg3. The main
% application is to a function working as \SetKwInput to be used
% in the head of the algorithm. For example
% \SetKwInParam{Func}{(}{)} allows
% \Func{functionname}{list of arguments} which prints:
% \KwSty{functioname(}list of arguments\KwSty{)}
%
%
% - November 27 1996 - revision 2.21 :
% minor bug in length of InOut boxes fixed.
% add algorithm* environment.
%
% - July 12 1996 - revision 2.2 : \SetArg and \SetKwArg macros removed.
%
% \SetArg has been removed since it never has been
% documented.
% \SetKwArg has been removed since \SetKw can now
% take an argument in order to be consistent with
% \SetKwData and \SetKwFunction macros.
%
% - July 04 1996 - revision 2.1 : still more LaTeX2e! Minor compatibility break
%
% Macros use now \newcommand instead of \def, use of \setlength,
% \newsavebox, ... and other LaTeX2e specific stuff.
% The compatibility break:
% - \SetData becomes \SetKwData to be more consistent. So the old
% \SetKwData becomes \SetKwInput
% - old macros \titleofalgo, \Freetitleofalgo and \freetitleofalgo
% from LaTeX209 version which did print a warning message and call
% \Titleofalgo in version 2.0 are now removed!
%
% - March 13 1996 - revision 2.0: first official major revision.
%
%
%%%%%%%%%%%%%%
%
% Known bugs:
% -----------
% - no more known bugs... all are corrected!
%
%%%%%%%%%%%%%%
%
% Package options:
% ---------------
% - french, english, german, portuguese, czech : for the name of the algorithm, e.g.
% - boxed, boxruled, ruled, algoruled, plain : layout of the algorithm
% - algo2e : environment is algorithm2e instead of algorithms
% and \listofalgorithmes instead of \listofalgorithms
% - slide : to use when making slides
% - noline,lined,vlined : how block are designed.
% - linesnumbered : auto numbering of the algorithm's lines
% - algopart,algochapter,algosection : algo numbering within part, chapter or section
% - titlenumbered,titlenotnumbered : numbering of title set by \Titleofalgo
% - figure : algorithms are figures, numbered as figures, and put in the list of figures.
% - resetcount, noresetcount : start value of line numbers.
% - algonl : line numbers preceded by algo number
% - shortend, longend, noend : short or long end keyword as endif for e.g.
%
% defaults are; english,plain,resetcount,titlenotnumbered
%
%%%%%%%%%%%%%%
%
% Short summary
% -------------
%
% algorithm is an environment for writing algorithm in LaTeX2e
% It provide macros that allow you to create differents
% sorts of key words, therefore a set of predefined key word
% is gived.
%
% IT should be used as follows
%
% \begin{algorithm}
% ...
% ...
% \end{algorithm}
%
%
% IMPORTANT : each line MUST end with \;
%
% Note that if you define macros outside algorithm environment they
% are avaible in all the document and particulary you can use then
% inside all algorithms without re-define them.
%
% an example:
%
% \begin{algorithm}[H]
% \SetLine
% \AlgData{this text}
% \AlgResult{how to write algorithm with \LaTeX2e }
%
% initialization\;
% \While{not at end of this document}{
% read current section\;
% \eIf{understand}{
% go to next section\;
% current section becomes this one\;
% }{
% go back to the beginning of current section\;
% }
% }
% \caption{How to write algorithm}
% \end{algorithm}
%
%
%%%%%%%%%%%%%% predefined english keywords
%
% \AlgData{input}
% \AlgResult{output}
% \KwIn{input}
% \KwOut{output}
% \KwData{input}
% \KwResult{output}
% \Ret{[value]}
% \KwTo % a simple keyword
% \Begin{block inside}
% \If{condition}{Then block} % in a block
% \uIf{condition}{Then block} % in a block unended
% \Else{inside Else} % in a block
% \eIf{condition}{Then Block}{Else block} % in blocks
% \lIf{condition}{Else text} % on the same line
% \lElse{Else text} % on the same line
% \Switch{Condition}{Switch block}
% \Case{a case}{case block} % in a block
% \lCase{a case}{case text} % on the same line
% \Other{otherwise block} % in a block
% \lOther{otherwise block} % on the same line
% \For{condition}{text loop} % in a block
% \lFor{condition}{text} % on the same line
% \ForEach{condition}{text loop} % in a block
% \lForEach{condition}{text} % on the same line
% \Repeat{End condition}{text loop} % in a block
% \lRepeat{condition}{text} % on the same line
% \While{condition}{text loop} % in a block
% \lWhile{condition}{text loop} % on the same line
%
%
%%%%%%%%%%%%%% predefined french keywords
%
% \AlgDonnees{input}
% \AlgRes{input}
% \Donnees{input}
% \Res{input}
% \Retour[valeur]}
% \Deb{block inside}
% \KwA % un mot clef simple
% \Si{condition}{Bloc du Alors} % Dans un bloc
% \uSi{condition}{Bloc du Alors} % Dans un bloc non termine
% \eSi{condition}{Bloc du Alors}{Bloc du Sinon} % Dans un bloc
% \lSi{condition}{texte du Alors} % sur la meme ligne
% \lSinon{texte du Sinon} % sur la meme ligne
% \Suivant{Condition}{Bloc de l'instruction}
% \Cas{cas}{Bloc de ce cas} % Dans un bloc
% \lCas{cas}{Bloc de ce cas} % sur la meme ligne
% \Autres{Bloc de l'alternative} % Dans un bloc
% \lAutres{Bloc de l'alternative} % sur la meme ligne
% \Pour{condition}{texte de la boucle} % Dans un bloc
% \lPour{condition}{texte} % sur la meme ligne
% \PourCh{condition}{texte de la boucle} % Dans un bloc
% \lPourCh{condition}{texte} % sur la meme ligne
% \Repeter{End condition}{texte de la boucle} % Dans un bloc
% \lRepeter{condition}{texte} % sur la meme ligne
% \Tq{condition}{texte de la boucle} % Dans un bloc
% \lTq{condition}{texte de la boucle} % sur la meme ligne
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% for more complete informations you can see algorithm2e.tex
%
%
%%%%%%%%%%%%%%%%%%%%%%%% Identification Part %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
%
\ProvidesPackage{algorithm2e}[2005/10/04 v3.9 algorithms environments]
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%% Initial Code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\@makeother\*% some package redefined it as a letter (as color.sty)
%
% definition of commands which can be redefined in options of the package.
%
\newcounter{AlgoLine}
\setcounter{AlgoLine}{0}
%
\newcommand{\listalgorithmcfname}{}
\newcommand{\algorithmcfname}{}
\newcommand{\algocf@typo}{}
\newcommand{\@algocf@procname}{}
\newcommand{\@algocf@funcname}{}
\newcommand{\@algocf@titleofalgoname}{\algorithmcfname}
\newcommand{\@algocf@algotitleofalgo}{%
\renewcommand{\@algocf@titleofalgoname}{\algorithmcfname}}
\newcommand{\@algocf@proctitleofalgo}{%
\renewcommand{\@algocf@titleofalgoname}{\algocf@procname}}
%
\newcommand{\algocf@style}{plain}
\newcommand{\@ResetCounterIfNeeded}{}
\newcommand{\@titleprefix}{}
%
\newcommand{\algocf@numbering}[1]{\newcommand{\algocf@within}{#1}}
%
\newcommand{\defaultsmacros@algo}{\algocf@defaults@shortend}
%
\newcommand{\algocf@list}{loa}
\newcommand{\algocf@float}{algocf}
%
\newcommand{\algocf@envname}{algorithm}
\newcommand{\algocf@listofalgorithms}{listofalgorithms}
%
%
%%%%%%%%%%%%%%%%%%%%%% Declaration of Options %%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\RequirePackage{ifthen}
%
\DeclareOption{algo2e}{%
\renewcommand{\algocf@envname}{algorithm2e}
\renewcommand{\algocf@listofalgorithms}{listofalgorithmes}
}
%
\newboolean{algocf@slide}\setboolean{algocf@slide}{false}
\DeclareOption{slide}{%
\setboolean{algocf@slide}{true}%
}
%
\DeclareOption{figure}{
\renewcommand{\algocf@list}{lof}
\renewcommand{\algocf@float}{figure}
}
%
\DeclareOption{english}{%
\renewcommand{\listalgorithmcfname}{List of Algorithms}%
\renewcommand{\algorithmcfname}{Algorithm}%
\renewcommand{\algocf@typo}{}%
\renewcommand{\@algocf@procname}{Procedure}
\renewcommand{\@algocf@funcname}{Function}
}
%
\DeclareOption{french}{%
\renewcommand{\listalgorithmcfname}{Liste des Algorithmes}%
\renewcommand{\algorithmcfname}{Algorithme}%
\renewcommand{\algocf@typo}{\ }%
\renewcommand{\@algocf@procname}{Procédure}
\renewcommand{\@algocf@funcname}{Fonction}
}
%
\DeclareOption{czech}{%
\renewcommand{\listalgorithmcfname}{Seznam algoritm\v{u}}%
\renewcommand{\algorithmcfname}{Algoritmus}%
\renewcommand{\algocf@typo}{}%
\renewcommand{\@algocf@procname}{Procedura}
\renewcommand{\@algocf@funcname}{Funkce}
}
%
\DeclareOption{german}{%
\renewcommand{\listalgorithmcfname}{Liste der Algorithmen}%
\renewcommand{\algorithmcfname}{Algorithmus}%
\renewcommand{\algocf@typo}{\ }%
\renewcommand{\@algocf@procname}{Prozedur}%
\renewcommand{\@algocf@funcname}{Funktion}%
}
%
\DeclareOption{portugues}{%
\renewcommand{\listalgorithmcfname}{Lista de Algoritmos}%
\renewcommand{\algorithmcfname}{Algoritmo}%
\renewcommand{\algocf@typo}{}%
\renewcommand{\@algocf@procname}{Procedimento}
\renewcommand{\@algocf@funcname}{Fun\c{c}\~{a}o}
}
%
% OPTIONs plain, boxed, ruled, algoruled & boxruled
%
\newcommand{\algocf@style@plain}{\renewcommand{\algocf@style}{plain}}
\newcommand{\algocf@style@boxed}{\renewcommand{\algocf@style}{boxed}}
\newcommand{\algocf@style@ruled}{\renewcommand{\algocf@style}{ruled}}
\newcommand{\algocf@style@algoruled}{\renewcommand{\algocf@style}{algoruled}}
\newcommand{\algocf@style@boxruled}{\renewcommand{\algocf@style}{boxruled}}
\newcommand{\restylealgo}[1]{\csname algocf@style@#1\endcsname}
\DeclareOption{plain}{\algocf@style@plain}
\DeclareOption{boxed}{\algocf@style@boxed}
\DeclareOption{ruled}{\algocf@style@ruled}
\DeclareOption{algoruled}{\algocf@style@algoruled}
\DeclareOption{boxruled}{\algocf@style@boxruled}
%
% OPTIONs algopart,algochapter & algosection
%
\DeclareOption{algopart}{\algocf@numbering{part}} %algo part numbered
\DeclareOption{algochapter}{\algocf@numbering{chapter}} %algo chapter numbered
\DeclareOption{algosection}{\algocf@numbering{section}} %algo section numbered
%
% OPTIONs resetcount & noresetcount
%
\DeclareOption{resetcount}{\renewcommand{\@ResetCounterIfNeeded}{\setcounter{AlgoLine}{0}}}
\DeclareOption{noresetcount}{\renewcommand{\@ResetCounterIfNeeded}{}}
%
% OPTION linesnumbered
%
\newboolean{algocf@linesnumbered}\setboolean{algocf@linesnumbered}{false}
\newcommand{\algocf@linesnumbered}{\relax}
\DeclareOption{linesnumbered}{%
\setboolean{algocf@linesnumbered}{true}
\renewcommand{\algocf@linesnumbered}{\everypar={\nl}}
}
%
% OPTION linesnumberedhidden
%
\DeclareOption{linesnumberedhidden}{%
\setboolean{algocf@linesnumbered}{true}
\renewcommand{\algocf@linesnumbered}{\everypar{\stepcounter{AlgoLine}}}
}
%
% OPTION commentsnumbered inoutnumbered
%
\newboolean{algocf@commentsnumbered}\setboolean{algocf@commentsnumbered}{false}
\DeclareOption{commentsnumbered}{\setboolean{algocf@commentsnumbered}{true}}
\newboolean{algocf@inoutnumbered}\setboolean{algocf@inoutnumbered}{false}
\DeclareOption{inoutnumbered}{\setboolean{algocf@inoutnumbered}{true}}
%
% OPTIONs titlenumbered & titlenotnumbered
%
\DeclareOption{titlenumbered}{%
\renewcommand{\@titleprefix}{%
\refstepcounter{algocf@float}%
\AlTitleFnt{\@algocf@titleofalgoname\
\expandafter\csname the\algocf@float\endcsname\algocf@typo : }}%
}
%
\DeclareOption{titlenotnumbered}{\renewcommand{\@titleprefix}{%
\AlTitleFnt{\@algocf@titleofalgoname\algocf@typo : }}%
}
%
% OPTIONs lined, vlined & noline
%
\DeclareOption{lined}{\AtBeginDocument{\SetLine}} % \SetLine
\DeclareOption{vlined}{\AtBeginDocument{\SetVline}} % \SetVline
\DeclareOption{noline}{\AtBeginDocument{\SetNoline}} % \Setnoline (default)
%
% OPTIONs algonl
% line numbered with the counter of the algorithm
%
\DeclareOption{algonl}{\renewcommand{\theAlgoLine}{\expandafter\csname the\algocf@float\endcsname.\arabic{AlgoLine}}}
%
% OPTIONs longend, shotend & noend
%
\DeclareOption{longend}{%
\renewcommand{\defaultsmacros@algo}{\algocf@defaults@longend}}
\DeclareOption{shortend}{%
\renewcommand{\defaultsmacros@algo}{\algocf@defaults@shortend}}
\newboolean{algocf@optnoend}\setboolean{algocf@optnoend}{false}
\DeclareOption{noend}{%
\setboolean{algocf@optnoend}{true}%
\renewcommand{\defaultsmacros@algo}{\algocf@defaults@noend}}
%
% OPTION dotoc
%
\newboolean{algocf@dotocloa}\setboolean{algocf@dotocloa}{false}
\DeclareOption{dotocloa}{%
\setboolean{algocf@dotocloa}{true}
}
%
% OPTION comments
%
\newboolean{algocf@optfillcomment}\setboolean{algocf@optfillcomment}{true}
\DeclareOption{nofillcomment}{%
\setboolean{algocf@optfillcomment}{false}%
}
\DeclareOption{fillcomment}{%
\setboolean{algocf@optfillcomment}{true}%
}
%
% OPTION sidecommments
%
\newboolean{algocf@scleft}\setboolean{algocf@scleft}{false}
\DeclareOption{scleft}{%
\setboolean{algocf@scleft}{true}%
}
\DeclareOption{sright}{% default
\setboolean{algocf@scleft}{false}%
}
%
%
%%%%%%%%%%%%%%%%%%%%%%% Execution of Options %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\ExecuteOptions{english,plain,resetcount,titlenotnumbered}
%
\ProcessOptions
%
\@algocf@algotitleofalgo % fix name for \Titleofalgo to \algorithmcfname by default
%
%%%%%%%%%%%%%%%%%%%%%%%%%% Package Loading %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%\RequirePackage{float}[2001/11/08]
%
\RequirePackage{xspace}
%
\ifthenelse{\boolean{algocf@slide}}{\RequirePackage{color}}{}
%
\AtEndOfPackage{%
\ifthenelse{\boolean{algocf@dotocloa}}{%
\renewcommand{\listofalgorithmes}{\tocfile{\listalgorithmcfname}{loa}}%
}{\relax}
}
% if loa in toc required, load tocbibind package if not already done.
\ifthenelse{\boolean{algocf@dotocloa}}{%
\ifx\@tocextra\undefined%
\RequirePackage{tocbibind}
\fi%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Main Part %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\newcommand{\algocf@name}{algorithm2e}
\newcommand{\algocf@date}{october 04 2005}
\newcommand{\algocf@version}{Release 3.9}
\newcommand{\algocf@id}{\algocf@version\space -- \algocf@date\space --}
\typeout{********************************************************^^JPackage `\algocf@name'\space\algocf@id^^J%
- algorithm2e-announce@lirmm.fr mailing list for announcement about releases^^J%
- algorithm2e-discussion@lirmm.fr mailing list for discussion about package^^J%
subscribe by emailing sympa@lirmm.fr with 'subscribe <list> <firstname name>'^^J%
- Author: Christophe Fiorio (fiorio@lirmm.fr)^^J********************************************************}
%%
%%
%%
%%
%%
%%
%%%% hyperref compatibility tricks: Hyperref package defines H counters from
% standard counters (i.e \theHpage from \thepage) and check some particular
% counters of some packages, unfortunately it doesn't do the same for
% algorithm2e package but act as Hcounter was defined. To avoid errors we
% defined \theHalgocf ourself
%%%%
% \@ifundefined{theHalgocf}{\def\theHalgocf{\thealgocf}}{}%
% \@ifundefined{theHAlgoLine}{\def\theHAlgoLine{\theAlgoLine}}{}%
% \@ifundefined{theHalgocf}{\def\theHalgocf{\thealgocf}}{}%
% \@ifundefined{theHAlgoLine}{\def\theHAlgoLine{\thealgocf}}{}%
% \@ifundefined{toclevel@algocf}{\def\toclevel@algocf{0}}{}%
%%
%%
%%
\newcommand{\@defaultskiptotal}{0.5em}%\Setnlskip{0.5em}
\newskip\skiptotal\skiptotal=0.5em%\Setnlskip{0.5em}
\newskip\skiprule
\newskip\skiphlne
\newskip\skiptext
\newskip\skiplength
\newskip\algomargin
\newskip\skipalgocfslide\skipalgocfslide=1em
\newdimen\algowidth
\newdimen\inoutsize
\newdimen\inoutline
%
\newcommand{\@algoskip}{\smallskip}%
\newcommand{\SetAlgoSkip}[1]{\renewcommand{\@algoskip}{\csname#1\endcsname}}%
\newcommand{\@algoinsideskip}{\relax}%
\newcommand{\SetAlgoInsideSkip}[1]{\renewcommand{\@algoinsideskip}{\csname#1\endcsname}}%
%
\newsavebox{\algocf@inoutbox}
\newsavebox{\algocf@inputbox}
%%
%%
\newcommand{\arg@e}{}
\newcommand{\arg@space}{\ }
\newcommand{\BlankLine}{\vskip 1ex}
%%
\newcommand{\vespace}{1ex}
\newcommand{\SetInd}[2]{%
\skiprule=#1%
\skiptext=#2%
\skiplength=\skiptext\advance\skiplength by \skiprule\advance\skiplength by 0.4pt}
\SetInd{0.5em}{1em}
\algomargin=\leftskip\advance\algomargin by \parindent
\newcommand{\incmargin}[1]{\advance\algomargin by #1}
\newcommand{\decmargin}[1]{\advance\algomargin by -#1}
\newcommand{\Setnlskip}[1]{%
\renewcommand{\@defaultskiptotal}{#1}%
\setlength{\skiptotal}{#1}}
\newcommand{\setnlskip}[1]{\Setnlskip{#1}}%kept for compatibility issue
%%
\newskip\AlCapSkip\AlCapSkip=0ex
\newskip\AlCapHSkip\AlCapSkip=0ex
\newcommand{\setalcapskip}[1]{\setlength{\AlCapSkip}{#1}}
\newcommand{\setalcaphskip}[1]{\setlength{\AlCapHSkip}{#1}}
\setalcaphskip{.5\algomargin}
%%
%%
\newcommand{\Indentp}[1]{\advance\leftskip by #1}
\newcommand{\Indp}{\advance\leftskip by 1em}
\newcommand{\Indpp}{\advance\leftskip by 0.5em}
\newcommand{\Indm}{\advance\leftskip by -1em}
\newcommand{\Indmm}{\advance\leftskip by -0.5em}
%%
%%
%% Line Numbering
%%
%%
% number line style
\newcommand{\nlSty}[1]{\textnormal{\textbf{#1}}}% default definition
\newcommand{\Setnlsty}[3]{\renewcommand{\nlSty}[1]{\textnormal{\csname#1\endcsname{#2##1#3}}}}
%
%
\newcommand{\algocf@nlhlabel}[2]{%
\immediate\write\@auxout{%
\string\newlabel{#1}{%
{#2}% current label
{\thepage}% page
{}% current label string
% {AlgoLine\thealgocfline.\theAlgoLine}% current Href
{AlgoLine\thealgocfline.\theAlgoLine}% current Href
{}%
}%
}%
}
%
% nl definitions
%
\newcommand{\nl}{%
\@ifundefined{href}{% if not hyperref then do a simple refstepcounter
\refstepcounter{AlgoLine}%
}{% else if hyperref, do the anchor so 2 lines in two differents algorithms cannot have the same href
% \stepcounter{AlgoLine}\Hy@raisedlink{\hyper@anchorstart{AlgoLine\thealgocfline.\theAlgoLine}\hyper@anchorend}%
\stepcounter{AlgoLine}\Hy@raisedlink{\hyper@anchorstart{AlgoLine\thealgocfline.\theAlgoLine}\hyper@anchorend}%
}% now we can do the line numbering
\strut\vadjust{\kern-\dp\strutbox\vtop to \dp\strutbox{%
\baselineskip\dp\strutbox\vss\llap{\scriptsize{\nlSty{\theAlgoLine}\hskip\skiptotal}}\null}}%
}%
\newcommand{\nllabel}[1]{%
\@ifundefined{href}{\label{#1}}{\algocf@nlhlabel{#1}{\theAlgoLine}}}%
%
\newcommand{\enl}{;%
\@ifundefined{href}{% if not hyperref then do a simple refstepcounter
\refstepcounter{AlgoLine}%
}{% else if hyperref, do the anchor so 2 lines in two differents algorithms cannot have the same href
% \stepcounter{AlgoLine}\Hy@raisedlink{\hyper@anchorstart{AlgoLine\thealgocfline.\theAlgoLine}\hyper@anchorend}%
\stepcounter{AlgoLine}\Hy@raisedlink{\hyper@anchorstart{AlgoLine\thealgocfline.\theAlgoLine}\hyper@anchorend}%
}% now we can do the line numbering
\hfill\rlap{%
\scriptsize{\nlSty{\theAlgoLine}}}\par}
\newcommand{\nlset}[1]{%
\hskip 0pt\llap{%
\scriptsize{\nlSty{#1}}\hskip\skiptotal}\ignorespaces}
%
% lnl definitions
%
\@ifundefined{href}{% if not hyperref
\newcommand{\lnl}[1]{\nl\label{#1}\ignorespaces}%
}{% else hyperref
\newcommand{\lnl}[1]{\nl\algocf@nlhlabel{#1}{\theAlgoLine}\ignorespaces}%
}
%
% nlset
%
\@ifundefined{href}{%
\newcommand{\lnlset}[2]{\nlset{#2}\protected@edef\@currentlabel{#2}\label{#1}}%
}{%else hyperref
\newcommand{\lnlset}[2]{\nlset{#2}%
\Hy@raisedlink{\hyper@anchorstart{AlgoLine.#2}\hyper@anchorend}\algocf@nlhlabel{#1}{#2}%
\ignorespaces%
}%
}
%
% set char put at end of each line
%
\newcommand{\algocf@endline}{\string;}
\newcommand{\SetEndCharOfAlgoLine}[1]{\renewcommand{\algocf@endline}{#1}}
%
% end of line definition
%
\newcommand{\@endalgoln}{\algocf@endline\par}% default definition: printsemicolon
\newcommand{\dontprintsemicolon}{\renewcommand{\@endalgoln}{\par}}
\newcommand{\printsemicolon}{\renewcommand{\@endalgoln}{\algocf@endline\par}}
%
% line numbering
%
\newcommand{\linesnumbered}{\setboolean{algocf@linesnumbered}{true}\renewcommand{\algocf@linesnumbered}{\everypar={\nl}}}
\newcommand{\linesnotnumbered}{%
\setboolean{algocf@linesnumbered}{false}%
\renewcommand{\algocf@linesnumbered}{\relax}%
}
%
\newcommand{\linesnumberedhidden}{%
\setboolean{algocf@linesnumbered}{true}\renewcommand{\algocf@linesnumbered}{\everypar{\stepcounter{AlgoLine}}}}
\newcommand{\showln}{\nlset{\theAlgoLine}\ignorespaces} % display the line number on this line (without labelling)
\newcommand{\showlnlabel}[1]{\lnlset{#1}{\theAlgoLine}\ignorespaces} % display the line number and label this line
%
%%
%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Styling text commands
%
\newcommand{\AlTitleFnt}[1]{\textbf{#1}\unskip}% default definition
\newcommand{\SetAlTitleFnt}[1]{\renewcommand{\AlTitleFnt}[1]{\csname#1\endcsname{##1}\unskip}}%
\newcommand{\AlFnt}{\relax}% default definition
\newcommand{\SetAlFnt}[1]{\renewcommand{\AlFnt}{#1}}%
\newcommand{\AlCapFnt}{\AlFnt{}}% default definition
\newcommand{\SetAlCapFnt}[1]{\renewcommand{\AlCapFnt}{#1}}%
\newcommand{\KwSty}[1]{\textnormal{\textbf{#1}}\unskip}% default definition
\newcommand{\SetKwSty}[1]{\renewcommand{\KwSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\ArgSty}[1]{\textnormal{\emph{#1}}\unskip}%\SetArgSty{emph}
\newcommand{\SetArgSty}[1]{\renewcommand{\ArgSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\FuncSty}[1]{\textnormal{\texttt{#1}}\unskip}%\SetFuncSty{texttt}
\newcommand{\SetFuncSty}[1]{\renewcommand{\FuncSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\DataSty}[1]{\textnormal{\textsf{#1}}\unskip}%%\SetDataSty{textsf}
\newcommand{\SetDataSty}[1]{\renewcommand{\DataSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\CommentSty}[1]{\textnormal{\texttt{#1}}\unskip}%%\SetDataSty{texttt}
\newcommand{\SetCommentSty}[1]{\renewcommand{\CommentSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\TitleSty}[1]{#1\unskip}%\SetTitleSty{}{}
\newcommand{\SetTitleSty}[2]{\renewcommand{\TitleSty}[1]{%
\csname#1\endcsname{\csname#2\endcsname##1}}\unskip}
%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Block basic commands
%
\newcommand{\al@push}[1]{\advance\skiptotal by #1\moveright #1}
\newcommand{\al@pop}[1]{\advance\skiptotal by -#1}
\newcommand{\al@addskiptotal}{\advance\skiptotal by 0.4pt\advance\hsize by -0.4pt} % 0.4 pt=width of \vrule
\newcommand{\al@subskiptotal}{\advance\skiptotal by -0.4pt\advance\hsize by 0.4pt} % 0.4 pt=width of \vrule
%
\skiphlne=.8ex%
\newcommand{\Setvlineskip}[1]{\skiphlne=#1}
\newcommand{\V@line}[1]{% no vskip in between boxes but a strut to separate them,
\strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
\al@push{\skiprule}% move to the right before the vertical rule
\hbox{\vrule%
\vtop{\al@push{\skiptext}%move the right after the rule
\vtop{\al@addskiptotal\advance\hsize by -\skiplength #1}\Hlne}}\vskip\skiphlne% inside the block
\al@pop{\skiprule}%\al@subskiptotal% restore indentation
\nointerlineskip}% no vskip after
%
\newcommand{\V@sline}[1]{% no vskip in between boxes but a strut to separate them,
\strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
\al@push{\skiprule}% move to the right before the vertical rule
\hbox{\vrule% the vertical rule
\vtop{\al@push{\skiptext}%move the right after the rule
\vtop{\al@addskiptotal\advance\hsize by -\skiplength #1}}}% inside the block
\al@pop{\skiprule}}% restore indentation
%\nointerlineskip}% no vskip after
%
\newcommand{\H@lne}{\hrule height 0.4pt depth 0pt width .5em}
%
\newcommand{\No@line}[1]{% no vskip in between boxes but a strut to separate them,
\strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
\al@push{\skiprule}%
\hbox{%
\vtop{\al@push{\skiptext}%
\vtop{\advance\hsize by -\skiplength #1}}}% inside the block
\al@pop{\skiprule}}%
%\nointerlineskip}% no vskip after
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% default=NoLine
%
\newcommand{\a@@block}[2]{\No@line{##1}\KwSty{##2}\par}
\newcommand{\a@block}[2]{\a@@block{#1}{#2}} % this to be redefined as a@group in
% case of noend option
\newcommand{\a@group}[1]{\No@line{##1}}
\newcommand{\Hlne}{}
%
%
\newcommand{\SetNoline}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Noline
\renewcommand{\a@@block}[2]{\No@line{##1}\KwSty{##2}\strut\par}%
\renewcommand{\a@group}[1]{\No@line{##1}}
\renewcommand{\Hlne}{}}
%
\newcommand{\SetVline}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Vline
\renewcommand{\a@@block}[2]{\V@line{##1}}%
\renewcommand{\a@group}[1]{\V@sline{##1}\strut\ignorespaces}
\renewcommand{\Hlne}{\H@lne}}
%
\newcommand{\SetLine}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Line
\renewcommand{\a@@block}[2]{\strut\V@sline{##1}\KwSty{##2}\strut\par}% no skip after a block so garantie at least a line
\renewcommand{\a@group}[1]{\V@sline{##1}\strut\ignorespaces}
\renewcommand{\Hlne}{}}
%
\newcommand{\SetNothing}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Noline
\renewcommand{\a@@block}[2]{\No@line{##1}\par}%
%\long
\renewcommand{\a@group}[1]{\No@line{##1}}
\renewcommand{\Hlne}{}}
%
%%
%%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ``Input :'''s like command
%
%%%
% text staying at the right of the longer keyword of KwInOut commands
% (text of KwInOut commands are all vertically aligned)
%
\newcommand{\algocf@newinout}{\par\parindent=\wd\algocf@inoutbox}% to put right indentation after a \\ in the KwInOut
\newcommand{\SetKwInOut}[2]{%
\sbox\algocf@inoutbox{\hbox{\KwSty{#2}\algocf@typo:\ }}%
\expandafter\ifx\csname InOutSizeDefined\endcsname\relax% if first time used
\newcommand\InOutSizeDefined{}\setlength{\inoutsize}{\wd\algocf@inoutbox}%
\else% else keep the larger dimension
\ifdim\wd\algocf@inoutbox>\inoutsize\setlength{\inoutsize}{\wd\algocf@inoutbox}\fi%
\fi% the dimension of the box is now defined.
\@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname#1\endcsname[1]{%
\ifthenelse{\boolean{algocf@inoutnumbered}}{\relax}{\everypar={\relax}}
{\let\\\algocf@newinout\hangindent=\wd\algocf@inoutbox\hangafter=1\parbox[t]{\inoutsize}{\KwSty{#2}\hfill:\mbox{\ }}##1\par}
\algocf@linesnumbered% reset the numbering of the lines
}}%
%
%% allow to ajust the skip size of InOut
%%
\newcommand{\ResetInOut}[1]{%
\sbox\algocf@inoutbox{\hbox{\KwSty{#1}\algocf@typo:\ }}%
\setlength{\inoutsize}{\wd\algocf@inoutbox}%
}
%
%
%%%
% text staying at the right of the keyword.
%
\newcommand{\algocf@newinput}{\par\parindent=\wd\algocf@inputbox}% to put right indentation after a \\ in the KwInput
\newcommand{\SetKwInput}[2]{%
\@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname#1\endcsname[1]{%
\sbox\algocf@inputbox{\hbox{\KwSty{#2}\algocf@typo: }}%
\ifthenelse{\boolean{algocf@inoutnumbered}}{\relax}{\everypar={\relax}}%
{\let\\\algocf@newinput\hangindent=\wd\algocf@inputbox\hangafter=1\unhbox\algocf@inputbox##1\par}%
\algocf@linesnumbered% reset the numbering of the lines
}}%
\newcommand{\SetKwData}[2]{%
\@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname @#1\endcsname[1]{\DataSty{#2(}\ArgSty{##1}\DataSty{)}}%
\expandafter\algocf@mkcmd\csname#1\endcsname{%
\@ifnextchar\bgroup{\csname @#1\endcsname}{\DataSty{#2}\xspace}}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Comments macros
%
%%%%
% comment in the text, first argument is the name of the macro, second is
% the text put before the comment, third is the text put at the end of the
% comment.
%
% first side comment justification
\newcommand{\SetSideCommentLeft}{\setboolean{algocf@scleft}{true}}
\newcommand{\SetSideCommentRight}{\setboolean{algocf@scleft}{false}}
\newcommand{\SetNoFillComment}{\setboolean{algocf@optfillcomment}{false}}
\newcommand{\SetFillComment}{\setboolean{algocf@optfillcomment}{true}}
%
% next comment and side comment
%
\newcommand{\algocf@endmarkcomment}{\relax}%
\newcommand{\algocf@fillcomment}{%
\ifthenelse{\boolean{algocf@optfillcomment}}{\hfill}{\relax}}%
%
\newcommand{\algocf@startcomment}{%
\hangindent=\wd\algocf@inputbox\hangafter=1\usebox\algocf@inputbox}%
\newcommand{\algocf@endcomment}{\algocf@fillcomment\algocf@endmarkcomment\ignorespaces\par}%
\newcommand{\algocf@endstartcomment}{\algocf@endcomment\algocf@startcomment\ignorespaces}%
%
\newboolean{algocf@sidecomment}%
\newboolean{algocf@altsidecomment}\setboolean{algocf@altsidecomment}{false}%
\newcommand{\algocf@scpar}{\ifthenelse{\boolean{algocf@altsidecomment}}{\relax}{\par}}%
\newcommand{\algocf@sclfill}{\ifthenelse{\boolean{algocf@scleft}}{\algocf@fillcomment}{\relax}}%
\newcommand{\algocf@scrfill}{\ifthenelse{\boolean{algocf@scleft}}{\relax}{\hfill}}
\newcommand{\algocf@startsidecomment}{\usebox\algocf@inputbox}%
\newcommand{\algocf@endsidecomment}{\algocf@endmarkcomment\algocf@scpar}%
\newcommand{\algocf@endstartsidecomment}{%
\algocf@sclfill\algocf@endsidecomment%
\algocf@scrfill\algocf@startsidecomment\ignorespaces}%
%
\newcommand{\SetKwComment}[3]{%
% newcommand or renewcommand ?
\@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
%%% comment definition
\expandafter\algocf@mkcmd\csname algocf@#1\endcsname[1]{%
\sbox\algocf@inputbox{\CommentSty{\hbox{#2}}}%
\ifthenelse{\boolean{algocf@commentsnumbered}}{\relax}{\everypar={\relax}}%
{\renewcommand{\algocf@endmarkcomment}{#3}%
\let\\\algocf@endstartcomment%
\algocf@startcomment\CommentSty{%
\strut\ignorespaces##1\strut\algocf@fillcomment#3}\par}%
\algocf@linesnumbered% reset the numbering of the lines
}%
%%% side comment definitions
% option or not?
\expandafter\algocf@mkcmd\csname algocf@#1@star\endcsname{%
\@ifnextchar [{\csname algocf@#1@staropt\endcsname}{\csname algocf@#1@sidecomment\endcsname}%
}%
% manage option
\expandafter\def\csname algocf@#1@staropt\endcsname[##1]##2{%
\ifthenelse{\boolean{algocf@scleft}}{\setboolean{algocf@sidecomment}{true}}{\setboolean{algocf@sidecomment}{false}}%
\ifx##1h\setboolean{algocf@altsidecomment}{true}\SetSideCommentLeft\fi%
\ifx##1f\setboolean{algocf@altsidecomment}{true}\SetSideCommentRight\fi%
\ifx##1l\setboolean{algocf@altsidecomment}{false}\SetSideCommentLeft\fi%
\ifx##1r\setboolean{algocf@altsidecomment}{false}\SetSideCommentRight\fi%
\csname algocf@#1@sidecomment\endcsname{##2}% call sidecomment
\ifthenelse{\boolean{algocf@sidecomment}}{\setboolean{algocf@scleft}{true}}{\setboolean{algocf@scleft}{false}}%
\setboolean{algocf@altsidecomment}{false}%
}%
% side comment
\expandafter\algocf@mkcmd\csname algocf@#1@sidecomment\endcsname[1]{%
\sbox\algocf@inputbox{\CommentSty{\hbox{#2}}}%
\ifthenelse{\boolean{algocf@commentsnumbered}}{\relax}{\everypar={\relax}}%
{%
\renewcommand{\algocf@endmarkcomment}{#3}%
\let\\\algocf@endstartsidecomment%
% here is the comment
\ifthenelse{\boolean{algocf@altsidecomment}}{\relax}{\algocf@endline\ }%
\algocf@scrfill\algocf@startsidecomment\CommentSty{%
\strut\ignorespaces##1\strut\algocf@sclfill#3}\algocf@scpar%
}%
\algocf@linesnumbered% reset the numbering of the lines
}
\expandafter\algocf@mkcmd\csname#1\endcsname{\@ifstar{\csname algocf@#1@star\endcsname}{\csname algocf@#1\endcsname}}
}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Kw
%
\newcommand{\SetKw}[2]{%
\@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname @#1\endcsname[1]{\KwSty{#2} \ArgSty{##1}}%
\expandafter\algocf@mkcmd\csname#1\endcsname{%
\@ifnextchar\bgroup{\csname @#1\endcsname}{\KwSty{#2}\xspace}}%
}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% KwFunction
%
\newcommand{\SetKwFunction}[2]{%
\@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname @#1\endcsname[1]{\FuncSty{#2(}\ArgSty{##1}\FuncSty{)}}%
\expandafter\algocf@mkcmd\csname#1\endcsname{%
\@ifnextchar\bgroup{\csname @#1\endcsname}{\FuncSty{#2}\xspace}}%
}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% KwBlock
%
\newcommand{\SetKwBlock}[3]{%
\@ifundefined{algocf@#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#1\endcsname{ %Begin
\@ifnextchar({\csname algocf@#1opt\endcsname}{\csname algocf@#1\endcsname}}
% with side text
\expandafter\def\csname algocf@#1opt\endcsname(##1)##2{% \Begin(){}
\KwSty{#2} ##1\a@group{##2}\KwSty{#3}%
\@ifnextchar({\csname algocf@#1end\endcsname}{\par}}%
% without side text at the beginning
\expandafter\algocf@mkcmd\csname algocf@#1\endcsname[1]{% \Begin{}
\KwSty{#2}\a@group{##1}\KwSty{#3}\@ifnextchar({\csname algocf@#1end\endcsname}{\par}}%
% side text at the end
\expandafter\def\csname algocf@#1end\endcsname(##1){% \Begin{}
\ ##1\par}%
}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% For Switch
%
\newcommand{\SetKwSwitch}[8]{% #1=\Switch #2=\Case #3=\Other #4=swicth #5=case #6=do #7=otherwise #8=endsw
%%%% Switch
\@ifundefined{algocf@#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#1\endcsname{ %Switch
\@ifnextchar({\csname algocf@#1opt\endcsname}{\csname algocf@#1\endcsname}}
% with side text
\expandafter\def\csname algocf@#1opt\endcsname(##1)##2##3{% \Switch(){}{}
\KwSty{#4} \ArgSty{##2} \KwSty{#5} ##1\a@block{##3}{#8}}%
% without side text
\expandafter\algocf@mkcmd\csname algocf@#1\endcsname[2]{% \Switch{}{}
\KwSty{#4} \ArgSty{##1} \KwSty{#5}\a@block{##2}{#8}}%
% side text at the end
\expandafter\def\csname algocf@#1end\endcsname(##1){% \Switch{}{}()
}
%%%% Case
\@ifundefined{algocf@#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#2\endcsname{ %Case
\@ifnextchar({\csname algocf@#2opt\endcsname}{\csname algocf@#2\endcsname}}
\expandafter\def\csname u#2\endcsname{ %uCase
\@ifnextchar({\csname algocf@u#2opt\endcsname}{\csname algocf@u#2\endcsname}}
\expandafter\def\csname l#2\endcsname{ %lCase
\@ifnextchar({\csname algocf@l#2opt\endcsname}{\csname algocf@l#2\endcsname}}
% with side text
\expandafter\def\csname algocf@#2opt\endcsname(##1)##2##3{% \Case(){}{}
\KwSty{#6} \ArgSty{##2} ##1\a@block{##3}{#8}}%
\expandafter\def\csname algocf@u#2opt\endcsname(##1)##2##3{% \uCase(){}{}
\KwSty{#6} \ArgSty{##2} ##1\a@group{##3}}%
\expandafter\def\csname algocf@l#2opt\endcsname(##1)##2##3{% \lCase(){}{}
\KwSty{#6} \ArgSty{##2} ##3\algocf@endline\ ##1\par}%
% without side text
\expandafter\algocf@mkcmd\csname algocf@#2\endcsname[2]{% \Case{}{}
\KwSty{#6} \ArgSty{##1}\a@block{##2}{#8}}%
\expandafter\algocf@mkcmd\csname algocf@u#2\endcsname[2]{% \uCase{}{}
\KwSty{#6} \ArgSty{##1}\a@group{##2}}%
\expandafter\algocf@mkcmd\csname algocf@l#2\endcsname[2]{% \lCase{}{}
\KwSty{#6} \ArgSty{##1} ##2}%
%%%% Other
\@ifundefined{algocf@#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#3\endcsname{ %Other
\@ifnextchar({\csname algocf@#3opt\endcsname}{\csname algocf@#3\endcsname}}
\expandafter\def\csname l#3\endcsname{ %Other
\@ifnextchar({\csname algocf@l#3opt\endcsname}{\csname algocf@l#3\endcsname}}
% with side text
\expandafter\def\csname algocf@#3opt\endcsname(##1)##2{% \Other(){}{}
\KwSty{#7} ##1\a@block{##2}{#8}}%
\expandafter\def\csname algocf@l#3opt\endcsname(##1)##2{% \Other(){}{}
\KwSty{#7} ##2\algocf@endline\ ##1\par}%
% without side text
\expandafter\algocf@mkcmd\csname algocf@#3\endcsname[1]{% default
\KwSty{#7}\a@block{##1}{#8}}%
\expandafter\algocf@mkcmd\csname algocf@l#3\endcsname[1]{% ldefault
\KwSty{#7} ##1}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% If macros
%
\newcommand{\SetKwIF}[8]{% #1=\If #2=\ElseIf #3=\Else #4=if #5=then #6=elseif si #7=else #8=endif
%
% common text
\@ifundefined{#1@ifthen}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname #1@ifthen\endcsname[1]{%
\KwSty{#4} \ArgSty{##1} \KwSty{#5}}%
\expandafter\algocf@mkcmd\csname #1@endif\endcsname[1]{\a@block{##1}{#8}}%
\expandafter\algocf@mkcmd\csname #1@noend\endcsname[1]{\a@group{##1}}%
\expandafter\algocf@mkcmd\csname #1@else\endcsname[1]{\a@group{##1}\KwSty{#7}}%
\@ifundefined{#2@elseif}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname #2@elseif\endcsname[1]{%
\KwSty{#6} \ArgSty{##1} \KwSty{#5}}%
\@ifundefined{#3@else}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname #3@else\endcsname{\KwSty{#7}}%
%%%% If then { } endif
%
\@ifundefined{algocf@#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#1\endcsname{%
\@ifnextchar({\csname algocf@#1opt\endcsname}{\csname algocf@#1\endcsname}}
% with side text
\expandafter\def\csname algocf@#1opt\endcsname(##1)##2##3{% \If(){}{}
\csname #1@ifthen\endcsname{##2} ##1\csname #1@endif\endcsname{##3}}%
% without side text
\expandafter\algocf@mkcmd\csname algocf@#1\endcsname[2]{% \If{}{}
\csname #1@ifthen\endcsname{##1}\csname #1@endif\endcsname{##2}}%
%
%%%% If then {} else {} endif
%
% side text or not?
\expandafter\def\csname e#1\endcsname{%
\@ifnextchar({\csname algocf@e#1opt\endcsname}{\csname algocf@e#1optif\endcsname}}
% with side text after if
\expandafter\def\csname algocf@e#1opt\endcsname(##1)##2##3{% \eIf()
\csname #1@ifthen\endcsname{##2} ##1\csname #1@else\endcsname{##3}%
\csname algocf@e#1opte\endcsname}
% without side text after if
\expandafter\def\csname algocf@e#1optif\endcsname##1##2{% \eIf()
\csname #1@ifthen\endcsname{##1}\csname #1@else\endcsname{##2}%
\csname algocf@e#1opte\endcsname}%
% side text after else or not ?
\expandafter\def\csname algocf@e#1opte\endcsname{%
\@ifnextchar({\csname algocf@e#1optopt\endcsname}{\csname algocf@e#1\endcsname}}
% else with a side text
\expandafter\def\csname algocf@e#1optopt\endcsname(##1)##2{%
##1\csname #1@endif\endcsname{##2}}
% else without side text
\expandafter\algocf@mkcmd\csname algocf@e#1\endcsname[1]{%
\csname #1@endif\endcsname{##1}}
%
%%%% If then
%
% side text or not?
\expandafter\def\csname l#1\endcsname{% lif
\@ifnextchar({\csname algocf@l#1opt\endcsname}{\csname algocf@l#1\endcsname}}
\expandafter\def\csname u#1\endcsname{% uif
\@ifnextchar({\csname algocf@u#1opt\endcsname}{\csname algocf@u#1\endcsname}}
% with side text
\expandafter\def\csname algocf@l#1opt\endcsname(##1)##2##3{% \lIf(){}{}
\csname #1@ifthen\endcsname{##2} ##3\algocf@endline\ ##1\par}%
\expandafter\def\csname algocf@u#1opt\endcsname(##1)##2##3{% \uIf(){}{}
\csname #1@ifthen\endcsname{##2} ##1\csname#1@noend\endcsname{##3}}%
% without side text
\expandafter\algocf@mkcmd\csname algocf@l#1\endcsname[2]{% \lIf{}{}
\csname #1@ifthen\endcsname{##1} ##2}%
\expandafter\algocf@mkcmd\csname algocf@u#1\endcsname[2]{% \uIf{}{}
\csname #1@ifthen\endcsname{##1}\csname#1@noend\endcsname{##2}}%
%
%%%% ElseIf {} endif
%
\@ifundefined{algocf@#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#2\endcsname{% ElseIf
\@ifnextchar({\csname algocf@#2opt\endcsname}{\csname algocf@#2\endcsname}}
% with side text
\expandafter\def\csname algocf@#2opt\endcsname(##1)##2##3{% \ElseIf(){}{}
\csname #2@elseif\endcsname{##2} ##1\csname #1@endif\endcsname{##3}}
% without side text
\expandafter\algocf@mkcmd\csname algocf@#2\endcsname[2]{% \ElseIf{}{}
\csname #2@elseif\endcsname{##1}\csname #1@endif\endcsname{##2}}
%
%%%% ElseIf
%
% side text or not?
\expandafter\def\csname l#2\endcsname{% lElseIf
\@ifnextchar({\csname algocf@l#2opt\endcsname}{\csname algocf@l#2\endcsname}}
\expandafter\def\csname u#2\endcsname{% uElseIf
\@ifnextchar({\csname algocf@u#2opt\endcsname}{\csname algocf@u#2\endcsname}}
% with side text
\expandafter\def\csname algocf@l#2opt\endcsname(##1)##2##3{% \lElseIf(){}{}
\csname #2@elseif\endcsname{##2} ##3\algocf@endline\ ##1\par}
\expandafter\def\csname algocf@u#2opt\endcsname(##1)##2##3{% \uElseIf(){}{}
\csname #2@elseif\endcsname{##2} ##1\csname #1@noend\endcsname{##3}}
% without side text
\expandafter\algocf@mkcmd\csname algocf@l#2\endcsname[2]{% \lElseIf{}{}
\csname #2@elseif\endcsname{##1} ##2}%
\expandafter\algocf@mkcmd\csname algocf@u#2\endcsname[2]{% \uElseIf{}{}
\csname #2@elseif\endcsname{##1}\csname #1@noend\endcsname{##2}}
%
%%%% Else {} endif
%
\@ifundefined{algocf@#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#3\endcsname{% Else
\@ifnextchar({\csname algocf@#3opt\endcsname}{\csname algocf@#3\endcsname}}
% with side text
\expandafter\def\csname algocf@#3opt\endcsname(##1)##2{% \Else(){}
\csname #3@else\endcsname\ ##1\csname #1@endif\endcsname{##2}}
% without side text
\expandafter\algocf@mkcmd\csname algocf@#3\endcsname[1]{% \Else{}
\csname #3@else\endcsname\csname #1@endif\endcsname{##1}}%
%
%%%% Else
%
% side text or not?
\expandafter\def\csname l#3\endcsname{% lElse
\@ifnextchar({\csname algocf@l#3opt\endcsname}{\csname algocf@l#3\endcsname}}
\expandafter\def\csname u#3\endcsname{% uElse
\@ifnextchar({\csname algocf@u#3opt\endcsname}{\csname algocf@u#3\endcsname}}
% with side text
\expandafter\def\csname algocf@l#3opt\endcsname(##1)##2{% \lElse(){}
\csname #3@else\endcsname\ ##2\algocf@endline\ ##1\par}
\expandafter\def\csname algocf@#3opt\endcsname(##1)##2{% \uElse(){}
\csname #3@else\endcsname\ ##1\csname #1@noend\endcsname{##2}}
% without side text
\expandafter\algocf@mkcmd\csname algocf@l#3\endcsname[1]{% \lElse{}
\csname #3@else\endcsname\ ##1}%
\expandafter\algocf@mkcmd\csname algocf@u#3\endcsname[1]{% \uElse{}
\csname #3@else\endcsname\csname #1@noend\endcsname{##1}}%
}
%
% old for backward compatibility
\newcommand{\SetKwIf}[6]{%
\SetKwIF{#1}{cf@dumb}{#2}{#3}{#4}{cf@dumb}{#5}{#6}%
\typeout{**** WARNING: SetKwIf deprecated: use SetKwIF instead*****^^J}%
}%
\newcommand{\SetKwIfElseIf}[8]{%
\SetKwIF{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
\typeout{**** WARNING: SetKwIfElseIf deprecated: use SetKwIF instead*****^^J}%
}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% For macros
%
\newcommand{\SetKwFor}[4]{%
\@ifundefined{algocf@#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#1\endcsname{ %For
\@ifnextchar({\csname algocf@#1opt\endcsname}{\csname algocf@#1\endcsname}}
\expandafter\def\csname l#1\endcsname{ %For
\@ifnextchar({\csname algocf@l#1opt\endcsname}{\csname algocf@l#1\endcsname}}
% with side text
\expandafter\def\csname algocf@#1opt\endcsname(##1)##2##3{% \For(){}{}
\KwSty{#2} \ArgSty{##2} \KwSty{#3} ##1\a@block{##3}{#4}}%
\expandafter\def\csname algocf@l#1opt\endcsname(##1)##2##3{% \lFor(){}{}
\KwSty{#2} \ArgSty{##2} \KwSty{#3} ##3\algocf@endline\ ##1\par}
% without side text
\expandafter\algocf@mkcmd\csname algocf@#1\endcsname[2]{% \For{}{}
\KwSty{#2} \ArgSty{##1} \KwSty{#3}\a@block{##2}{#4}}%
\expandafter\algocf@mkcmd\csname algocf@l#1\endcsname[2]{% \lFor{}{}
\KwSty{#2} \ArgSty{##1} \KwSty{#3} ##2}%
}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Repeat macros
%
\newcommand{\SetKwRepeat}[3]{%
\@ifundefined{algocf@#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
% side text or not?
\expandafter\def\csname#1\endcsname{ %Repeat
\@ifnextchar({\csname algocf@#1opt\endcsname}{\csname algocf@#1\endcsname}}
\expandafter\def\csname l#1\endcsname{ %lRepeat
\@ifnextchar({\csname algocf@l#1opt\endcsname}{\csname algocf@l#1\endcsname}}
% with side text
\expandafter\def\csname algocf@#1opt\endcsname(##1)##2##3{% \Repeat(){}{}
\KwSty{#2} ##1\a@group{##3}\KwSty{#3} \ArgSty{##2}%
\@ifnextchar({\csname algocf@#1optopt\endcsname}{\@endalgoln}%
}%
\expandafter\def\csname algocf@#1optopt\endcsname(##1){% \Repeat(){}{}()
##1\@endalgoln}%
\expandafter\def\csname algocf@l#1opt\endcsname(##1)##2##3{% \lRepeat(){}{}
\KwSty{#2} ##3 \KwSty{#3} \ArgSty{##2}\algocf@endline\ ##1\par}%
% without side text
\expandafter\algocf@mkcmd\csname algocf@#1\endcsname[2]{% \Repeat{}{}
\KwSty{#2}\a@group{##2}\KwSty{#3} \ArgSty{##1}
\@ifnextchar({\csname algocf@#1optopt\endcsname}{\@endalgoln}%
}%
\expandafter\algocf@mkcmd\csname algocf@l#1\endcsname[2]{% \lRepeat{}{}
\KwSty{#2} ##2 \KwSty{#3} \ArgSty{##1}}%
}
%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%% Environments definitions %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%
%% Caption management
%%
% for the following macros:
% #1 is given by caption and is equal to fnum@algocf
% #2 is the text given in argument by the user in the \caption macro
%
%%%%% text of caption
\newcommand{\algocf@captiontext}[2]{#1\algocf@typo: \AlCapFnt{}#2} % text of caption
%
%%%%% default caption of algorithm: used if no specific style caption is defined
\newcommand{\algocf@makecaption}[2]{%
\addtolength{\hsize}{\algomargin}%
\sbox\@tempboxa{\algocf@captiontext{#1}{#2}}%
\ifdim\wd\@tempboxa >\hsize% % if caption is longer than a line
\hskip .5\algomargin%
\parbox[t]{\hsize}{\algocf@captiontext{#1}{#2}}% then caption is not centered
\else%
\global\@minipagefalse%
\hbox to\hsize{\hfil\box\@tempboxa\hfil}% else caption is centered
\fi%
\addtolength{\hsize}{-\algomargin}%
}
%
\newsavebox\algocf@capbox
\newcommand{\algocf@makecaption@plain}[2]{%
\global\sbox\algocf@capbox{\algocf@makecaption{#1}{#2}}}%
\newcommand{\algocf@makecaption@boxed}[2]{%
\addtolength{\hsize}{-\algomargin}%
\global\sbox\algocf@capbox{\algocf@makecaption{#1}{#2}}
\addtolength{\hsize}{\algomargin}%
}%
%
\newcommand{\algocf@makecaption@algoruled}[2]{\algocf@makecaption@ruled{#1}{#2}}%
\newcommand{\algocf@makecaption@boxruled}[2]{\algocf@makecaption@ruled{#1}{#2}}%
\newcommand{\algocf@makecaption@ruled}[2]{%
\global\sbox\algocf@capbox{\hskip\AlCapHSkip% .5\algomargin%
\parbox[t]{\hsize}{\algocf@captiontext{#1}{#2}}}% then caption is not centered
}
%
\newcommand{\algocf@caption@plain}{\vskip\AlCapSkip\box\algocf@capbox}%
\newcommand{\algocf@caption@boxed}{\vskip\AlCapSkip\box\algocf@capbox}%
\newcommand{\algocf@caption@ruled}{\box\algocf@capbox\kern2pt\hrule height.8pt depth0pt\kern2pt}%
\newcommand{\algocf@caption@algoruled}{\algocf@caption@ruled}%
\newcommand{\algocf@caption@boxruled}{%
\addtolength{\hsize}{-0.8pt}%
\hbox to\hsize{%
\vrule%\hskip-0.35pt%
\vbox{%
\hrule\vskip2\lineskip%
\hbox to\hsize{\unhbox\algocf@capbox\hfill}\vskip2\lineskip%
}%
%\hskip-0.35pt%
\vrule%
}\vskip-2\lineskip\nointerlineskip%
\addtolength{\hsize}{0.8pt}%
}
%
%
%%%% set caption for the environment
% beamer define is own caption overrinding latex caption!
% as we need it, we have put here the original definition
\long\def\algocf@latexcaption#1[#2]#3{% original definition of caption
\par
\addcontentsline{\csname ext@#1\endcsname}{#1}%
{\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}%
\begingroup
\@parboxrestore
\if@minipage
\@setminipage
\fi
\normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup%
}
\ifx\beamer@makecaption\undefined%
\else% beamer detected
\ifx\@makecaption\undefined%
\newcommand{\@makecaption}[2]{\relax}%
\fi%
\fi
%
% more and more packages redefine \@caption instead of just \@makecaption which makes algorithm2e
% caption not works since based on standard \@caption. So we force the definition of \@caption to be
% the standard one (the one from LaTeX) inside algorithm environment.
%
\newcommand{\algocf@setcaption}{%
\let\algocf@savecaption=\@caption%
\let\@caption=\algocf@latexcaption%
\let\algocf@oldmakecaption=\@makecaption%
\renewcommand{\@makecaption}[2]{%
\expandafter\csname algocf@makecaption@\algocf@style\endcsname{##1}{##2}}%
}
%
%%%%% reset caption
%
% since we have force the LaTeX caption for algorithm environment, we must go back to the caption
% used in the text.
\newcommand{\algocf@resetcaption}{%
\let\@caption=\algocf@savecaption%
\let\@makecaption=\algocf@oldmakecaption%
}
%
%%%%% nocaptionofalgo and restorecaptionofalgo --
\newcommand{\nocaptionofalgo}{%
\let\@old@algocf@captiontext=\algocf@captiontext%
\renewcommand{\algocf@captiontext}[2]{\AlCapFnt{}##2}%
}
\newcommand{\restorecaptionofalgo}{%
\let\algocf@captiontext=\@old@algocf@captiontext%
}
%
% ---------------------- algocf environment
%
\newcounter{algocfline} % new counter to make lines numbers be internally
\setcounter{algocfline}{0} % different in different algorithms
%
\expandafter\ifx\csname algocf@within\endcsname\relax% if \algocf@within doesn't exist
\newcounter{algocf} % just define a new counter
\renewcommand\thealgocf{\@arabic\c@algocf} % and the way it is printed
\else% else
\newcounter{algocf}[\algocf@within] % counter is numbered within \algocf@within
\renewcommand\thealgocf{\csname the\algocf@within\endcsname.\@arabic\c@algocf}
\fi
%
\def\fps@algocf{htbp} % default
\def\ftype@algocf{10} % float type
\def\ext@algocf{\algocf@list} % loa by default, lof if figure option used
\def\fnum@algocf{{\AlCapFnt\AlTitleFnt{\algorithmcfname\nobreakspace\thealgocf}}}
\newenvironment{algocf}% % float environment for algorithms
{\@float{algocf}}%
{\end@float}
\newenvironment{algocf*}% % float* environment for algorithms
{\@dblfloat{algocf}}
{\end@dblfloat}
\ifx\l@chapter\undefined%
\newcommand\listofalgocfs{ % list of algorithms
\section*{\listalgorithmcfname}%
\@mkboth{\MakeUppercase\listalgorithmcfname}%
{\MakeUppercase\listalgorithmcfname}%
\@starttoc{loa}%
}
\else%
%\newcommand\listofalgocfs{%
% \if@twocolumn
% \@restonecoltrue\onecolumn
% \else
% \@restonecolfalse
% \fi
% \chapter*{\listalgorithmcfname}%
% \@mkboth{\MakeUppercase\listalgorithmcfname}%
% {\MakeUppercase\listalgorithmcfname}%
% \@starttoc{loa}%
% \if@restonecol\twocolumn\fi
% }
\fi
\newcommand*\l@algocf{\@dottedtocline{1}{1em}{2.3em}}% line of the list
%
% ---------------------- algorithm environment
%
%%%%%%%
%%
%% Algorithm environment definition
%%
%%%%%%%
%%
%
\newsavebox\algocf@algoframe
\def\@algocf@pre@plain{\relax}% action to be done before printing the algo.
\def\@algocf@post@plain{\relax}% action to be done after printing the algo.
\def\@algocf@capt@plain{bottom}% where the caption should be localized.
\def\@algocf@pre@boxed{\noindent\begin{lrbox}{\algocf@algoframe}}
\def\@algocf@post@boxed{\end{lrbox}\framebox[\hsize]{\box\algocf@algoframe}\par}%
\def\@algocf@capt@boxed{under}%
\def\@algocf@pre@ruled{\hrule height.8pt depth0pt\kern2pt}%
\def\@algocf@post@ruled{\kern2pt\hrule\relax}%
\def\@algocf@capt@ruled{top}%
\def\@algocf@pre@algoruled{\hrule height.8pt depth0pt\kern2pt}%
\def\@algocf@post@algoruled{\kern2pt\hrule\relax}%
\def\@algocf@capt@algoruled{top}%
\def\@algocf@pre@boxruled{\noindent\begin{lrbox}{\algocf@algoframe}}%
\def\@algocf@post@boxruled{\end{lrbox}\framebox[\hsize]{\box\algocf@algoframe}\par}%
\def\@algocf@capt@boxruled{above}%
%
%% before algocf or figure environment
\newcommand{\@algocf@init@caption}{%
\@algocf@algotitleofalgo% fix name for \Titleofalgo to \algorithmcfname
\algocf@setcaption% set caption to our caption style
}%
\newcommand{\@algocf@init}{%
\refstepcounter{algocfline}%
\ifthenelse{\boolean{algocf@optnoend}}{%
\renewcommand{\a@block}[2]{\a@group{##1}}%
}{%
\renewcommand{\a@block}[2]{\a@@block{##1}{##2}}%
}%
}
%% after the end of algocf or figure environment
\newcommand{\@algocf@term@caption}{%
\algocf@resetcaption% restore original caption
}%
\newcommand{\@algocf@term}{%
\setboolean{algocf@algoH}{false}% no H by default
\ifthenelse{\boolean{algocf@optnoend}}{%
\renewcommand{\a@block}[2]{\a@@block{##1}{##2}}
}{%
\renewcommand{\a@block}[2]{\a@group{##1}}%
}%
}
%
%%%%%%%%%%%%%%%%%
%% makethealgo: macro which print effectively the algo in its box
%%
\newsavebox\algocf@algobox
\newcommand{\algocf@makethealgo}{%
\vtop{%
% place caption above if needed bye the style
\ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{above}}%
{\csname algocf@caption@\algocf@style\endcsname}{}%
%
% precommand according to the style
\csname @algocf@pre@\algocf@style\endcsname%
% place caption at top if needed bye the style
\ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{top}}%
{\csname algocf@caption@\algocf@style\endcsname}{}%
%
\box\algocf@algobox% the algo
% place caption at bottom if needed bye the style
\ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{bottom}}%
{\csname algocf@caption@\algocf@style\endcsname}{}%
% postcommand according to the style
\csname @algocf@post@\algocf@style\endcsname%
% place caption under if needed bye the style
\ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{under}}
{\csname algocf@caption@\algocf@style\endcsname}{}%
}%
}
%%%%%%%%%%%%%%%%%%%
%
%% at the beginning of algocf or figure environment
\newcommand{\@algocf@start}{%
\@algoskip%
\begin{lrbox}{\algocf@algobox}%
\setlength{\algowidth}{\hsize}%
\vbox\bgroup% save all the algo in a box
\hbox to\algowidth\bgroup\hbox to \algomargin{\hfill}\vtop\bgroup%
\ifthenelse{\boolean{algocf@slide}}{\parskip 0.5ex\color{black}}{}%
% initialization
\addtolength{\hsize}{-1.5\algomargin}%
\let\@mathsemicolon=\;\def\;{\ifmmode\@mathsemicolon\else\@endalgoln\fi}%
\raggedright\AlFnt{}%
\ifthenelse{\boolean{algocf@slide}}{\incmargin{\skipalgocfslide}}{}%
\@algoinsideskip%
%
}
%
%% at the end of algocf or figure environment
\newcommand{\@algocf@finish}{%
\@algoinsideskip%
\egroup%end of vtop which contain all the text
\egroup%end of hbox wich contains [margin][vtop]
\ifthenelse{\boolean{algocf@slide}}{\decmargin{\skipalgocfslide}}{}%
%
\egroup%end of main vbox
\end{lrbox}%
%\egroup% end of algo box
\algocf@makethealgo% print the algo
\@algoskip%
% restore dimension and macros
\setlength{\hsize}{\algowidth}%
\lineskip\normallineskip\setlength{\skiptotal}{\@defaultskiptotal}%
\let\;=\@mathsemicolon%
%
}
%%%%%%%%%%%%%%%%%%%%
%% basic definition of the environment algorithm
%%
\newboolean{algocf@algoH}\setboolean{algocf@algoH}{false}
\newenvironment{algocf@Here}{\noindent%
\def\@captype{algocf}% if not defined, caption exit with an error
% \hbox\bgroup%
\begin{minipage}{\hsize}
}{%
\end{minipage}
% \egroup%
}%
\newenvironment{\algocf@envname}[1][htbp]{%
\@algocf@init%
\ifthenelse{\equal{\algocf@float}{figure}}%
{\begin{figure}[#1]}%
{\@algocf@init@caption\ifthenelse{\equal{#1}{H}}%
{\setboolean{algocf@algoH}{true}\begin{algocf@Here}}%
{\begin{algocf}[#1]}%
}%
\@algocf@start%
\@ResetCounterIfNeeded%
\algocf@linesnumbered%
}{%
\@algocf@finish%
\ifthenelse{\equal{\algocf@float}{figure}}%
{\end{figure}}%
{\@algocf@term@caption\ifthenelse{\boolean{algocf@algoH}}%
{\end{algocf@Here}}%
{\end{algocf}}%
}%
\@algocf@term
}
%%%
%%% algorithm*
%%%
\newenvironment{\algocf@envname*}[1][htbp]{%
\@algocf@init%
\ifthenelse{\equal{\algocf@float}{figure}}%
{\begin{figure*}[#1]}%
{\begin{algocf*}[#1]}%
\@algocf@start%
\@ResetCounterIfNeeded%
\algocf@linesnumbered%
}{
\@algocf@finish%
\ifthenelse{\equal{\algocf@float}{figure}}%
{\end{figure*}}%
{\end{algocf*}}%
\@algocf@term%
}
%
%%%%%%%%%%%%%%%%%%%%%%%
%%%
%
\expandafter\newcommand\csname\algocf@listofalgorithms\endcsname{%
\ifthenelse{\equal{\algocf@float}{figure}}{\listoffigures}{\listofalgocfs}
}
%%%
%%%
%
% ---------------------- procedure and function environments
%
%
% -- new style (used in particular in the caption of function and procedure environments)
%
\newcommand{\ProcNameSty}[1]{\FuncSty{#1}}%
\newcommand{\SetProcNameSty}[1]{\renewcommand{\ProcNameSty}[1]{\textnormal{\csname#1\endcsname{##1}}}}
\newcommand{\ProcArgSty}[1]{\ArgSty{#1}}%
\newcommand{\SetProcArgSty}[1]{\renewcommand{\ProcArgSty}[1]{\textnormal{\csname#1\endcsname{##1}}}}
% three macros to extract parts of the caption
\gdef\algocf@captname#1(#2)#3@{#1} % keep characters before the first brace
\gdef\algocf@captparam#1(#2)#3@{#2} % keep character in between the braces
\gdef\algocf@captother#1(#2)#3@{#3} % keep character after the braces
%
%%% Text of caption for Procedure or Function
\newcommand{\algocf@captionproctext}[2]{%
{\AlCapFnt{}\AlTitleFnt{\algocf@procname} %
\ProcNameSty{\algocf@captname #2@}% Name of the procedure in ProcName Style.
\ifthenelse{\equal{\algocf@captparam #2@}{\arg@e}}{}% if no argument, write nothing
{% else put arguments in ProcArgSty:
\ProcNameSty{(}\ProcArgSty{\algocf@captparam #2@}\ProcNameSty{)}%
}% endif
\algocf@captother #2@%
}
}
%%%% set caption for the environment
% unfortunately, makecaption is called with \ignorespace #3 so
% we can't do the @currentlabel definition inside \algocf@captionproctext
\long\def\algocf@caption@proc#1[#2]#3{%
\gdef\@currentlabel{\algocf@captname #3@}%
\algocf@old@caption{#1}[\algocf@procname\nobreakspace #2]{\ #3}%
}%
\newcommand{\algocf@setcaptionproc}{%
\let\algocf@oldcaptiontext=\algocf@captiontext%
\renewcommand{\algocf@captiontext}[2]{%
\algocf@captionproctext{##1}{##2}}%
\let\algocf@old@caption=\@caption%
\let\@caption=\algocf@caption@proc%
}
%%%%% reset caption
\newcommand{\algocf@resetcaptionproc}{%
\let\algocf@captiontext=\algocf@oldcaptiontext%
\let\@caption=\algocf@old@caption%
}
%
%
%%%%% algocf@proc is the generic environment for procedure and function environment.
%
\newboolean{algocf@procstar}\setboolean{algocf@procstar}{false}
\newenvironment{algocf@proc}[1][htbp]{%
\@algocf@proctitleofalgo% set Titleofalgo to Procedure: or Function:
% accordingly to the environment
\let\old@thealgocf=\thealgocf%\renewcommand{\thealgocf}{--}%
\algocf@setcaptionproc% set the text of caption to proc
\algocf@setcaption% set caption to our caption style
\refstepcounter{algocfline}%
\ifthenelse{\equal{\algocf@float}{figure}}{%
\ifthenelse{\boolean{algocf@procstar}}{\begin{figure*}[#1]}{\begin{figure}[#1]}%
}{%
\ifthenelse{\boolean{algocf@procstar}}%
{\begin{algocf*}[#1]}%
{\ifthenelse{\equal{#1}{H}}%
{\setboolean{algocf@algoH}{true}\begin{algocf@Here}}%
{\begin{algocf}[#1]}%
}%
}%
\@algocf@start%
\@ResetCounterIfNeeded%
\algocf@linesnumbered%
}{%
\@algocf@finish%
\ifthenelse{\equal{\algocf@float}{figure}}{%
\ifthenelse{\boolean{algocf@procstar}}{\end{figure*}}{\end{figure}}%
}{%
\ifthenelse{\boolean{algocf@procstar}}
{\end{algocf*}}
{\ifthenelse{\boolean{algocf@algoH}}
{\end{algocf@Here}}%
{\end{algocf}}%
}%
}%
\let\thealgocf=\old@thealgocf%
\@algocf@term% restore original caption and H boolean
\algocf@resetcaptionproc%
}
%
% -- procedure and function environments are defined from algocf@proc environment
%
\newenvironment{procedure}[1][htbp]%
{\setboolean{algocf@procstar}{false}%
\newcommand{\algocf@procname}{\@algocf@procname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
\newenvironment{function}[1][htbp]%
{\setboolean{algocf@procstar}{false}%
\newcommand{\algocf@procname}{\@algocf@funcname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
%
\newenvironment{procedure*}[1][htbp]%
{\setboolean{algocf@procstar}{true}%
\newcommand{\algocf@procname}{\@algocf@procname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
\newenvironment{function*}[1][htbp]%
{\setboolean{algocf@procstar}{true}%
\newcommand{\algocf@procname}{\@algocf@funcname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
\newcommand{\Titleofalgo}[1]{\@titleprefix\TitleSty{#1}\par\smallskip}
%
%
% ------------------------- Default Definitions
%
%%
%%
%
\newcommand{\algocf@defaults@common}{
%\SetKwInOut{AlgDonnees}{Donn\'ees}\SetKwInOut{AlgRes}{R\'esultat}
\SetKwInput{Donnees}{Donn\'ees}%
\SetKwInput{Res}{R\'esultat}%
\SetKwInput{Entree}{Entr\'ees}%
\SetKwInput{Sortie}{Sorties}%
\SetKw{KwA}{\`a}%
\SetKw{Retour}{retourner}%
\SetKwBlock{Deb}{d\'ebut}{fin}%
\SetKwRepeat{Repeter}{r\'ep\'eter}{jusqu'\`a}%
%
\SetKwComment{tcc}{/* }{ */}
\SetKwComment{tcp}{// }{}
%
%\SetKwInOut{AlgData}{Data}\SetKwInOut{AlgResult}{Result}
\SetKwInput{KwIn}{Input}%
\SetKwInput{KwOut}{Output}%
\SetKwInput{KwData}{Data}%
\SetKwInput{KwResult}{Result}%
\SetKw{KwTo}{to}
\SetKw{KwRet}{return}%
\SetKw{Return}{return}%
\SetKwBlock{Begin}{begin}{end}%
\SetKwRepeat{Repeat}{repeat}{until}%
%
% --- German keywords
%
% \SetKwInOut{AlgDaten}{Daten}%AlgData
% \SetKwInOut{AlgErgebnis}{Ergebnis}%AlgResult
\SetKwInput{Ein}{Eingabe}%KwIn
\SetKwInput{Aus}{Ausgabe}%KwOut
\SetKwInput{Daten}{Daten}%KwData
\SetKwInput{Ergebnis}{Ergebnis}%KwResult
\SetKw{Bis}{bis}%KwTo
\SetKw{KwZurueck}{zur\"uck}%KwRet
\SetKw{Zurueck}{zur\"uck}%Return
\SetKwBlock{Beginn}{Beginn}{Ende}%Begin
\SetKwRepeat{Wiederh}{wiederhole}{bis}%Repeat
%
% --- Czech keywords
%
% \SetKwInOut{AlgVst}{Vstup}\SetKwInOut{AlgVyst}{V\'{y}stup}
\SetKwInput{Vst}{Vstup}%
\SetKwInput{Vyst}{V\'{y}stup}%
\SetKwInput{Vysl}{V\'{y}sledek}%
%
% --- Portuguese keywords
%
% \SetKwInOut{AlgDados}{Dados}\SetKwInOut{AlgResultado}{Result.}
\SetKwInput{Entrada}{Entrada}%
\SetKwInput{Saida}{Sa\'{i}da}%
\SetKwInput{Dados}{Dados}%
\SetKwInput{Resultado}{Resultado}%
\SetKw{Ate}{at\'{e}}
\SetKw{KwRetorna}{retorna}%
\SetKw{Retorna}{retorna}%
\SetKwBlock{Inicio}{in\'{i}cio}{fim}%
\SetKwRepeat{Repita}{repita}{at\'{e}}%
% --- End
}
%
%
\newcommand{\algocf@defaults@longend}{%
\algocf@defaults@common
\SetKwIF{gSi}{gSinonSi}{gSinon}{si}{alors}{sinon si}{sinon}{finsi}%
\SetKwIF{Si}{SinonSi}{Sinon}{si}{alors}{sinon si}{sinon}{finsi}%
\SetKwSwitch{Suivant}{Cas}{Autre}{suivant}{faire}{cas o\`u}{autres cas}{fin d'alternative}%
\SetKwFor{Pour}{pour}{faire}{finpour}%
\SetKwFor{PourPar}{pour}{faire en parallèle}{finpour}%
\SetKwFor{PourCh}{pour chaque}{faire}{finprch}%
\SetKwFor{PourTous}{pour tous les}{faire}{finprts}%
\SetKwFor{Tq}{tant que}{faire}{fintq}%
%
\SetKwIF{gIf}{gElsIf}{gElse}{if}{then}{else if}{else}{endif}%
\SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{endif}%
\SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{endsw}%
\SetKwFor{For}{for}{do}{endfor}%
\SetKwFor{ForPar}{for}{do in parallel}{endfpar}
\SetKwFor{ForEach}{foreach}{do}{endfch}%
\SetKwFor{ForAll}{forall the}{do}{endfall}%
\SetKwFor{While}{while}{do}{endw}%
%
% --- German for longend
%
\SetKwIF{gWenn}{gSonstWenn}{gSonst}{wenn}{dann}{sonst wenn}{sonst}{Ende-wenn}%gIf
\SetKwIF{Wenn}{SonstWenn}{Sonst}{wenn}{dann}{sonst wenn}{sonst}{Ende-wenn}%gIf
\SetKwSwitch{Unterscheide}{Fall}{Anderes}{unterscheide}{tue}{Fall}{sonst}{Ende-Unt.}%Switch
\SetKwFor{Fuer}{f\"ur}{tue}{Ende-f\"ur}%For
\SetKwFor{FuerPar}{f\"ur}{tue gleichzeitig}{Ende-gleichzeitig}%ForPar
\SetKwFor{FuerJedes}{f\"ur jedes}{tue}{Ende-f\"ur}%ForEach
\SetKwFor{FuerAlle}{f\"ur alle}{tue}{Ende-f\"ur}%ForAll
\SetKwFor{Solange}{solange}{tue}{Ende-solange}%While
%
% --- Portuguese
%
\SetKwIF{gSe}{gSenaoSe}{gSenao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim se}%
\SetKwIF{Se}{SenaoSe}{Senao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim se}%
\SetKwSwitch{Selec}{Caso}{Outro}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{fim selec}%
\SetKwFor{Para}{para}{fa\c{c}a}{fim para}%
\SetKwFor{ParaPar}{para}{fa\c{c}a em paralelo}{fim para}
\SetKwFor{ParaCada}{para cada}{fa\c{c}a}{fim para cada}%
\SetKwFor{ParaTodo}{para todo}{fa\c{c}a}{fim para todo}%
\SetKwFor{Enqto}{enquanto}{fa\c{c}a}{fim enqto}%
}
%
%
\newcommand{\algocf@defaults@shortend}{%
\algocf@defaults@common
\SetKwIF{gSi}{gSinonSi}{gSinon}{si}{alors}{sinon si}{sinon}{fin}%
\SetKwIF{Si}{SinonSi}{Sinon}{si}{alors}{sinon si}{sinon}{fin}%
\SetKwSwitch{Suivant}{Cas}{Autre}{suivant}{faire}{cas o\`u}{autres cas}{fin}%
\SetKwFor{Pour}{pour}{faire}{fin}%
\SetKwFor{PourPar}{pour}{faire en parallèle}{fin}%
\SetKwFor{PourCh}{pour chaque}{faire}{fin}%
\SetKwFor{PourTous}{pour tous les}{faire}{fin}%
\SetKwFor{Tq}{tant que}{faire}{fin}%
%
%
\SetKwIF{gIf}{gElsIf}{gElse}{if}{then}{else if}{else}{end}%
\SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{end}%
\SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{end}%
\SetKwFor{For}{for}{do}{end}%
\SetKwFor{ForPar}{for}{do in parallel}{end}
\SetKwFor{ForEach}{foreach}{do}{end}%
\SetKwFor{ForAll}{forall}{do}{end}%
\SetKwFor{While}{while}{do}{end}%
%
% --- German for shortend
%
\SetKwIF{gWenn}{gSonstWenn}{gSonst}{wenn}{dann}{sonst wenn}{sonst}{Ende}%gIf
\SetKwIF{Wenn}{SonstWenn}{Sonst}{wenn}{dann}{sonst wenn}{sonst}{Ende}%gIf
\SetKwSwitch{Unterscheide}{Fall}{Anderes}{unterscheide}{tue}{Fall}{sonst}{}%Switch
\SetKwFor{Fuer}{f\"ur}{tue}{Ende}%For
\SetKwFor{FuerPar}{f\"ur}{tue gleichzeitig}{Ende}%ForPar
\SetKwFor{FuerJedes}{f\"ur jedes}{tue}{Ende}%ForEach
\SetKwFor{FuerAlle}{f\"ur alle}{tue}{Ende}%ForAll
\SetKwFor{Solange}{solange}{tue}{Ende}%While
%
% --- Portuguese
%
\SetKwIF{gSe}{gSenaoSe}{gSenao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim}%
\SetKwIF{Se}{SenaoSe}{Senao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim}%
\SetKwSwitch{Selec}{Caso}{Outro}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{fim}%
\SetKwFor{Para}{para}{fa\c{c}a}{fim}%
\SetKwFor{ParaPar}{para}{fa\c{c}a em paralelo}{fim}
\SetKwFor{ParaCada}{para cada}{fa\c{c}a}{fim}%
\SetKwFor{ParaTodo}{para todo}{fa\c{c}a}{fim}%
\SetKwFor{Enqto}{enquanto}{fa\c{c}a}{fim}%
}
%
%
\newcommand{\algocf@defaults@noend}{%
\renewcommand{\a@block}[2]{\a@group{##1}}
\algocf@defaults@common
\SetKwIF{gSi}{gSinonSi}{gSinon}{si}{alors}{sinon si}{sinon}{}%
\SetKwIF{Si}{SinonSi}{Sinon}{si}{alors}{sinon si}{sinon}{}%
\SetKwSwitch{Suivant}{Cas}{Autre}{suivant}{faire}{cas où}{autres cas}{}%
\SetKwFor{Pour}{pour}{faire}{}%
\SetKwFor{PourPar}{pour}{faire en parallèle}{}%
\SetKwFor{PourCh}{pour chaque}{faire}{}%
\SetKwFor{PourTous}{pour tous les}{faire}{}%
\SetKwFor{Tq}{tant que}{faire}{}%
%
\SetKwIF{gIf}{gElsIf}{gElse}{if}{then}{else if}{else}{}%
\SetKwIF{If}{ElsIf}{Else}{if}{then}{else if}{else}{}%
\SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{}%
\SetKwFor{For}{for}{do}{}%
\SetKwFor{ForPar}{for}{do in parallel}{}
\SetKwFor{ForEach}{foreach}{do}{}%
\SetKwFor{ForAll}{forall}{do}{}%
\SetKwFor{While}{while}{do}{}%
% --- German for noend
\SetKwIF{gWenn}{gSonstWenn}{gSonst}{wenn}{dann}{sonst wenn}{sonst}{}%gIf
\SetKwIF{Wenn}{SonstWenn}{Sonst}{wenn}{dann}{sonst wenn}{sonst}{}%gIf
\SetKwSwitch{Unterscheide}{Fall}{Anderes}{unterscheide}{tue}{Fall}{sonst}{}%Switch
\SetKwFor{Fuer}{f\"ur}{tue}{}%For
\SetKwFor{FuerPar}{f\"ur}{tue gleichzeitig}{}%ForPar
\SetKwFor{FuerJedes}{f\"ur jedes}{tue}{}%ForEach
\SetKwFor{FuerAlle}{f\"ur alle}{tue}{}%ForAll
\SetKwFor{Solange}{solange}{tue}{}%While
% --- Portuguese
\SetKwIF{gSe}{gSenaoSe}{gSenao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{}%
\SetKwIF{Se}{SenaoSe}{Senao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{}%
\SetKwSwitch{Selec}{Caso}{Outro}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{}%
\SetKwFor{Para}{para}{fa\c{c}a}{}%
\SetKwFor{ParaPar}{para}{fa\c{c}a em paralelo}{}
\SetKwFor{ParaCada}{para cada}{fa\c{c}a}{}%
\SetKwFor{ParaTodo}{para todo}{fa\c{c}a}{}%
\SetKwFor{Enqto}{enquanto}{fa\c{c}a}{}%
}
%
%%
%%
%%
%
% default macros are:
\defaultsmacros@algo
\SetNoline
%
%
%
%%
%%%
%%%% END
\ No newline at end of file
\newcommand\classname{bioinfo}
\newcommand\lastmodifieddate{2003/02/08}
\newcommand\versionnumber{0.1}
% Are we printing crop marks?
\newif\if@cropmarkson \@cropmarksontrue
\NeedsTeXFormat{LaTeX2e}[2001/06/01]
\ProvidesClass{\classname}[\lastmodifieddate\space\versionnumber]
\setlength{\paperheight}{11truein}
\setlength{\paperwidth}{8.5truein}
\newif\if@final
\DeclareOption{draft}{\PassOptionsToPackage{draft}{graphicx}}
\DeclareOption{b4paper}{\PassOptionsToPackage{b4}{crop}}
\DeclareOption{centre}{\PassOptionsToPackage{center}{crop}}
\DeclareOption{crop}{\PassOptionsToPackage{cam}{crop}\global\@cropmarksontrue}
\DeclareOption{nocrop}{\PassOptionsToPackage{off}{crop}\global\@cropmarksonfalse}
\DeclareOption{info}{\PassOptionsToPackage{info}{crop}}
\DeclareOption{noinfo}{\PassOptionsToPackage{noinfo}{crop}}
\DeclareOption{final}{\global\@finaltrue}
\ExecuteOptions{b4paper,crop,centre,info}
\ProcessOptions
% Load all necessary packages
\RequirePackage{inputenc,crop,graphicx,amsmath,array,color,amssymb,flushend,stfloats,amsthm,chngpage,times}
\RequirePackage[LY1]{fontenc}
\renewcommand{\rmdefault}{ptm}
\renewcommand{\sfdefault}{phb}
\renewcommand{\ttdefault}{pcr}
%\RequirePackage[LY1,mtbold]{mathtime}
\def\helvetica{\fontfamily{phv}\selectfont}
\def\helveticaitalic{\fontfamily{phv}\itshape\selectfont}
\def\helveticabold{\fontfamily{phv}\bfseries\selectfont}
\def\helveticabolditalic{\fontfamily{phv}\bfseries\itshape\selectfont}
\def\helveticacn{\fontfamily{phv}\fontseries{mc}\fontshape{n}\selectfont}
\def\helveticacnitalic{\fontfamily{phv}\fontseries{mc}\fontshape{sl}\selectfont}
\def\helveticacnbold{\fontfamily{phv}\fontseries{bc}\fontshape{n}\selectfont}
\def\helveticacnbolditalic{\fontfamily{phv}\fontseries{bc}\fontshape{sl}\selectfont}
% Not sure if needed.
\newcommand\@ptsize{0}
% Set twoside printing
\@twosidetrue
% Marginal notes are on the outside edge
\@mparswitchfalse
\reversemarginpar
\renewcommand\normalsize{%
\@setfontsize\normalsize{8}{11}%
\abovedisplayskip 11\p@ \@plus2\p@ \@minus5\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
\belowdisplayskip \abovedisplayskip
\let\@listi\@listI}
\normalsize
\let\@bls\baselineskip
\newcommand\small{%
\@setfontsize\small{7}{10}%
\abovedisplayskip 10\p@ minus 3\p@
\belowdisplayskip \abovedisplayskip
\abovedisplayshortskip \z@ plus 2\p@
\belowdisplayshortskip 4\p@ plus 2\p@ minus2\p@
\def\@listi{\topsep 4.5\p@ plus 2\p@ minus 1\p@
\itemsep \parsep
\topsep 4\p@ plus 2\p@ minus 2\p@}}
\newcommand\footnotesize{%
\@setfontsize\footnotesize{8}{10}%
\abovedisplayskip 6\p@ minus 3\p@
\belowdisplayskip\abovedisplayskip
\abovedisplayshortskip \z@ plus 3\p@
\belowdisplayshortskip 6\p@ plus 3\p@ minus 3\p@
\def\@listi{\topsep 3\p@ plus 1\p@ minus 1\p@
\parsep 2\p@ plus 1\p@ minus 1\p@\itemsep \parsep}}
\def\scriptsize{\@setfontsize\scriptsize{6.5pt}{9.5pt}}
\def\tiny{\@setfontsize\tiny{5pt}{7pt}}
\def\large{\@setfontsize\large{11.5pt}{12pt}}
\def\Large{\@setfontsize\Large{14pt}{16}}
\def\LARGE{\@setfontsize\LARGE{15pt}{17pt}}
\def\huge{\@setfontsize\huge{22pt}{22pt}}
\def\Huge{\@setfontsize\Huge{30pt}{30pt}}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\helvetica}{\mathsf}
\DeclareOldFontCommand{\sfit}{\normalfont\sffamily\itshape}{\mathsf}
\DeclareOldFontCommand{\sfb}{\normalfont\helveticabold}{\mathsf}
\DeclareOldFontCommand{\sfbi}{\normalfont\sffamily\bfseries\itshape}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
% Line spacing
\setlength\lineskip{1\p@}
\setlength\normallineskip{1\p@}
\renewcommand\baselinestretch{}
% Paragraph dimensions and inter-para spacing
\setlength\parskip{0\p@}
\setlength\parindent{12pt}
% Set inter-para skips
\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@}
\setlength\medskipamount{6\p@ \@plus 2\p@}
\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@}
% Page break penalties
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
% Disallow widows and orphans
\clubpenalty 10000
\widowpenalty 10000
% Disable page breaks before equations, allow pagebreaks after
% equations and discourage widow lines before equations.
\displaywidowpenalty 100
\predisplaypenalty 10000
\postdisplaypenalty 2500
% Allow breaking the page in the middle of a paragraph
\interlinepenalty 0
% Disallow breaking the page after a hyphenated line
\brokenpenalty 10000
% Hyphenation; don't split words into less than three characters
\lefthyphenmin=3
\righthyphenmin=3
%
% Set page layout dimensions
%
\setlength\headheight{16\p@} % height of running head
\setlength\topmargin{2.5pc} % head margin
\addtolength\topmargin{-1in} % subtract out the 1 inch driver margin
\setlength\topskip{10\p@} % height of first line of text
\setlength\headsep{8\p@} % space below running head --
\setlength\footskip{10\p@} % space above footer line
\setlength\maxdepth{.5\topskip} % pages can be short or deep by half a line?
\setlength\textwidth{40.5pc} % text measure excluding margins
\setlength\textheight{61\baselineskip} % 54 lines on a full page,
\addtolength\textheight{\topskip} % including the first
% line on the page
% Set the margins
\setlength\marginparsep{3\p@}
\setlength\marginparpush{3\p@}
\setlength\marginparwidth{35\p@}
\setlength\oddsidemargin{5.25pc}
\addtolength\oddsidemargin{-1in} % subtract out the 1 inch driver margin
\setlength\@tempdima{\paperwidth}
\addtolength\@tempdima{-\textwidth}
\addtolength\@tempdima{-5.25pc}
\setlength\evensidemargin{\@tempdima}
\addtolength\evensidemargin{-1in}
\setlength\columnsep{1.5pc} % space between columns for double-column text
\setlength\columnseprule{0\p@} % width of rule between two columns
% Footnotes
\setlength\footnotesep{9\p@} % space between footnotes
% space between text and footnote
\setlength{\skip\footins}{12\p@ \@plus 6\p@ \@minus 1\p@}
% Float placement parameters
% The total number of floats that can be allowed on a page.
\setcounter{totalnumber}{10}
% The maximum number of floats at the top and bottom of a page.
\setcounter{topnumber}{5}
\setcounter{bottomnumber}{5}
% The maximum part of the top or bottom of a text page that can be
% occupied by floats. This is set so that at least four lines of text
% fit on the page.
\renewcommand\topfraction{.9}
\renewcommand\bottomfraction{.9}
% The minimum amount of a text page that must be occupied by text.
% This should accomodate four lines of text.
\renewcommand\textfraction{.06}
% The minimum amount of a float page that must be occupied by floats.
\renewcommand\floatpagefraction{.94}
% The same parameters repeated for double column output
\renewcommand\dbltopfraction{.9}
\renewcommand\dblfloatpagefraction{.9}
% Space between floats
\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
% Space between floats and text
\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
% Space above and below an inline figure
\setlength\intextsep {18\p@ \@plus 2\p@ \@minus 2\p@}
% For double column floats
\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@}
\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@}
% Space left at top, bottom and inbetween floats on a float page.
\setlength\@fptop{0\p@} % no space above float page figures
\setlength\@fpsep{12\p@ \@plus 1fil}
\setlength\@fpbot{0\p@}
% The same for double column
\setlength\@dblfptop{0\p@}
\setlength\@dblfpsep{12\p@ \@plus 1fil}
\setlength\@dblfpbot{0\p@}
% Override settings in mathtime back to TeX defaults
\DeclareMathSizes{5} {5} {5} {5}
\DeclareMathSizes{6} {6} {5} {5}
\DeclareMathSizes{7} {7} {5} {5}
\DeclareMathSizes{8} {8} {6} {5}
\DeclareMathSizes{9} {9} {6.5} {5}
\DeclareMathSizes{10} {10} {7.5} {5}
\DeclareMathSizes{12} {12} {9} {7}
% Page styles
\def\ps@headings
{%
% \def\@oddfoot{\vbox to 12.5\p@{\hbox{\rule{\textwidth}{1\p@}}\vss
% \hbox to \textwidth{\hfill\helveticabold\small\thepage}%
% }}%
% \def\@evenfoot{\vbox to 12.5\p@{\rule{\textwidth}{1\p@}\vss
% \hbox to \textwidth{\helveticabold\small\thepage\hfill}%
% }}%
\let\@oddfoot\@empty%
\let\@evenfoot\@empty%
\def\@evenhead{\vbox{\hbox to \textwidth{\fontsize{8}{10}\selectfont
{\helveticabold{\selectfont\thepage}}\hfill\helveticaitalic{\fontshape{sl}\selectfont
\strut\leftmark}}\vspace{5\p@}\rule{\textwidth}{1\p@}}}%
\def\@oddhead{\vbox{\hbox to \textwidth{\fontsize{8}{10}\selectfont
{\helveticaitalic{\fontshape{it}\selectfont\strut\rightmark}}\hfill{\helveticabold{\thepage}}}%
\vspace{5\p@}\rule{\textwidth}{1\p@}}}%
\def\titlemark##1{\markboth{##1}{##1}}%
\def\authormark##1{\gdef\leftmark{##1}}%
}
\def\ps@opening
{%
\def\@oddfoot{{
\hbox to \textwidth{\helvetica
\fontsize{7}{9}\fontshape{n}\selectfont \copyright\space The Author \@copyrightyear. Published by Oxford University Press. All rights reserved. For permissions, please e-mail: journals.permissions@oup.com%
\hfill\small\helveticabold\thepage}%
}}%
\def\@evenfoot{{
\hbox to \textwidth{\helvetica\thepage\hfill
\fontsize{7}{9}\fontshape{n}\selectfont The Author \@copyrightyear. Published by Oxford University Press. All rights reserved. For permissions, please e-mail: journals.permissions@oup.com}%
}}%
\let\@evenhead\relax
\let\@oddhead\relax}
% Page range
\newif\iflastpagegiven \lastpagegivenfalse
\newcommand\firstpage[1]{%
\gdef\@firstpage{#1}%
\ifnum\@firstpage>\c@page
\setcounter{page}{#1}%
\ClassWarning{BIO}{Increasing pagenumber to \@firstpage}%
\else \ifnum\@firstpage<\c@page
\ClassWarning{BIO}{Firstpage lower than pagenumber}\fi\fi
\xdef\@firstpage{\the\c@page}%
}
\def\@firstpage{1}
\def\pagenumbering#1{%
\global\c@page \@ne
\gdef\thepage{\csname @#1\endcsname \c@page}%
\gdef\thefirstpage{%
\csname @#1\endcsname \@firstpage}%
\gdef\thelastpage{%
\csname @#1\endcsname \@lastpage}%
}
\newcommand\lastpage[1]{\xdef\@lastpage{#1}%
\global\lastpagegiventrue}
\def\@lastpage{0}
\def\setlastpage{\iflastpagegiven\else
\edef\@tempa{@lastpage@}%
\expandafter
\ifx \csname \@tempa \endcsname \relax
\gdef\@lastpage{0}%
\else
\xdef\@lastpage{\@nameuse{@lastpage@}}%
\fi
\fi }
\def\writelastpage{%
\iflastpagegiven \else
\immediate\write\@auxout%
{\string\global\string\@namedef{@lastpage@}{\the\c@page}}%
\fi
}
\def\thepagerange{%
\ifnum\@lastpage =0 {\ \bf ???} \else
\ifnum\@lastpage = \@firstpage \ \thefirstpage\else
\thefirstpage--\thelastpage \fi\fi}
\AtBeginDocument{\setlastpage
\pagenumbering{arabic}%
}
\AtEndDocument{%
\writelastpage
\if@final
\clearemptydoublepage
\else
\clearpage
\fi}
%
% Sectional units
%
% Counters
\newcounter{section}
\newcounter{subsection}[section]
\newcounter{subsubsection}[subsection]
\newcounter{paragraph}[subsubsection]
\newcounter{subparagraph}[paragraph]
\newcounter{figure}
\newcounter{table}
% Form of the numbers
\newcommand\thepage{\arabic{page}}
\renewcommand\thesection{\arabic{section}}
\renewcommand\thesubsection{{\thesection.\arabic{subsection}}}
\renewcommand\thesubsubsection{{\thesubsection.\arabic{subsubsection}}}
\renewcommand\theparagraph{\thesubsubsection.\arabic{paragraph}}
\renewcommand\thesubparagraph{\theparagraph.\arabic{subparagraph}}
\renewcommand\theequation{\arabic{equation}}
% Form of the words
\newcommand\contentsname{Contents}
\newcommand\listfigurename{List of Figures}
\newcommand\listtablename{List of Tables}
\newcommand\partname{Part}
\newcommand\appendixname{Appendix}
\newcommand\abstractname{Abstract}
\newcommand\refname{References}
\newcommand\bibname{References}
\newcommand\indexname{Index}
\newcommand\figurename{Fig.}
\newcommand\tablename{Table}
% Clearemptydoublepage should really clear the running heads too
\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}}
% Frontmatter, mainmatter and backmatter
\newif\if@mainmatter \@mainmattertrue
\newcommand\frontmatter{%
\clearpage
\@mainmatterfalse
\pagenumbering{roman}}
\newcommand\mainmatter{%
\clearpage
\@mainmattertrue
\pagenumbering{arabic}}
\newcommand\backmatter{%
\clearpage
\@mainmatterfalse}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TITLE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newlength{\dropfromtop}
\setlength{\dropfromtop}{\z@}
% Application Notes
\newif\if@appnotes
\newcommand{\application}{%
% \setlength{\dropfromtop}{-2.25pc}%
\global\@appnotestrue}
\long\def\title{\@ifnextchar[{\short@title}{\@@title}}
\def\short@title[#1]{\titlemark{#1}\@@@title}
\def\@@title#1{\authormark{#1}\@@@title{#1}}
\long\def\@@@title#1{\gdef\@title{#1}}
\long\def\subtitle#1{\gdef\@subtitle{#1}}
\subtitle{Genome analysis}
\long\def\author{\@ifnextchar[{\short@uthor}{\@uthor}}
\def\short@uthor[#1]{\authormark{#1}\@@author}
\def\@uthor#1{\authormark{#1}\@@author{#1}}
\long\def\@@author#1{\gdef\@author{#1}}
\def\vol#1{\global\def\@vol{#1}}
\def\issue#1{\global\def\@issue{#1}}
\def\address#1{\global\def\@issue{#1}}
\def\history#1{\global\def\@history{#1}}
\def\abstract#1{\global\def\@abstract{#1}}
\def\editor#1{\global\def\@editor{#1}}
\def\pubyear#1{\global\def\@pubyear{#1}}
\def\copyrightyear#1{\global\def\@copyrightyear{#1}}
\def\address#1{\global\def\@address{#1}}
\def\corresp#1{\global\def\@corresp{#1}}
\def\DOI#1{\global\def\@DOI{#1}}
\definecolor{gray}{cmyk}{0, 0, 0, 0.15}
\definecolor{grayfifty}{cmyk}{0, 0, 0, 0.5}
\definecolor{graysixtyfive}{cmyk}{0, 0, 0, 0.65}
\newlength{\extraspace}
\setlength{\extraspace}{\z@}
\newcommand\maketitle{\par
\begingroup
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
\def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
\long\def\@makefntext##1{\parindent 3mm\noindent
% \@textsuperscript{\normalfont\@thefnmark}\raggedright##1}%
\@textsuperscript{\normalfont\@thefnmark}##1}%
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage\enlargethispage{-23pt}
\global\@topnum\z@ % Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{opening}\@thanks
\endgroup
\setcounter{footnote}{0}%
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@maketitle\relax
\global\let\@address\@empty
\global\let\@corresp\@empty
\global\let\@history\@empty
\global\let\@editor\@empty
\global\let\@thanks\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\global\let\@subtitle\@empty
\global\let\@title\@empty
\global\let\@pubyear\@empty
\global\let\address\relax
\global\let\history\relax
\global\let\editor\relax
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\pubyear\relax
\global\let\@copyrightline\@empty
\global\let\and\relax
\@afterindentfalse\@afterheading
\enlargethispage{-23pt}}
\newlength{\aboveskipchk}%for checking oddpage or evenpage top skip
\setlength{\aboveskipchk}{\z@}%
\def\access#1{\gdef\@access{#1}}
\access{Advance Access Publication Date: 2 April 2015}
\def\appnotes#1{\gdef\@appnotes{#1}}
\appnotes{Applications Note}
\def\@maketitle{%
\let\footnote\thanks
\clearemptydoublepage
\checkoddpage\ifcpoddpage\setlength{\aboveskipchk}{-16pt}\else\setlength{\aboveskipchk}{-16pt}\fi%for checking oddpage or evenpage top skip%%
\vspace*{\aboveskipchk}%
\vspace{\dropfromtop}%
\hbox to \textwidth{\raisebox{5pt}[0pt]{%
\parbox[b]{415pt}{\raggedleft{\helveticacnitalic\fontsize{8}{12}\selectfont {Bioinformatics}}\\[1pt]
{\helveticacn doi.10.1093/bioinformatics/xxxxxx}\\[1pt]
{\ifx\@access\@empty
\else
{\helveticacn \@access}\fi}
\vskip1pt
{\ifx\@appnotes\@empty
\else
{\helveticacn \@appnotes}\fi}
}}%
%\enskip \parbox[b]{11.3pc}{%
% \helvetica
% \flushright\fontsize{8}{10}\fontshape{it}\selectfont
% Vol. 00\ no. 00 \@pubyear\\
% \hfill Pages \thepagerange
% }
\vspace{-2cm}
\hfill\includegraphics{fig/oxford.png}}
\vskip2pt
\rule{415pt}{2\p@}\par%
\helvetica
\hbox to \textwidth{%
\parbox[t]{36.5pc}{%
\vspace*{3pt}
\ifx\@subtitle\@empty
\else
{\helveticacn\fontsize{14}{21}\selectfont\raggedright \@subtitle \par}%
\vspace{7.5\p@}
\fi
{\helveticabold\fontsize{18}{23}\selectfont\raggedright \@title \par}%
\vspace{8.8\p@}
{\helveticabold\boldmath\fontsize{12}{15}\selectfont\raggedright \@author \par}%
\vspace{9\p@}
{\helveticacn\fontsize{9}{12}\selectfont\raggedright \@address \par}%
\vspace{6\p@}
{\helveticacn\fontsize{8.5}{12}\selectfont\raggedright \@corresp \par}%
\vspace{2\p@}
{\helvetica\fontsize{8.5}{12}\selectfont\raggedright \@editor \par}
\vspace{4\p@}
{\helvetica\fontsize{7}{12}\selectfont\raggedright \@history \par}
\vspace{14\p@}
{
\let\section\absection
{\helvetica\fontsize{10}{12}\bfseries\selectfont Abstract}\par}
\vskip5pt
\begingroup\begin{minipage}[t]{415pt}\parindent=0pt
{\helvetica\fontsize{9}{12}\selectfont \@abstract\par}
\end{minipage}
\endgroup
%\vspace{20\p@}
}%
}
\vspace{13.5\p@}%
\rule{415pt}{2\p@}%
\vspace{12\p@ plus 6\p@ minus 6\p@}%
\vspace{\extraspace}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%% Abstract %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\absection}[1]{%
\par\noindent{\bfseries #1}\space\ignorespaces}
%\newenvironment{abstract}{%
% \begingroup
% \let\section\absection
% \fontfamily{\sfdefault}\fontsize{10}{12}\sffamily\selectfont
% {\fontseries{b}\selectfont Abstract}\par}
%{\endgroup\bigskip\@afterheading\@afterindentfalse\vskip 12pt plus 3pt minus 1pt}
% Section macros
% Lowest level heading that takes a number by default
\setcounter{secnumdepth}{3}
\renewcommand{\@seccntformat}[1]{\csname the#1\endcsname\space}
\def\section{%
\@startsection{section}{1}{\z@}
{-22\p@ plus -3\p@}{4\p@}
{\reset@font\raggedright\helveticabold\fontsize{10}{12}\selectfont}}
\def\subsection{%
\@startsection{subsection}{2}{\z@}
{-11\p@ plus -2\p@}{4\p@}
{\reset@font\raggedright\helvetica\fontsize{9}{12}\selectfont}}
\def\subsubsection{%
\@startsection{subsubsection}{3}{\z@}
{-11\p@ plus -1\p@}{0.001em}
{\reset@font\normalfont\mathversion{bold}\normalsize\bfseries}}
\def\textcolon{\text{\rm :}}
\def\paragraph{%
\@startsection{paragraph}{4}{\z@}
{-6\p@}
{-.4em}
{\reset@font\itshape}}
% ********************
% Figures and tables *
% ********************
% Table and array parameters
\setlength\arraycolsep{.5em}
\setlength\tabcolsep{.5em}
\setlength\arrayrulewidth{.5pt}
\setlength\doublerulesep{2.5pt}
\setlength\extrarowheight{\z@}
\renewcommand\arraystretch{1}
\newlength{\abovecaptionskip}
\newlength{\belowcaptionskip}
\setlength{\abovecaptionskip}{13pt}
\setlength{\belowcaptionskip}{2pt}
\long\def\@makecaption#1#2{\vspace{\abovecaptionskip}%
\begingroup
\scriptsize\sffamily
\text{\sfb #1.}\space{#2}\par
\endgroup}
\long\def\@tablecaption#1#2{%
\begingroup
\fontsize{7.5pt}{10.5pt}\sffamily\selectfont
\textbf{#1.}\space{#2\strut\par}
\endgroup\vspace{\belowcaptionskip}}
% Table rules
\def\toprule{\noalign{\ifnum0=`}\fi\hrule \@height 0.5pt \hrule \@height 4pt \@width 0pt \futurelet
\@tempa\@xhline}
\def\midrule{\noalign{\ifnum0=`}\fi \hrule \@height 3pt \@width 0pt \hrule \@height 0.5pt
\hrule \@height 4pt \@width 0pt \futurelet \@tempa\@xhline}
\def\botrule{\noalign{\ifnum0=`}\fi \hrule \@height 3.75pt \@width 0pt \hrule \@height 0.5pt \futurelet
\@tempa\@xhline}
\def\hrulefill{\leavevmode\leaders\hrule height .5pt\hfill\kern\z@}
\def\thefigure{\@arabic\c@figure}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figurename~\thefigure}
\def\figure{\@float{figure}}
\let\endfigure\end@float
\@namedef{figure*}{\@dblfloat{figure}}
\@namedef{endfigure*}{\end@dblfloat}
\def\thetable{\@arabic\c@table}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{Table~\thetable}
\def\table{\let\@makecaption\@tablecaption\let\source\tablesource\@float{table}}
\def\endtable{\end@float}
\@namedef{table*}{\let\@makecaption\@tablecaption\@dblfloat{table}}
\@namedef{endtable*}{\end@dblfloat}
\newif\if@rotate \@rotatefalse
\newif\if@rotatecenter \@rotatecenterfalse
\def\rotatecenter{\global\@rotatecentertrue}
\def\rotateendcenter{\global\@rotatecenterfalse}
\def\rotate{\global\@rotatetrue}
\def\endrotate{\global\@rotatefalse}
\newdimen\rotdimen
\def\rotstart#1{\special{ps: gsave currentpoint currentpoint translate
#1 neg exch neg exch translate}}
\def\rotfinish{\special{ps: currentpoint grestore moveto}}
\def\rotl#1{\rotdimen=\ht#1\advance\rotdimen by \dp#1
\hbox to \rotdimen{\vbox to\wd#1{\vskip \wd#1
\rotstart{270 rotate}\box #1\vss}\hss}\rotfinish}
\def\rotr#1{\rotdimen=\ht #1\advance\rotdimen by \dp#1
\hbox to \rotdimen{\vbox to \wd#1{\vskip \wd#1
\rotstart{90 rotate}\box #1\vss}\hss}\rotfinish}
\newdimen\tempdime
\newbox\temptbox
% From ifmtarg.sty
% Copyright Peter Wilson and Donald Arseneau, 2000
\begingroup
\catcode`\Q=3
\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil}
\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4}
\long\gdef\@ifnotmtarg#1{\@xifmtarg#1QQ\@firstofone\@gobble\@nil}
\endgroup
\def\tablesize{\@setfontsize\tablesize{7.5\p@}{10\p@}}
\newenvironment{processtable}[3]{\setbox\temptbox=\hbox{{\tablesize #2}}%
\tempdime\wd\temptbox\@processtable{#1}{#2}{#3}{\tempdime}}
{\relax}
\newcommand{\@processtable}[4]{%
\if@rotate
\setbox4=\vbox to \hsize{\vss\hbox to \textheight{%
\begin{minipage}{#4}%
\@ifmtarg{#1}{}{\caption{#1}}{\tablesize #2}%
\vskip7\p@\noindent
\parbox{#4}{\fontsize{7}{9}\selectfont #3\par}%
\end{minipage}}\vss}%
\rotr{4}
\else
\hbox to \hsize{\hss\begin{minipage}[t]{#4}%
\vskip2.9pt
\@ifmtarg{#1}{}{\caption{#1}}{\tablesize #2}%
\vskip6\p@\parindent=12pt
\parbox{#4}{\fontsize{7}{9}\selectfont #3\par}%
\end{minipage}\hss}\fi}%
\newcolumntype{P}[1]{>{\raggedright\let\\\@arraycr\hangindent1em}p{#1}}
% ******************************
% List numbering and lettering *
% ******************************
\def\labelenumi{{\rm\arabic{enumi}.}}
\def\theenumi{\arabic{enumi}}
\def\labelenumii{{\rm\alph{enumii}.}}
\def\theenumii{\alph{enumii}}
\def\p@enumii{\theenumi}
\def\labelenumiii{{\rm(\arabic{enumiii})}}
\def\theenumiii{\roman{enumiii}}
\def\p@enumiii{\theenumi(\theenumii)}
\def\labelenumiv{{\rm(\arabic{enumiv})}}
\def\theenumiv{\Alph{enumiv}}
\def\p@enumiv{\p@enumiii\theenumiii}
\def\labelitemi{{\small$\bullet$}}
\def\labelitemii{{\small$\bullet$}}
\def\labelitemiii{{\small$\bullet$}}
\def\labelitemiv{{\small$\bullet$}}
\def\@listI{\leftmargin\leftmargini \topsep\medskipamount}
\let\@listi\@listI
\@listi
\def\@listii{\topsep\z@\leftmargin\leftmarginii}
\def\@listiii{\leftmargin\leftmarginiii \topsep\z@}
\def\@listiv{\leftmargin\leftmarginiv \topsep\z@}
\def\@listv{\leftmargin\leftmarginv \topsep\z@}
\def\@listvi{\leftmargin\leftmarginvi \topsep\z@}
\setlength{\leftmargini}{3mm}
\setlength{\leftmarginii}{\z@}
\setlength{\leftmarginiii}{\z@}
\setlength{\leftmarginiv}{\z@}
% Changes to the list parameters for enumerate
\def\enumargs{%
\partopsep \z@
\itemsep \z@
\parsep \z@
\labelsep 1em
\listparindent \parindent
\itemindent \z@
\topsep 7\p@
}
\def\enumerate{%
\@ifnextchar[{\@numerate}{\@numerate[0]}}
\def\@numerate[#1]{%
\ifnum \@enumdepth >3 \@toodeep\else
\advance\@enumdepth \@ne
\edef\@enumctr{enum\romannumeral\the\@enumdepth}
\list{\csname label\@enumctr\endcsname}{%
\enumargs
\setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@enumdepth\endcsname}
\usecounter{\@enumctr}
\settowidth\labelwidth{#1}
\addtolength{\leftmargin}{\labelwidth}
\addtolength{\leftmargin}{2pt}
\def\makelabel##1{\hss \llap{##1}}}%
\fi
}
\let\endenumerate\endlist
% Changes to the list parameters for itemize
\def\itemargs{%
\partopsep \z@
\itemsep 0\p@
\parsep \z@
\labelsep 1em
\rightmargin \z@
\listparindent \parindent
\itemindent \z@
\topsep7\p@
}
\def\itemize{%
\@ifnextchar[{\@itemize}{\@itemize[$\bullet$]}}
\def\@itemize[#1]{%
\ifnum \@itemdepth >3 \@toodeep\else
\advance\@itemdepth \@ne
\edef\@itemctr{item\romannumeral\the\@itemdepth}
\list{\csname label\@itemctr\endcsname}{%
\itemargs
\setlength{\leftmargin}{\csname leftmargin\romannumeral\the\@itemdepth\endcsname}
\settowidth\labelwidth{#1}
\addtolength{\leftmargin}{\labelwidth}
%\addtolength{\leftmargin}{\labelsep}
\def\makelabel##1{\hss \llap{##1}}}%
\fi
}
\let\enditemize\endlist
\newenvironment{unlist}{%
\begin{list}{}%
{\setlength{\labelwidth}{\z@}%
\setlength{\labelsep}{\z@}%
\setlength{\topsep}{\medskipamount}%
\setlength{\itemsep}{3\p@}%
\setlength{\leftmargin}{2em}%
\setlength{\itemindent}{-2em}}}
{\end{list}}
% ***********************
% Quotes and Quotations *
% ***********************
\def\quotation{\par\begin{list}{}{
\setlength{\topsep}{\medskipamount}
\setlength{\leftmargin}{2em}%
\setlength{\rightmargin}{\z@}%
\setlength\labelwidth{0pt}%
\setlength\labelsep{0pt}%
\listparindent\parindent}%
\item[]}
\def\endquotation{\end{list}}
\let\quote\quotation
\let\endquote\endquotation
\skip\@mpfootins = \skip\footins
\fboxsep=6\p@
\fboxrule=1\p@
% *******************
% Table of contents *
% *******************
\newcommand\@pnumwidth{4em}
\newcommand\@tocrmarg{2.55em plus 1fil}
\newcommand\@dotsep{1000}
\setcounter{tocdepth}{4}
\def\numberline#1{\hbox to \@tempdima{{#1}}}
\def\@authortocline#1#2#3#4#5{%
\vskip 1.5\p@
\ifnum #1>\c@tocdepth \else
{\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
\parindent #2\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima #3\relax
\advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
{\itshape #4}\nobreak
\leaders\hbox{$\m@th
\mkern \@dotsep mu\hbox{.}\mkern \@dotsep
mu$}\hfill
\nobreak
\hb@xt@\@pnumwidth{\hfil}%
\par}%
\fi}
\newcommand*\l@author{\@authortocline{2}{0pt}{30pt}}
\newcommand*\l@section{\@dottedtocline{3}{11pt}{20pt}}
\newcommand*\l@subsection{\@dottedtocline{4}{31pt}{29pt}}
\newcommand*\l@subsubsection[2]{}
% ***********
% Footnotes *
% ***********
\def\footnoterule{\noindent\rule{\columnwidth}{0.5pt}}
\def\@makefnmark{\@textsuperscript{\normalfont\@thefnmark}}%
\newcommand\@makefntext[1]{\noindent{\@makefnmark}\enskip#1}
% ***********
% References *
% ***********
\providecommand{\newblock}{}
\newenvironment{thebibliography}{%
\section{\bibname}%
\begingroup
\small
\begin{list}{}{%
\setlength{\topsep}{\z@}%
\setlength{\labelsep}{\z@}%
\settowidth{\labelwidth}{\z@}%
\setlength{\leftmargin}{4mm}%
\setlength{\itemindent}{-4mm}}\small}
{\end{list}\endgroup}
\RequirePackage{natbib}
% **********
% Appendix *
% **********
\newif\ifappend % Are we in the Appendix?
\def\appendix{\par
\setcounter{section}{0}
\setcounter{subsection}{0}
\appendtrue
}
%Math parameters
\setlength{\jot}{5\p@}
\mathchardef\@m=1500 % adapted value
\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
\sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
% Theorems
\def\th@plain{%
%% \let\thm@indent\noindent % no indent
\thm@headfont{\quad\scshape}% heading font is bold
\thm@notefont{\upshape\mdseries}% same as heading font
\thm@headpunct{.}% no period after heading
\thm@headsep 5\p@ plus\p@ minus\p@\relax
%% \let\thm@swap\@gobble
%% \thm@preskip\topsep
%% \thm@postskip\theorempreskipamount
\itshape % body font
}
\vbadness=9999
\tolerance=9999
\doublehyphendemerits=10000
\doublehyphendemerits 640000 % corresponds to badness 800
\finalhyphendemerits 1000000 % corresponds to badness 1000
\flushbottom
\frenchspacing
\ps@headings
\twocolumn
% Screen PDF compatability
\newcommand{\medline}[1]{%
\unskip\unskip\ignorespaces}
%%%%for smaller size text
\newenvironment{methods}{%
\begingroup
\def\section{%
\@startsection{section}{1}{\z@}
{-24\p@ plus -3\p@}{4\p@}
{\reset@font\raggedright\helveticabold\fontsize{10}{12}\selectfont}}
\def\subsection{%
\@startsection{subsection}{2}{\z@}
{-11\p@ plus -2\p@}{4\p@}
{\reset@font\raggedright\helvetica\fontsize{9}{12}\selectfont}}
\def\subsubsection{%
\@startsection{subsubsection}{3}{\z@}
{-11\p@ plus -1\p@}{0.001em}
{\reset@font\normalfont\mathversion{bold}\normalsize\bfseries}}
\normalsize
\par}
{\par\endgroup\bigskip\@afterheading\@afterindentfalse}
\graphicspath{{g:/artwork/oup/bioinfo/}}
\language=2
\hyphenation{Figure Table Figures Tables}
\newcommand{\href}[2]{#2}
\renewenvironment{proof}[1][\proofname]{\par
\normalfont \topsep6\p@\@plus6\p@\relax
\labelsep 0.5em
\trivlist
\item[\hskip\labelsep\hskip1em\textsc{#1}.]\ignorespaces
}{\endtrivlist\@endpefalse}
%%Different Bonds
\def\sbond{\ensuremath{\raise.25ex\hbox{${-}\!\!\!\!{-}$}}\kern -.9pt}
\def\dbond{\ensuremath{\raise.25ex\hbox{=$\!$=}}}
\def\tbond{\ensuremath{\raise.20ex\hbox{${\equiv}\!\!\!{\equiv}$}}}
% Author queries
%\fboxsep=4\p@
%\fboxrule=0.5\p@
\newcommand{\query}[2][0pt]{}%
% \marginpar{\vspace*{#1}%
% {\parbox{\marginparwidth}{%
% \raggedright\fontsize{6}{8}\selectfont
% #2}}}}
\renewcommand{\dag}{{\mathversion{normal}$^{\dagger}$}}
\endinput
\ No newline at end of file
<?xml version="1.0"?>
<!DOCTYPE ipe SYSTEM "ipe.dtd">
<ipe version="70206" creator="Ipe 7.2.7">
<info created="D:20181019094517" modified="D:20181019094517"/>
<ipestyle name="basic">
<symbol name="arrow/arc(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/farc(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/ptarc(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/fptarc(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="mark/circle(sx)" transformations="translations">
<path fill="sym-stroke">
0.6 0 0 0.6 0 0 e
0.4 0 0 0.4 0 0 e
</path>
</symbol>
<symbol name="mark/disk(sx)" transformations="translations">
<path fill="sym-stroke">
0.6 0 0 0.6 0 0 e
</path>
</symbol>
<symbol name="mark/fdisk(sfx)" transformations="translations">
<group>
<path fill="sym-fill">
0.5 0 0 0.5 0 0 e
</path>
<path fill="sym-stroke" fillrule="eofill">
0.6 0 0 0.6 0 0 e
0.4 0 0 0.4 0 0 e
</path>
</group>
</symbol>
<symbol name="mark/box(sx)" transformations="translations">
<path fill="sym-stroke" fillrule="eofill">
-0.6 -0.6 m
0.6 -0.6 l
0.6 0.6 l
-0.6 0.6 l
h
-0.4 -0.4 m
0.4 -0.4 l
0.4 0.4 l
-0.4 0.4 l
h
</path>
</symbol>
<symbol name="mark/square(sx)" transformations="translations">
<path fill="sym-stroke">
-0.6 -0.6 m
0.6 -0.6 l
0.6 0.6 l
-0.6 0.6 l
h
</path>
</symbol>
<symbol name="mark/fsquare(sfx)" transformations="translations">
<group>
<path fill="sym-fill">
-0.5 -0.5 m
0.5 -0.5 l
0.5 0.5 l
-0.5 0.5 l
h
</path>
<path fill="sym-stroke" fillrule="eofill">
-0.6 -0.6 m
0.6 -0.6 l
0.6 0.6 l
-0.6 0.6 l
h
-0.4 -0.4 m
0.4 -0.4 l
0.4 0.4 l
-0.4 0.4 l
h
</path>
</group>
</symbol>
<symbol name="mark/cross(sx)" transformations="translations">
<group>
<path fill="sym-stroke">
-0.43 -0.57 m
0.57 0.43 l
0.43 0.57 l
-0.57 -0.43 l
h
</path>
<path fill="sym-stroke">
-0.43 0.57 m
0.57 -0.43 l
0.43 -0.57 l
-0.57 0.43 l
h
</path>
</group>
</symbol>
<symbol name="arrow/fnormal(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/pointed(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/fpointed(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/linear(spx)">
<path stroke="sym-stroke" pen="sym-pen">
-1 0.333 m
0 0 l
-1 -0.333 l
</path>
</symbol>
<symbol name="arrow/fdouble(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
-1 0 m
-2 0.333 l
-2 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/double(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
-1 0 m
-2 0.333 l
-2 -0.333 l
h
</path>
</symbol>
<pen name="heavier" value="0.8"/>
<pen name="fat" value="1.2"/>
<pen name="ultrafat" value="2"/>
<symbolsize name="large" value="5"/>
<symbolsize name="small" value="2"/>
<symbolsize name="tiny" value="1.1"/>
<arrowsize name="large" value="10"/>
<arrowsize name="small" value="5"/>
<arrowsize name="tiny" value="3"/>
<color name="red" value="1 0 0"/>
<color name="green" value="0 1 0"/>
<color name="blue" value="0 0 1"/>
<color name="yellow" value="1 1 0"/>
<color name="orange" value="1 0.647 0"/>
<color name="gold" value="1 0.843 0"/>
<color name="purple" value="0.627 0.125 0.941"/>
<color name="gray" value="0.745"/>
<color name="brown" value="0.647 0.165 0.165"/>
<color name="navy" value="0 0 0.502"/>
<color name="pink" value="1 0.753 0.796"/>
<color name="seagreen" value="0.18 0.545 0.341"/>
<color name="turquoise" value="0.251 0.878 0.816"/>
<color name="violet" value="0.933 0.51 0.933"/>
<color name="darkblue" value="0 0 0.545"/>
<color name="darkcyan" value="0 0.545 0.545"/>
<color name="darkgray" value="0.663"/>
<color name="darkgreen" value="0 0.392 0"/>
<color name="darkmagenta" value="0.545 0 0.545"/>
<color name="darkorange" value="1 0.549 0"/>
<color name="darkred" value="0.545 0 0"/>
<color name="lightblue" value="0.678 0.847 0.902"/>
<color name="lightcyan" value="0.878 1 1"/>
<color name="lightgray" value="0.827"/>
<color name="lightgreen" value="0.565 0.933 0.565"/>
<color name="lightyellow" value="1 1 0.878"/>
<dashstyle name="dashed" value="[4] 0"/>
<dashstyle name="dotted" value="[1 3] 0"/>
<dashstyle name="dash dotted" value="[4 2 1 2] 0"/>
<dashstyle name="dash dot dotted" value="[4 2 1 2 1 2] 0"/>
<textsize name="large" value="\large"/>
<textsize name="Large" value="\Large"/>
<textsize name="LARGE" value="\LARGE"/>
<textsize name="huge" value="\huge"/>
<textsize name="Huge" value="\Huge"/>
<textsize name="small" value="\small"/>
<textsize name="footnote" value="\footnotesize"/>
<textsize name="tiny" value="\tiny"/>
<textstyle name="center" begin="\begin{center}" end="\end{center}"/>
<textstyle name="itemize" begin="\begin{itemize}" end="\end{itemize}"/>
<textstyle name="item" begin="\begin{itemize}\item{}" end="\end{itemize}"/>
<gridsize name="4 pts" value="4"/>
<gridsize name="8 pts (~3 mm)" value="8"/>
<gridsize name="16 pts (~6 mm)" value="16"/>
<gridsize name="32 pts (~12 mm)" value="32"/>
<gridsize name="10 pts (~3.5 mm)" value="10"/>
<gridsize name="20 pts (~7 mm)" value="20"/>
<gridsize name="14 pts (~5 mm)" value="14"/>
<gridsize name="28 pts (~10 mm)" value="28"/>
<gridsize name="56 pts (~20 mm)" value="56"/>
<anglesize name="90 deg" value="90"/>
<anglesize name="60 deg" value="60"/>
<anglesize name="45 deg" value="45"/>
<anglesize name="30 deg" value="30"/>
<anglesize name="22.5 deg" value="22.5"/>
<opacity name="10%" value="0.1"/>
<opacity name="30%" value="0.3"/>
<opacity name="50%" value="0.5"/>
<opacity name="75%" value="0.75"/>
<tiling name="falling" angle="-60" step="4" width="1"/>
<tiling name="rising" angle="30" step="4" width="1"/>
</ipestyle>
<page>
<layer name="alpha"/>
<view layers="alpha" active="alpha"/>
<path layer="alpha" stroke="black" pen="ultrafat">
64 784 m
416 784 l
</path>
<use name="mark/disk(sx)" pos="80 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="96 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="112 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="128 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="144 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="160 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="176 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="192 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="208 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="224 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="240 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="256 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="272 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="288 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="304 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="320 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="336 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="352 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="368 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="384 784" size="large" stroke="black"/>
<use name="mark/disk(sx)" pos="400 784" size="large" stroke="black"/>
<path stroke="red">
136 792 m
136 776 l
328 776 l
328 792 l
h
</path>
<path matrix="1 0 0 1 0 -48" stroke="black" pen="ultrafat">
64 784 m
416 784 l
</path>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="80 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="96 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="112 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="128 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="144 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="160 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="176 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="192 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="208 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="224 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="240 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="256 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="272 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="288 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="304 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="320 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="336 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="352 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="368 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="384 784" size="large" stroke="black"/>
<use matrix="1 0 0 1 0 -48" name="mark/disk(sx)" pos="400 784" size="large" stroke="black"/>
<path matrix="1 0 0 1 0 -48" stroke="red">
136 792 m
136 776 l
328 776 l
328 792 l
h
</path>
<text matrix="1 0 0 1 8 -16" transformations="translations" pos="128 816" stroke="red" type="label" width="19.442" height="6.176" depth="4.09" valign="baseline" size="Large">$p_{x,i}$</text>
<text matrix="1 0 0 1 0 -16" transformations="translations" pos="136 832" stroke="black" type="label" width="11.515" height="8.896" depth="0" valign="baseline" size="huge">$u$</text>
<text matrix="1 0 0 1 8 -64" transformations="translations" pos="128 816" stroke="red" type="label" width="19.442" height="6.176" depth="4.09" valign="baseline" size="Large">$p_{x,i}$</text>
<text matrix="1 0 0 1 60 -16" transformations="translations" pos="324 808" stroke="red" type="label" width="35.903" height="6.225" depth="2.16" valign="baseline" size="small">$k_{x,i} = 12$</text>
<text matrix="1 0 0 1 60 -60" transformations="translations" pos="324 808" stroke="red" type="label" width="35.903" height="6.225" depth="2.16" valign="baseline" size="small" style="math">k_{x,i} = 12</text>
<text matrix="1 0 0 1 180 -116" transformations="translations" pos="136 832" stroke="black" type="label" width="11.515" height="8.896" depth="0" valign="baseline" size="huge" style="math">u</text>
<text matrix="1 0 0 1 -20 -132" transformations="translations" pos="136 832" stroke="black" type="label" width="69.552" height="9.962" depth="4.09" valign="baseline" size="Large" style="math">u-k_{x,i}+1</text>
<path stroke="black" fill="white" arrow="normal/normal">
144 712 m
144 732 l
</path>
</page>
</ipe>
<?xml version="1.0"?>
<!DOCTYPE ipe SYSTEM "ipe.dtd">
<ipe version="70206" creator="Ipe 7.2.7">
<info created="D:20181012182334" modified="D:20181012182334"/>
<ipestyle name="basic">
<symbol name="arrow/arc(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/farc(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/ptarc(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/fptarc(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="mark/circle(sx)" transformations="translations">
<path fill="sym-stroke">
0.6 0 0 0.6 0 0 e
0.4 0 0 0.4 0 0 e
</path>
</symbol>
<symbol name="mark/disk(sx)" transformations="translations">
<path fill="sym-stroke">
0.6 0 0 0.6 0 0 e
</path>
</symbol>
<symbol name="mark/fdisk(sfx)" transformations="translations">
<group>
<path fill="sym-fill">
0.5 0 0 0.5 0 0 e
</path>
<path fill="sym-stroke" fillrule="eofill">
0.6 0 0 0.6 0 0 e
0.4 0 0 0.4 0 0 e
</path>
</group>
</symbol>
<symbol name="mark/box(sx)" transformations="translations">
<path fill="sym-stroke" fillrule="eofill">
-0.6 -0.6 m
0.6 -0.6 l
0.6 0.6 l
-0.6 0.6 l
h
-0.4 -0.4 m
0.4 -0.4 l
0.4 0.4 l
-0.4 0.4 l
h
</path>
</symbol>
<symbol name="mark/square(sx)" transformations="translations">
<path fill="sym-stroke">
-0.6 -0.6 m
0.6 -0.6 l
0.6 0.6 l
-0.6 0.6 l
h
</path>
</symbol>
<symbol name="mark/fsquare(sfx)" transformations="translations">
<group>
<path fill="sym-fill">
-0.5 -0.5 m
0.5 -0.5 l
0.5 0.5 l
-0.5 0.5 l
h
</path>
<path fill="sym-stroke" fillrule="eofill">
-0.6 -0.6 m
0.6 -0.6 l
0.6 0.6 l
-0.6 0.6 l
h
-0.4 -0.4 m
0.4 -0.4 l
0.4 0.4 l
-0.4 0.4 l
h
</path>
</group>
</symbol>
<symbol name="mark/cross(sx)" transformations="translations">
<group>
<path fill="sym-stroke">
-0.43 -0.57 m
0.57 0.43 l
0.43 0.57 l
-0.57 -0.43 l
h
</path>
<path fill="sym-stroke">
-0.43 0.57 m
0.57 -0.43 l
0.43 -0.57 l
-0.57 0.43 l
h
</path>
</group>
</symbol>
<symbol name="arrow/fnormal(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/pointed(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/fpointed(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-0.8 0 l
-1 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/linear(spx)">
<path stroke="sym-stroke" pen="sym-pen">
-1 0.333 m
0 0 l
-1 -0.333 l
</path>
</symbol>
<symbol name="arrow/fdouble(spx)">
<path stroke="sym-stroke" fill="white" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
-1 0 m
-2 0.333 l
-2 -0.333 l
h
</path>
</symbol>
<symbol name="arrow/double(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
0 0 m
-1 0.333 l
-1 -0.333 l
h
-1 0 m
-2 0.333 l
-2 -0.333 l
h
</path>
</symbol>
<pen name="heavier" value="0.8"/>
<pen name="fat" value="1.2"/>
<pen name="ultrafat" value="2"/>
<symbolsize name="large" value="5"/>
<symbolsize name="small" value="2"/>
<symbolsize name="tiny" value="1.1"/>
<arrowsize name="large" value="10"/>
<arrowsize name="small" value="5"/>
<arrowsize name="tiny" value="3"/>
<color name="red" value="1 0 0"/>
<color name="green" value="0 1 0"/>
<color name="blue" value="0 0 1"/>
<color name="yellow" value="1 1 0"/>
<color name="orange" value="1 0.647 0"/>
<color name="gold" value="1 0.843 0"/>
<color name="purple" value="0.627 0.125 0.941"/>
<color name="gray" value="0.745"/>
<color name="brown" value="0.647 0.165 0.165"/>
<color name="navy" value="0 0 0.502"/>
<color name="pink" value="1 0.753 0.796"/>
<color name="seagreen" value="0.18 0.545 0.341"/>
<color name="turquoise" value="0.251 0.878 0.816"/>
<color name="violet" value="0.933 0.51 0.933"/>
<color name="darkblue" value="0 0 0.545"/>
<color name="darkcyan" value="0 0.545 0.545"/>
<color name="darkgray" value="0.663"/>
<color name="darkgreen" value="0 0.392 0"/>
<color name="darkmagenta" value="0.545 0 0.545"/>
<color name="darkorange" value="1 0.549 0"/>
<color name="darkred" value="0.545 0 0"/>
<color name="lightblue" value="0.678 0.847 0.902"/>
<color name="lightcyan" value="0.878 1 1"/>
<color name="lightgray" value="0.827"/>
<color name="lightgreen" value="0.565 0.933 0.565"/>
<color name="lightyellow" value="1 1 0.878"/>
<dashstyle name="dashed" value="[4] 0"/>
<dashstyle name="dotted" value="[1 3] 0"/>
<dashstyle name="dash dotted" value="[4 2 1 2] 0"/>
<dashstyle name="dash dot dotted" value="[4 2 1 2 1 2] 0"/>
<textsize name="large" value="\large"/>
<textsize name="Large" value="\Large"/>
<textsize name="LARGE" value="\LARGE"/>
<textsize name="huge" value="\huge"/>
<textsize name="Huge" value="\Huge"/>
<textsize name="small" value="\small"/>
<textsize name="footnote" value="\footnotesize"/>
<textsize name="tiny" value="\tiny"/>
<textstyle name="center" begin="\begin{center}" end="\end{center}"/>
<textstyle name="itemize" begin="\begin{itemize}" end="\end{itemize}"/>
<textstyle name="item" begin="\begin{itemize}\item{}" end="\end{itemize}"/>
<gridsize name="4 pts" value="4"/>
<gridsize name="8 pts (~3 mm)" value="8"/>
<gridsize name="16 pts (~6 mm)" value="16"/>
<gridsize name="32 pts (~12 mm)" value="32"/>
<gridsize name="10 pts (~3.5 mm)" value="10"/>
<gridsize name="20 pts (~7 mm)" value="20"/>
<gridsize name="14 pts (~5 mm)" value="14"/>
<gridsize name="28 pts (~10 mm)" value="28"/>
<gridsize name="56 pts (~20 mm)" value="56"/>
<anglesize name="90 deg" value="90"/>
<anglesize name="60 deg" value="60"/>
<anglesize name="45 deg" value="45"/>
<anglesize name="30 deg" value="30"/>
<anglesize name="22.5 deg" value="22.5"/>
<opacity name="10%" value="0.1"/>
<opacity name="30%" value="0.3"/>
<opacity name="50%" value="0.5"/>
<opacity name="75%" value="0.75"/>
<tiling name="falling" angle="-60" step="4" width="1"/>
<tiling name="rising" angle="30" step="4" width="1"/>
</ipestyle>
<page>
<layer name="alpha"/>
<view layers="alpha" active="alpha"/>
<path layer="alpha" matrix="1 0 0 1 -32 0" stroke="black" pen="ultrafat">
64 704 m
320 704 l
</path>
<path matrix="1 0 0 1 -32 0" stroke="black" pen="ultrafat">
96 704 m
32.249 0 0 -32.249 128 708 160 704 a
</path>
<path matrix="1 0 0 1 -32 0" stroke="black" pen="ultrafat">
208 704 m
25.2982 0 0 -25.2982 232 696 256 704 a
</path>
<path matrix="1 0 0 1 -32 0" stroke="black" pen="ultrafat">
128 704 m
77.746 0 0 -77.746 200 674.667 272 704 a
</path>
<path matrix="1 0 0 1 256 64" stroke="black" pen="ultrafat">
64 704 m
320 704 l
</path>
<path matrix="1 0 0 1 256 64" stroke="black" pen="ultrafat">
208 704 m
25.2982 0 0 -25.2982 232 696 256 704 a
</path>
<path matrix="1 0 0 1 256 64" stroke="black" pen="ultrafat">
128 704 m
77.746 0 0 -77.746 200 674.667 272 704 a
</path>
<path matrix="1 0 0 1 256 -96" stroke="black" pen="ultrafat">
64 704 m
320 704 l
</path>
<path matrix="1 0 0 1 256 -96" stroke="black" pen="ultrafat">
96 704 m
32.249 0 0 -32.249 128 708 160 704 a
</path>
<text matrix="1 0 0 1 0 -16" transformations="translations" pos="64 688" stroke="black" type="label" width="202.242" height="17.213" depth="4.82" valign="baseline" size="Huge">structure $y$ with PK</text>
<path stroke="black" pen="ultrafat" arrow="normal/normal">
256 736 m
304 752 l
</path>
<path stroke="black" pen="ultrafat" arrow="normal/normal">
288 672 m
320 640 l
</path>
<text matrix="1 0 0 1 32 -16" transformations="translations" pos="384 752" stroke="black" type="label" width="60.952" height="16.741" depth="4.02" valign="baseline" size="huge">level $y^1$</text>
<text transformations="translations" pos="416 576" stroke="black" type="label" width="60.952" height="16.741" depth="4.02" valign="baseline" size="huge">level $y^2$</text>
<text transformations="translations" pos="432 672" stroke="black" type="label" width="17.843" height="13.97" depth="1.57" valign="baseline" size="Huge">+</text>
</page>
</ipe>
\documentclass{bioinfo}
\copyrightyear{2015} \pubyear{2015}
\access{Advance Access Publication Date: Day Month Year}
\appnotes{Manuscript Category}
\usepackage[ruled,vlined]{algorithm2e} % For pseudocode
\begin{document}
\firstpage{1}
\subtitle{Subject Section}
\title[long Title]{Biorseo: Benchmarking ways to use RNA modules leads to improved secondary structure prediction with pseudoknots}
\author[Sample \textit{et~al}.]{Louis Becquey\,$^{\text{\sfb 1,}*}$, Eric Angel\,$^{\text{\sfb 1}}$ and Fariza Tahi\,$^{\text{\sfb 1}}$}
\address{$^{\text{\sf 1}}$IBISC, Univ Evry, Universite Paris-Saclay, 91025, Evry, France}
\corresp{$^\ast$To whom correspondence should be addressed.}
\history{Received on XXXXX; revised on XXXXX; accepted on XXXXX}
\editor{Associate Editor: XXXXXXX}
\abstract{\textbf{Motivation:} RNA loops have now been modelled and clustered from solved 3D structures into ordered collections of recurrent non-canonical interactions called "RNA modules", available in databases. This work explores what information from such modules can be used to improve secondary structure prediction.\\
\textbf{Results:} We propose a Pareto-based method for predicting RNA secondary structures by minimizing a bi-objective both energy-based and knowledge-based potential. The tool, called \textsc{Biorseo}, outputs the secondary structures from the Pareto set. We use it to compare several approaches to predict secondary structures using inserted RNA modules information: two different module data sources, Rna3Dmotifs and The RNA 3D Motif Atlas, and different ways to score the module insertions are compared: module size, module complexity, or module probability according to models like JAR3D and BayesPairing. We benchmark them against 344 known secondary structures. Some of the tested methods present a good performance, especially on structures containing pseudoknots. They are compared to state of the art tools for secondary structure prediction.\\
\textbf{Availability:} The software is freely provided for Linux on \href{https://github.com/persalteas/biorseo/}{GitHub (https://github.com/persalteas/biorseo/)}, with the datasets. \\
\textbf{Contact:} \href{louis.becquey@univ-evry.fr}{louis.becquey@univ-evry.fr}\\
\textbf{Supplementary information:} Supplementary data are available at \textit{Bioinformatics}
online.}
\maketitle
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Introduction}
Ribonucleic acid (RNA) is a macromolecule which is often single-stranded. Therefore, the strand has the ability to fold in space in more complex ways than DNA, that we mostly know to form double-stranded stems. A stem is a succession of basepairs called Watson-Crick basepairs, or "canonical", stacked on top of each other. As this can still happen with RNA, we also observe several other ways for a nucleotide to interact with another. For example, \citealp{leontis2001geometric} proposed a classification of 12 non-canonical basepairs. Some of the nucleotides can also interact with the 2'OH of a ribose, or with a phosphate, or even not interact at all and bulge out the RNA structure.
\paragraph{Modelling RNAs as graphs.} ~
For modelling purposes, researchers working on computational problems involving RNA represent them with graphs. A recent article~(\citealp{schlick2018adventures}) details the different graph models of RNAs and their respective advantages.
We are particularly interested in the secondary structure graph of the RNA, i.e. a graph where the nucleotides are nodes, and backbone bonds and canonical basepairs are edges. In this kind of graph, the non-canonical interactions do not appear.
As the problem of predicting the 3D structure of an RNA from sequence has been too computationally expensive for years, and is still difficult, a common first step has been to predict this secondary structure (2D) graph, by computing what regions will form stems and what regions will remain unpaired, forming so-called loops. In many cases, the solution to the 2D folding problem is not unique, and RNAs have the ability to switch between several metastable conformations. Most approaches are based on the computation of the RNA partition function and/or canonical pairing probabilities, i.e. the probability for each nucleotide to form a canonical base-pair with every other nucleotide, or to remain unpaired.
In 1990, McCaskill proposed a dynamic programming scheme to compute this partition function~(\citealp{mccaskill1990equilibrium}). The most used implementations are some lower complexity variants of it such as \texttt{RNAFold} in the ViennaRNA package~(\citealp{lorenz_viennarna_2011}), and \texttt{Fold}~(\citealp{mathews2004using}) in the RNAstructure package. An important limitation of this algorithm was its inability to model complex so-called \textit{pseudoknotted} structures, i.e. structures with basepairs $(i,j)$ and $(k,l)$ when $i<k<j<l$.
Later, some variants taking pseudoknots into account were developped, e.g. in the NUPACK package~(\citealp{dirksAlgorithmComputingNucleic2004}) or \texttt{ProbKnot} from the RNAstructure package~(\citealp{bellaousov2010probknot}).
Once the partition function is computed, several models exist to rebuild one or several best structure(s): We can choose the Minimum Free Energy (MFE) structure, the one that maximizes expected accuracy (MEA), or the centroid of the ensemble. We can also cite Biokop (\citealp{legendre_bi-objective_2018}), a recent tool that uses both MFE and MEA criterions in a biobjective framework, and returns optimal and suboptimal structures (including pseudoknots).
\paragraph{Secondary structure elements}~ RNAs can be seen as an assembly of stems and loops. To move from the planar 2D graph to 3D, one usually predicts the 3D structure of stems and loops separately. Stems are relatively easy to tackle because of the isostericity of the Watson-Crick basepairs, their structure has been widely observed and features low variability. On the other hand, to accurately model loops in 3D, one needs to take the non-canonical interactions into account. In many cases, two loops can even form new canonical basepairs to form \textit{kissing hairpins}, a particular pseudoknot type (called HHH) which is hard to predict because it involves a distant basepair between two unpaired loop regions.
\paragraph{Modelling RNA loops with more detailed graphs.} ~ Several works have gathered 3D crystal structures involving RNA chains, extracted the loops from those RNA chains and annotated the base contacts using MC-Annotate (\citealp{gendron2001quantitative}), FR3D (\citealp{sarver_fr3d:_2008}) or DSSR (\citealp{lu_dssr:_2015}). They model the loops with more detailed graphs describing non-canonical contacts on their edges. The graphs can then be clustered with respect to a similarity or isomorphism measure, and the sequence variations over the nucleotides of the loop can be modeled. Those models are called RNA \textit{modules}, i.e. an ordered collection of non-canonical basepairs or stacking interactions, leading to a conserved 3D shape in different RNA molecules. We can cite the work from (\citealp{djelloul_automated_2008}) with Rna3Dmotif, a pipeline that extracts terminal hairpin loops, internal loops, and multiple loops from structures annotated by FR3D, and can cluster them using a graph similarity metric. Another one is the RNA 3D Motif Atlas~(\citealp{petrov_automated_2013}), which does not support multiple loops, but clusters the loops using all sequence information, nucleotide contacts and shape information, which leads to loop module models with tolerance in sequence and length variations. A more recent one is CaRNAval (\citealp{reinharz2018mining}), an approach that enables to model a wide variety of structural features such as multipairs, multi-stranded loops, and pseudoknots. To be exhaustive, we also can cite RNA Bricks 2 (\citealp{chojnowski2014rna}), which has the particularity to also study contacts with protein chains.%, and RNA Motif Scan (\citealp{zhong_rnamotifscan:_2010}) that can search for certain modules in structures, but does not list modules on the form of a database. ==> Is it really relevant ?
These works provide models combining different types of information about a module: (i) a particular base-pairing pattern of canonical and wobble pairing, which is 2D information (it often is only the canonical base-pairs that enclose a loop); (ii) a particular organisation of non-canonical contacts in space, which is 3D information; (iii) a sequence or consensus sequence that is known to adopt a particular base-pairing organisation, which could be nucleotide probabilities observed in the training dataset of RNA structures, or a more elaborated probabilistic model to predict if a given sequence will fold according to the module.
For example, JAR3D (\citealp{zirbel_identifying_2015}) can score the modules from the RNA 3D Motif Atlas against a query sequence. The recent BayesPairing (\citealp{sarrazin2019automated}), expanding the method proposed by Cruz and Westhof with RMDetect (\citealp{cruz2011sequence}), can be used to do the same on modules from any database by building Bayesian networks from any graph of ordered non-canonical interactions.
\paragraph{Our "backwards" approach} ~ From RNA modules, it is easy to imagine fragment assembly methods which would reconstitute 3D structures from the 2D loops. But this is not our scope here, instead we want to see if that information could be used to predict the position of loops in sequences, in other words, if this knowledge could help predicting the secondary structure graph. Here we finally ignore the 3D information the modules bring. We do not use the 3D data to help sampling conformations, but we use it to score conformations.
A first attempt to tackle such task, called RNA-MoIP~(\citealp{reinharz_towards_2012}), improves an input secondary structure often given by a simple tool like RNAsubopt~(\citealp{lorenz_viennarna_2011}) to insert modules from Rna3Dmotif into it. The authors have shown that RNA-MoIP produces 2D structures with non-canonical base-pairs included, which are better inputs to give to MC-Sym~(\citealp{parisien2008mc}), resulting in better prediction of 3D structures. Unfortunately, we were not able to reproduce the published results about 2D structure accuracy, probably because the authors used a much older version of RNAsubopt than us. Our own tests over 344 structures with RNAsubopt v2.4.10 + RNA-MoIP showed a slightly inferior performance compared to RNAsubopt alone, as shown in Figure~1\vphantom{\ref{fig:comparison}}. It seems that RNA-MoIP damages the structures predicted by RNAsubopt most of the time, leading to a slightly weaker performance.
\begin{figure}[!tpb]
\centerline{\includegraphics[width=\linewidth]{fig/Figure_1.jpg}}
\caption{Best Mattews Correlation Coefficient (see equation \ref{eq:MCC}) between the true structure and the structures predicted by RNAsubopt (blue) and RNA-MoIP (yellow) for 344 RNAs of length 10 to 100 from RNA-Strand~(\citealp{andronescu2008rna}). Selection details are provided in section \ref{sec:data}. RNAs are sorted by RNAsubopt performance.}\label{fig:comparison}
\end{figure}
One hypothesis about RNA-MoIP's lack of performance is that it cannot distinguish important base-pairs from less important ones, and might break some of the ones stabilizing a whole stem while inserting a module, resulting in less probable structures as output.
To test this hypothesis, we design a method which builds a 2D structure by simultaneously placing base-pairs and modules in a single step, taking into account two objectives: the expected accuracy of the structure in the equilibrium ensemble fold, and a custom function that reflects the number and quality of inserted modules (several models are studied). This method leads to our new tool Biorseo (Bi-Objective RNA Structure Efficient Optimizer). Our approach avoids using a weighted linear combination of the objectives as done in RNA-MoIP (which can miss interesting solutions so-called \textit{non-supported} solutions). In this paper, we use a bi-objective Pareto-based approach, i.e. we identify all the non-dominated structures (the structures for which no other structure scores better on the two objectives).
In the next section, this article presents the module models sources, insertion models and objective functions, and the procedure to compare them. Then we present a benchmark of all those variants against reference tools in Section \ref{sec:results}, using a reference dataset (verified structures from the RNA-Strand database). Three well-known reference RNAs are predicted and used to discuss the differences between the methods: \textit{E. coli}'s Gln tRNA, the Guanine riboswitch, and the human telomerase's pseudoknot. Finally, we recommend two prediction methods, and conclude.
\begin{figure*}[t]
\includegraphics[width=\textwidth]{fig/graph_abstract.jpg}
\caption{The information flow in our benchmark method. The inputs are the RNA sequence, and module models from a database. First, we compute the pairing probabilities based on~(\citealp{dirksAlgorithmComputingNucleic2004}) and the probable insertion sites using 3 different methods listed in section \ref{sec:models}. Then, we can define two objectives and linear constraints to compute the Pareto set of secondary structures for that sequence, by solving a bi-objective integer linear program (ILP).}
\label{fig:pipeline}
\end{figure*}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{methods}
\section{Methods}\label{sec:methods}
We compared two databases of modules: (1) Modules extracted from solved 3D RNA structures, in the DESC file format of Rna3dDmotif~(\citealp{djelloul_automated_2008}). We used the data-set provided by RNA-MoIP ~(\citealp{djelloul_automated_2008,reinharz_towards_2012}). (2) Modules from the RNA 3D Motif Atlas v3.2, as provided on the BGSU website ~(\href{http://rna.bgsu.edu/rna3dhub/motifs/}{http://rna.bgsu.edu/rna3dhub/motifs/}), see~(\citealp{petrov_automated_2013}) for more information.
Our main procedure is the following:
\begin{itemize}
\item \textbf{Pattern-matching step:} Find all possible occurrences of known RNA modules in the query sequence, by finding subsequences of the query that score well with the probabilistic models of the modules (several models are compared).
\item \textbf{Constraints definition step:} Define constraints on the secondary structure imposed by modules if they would be included (in this case, some of the canonical base-pairs are forbidden).
\item \textbf{Optimization step:} Find a secondary structure that satisfies as much as possible both the expected accuracy of the structure and a criterion taking into account module inclusions, by solving a bi-objective integer linear programming problem, using the previous constraints defined in the previous step.
\end{itemize}
The linear integer programming framework used to define the constraints and solve the resulting optimization problem is similar to previous works like IPknot, Biokop or RNA-MoIP~(\citealp{sato_ipknot:_2011,legendre_bi-objective_2018,reinharz_towards_2012}), but involves new constraints detailed in supplementary material.
Figure \ref{fig:pipeline} summarizes the procedure on a graphical pipeline.
\subsection{Pattern matching step}\label{sec:models}
Several methods have been proposed to tackle the issue of finding if a sequence (or a part of it) is likely to fold following a given module. This section presents the ones we benchmarked.
\paragraph{Direct pattern matching} ~ The simplest approach when no statistical model is available is to use a regular expression and direct pattern matching against the input sequence. This is the approach used by RNA-MoIP. We used it with the Rna3Dmotif data as presented in RNA-MoIP's article ~(\citealp{reinharz_towards_2012}), dealing with special cases in the same way (very short components, wildcards).
\paragraph{The SCFG/MRF method, JAR3D} ~ For each motif group in each release of the RNA 3D Motif Atlas, the BGSU RNA research group proposed to construct a probabilistic model for sequence variability, based on a hybrid Stochastic Context-Free Grammar/Markov Random Field (SCFG/MRF) method. Their implementation, a software called JAR3D ~(\citealp{zirbel_identifying_2015}), takes user-provided loop sub-sequences in input and outputs a score for every motif of the Atlas on every provided loop. This method has the advantage to allow variations in sequence length compared to the module model. Unfortunately, it can only be used for hairpin and internal loops. Another major drawback is that it requires the computation of the pairing probabilities to first locate \textit{where} the most probable loops are, to give them as input to JAR3D. We therefore use RNAsubopt first to get the positions of the probable loops. JAR3D has been developed for modules from the RNA 3D Motif Atlas and can only be tested with them.
\paragraph{Sequence probability distribution and Bayesian Networks} ~ When we have data for several instances of a module, we can estimate a probabilistic distribution of the nucleotides over the module nodes. A first intuitive approach is to use the base frequencies. But as paired nucleotides are not independent at all, it is more rigorous to model those dependencies. An approach proposed in ~(\citealp{cruz2011sequence}) is to transform the module's graph into a Bayesian network, which models the dependencies between nucleotide probabilities at every node of the graph. The original article proposed four hand-made Bayesian networks for only four well-known RNA modules, but a recent tool called BayesPairing ~(\citealp{sarrazin2019automated}) automates the process for every module. A large number of sequences are sampled using the Bayesian network, and they are pattern-matched against the query to find occurrences. An additional step compares the free energy of the structure with and without the constraint of each matched module, and selects only the candidate sites that do not deteriorate too much the energy. This last step is embarrassing for us, first because it requires two computations of the partition function, and then because we would try to insert modules that were pre-selected to be appropriate. Therefore we chose to ignore this last step and let our optimizer select the pertinent modules in the candidates. BayesPairing can be used for both data sources.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Constraints definition step and integer programming model} \label{sec:ip}
The full list of variables we used to model the problem in an integer linear program and the linear formulation of each constraint are detailed in supplementary material. Here we propose different objective functions to maximize, whose performances are compared in section \ref{sec:results}.
\paragraph{Notations} ~ We call a \textit{component} a piece of strand which forms an unpaired portion of a module. Components of a module are linked together by canonical base-pairs at their extremities to form a loop. Let $x$ be a module which could be inserted at some defined position in the sequence. Let $\|x\|$ bet the number of components of this module, and $k_{x,i}$ the nucleotide count of the $i$th component of $x$. When a scoring model is used (JAR3D or BayesPairing), we denote $p(x)$ the score value of $x$ inserted at the defined position. Let $p_{uv}$ be the probability for nucleotides $u$ and $v$ (with $v>u+3$) to form a canonical base-pair. We use NUPACK's dynamic programming scheme~(\citealp{dirksAlgorithmComputingNucleic2004}), which supports pseudoknots, to compute such probabilities. We denote $y^u_v$ the binary decision variable indicating that these nucleotides do form a canonical base pair, and $C^x_1$ the decision binary variable indicating whether the module $x$ will be inserted or not. The resolution of the linear program outputs solutions by fixing definitive values for the different $y^u_v$ and $C^x_1$.
\paragraph{Objective functions} ~ The more modules that are included, the more information about set and unset base-pairs, and the more information we have about the tertiary folds of these loops in space. So maximizing the number of modules could be a valid criteria. But, a disadvantage of such a criteria is that it penalizes multiple loops - sometimes referred as $k$-way junctions - with large $k$, because the insertion of a multiple loop forbids at the same time the insertion of several internal loops or bulges ($2$-way junctions) in place. RNA-MoIP uses the sum of the squared nucleotide count over the components to try to encourage large modules~(\citealp{reinharz_towards_2012}). This is our first benchmarked criteria $f_{1A}$, see equation \ref{eq:A}. Conversely, we could also try to maximize the number of components $\|x\|$ in the module. Then, we can suppose that secondary structure contacts are local (forget about kissing hairpins here), and want to avoid very-long-range base-pairs. This is equivalent to say that we want the minimal loop size (conversely to RNA-MoIP). Therefore, we can penalize a module insertion by the logarithm of the number of nucleotides involved in the looped zone (sum of the $k_{x,i}$) to avoid very long unpaired zones. We introduce such a penalty in criteria $f_{1B}$.\\ We also define two more criteria, $f_{1C}$ which use only the score returned by JAR3D or BayesPairing, and $f_{1D}$ which includes all the presented terms.\\
Let $X$ be the set of all our decision variables, then the different objective functions to maximize are:
\begin{equation} f_{1A}(X) = \sum_{x} \sum_{i=1}^{\|x\|} k_{x,i}^2 \times C^x_1\label{eq:A}\end{equation}
\begin{equation}f_{1B}(X) = \sum_{x} \left[ \frac{\|x\|}{\log_2(\sum_{i=1}^{\|x\|}k_{x,i})} \times C^x_1 \right] \label{eq:B}\end{equation}
\begin{equation} f_{1C}(X) = \sum_{x} p(x) \times C^x_1 \label{eq:C}\end{equation}
\begin{equation}f_{1D}(X) = \sum_{x} \left[ \frac{\|x\|}{\log_2(\sum_{i=1}^{\|x\|}k_{x,i})} \times p(x) \times C^x_1 \right]\label{eq:D}\end{equation}
Regarding the second objective, aimed at maximizing the expected accuracy of the structures, we use $f_2(X) = \sum y^u_v \times p_{uv} \times I[p_{uv}>\theta]$. As first proposed by~(\citealp{sato_ipknot:_2011}), $f_2$ uses a parameter $\theta$ to ignore very unlikely base-pairs. This prevents the explosion of the number of variables and allows a fast resolution of the IP problem.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Optimization step}
We use a simple dichotomic search algorithm (presented in Figure \ref{fig:findP}) to find the Pareto set of the bi-objective problem. On the first pass of the dichotomy, it solves iteratively a mono-objective problem with a constraint on the second objective, requiring it to be in an interval $[\lambda_{min}, \lambda_{max}]$. For example, if we decide to maximize objective 1, every-time a new non-dominated solution is found, $\lambda_{min}$ is set just above the new solution's objective 2 value, to search another one with a worse objective 1 value but a higher objective 2 value than previously found solutions. The second pass of the dichotomy searches below newly found solutions. In fact, it is required to search for superposed solutions to Pareto optimal ones. This is important when the criteria used to rank inserted modules is not able to separate them very well; many solutions therefore get the same $f_1$ score.
The algorithm is implemented in C++ using the CPLEX solver concert technology~(\citealp{cplex}), resulting in the Biorseo tool, which is available online for Linux platforms.
\begin{figure}[!tbp]
\begin{algorithm}[H]
F:= $\emptyset$\;
\tcp{find the extrema of the Pareto front:}
L1:= maximize($f_1$, $-\infty$, $+\infty$, F)\;
L2:= maximize($f_2$, $-\infty$, $+\infty$, F)\;
\tcp{Add L1 to the results:}
R:= $\{$L1$\}$\;
\tcp{search on top of L1:}
search\_between($f_2(\text{L1}) + \epsilon$, $f_2(\text{L2})$)\;
\tcp{search if solutions superposed to L1 exist:}
search\_between($-\infty$, $f_2(\text{L1})$)\;
\Return{R}\;
\caption{FindParetoSet()}
\end{algorithm}
\begin{algorithm}[H]
$s$:= maximize($f_1$, $\lambda_{min}$, $\lambda_{max}$, F)\;
\If{$s \neq \emptyset$}{
F:= F $\cup \{s\}$\;
\If{$\nexists x \in \mathrm{R}$ such as $x>s$}{
\tcp{solution is undominated, add it to R}
R:= R $\cup \{s\}$\;
\While{$\exists x \in \mathrm{R}$ such as $s>x$}{
\tcp{remove dominated solutions}
R:= R$\setminus \{x\}$\;
}
\tcp{search on top of $s$}
search\_between($f_2(s) + \epsilon$, $\lambda_{max}$)\;
\If{$\lambda_{max} - \lambda_{min} > \epsilon$}{
\tcp{search if another solution superposed to $s$ exists}
search\_between($\lambda_{min}$, $f_2(s)$)\;
}
}
}
\caption{search\_between($\lambda_{min}$, $\lambda_{max}$)}
\end{algorithm}
\caption{The dichotomic search algorithm to find the Pareto set. F is the ensemble of already-found structures which grows over time, and that we forbid the solver to find again. R is the set of Pareto-optimal solutions. L1 and L2 are the best solutions to the mono-objective problems regarding $f1$ and $f2$. $\mathbf{maximize}$($f$, $\lambda_{min}$, $\lambda_{max}$, F) is a procedure that minimizes the function $f$ (mono-objective IP problem) under the constraint that the other one has to be in interval $[\lambda_{min}$, $\lambda_{max}]$, and with the solutions in F forbidden. The inequality sign $a>b$ between two solutions denotes that solution $a$ dominates solution $b$.}\label{fig:findP}
\end{figure}
\end{methods}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Results}\label{sec:results}
\begin{figure*}[!tbp]
\includegraphics[width=\textwidth]{fig/Benchmark.jpg}
\caption{Boxplots of the best MCC over the proposed solutions for each of the RNAs, for all method variants. Line (A) shows the methods that cannot find pseudoknots: RNAsubopt, RNA-MoIP, and the 14 variants of Biorseo's bi-objective methods with a constraint that explicitly forbids pseudoknots. Line (B) shows methods which allow their prediction: Biokop, and the 14 variants without the no-pseudoknot constraint. The left block gathers methods which use module data from Rna3Dmotifs (\citealp{djelloul_automated_2008}). The right one gathers those which use modules from the RNA 3D Motif Atlas (\citealp{petrov_automated_2013}). Boxplots surrounded by a dotted red frame use direct pattern matching to detect insertion sites, but do not score the sites. Those surrounded by a continuous blue frame score the sites with JAR3D (\citealp{zirbel_identifying_2015}) to score modules on loop sequences found by RNAsubopt. The remaining surrounded by a dashed green frame use the BayesPairing score~(\citealp{sarrazin2019automated}).}
\label{fig:upgrades}
\end{figure*}
All the methods introduced return an ensemble of possible secondary structures for a given input sequence. We compare them in a benchmark over short RNA structures and a few well-known application cases.
\subsection{Benchmark protocol} \label{sec:bench}
We repeated the benchmark twice: first, by forbidding explicitly the formation of pseudoknots with additional constraints (for fair comparison with RNA-MoIP). Then, a second one without such limitation, to reach maximum performance.
\paragraph{Materials}
The tool has been conceived to be used by a regular scientist on a desktop computer. All computations were run on a workstation with AMD Ryzen 2700X (16 threads @4.3GHz) CPU, 16 GB of RAM. A prediction typically takes a few seconds, sometimes minutes. The time required grows with both the nucleotide count and the number of loops. The objective functions $f_{1A}$ and $f_{1B}$ were sometimes not discriminative enough and equally ranked a large number of module propositions, leading to combinatorial issues. For that reason, we arbitrarily stopped the jobs exceeding 500 structures in the Pareto set, because they would require over 2 hours of computation time to complete.
\paragraph{Data sources} \label{sec:data}
A set of RNA secondary structures was extracted from the RNA-Strand database ~(\citealp{andronescu2008rna}). We selected the RNAs for which experimental proof of the structure exists, with size varying between 10 and 100 nucleotides. Sequences containing consensus letters, for example R for a purine (A or G), or modified nucleotides (P, T, I in our case) were discarded. %In addition, we add a collection of 264 pseudoknotted RNAs taken from the Pseudobase database~(\citealp{van2000pseudobase}), covering all pseudoknot families, of length between 10 and 100 nucleotides.
The final dataset contains 334 secondary structures of various RNA families, 74 of them containing pseudoknots. Due to the combinatorial issues described above, only 291 (resp. 294) of them have been predicted by all the proposed methods (the missing ones often being a combination of direct pattern-matching or JAR3D with $f_{1A}$ or $f_{1B}$) when forbidding (resp. allowing) pseudoknots. We will use these set of results for comparison.
In addition to the large benchmark, we have a deeper look at very-well known structures to check if relevant combinations of models are still able to predict them correctly.
We used a Gln tRNA from E. coli (RNA-Strand code PDB\_00376), a Guanine riboswitch (RNA-Strand code PDB\_01023), and the pseudoknot of the human telomerase (PDB\_00857). The tRNA contains a tiny, improbable pseudoknot. The G riboswitch is unpseudoknotted, and the telomerase pseudoknot is a simple H type pseudoknot.
\paragraph{Reference comparison methods}
To study the usefulness of the data sources, objective functions, and module placement methods, we added state-of-the art tools to the comparison. The same RNA sequences were submitted to RNA-MoIP for direct performance comparison. We used RNAsubopt as a reference method without pseudoknot support, because it is fast, widely used, easy to understand and returns several solutions. We used Biokop, the bi-objective integer programming framework, as a reference method for prediction of secondary structures with pseudoknots. Both tools over-perform other state-of-the-art tools in their respective categories, see the appropriate papers (\citealp{lorenz2011viennarna, legendre_bi-objective_2018}) for more benchmarks against other tools.
\paragraph{Metrics} ~ We compute the Matthews correlation coefficient (MCC) between the real secondary structure and every proposition. The coefficient is defined as
\begin{equation}
MCC = \frac{TP. TN - FP. FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}}. \label{eq:MCC}
\end{equation}
Then, we keep the best MCC value found as a metric of the method's performance. This reflects if the true structure is included or not in the Pareto set. Averaging over the structures would be a nonsense, because some RNAs may exist in several meta-stable states which are very different in their list of base-pairs. Here, we measure if one of the states, which is reported in RNA-Strand as "true" structure, has been found. The choice of MCC over accuracy or F1 score is justified by the very large difference between the size of the classes: there exist much more negative base-pairs (pairs of nucleotides that do not interact) than positive ones in any secondary structure.
\begin{table*}[!t]
\processtable{MCC results for study cases. Pseudoknots are allowed. \label{Tab:01}} {
\begin{tabular}{@{}rlllllll@{}}\toprule & RNAsubopt & RNA-MoIP & BiokoP & Rna3Dmotifs & Rna3Dmotifs & RNA 3D Motif Atlas & RNA 3D Motif Atlas\\
& & & & + Direct P.M. & + BayesPairing & + JAR3D & + BayesPairing \\\midrule
PDB\_00376 & 0.68 & 0.68 & 0.67 & 0.72 (A,B) & 0.74 (B,C,D), 0.71 (A) & 0.74 (A,C,D), 0.72 (B) & 0.76 (\textit{all})\\
PDB\_01023 & 0.86 & 0.86 & 0.59 & 0.79 (A,B) & 0.29 (\textit{all}) & 0.82 (\textit{all}) & 0.82 (\textit{all})\\
PDB\_00857 & 0.77 & 0.77 & 1.0 & 0.97 (B), 0.77 (A) & 0.97 (\textit{all}) & 0.97 (\textit{all}), & 0.97 (\textit{all})\\\botrule
\end{tabular}}{The first line gives the results for E.\textit{coli} tRNA Gln (PDB\_00376), the second line for the glycine riboswitch (PDB\_01023), and the third for the human telomerase's pseudoknot (PDB\_00857). We observe that the best structure is often the same when we use the different objective functions $f_{1A}, f_{1B}, f_{1C}, f_{1D}$, but the rest of the set can be different.}
\end{table*}
\subsection{Benchmark results}
Performance results under the form of best MCC are summarized in Figure \ref{fig:upgrades}.
Majority of the RNAs were predicted with similar performance among the methods, including methods that do not use module information.
No data source, nor objective function taken alone performs significantly better than the other ones. No one distinguishes itself alone to improve the performance.
\paragraph{Methods without pseudoknots, comparison to RNAsubopt} ~ No method reaches RNAsubopt's scores. The most performing model is the use of The RNA 3D Motif Atlas modules, placed with JAR3D, and scored only with the JAR3D score ($f_{1C}$). We also notice that the 4 models (including this one) which use JAR3D return very small sets of results, most of them being one optimal solution, while RNAsubopt returns from one to ten solutions (with our dataset and default settings).
\paragraph{With pseudoknots, comparison to Biokop} ~ The number of solutions returned doubles for every method compared to its no-pseudoknot version. Most of the RNAs are predicted with small knots when the method allows it. As the bottom line of Figure \ref{fig:upgrades} shows, the methods which use BayesPairing do not find as many right structures than Biokop, which performs better even without module information. On the other hand, the methods which use direct pattern-matching (like RNA-MoIP did) and the four ones which use RNAsubopt+JAR3D reach higher performance. The largest improvements concern Biorseo + Rna3Dmotifs + $f_{1B}$ and Biorseo + The RNA 3D Motif Atlas + JAR3D + $f_{1B}$. We apply Wilcoxon signed rank tests (non-parametric test for paired samples) to assert these methods distributions of results differ from Biokop (null hypothesis: "The position parameter of the distribution of the differences between the two paired samples is null"): p-values are $1.5\times 10^{-2}$ for the first method using Rna3Dmotifs, and $2.5\times 10^{-3}$ for the second with JAR3D. Other methods have more statistically significant differences with BiokoP, but smaller improvements in average, so we do not provide all the less interesting statistical tests results.
\subsection{Results of the study cases}
The results about very well described structures (Table~\ref{Tab:01}) are consistent with the general benchmark. Biorseo used with Rna3Dmotifs and direct pattern matching predicts 2D structures as well as RNAsubopt. So does it when used with the RNA 3D Motif Atlas and JAR3D.
BayesPairing has a low performance when used with Rna3Dmotifs and a surprising good performance with the Motif Atlas, which cannot be generalized given the larger benchmark data.
The tRNA is an example of structure which is approximately correctly predicted by Biorseo, as well as other tools.
The G riboswitch allows to show that Biorseo is less likely to insert false positive pseudo-knots than Biokop (which inserted one, resulting in a low score, structures not shown).
The telomerase pseudoknot is correctly predicted by all methods that support pseudoknots, including Biorseo.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Discussion}
\paragraph{Without pseudoknots, comparison to RNA-MoIP} ~ An interesting point is the improvement between RNA-MoIP and the bi-objective method which uses direct-pattern matching to spot insertion sites and $f_{1A}$ to score the insertions. This method only differs from RNA-MoIP because it is bi-objective. The improvement is small, but statistically significant with a Wilcoxon's signed rank test p-value of 0.024. Then, we can conclude that the Pareto approach really improves the structure prediction by itself. This result supports our hypothesis about RNA-MoIP breaking important basepairs. Unfortunately, this improvement in average is counterbalanced by an increase in variance.
\paragraph{Regarding pseudoknots} ~ The support of pseudoknots allows a small increase in performance, because we return more solutions, some with pseudoknots, and some without. As we are looking at the maximum MCC here, the appropriate solution has been selected for each RNA.
Biorseo's reduced number of false positive pseudoknots compared to Biokop can be explained directly by the insertion of modules in loops: as we forbid explicitly any base-pair on nucleotides inside an inserted module's component, we prevent known loops to form pseudoknots. The drawback of this selectivity is the low ability to predict kissing hairpins (HHH type pseudoknots), precisely because they require loops to interact.
However, pseudoknot prediction quality is difficult to assess with a metric like MCC, because a pseudoknot could be involved in only two or three base-pairs. Finding them or not does not alter much the MCC even if the structure is much more right or wrong from a biological point of view. Unfortunately, no automated assertion method exist yet. A more accurate description of pseudoknot prediction performance would have required manual validation of every occurrence in every structure, which is too much work to achieve on such large datasets.
\paragraph{On the objective functions} ~
Regarding objective functions to include modules, the different criteria proposed seem to give comparable results at first sight regarding the average performance and the dispersion. However, an important difference between $f_{1A}$, $f_{1B}$ on one side, and $f_{1C}$, $f_{1D}$ on the other side, is about the computation time. As $f_{1A}$, $f_{1B}$ do not use a score to rank potential module insertion sites, every modules of the same size can be equally inserted. When the RNA presents several loops, the combinatorial possibilities grow fast with the number of modules in the dataset. Therefore, the number of undominated solutions can reach several hundreds or thousands even for short sequences. As explained in section \ref{sec:bench}, some of the computations never ended because of combinatorial issues with those objectives. Such large Pareto sets are not informative for our application, because they consist in very redundant secondary structures with different module references, which are counted only for one secondary structure solution at the end. On the other hand, $f_{1C}$ and $f_{1D}$ require the run of an additional tool (JAR3D or BayesPairing) to score the insertion sites. Given an RNA length, a compromise must be found .
\paragraph{The bias with JAR3D} ~ One should keep in mind that JAR3D takes as input the sequences of RNA loops to score modules against them. We detected the loops in the RNA sequence with RNAsubopt. This use of JAR3D is biased, because we score modules on sequence portions that we already know unlikely to form stems and likely to form loops. Therefore, the information brought by the insertion of a module is low.
Then, the enthusiasm about the bi-objective method with JAR3D and $f_{1C}$ (without pseudoknots) has to be moderate. It actually outputs almost the same secondary structures than RNAsubopt, discarding certain ones sometimes. As that method was the only interesting result without pseudoknots, we can argue that including known modules is not a general way to improve secondary structure prediction without pseudoknots. For every method, the average best MCC is below RNAsubopt, and the performance gain obtained on some structures is counterbalanced by the loss on approximately the same number of RNAs or more.
We also observe that using The RNA 3D Motif Atlas with JAR3D has a significantly different behavior than the other methods: first, it returns a very small number of solutions (1 or 2 most of the time). Then, the best structure is almost every-time the one that has the higher number of modules, while it is not the case for the other methods. This is a good point for method JAR3D-$f_{1C}$ which performs almost as well as RNAsubopt by returning only one or two structures. An explanation is that JAR3D is selective of a few module insertion sites, sites that were first perfectly predicted to be loops by RNAsubopt (as discussed earlier). This confirms the use of module information is not always relevant and that the energy criteria brings almost all the information. The modules only sometimes allow to reduce the number of solutions.
\paragraph{About BayesPairing} ~ We want to warn the reader about BayesPairing's low performance here in this benchmark. One should keep in mind that we skipped its last step which checks if the insertion of a module would deteriorate too much the energy. We did so because our bi-objective framework was supposed to be able to do it itself. The low performance of BayesPairing here is not an argument against the tool when used in its intended purpose.
\paragraph{Final choice on which method to use}\label{sec:recommend} ~
The results show that objective functions which use a score on the module insertion site (produced by BayesPairing or JAR3D) require much less computational resources to achieve the computation, as they avoid combinatorial explosion of the number of possible insertions of equally ranked modules onto the different loop sites of the RNA.
On the other hand, they require time to score the modules against the insertion sites.
For that reason, we recommend three models : if the user does not expect pseudoknots, using RNAsubopt is recommended. If the sequence may contain some, we recommend the simplest best-performing model : direct pattern matching and function $f_{1B}$. If the computation is too long because of combinatorial issues, one may use JAR3D to further rank the insertion sites (particularly relevant in longer RNA sequences). We then recommend the use of the RNA 3D Motif Atlas, JAR3D, and function $f_{1B}$. The user also should expect much less solutions when using JAR3D.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Conclusion}
We developed a general bi-objective method to benchmark different sources of RNA module models (the RNA 3D Motif Atlas and Rna3Dmotifs), different methods to place them in sequences (direct pattern matching, BayesPairing, and JAR3D), and different scoring functions. The bi-objective method uses the expected accuracy of the structure, and the previous scoring functions to select relevant secondary structures.
The results show that no data source prevails. They also show that the use of module information is irrelevant to predict structures without pseudoknots.
The real interest would be when looking for potential pseudoknots, where several of our methods can improve the prediction performance (and computation times) compared to state-of-the-art tools.
Some of our models over-perform RNA-MoIP, a previous attempt to predict better secondary structures using module information from Rna3Dmotifs and a linear combination of two objectives into a scoring function. Our simplest best-performing new method could be interpreted as an upgraded RNA-MoIP with updated data (there is a 10-fold increase in the number of solved RNA crystal structures between 2008 and 2018) and a real bi-objective framework, which predicts the base pairs and the module insertions in a row, preventing the insertion to break important base-pairs.
Improvement perspectives now rely on the hope than newer databases like CaRNAval~(\citealp{reinharz2018mining}), containing more recent and more diverse module information, to really bring more information to assist the energy criteria.\\
\bibliographystyle{natbib}
%\bibliographystyle{achemnat}
%\bibliographystyle{plainnat}
%\bibliographystyle{abbrv}
%\bibliographystyle{bioinformatics}
%\bibliographystyle{plain}
\bibliography{references}
\end{document}
No preview for this file type
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx} % images PNG
\usepackage{geometry} % margins
\usepackage{url} % links
\usepackage{charter} % betterfont
\usepackage{stmaryrd} % math symbols ?
\usepackage{eso-pic}
\usepackage{siunitx} % SI units
\usepackage{amsmath} % advanced math symbols
\usepackage{rotating}
\usepackage{multirow}
\usepackage{color, colortbl} % color fonts and table backgrounds
\usepackage{titlesec}
\usepackage{enumitem}
\usepackage{notoccite}
\usepackage{fancyhdr} % page headers/footers
\newcommand\BackgroundPic{\put(0,0){\parbox[b][\paperheight]{\paperwidth}{
\vfill
\centering
\includegraphics[width=\paperwidth,height=\paperheight,keepaspectratio]{background.png}
\vfill
}}}
\geometry{top=1.5cm,bottom=1.5cm, left=2cm, right=2cm}
\titlespacing*{\paragraph}{0pt}{0pt plus 0pt minus 0pt}{0pt plus 0pt minus 0pt}
\titlespacing*{\subsection}{0pt}{0pt plus 0pt minus 0pt}{0pt plus 0pt minus 0pt}
\titlespacing*{\itemize}{0pt}{0pt plus 0pt minus 0pt}{0pt plus 0pt minus 0pt}
\title{Intermediate Work Report:}
\author{Louis Becquey}
\date{\today}
\setlength\parskip{\baselineskip}
\pagestyle{fancy}
\setlength{\headheight}{14.7pt}
\fancyhead[L]{\textsc{IP framework inserting RNA motives}}
% \fancyhead[L]{\leftmark}
\fancyhead[R]{Louis Becquey}
\fancyfoot[L]{}
\fancyfoot[C]{}
\fancyfoot[R]{\thepage}
\begin{document}
\begin{titlepage}
\AddToShipoutPicture*{\BackgroundPic}
\begin{center}
\vspace{3cm}
\LARGE
\textsc{Intermediate Work Report:}\\
{\Large Louis Becquey, \today}\\
\vspace{2cm}
\textit{A biobjective IP framework that uses detected possible RNA modules\\ to predict RNA secondary structures}\\
\end{center}
\normalsize
\vspace{5cm}
\hrulefill
\flushright{
\textbf{under the supervision of:\\}
Fariza Tahi, HDR \\
Eric Angel, HDR \\
\textit{AROBAS, IBISC, Paris-Saclay University}\\
~ \\
\includegraphics[height=1cm]{logoIBISC.png} ~ ~
\includegraphics[height=1cm]{minisaclay.png}
}
\flushleft
\hrulefill
\end{titlepage}
\section*{Graphical Abstract}
\begin{figure}[h]
\hspace{-1.8cm}
\includegraphics[width=1.2\linewidth]{graph_abstract.png}
\end{figure}
\tableofcontents
\newpage
\section{Motivation}
We now have quite consistent RNA module databases (RNA3Dmodule \cite{djelloul_automated_2008}, the RNA Motif Atlas \cite{petrov_automated_2013}, or CaRNAval \cite{reinharz2018mining}).
We call a RNA module the combined description of these points:
\begin{itemize}
\item A particular base-pairing pattern of canonical \& wobble pairing (bi-dimensional information),
\item A particular organisation of non-canonical contacts in space (tri-dimensional information).
\item A sequence or consensus sequence that we know to adopt that particular base-pairing organisation (sequence information), or at least a probabilistic model to predict if a given sequence will fold according to the module.
\end{itemize}
Then, a RNA module is direct data about how a sequence can fold in space. Here, we are interested in using them to predict the bi or tri dimensional structure of an RNA sequence from scratch.
Then, the algorithm we plan to use is the following:
\begin{itemize}
\item Find all possible occurences of known RNA modules in the query sequence by using the sequence probabilistic models of the modules against the query bases,
\item Define constraints on the secondary structure imposed by motives if they would be included
\item Find a secondary structure that satisfies as much as possible both the expected accuracy of the structure and a criterion of module inclusion, by solving a bi-objective IP problem, using the previous constraints.
\end{itemize}
\section{Computation of basepair probabilities}
To compute the probability of a structure to exist in the equilibrium thermodynamical ensemble, we need to estimate the basepair probabilities.
This is usually done by a dynamic programming algorithm using an energy parameter model for base stackings in stems and energies of loops.
As we are supposed to allow the existence of pseudoknots, we chose the Dirks \& Pierce algorithm \cite{dirksAlgorithmComputingNucleic2004} and its C++ implementation called Nupack.
\paragraph{Discussion of that choice} ~ \\
The Dirks and Pierce algorithm has a complexity of \(O(N^5)\) instead of the usual \(O(N^3)\) algorithm, and its implementation in libNupack is even not parallel.
We may want to use a faster one (like ViennaRNA's one), even if it does not officialy supports pseudoknots.
Actually, to form a simple class of pseudoknots, an RNA needs to have a high likelihood to form each of the two independant loops in a non-pseudoknotted form.
Then, using a probability matrix computed with an algorithm that does not model pseudoknot may result in similar structures.
Our biobjective program would etablish the pseudoknot after all as forming more stems stabilizes the structure and as we do not forbid the pseudoknot.
\section{Detection of potential modules in the sequence input}
\paragraph{\textbf{Choice of a module model, choice of a sequence probabilistic model}} ~ \\
Depending on the authors and databases, different approaches have been published.
A very complete model has been developped by the BGSU team \cite{zirbel_identifying_2015} : For each recurrent module of their "3D Motif Atlas", they build a probabilistic model for sequence variability based on a hybrid Stochastic Context-Free Grammar/Markov Random Field (SCFG/MRF) method.
Concerning the other databases, a probabilistic model using a bayesian Network can be designed for an RNA module \cite{cruz2011sequence} to estimate the probability that the sequence would fold into the module.
As BGSU's model is already implemented in a software called JAR3D that perfectly suits our need, we decided to use BGSU's model of modules and their database.
JAR3D finds, given the sequence of an RNA loop with no additional information, the likelihood that it folds in every known 3D module of the RNA Motif Atlas \cite{petrov_automated_2013}.
For each module group of the database, JAR3D estimates the probability that a sequence folds into the 3D pattern, given instances of the module in real RNA 3D structures.
The instances might differ in sequence, length of bulged insertions, and other details, but share a common graph of 3D non-canonical interactions.
It takes into account crossed contacts, base-ribose and base-phosphate interactions, and triple base-pairs.
This is the most complete approach to use to my knowledge.
\paragraph{\textbf{Detection of the loops in an RNA sequence}} ~ \\
As JAR3D scores the sequence of RNA loops, we first need to predict the 2D loops positions in the RNA sequence.
For now, we have been using RNAsubopt from the ViennaRNA package \cite{lorenz_viennarna_2011} to compute the 10 most probable 2D structures of the RNA and extract the loops that occur in those structures.
This computation should be avoided in the future : It requires the computation of the RNA's partition function and basepair probabilities again, which is something we already computed with Nupack.
Unfortunately, to avoid computing it twice, we should reimplement ourselves the algorithms instead of using the actual implementations. We have programs that output the basepair matrix but no structures, and programs that output structures but not the basepair matrix, and we don't have a program that can do both.
\section{Formulation of the IP problem}
This formulation is an improved merge between the IPknot \cite{sato_ipknot:_2011} formulation to fold RNAs with pseudoknots (but without "levels") and RNAMoIP's one \cite{reinharz_towards_2012} to include modules.
The bi-objective algorithm is inspired from BiokoP \cite{legendre_bi-objective_2018} and detailed later in section \ref{methods}.
% This problem has been inspired by IPknot's model \cite{sato_ipknot:_2011}, but without the use of what they call \textit{levels}, which are pseudoknot-free
% structures that should be superposed to give the true pseudoknotted secondary structure graph.\\
% Levels are mutually exclusive (a base cannot be paired in two different levels). The more levels you use, the more decision variables you have,
% but the more complex pseudoknots you are able to predict. IPknot and BiokoP use 2 levels, to predict simple knots.\\
% \begin{figure}[h]\centering \includegraphics[height=5cm]{levels.png}\end{figure}
\subsection{Variables}
% Let $m$ be the number of levels that our program uses.\\
Let $n$ be the number of nucleotides in the query RNA sequence $s$.\\
Let $M$ be the set of modules that could be inserted in $s$ (a loop from $s$ has a good JAR3D score against one of the modules).\\
Let $x$ be a module of $M$, $\|x\|$ be the number of distinct components of $x$, and $p(x)$ the associated score of insertion given by JAR3D for that motif inserted at a particular position.\\
Let $P_{x,i}$ be the position in $s$ where we can insert the $i$th component of module $x$.\\
As the same module model can be inserted several times in $s$, several different $x$ modules in $M$ may refer to the same theoretical module, but inserted at different positions.\\
Let $k_{x,i}$ be the size in nucleotides of that $i$th component of $x$.\\
Let $y^u_v$ be the \textbf{decision boolean variable} indicating that $s[u]$ and $s[v]$ form a canonical base pairing. According to the standard loop model, we always have $v > u + 3$.\\
Let $C^x_i$ be the \textbf{decision boolean variable} indicating that we do insert the $i$th component of module $x$ at position $P_{x,i}$.
Note that a base pair $y^u_v$ is possible if and only if $v>u+3$, and that we do not need to use two variables $y^u_v$ and $y_{vu}$ for the same pair.
Then, we have $\sum_{i=4}^n (n-i)$ decision variables ($\approx \frac{1}{2}n^2$ decision variables) of the form $y^u_v$.
Regarding the $C^x_i$, if we have an average insertion of $\nu$ motives by RNA sequence, the motives having in average $\mu$ components, components that can be inserted in average at $\pi$ different positions in $s$,
then we need to add, in average, $\nu \times \mu \times \pi$ decision variables $C^x_i$.
Then, we expect having around $\frac{1}{2}n^2+\nu \mu \pi$ decision variables.
\newpage
\subsection{Objectives \label{objectives}}
We have two objectives : Find a structure with correct expected accuracy, and find a structure which includes (large) known modules.
Let $X$ be the vector of all our decision variables, we define the following objective functions to maximize:
\[ f_{1A}(X) = \sum_{x \in M} (\|x\|)^2 \times C^x_1 \]
\[ f_{1B}(X) = \sum_{x \in M} p(x) \times C^x_1 \]
\[ f_{1C}(X) = \sum_{x \in M} \left[ \frac{\|x\|}{\log_2(\sum_{i=1}^{\|x\|}k_{x,i})} \times p(x) \times C^x_1 \right]\]
$$ f_2(X) = \sum_{u<v} p_{uv}\times y^u_v \times I[p_{uv}>\theta], \qquad \qquad
p_{uv} = \sum_{\sigma \in S(s)} y^u_v.p(\sigma | s)$$
The different $f_1$ objectives are supposed to maximize the number of inserted motives in $s$,
weighted by their number of components (squared for 1A), or the JAR3D score (B and C).
In $1C$, a penalty is added on the number of nucleotides involved in the looped zone (sum of $k_{x,i}$) to avoid long unpaired zones.
We don't know yet which one will give the better results.
$f_2$ is supposed to maximise the expected accuracy of the secondary structure.
$p_{uv}$ are the base pairing probabilities.
Note that \(f_{1A}\) is taken from RNA MoIP \cite{reinharz_towards_2012}, to compare performance.
\subsection{9 Constraints to bind them all}
\paragraph{Constraint to ensure there only is 0 or 1 canonical pairing by nucleotide} ~
\begin{equation} \label{constraint:1}
\sum_{v<u} y^v_u + \sum_{v>u} y^u_v \leq 1 \qquad\qquad \forall u \in \llbracket 1,n \rrbracket
\end{equation}
\paragraph{Constraints to forbid lonely base pairs} ~
% \begin{equation} \label{constraint:2}
% \sum_{v=u}^n y^{u-1}_v - \sum_{v=u+1}^n y^u_v + \sum_{v=u+2}^n y^{u+1}_v \geq 0 \qquad \qquad \forall u \in \llbracket 1,n\rrbracket
% \end{equation}
% \begin{equation} \label{constraint:3}
% \sum_{u=1}^{v-2} y^u_{v-1} - \sum_{u=1}^{v-1} y^u_v + \sum_{u=1}^{v} y^u_{v+1} \geq 0 \qquad \qquad \forall v \in \llbracket 1,n\rrbracket
% \end{equation}
% These conditions ensure that if a base pair exists with $s[i]$,
% one of the adjacent bases is paired too.
% Equation \ref{constraint:2} is useful if $s[u]$ is paired with $s[v>u]$ (a nucleotide later in the sequence),
% and equation \ref{constraint:3} if $s[v]$ is paired with $s[u<v]$ (a nucleotide earlier in the sequence).
\begin{equation} \label{constraint:2}
y^{u-1}_{v+1} - y^u_v + y^{u+1}_{v-1} \geq 0 \qquad \qquad \forall (u,v) \in \{ (u,v) \in \llbracket 1,n\rrbracket^2 \; | \; u + 3 <v \}
\end{equation}
A basepair should be accompanied by one of its neighbours, forming a stable structure stabilized by stacking energies. In theory, this might add up to \( \frac{1}{2}n^2\) constraints, but in practice, this number is very reasonable as
the only decision variables kept are those with probability above a $\theta$ threshold.
Then, this condition sets to zero "lonely decision variables" who have no neighbour basepair variable allowed.
\paragraph{Constraint to forbid pairings inside a module component} ~
\begin{equation} \label{constraint:4}
(k_{x,i}-2) \; C^x_i + \sum_{u=P_{x,i}+1}^{P_{x,i}+k_{x,i}-2}\left[ \sum_{v>u} y^u_v + \sum_{v<u} y^v_u \right] \leq (k_{x,i} - 2)
\qquad \qquad \forall x \in M, i \in \llbracket 1,\|x\| \rrbracket
\end{equation}
\paragraph{Constraint to forbid component to overlap} ~
\begin{equation} \label{constraint:5}
\sum_{x \in M} \sum_{i=1}^{\|x\|} C^x_i \times I( u \in [ P_{x,i} ; P_{x,i}+k_{x,i}-1]) \leq 1 \qquad \qquad \forall u \in \llbracket 1,n \rrbracket
\end{equation}
$I( u \in [ P_{x,i} ; P_{x,i}+k_{x,i}-1])$ is a booleean value depending on the condition's truth. Then, whatever the nucleotide $u$, it can be part of a module component only once.
% \begin{center}\includegraphics[height=3cm]{component.png}\end{center}
\paragraph{Constraints to respect the structure of large motives ($\{ x\in M \; | \; \|x\| \geq 2\}$)} ~
This constraint ensures that none or all the components of a motif are inserted.
\begin{equation}\label{constraint:6}
\sum_{i=2}^{\|x\|} C^x_i = (\|x\| - 1) \times C^{x}_{1} \qquad \qquad \forall x \in \{ x\in M \; | \; \|x\| \geq 2\}
\end{equation}
And then, we force base pairs between the end of a component and the beginning of the next one:
\begin{equation}\label{constraint:7}
C^x_1 \leq y^{P_{x,1}}_{P_{x,\|x\|}+k_{x,\|x\|}-1} \qquad \qquad \forall x \in \{ x\in M \; | \; \|x\| \geq 2\}
\end{equation}
\begin{equation}\label{constraint:8}
C^x_j \leq y^{P_{x,j}+k_{x,j}-1}_{P_{x,j+1}} \qquad \qquad \forall x \in \{ x\in M \; | \; \|x\| \geq 2\}, \forall j \in \llbracket 1,\|x\| \llbracket
\end{equation}
Constraint \ref{constraint:7} binds the first nucleotide of first component to the last one of the last component.
Constraint \ref{constraint:8} binds the last nucleotide of component $j$ to the first of component $j+1$.
\paragraph{Constraint to forbid a previously found solution} ~
As several solutions may result in the same values of the two objectives, we can't forbid the algorithm to search twice the same region of the objective landscape.
We have to explicitly forbid to find again every found solution.\\
We do it by adding iteratively, for every structure $s^*$ found, the following condition :
\begin{equation}\label{constraint:9}
\sum_{y^u_v \in \{ y^u_v | y^u_v = 1 \text{ in } s^* \}} (1 - y^u_v) + \sum_{y^u_v \in \{ y^u_v | y^u_v = 0 \text{ in } s^* \}} y^u_v +
\sum_{C^x_i \in \{ C^x_i | C^x_i = 1 \text{ in } s^* \}} (1 - C^x_i) + \sum_{C^x_i \in \{ C^x_i |C^x_i = 0 \text{ in } s^* \}} C^x_i \geq 1
\end{equation}
It ensures that at least one of the decision variables differs from $s^*$.
\section{Methods \label{methods}}
\subsection{Bi-objective algorithm}
This is an adaptation of BiokoP's algorithm \cite{legendre_bi-objective_2018} to gather all the points of the pareto set, removing the $k$-pareto set part.
We start by solving each objective independantly to have a lower and higher bound on each objective.
The two solutions found are considered optimal (higher bound) on one objective, and the worse point of the Pareto set concerning the other objective.
Then, we will iteratively solve the mono-objective problem, but adding as a constraint that the second one has to be included between the bounds.
Suppose we decide to iteratively solve objective 1.
The found solutions are getting worse and worse concerning objective 1, but better and better concerning objective 2.
Every time a solution is found with a better objective 2 value, we update our lower bound to search for solutions with objective 2 above this new value.
Note that we use weak inequality constraints, as several solutions may have the same values concerning the two objectives and that we want to include them in the Pareto set.
When no more solutions are discovered, the Pareto has been entirely found.
\subsection{Solving the IP problem}
We use ILOG CPLEX's \cite{cplex} concert technology to solve the integer linear programming problem. All our decision variables are booleans, and all our constraints are linear.
\subsection{Benchmarking of the module inclusion objective functions}
To assess the performance of the objective functions proposed in section \ref{objectives}, we need to chose some performance metrics.
We will focus on:
\begin{itemize}
\item wether the native secondary structure of the proposed RNA sequence exists in the returned solutions (the pareto set),
\item the number of solutions returned (size of the Pareto set).
\end{itemize}
The performance is assessed on the structures taken from the RNA STRAND database \cite{andronescu2008rna}, after a simple preprocessing to remove pseudobases.
\section{Results \label{results}}
\subsection{Comparison of the 3 objective functions for motif insertion}
It appears that function $f_{1A}$ introduced in section \ref{objectives} is not usable in practice.
Actually, on a short RNA sequence (67 nucleotides) but with 4 loop sites that may fold into $~30$ different known loops,
we obtain a combinatorial superposition of near $30^4 = 810 000$ structures which have the same $f_{1A}$ and $f_2$ objectives values, and
all belong to the Pareto front. This results is not desired, as the size of the Pareto set is wanted to be small, and as the program fills the machine's memory very quick in practice.
\section{Discussion \label{discussion}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \newpage
\bibliographystyle{unsrt}
\bibliography{RNA}
\end{document}
\ No newline at end of file
%%
%% This is file `natbib.bst', generated
%% on <1994/9/16> with the docstrip utility (2.2h).
%%
%% The original source files were:
%%
%% genbst.mbs (with options: `ay,nat,seq-lab,nm-rev,dt-beg,yr-par,vol-bf,
%% volp-com,etal-it')
%% ----------------------------------------
%% *** Personal bib style, PWD ***
%%
%% (Here are the specifications of the source file)
%% \ProvidesFile{genbst.mbs}[1994/09/16 1.5 (PWD)]
%% For use with BibTeX version 0.99a or later
%% and with LaTeX 2.09 or 2e
%%-------------------------------------------------------------------
%% NOTICE:
%% This file may be used for non-profit purposes.
%% It may not be distributed in exchange for money,
%% other than distribution costs.
%%
%% The author provides it `as is' and does not guarantee it in any way.
%%
%% Copyright (C) 1994 Patrick W. Daly
%% Max-Planck-Institut f\"ur Aeronomie
%% Postfach 20
%% D-37189 Katlenburg-Lindau
%% Germany
%%
%% E-mail:
%% SPAN-- nsp::linmpi::daly (note nsp also known as ecd1)
%% Internet-- daly@linmpi.dnet.gwdg.de
%%-----------------------------------------------------------
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%---------------------------------------------------------------------
% This is an author-year citation style bibliography. As such, it is
% non-standard LaTeX, and requires a special package file to function properly.
% Such a package is natbib.sty by Patrick W. Daly
% The form of the \bibitem entries is
% \bibitem[Jones et al.(1990)]{key}...
% \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...
% The essential feature is that the label (the part in brackets) consists
% of the author names, as they should appear in the citation, with the year
% in parentheses following. There must be no space before the opening
% parenthesis!
% With natbib v5.3, a full list of authors may also follow the year.
% In natbib.sty, it is possible to define the type of enclosures that is
% really wanted (brackets or parentheses), but in either case, there must
% be parentheses in the label.
% The \cite command functions as follows:
% \cite{key} ==>> Jones et al. (1990)
% \cite[]{key} ==>> (Jones et al., 1990)
% \cite[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2)
% \cite[e.g.][]{key} ==>> (e.g. Jones et al., 1990)
% \cite[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32)
% \citeauthor{key} Jones et al.
% \citefullauthor{key} Jones, Baker, and Smith
% \citeyear{key} 1990
%%---------------------------------------------------------------------
ENTRY
{ address
author
booktitle
chapter
edition
editor
howpublished
institution
journal
key
month
note
number
organization
pages
publisher
school
series
title
type
volume
year
}
{}
{ label extra.label sort.label }
INTEGERS { output.state before.all mid.sentence after.sentence after.block }
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'mid.sentence :=
#2 'after.sentence :=
#3 'after.block :=
}
STRINGS { s t }
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state after.block =
{ add.period$ write$
newline$
"\newblock " write$
}
{ output.state before.all =
'write$
{ add.period$ " " * write$ }
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
FUNCTION {output}
{ duplicate$ empty$
'pop$
'output.nonnull
if$
}
FUNCTION {output.check}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
FUNCTION {fin.entry}
{ add.period$
write$
newline$
}
FUNCTION {new.block}
{ output.state before.all =
'skip$
{ after.block 'output.state := }
if$
}
FUNCTION {new.sentence}
{ output.state after.block =
'skip$
{ output.state before.all =
'skip$
{ after.sentence 'output.state := }
if$
}
if$
}
FUNCTION {not}
{ { #0 }
{ #1 }
if$
}
FUNCTION {and}
{ 'skip$
{ pop$ #0 }
if$
}
FUNCTION {or}
{ { pop$ #1 }
'skip$
if$
}
FUNCTION {non.stop}
{ duplicate$
"}" * add.period$
#-1 #1 substring$ "." =
}
FUNCTION {new.block.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.block
if$
}
FUNCTION {field.or.null}
{ duplicate$ empty$
{ pop$ "" }
'skip$
if$
}
FUNCTION {emphasize}
{ duplicate$ empty$
{ pop$ "" }
{ "{\em " swap$ * non.stop
{ "\/}" * }
{ "}" * }
if$
}
if$
}
FUNCTION {bolden}
{ duplicate$ empty$
{ pop$ "" }
{ "{\bf " swap$ * "}" * }
if$
}
INTEGERS { nameptr namesleft numnames }
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}{, jj}{, f.}" format.name$ 't :=
nameptr #1 >
{
namesleft #1 >
{ ", " * t * }
{
numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " " * "et~al." emphasize * }
{ " and " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {format.names.ed}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{f.~}{vv~}{ll}{, jj}"
format.name$ 't :=
nameptr #1 >
{
namesleft #1 >
{ ", " * t * }
{
numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " " * "et~al." emphasize * }
{ " and " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {format.key}
{ empty$
{ key field.or.null }
{ "" }
if$
}
FUNCTION {format.authors}
{ author empty$
{ "" }
{ author format.names }
if$
}
FUNCTION {format.editors}
{ editor empty$
{ "" }
{ editor format.names
editor num.names$ #1 >
{ ", editors" * }
{ ", editor" * }
if$
}
if$
}
FUNCTION {format.in.editors}
{ editor empty$
{ "" }
{ editor format.names.ed
editor num.names$ #1 >
{ ", editors" * }
{ ", editor" * }
if$
}
if$
}
FUNCTION {format.title}
{ title empty$
{ "" }
{ title "t" change.case$
}
if$
}
FUNCTION {format.full.names}
{'s :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}" format.name$ 't :=
nameptr #1 >
{
namesleft #1 >
{ ", " * t * }
{
numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " " * "et~al." emphasize * }
{ " and " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {author.editor.key.full}
{ author empty$
{ editor empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key
if$
}
{ editor format.full.names }
if$
}
{ author format.full.names }
if$
}
FUNCTION {author.key.full}
{ author empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key
if$
}
{ author format.full.names }
if$
}
FUNCTION {editor.key.full}
{ editor empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key
if$
}
{ editor format.full.names }
if$
}
FUNCTION {make.full.names}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.full
{ type$ "proceedings" =
'editor.key.full
'author.key.full
if$
}
if$
}
FUNCTION {output.bibitem}
{ newline$
"\bibitem[" write$
label write$
")" make.full.names * "]{" * write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
FUNCTION {n.dashify}
{ 't :=
""
{ t empty$ not }
{ t #1 #1 substring$ "-" =
{ t #1 #2 substring$ "--" = not
{ "--" *
t #2 global.max$ substring$ 't :=
}
{ { t #1 #1 substring$ "-" = }
{ "-" *
t #2 global.max$ substring$ 't :=
}
while$
}
if$
}
{ t #1 #1 substring$ *
t #2 global.max$ substring$ 't :=
}
if$
}
while$
}
FUNCTION {word.in}
{ "In " }
FUNCTION {format.date}
{ year duplicate$ empty$
{ "empty year in " cite$ * "; set to ????" * warning$
pop$ "????" }
'skip$
if$
before.all 'output.state :=
" (" swap$ * extra.label * ")" *
}
FUNCTION {format.btitle}
{ title emphasize
}
FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #3 <
{ "~" }
{ " " }
if$
swap$ * *
}
FUNCTION {either.or.check}
{ empty$
'pop$
{ "can't use both " swap$ * " fields in " * cite$ * warning$ }
if$
}
FUNCTION {format.bvolume}
{ volume empty$
{ "" }
{ "volume" volume tie.or.space.connect
series empty$
'skip$
{ " of " * series emphasize * }
if$
"volume and number" number either.or.check
}
if$
}
FUNCTION {format.number.series}
{ volume empty$
{ number empty$
{ series field.or.null }
{ output.state mid.sentence =
{ "number" }
{ "Number" }
if$
number tie.or.space.connect
series empty$
{ "there's a number but no series in " cite$ * warning$ }
{ " in " * series * }
if$
}
if$
}
{ "" }
if$
}
FUNCTION {format.edition}
{ edition empty$
{ "" }
{ output.state mid.sentence =
{ edition "l" change.case$ " edition" * }
{ edition "t" change.case$ " edition" * }
if$
}
if$
}
INTEGERS { multiresult }
FUNCTION {multi.page.check}
{ 't :=
#0 'multiresult :=
{ multiresult not
t empty$ not
and
}
{ t #1 #1 substring$
duplicate$ "-" =
swap$ duplicate$ "," =
swap$ "+" =
or or
{ #1 'multiresult := }
{ t #2 global.max$ substring$ 't := }
if$
}
while$
multiresult
}
FUNCTION {format.pages}
{ pages empty$
{ "" }
{ pages multi.page.check
{ "pages" pages n.dashify tie.or.space.connect }
{ "page" pages tie.or.space.connect }
if$
}
if$
}
FUNCTION {format.vol.num.pages}
{ volume field.or.null
bolden
number empty$
'skip$
{ "(" number * ")" * *
volume empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
}
if$
pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ ", " * pages n.dashify * }
if$
}
if$
}
FUNCTION {format.chapter.pages}
{ chapter empty$
'format.pages
{ type empty$
{ "chapter" }
{ type "l" change.case$ }
if$
chapter tie.or.space.connect
pages empty$
'skip$
{ ", " * format.pages * }
if$
}
if$
}
FUNCTION {format.in.ed.booktitle}
{ booktitle empty$
{ "" }
{ editor empty$
{ word.in booktitle emphasize * }
{ word.in format.in.editors * ", " * booktitle emphasize * }
if$
}
if$
}
FUNCTION {format.thesis.type}
{ type empty$
'skip$
{ pop$
type "t" change.case$
}
if$
}
FUNCTION {format.tr.number}
{ type empty$
{ "Technical Report" }
'type
if$
number empty$
{ "t" change.case$ }
{ number tie.or.space.connect }
if$
}
FUNCTION {format.article.crossref}
{
word.in
"\cite{" * crossref * "}" *
}
FUNCTION {format.book.crossref}
{ volume empty$
{ "empty volume in " cite$ * "'s crossref of " * crossref * warning$
word.in
}
{ "Volume" volume tie.or.space.connect
" of " *
}
if$
"\cite{" * crossref * "}" *
}
FUNCTION {format.incoll.inproc.crossref}
{
word.in
"\cite{" * crossref * "}" *
}
FUNCTION {article}
{ output.bibitem
format.authors "author" output.check
author format.key output
format.date "year" output.check
new.block
format.title "title" output.check
new.block
crossref missing$
{ journal emphasize "journal" output.check
format.vol.num.pages output
}
{ format.article.crossref output.nonnull
format.pages output
}
if$
new.block
note output
fin.entry
}
FUNCTION {book}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
editor format.key output
}
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
format.date "year" output.check
new.block
format.btitle "title" output.check
crossref missing$
{ format.bvolume output
new.block
format.number.series output
new.sentence
publisher "publisher" output.check
address output
}
{
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
new.block
note output
fin.entry
}
FUNCTION {booklet}
{ output.bibitem
format.authors output
author format.key output
format.date "year" output.check
new.block
format.title "title" output.check
new.block
howpublished output
address output
new.block
note output
fin.entry
}
FUNCTION {inbook}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
editor format.key output
}
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
format.date "year" output.check
new.block
format.btitle "title" output.check
crossref missing$
{ format.bvolume output
format.chapter.pages "chapter and pages" output.check
new.block
format.number.series output
new.sentence
publisher "publisher" output.check
address output
}
{ format.chapter.pages "chapter and pages" output.check
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
new.block
note output
fin.entry
}
FUNCTION {incollection}
{ output.bibitem
format.authors "author" output.check
author format.key output
format.date "year" output.check
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
format.bvolume output
format.number.series output
format.chapter.pages output
new.sentence
publisher "publisher" output.check
address output
format.edition output
}
{ format.incoll.inproc.crossref output.nonnull
format.chapter.pages output
}
if$
new.block
note output
fin.entry
}
FUNCTION {inproceedings}
{ output.bibitem
format.authors "author" output.check
author format.key output
format.date "year" output.check
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
format.bvolume output
format.number.series output
format.pages output
address output
new.sentence
organization output
publisher output
}
{ format.incoll.inproc.crossref output.nonnull
format.pages output
}
if$
new.block
note output
fin.entry
}
FUNCTION {conference} { inproceedings }
FUNCTION {manual}
{ output.bibitem
format.authors output
author format.key output
format.date "year" output.check
new.block
format.btitle "title" output.check
organization address new.block.checkb
organization output
address output
format.edition output
new.block
note output
fin.entry
}
FUNCTION {mastersthesis}
{ output.bibitem
format.authors "author" output.check
author format.key output
format.date "year" output.check
new.block
format.btitle "title" output.check
new.block
"Master's thesis" format.thesis.type output.nonnull
school "school" output.check
address output
new.block
note output
fin.entry
}
FUNCTION {misc}
{ output.bibitem
format.authors output
author format.key output
format.date "year" output.check
new.block
format.title output
new.block
howpublished output
new.block
note output
fin.entry
}
FUNCTION {phdthesis}
{ output.bibitem
format.authors "author" output.check
author format.key output
format.date "year" output.check
new.block
format.btitle "title" output.check
new.block
"Ph.D. thesis" format.thesis.type output.nonnull
school "school" output.check
address output
new.block
note output
fin.entry
}
FUNCTION {proceedings}
{ output.bibitem
format.editors output
editor format.key output
format.date "year" output.check
new.block
format.btitle "title" output.check
format.bvolume output
format.number.series output
address output
new.sentence
organization output
publisher output
new.block
note output
fin.entry
}
FUNCTION {techreport}
{ output.bibitem
format.authors "author" output.check
author format.key output
format.date "year" output.check
new.block
format.title "title" output.check
new.block
format.tr.number output.nonnull
institution "institution" output.check
address output
new.block
note output
fin.entry
}
FUNCTION {unpublished}
{ output.bibitem
format.authors "author" output.check
author format.key output
format.date "year" output.check
new.block
format.title "title" output.check
new.block
note "note" output.check
fin.entry
}
FUNCTION {default.type} { misc }
MACRO {jan} {"January"}
MACRO {feb} {"February"}
MACRO {mar} {"March"}
MACRO {apr} {"April"}
MACRO {may} {"May"}
MACRO {jun} {"June"}
MACRO {jul} {"July"}
MACRO {aug} {"August"}
MACRO {sep} {"September"}
MACRO {oct} {"October"}
MACRO {nov} {"November"}
MACRO {dec} {"December"}
MACRO {acmcs} {"ACM Computing Surveys"}
MACRO {acta} {"Acta Informatica"}
MACRO {cacm} {"Communications of the ACM"}
MACRO {ibmjrd} {"IBM Journal of Research and Development"}
MACRO {ibmsj} {"IBM Systems Journal"}
MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
MACRO {ieeetc} {"IEEE Transactions on Computers"}
MACRO {ieeetcad}
{"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
MACRO {ipl} {"Information Processing Letters"}
MACRO {jacm} {"Journal of the ACM"}
MACRO {jcss} {"Journal of Computer and System Sciences"}
MACRO {scp} {"Science of Computer Programming"}
MACRO {sicomp} {"SIAM Journal on Computing"}
MACRO {tocs} {"ACM Transactions on Computer Systems"}
MACRO {tods} {"ACM Transactions on Database Systems"}
MACRO {tog} {"ACM Transactions on Graphics"}
MACRO {toms} {"ACM Transactions on Mathematical Software"}
MACRO {toois} {"ACM Transactions on Office Information Systems"}
MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
MACRO {tcs} {"Theoretical Computer Science"}
READ
FUNCTION {sortify}
{ purify$
"l" change.case$
}
INTEGERS { len }
FUNCTION {chop.word}
{ 's :=
'len :=
s #1 len substring$ =
{ s len #1 + global.max$ substring$ }
's
if$
}
FUNCTION {format.lab.names}
{ 's :=
s #1 "{vv~}{ll}" format.name$
s num.names$ duplicate$
#2 >
{ pop$ " " * "et~al." emphasize * }
{ #2 <
'skip$
{ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
{ " " * "et~al." emphasize * }
{ " and " * s #2 "{vv~}{ll}" format.name$ * }
if$
}
if$
}
if$
}
FUNCTION {author.key.label}
{ author empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key
if$
}
{ author format.lab.names }
if$
}
FUNCTION {author.editor.key.label}
{ author empty$
{ editor empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key
if$
}
{ editor format.lab.names }
if$
}
{ author format.lab.names }
if$
}
FUNCTION {editor.key.label}
{ editor empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key
if$
}
{ editor format.lab.names }
if$
}
FUNCTION {calc.label}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.label
'author.key.label
if$
}
if$
"("
*
year duplicate$ empty$
{ pop$ "????" }
{ purify$ #-1 #4 substring$ }
if$
*
'label :=
}
FUNCTION {sort.format.names}
{ 's :=
#1 'nameptr :=
""
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ nameptr #1 >
{ " " * }
'skip$
if$
s nameptr
"{vv{ } }{ll{ }}{ f{ }}{ jj{ }}"
format.name$ 't :=
nameptr numnames = t "others" = and
{ "et al" * }
{ numnames #2 > nameptr #2 = and
{ "zzzzzz" * #1 'namesleft := }
{ t sortify * }
if$
}
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {sort.format.title}
{ 't :=
"A " #2
"An " #3
"The " #4 t chop.word
chop.word
chop.word
sortify
#1 global.max$ substring$
}
FUNCTION {author.sort}
{ author empty$
{ key empty$
{ "to sort, need author or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.editor.sort}
{ author empty$
{ editor empty$
{ key empty$
{ "to sort, need author, editor, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ editor sort.format.names }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {editor.sort}
{ editor empty$
{ key empty$
{ "to sort, need editor or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ editor sort.format.names }
if$
}
FUNCTION {presort}
{ calc.label
label sortify
" "
*
type$ "book" =
type$ "inbook" =
or
'author.editor.sort
{ type$ "proceedings" =
'editor.sort
'author.sort
if$
}
if$
#1 entry.max$ substring$
'sort.label :=
sort.label
*
" "
*
title field.or.null
sort.format.title
*
#1 entry.max$ substring$
'sort.key$ :=
}
ITERATE {presort}
SORT
STRINGS { last.label next.extra }
INTEGERS { last.extra.num }
FUNCTION {initialize.extra.label.stuff}
{ #0 int.to.chr$ 'last.label :=
"" 'next.extra :=
#0 'last.extra.num :=
}
FUNCTION {forward.pass}
{ last.label label =
{ last.extra.num #1 + 'last.extra.num :=
last.extra.num int.to.chr$ 'extra.label :=
}
{ "a" chr.to.int$ 'last.extra.num :=
"" 'extra.label :=
label 'last.label :=
}
if$
}
FUNCTION {reverse.pass}
{ next.extra "b" =
{ "a" 'extra.label := }
'skip$
if$
extra.label 'next.extra :=
label extra.label * 'label :=
}
EXECUTE {initialize.extra.label.stuff}
ITERATE {forward.pass}
REVERSE {reverse.pass}
FUNCTION {bib.sort.order}
{ sort.label
" "
*
year field.or.null sortify
*
" "
*
title field.or.null
sort.format.title
*
#1 entry.max$ substring$
'sort.key$ :=
}
ITERATE {bib.sort.order}
SORT
FUNCTION {begin.bib}
{ preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{}" write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
ITERATE {call.type$}
FUNCTION {end.bib}
{ newline$
"\end{thebibliography}" write$ newline$
}
EXECUTE {end.bib}
%% End of customized bst file
\ No newline at end of file
@article{cruz2011sequence,
title={Sequence-based identification of 3D structural modules in {RNA} with RMDetect},
author={Cruz, Jos{\'e} Almeida and Westhof, Eric},
journal={Nature methods},
volume={8},
number={6},
pages={513},
year={2011},
publisher={Nature Publishing Group}
}
@article{djelloul_automated_2008,
title = {Automated motif extraction and classification in {RNA} tertiary structures},
volume = {14},
issn = {1355-8382, 1469-9001},
url = {http://rnajournal.cshlp.org/content/14/12/2489},
doi = {10.1261/rna.1061108},
abstract = {We used a novel graph-based approach to extract {RNA} tertiary motifs. We cataloged them all and clustered them using an innovative graph similarity measure. We applied our method to three widely studied structures: Haloarcula marismortui 50S (H.m 50S), Escherichia coli 50S (E. coli 50S), and Thermus thermophilus 16S (T.th 16S) RNAs. We identified 10 known motifs without any prior knowledge of their shapes or positions. We additionally identified four putative new motifs.},
language = {en},
number = {12},
urldate = {2018-10-04},
journal = {RNA},
author = {Djelloul, Mahassine and Denise, Alain},
month = jan,
year = {2008},
pmid = {18957493},
keywords = {clustering, graph similarity, {RNA} tertiary structure},
pages = {2489--2497},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/6PDZZRI6/Djelloul et Denise - 2008 - Automated motif extraction and classification in R.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/28T5ICXG/2489.html:text/html}
}
@article{roll_jar3d_2016,
title = {{JAR}3D {Webserver}: {Scoring} and aligning {RNA} loop sequences to known 3D motifs},
volume = {44},
issn = {0305-1048},
shorttitle = {{JAR}3D {Webserver}},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4987954/},
doi = {10.1093/nar/gkw453},
abstract = {Many non-coding RNAs have been identified and may function by forming 2D and 3D structures. {RNA} hairpin and internal loops are often represented as unstructured on secondary structure diagrams, but {RNA} 3D structures show that most such loops are structured by non-Watson–Crick basepairs and base stacking. Moreover, different {RNA} sequences can form the same {RNA} 3D motif. JAR3D finds possible 3D geometries for hairpin and internal loops by matching loop sequences to motif groups from the {RNA} 3D Motif Atlas, by exact sequence match when possible, and by probabilistic scoring and edit distance for novel sequences. The scoring gauges the ability of the sequences to form the same pattern of interactions observed in 3D structures of the motif. The JAR3D webserver at http://rna.bgsu.edu/jar3d/ takes one or many sequences of a single loop as input, or else one or many sequences of longer RNAs with multiple loops. Each sequence is scored against all current motif groups. The output shows the ten best-matching motif groups. Users can align input sequences to each of the motif groups found by JAR3D. JAR3D will be updated with every release of the {RNA} 3D Motif Atlas, and so its performance is expected to improve over time.},
number = {Web Server issue},
urldate = {2018-10-04},
journal = {Nucleic Acids Research},
author = {Roll, James and Zirbel, Craig L. and Sweeney, Blake and Petrov, Anton I. and Leontis, Neocles},
month = jul,
year = {2016},
pmid = {27235417},
pmcid = {PMC4987954},
pages = {W320--W327},
file = {PubMed Central Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/KWD59J5I/Roll et al. - 2016 - JAR3D Webserver Scoring and aligning {RNA} loop seq.pdf:application/pdf}
}
@article{zhong_rnamotifscan:_2010,
title = {{RNAMotifScan}: automatic identification of {RNA} structural motifs using secondary structural alignment},
volume = {38},
issn = {0305-1048},
shorttitle = {{RNAMotifScan}},
url = {https://academic.oup.com/nar/article/38/18/e176/1069222},
doi = {10.1093/nar/gkq672},
abstract = {Abstract. Recent studies have shown that {RNA} structural motifs play essential roles in {RNA} folding and interaction with other molecules. Computational identifi},
language = {en},
number = {18},
urldate = {2018-10-04},
journal = {Nucleic Acids Research},
author = {Zhong, Cuncong and Tang, Haixu and Zhang, Shaojie},
month = oct,
year = {2010},
pages = {e176--e176},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/ESXL69Q6/Zhong et al. - 2010 - RNAMotifScan automatic identification of {RNA} stru.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/MWTNC94Z/1069222.html:text/html}
}
@inproceedings{tahi_fast_2003,
title = {A fast algorithm for {RNA} secondary structure prediction including pseudoknots},
doi = {10.1109/BIBE.2003.1188924},
abstract = {Many important {RNA} molecules contain pseudoknots, which are generally excluded by the definition of the secondary structure, mainly for computational reasons. Still, most existing algorithms for secondary structure prediction are not satisfactory in results and complexities, even when pseudoknots are not allowed. We present an algorithm, called P-DCFold, for the prediction of {RNA} secondary structures including all kinds of pseudoknots. It is based on the comparative approach. The helices are searched recursively, from more "likely" to less "likely", using the "Divide and Conquer" approach. This approach, which allows to limit the amount of searching, is possible when only non-interleaved helices are searched for. The pseudoknots are therefore searched in several steps, each helix of the pseudoknot being selected in a different step. P-DCFold has been applied to tmRNA and RnaseP sequences. In less than two seconds, their respective secondary structures, including their pseudoknots, have been recovered very efficiently.},
booktitle = {Third {IEEE} {Symposium} on {Bioinformatics} and {Bioengineering}, 2003. {Proceedings}.},
author = {Tahi, F. and Engelen, S. and Regnier, M.},
month = mar,
year = {2003},
keywords = {2 s, Bioinformatics, Biological control systems, computational methods, computational reasons, Context modeling, Databases, Evolution (biology), fast algorithm, macromolecules, molecular biophysics, molecular configurations, noninterleaved helices, Predictive models, pseudoknots, recursive searches, RNA, {RNA} secondary structure prediction, RnaseP, Robustness, secondary structures, spatial structures, Stochastic processes, Switches, tmRNA},
pages = {11--17},
file = {IEEE Xplore Abstract Record:/nhome/siniac/lbecquey/Zotero/storage/HTHXNSVF/1188924.html:text/html}
}
@article{tahi_p-dcfold_2005,
title = {P-dcfold or how to predict all kinds of pseudoknots in {RNA} secondary structures},
volume = {14},
issn = {0218-2130},
url = {https://www.worldscientific.com/doi/abs/10.1142/S021821300500234X},
doi = {10.1142/S021821300500234X},
abstract = {Pseudoknots play important roles in many RNAs. But for computational reasons, pseudoknots are usually excluded from the definition of {RNA} secondary structures. Indeed, prediction of pseudoknots increase very highly the complexities in time of the algorithms, knowing that all existing algorithms for {RNA} secondary structure prediction have complexities at least of O(n3). Some algorithms have been developed for searching pseudoknots, but all of them have very high complexities, and consider generally particular kinds of pseudoknots.We present an algorithm, called P-DCFold based on the comparative approach, for the prediction of {RNA} secondary structures including all kinds of pseudoknots. The helices are searched recursively using the "Divide and Conquer" approach, searching the helices from the "most significant" to the "less significant". A selected helix subdivide the sequence into two sub-sequences, the internal one and a concatenation of the two externals. This approach is used to search non-interleaved helices and allows to limit the space of searching. To search for pseudoknots, the processing is reiterated. Therefore, each helix of the pseudoknot is selected in a different step.P-DCFold has been applied to several {RNA} sequences. In less than two seconds, their respective secondary structures, including their pseudoknots, have been recovered very efficiently.},
number = {05},
urldate = {2018-10-02},
journal = {International Journal on Artificial Intelligence Tools},
author = {Tahi, Fariza and Stefan, Engelen and Regnier, Mireille},
month = oct,
year = {2005},
pages = {703--716},
file = {Snapshot:/nhome/siniac/lbecquey/Zotero/storage/GEIBPMJ4/S021821300500234X.html:text/html}
}
@article{tempel_fast_2012,
title = {A fast ab-initio method for predicting {miRNA} precursors in genomes},
volume = {40},
issn = {0305-1048},
url = {https://academic.oup.com/nar/article/40/11/e80/2409259},
doi = {10.1093/nar/gks146},
abstract = {Abstract. miRNAs are small non coding {RNA} structures which play important roles in biological processes. Finding miRNA precursors in genomes is therefore an i},
language = {en},
number = {11},
urldate = {2018-10-02},
journal = {Nucleic Acids Research},
author = {Tempel, Sébastien and Tahi, Fariza},
month = jun,
year = {2012},
pages = {e80--e80},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/BSCSRRL2/Tempel et Tahi - 2012 - A fast ab-initio method for predicting miRNA precu.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/ZTG4GDDT/2409259.html:text/html}
}
@article{reinharz_towards_2012,
title = {Towards 3D structure prediction of large {RNA} molecules: an integer programming framework to insert local 3D motifs in {RNA} secondary structure},
volume = {28},
issn = {1367-4803},
shorttitle = {Towards 3D structure prediction of large {RNA} molecules},
url = {https://academic.oup.com/bioinformatics/article/28/12/i207/269345},
doi = {10.1093/bioinformatics/bts226},
abstract = {Abstract. Motivation: The prediction of {RNA} 3D structures from its sequence only is a milestone to {RNA} function analysis and prediction. In recent years, many},
language = {en},
number = {12},
urldate = {2018-10-01},
journal = {Bioinformatics},
author = {Reinharz, Vladimir and Major, François and Waldispühl, Jérôme},
month = jun,
year = {2012},
pages = {i207--i214},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/IAYRK53E/Reinharz et al. - 2012 - Towards 3D structure prediction of large {RNA} molec.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/SSMTN6YZ/269345.html:text/html}
}
@article{pan_predicting_nodate,
title = {Predicting {RNA}–protein binding sites and motifs through combining local and global deep convolutional neural networks},
url = {https://academic.oup.com/bioinformatics/advance-article/doi/10.1093/bioinformatics/bty364/4990826},
doi = {10.1093/bioinformatics/bty364},
abstract = {AbstractMotivation. RNA-binding proteins (RBPs) take over 5–10\% of the eukaryotic proteome and play key roles in many biological processes, e.g. gene regulatio},
language = {en},
urldate = {2018-06-12},
journal = {Bioinformatics},
author = {Pan, Xiaoyong and Shen, Hong-Bin and Valencia, Alfonso},
file = {10.1093@bioinformatics@bty364.pdf:/nhome/siniac/lbecquey/Zotero/storage/KUQZ2HNN/10.1093@bioinformatics@bty364.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/TLQUYHEU/4990826.html:text/html}
}
@article{yi_brief_2017,
title = {A {Brief} {Review} of {RNA}–{Protein} {Interaction} {Database} {Resources}},
volume = {3},
issn = {2311-553X},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5832006/},
doi = {10.3390/ncrna3010006},
abstract = {RNA–Protein interactions play critical roles in various biological processes. By collecting and analyzing the RNA–Protein interactions and binding sites from experiments and predictions, RNA–Protein interaction databases have become an essential resource for the exploration of the transcriptional and post-transcriptional regulatory network. Here, we briefly review several widely used RNA–Protein interaction database resources developed in recent years to provide a guide of these databases. The content and major functions in databases are presented. The brief description of database helps users to quickly choose the database containing information they interested. In short, these RNA–Protein interaction database resources are continually updated, but the current state shows the efforts to identify and analyze the large amount of RNA–Protein interactions.},
number = {1},
urldate = {2018-06-08},
journal = {Non-Coding RNA},
author = {Yi, Ying and Zhao, Yue and Huang, Yan and Wang, Dong},
month = jan,
year = {2017},
pmid = {29657278},
pmcid = {PMC5832006},
file = {PubMed Central Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/C3ZRG7MJ/Yi et al. - 2017 - A Brief Review of RNA–Protein Interaction Database.pdf:application/pdf}
}
@article{das_automated_2007,
title = {Automated de novo prediction of native-like {RNA} tertiary structures},
volume = {104},
copyright = {© 2007 by The National Academy of Sciences of the USA. Freely available online through the PNAS open access option.},
issn = {0027-8424, 1091-6490},
url = {http://www.pnas.org/content/104/37/14664},
doi = {10.1073/pnas.0703836104},
abstract = {RNA tertiary structure prediction has been based almost entirely on base-pairing constraints derived from phylogenetic covariation analysis. We describe here a complementary approach, inspired by the Rosetta low-resolution protein structure prediction method, that seeks the lowest energy tertiary structure for a given {RNA} sequence without using evolutionary information. In a benchmark test of 20 {RNA} sequences with known structure and lengths of ≈30 nt, the new method reproduces better than 90\% of Watson–Crick base pairs, comparable with the accuracy of secondary structure prediction methods. In more than half the cases, at least one of the top five models agrees with the native structure to better than 4 Å rmsd over the backbone. Most importantly, the method recapitulates more than one-third of non-Watson–Crick base pairs seen in the native structures. Tandem stacks of “sheared” base pairs, base triplets, and pseudoknots are among the noncanonical features reproduced in the models. In the cases in which none of the top five models were native-like, higher energy conformations similar to the native structures are still sampled frequently but not assigned low energies. These results suggest that modest improvements in the energy function, together with the incorporation of information from phylogenetic covariance, may allow confident and accurate structure prediction for larger and more complex {RNA} chains.},
language = {en},
number = {37},
urldate = {2018-06-04},
journal = {Proceedings of the National Academy of Sciences},
author = {Das, Rhiju and Baker, David},
month = sep,
year = {2007},
pmid = {17726102},
keywords = {ab initio, energy-based, fragment assembly, nucleic acid, Rosetta},
pages = {14664--14669},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/H79FEN6P/Das and Baker - 2007 - Automated de novo prediction of native-like {RNA} te.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/WH7PUGNW/14664.html:text/html}
}
@article{cao_physics-based_2011,
title = {Physics-based de novo prediction of {RNA} 3D structures},
volume = {115},
issn = {1520-6106},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3072456/},
doi = {10.1021/jp112059y},
abstract = {Current experiments on structural determination cannot keep up the pace with the steadily emerging {RNA} sequences and new functions. This underscores the request for an accurate model for {RNA} three-dimensional (3D) structural prediction. Although considerable progress has been made in mechanistic studies, accurate prediction for {RNA} tertiary folding from sequence remains an unsolved problem. The first and most important requirement for the prediction of {RNA} structure from physical principles is an accurate free energy model. A recently developed three-vector virtual bond-based {RNA} folding model (“Vfold”) has allowed us to compute the chain entropy and predict folding free energies and structures for {RNA} secondary structures and simple pseudoknots. Here we develop a free energy-based method to predict larger more complex {RNA} tertiary folds. The approach is based on a multiscaling strategy: from the nucleotide sequence, we predict the two-dimensional (2D) structures (defined by the base pairs and tertiary contacts); based on the 2D structure, we construct a 3D scaffold; with the 3D scaffold as the initial state, we combine AMBER energy minimization and PDB-based fragment search to predict the all-atom structure. A key advantage of the approach is the statistical mechanical calculation for the conformational entropy of {RNA} structures, including those with cross-linked loops. Benchmark tests show that the model leads to significant improvements in {RNA} 3D structure prediction.},
number = {14},
urldate = {2018-06-04},
journal = {The journal of physical chemistry. B},
author = {Cao, Song and Chen, Shi-Jie},
month = apr,
year = {2011},
pmid = {21413701},
pmcid = {PMC3072456},
pages = {4216--4226},
file = {PubMed Central Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/ZY98QT5K/Cao and Chen - 2011 - Physics-based de novo prediction of {RNA} 3D structu.pdf:application/pdf}
}
@article{bellaousov2010probknot,
title={ProbKnot: fast prediction of {RNA} secondary structure including pseudoknots},
author={Bellaousov, Stanislav and Mathews, David H},
journal={Rna},
volume={16},
number={10},
pages={1870--1880},
year={2010},
publisher={Cold Spring Harbor Lab}
}
@article{mccaskill1990equilibrium,
title={The equilibrium partition function and base pair binding probabilities for {RNA} secondary structure},
author={McCaskill, John S},
journal={Biopolymers: Original Research on Biomolecules},
volume={29},
number={6-7},
pages={1105--1119},
year={1990},
publisher={Wiley Online Library}
}
@article{bottaro_towards_2015,
title = {Towards de novo {RNA} 3D {Structure} {Prediction}},
volume = {2},
copyright = {Copyright (c) 2015 Sandro Bottaro, Francesco Di Palma, Giovanni Bussi},
issn = {2375-2467},
url = {http://www.smartscitech.com/index.php/RD/article/view/544},
doi = {10.14800/rd.544},
abstract = {RNA is a fundamental class of biomolecules that mediate a large variety of molecular processes within the cell. Computational algorithms can be of great help in the understanding of {RNA} structure-function relationship. One of the main challenges in this field is the development of structure-prediction algorithms, which aim at the prediction of the three-dimensional (3D) native fold from the sole knowledge of the sequence. In a recent paper, we have introduced a scoring function for {RNA} structure prediction. Here, we analyze in detail the performance of the method, we underline strengths and shortcomings, and we discuss the results with respect to state-of-the-art techniques. These observations provide a starting point for improving current methodologies, thus paving the way to the advances of more accurate approaches for {RNA} 3D structure prediction.},
language = {en},
number = {2},
urldate = {2018-06-04},
journal = {RNA \& DISEASE},
author = {Bottaro, Sandro and Palma, Francesco Di and Bussi, Giovanni},
month = jan,
year = {2015},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/SWAYZQEV/Bottaro et al. - 2015 - Towards de novo {RNA} 3D Structure Prediction.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/SQMMYVCU/544.html:text/html}
}
@article{mathews2004using,
title={Using an {RNA} secondary structure partition function to determine confidence in base pairs predicted by free energy minimization},
author={Mathews, David H},
journal={Rna},
volume={10},
number={8},
pages={1178--1190},
year={2004},
publisher={Cold Spring Harbor Lab}
}
@article{lorenz2011viennarna,
title={ViennaRNA Package 2.0},
author={Lorenz, Ronny and Bernhart, Stephan H and Zu Siederdissen, Christian Hoener and Tafer, Hakim and Flamm, Christoph and Stadler, Peter F and Hofacker, Ivo L},
journal={Algorithms for Molecular Biology},
volume={6},
number={1},
pages={26},
year={2011},
publisher={BioMed Central}
}
@article{andronescu2008rna,
title={RNA STRAND: the {RNA} secondary structure and statistical analysis database},
author={Andronescu, Mirela and Bereg, Vera and Hoos, Holger H and Condon, Anne},
journal={BMC bioinformatics},
volume={9},
number={1},
pages={340},
year={2008},
publisher={BioMed Central}
}
@article{bindewald_multistrand_2016,
title = {Multistrand {Structure} {Prediction} of {Nucleic} {Acid} {Assemblies} and {Design} of {RNA} {Switches}},
volume = {16},
issn = {1530-6984},
url = {https://doi.org/10.1021/acs.nanolett.5b04651},
doi = {10.1021/acs.nanolett.5b04651},
abstract = {RNA is an attractive material for the creation of molecular logic gates that release programmed functionalities only in the presence of specific molecular interaction partners. Here we present HyperFold, a multistrand RNA/DNA structure prediction approach for predicting nucleic acid complexes that can contain pseudoknots. We show that HyperFold also performs competitively compared to other published folding algorithms. We performed a large variety of RNA/DNA hybrid reassociation experiments for different concentrations, DNA toehold lengths, and G+C content and find that the observed tendencies for reassociation correspond well to computational predictions. Importantly, we apply this method to the design and experimental verification of a two-stranded {RNA} molecular switch that upon binding to a single-stranded {RNA} toehold disease-marker trigger mRNA changes its conformation releasing an shRNA-like Dicer substrate structure. To demonstrate the concept, connective tissue growth factor (CTGF) mRNA and enhanced green fluorescent protein (eGFP) mRNA were chosen as trigger and target sequences, respectively. In vitro experiments confirm the formation of an {RNA} switch and demonstrate that the functional unit is being released when the trigger {RNA} interacts with the switch toehold. The designed {RNA} switch is shown to be functional in MDA-MB-231 breast cancer cells. Several other switches were also designed and tested. We conclude that this approach has considerable potential because, in principle, it allows the release of an siRNA designed against a gene that differs from the gene that is utilized as a biomarker for a disease state.},
number = {3},
urldate = {2018-05-31},
journal = {Nano Letters},
author = {Bindewald, Eckart and Afonin, Kirill A. and Viard, Mathias and Zakrevsky, Paul and Kim, Taejin and Shapiro, Bruce A.},
month = mar,
year = {2016},
pages = {1726--1735},
file = {ACS Full Text Snapshot:/nhome/siniac/lbecquey/Zotero/storage/285MME3I/acs.nanolett.html:text/html}
}
@article{parisien2008mc,
title={The MC-Fold and MC-Sym pipeline infers {RNA} structure from sequence data},
author={Parisien, Marc and Major, Francois},
journal={Nature},
volume={452},
number={7183},
pages={51},
year={2008},
publisher={Nature Publishing Group}
}
@article{ge_novo_2018,
title = {De novo discovery of structural motifs in {RNA} 3D structures through clustering},
volume = {46},
issn = {0305-1048},
url = {https://academic.oup.com/nar/article/46/9/4783/4925243},
doi = {10.1093/nar/gky139},
abstract = {Abstract. As functional components in three-dimensional (3D) conformation of an RNA, the {RNA} structural motifs provide an easy way to associate the molecular a},
language = {en},
number = {9},
urldate = {2018-05-31},
journal = {Nucleic Acids Research},
author = {Ge, Ping and Islam, Shahidul and Zhong, Cuncong and Zhang, Shaojie},
month = may,
year = {2018},
pages = {4783--4793},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/8YS7LY6E/Ge et al. - 2018 - De novo discovery of structural motifs in {RNA} 3D s.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/4TLRV8ZT/4925243.html:text/html}
}
@article{wang_rna_2018,
title = {{RNA} 3-dimensional structural motifs as a critical constraint of viroid {RNA} evolution},
volume = {14},
issn = {1553-7374},
url = {http://journals.plos.org/plospathogens/article?id=10.1371/journal.ppat.1006801},
doi = {10.1371/journal.ppat.1006801},
language = {en},
number = {2},
urldate = {2018-05-31},
journal = {PLOS Pathogens},
author = {Wang, Ying and Zirbel, Craig L. and Leontis, Neocles B. and Ding, Biao},
month = feb,
year = {2018},
keywords = {Non-coding {RNA} sequences, {RNA} structure, {RNA} viruses, Sequence motif analysis, Viral evolution, Viral replication, Viral structure, Viroids},
pages = {e1006801},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/M3P6GCA7/Wang et al. - 2018 - {RNA} 3-dimensional structural motifs as a critical .pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/3YRBKI96/article.html:text/html}
}
@article{lorenz_viennarna_2011,
title = {{ViennaRNA} {Package} 2.0},
volume = {6},
issn = {1748-7188},
url = {https://doi.org/10.1186/1748-7188-6-26},
doi = {10.1186/1748-7188-6-26},
abstract = {Secondary structure forms an important intermediate level of description of nucleic acids that encapsulates the dominating part of the folding energy, is often well conserved in evolution, and is routinely used as a basis to explain experimental findings. Based on carefully measured thermodynamic parameters, exact dynamic programming algorithms can be used to compute ground states, base pairing probabilities, as well as thermodynamic properties.},
urldate = {2018-05-31},
journal = {Algorithms for Molecular Biology},
author = {Lorenz, Ronny and Bernhart, Stephan H. and Höner zu Siederdissen, Christian and Tafer, Hakim and Flamm, Christoph and Stadler, Peter F. and Hofacker, Ivo L.},
month = nov,
year = {2011},
keywords = {Consensus Structure, Folding Algorithm, Matthews Correlation Coefficient, Minimum Free Energy, Partition Function},
pages = {26},
annote = {Pages 26 in PDF},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/WFPBA2H8/Lorenz et al. - 2011 - ViennaRNA Package 2.0.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/ADNFF9EA/1748-7188-6-26.html:text/html}
}
@article{janssen_rna_2015,
title = {The {RNA} shapes studio},
volume = {31},
issn = {1367-4803},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4308662/},
doi = {10.1093/bioinformatics/btu649},
abstract = {Motivation: Abstract shape analysis, first proposed in 2004, allows one to extract several relevant structures from the folding space of an {RNA} sequence, preferable to focusing in a single structure of minimal free energy. We report recent extensions to this approach., Results: We have rebuilt the original RNAshapes as a repository of components that allows us to integrate several established tools for {RNA} structure analysis: RNAshapes, RNAalishapes and pknotsRG, including its recent extension pKiss. As a spin-off, we obtain heretofore unavailable functionality: e. g. with pKiss, we can now perform abstract shape analysis for structures holding pseudoknots up to the complexity of kissing hairpin motifs. The new tool pAliKiss can predict kissing hairpin motifs from aligned sequences. Along with the integration, the functionality of the tools was also extended in manifold ways., Availability and implementation: As before, the tool is available on the Bielefeld Bioinformatics server at http://bibiserv.cebitec.uni-bielefeld.de/rnashapesstudio., Contact: bibi-help@cebitec.uni-bielefeld.de},
number = {3},
urldate = {2018-05-31},
journal = {Bioinformatics},
author = {Janssen, Stefan and Giegerich, Robert},
month = feb,
year = {2015},
pmid = {25273103},
pmcid = {PMC4308662},
pages = {423--425},
file = {PubMed Central Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/KFQTVDR3/Janssen and Giegerich - 2015 - The {RNA} shapes studio.pdf:application/pdf}
}
@article{parlea_rna_2016,
series = {Advances in {RNA} {Structure} {Determination}},
title = {The {RNA} 3D {Motif} {Atlas}: {Computational} methods for extraction, organization and evaluation of {RNA} motifs},
volume = {103},
issn = {1046-2023},
shorttitle = {The {RNA} 3D {Motif} {Atlas}},
url = {http://www.sciencedirect.com/science/article/pii/S1046202316301049},
doi = {10.1016/j.ymeth.2016.04.025},
abstract = {RNA 3D motifs occupy places in structured {RNA} molecules that correspond to the hairpin, internal and multi-helix junction “loops” of their secondary structure representations. As many as 40\% of the nucleotides of an {RNA} molecule can belong to these structural elements, which are distinct from the regular double helical regions formed by contiguous AU, GC, and GU Watson-Crick basepairs. With the large number of atomic- or near atomic-resolution 3D structures appearing in a steady stream in the PDB/NDB structure databases, the automated identification, extraction, comparison, clustering and visualization of these structural elements presents an opportunity to enhance {RNA} science. Three broad applications are: (1) identification of modular, autonomous structural units for {RNA} nanotechnology, nanobiology and synthetic biology applications; (2) bioinformatic analysis to improve {RNA} 3D structure prediction from sequence; and (3) creation of searchable databases for exploring the binding specificities, structural flexibility, and dynamics of these {RNA} elements. In this contribution, we review methods developed for computational extraction of hairpin and internal loop motifs from a non-redundant set of high-quality {RNA} 3D structures. We provide a statistical summary of the extracted hairpin and internal loop motifs in the most recent version of the {RNA} 3D Motif Atlas. We also explore the reliability and accuracy of the extraction process by examining its performance in clustering recurrent motifs from homologous ribosomal {RNA} (rRNA) structures. We conclude with a summary of remaining challenges, especially with regard to extraction of multi-helix junction motifs.},
urldate = {2018-05-31},
journal = {Methods},
author = {Parlea, Lorena G. and Sweeney, Blake A. and Hosseini-Asanjan, Maryam and Zirbel, Craig L. and Leontis, Neocles B.},
month = jul,
year = {2016},
keywords = {Hairpin loop, Internal loop, Multi-helix junction loop, Non-Watson-Crick basepair, {RNA} 3D Motif, Structured {RNA} molecules},
pages = {99--119},
file = {ScienceDirect Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/HM9ZDD83/Parlea et al. - 2016 - The {RNA} 3D Motif Atlas Computational methods for .pdf:application/pdf;ScienceDirect Snapshot:/nhome/siniac/lbecquey/Zotero/storage/ANJRICVQ/S1046202316301049.html:text/html}
}
@article{legendre_bi-objective_2018,
title = {Bi-objective integer programming for {RNA} secondary structure prediction with pseudoknots},
volume = {19},
issn = {1471-2105},
url = {https://doi.org/10.1186/s12859-018-2007-7},
doi = {10.1186/s12859-018-2007-7},
abstract = {RNA structure prediction is an important field in bioinformatics, and numerous methods and tools have been proposed. Pseudoknots are specific motifs of {RNA} secondary structures that are difficult to predict. Almost all existing methods are based on a single model and return one solution, often missing the real structure. An alternative approach would be to combine different models and return a (small) set of solutions, maximizing its quality and diversity in order to increase the probability that it contains the real structure.},
urldate = {2018-05-24},
journal = {BMC Bioinformatics},
author = {Legendre, Audrey and Angel, Eric and Tahi, Fariza},
month = jan,
year = {2018},
keywords = {RNA, Bi-objective, Integer programming, Optimal solutions, Pseudoknot, Secondary structure, Sub-optimal solutions},
pages = {13},
annote = {Pages 13 in PDF},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/4YMW5M4S/Legendre et al. - 2018 - Bi-objective integer programming for {RNA} secondary.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/XP46BMHH/s12859-018-2007-7.html:text/html}
}
@article{sarver_fr3d:_2008,
title = {{FR}3D: finding local and composite recurrent structural motifs in {RNA} 3D structures},
volume = {56},
issn = {1432-1416},
shorttitle = {{FR}3D},
url = {https://doi.org/10.1007/s00285-007-0110-x},
doi = {10.1007/s00285-007-0110-x},
abstract = {New methods are described for finding recurrent three-dimensional (3D) motifs in {RNA} atomic-resolution structures. Recurrent {RNA} 3D motifs are sets of {RNA} nucleotides with similar spatial arrangements. They can be local or composite. Local motifs comprise nucleotides that occur in the same hairpin or internal loop. Composite motifs comprise nucleotides belonging to three or more different {RNA} strand segments or molecules. We use a base-centered approach to construct efficient, yet exhaustive search procedures using geometric, symbolic, or mixed representations of {RNA} structure that we implement in a suite of MATLAB programs, “Find {RNA} 3D” (FR3D). The first modules of FR3D preprocess structure files to classify base-pair and -stacking interactions. Each base is represented geometrically by the position of its glycosidic nitrogen in 3D space and by the rotation matrix that describes its orientation with respect to a common frame. Base-pairing and base-stacking interactions are calculated from the base geometries and are represented symbolically according to the Leontis/Westhof basepairing classification, extended to include base-stacking. These data are stored and used to organize motif searches. For geometric searches, the user supplies the 3D structure of a query motif which FR3D uses to find and score geometrically similar candidate motifs, without regard to the sequential position of their nucleotides in the {RNA} chain or the identity of their bases. To score and rank candidate motifs, FR3D calculates a geometric discrepancy by rigidly rotating candidates to align optimally with the query motif and then comparing the relative orientations of the corresponding bases in the query and candidate motifs. Given the growing size of the {RNA} structure database, it is impossible to explicitly compute the discrepancy for all conceivable candidate motifs, even for motifs with less than ten nucleotides. The screening algorithm that we describe finds all candidate motifs whose geometric discrepancy with respect to the query motif falls below a user-specified cutoff discrepancy. This technique can be applied to RMSD searches. Candidate motifs identified geometrically may be further screened symbolically to identify those that contain particular basepair types or base-stacking arrangements or that conform to sequence continuity or nucleotide identity constraints. Purely symbolic searches for motifs containing user-defined sequence, continuity and interaction constraints have also been implemented. We demonstrate that FR3D finds all occurrences, both local and composite and with nucleotide substitutions, of sarcin/ricin and kink-turn motifs in the 23S and 5S ribosomal {RNA} 3D structures of the H. marismortui 50S ribosomal subunit and assigns the lowest discrepancy scores to bona fide examples of these motifs. The search algorithms have been optimized for speed to allow users to search the non-redundant {RNA} 3D structure database on a personal computer in a matter of minutes.},
language = {en},
number = {1},
urldate = {2018-10-10},
journal = {Journal of Mathematical Biology},
author = {Sarver, Michael and Zirbel, Craig L. and Stombaugh, Jesse and Mokdad, Ali and Leontis, Neocles B.},
month = jan,
year = {2008},
keywords = {05C85, 92C40},
pages = {215--252}
}
@article{petrov_webfr3dserver_2011,
title = {{WebFR}3D—a server for finding, aligning and analyzing recurrent {RNA} 3D motifs},
volume = {39},
issn = {0305-1048},
url = {https://academic.oup.com/nar/article/39/suppl_2/W50/2505799},
doi = {10.1093/nar/gkr249},
abstract = {Abstract. WebFR3D is the on-line version of ‘Find {RNA} 3D’ (FR3D), a program for annotating atomic-resolution {RNA} 3D structure files and searching them efficie},
language = {en},
number = {suppl\_2},
urldate = {2018-10-10},
journal = {Nucleic Acids Research},
author = {Petrov, Anton I. and Zirbel, Craig L. and Leontis, Neocles B.},
month = jul,
year = {2011},
pages = {W50--W55},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/WVGVFLFH/Petrov et al. - 2011 - WebFR3D—a server for finding, aligning and analyzi.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/8NMZZLKV/2505799.html:text/html}
}
@article{petrov_automated_2013,
title = {Automated classification of {RNA} 3D motifs and the {RNA} 3D {Motif} {Atlas}},
volume = {19},
issn = {1355-8382, 1469-9001},
url = {http://rnajournal.cshlp.org/content/19/10/1327},
doi = {10.1261/rna.039438.113},
abstract = {A monthly journal publishing high-quality, peer-reviewed research on all topics related to {RNA} and its metabolism in all organisms},
language = {en},
number = {10},
urldate = {2018-10-10},
journal = {RNA},
author = {Petrov, Anton I. and Zirbel, Craig L. and Leontis, Neocles B.},
month = jan,
year = {2013},
pmid = {23970545},
pages = {1327--1340},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/GIC5F2CJ/Petrov et al. - 2013 - Automated classification of {RNA} 3D motifs and the .pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/UJFVEML3/1327.full.html:text/html}
}
@article{lu_dssr:_2015,
title = {{DSSR}: an integrated software tool for dissecting the spatial structure of {RNA}},
volume = {43},
issn = {0305-1048},
shorttitle = {{DSSR}},
url = {https://academic.oup.com/nar/article/43/21/e142/2468098},
doi = {10.1093/nar/gkv716},
abstract = {Abstract. Insight into the three-dimensional architecture of {RNA} is essential for understanding its cellular functions. However, even the classic transfer RNA},
language = {en},
number = {21},
urldate = {2018-10-09},
journal = {Nucleic Acids Research},
author = {Lu, Xiang-Jun and Bussemaker, Harmen J. and Olson, Wilma K.},
month = dec,
year = {2015},
pages = {e142--e142},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/NURMS9UY/Lu et al. - 2015 - DSSR an integrated software tool for dissecting t.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/BTZXBR6S/2468098.html:text/html}
}
@article{antczak_rnapdbeewebserver_2014,
title = {{RNApdbee}—a webserver to derive secondary structures from pdb files of knotted and unknotted {RNAs}},
volume = {42},
issn = {0305-1048},
url = {https://academic.oup.com/nar/article/42/W1/W368/2435287},
doi = {10.1093/nar/gku330},
abstract = {Abstract. In {RNA} structural biology and bioinformatics an access to correct {RNA} secondary structure and its proper representation is of crucial importance. Thi},
language = {en},
number = {W1},
urldate = {2018-10-09},
journal = {Nucleic Acids Research},
author = {Antczak, Maciej and Zok, Tomasz and Popenda, Mariusz and Lukasiak, Piotr and Adamiak, Ryszard W. and Blazewicz, Jacek and Szachniuk, Marta},
month = jul,
year = {2014},
pages = {W368--W372},
file = {Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/RWXNJQH6/Antczak et al. - 2014 - RNApdbee—a webserver to derive secondary structure.pdf:application/pdf;Snapshot:/nhome/siniac/lbecquey/Zotero/storage/H6CZVH4F/2435287.html:text/html}
}
@article{dirksAlgorithmComputingNucleic2004,
title = {An Algorithm for Computing Nucleic Acid Base-Pairing Probabilities Including Pseudoknots},
volume = {25},
copyright = {Copyright \textcopyright{} 2004 Wiley Periodicals, Inc.},
issn = {1096-987X},
doi = {10.1002/jcc.20057},
abstract = {Given a nucleic acid sequence, a recent algorithm allows the calculation of the partition function over secondary structure space including a class of physically relevant pseudoknots. Here, we present a method for computing base-pairing probabilities starting from the output of this partition function algorithm. The approach relies on the calculation of recursion probabilities that are computed by backtracking through the partition function algorithm, applying a particular transformation at each step. This transformation is applicable to any partition function algorithm that follows the same basic dynamic programming paradigm. Base-pairing probabilities are useful for analyzing the equilibrium ensemble properties of natural and engineered nucleic acids, as demonstrated for a human telomerase {RNA} and a synthetic DNA nanostructure. \textcopyright{} 2004 Wiley Periodicals, Inc. J Comput Chem 25: 1295\textendash{}1304, 2004},
language = {en},
number = {10},
journal = {Journal of Computational Chemistry},
author = {Dirks, Robert M. and Pierce, Niles A.},
year = {2004},
keywords = {pseudoknots,RNA,DNA,base-pairing probabilities,partition function},
pages = {1295-1304},
file = {/nhome/siniac/lbecquey/Zotero/storage/LA8RHBVN/jcc.html}
}
@article{laing_computational_2010,
title = {Computational approaches to 3D modeling of {RNA}},
volume = {22},
issn = {0953-8984},
url = {http://stacks.iop.org/0953-8984/22/i=28/a=283101},
doi = {10.1088/0953-8984/22/28/283101},
abstract = {Many exciting discoveries have recently revealed the versatility of {RNA} and its importance in a variety of functions within the cell. Since the structural features of {RNA} are of major importance to their biological function, there is much interest in predicting {RNA} structure, either in free form or in interaction with various ligands, including proteins, metabolites and other molecules. In recent years, an increasing number of researchers have developed novel {RNA} algorithms for predicting {RNA} secondary and tertiary structures. In this review, we describe current experimental and computational advances and discuss recent ideas that are transforming the traditional view of {RNA} folding. To evaluate the performance of the most recent {RNA} 3D folding algorithms, we provide a comparative study in order to test the performance of available 3D structure prediction algorithms for an {RNA} data set of 43 structures of various lengths and motifs. We find that the algorithms vary widely in terms of prediction quality across different {RNA} lengths and topologies; most predictions have very large root mean square deviations from the experimental structure. We conclude by outlining some suggestions for future {RNA} folding research.},
language = {en},
number = {28},
urldate = {2018-10-09},
journal = {Journal of Physics: Condensed Matter},
author = {Laing, Christian and Schlick, Tamar},
year = {2010},
pages = {283101}
}
@article{dawson_computational_2016,
series = {Theory and simulation • {Macromolcular} machines},
title = {Computational modeling of {RNA} 3D structures and interactions},
volume = {37},
issn = {0959-440X},
url = {http://www.sciencedirect.com/science/article/pii/S0959440X15001700},
doi = {10.1016/j.sbi.2015.11.007},
abstract = {RNA molecules have key functions in cellular processes beyond being carriers of protein-coding information. These functions are often dependent on the ability to form complex three-dimensional (3D) structures. However, experimental determination of {RNA} 3D structures is difficult, which has prompted the development of computational methods for structure prediction from sequence. Recent progress in 3D structure modeling of {RNA} and emerging approaches for predicting {RNA} interactions with ions, ligands and proteins have been stimulated by successes in protein 3D structure modeling.},
urldate = {2018-10-09},
journal = {Current Opinion in Structural Biology},
author = {Dawson, Wayne K and Bujnicki, Janusz M},
month = apr,
year = {2016},
pages = {22--28},
file = {ScienceDirect Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/7V5SQ8PN/Dawson et Bujnicki - 2016 - Computational modeling of {RNA} 3D structures and in.pdf:application/pdf;ScienceDirect Snapshot:/nhome/siniac/lbecquey/Zotero/storage/CDMTYU7W/S0959440X15001700.html:text/html}
}
@article{laing_computational_2011,
title = {Computational approaches to {RNA} structure prediction, analysis, and design},
volume = {21},
issn = {0959-440X},
url = {http://www.sciencedirect.com/science/article/pii/S0959440X11000674},
doi = {10.1016/j.sbi.2011.03.015},
abstract = {RNA molecules are important cellular components involved in many fundamental biological processes. Understanding the mechanisms behind their functions requires {RNA} tertiary structure knowledge. Although modeling approaches for the study of {RNA} structures and dynamics lag behind efforts in protein folding, much progress has been achieved in the past two years. Here, we review recent advances in {RNA} folding algorithms, {RNA} tertiary motif discovery, applications of graph theory approaches to {RNA} structure and function, and in silico generation of {RNA} sequence pools for aptamer design. Advances within each area can be combined to impact many problems in {RNA} structure and function.},
number = {3},
urldate = {2018-10-09},
journal = {Current Opinion in Structural Biology},
author = {Laing, Christian and Schlick, Tamar},
month = jun,
year = {2011},
pages = {306--318},
file = {ScienceDirect Snapshot:/nhome/siniac/lbecquey/Zotero/storage/LWS5RU5Z/S0959440X11000674.html:text/html}
}
@article{reinharz2018mining,
title={Mining for recurrent long-range interactions in {RNA} structures reveals embedded hierarchies in network families},
author={Reinharz, Vladimir and Soul{\'e}, Antoine and Westhof, Eric and Waldisp{\"u}hl, J{\'e}r{\^o}me and Denise, Alain},
journal={Nucleic Acids Research},
volume={46},
number={8},
pages={3841--3851},
year={2018},
publisher={Oxford University Press}
}
@article{sato_ipknot:_2011,
title = {{IPknot}: fast and accurate prediction of {RNA} secondary structures with pseudoknots using integer programming},
volume = {27},
issn = {1367-4803},
shorttitle = {{IPknot}},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3117384/},
doi = {10.1093/bioinformatics/btr215},
abstract = {Motivation: Pseudoknots found in secondary structures of a number of functional RNAs play various roles in biological processes. Recent methods for predicting {RNA} secondary structures cover certain classes of pseudoknotted structures, but only a few of them achieve satisfying predictions in terms of both speed and accuracy., Results: We propose IPknot, a novel computational method for predicting {RNA} secondary structures with pseudoknots based on maximizing expected accuracy of a predicted structure. IPknot decomposes a pseudoknotted structure into a set of pseudoknot-free substructures and approximates a base-pairing probability distribution that considers pseudoknots, leading to the capability of modeling a wide class of pseudoknots and running quite fast. In addition, we propose a heuristic algorithm for refining base-paring probabilities to improve the prediction accuracy of IPknot. The problem of maximizing expected accuracy is solved by using integer programming with threshold cut. We also extend IPknot so that it can predict the consensus secondary structure with pseudoknots when a multiple sequence alignment is given. IPknot is validated through extensive experiments on various datasets, showing that IPknot achieves better prediction accuracy and faster running time as compared with several competitive prediction methods., Availability: The program of IPknot is available at http://www.ncrna.org/software/ipknot/. IPknot is also available as a web server at http://rna.naist.jp/ipknot/., Contact: satoken@k.u-tokyo.ac.jp; ykato@is.naist.jp, Supplementary information: Supplementary data are available at Bioinformatics online.},
number = {13},
urldate = {2018-10-12},
journal = {Bioinformatics},
author = {Sato, Kengo and Kato, Yuki and Hamada, Michiaki and Akutsu, Tatsuya and Asai, Kiyoshi},
month = jul,
year = {2011},
pmid = {21685106},
pmcid = {PMC3117384},
pages = {i85--i93},
file = {Texte intégral:/nhome/siniac/lbecquey/Zotero/storage/EEWT77EA/Sato et al. - 2011 - IPknot fast and accurate prediction of {RNA} second.pdf:application/pdf}
}
@article{zirbel_identifying_2015,
title = {Identifying novel sequence variants of {RNA} 3D motifs},
volume = {43},
issn = {0305-1048},
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4551918/},
doi = {10.1093/nar/gkv651},
abstract = {Predicting {RNA} 3D structure from sequence is a major challenge in biophysics. An important sub-goal is accurately identifying recurrent 3D motifs from {RNA} internal and hairpin loop sequences extracted from secondary structure (2D) diagrams. We have developed and validated new probabilistic models for 3D motif sequences based on hybrid Stochastic Context-Free Grammars and Markov Random Fields (SCFG/MRF). The SCFG/MRF models are constructed using atomic-resolution {RNA} 3D structures. To parameterize each model, we use all instances of each motif found in the {RNA} 3D Motif Atlas and annotations of pairwise nucleotide interactions generated by the FR3D software. Isostericity relations between non-Watson–Crick basepairs are used in scoring sequence variants. SCFG techniques model nested pairs and insertions, while MRF ideas handle crossing interactions and base triples. We use test sets of randomly-generated sequences to set acceptance and rejection thresholds for each motif group and thus control the false positive rate. Validation was carried out by comparing results for four motif groups to RMDetect. The software developed for sequence scoring (JAR3D) is structured to automatically incorporate new motifs as they accumulate in the {RNA} 3D Motif Atlas when new structures are solved and is available free for download.},
number = {15},
urldate = {2018-10-19},
journal = {Nucleic Acids Research},
author = {Zirbel, Craig L. and Roll, James and Sweeney, Blake A. and Petrov, Anton I. and Pirrung, Meg and Leontis, Neocles B.},
month = sep,
year = {2015},
pmid = {26130723},
pmcid = {PMC4551918},
pages = {7504--7520},
file = {PubMed Central Full Text PDF:/nhome/siniac/lbecquey/Zotero/storage/C68JKL5J/Zirbel et al. - 2015 - Identifying novel sequence variants of {RNA} 3D moti.pdf:application/pdf}
}
@software{cplex,
author = {IBM ILOG},
title = {{CPLEX}: {CPLEX} {Optimizer} (Academic license)},
version = {12.8},
howpublished = {https://www.ibm.com/analytics/optimization-modeling-interfaces},
year = {2018}
}
@article{leontis2001geometric,
title={Geometric nomenclature and classification of {RNA} base pairs},
author={Leontis, Neocles B and Westhof, Eric},
journal={Rna},
volume={7},
number={4},
pages={499--512},
year={2001},
publisher={Cambridge University Press}
}
@article{sarrazin2019automated,
title={Automated, customizable and efficient identification of 3D base pair modules with BayesPairing},
author={Sarrazin-Gendron, Roman and Reinharz, Vladimir and Oliver, Carlos G and Moitessier, Nicolas and Waldisp{\"u}hl, J{\'e}r{\^o}me},
journal={Nucleic acids research},
year={2019}
}
@article{schlick2018adventures,
title={Adventures with {RNA} graphs},
author={Schlick, Tamar},
journal={Methods},
year={2018},
publisher={Elsevier}
}
@article{chojnowski2014rna,
title={RNA Bricks—a database of {RNA} 3D motifs and their interactions},
author={Chojnowski, Grzegorz and Wale{\'n}, Tomasz and Bujnicki, Janusz M},
journal={Nucleic acids research},
volume={42},
number={D1},
pages={D123--D131},
year={2014},
publisher={Oxford University Press}
}
@article{gendron2001quantitative,
title={Quantitative analysis of nucleic acid three-dimensional structures},
author={Gendron, Patrick and Lemieux, S{\'e}bastien and Major, Fran{\c{c}}ois},
journal={Journal of molecular biology},
volume={308},
number={5},
pages={919--936},
year={2001},
publisher={Elsevier}
}
\ No newline at end of file
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{stmaryrd} % llbracket, rrbracket
\usepackage{siunitx} % SI units
\usepackage{geometry}
\usepackage{charter} % betterfont
\geometry{top=1.5cm,bottom=1.5cm, left=2cm, right=2cm}
\begin{document}
\appendix
\section{Linear constraints to model RNA Structure in a linear integer program}
The constraints have been rewritten by us, but are inspired by works like IPknot, Biokop, and RNA-MoIP.
\paragraph{Extended notations} ~ Here we repeat the definition of the variables that we already used in the article, and we use a few more, that also are defined:\\
Let $n$ be the number of nucleotides in the query RNA sequence $s$.\\
Let $M$ be the set of modules that could be inserted in $s$.\\
Let $x$ be a module of $M$, $\|x\|$ be the number of distinct components of $x$, and $p(x)$ the associated score of insertion given by JAR3D for that motif inserted at a particular position.\\
Let $P_{x,i}$ be the position in $s$ where we can insert the $i$th component of module $x$.\\
As the same module model can be inserted several times in $s$, several different $x$ modules in $M$ may refer to the same theoretical module, but inserted at different positions.\\
Let $k_{x,i}$ be the size in nucleotides of that $i$th component of $x$.\\
Let $y^u_v$ be the \textbf{decision boolean variable} indicating that $s[u]$ and $s[v]$ form a canonical base pairing. According to the standard loop model, we always have $v > u + 3$.\\
Let $C^x_i$ be the \textbf{decision boolean variable} indicating that we do insert the $i$th component of module $x$ at position $P_{x,i}$.
Note that a base pair $y^u_v$ is possible if and only if $v>u+3$, and that we do not need to use two variables $y^u_v$ and $y_{vu}$ for the same pair.
Then, we have $\sum_{i=4}^n (n-i)$ decision variables ($\approx \frac{1}{2}n^2$ decision variables) of the form $y^u_v$.
Regarding the $C^x_i$, if we have an average insertion of $\nu$ motives by RNA sequence, the motives having in average $\mu$ components, components that can be inserted in average at $\pi$ different positions in $s$,
then we need to add, in average, $\nu \times \mu \times \pi$ decision variables $C^x_i$.
Then, we expect having around $\frac{1}{2}n^2+\nu \mu \pi$ decision variables.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{Constraint to ensure there only is 0 or 1 canonical pairing by nucleotide} ~
\begin{equation} \label{constraint:1}
\sum_{v<u} y^v_u + \sum_{v>u} y^u_v \leq 1 \qquad\qquad \forall u \in \llbracket 1,n \rrbracket
\end{equation}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{Constraints to forbid lonely base pairs} ~
% \begin{equation} \label{constraint:2}
% \sum_{v=u}^n y^{u-1}_v - \sum_{v=u+1}^n y^u_v + \sum_{v=u+2}^n y^{u+1}_v \geq 0 \qquad \qquad \forall u \in \llbracket 1,n\rrbracket
% \end{equation}
% \begin{equation} \label{constraint:3}
% \sum_{u=1}^{v-2} y^u_{v-1} - \sum_{u=1}^{v-1} y^u_v + \sum_{u=1}^{v} y^u_{v+1} \geq 0 \qquad \qquad \forall v \in \llbracket 1,n\rrbracket
% \end{equation}
% These conditions ensure that if a base pair exists with $s[i]$,
% one of the adjacent bases is paired too.
% Equation \ref{constraint:2} is useful if $s[u]$ is paired with $s[v>u]$ (a nucleotide later in the sequence),
% and equation \ref{constraint:3} if $s[v]$ is paired with $s[u<v]$ (a nucleotide earlier in the sequence).
\begin{equation} \label{constraint:2}
y^{u-1}_{v+1} - y^u_v + y^{u+1}_{v-1} \geq 0 \qquad \qquad \forall (u,v) \in \{ (u,v) \in \llbracket 1,n\rrbracket^2 \; | \; u + 3 <v \}
\end{equation}
A basepair should be accompanied by one of its neighbours, forming a stable structure stabilized by stacking energies. In theory, this might add up to \( \frac{1}{2}n^2\) constraints, but in practice, this number is very reasonable as
the only decision variables kept are those with probability above a $\theta$ threshold.
Then, this condition sets to zero "lonely decision variables" who have no neighbour basepair variable allowed.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{Constraint to forbid pairings inside a module component} ~
\begin{equation} \label{constraint:4}
(k_{x,i}-2) \; C^x_i + \sum_{u=P_{x,i}+1}^{P_{x,i}+k_{x,i}-2}\left[ \sum_{v>u} y^u_v + \sum_{v<u} y^v_u \right] \leq (k_{x,i} - 2)
\qquad \qquad \forall x \in M, i \in \llbracket 1,\|x\| \rrbracket
\end{equation}
If $C^x_i$ is set to 1, then the sum has to be zero. Obviously, this constraint prevents the program to correctly detect pseudoknots of HHH (kissing hairpins) and LL types (kissing higher-order loops), which is a limit of the approach.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{Constraint to forbid component to overlap} ~
\begin{equation} \label{constraint:5}
\sum_{x \in M} \sum_{i=1}^{\|x\|} C^x_i \times I(P_{x,i}<u<P_{x,i}+k_{x,i}-1) \leq 1 \qquad \qquad \forall u \in \llbracket 1,n \rrbracket
\end{equation}
$I(P_{x,i}<u<P_{x,i}+k_{x,i}-1)$ is a boolean value depending on the condition's truth. Then, whatever the nucleotide $u$, it can be part of a module component only once.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{Constraints to respect the structure of large motives ($\{ x\in M \; | \; \|x\| \geq 2\}$)} ~
This constraint ensures that none or all the components of a motif are inserted.
\begin{equation}\label{constraint:6}
\sum_{i=2}^{\|x\|} C^x_i = (\|x\| - 1) \times C^{x}_{1} \qquad \qquad \forall x \in \{ x\in M \; | \; \|x\| \geq 2\}
\end{equation}
And then, we force base pairs between the end of a component and the beginning of the next one:
\begin{equation}\label{constraint:7}
C^x_1 \leq y^{P_{x,1}}_{P_{x,\|x\|}+k_{x,\|x\|}-1} \qquad \qquad \forall x \in \{ x\in M \; | \; \|x\| \geq 2\}
\end{equation}
\begin{equation}\label{constraint:8}
C^x_j \leq y^{P_{x,j}+k_{x,j}-1}_{P_{x,j+1}} \qquad \qquad \forall x \in \{ x\in M \; | \; \|x\| \geq 2\}, \forall j \in \llbracket 1,\|x\| \llbracket
\end{equation}
Constraint \ref{constraint:7} binds the first nucleotide of first component to the last one of the last component.
Constraint \ref{constraint:8} binds the last nucleotide of component $j$ to the first of component $j+1$.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{Facultative constraint to forbid pseudoknots} ~
\begin{equation}\label{constraint:9}
y^u_v + y^k_l \leq 1 \qquad \qquad \forall u,v,k,l \text{ such as } 1\leq u<k<v<l\leq n
\end{equation}
To limit the number of constraints added, we obviously define the condition for allowed basepairs only ($u + 3 <v$, $k + 3 <l$, $p_{uv} > \theta$, $p_{kl} > \theta$).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{Constraint to forbid a previously found solution} ~
As several solutions may result in the same values of the two objectives, we can't forbid the algorithm to search twice the same region of the objective landscape.
We have to explicitly forbid to find again every found solution.\\
We do it by adding iteratively, for every structure $s^*$ found, the following condition :
\begin{equation}\label{constraint:10}
\sum_{y^u_v \in \{ y^u_v | y^u_v = 1 \text{ in } s^* \}} (1 - y^u_v) + \sum_{y^u_v \in \{ y^u_v | y^u_v = 0 \text{ in } s^* \}} y^u_v +
\sum_{C^x_i \in \{ C^x_i | C^x_i = 1 \text{ in } s^* \}} (1 - C^x_i) + \sum_{C^x_i \in \{ C^x_i |C^x_i = 0 \text{ in } s^* \}} C^x_i \geq 1
\end{equation}
It ensures that at least one of the decision variables differs from $s^*$.
\end{document}
\ No newline at end of file