29 January 2006

Past projects (IV)

One day I found a book about 'genetic programming' in a colleague's office and I wondered if I could use this (the answer was no) to discover a mathematical way how to describe the signal from BAC clones spotted on a CGH array. Note that 'genetic programming' is different from 'genetic algorithms': in the first one there is a mathematical function which evolve whereas this is a popolulation of data in the second one. See http://www.geneticprogramming.com/Tutorial/ for a tutorial about Genetic Programming.


Two different types of mutations
(from http://www.geneticprogramming.com/Tutorial/).


So I wrote a C++ program that took as input a table of result, a list of expected number and I trained a mathematical function to evolve with those data:



This SVG figure shows nine steps of the evolution process. In each setp, on the X axis are displayed the expected values and the experimental values (calculated from the evolving methematical function) are on the Y axis. The program stopped when a defined fitness was reached. Fun to write.

Past Projects (III)

Rotaplotype was a java program asked by my former thesis master Dr D Poncet in order to find and visalize compensatory co-mutations in multiple rotavirus aligned genomes. The program called Rotaplotype took as input a set of rotavirus sequence aligned with clustalw and optionaly a RNAML-based description of the secondary structure of one viral RNA fragment.

Rotaplotype

  • on the top-left pane is displayed each co-mutation found in the alignments.
  • on the top-right pane is displayed the position of the two mutations in the structure (may be of interest if the two mutations are localized in the same hairpin)
  • on bottom are displayed the context of the two mutation for each sequence aligned by clustalw.


... not sure Dr Poncet discovered the deep secrets of the universe with this small tool ;-).

28 January 2006

The Photograph



' want to discover European comics ? Get the third part of "The Photograph" wrote by Guibert & al. that was released this week !


Patent

Today I received a confirmation letter from the European Patent Office about a method called 'CloneTrek' I created at Integragen used to select BAC clones for DNA chips.

<? lang='fr' ?>METHODES DE PREPARATION DE PUCES GENETIQUES ET UTILISATIONS
La présente demande concerne des méthodes et compositions pour la production de biopuces, ainsi que l'utilisation de ces biopuces dans des domaines variés, de la génomique fonctionnelle au diagnostic par exemple, notamment en recherche ou dans le domaine médical. Elle concerne également des outils et procédés de sélection de polynucléotides, permettant la production de Biopuces améliorées. Les biopuces de l'invention comprennent notamment des clones BAC.

Classification CIB1-7 principale :
C12Q-001/68
Classification CIB1-7 secondaire :
G01N-033/53 G06F-019/00
Classification CIB1-7 additionnelle :
G06F-159:00

Literature mining for the biologist in Nature Reviews Genetics

Lars Juhl Jensen & al. wrote a great review about Literature mining in Nature Reviews Genetics. There are many links and many references about algorithms, hypothesis generation and biological discovery.



Dr Jensen said :
"Due to popular request, I have also compiled two zip archives with additional reprints in case you are interested:

http://www.bork.embl-heidelberg.de/Docu/literature_mining/bork_reprints.zip
http://www.bork.embl-heidelberg.de/Docu/literature_mining/selected_reprints.zip

The former contains all literature mining papers published by the Peer Bork's group. The latter archive contains the papers highlighted in the bibliography of the review (with the exception of one for which I unfortunately have not been able to obtain a PDF file)."


23 January 2006

Nemester: antisocial network

Here is a new online community: Nemester The new way to make enemies !


Nemester is an online community that connects paranoids, egotists, villains, and monomaniacs through networks of competing agendas and incompatable ideologies for bitter conflicts, mutual loathing, or to find their one, true nemesis...


Annozilla

Today I tested annozilla, a Firefox extension used to create and share annotations about web sites. Installation of the extension for firefox 1.5 was really fast and simple. Then you need a server that will store your annotations. The w3c provides a free one for testing at http://annotest.w3.org/access.

.

I'm still missing some points: how can I add a new type of annotation (comment, explanation,example, but I'd like to see cellular component, interaction, etc...). Moreover, an annotation is a free-text (with HTML) which may be also hard to analyse...

19 January 2006

MyFOAFExplorer: browse your FOAF network

I'm pleased to introduce my new java applet called MyFOAFExplorer available at http://www.urbigene.com/foafexplorer/.



