From 2a452208e556207cec8fb61e5c90f50d7a7d048e Mon Sep 17 00:00:00 2001 From: "J.F.J. Laros" <j.f.j.laros@lumc.nl> Date: Fri, 20 May 2011 17:18:26 +0000 Subject: [PATCH] Added a presentation, added acknowledgements. git-svn-id: https://humgenprojects.lumc.nl/svn/mutalyzer/trunk@279 eb6bd6ab-9ccd-42b9-aceb-e2899b4a52f1 --- doc/API/api.conf | 2 +- .../Makefile | 1 + .../allele.eps | 1 + .../beamerthemelumc.sty | 1 + .../gen2phen_logo.eps | 1 + .../genes.eps | 1 + .../lgtc_logo.eps | 1 + .../lstBNF.tex | 1 + .../lumc_logo.eps | 1 + .../lumc_logo_small.eps | 1 + .../nbic_logo.eps | 1 + .../picture.tex | 1 + .../presentation.tex | 524 ++++++++++++++++++ .../ul_logo.eps | 1 + templates/about.html | 9 + 15 files changed, 546 insertions(+), 1 deletion(-) create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/Makefile create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/allele.eps create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/beamerthemelumc.sty create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/gen2phen_logo.eps create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/genes.eps create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lgtc_logo.eps create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lstBNF.tex create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo.eps create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo_small.eps create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/nbic_logo.eps create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/picture.tex create mode 100644 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/presentation.tex create mode 120000 doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/ul_logo.eps diff --git a/doc/API/api.conf b/doc/API/api.conf index 3b307dd8..48ff9466 100644 --- a/doc/API/api.conf +++ b/doc/API/api.conf @@ -15,7 +15,7 @@ output: pdf # target # The path to the output directory. May be relative or absolute. -target: api/ +target: doc/API/api # docformat # The default markup language for docstrings, for modules that do diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/Makefile b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/Makefile new file mode 120000 index 00000000..90684a51 --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/Makefile @@ -0,0 +1 @@ +/local/projects/presentation/trunk/Makefile \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/allele.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/allele.eps new file mode 120000 index 00000000..d533e4f3 --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/allele.eps @@ -0,0 +1 @@ +../Presentation_05-01-10_Workdiscussion_Mutalyzer2/allele.eps \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/beamerthemelumc.sty b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/beamerthemelumc.sty new file mode 120000 index 00000000..f080c7a5 --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/beamerthemelumc.sty @@ -0,0 +1 @@ +/local/projects/presentation/trunk/beamerthemelumc.sty \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/gen2phen_logo.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/gen2phen_logo.eps new file mode 120000 index 00000000..4d0481a6 --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/gen2phen_logo.eps @@ -0,0 +1 @@ +/local/projects/presentation/trunk/gen2phen_logo.eps \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/genes.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/genes.eps new file mode 120000 index 00000000..eacd26db --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/genes.eps @@ -0,0 +1 @@ +../Presentation_05-01-10_Workdiscussion_Mutalyzer2/genes.eps \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lgtc_logo.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lgtc_logo.eps new file mode 120000 index 00000000..8e90373b --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lgtc_logo.eps @@ -0,0 +1 @@ +/local/projects/presentation/trunk/lgtc_logo.eps \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lstBNF.tex b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lstBNF.tex new file mode 120000 index 00000000..8645ea1c --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lstBNF.tex @@ -0,0 +1 @@ +../Presentation_24-02-11_HumGen_Mutalyzer2/lstBNF.tex \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo.eps new file mode 120000 index 00000000..e9937f89 --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo.eps @@ -0,0 +1 @@ +/local/projects/presentation/trunk/lumc_logo.eps \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo_small.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo_small.eps new file mode 120000 index 00000000..290da08d --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/lumc_logo_small.eps @@ -0,0 +1 @@ +/local/projects/presentation/trunk/lumc_logo_small.eps \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/nbic_logo.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/nbic_logo.eps new file mode 120000 index 00000000..fcde8c20 --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/nbic_logo.eps @@ -0,0 +1 @@ +/local/projects/presentation/trunk/nbic_logo.eps \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/picture.tex b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/picture.tex new file mode 120000 index 00000000..eeed7e47 --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/picture.tex @@ -0,0 +1 @@ +../Presentation_24-02-11_HumGen_Mutalyzer2/picture.tex \ No newline at end of file diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/presentation.tex b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/presentation.tex new file mode 100644 index 00000000..2907b0ed --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/presentation.tex @@ -0,0 +1,524 @@ +\documentclass[slidestop]{beamer} + +\title{Project planning} +\providecommand{\myConference}{NBIC BioAssist meeting} +\providecommand{\myDate}{Friday, 20 May 2011} +\author{Jeroen F. J. Laros} +\providecommand{\myGroup}{Leiden Genome Technology Center} +\providecommand{\myDepartment}{Department of Human Genetics} +\providecommand{\myCenter}{Center for Human and Clinical Genetics} +\providecommand{\lastCenterLogo}{ + \raisebox{-0.1cm}{ + \includegraphics[scale = 0.055]{lgtc_logo} + } +} +\providecommand{\lastRightLogo}{ + \includegraphics[scale = 0.1]{nbic_logo} +} + +\usetheme{lumc} + +\input{lstBNF.tex} +\input{picture.tex} +\setlength{\unitlength}{1pt} + +\begin{document} + +% This disables the \pause command, handy in the editing phase. +%\renewcommand{\pause}{} + +% Make the title page. +\bodytemplate + +% First page of the presentation. +\section{Introduction} +\begin{frame} + Common approaches: + \begin{itemize} + \item Just start. + \item Make sure the simple things work, the rest comes later. + \end{itemize} + \bigskip + \pause + + However, it is likely that: + \begin{itemize} + \item Specific cases are solved, not parts of the problem. + \item Unscalable solution are made. + \item Unmaintainable solution are made. + \item Lots of time is spent on rewriting. + \begin{itemize} + \item Or worse, a stack of exceptions is made. + \end{itemize} + \item More time than needed is wasted. + \end{itemize} + \bigskip + \pause + + Software needs to be \emph{designed}. +\end{frame} + +\begin{frame} + Mutalyzer: a curational tool for \emph{Locus Specific Mutation Databases} + (LSDBs). + + \bigskip + \begin{itemize} + \pause + \item Variant nomenclature checker applying \emph{Human Genome Variation + Society} (HGVS) guidelines. + \begin{itemize} + \item Is the syntax of the variant description valid? + \item Does the reference sequence exist? + \item Is the variant possible on this reference sequence? + \item Is this variant description the recommended one? + \end{itemize} + \pause + \item Basic effect prediction. + \begin{itemize} + \item Is the description of the transcript product as expected? + \item Is the predicted protein as expected? + \end{itemize} + \end{itemize} +\end{frame} + +\section{HGVS nomenclature} +\begin{frame} + \emph{Genomic} orientated positions: + \begin{center} + \bt{AL449423.14:g.[65449\_65463del;65564\color{yellow}T\color{white}>\color{yellow}C\color{white}]} + \end{center} + \pause + \bigskip + \emph{Coding sequence} orientated positions: + \begin{center} + \bt{AL449423.14(CDKN2A\_v001):c.[5\color{yellow}A\color{white}>\color{yellow}G\color{white} + ;106\_120del]} + \end{center} + \bigskip + \pause + \begin{itemize} + \item \bt{AL449423.14} -- reference sequence. + \item \bt{CDKN2A\_v001}$\;$ -- transcript variant \bt{1} of gene CDKN2A. + \item \bt{c.[5\color{yellow}A\color{white}>\color{yellow}G\color{white};106\_120del]} + \begin{itemize} + \item A \emph{substitution} at position \bt{5} counting from the start + codon. + \item A \emph{deletion} from position \bt{106} to position \bt{120}. + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame} + \positionpicture + + \renewcommand{\arraystretch}{1} + \begin{center} + \begin{tabular}{l|r|r|r} + Name & \bt{g.} & \bt{n.} & \bt{c.} \\ + \hline + {\scriptsize Genomic start} & \bt{1} & \bt{100+d70} & + \bt{*10+d70} \\ + {\scriptsize Genomic end} & \bt{300} & \bt{1-u50} & + \bt{-30-u50} \\ + {\scriptsize Transcription start} & \bt{250} & \bt{1} & \bt{-30} \\ + {\scriptsize Transcription end} & \bt{70} & \bt{100} & \bt{*10} \\ + {\scriptsize CDS start} & \bt{220} & \bt{30} & \bt{1} \\ + {\scriptsize CDS stop} & \bt{80} & \bt{90} & \bt{60} \\ + \end{tabular} + \end{center} +\end{frame} + +\begin{frame} + \positionpicture + + \bt{c.} positions: + \bigskip + \begin{itemize} + \item Positions in introns are relative to the nearest exonic position. + \item Positions before the CDS are indicated with a \bt{-} sign. + \item Positions after the CDS are indicated with a \bt{*} sign. + \end{itemize} + + \pause + \bigskip + Position \bt{-1} and \bt{1} are adjacent. + + If \bt{60} is the last position of the CDS, then \bt{60} and \bt{*1} are + adjacent. +\end{frame} + +\section{Mutalyzer 1.0.4} +\begin{frame} + Organic growth: + \begin{itemize} + \item Developed in over four years by multiple people. + \item Originally a command line program. + \item Web interface added later. + \begin{itemize} + \item PHP scripts that call (exec) a python program. + \end{itemize} + \end{itemize} + \bigskip + \pause + + Design flaws: + \begin{itemize} + \item Nomenclature rules interwoven with the code. + \item HTML output interwoven with the code. + \item No modularity (reuse of code is very hard). + \item Reference sequence parsing not abstracted + \begin{itemize} + \item Support for other reference sequences nearly impossible. + \end{itemize} + \item Nomenclature was not analysed / formalised. + \begin{itemize} + \item Regular expressions directly in code. + \item Virtually impossible to change (or read). + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame} + Implementation flaws: + \begin{itemize} + \item Inheritance of types (delins on DNA $\Rightarrow$ delins on protein). + \item Disambiguation not general. + \item No support of up- / downstream exons. + \item Nothing was ever redesigned, only wrapped in loops. + \begin{itemize} + \item Debugging, altering code made impossible. + \item Speed drastically diminished. + \end{itemize} + \end{itemize} + \bigskip + \pause + + Programming flaws: + \begin{itemize} + \item Excessive usage of exceptions. + \item Incomprehensible error messages. + \item Virtually no inline comment. + \item Non existent documentation (apart from the user manual). + \end{itemize} +\end{frame} + +\begin{frame} + Feature requests: + \begin{itemize} + \item Solving all mentioned problems. + \item \color<2>{yellow}{Support for other reference files (LRG).} + \item \color<2>{yellow}{Programmatic access to internal functions.} + \item \color<2>{yellow}{Extension of HGVS nomenclature rules.} + \end{itemize} + \bigskip + \pause + + Especially since: + \begin{itemize} + \item Interwoven nomenclature. + \item Interwoven interface. + \item Lack of documentation. + \end{itemize} + \bigskip + \pause + + Throw away four years of work and start again. +\end{frame} + +\section{Preparing for version 2.0} +\begin{frame} + Preparations for a new version: + \begin{itemize} + \item Setting up two version control repositories. + \item Gathering all old versions and putting then under version control. + \begin{itemize} + \item Critical bugfixes until there is a new version. + \item Easy to search and track changes. + \item Point of reference for the new version. + \end{itemize} + \item Set up bugtracking systems. + \pause + \item Talking for months. + \begin{itemize} + \item Figuring out what the HGVS language is. + \item Formalising that language (BNF). + \item Semantic rules. + \end{itemize} + \item Identify and implement functional modules. + \item Designing interfaces (web (TAL), webservice, command line, \ldots). + \item Documentation (API (epydoc), TRM, User manual, \ldots). + \end{itemize} +\end{frame} + +\begin{frame} + Although the complexity might seem low at first glance\ldots + \bigskip + + Non-trivial problems can be found: + \begin{itemize} + \item Position systems. + \begin{itemize} + \item Reference sequence related peculiarities. + \end{itemize} + \item \only<2>{\color{yellow}}The HGVS nomenclature.\only<2>{\color{white}} + \item Parsing reference sequence files and their annotation. + \begin{itemize} + \item Keeping the option open for other formats (LRG). + \end{itemize} + \item Keeping track of positions after mutation. + \item \ldots + \end{itemize} +\end{frame} + +\section{HGVS parser} +\begin{frame} + The previous versions used \emph{regular expressions} for input parsing. + \begin{itemize} + \item The HGVS nomenclature turns out to be a \emph{context free} language. + \begin{itemize} + \item Strictly stronger than regular language. + \item Can not be parsed with a finite automaton. + \item No regular expressions. + \end{itemize} + \item The semantics of the HGVS is even more complex than the syntax. + \end{itemize} + \bigskip + \pause + + These observations remind us of \emph{compiler construction}. + \begin{itemize} + \item We need a context free parser. + \item A parse tree must be generated. + \item And then there is the semantic checking. + \begin{itemize} + \item This should be the real focus of the project, the rest can be + solved with existing techniques. + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + Definition of a gene symbol. + \begin{lstlisting}[language = BNF, caption = {Abstract HGVS nomenclature}] + TransVar -> `_v' Number + ProtIso -> `_i' Number + GeneSymbol -> `(' Name (TransVar | ProtIso)? `)' + \end{lstlisting} + + Gene name and optionally a transcript or isoform number. + \bigskip + \bigskip + \bigskip + \pause + + \begin{lstlisting}[caption = {HGVS nomenclature in Python}] + TransVar = Suppress("_v") + Number("TransVar") + ProtIso = Suppress("_i") + Number("ProtIso") + GeneSymbol = Suppress('(') + \ + Group(Name("GeneSymbol") + \ + Optional(TransVar ^ ProtIso))("Gene") + \ + Suppress(')') + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + After parsing, a nested python object (parse tree) is generated: + \bigskip + \pause + + The generated object of \bt{(CDKN2A\_v001)}: + \begin{lstlisting}[caption = {Python object}] + Gene.GeneSymbol = CDKN2A + Gene.TransVar = 001 + \end{lstlisting} + \bigskip + \pause + + Complete BNF consists of $63$ production rules. + \bigskip + \medskip + \pause + + \emph{ + A formalized description of the standard human variant nomenclature will + improve sequence variant recognition in databases and literature. + } + \vspace{0.1cm} + + \scriptsize{ + Jeroen F. J. Laros$^1$, Andr\'e Blavier$^2$, Johan T. den Dunnen$^1$, + Peter E. M. Taschner$^1$ + } + \vspace{0.1cm} + + \tiny{ + $^1$ Department of Human Genetics, Center for Human and Clinical Genetics, + Leiden University Medical Center, Leiden, Nederland + \vspace{-0.2cm} + + $^2$ Interactive Biosoftware, Rouen, France + } +\end{frame} + +\section{Interfaces} +\begin{frame} + + \begin{tabular}{l@{\ \ -\ \ }l} + Name checker & Full nomenclature / semantic check.\\ + Syntax checker & Only nomenclature check.\\ + Position converter & Mapping, lifting over (build / transcripts).\\ + SNP converter & DbSNP rsId to HGVS.\\ + Name generator & Point and click to make a description.\\ + GenBank Uploader & Custom reference sequences. + \end{tabular} + \pause + \bigskip + + Bulk / RPC interfaces: + \begin{itemize} + \item Upload a table (CSV, Excel, Open Office Spreadsheet): + \begin{itemize} + \item Name checker. + \item Name checker. + \item Syntax checker. + \item Position converter. + \item SNP converter. + \end{itemize} + \item Webservices (SOAP). + \begin{itemize} + \item $18$ functions available. + \end{itemize} + \end{itemize} +\end{frame} + +\section{Components} +\begin{frame} + \only<2->{\color{gray}} + \begin{tabular}{l@{\ \ -\ \ }l} + \color<2,3,4,5,7>{white}{Config} & Parsing config file.\\ + \color<2,4>{white}{Crossmap} & Position conversions.\\ + \color<2,4,7>{white}{Db} & Mapping, linking, queues, caching info.\\ + \color<0,8>{white}{File} & CSV, Excel, OpenOffice tables.\\ + \color<2,7>{white}{GenRecord} & Abstraction of annotated reference sequences.\\ + \color<2,7>{white}{GBparser} & Instance of GenRecord (GenBank files).\\ + \color<2>{white}{LRGparser} & Instance of GenRecord (LRG files).\\ + \color<2,7>{white}{Misc} & \\ + \color<2>{white}{Mutator} & Modify the reference sequence and annotation.\\ + \color<2,3,4,5,6,7>{white}{Output} & Communication with the interfaces.\\ + \color<2,3,4>{white}{Parser} & HGVS nomenclature parser.\\ + \color<2,5,7>{white}{Retriever} & Retrieve / cache reference sequences.\\ + \color<8>{white}{Scheduler} & Batch jobs scheduler.\\ + \color<9>{white}{Serializers} & SOAP definitions of complex objects. + \end{tabular} + \only<2->{\color{white}} + + \begin{center} + \only<2>{Name checker.} + \only<3>{Syntax checker.} + \only<4>{Position converter.} + \only<5>{SNP converter.} + \only<6>{Name generator.} + \only<7>{GenBank Uploader.} + \only<8>{Added when using a batch interface.} + \only<9>{Added when using webservices.} + \end{center} +\end{frame} + +\section{Comparison to the old version} +\begin{frame} + \begin{figure} + \colorbox{white} { + \includegraphics[scale = 0.65]{genes} + } + \caption{Runtime comparison} + \end{figure} + \vspace{-0.5cm} + A $229\times$ speedup was measured ($12min$ to $3s$). +\end{frame} + +\begin{frame} + \begin{figure} + \colorbox{white} { + \includegraphics[scale = 0.65]{allele} + } + \caption{Scalability} + \end{figure} + \vspace{-0.5cm} + Overhead ($\pm 2.5s$): loading the reference sequence. +\end{frame} + +\begin{frame} + Special focus on documentation. + + \begin{table} + \begin{tabular}{l|l|l} + & 2.0 & 1.0.4 \\ + \hline + User manual & $12$ pages & $12$ pages \\ + TRM & $31$ pages & $-$ \\ + API documentation & $215$ pages & $-$ \\ + Total size & $493,\!816$ bytes & $367,\!836$ bytes \\ + Code & $198,\!512$ bytes & $245,\!677$ bytes \\ + Comment & $60\%$ & $33\%^*$ \\ + Development time & $<1$ year & $>4$ years + \end{tabular} + \caption{Other characteristics.} + \end{table} + + $^*$ Mostly discarded code. +\end{frame} + +\section{Conclusions} +\begin{frame} + Things to keep in mind: + \pause + + \begin{itemize} + \item Do not get tempted to implement small exceptions. + \pause + \item Make a design. + \begin{itemize} + \item Requirements will change in the future. + \item Make your design capable to deal with these changes. + \end{itemize} + \item If requirements change, go back to your design. + \pause + \item Document everything. + \begin{itemize} + \item Especially your code. + \end{itemize} + \pause + \item Use a version control system. + \end{itemize} + \bigskip + \pause + + Think before you start. +\end{frame} + +\section{Questions?} +\lastpagetemplate +\begin{frame} + \begin{center} + Acknowledgements: + \bigskip + \bigskip + + Martijn Vermaat\\ + Gerben Stouten\\ + Andr\'e Blavier\\ + Gerard Schaafsma\\ + Ivo Fokkema\\ + Jacopo Celli\\ + Peter Taschner\\ + Johan den Dunnen + \bigskip + \bigskip + \bigskip + + \bt{http://www.mutalyzer.nl/} + \end{center} +\end{frame} + +\end{document} diff --git a/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/ul_logo.eps b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/ul_logo.eps new file mode 120000 index 00000000..d49aa2da --- /dev/null +++ b/doc/Presentation_20-05-11_Utrecht_Mutalyzer2_project/ul_logo.eps @@ -0,0 +1 @@ +/local/projects/presentation/trunk/ul_logo.eps \ No newline at end of file diff --git a/templates/about.html b/templates/about.html index 4e2c70cb..185d818f 100644 --- a/templates/about.html +++ b/templates/about.html @@ -18,6 +18,15 @@ <li>Development of several smaller features and maintenance programming is done by Martijn Vermaat.</li> </ul> + Furthermore we would like to thank the following people for their + valuable work on previous versions that acted as a guideline for the + development of the current version: + <ul> + <li>Martin Wildeman.</li> + <li>Ernest van Ophuizen.</li> + <li>Corinne Bareil.</li> + <li>Gerben R. Stouten.</li> + </ul> Specifications are given by Peter E. M. Taschner and Johan T. den Dunnen.<br> <br> -- GitLab