The FOAF project defines a semantic format based on RDF/XML to define persons or groups, their relationships, as well as their basic properties such as name, e-mail address, subjects of interest , publication, and so on... MyFOAFExplorer was created after SciFOAF in order to browse a scientific network, its publications, its laboratories,... The
program is an applet (JAVA 1.5 is required) that takes as an input a FOAF file. The applet can be downloaded and used for your laboratoy/social network to introduce your staff, your publications,...


The code does not contain a compliant RDF parser (such as JENA), but the way it parses the XML worked fine for my test, so it could be used as a framework to write your own FOAF file.

.


17 January 2006

Past Projects (II)

After my PhD, I spent one year at the National Center of Genotyping based at Evry in the mass spectrometry team directed by Ivo Gut. The method for genotyping, called the GOOD-Assay used a primer extension of one base followed by a MALDI-TOF mass spectrometry, in multiplex.

c est moi qui l ai fait !


Here, I created a tool called SnipMachine used to find the best primers for this test according to the possible masses, the steric problems, the self/inter hybridization, etc... Here is an output.
strategy 1/10
-------------
primer-list
-----------
copyprimer index("0")
---------------------
Deletion 25-26
SNP at position 25 ( can be 'A' 'C' 5'->3' )
------------------------------------------------
if base base is "A" then mass ="1463"
if base base is "C" then mass ="1439"

mass-without-elongation : 1136
sequence-name : untitled sequence
orientation : Forward
size : 22
Tm : 69.8107
charge-tag : on base="A" mass="0" name="tag1"
sequence
--------
5' GTAATCGATCGTAGCTAGCTaA 3'
copyprimer index("1")
---------------------
SNP at position 30 ( can be 'C' 'G' 5'->3' )
------------------------------------------------
if base base is "C" then mass ="1483"
if base base is "G" then mass ="1523"

mass-without-elongation : 1180
sequence-name : untitled sequence
orientation : Reverse
size : 20
Tm : 71.1841
charge-tag : on base="A" mass="28" name="tag2"
sequence
--------
5' AGTCAGCACTGAGCTACGaT 3'
copyprimer index("2")
---------------------
SNP at position 9 ( can be 'A' 'C' 'G' 'T' 5'->3' )
-------------------------------------------------------
if base base is "A" then mass ="1479"
if base base is "C" then mass ="1455"
if base base is "G" then mass ="1495"
if base base is "T" then mass ="1470"

mass-without-elongation : 1152
sequence-name : untitled sequence
orientation : Reverse
size : 22
Tm : 71.8038
charge-tag : on base="G" mass="0" name="tag1"
sequence
--------
5' CAGTACGTACGATAGCTGATgA 3'

Spectrogram
-----------
|
|___ mass:1136 snp:0 (no elongation) seq:untitled sequence
|
|___ mass:1152 snp:2 (no elongation) seq:untitled sequence (+ 16)
|
|___ mass:1180 snp:1 (no elongation) seq:untitled sequence (+ 28)
|
|___ mass:1439 snp:0 base:C seq:untitled sequence (+ 259)
|
|___ mass:1455 snp:2 base:C seq:untitled sequence (+ 16)
|
|___ mass:1463 snp:0 base:A seq:untitled sequence (+ 8)
|
|___ mass:1470 snp:2 base:T seq:untitled sequence (+ 7)
|
|___ mass:1479 snp:2 base:A seq:untitled sequence (+ 9)
|
|___ mass:1483 snp:1 base:C seq:untitled sequence (+ 4)
|
|___ mass:1495 snp:2 base:G seq:untitled sequence (+ 12)
|
|___ mass:1523 snp:1 base:G seq:untitled sequence (+ 28)
|

melting-temperatures
--------------------
|
|___ Tm:=69.8107 SNP:=0 on sequence:=untitled sequence
|
|___ Tm:=71.1841 SNP:=1 on sequence:=untitled sequence( +1.37339)
|
|___ Tm:=71.8038 SNP:=2 on sequence:=untitled sequence( +0.61974)
|

sequences
---------
sequence:untitled sequence (63)
-------------------------------
ATCGTAATCGATCGTAGCTAGCTAActAGCsATCGTAGCTCAGTGCTGACTGACTCATCAGCT
*******************-=-> <-=-*****************
sequence:untitled sequence (45)
-------------------------------
ATCGTAATCnTCATCAGCTATCGTACGTACTGATCGATCGATCGT
<-=-*******************

Past projects (I)

I've done my thesis at the INRA of Jouy-en-Josas with Dr Didier Poncet. During this time I spent a lot of time in finding strategies to create in-frame deletion in plasmids in order to create truncated proteins of the Rotavirus NSP3 protein. I looked after a software to to this job but as I couldn't find any, I learned C and I wrote this tool. And as the main functions were created, I extended it in order to find sub-cloning strategies using restriction enzymes, phosphatase (to avoid recircularization) et DNA polymerases (to make 'blunt' ends).



The tool called CloneIt was published in bioinformatics and was then installed as a web application on the INRA server in 1988. I don't know if it still works.




15 January 2006

Geography & H5N1

Many sites about H5N1 talks about this : Declan Butler from Nature wrote a google-earh map of the avian flu pandemy. The result is really interesting.

By the way, you can also locate your papers (e.g. about epidemiology) using connotea.

11 January 2006

Drawing pedigrees.

At Integragen, we are working on genetic diseases using a large collection of individuals. Pedigrees are stored using a simple recursive SQL table:

+--------------+--------------+------+-----+------------+
| Field | Type | Null | Key | Default |
+--------------+--------------+------+-----+------------+
| id | int(11) | | PRI | NULL |
| father | int(11) | YES | MUL | NULL |
| mother | int(11) | YES | MUL | NULL |
| svgX | int(5) | YES | | NULL |
| svgY | int(5) | YES | | NULL |
(...)
+--------------+--------------+------+-----+------------+

Although a colleague of mine wrote a paper about the art of drawing pedigrees, I wondered if I could use Graphviz/Dot in order to build the family trees. Using a SQL query transformed into DOT with awk, I was able to parse the X and Y positions generated by dot and to update my database. As those x/y coordinates are now in the tables, drawing the pedigrees in SVG is now easy.



09 January 2006

Firefox, XUL, SVG, XSLT & Genbank

This WE I played with XUL and Firefox 1.5. This last version of firefox allows to write SVG (a XML-based vectorial drawing format) within the html code (see http://developer.mozilla.org/en/docs/SVG_In_HTML_Introduction) I wondered if it was possible to display the features of a genbank sequence as SVG into a XUL window.

The result is displayed below:



I still had problems with the XUL layout and I was not able to display more than one tabpanel (the others were frozen). But creating such image on the fly could be great way to display interaction genomic maps. As an example, the UCSC genome browser (aka golden path) might use this system to display its tracks and make it interactive.

Updated 2010-08-12

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:h="http://www.w3.org/TR/REC-html40"
>
<!--
author : Pierre Lindenbaum PhD
blog: http://plindenbaum.blogspot.com
mail: plindenbaum [ A T ] yahoo.fr
date: 2006
desc: transform a genbank/XML file into html+svg
-->
<xsl:param name="screen-width">100</xsl:param>
<xsl:param name="seq-height">12</xsl:param>
<xsl:output
method="xml"
version="1.0"
encoding="UTF-8"
indent="yes"
/>


<xsl:template match="/">
<xul:window
id="findfile-window"
title="Find Files"
orient="horizontal"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<xsl:apply-templates/>
</xul:window>
</xsl:template>

<xsl:template match="GBSet">
<xul:tabbox flex="1">
<xul:tabs >
<xsl:for-each select="GBSeq">
<xsl:element name="xul:tab">
<xsl:attribute name="id"><xsl:value-of select="generate-id(.)"/></xsl:attribute>
<xsl:attribute name="label"><xsl:value-of select="GBSeq_locus"/></xsl:attribute>
</xsl:element>
</xsl:for-each>
</xul:tabs>
<xul:tabpanels flex="1">

<xsl:for-each select="GBSeq">
<xul:tabpanel flex="1" id="searchpanel">
<xul:vbox flex="1">
<xul:hbox flex="1">
<xsl:apply-templates select="GBSeq_references"/>
</xul:hbox>
<xul:hbox flex="1">
<xul:iframe id="pubmed-iframe" src="about:blank" flex="1" style="overflow : auto; width : 30px; height : 300px; border:1px solid blue;"/>
<xul:box flex="1" style="overflow : auto; width : 30px; height : 300px; border:1px solid blue;">

<xsl:element name="svg:svg">
<xsl:attribute name="xul:flex">1</xsl:attribute>
<xsl:attribute name="width"><xsl:value-of select="2*$screen-width"/>+500</xsl:attribute>
<xsl:attribute name="height"><xsl:value-of select="count(GBSeq_feature-table/GBFeature)*20+5"/></xsl:attribute>
<xsl:attribute name="stroke">black</xsl:attribute>
<svg:g>
<svg:defs>
<svg:linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="metal">
<svg:stop offset="5%" stop-color="black" />
<svg:stop offset="50%" stop-color="whitesmoke" />
<svg:stop offset="95%" stop-color="black" />
</svg:linearGradient>
<svg:filter id="MyFilter" filterUnits="userSpaceOnUse" x="0%" y="0%" width="100%" height="100%">
<svg:feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
<svg:feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>
<svg:feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75"
specularExponent="20" lighting-color="lightgray"
result="specOut">
<svg:fePointLight x="-5000" y="-10000" z="20000"/>
</svg:feSpecularLighting>
<svg:feComposite in="specOut" in2="SourceAlpha" operator="in" result="specOut"/>
<svg:feComposite in="SourceGraphic" in2="specOut" operator="arithmetic"
k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
<svg:feMerge>
<svg:feMergeNode in="offsetBlur"/>
<svg:feMergeNode in="litPaint"/>
</svg:feMerge>
</svg:filter>

</svg:defs>
<svg:g fill="red">
<xsl:call-template name="rect">
<xsl:with-param name="sequence-size" select="GBSeq_length" />
<xsl:with-param name="label" select="GBSeq_definition" />
<xsl:with-param name="x0" select="0" />
<xsl:with-param name="x1" select="GBSeq_length" />
</xsl:call-template>
<xsl:apply-templates select="GBSeq_feature-table" />
</svg:g>
</svg:g>
</xsl:element>

</xul:box>
</xul:hbox>
</xul:vbox>
</xul:tabpanel>
</xsl:for-each>

</xul:tabpanels>
</xul:tabbox>
</xsl:template>



<xsl:template match="GBSeq_references">
<xsl:element name="xul:tree">
<xsl:attribute name="flex">1</xsl:attribute>
<xsl:attribute name="enableColumnDrag">true</xsl:attribute>
<xsl:attribute name="onselect">var iframe= document.getElementById(&apos;pubmed-iframe&apos;);
if(iframe==null) { alert(&apos;cannot find iframe!&apos;); return;}
switch(this.currentIndex+1)
{
<xsl:for-each select="GBReference">
case <xsl:value-of select="position()"/>:
iframe.setAttribute(&apos;src&apos;,&apos;http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&amp;db=pubmed&amp;dopt=Abstract&amp;query_hl=1&amp;list_uids=<xsl:value-of select="GBReference_pubmed"/>&apos;);
break;
</xsl:for-each>
default: iframe.setAttribute(&apos;src&apos;,&apos;about:blank&apos;);
break;
}
</xsl:attribute>
<xul:treecols>
<xul:treecol id="1" label="PMID" flex="1"/>
<xul:treecol id="3" label="Title" flex="1"/>
<xul:treecol id="4" label="Reference" flex="1"/>
<xul:treecol id="5" label="Authors" flex="1"/>
<xul:treecol id="6" label="Remarks" flex="2"/>
</xul:treecols>
<xul:treechildren >
<xsl:for-each select="GBReference">
<xul:treeitem>
<xul:treerow flex="1">
<xsl:element name="xul:treecell">
<xsl:attribute name="label">
<xsl:value-of select="GBReference_pubmed"/>
</xsl:attribute>
</xsl:element>


<xsl:element name="xul:treecell">
<xsl:attribute name="label">
<xsl:value-of select="GBReference_title"/>
</xsl:attribute>
</xsl:element>

<xsl:element name="xul:treecell">
<xsl:attribute name="label">
<xsl:value-of select="GBReference_journal"/>
</xsl:attribute>
</xsl:element>


<xsl:element name="xul:treecell">
<xsl:attribute name="label">
<xsl:for-each select="GBReference_authors/GBAuthor">
<xsl:value-of select="."/><xsl:text> </xsl:text>
</xsl:for-each>
</xsl:attribute>
</xsl:element>


<xsl:element name="xul:treecell">
<xsl:attribute name="label">
<xsl:value-of select="GBReference_remark"/>
</xsl:attribute>
</xsl:element>


</xul:treerow>
</xul:treeitem>
</xsl:for-each>
</xul:treechildren>
</xsl:element>
</xsl:template>

<xsl:template match="GBSeq_feature-table">
<xsl:apply-templates match="GBFeature" />
</xsl:template>


<xsl:template match="GBFeature">
<xsl:apply-templates select="GBFeature_intervals" />
</xsl:template>

<xsl:template match="GBFeature_intervals">
<xsl:apply-templates select="GBInterval" />
</xsl:template>

<xsl:template match="GBInterval">
<xsl:if test="GBInterval_from">
<xsl:call-template name="rect">
<xsl:with-param name="x0" select="GBInterval_from" />
<xsl:with-param name="x1" select="GBInterval_to" />
<xsl:with-param name="y" select="30+(count(../../preceding-sibling::*))*20" />
<xsl:with-param name="sequence-size" select="../../../../GBSeq_length" />
<xsl:with-param name="label" select="../../GBFeature_key" />
</xsl:call-template>
</xsl:if>

<xsl:if test="GBInterval_point">
<xsl:call-template name="rect">
<xsl:with-param name="x0" select="GBInterval_point" />
<xsl:with-param name="x1" select="GBInterval_point" />
<xsl:with-param name="y" select="30+(count(../../preceding-sibling::*))*20" />
<xsl:with-param name="sequence-size" select="../../../../GBSeq_length" />
<xsl:with-param name="label" select="../../GBFeature_key" />
</xsl:call-template>
</xsl:if>

</xsl:template>





<xsl:template name="rect">
<xsl:param name="x0" select="0" />
<xsl:param name="y" select="0" />
<xsl:param name="x1" select="0" />
<xsl:param name="label" />
<xsl:param name="height" select="10" />
<xsl:param name="sequence-size" />
<xsl:param name="i0" select="($x0 div $sequence-size)* $screen-width" />
<xsl:param name="width" select="(($x1 div $sequence-size)* $screen-width)-$i0" />
<xsl:param name="y2" select="$y+12" />
<xsl:if test="$i0 &gt;= 0">
<xsl:element name="svg:rect">
<xsl:attribute name="x"><xsl:value-of select="$i0"/></xsl:attribute>
<xsl:attribute name="y"><xsl:value-of select="$y"/></xsl:attribute>
<xsl:attribute name="width"><xsl:value-of select="1+$width"/></xsl:attribute>
<xsl:attribute name="height"><xsl:value-of select="$height"/></xsl:attribute>
<xsl:attribute name="fill">url(#metal)</xsl:attribute>
<xsl:attribute name="stroke">black</xsl:attribute>
<xsl:attribute name="filter">url(#MyFilter)</xsl:attribute>
</xsl:element>
</xsl:if>

<xsl:element name="svg:text">
<xsl:attribute name="stroke">blue</xsl:attribute>
<xsl:attribute name="x"><xsl:value-of select="$screen-width+10"/></xsl:attribute>
<xsl:attribute name="y"><xsl:value-of select="$y2"/></xsl:attribute>
<xsl:value-of select="$x0"/> -&gt;<xsl:value-of select="$x1"/> : <xsl:value-of select="$label"/>
</xsl:element>
</xsl:template>


</xsl:stylesheet>


06 January 2006

H5N1:...and it will kill us all.

I found this on Flickr:

H5N1


Social Bookmarking Synchronization

I had a short discussion with Richard Cameron and Ted Kandell about how to switch from Connotea to CiteULike. Connotea can export RIS or RDF and CiteUlike imports BibTex. So I wrote a XSLT stylesheet(see below) to generate the BibTex file and imported my ~600 bookmarks from connotea (see here). Results: all my bookmarks where added but the orginal URL use a DOI identifier (instead of the pumed URL or the , so I cannot find related users share my interests. Well that was a try. At this time, I keep using Connotea although CiteULike also have nice features (it stores private PDF, authors...).

<?xml version='1.0'?>
<xsl:stylesheet
version='1.0'
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:purl='http://purl.org/rss/1.0/'
xmlns:slash='http://purl.org/rss/1.0/modules/slash/'
xmlns:content='http://purl.org/rss/1.0/modules/content/'
xmlns:connotea='http://www.connotea.org/2005/01/schema#'
xmlns:dcterms='http://purl.org/dc/terms/'
xmlns:prism='http://prismstandard.org/namespaces/1.2/basic/'
xmlns:annotate='http://purl.org/rss/1.0/modules/annotate/'
xmlns:syn='http://purl.org/rss/1.0/modules/syndication/'
xmlns:dc='http://purl.org/dc/elements/1.1/'
xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/'
xmlns:admin='http://webns.net/mvcb/'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='text' />


<xsl:template match='/'>
<xsl:apply-templates select='rdf:RDF'/>
</xsl:template>

<xsl:template match='rdf:RDF'>
<xsl:apply-templates select='purl:item'/>
</xsl:template>

<xsl:template match='purl:item'>
@ARTICLE{<xsl:value-of select='generate-id(.)'/>

<xsl:call-template name='make-fied'>
<xsl:with-param name='key'>TITLE</xsl:with-param>
<xsl:with-param name='value'><xsl:value-of select='purl:title'/></xsl:with-param>
</xsl:call-template>
<xsl:call-template name='make-fied'>
<xsl:with-param name='key'>URL</xsl:with-param>
<xsl:with-param name='value'><xsl:value-of select='connotea:uri/dcterms:URI/@rdf:about'/></xsl:with-param>
</xsl:call-template>

<xsl:call-template name='make-fied'>
<xsl:with-param name='key'>author</xsl:with-param>
<xsl:with-param name='value'><xsl:for-each select='dcterms:URI/dc:creator'><xsl:value-of select='translate(.,&apos;,&apos;,&apos; &apos;)'/>,</xsl:for-each></xsl:with-param>
</xsl:call-template>


<xsl:call-template name='make-fied'>
<xsl:with-param name='key'>journal</xsl:with-param>
<xsl:with-param name='value'><xsl:for-each select='dcterms:URI/prism:publicationName'><xsl:value-of select='translate(.,&apos;,&apos;,&apos; &apos;)'/>,</xsl:for-each></xsl:with-param>
</xsl:call-template>

<xsl:call-template name='make-fied'>
<xsl:with-param name='key'>keywords</xsl:with-param>
<xsl:with-param name='value'><xsl:for-each select='dc:subject'><xsl:value-of select='translate(.,&apos;,&apos;,&apos; &apos;)'/><xsl:text> </xsl:text> </xsl:for-each></xsl:with-param>
</xsl:call-template>

<xsl:call-template name='make-fied'>
<xsl:with-param name='key'>comment</xsl:with-param>
<xsl:with-param name='value'><xsl:value-of select='purl:description'/></xsl:with-param>
</xsl:call-template>

}
</xsl:template>

<xsl:template name='make-fied'>
<xsl:param name='key'/>
<xsl:param name='value'/>
<xsl:if test='string-length(normalize-space($value))&gt;0'>
<xsl:text>,
</xsl:text>
<xsl:value-of select='$key'/>=&quot;<xsl:call-template name='tex'>
<xsl:with-param name='s'><xsl:value-of select='$value'/></xsl:with-param>
</xsl:call-template>&quot;
</xsl:if>
</xsl:template>


<xsl:template name='tex'>
<xsl:param name='s'/>
<xsl:choose>
<xsl:when test='string-length($s)&gt;1 and $s!=&apos;,&apos;'>
<xsl:call-template name='tex'>
<xsl:with-param name='s'><xsl:value-of select='substring($s,1,1)'/></xsl:with-param>
</xsl:call-template>
<xsl:call-template name='tex'>
<xsl:with-param name='s'><xsl:value-of select='substring($s,2)'/></xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:when test='contains(&apos;&quot;&apos;,$s)'>&apos;</xsl:when>
<xsl:otherwise><xsl:value-of select='$s'/></xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

05 January 2006

About Academic Research in France.

<?xml xml:lang="fr"?>

Que dit-on à un(e) thésard(e) qui vient d'obtenir sa thèse ?

"un cheese, une p'tite frite et un Coca s'il vous plaît, c'est pour emporter..."

04 January 2006

The fall of NCBI

In 20xx, the US government decreased the funds of the NCBI (the War was to be financed!) and restricted its access to the North-American users. Panic was immense within all worldwild research centers. Initially the researchers went on google scholar but a few times later the European Center for Biotechnology Information (ECBI) was founded. Here was stored a semantic web version of pubmed:

43citations

I love citations ! It would be really nice that the team who manage 43places/43things/43people create a kind of www.43citations.com. I suggested this on 43ideas.
A user would enter a citation and he would also add:
+ tags (may be geotagged for a citation about a given place (link to 43places ?) )
+ the langage
+ the country
+ the author (may be anonymous) (and his born/death date may be useful to retrieve a citation by country/period) (link to 43people ?)
+ a picture ?

I hate haidressers


Wha ! the new cosmetics are REALLY terrific !

02 January 2006

Nucleic Acids Research: Database Issue 2006

Nucleic Acids Research The new database issue of Nucleic Acids Research was released this week. The current issue is the largest yet and presents 94 new databases and updates of 68 existing databases. But as a bioinformatician, how can I know about all the content, all the difference about all this new stuff ? what are the redundancies ? what is really new ? where is the you-must-use-this-amazing-tool ? is this database built by a postdoc that will move to another lab next month ? what will be out of fund next year ?

In 2005, Nature contacted 89 databases listed in the Molecular Biology Database Collection (Nucl. Acids Res.28 1−7; 2000) to see how many still have funding five years on [ref].
"Of these, 51 reported that they are struggling financially. Seven of these have closed; the rest are being updated sporadically in their owners' spare time.
Not all these databases necessarily deserve to receive continued funding, especially as technology advances and competing resources are set up. But bioinformaticists are concerned by the sheer number that cannot find the money to provide an ongoing service."
pie


Connotea might be a good way to find out what is really important among the 163 abstracts published in the NAR issue if several users add comments about each papers, so I imported all the abstracts into connotea.

BTW: I did this using the XML output format from ncbi/pubmed, the XSLT stylesheet below and xsltproc. The result was a RIS file that can be imported into connotea.

<?xml version='1.0' ?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output method='text'/>

<xsl:template match='PubmedArticleSet'>
<xsl:apply-templates select='PubmedArticle'/>
</xsl:template>

<xsl:template match='PubmedArticle'>
TY - JOUR
JO - <xsl:value-of select='.//Journal/ISOAbbreviation'/>
N1 - <xsl:value-of select='.//AbstractText'/>
<xsl:apply-templates select='.//PMID'/>
TI - <xsl:value-of select='.//ArticleTitle'/>
<xsl:apply-templates select='.//AuthorList'/>
<xsl:apply-templates select='.//DescriptorName'/>
KW - NAR Database Issue 2006
KW - Bioinformatics
KW - Database
ER -
</xsl:template>

<xsl:template match='PMID'>
UR - http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&amp;db=pubmed&amp;dopt=Abstract&amp;list_uids=<xsl:apply-templates/>
</xsl:template>

<xsl:template match='AuthorList'>
<xsl:apply-templates select='Author' />
</xsl:template>

<xsl:template match='Author'>
AU - <xsl:value-of select='LastName'/>, <xsl:value-of select='ForeName'/>
</xsl:template>

<xsl:template match='DescriptorName'>
KW - <xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>


David Macaulay and me

David Macaulay
I just found a letter David Macaulay sent me after I asked him to write a book about the Eiffel Tower when I read his books about 25 years ago....
Now, I read his book to my son...
Does anyone knows how to conctact him by email ?

Technorati Keywords:

01 January 2006

Fighting Intelligent Design.

reading nature

In 20xx Nature Publishing and Science decided to add a weekly poster of the "pin-up of the week" in order to promote the interest of Science while fighting intelligent design (aka obsurantism, creationsim). During one year, the impact factor of all those journals dramatically increased but this was finally abandoned when people in favour of "intelligent design" took up this idea.

pubmed2citeulike

Ted Kandell gave me the idea to transform pubmed2connotea in order to support both connotea and CiteULike.