<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-905793152762173558</id><updated>2011-08-01T19:49:09.407+01:00</updated><title type='text'>Neil Swainston</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-8186691836026995179</id><published>2011-06-02T11:45:00.001+01:00</published><updated>2011-06-02T11:48:29.569+01:00</updated><title type='text'>Chemical similarity</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Currently pondering how to quantify chemical similarity, based on SMILES or InChI strings representing any given two chemicals / metabolites.&lt;br /&gt;&lt;br /&gt;I've had a little play with the rather good &lt;a href="http://sourceforge.net/apps/mediawiki/cdk/index.php?title=Main_Page"&gt;Chemical Development Kit&lt;/a&gt; (CDK), developed by &lt;a href="http://twitter.com/egonwillighagen"&gt;Egon Wilighagen&lt;/a&gt; and &lt;a href="http://twitter.com/csteinbeck"&gt;Christoph Steinbeck&lt;/a&gt;&amp;nbsp;and have hit a bit of a brick wall.&lt;br /&gt;&lt;br /&gt;Consider the following reaction:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.genome.jp/Fig/reaction/R01786.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="75" src="http://www.genome.jp/Fig/reaction/R01786.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In this case, I'd like to quantify the similarity between glucose and glucose 6-phosphate.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;My first approach was to use the CDK's &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://pele.farmbio.uu.se/nightly-1.2.3/cdk-javadoc-1.2.4/org/openscience/cdk/fingerprint/ExtendedFingerprinter.html"&gt;ExtendedFingerprinter&lt;/a&gt;&lt;/span&gt; class to generate a BitSet representation of each molecule, and then generate a Tanimoto coefficient which should quantify similarity:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: #941c64; font-family: Courier; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="color: #941c64; font-family: Courier; font-size: small;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="color: #941c64; font-family: Courier; font-size: small;"&gt;&lt;b&gt;&lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;String smiles1 =&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O";&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;String smiles2 =&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;O[C@H]1O[C@H](COP(O)(O)=O)[C@@H](O)[C@H](O)[C@H]1O";&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt; &lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;IAtomContainer molecule1 = &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;smilesParser&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;.parseSmiles(&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;smiles1&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: 900;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: 900;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;IAtomContainer molecule2 = &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;smilesParser&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;.parseSmiles( smiles2&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="color: #941c64; font-family: Courier; font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-weight: 900;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: 900;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;div style="display: inline !important;"&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small; font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;ExtendedFingerprinter ef = new ExtendedFingerprinter();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;BitSet fingerprint1 = &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;ef&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;.getFingerprint( molecule1 );&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;BitSet fingerprint2 =&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;ef.getFingerprint( molecule2 );&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;div style="display: inline !important; font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;div style="font: normal normal normal 12px/normal Courier; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;float&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt; tanimotoCoefficient = Tanimoto.&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;calculate&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;( fingerprint1, fingerprint2 );&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;div style="font: 12.0px Courier; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;System.&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;out&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;.println( tanimotoCoefficient );&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this case, a "similarity score" of 0.475 is calculated, which intuitively I find a little low, given how much of the structure is shared.&lt;br /&gt;&lt;br /&gt;I'm assuming (using a sequence analysis analogy) that the Tanimoto coefficient is a measure of &lt;i&gt;global&lt;/i&gt; similarity. What I'm after here, I suppose, is a measure of &lt;i&gt;local&lt;/i&gt; similarity - effectively something that can quantify the fact that we can pretty much map the entire structure of glucose onto that of glucose 6-phosphate.&lt;br /&gt;&lt;br /&gt;I understand that elsewhere in the CDK, the&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://pele.farmbio.uu.se/nightly-1.2.3/cdk-javadoc-1.2.4/org/openscience/cdk/isomorphism/UniversalIsomorphismTester.html"&gt;UniversalIsomorphismTester&lt;/a&gt;&lt;/span&gt; class may be more appropriate. Does anyone have any experience of this?&lt;br /&gt;&lt;br /&gt;Any help would be appreciated!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-8186691836026995179?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/8186691836026995179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2011/06/chemical-similarity.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/8186691836026995179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/8186691836026995179'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2011/06/chemical-similarity.html' title='Chemical similarity'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-3171116826311845787</id><published>2011-05-16T23:04:00.002+01:00</published><updated>2011-05-16T23:06:19.633+01:00</updated><title type='text'>We have moved</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;img border="1" height="150" src="http://4.bp.blogspot.com/-Wla6Hy3Hn3E/TdGbhNCt0OI/AAAAAAAAAFw/rvt6gE6d97g/s200/moving.jpg" width="134" /&gt;&lt;/div&gt;For no particular reason, I've opened a&amp;nbsp;&lt;a href="http://neilswainston.tumblr.com/" target="_blank"&gt;tumblr&lt;/a&gt;&amp;nbsp;account which contains more recent blog posts.&lt;br /&gt;&lt;br /&gt;Whether I can follow&amp;nbsp;&lt;a href="http://twitter.com/u003f"&gt;u003f&lt;/a&gt;'s example of making a&amp;nbsp;&lt;a href="http://twitter.com/search?q=%23postaday" title="#postaday"&gt;#postaday&lt;/a&gt;&amp;nbsp;is another issue entirely.&lt;br /&gt;&lt;br /&gt;Still not sure of the finer points that differentiate tumblr from blogger, although I understand that tumblr sits somewhere between Twitter and a regular blog, and is somewhat easier to use. An obvious advantage of blogger is the 'Comments' facility which seems to be absent from tumblr.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-3171116826311845787?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/3171116826311845787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2011/05/we-have-moved.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3171116826311845787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3171116826311845787'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2011/05/we-have-moved.html' title='We have moved'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Wla6Hy3Hn3E/TdGbhNCt0OI/AAAAAAAAAFw/rvt6gE6d97g/s72-c/moving.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-5592945634541921388</id><published>2010-10-15T09:07:00.074+01:00</published><updated>2011-04-05T12:01:25.665+01:00</updated><title type='text'>Integration of OMICS Datasets into Metabolic Pathway Analysis</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="color: #00c000; font-weight: bold;"&gt;Session 1: Reconstruction and visualisation of metabolic networks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ines Thiele, Iceland: Expanding genome-scale metabolic models&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Expanding knowledge and expanding scope. 67 non-unique metabolic models available, due to increased knowledge of *how* to generate models, automated bacterial model generation (SEED) and increased numbers of analysis tools, such as the COBRA Toolbox. Increasingly a community effort.&lt;br /&gt;&lt;br /&gt;Gap-filling for "dead-end" metabolites, allowing flux to run through these reactions. SMILEY algorithm can be used to assist in this, which relies on KEGG for metabolic reactions, and a proprietary collection of transport reactions. Optimisation problem: which reactions need to be added to the network to connect dead-ends, minimising addition of reactions. Three cases: add reaction, add reversibility, add transport reactions. SMILEY predictions will be experimentally validated. SMILEY is similar to GapFill and GapFind.&lt;br /&gt;&lt;br /&gt;~300 blocked reactions, ~100 dead-end reactions in human (Recon 1). These are largely in cytosol, as this acts as a kind of "default" compartment, and also nevertheless contains the majority of the network. BRENDA also used to confirm reaction directionality. Experimental data from biofluid also used to identify missing metabolites (or missing transport reactions). &lt;span style="font-style: italic;"&gt;Note: can missing reactions be inferred cheminformatically from the chemical structures?&lt;/span&gt; Manual curation is *crucial*, experimental data can help.&lt;br /&gt;&lt;br /&gt;Expanding the scope beyond metabolism: Reconstruction of transcriptional and translational machinery of E. coli, PLoS Comp. Biol., 2009. Goal of the model: to produce ribosomes. Attempting to imply transcriptional levels relate to flux level. Constraints by transcriptomics data, would like to constrain further with quantitative proteomics data. Uses Flux Variablity Analysis with proprietary algorithm (FASTFVA) to predict feasible flux ranges to constrain further.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: this next session is a little flaky as my laptop randomly switched off...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Coupling of metabolic reactions with their enzymes (i.e. with the transcriptional network) further constraints the metabolic network further: the reaction is blocked if the enzyme is not present. Analysis of predicted codon usage appears to match experimental data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;V.A.P. Martins dos Santos, Wageningen: Genome-scale comparison of the metabolic spaces of the pathogen Pseudomonas aeruginosa and the industrially relevant, non-pathogenic Pseudomonas putida&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Comparison at the level of genomic sequence doesn't indicate pathogenicity. Must look at the metabolic network.&lt;br /&gt;&lt;br /&gt;Initial comparison by sequence analysis at genomic level shows little overlap. Reactions can be the same, but different GPR associations. Use of similar gene association profiles to determine potential equivalent functions across the two organisms. Reconciled models shows increased similarity, but still many differences. These differences are mapped to pathways: major difference in transport reactions.&lt;br /&gt;&lt;br /&gt;Gene essentiality studies to categorise genes as essential, optional, or necessary under a given growth condition. Elementary mode analysis for ATP-production shows similarity across the two organisms. Differences in elementary modes can be accounted for by the presence / absence of unique reactions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F. Moran, Complutense University of Madrid: Comparison and graph representation of metabolic networks using Tool-4-Metatool&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ref: &lt;a href="http://bioinformatics.oxfordjournals.org/content/15/3/251.abstract"&gt;METATOOL: for studying metabolc networks&lt;/a&gt;, Bioinformatics, 1999, 15, 251-257.&lt;br /&gt;&lt;br /&gt;Input text file representing model / metabolic network. &lt;span style="font-style: italic;"&gt;Note: why use proprietary format?&lt;/span&gt; Stoichiometric analyses performed. &lt;span style="font-style: italic;"&gt;Question: is this another COBRA Toolbox?&lt;/span&gt; http://bbm1.ucm.es/t4m Supports KEGG files (for graphical display, presumably network maps) and COBRA-formatted SBML.&lt;br /&gt;&lt;br /&gt;Web-based tool. Metabolic pathways rendered. Allows largely models to be simplified into subsets. GUI linked to KEGG.&lt;br /&gt;&lt;br /&gt;Application to comparison of production pathways for valine: generation and comparison of elementary modes.&lt;br /&gt;&lt;br /&gt;May be size-limited: can genome-scale models be loaded / rendered / analysed? &lt;span style="font-style: italic;"&gt;Question: the bottleneck is in the rendering?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #00c000;"&gt;Session 2: Methods in metabolic pathway analysis&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Francisco Planes: Novel methods to compute elementary flux modes in genome-scale models&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: health warning. These notes are a little threadbare due to the writer's lack of expertise on the subject...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Convex basis: minimum set of EFMs able to generate the flux cone. Non-unique. k-shortest EFMs: minimise the number of reactions in the EFM. Reactions can be forced to be present once. &lt;span style="font-style: italic;"&gt;Question: Is this a constraint applied from experimental data?&lt;/span&gt; Can constraint to ensure only (or to minimise) irreversible reactions used: irreversible EFMs. This approach forces a single reaction to appear, reducing the set of EFMs.&lt;br /&gt;&lt;br /&gt;Applied to lysine synthesis. Future developments attempting to include isotope labelling (13C) fluxomics data and to develop the concept of elementary carbon modes. Publications in preparation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stefan Klamt, Magdeburg: New techniques for computing intervention strategies in metabolic networks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Techniques considered: FBA-based, and EFM-based optimisations. With FBA, search for minimal set of knock-outs that lead to coupling between biomass and product synthesis. With EFM, identify a knock-out that retains a minimal set of EFMs.&lt;br /&gt;&lt;br /&gt;Minimal Cut Sets: minimise minimal functional units that can operate in steady-state and achieve objective function. Goal: repress non-optimal production routes for desired product, P. Consider also desired modes, which must be preserved after cutting.&lt;br /&gt;&lt;br /&gt;Next approach: CASOP. Computational Approach for Strain Optimisation Aiming at High Productivity. Considers not just knock-outs (KOs) but also overexpression. Considers not only product production rate (yield optimality), but also substrate uptake rate. Productivity is proportional to the ratio of these terms. The latter is related to the capacity of the system. Applies weighting of EFMs, reaction importance measures (in how many EFMs does a reaction participate) and reaction ranking, based on the above terms.&lt;br /&gt;&lt;br /&gt;Applied to succinate production in E coli. KOs and overexpression candidates were ranked.&lt;br /&gt;&lt;br /&gt;Identification of potential excess or undersupply of co-factors and small molecules. Excretion of small molecules is performed through the addition of artificial reactions and electron and energy sink reactions.&lt;br /&gt;&lt;br /&gt;Applicable to medium-scale networks, but in most cases, the most suitable interventions lie in central metabolism (which is covered by these medium-scale networks). Implemented in &lt;a href="http://www.mpi-magdeburg.mpg.de/projects/cna/cna.html"&gt;CellNetAnalyzer&lt;/a&gt;. To be followed up by experimental work to validate intervention preditions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stefan Schuster, Jena: Combining pathway analysis with evolutionary game theory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: Lots of notes lost due to dodgy laptop...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Evolution is co-evolution, a competition that can be explained with game-theory. Players in the game attempt to optimise their position, sometimes at the expense of other players. Usage of different metabolic pathways can be considered strategies of the players, and these can be induced through mutation or epigenetic effects.&lt;br /&gt;&lt;br /&gt;Game: assume that organisms want to maximise ATP production. Can use fermentation and respiration as strategies. FBA suggests pathways, which can be constraint with individual maximum reaction rates.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note to self: immensely interesting. Read &lt;a href="http://www.ncbi.nlm.nih.gov/sites/entrez?term=Schuster,%20Stefan[Author]&amp;amp;search=Find%20Articles&amp;amp;cmd=search"&gt;Stefan's papers&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ina Koch: Automatic modularisation of biochemical networks based on elementary modes and transition invariants&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: interesting talk on Petri Net based approaches, with note-taking unfortunately suffering from my laptop's malaise.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Karoline Faust: Predicting metabolic pathways from functionally linked genes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"Topological, no FBA, sorry!" Looks at co-expression and co-regulation to project pathways using KEGG Mapper tool. Problems: cannot detect organism-specific variants of known pathways, or novel pathways (obviously).&lt;br /&gt;&lt;br /&gt;So, the approach is a de novo one, mapping to global network from KEGG and MetaCyc. Specific subnetworks are then extracted from the global networks. Hub compounds are a problem, but hard to determine what is a hub node. Use atom-following strategy (based on chemical structure) to determine hubs. The need for this has been mitigated by the introduction of KEGG reaction pairs. &lt;span style="font-style: italic;"&gt;Question: are hub nodes identified then removed / ignored subsequently? Answer: it seems "yes".&lt;/span&gt; Global network is based on KEGG RPAIRs.&lt;br /&gt;&lt;br /&gt;Weaknesses: difficult to predict cycles or spirals, and highly interconnected central metabolic central metabolism. Also difficult to map enzymes to reactions, with current state of EC systems and existing databases.&lt;br /&gt;&lt;br /&gt;Subgraphs are extracted by kWalks algorithm.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #00c000;"&gt;Session 3: Data integration into metabolic pathway analysis&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nathan Price, Illinois: Probabilistic integrative modeling of metabolic and regulatory networks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Consider interaction networks (based on statistical inference) and mechanistic, biological reaction networks. Integrating the analysis of the two approaches is rarely done due to the complexity of doing so. Attempt to coordinate the integration of these approaches.&lt;br /&gt;&lt;br /&gt;Need exists for automated metabolic reconstructions, due to exponential increase in published genome sequences. Current reconstruction approach takes ~1 year. Automated SEED generated tool exists, and allows first drafts to be generated, which still require manual curation.&lt;br /&gt;&lt;br /&gt;Goal is to integrate automation of transcriptational, regulatory networks and metabolic networks. PROM: Probabilistic Regulation of Metabolism. Integration: transcription encodes enzymes regulating metabolites, metabolites regulate transcription factors - feedback between the networks.&lt;br /&gt;&lt;br /&gt;rFBA: regulatory network represented by Boolean rules, encode the GPR. Limitations: Boolean rules themselves require manual generation from literature, knock-downs are not considered: enzymes are either present or absent.&lt;br /&gt;&lt;br /&gt;PROM: integrates networks, predicts flux changes upon perturbation at the transcriptional level, more quantitative than strict, on-off rules describing enzymes. Probabilistic Boolean rules are applied, not Boolean rules. Rather than stating...&lt;br /&gt;&lt;br /&gt;IF B THEN A&lt;br /&gt;&lt;br /&gt;...a probability is applied...&lt;br /&gt;&lt;br /&gt;P(A|B) = 0.95 (i.e. p(mRNA|TF))&lt;br /&gt;&lt;br /&gt;Probabilities added as a restraint to the FBA analysis of network. These can be violated, but doing so applies a penalty. Acts as a bias, rather than a hard-and-fast constraint. Adds a penalty  term to be minimised.&lt;br /&gt;&lt;br /&gt;Benchmarked against E. Coli. Palsson model plus regulatory interaction data from RegulonDB, validated against knock-out data. Increased comprehensiveness due to inference of high-throughput experimental data.&lt;br /&gt;&lt;br /&gt;Going beyond binary study of lethality / non-lethality to look at probabilistic predictions of lethality.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Same approach also applied to M. tuberculosis, with predictions of gene essentialities, with 95% accuracy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Opinion: talk of the day so far. Excellent.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Jean-Marc Schwartz, Manchester: Functional enrichment analysis by elementary modes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Integration of transcription and metabolism, inferring activity of metabolism based on gene expression data. Initial work looked at up/downregulated genes under a given perturbation, then linking these genes based on metabolic map.&lt;br /&gt;&lt;br /&gt;Then mapped upregulated genes onto elementary modes, generated from individual KEGG pathways. &lt;span style="font-style: italic;"&gt;Question: why limit elementary modes to a single, artificial, arbitrary pathway?&lt;/span&gt; Second collection of elementary modes were built from pairwise combinations of connected elementary modes across pathways.&lt;br /&gt;&lt;br /&gt;Up/downregulated genes were then mapped to these pairwise combinations of elementary modes. Use of novel software: BLASTsets. Find elementary modes "significant" according to the transcriptomics data. This approach is more deterministic than looking at pathways.&lt;br /&gt;&lt;br /&gt;Limitation: elementary modes give a "linear" view of metabolism, i.e. A --&amp;gt;  --&amp;gt; B. However, much of metabolism is cyclic, recycling metabolites. How is cyclic vs. acyclic activity quantified? Represent molecular map as mass flux, rather than stoichiometric flux. &lt;span style="font-style: italic;"&gt;Sorry, getting a little lost... Need to speak to Jean-Marc about this when I get home.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;S.A. Wahl, Delft: Identification of enzyme kinetic equations from dynamic data using piecewise affine approximations.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Attempt to include kinetic data in metabolic networks. Apply perturbation experiments, metabolomics and 13C labelling. Flux + metabolic concentrations -&amp;gt; kinetic parameter estimates.&lt;br /&gt;&lt;br /&gt;Apply pulse to growth media, intracellular fluxes and metabolite concentrations fluctuates. Apply labelled pulse and follow isotopic uptake. Follows the BioScope pulse experimental protocol, allowing experimental data to be determined from samples that are periodically pulsed from the chemostat. Reproducible for labelled and non-labelled metabolites, and across experimental techniques (LCMS and GCMS). Apply linear fit to data, then apply "switches" to produce model that reproduce both fluxomics and metabolomics data. Ultimately attempt to generate a kinetic model to model the dataset.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #00c000;"&gt;Session 4: Data integration into metabolic and regulatory models&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Jason Papin, Virginia: Integrating differential expression with genome-scale metabolic networks&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Data to integrate: differential expression (transcriptomic, proteomic), transcript verification (RT-PCR, next-generation sequencing).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Differential expression mapping with the GIMME algorithm and the Schlomi approach. Limitation is that data is integrated if it passes an arbitrary threshold. MADE formalisation (submitted to Bioinformatics) developed in Jason's lab. Applies a weighting based on significance of differential expression between two states. Objective function based on increasing and decreasing expression changes, not a biomass function. BUT the biomass function is retained as a constraint: the model solution must result in growth.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Application to yeast and the algae &lt;i&gt;Chlamydomonas reinhardtii&lt;/i&gt;, the latter of which incorporates photosynthesis which is often overlooked in reconstruction analysis. Transcript variation: network reconstruction refined by applying experimental data to unknown / putatively-identified metabolic ORFs. Allows reconstruction to be validated by the presence of expressed genes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Incorporation of photosynthesis: prism reaction derivation. Map maximum reaction rate under a range of wavelengths, giving "bandwidths" to reactions. Coefficients can be generated &lt;i&gt;(didn't get how)&lt;/i&gt; that will allow light-sources to be integrated with metabolic reconstruction analysis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interest in applying differing light sources during the growth phase to study effect on network analysis itself and biomass production, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Peter Droste, Juelich: OMIX - A software solution for customizable visualization in the context of metabolic networks&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.13cflux.net/omix"&gt;http://www.13cflux.net/omix&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Graphical software tool for mapping omics data on networks. Displays reactions, metabolites, flux indicating edges, and effector edges. Data visualised by mapping to network components. Programmable by a script language (OVL, Omix Visualization Language): apparently can be done by the user. Can be animated to visualise time-series data. Third-party plugins can be written. Supports import / export of many formats, including SBML, Matlab, Excel. Supports network analysis tools. Customisable, which is neat, but not sure why SBGN is not being used.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Andreas Hoppe, Berlin: Integrating metabolome and expression data into optimization-based network analysis&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Metabolite profiles. Ideally, kinetic model, but large-scale models are generally just stoichiometric. Integration based on thermodynamic feasibility, added as constraint for FBA. Relies on knowing Gibbs free energies. Can be used in prediction of concentrations (feasible ranges), critical metabolites (with narrow range). Metabolite profile reduces flux space.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Expression data in FBA, uses threshold-based activity prediction. Publication: Expression Match FBA, Huthmacher et al, BMC Sys Biol, 2010.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Implication of cellular objectives form expression changes. MFM: single objective flux distribution. Publication: Hoffmann et al, Genome Informatics, 2006.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Software available: &lt;a href="http://www.bioinformatics.org/fasimu/"&gt;http://www.bioinformatics.org/fasimu/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-5592945634541921388?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/5592945634541921388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2010/10/integration-of-omics-datasets-into.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/5592945634541921388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/5592945634541921388'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2010/10/integration-of-omics-datasets-into.html' title='Integration of OMICS Datasets into Metabolic Pathway Analysis'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-5474021509213593780</id><published>2010-08-24T08:05:00.007+01:00</published><updated>2010-08-24T08:23:49.615+01:00</updated><title type='text'>Surf's down, dude</title><content type='html'>&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 148px; height: 150px;" src="http://2.bp.blogspot.com/_sf3PjnA5kns/THNycouWxtI/AAAAAAAAAE4/hkMZmKUv6jk/s200/0.jpg" border="1" alt="Waving geek" id="BLOGGER_PHOTO_ID_5508872605498001106" /&gt;&lt;br /&gt;The death of Google Wave is probably not unexpected. If it was ever going to work, then it's one thing getting geeks like you and I interested, but the key would be in attracting the attention of less computationally savvy users. Like your Gran or your PI, perhaps.&lt;br /&gt;&lt;br /&gt;Anyways, Google Wave's death also mirrored the rapid rejection of my paper on Robots that was submitted as an Application Note to Bioinformatics, bucking the 8-1 prediction in my recent scientific poll to determine whether it would fly. The paper itself can now be found at &lt;a href="http://precedings.nature.com/documents/4795/version/1"&gt;Nature Preceedings&lt;/a&gt;, who very generously don't adhere to silly little things like peer review.&lt;br /&gt;&lt;br /&gt;The Reviewers raised a number of issues, most of which were valid, but the key theme to all the reviews was "What's the point? Why would I use this?" The answer is that it was a bit of fun, and an exploration of what one could achieve with the technology. Rather like Google Wave itself, I guess.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-5474021509213593780?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/5474021509213593780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2010/08/surfs-down-dude.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/5474021509213593780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/5474021509213593780'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2010/08/surfs-down-dude.html' title='Surf&apos;s down, dude'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sf3PjnA5kns/THNycouWxtI/AAAAAAAAAE4/hkMZmKUv6jk/s72-c/0.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-3044330673051924928</id><published>2010-07-14T14:55:00.010+01:00</published><updated>2010-07-14T16:51:45.339+01:00</updated><title type='text'>Can you beat Paul the Psychic Octopus?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=MG3jfgWZf_g"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 180px; height: 150px;" src="http://2.bp.blogspot.com/_sf3PjnA5kns/TD3Fe9rfznI/AAAAAAAAAEw/881kO8Nmi6Y/s200/r.jpeg" border="1" alt="" id="BLOGGER_PHOTO_ID_5493764256205622898" /&gt;&lt;/a&gt;&lt;div&gt;Just a bit of post-World Cup fun for you here. Given that I'm English, the tournament was largely a wash-out for me. (Actually, that isn't entirely true. I always suspected that they were a bunch of overpaid, egotistical prima donnas with a ludicrously excessive, entirely unfounded belief in their own limited ability.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyways, what I did enjoy were the phenomenal Nostradamal exploits of Weymouth's finest export. The question is: can you do the same?!?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've just put together an application note on the &lt;a href="http://neilswainston.blogspot.com/2010/04/joining-party-after-everyones-left.html"&gt;work that I previously blogged about&lt;/a&gt; regarding Google Wave and the sharing of experimental data. I'm intending to send this off to Bioinformatics, and have no idea whether such a paper would get published. I rather think it might. Maybe. Possibly. Perhaps. But such is the random nature of the peer review system that it really is anyone's guess.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It can even be your guess.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So... ladies and gentlemen, I realise that this may entail some form of scientific &lt;i&gt;sub judice&lt;/i&gt;, but if you fancy living dangerously, guess using the poll to your right. And see if you can out perform a two-year old cephalopod mollusk.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-3044330673051924928?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/3044330673051924928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2010/07/can-you-beat-paul-psychic-octopus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3044330673051924928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3044330673051924928'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2010/07/can-you-beat-paul-psychic-octopus.html' title='Can you beat Paul the Psychic Octopus?'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sf3PjnA5kns/TD3Fe9rfznI/AAAAAAAAAEw/881kO8Nmi6Y/s72-c/r.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-8395109479662220935</id><published>2010-04-07T23:49:00.011+01:00</published><updated>2010-04-08T16:41:02.556+01:00</updated><title type='text'>Joining the party after everyone's left</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=F2kAnTZBnTg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 261px; height: 150px;" src="http://theprideandthesorrow.files.wordpress.com/2008/11/deadparrot.jpg" border="1" alt="" /&gt;&lt;/a&gt;Righty. Some time back in the mid Sixteenth Century, I attempted to write a Google Wave robot to scan blips for protein ids, and, on finding any, query a database and show appropriate mass spectra in a wee Gadget.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Details on this fiasco are available in a &lt;a href="http://neilswainston.blogspot.com/2009/11/coo-eee.html"&gt;previous post&lt;/a&gt;. It didn't work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I attempted to write the Gadget as a wrapped up Java applet. This caused all manner of unpredictable mayhem and very rapidly justified my initial guess that it was a ludicrous idea to start with.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyways, the good news is that it now works. The bad news is that &lt;a href="http://ff.im/hNvcG"&gt;no-one gives a monkey's&lt;/a&gt; about Google Wave anymore.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyways, as opposed to my usual long, rambling posts, the long and short of things were thus:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Rather than attempt to display mass spectra in a Java applet (&lt;i&gt;so&lt;/i&gt; 1997), I used the rather nifty &lt;a href="http://code.google.com/apis/chart/image_charts.html"&gt;Google Chart Tools&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;I was attempting to use AJAX and XMLHttpRequest objects in the Gadget code. This was severely frowned upon by the Gods of Google (Gods know why). The recommended means of communicating with the outside world in a Gadget can be found by interrupting your evening's viewing of Man United being dumped out of the Champions League with the reading of the &lt;a href="http://code.google.com/apis/gadgets/docs/remote-content.html"&gt;Remote Data Requests Developers Guide&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_sf3PjnA5kns/S70XrEXetpI/AAAAAAAAAEo/U1sGTtNkQok/s1600/wave.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 355px;" src="http://2.bp.blogspot.com/_sf3PjnA5kns/S70XrEXetpI/AAAAAAAAAEo/U1sGTtNkQok/s400/wave.png" border="1" alt="" id="BLOGGER_PHOTO_ID_5457544352116946578" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Currently to be found hanging out at: &lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;systems-biology-data@appspot.com&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So - hoorah - I now have a working Robot. Whether this is of use to anyone (particularly me) is another story. But life is a journey, not a destination, apparently, and in throwing all of this together, I've learned a bit about Wave and a lot more about AJAX, which will certainly be useful. The language, that is, not the football team.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stop press: I've learnt since submitting this that people &lt;i&gt;do&lt;/i&gt; care about Google Wave, and the party is &lt;i&gt;not&lt;/i&gt; over. I've also learnt that this has been described as the "&lt;a href="http://twitter.com/googlewavedev/statuses/11813885523"&gt;geekiest extension yet&lt;/a&gt;" to a Google Wave. Bloody cheek.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-8395109479662220935?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/8395109479662220935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2010/04/joining-party-after-everyones-left.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/8395109479662220935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/8395109479662220935'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2010/04/joining-party-after-everyones-left.html' title='Joining the party after everyone&apos;s left'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sf3PjnA5kns/S70XrEXetpI/AAAAAAAAAEo/U1sGTtNkQok/s72-c/wave.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-3798579470390850403</id><published>2010-02-12T23:21:00.034Z</published><updated>2010-02-15T18:29:17.801Z</updated><title type='text'>Computational Tools for the Annotation of SBML Models: the sequel</title><content type='html'>&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=zgs6oMC64I0" style="text-decoration: none;"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 188px; height: 150px;" src="http://1.bp.blogspot.com/_sf3PjnA5kns/S3XjkljPTUI/AAAAAAAAAEQ/5ejHbRAc-ME/s400/computers-electron2.png" border="1" alt="Acorn Electron" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Frank Bergmann of the University of Washington last week blogged an interesting piece on &lt;a href="http://frank-fbergmann.blogspot.com/2010/02/computational-tools-for-annotation-of.html"&gt;Computational Tools for the Annotation of SBML Models&lt;/a&gt;. Within it, he attempted to use a library that I have developed, snappily titled libAnnotationSBML.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The basic premise of the library is to provide a unified interface to the vast array of resources from which one can extract terms to semantically annotate SBML models. Up until recently, most models in the systems biology field have suffered from an inability to decipher the terms within, with many components given three letter acronyms that even the author cannot easily interpret after a day or two.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Annotating models gets around this problem, providing a consistent set of terms / names which can greatly increase interoperability and facilitate model merging and automated parameterisation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyways, the long and short of it was that the libAnnotationSBML library was a pig to build and contains next to no documentation. So thanks very much to Frank for pointing out some faults. I've repackaged much of it and hopefully by following the steps below, we should be able to do something(s) useful with it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 1: install &lt;a href="http://java.sun.com/javase/downloads/widget/jdk6.jsp"&gt;Java 6 JDK&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 2: install &lt;a href="http://ant.apache.org/"&gt;Apache Ant&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 3: install &lt;a href="http://subversion.apache.org/"&gt;Apache Subversion&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Step 4: install &lt;a href="http://sbml.org/Software/libSBML"&gt;libSBML&lt;/a&gt; and include the Java bindings (the &lt;a href="http://sbml.org/Software/libSBML/docs/cpp-api/libsbml-installation.html"&gt;build documentation&lt;/a&gt; should help you out, and for those of you who are Windows 7, the libSBML installer was not your idea, but probably &lt;a href="http://sbml.org/About#The_SBML_Team"&gt;Sarah Keating&lt;/a&gt;'s). Anyways, the Windows installer will ask you where you'd like to install the Java jar file. Make a note of this.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Step 5: open your Terminal or Command Prompt of choice, navigate yourself to an appropriate directory and...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;mkdir libAnnotationSbml&lt;br /&gt;cd libAnnotationSbml&lt;br /&gt;svn co https://mcisb.svn.sourceforge.net/svnroot/mcisb/mcisb-ontology .&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will download the source code. Then, for those of you viewing in Mac and (possibly - I've not tested it) Linux, try the following:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;ant&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For those of you on Windows (or others who have installed the libSBML jar file in a non-default location, type&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;ant -Dsbml=[DIRECTORY_IN_WHICH_SBMLJ.JAR_IS_INSTALLED]&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The JUnit tests are a necessary evil. The web services upon which the library relies periodically fall over, or - worse still - change their interface. Running the tests takes about ten minutes, but IMHO is time well spent. (It's not like you're doing the testing anyway...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The new &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;libAnnotationSBML.jar&lt;/span&gt; library should be located in your &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dist/lib&lt;/span&gt; directory. There should also be Javadocs in the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dist/doc&lt;/span&gt; directory. Although, frankly, these are likely to be as comprehensive and watertight as an explanation from &lt;a href="http://i140.photobucket.com/albums/r33/efaisalz/john-terry-toni-poole.jpg"&gt;John Terry&lt;/a&gt; regarding why he was late for dinner again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This jar contains all of libAnnotationSBML and the client classes for the various webservices that it utilises. So, what can we do with it?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At the request of &lt;a href="http://jaguar.biologie.hu-berlin.de/~fkrause/"&gt;Falko Krause&lt;/a&gt; (of &lt;a href="http://www.semanticsbml.org/"&gt;semanticSBML&lt;/a&gt; fame and Humboldt University Berlin), I generated a small command line application that attempts to interpret MIRIAM terms that one would find in annotated SBML files, or to search for these terms from a text string.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To access this, type the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;cd bin&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;./libAnnotationSBML search ChEBI g6p&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will contact the ChEBI web service and search its database for terms matching "g6p".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The results are returned (in this case) in &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; format. (XML was &lt;i&gt;so&lt;/i&gt; noughties). The results are essentially as a map of ids to names:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;[["urn:miriam:obo.chebi:CHEBI%3A17665","alpha-D-glucose 6-phosphate"]]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can try this with other sources if you wish:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;./libAnnotationSBML search KEGG Compound D-glucose 6-phosphate&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'courier new', serif;color:#009900;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;[["urn:miriam:kegg.compound:C00668","alpha-D-Glucose 6-phosphate"],["urn:miriam:kegg.compound:C06369","2-Deoxy-D-glucose 6-phosphate"],["urn:miriam:kegg.compound:C00092","D-Glucose 6-phosphate"],["urn:miriam:kegg.compound:C01172","beta-D-Glucose 6-phosphate"]]&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that the names of the source exactly match those in the MIRIAM Resources. (However, not all - in fact very few - have web services or search facilities associated with them. Searching these "dead" resources will return empty sets).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;[]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So we can search for a term from a metabolite name, which can the be used to annotate an unannotated model. Once we have a term (from perhaps reading an annotated model), we can also query our web services:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;./libAnnotationSB&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;ML getName urn:miriam:obo.chebi:CHEBI%3A17665&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;"alpha-D-glucose 6-phosphate"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I guess we know that already. Link for a user?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;./libAnnotationSB&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;ML getLink urn:miriam:obo.chebi:CHEBI%3A17665&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;"&lt;/span&gt;&lt;a href="http://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI%3A17665"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;http://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI%3A17665&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Many of these sources map themselves to one another. The &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;getXrefs&lt;/span&gt; command can attempt to find these:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;./libAnnotationSBML getXre&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;fs urn:miriam:obo.chebi:CHEBI%3A17665&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;["urn:miriam:kegg.compound:C00668","http:\/\/www.iupac.org\/inchi\/#InChI=1\/C6H13O9P\/c7-3-2(1-14-16(11,12)13)15-6(10)5(9)4(3)8\/h2-10H,1H2,(H2,11,12,13)\/t2-,3-,4+,5-,6+\/m1\/s1\/f\/h11-12H"]&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;We maybe didn't know this. &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;CHEBI:&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;17665&lt;/span&gt;&lt;/span&gt; cross-references KEGG Compound &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;C00668&lt;/span&gt;. I wonder if that, in turn, cross-references  &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;CHEBI:&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;17665&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, serif;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;./libAnnotationSBML getXre&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;fs &lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;urn:miriam:kegg.compound:C00668&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new', serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;["urn:miriam:pubchem.substance:3937","urn:miriam:obo.chebi:CHEBI%3A17665","urn:miriam:3dmet:B01304"]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;It does. It also provides links to the equivalent entry in both PubChem substance and 3dmet.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An obvious next step for this would be to hide it behind a RESTful web service, such that a call to...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new', serif;"&gt;http://libAnnotationSB&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;ML.org?command=getName&amp;amp;parameter=urn:miriam:obo.chebi:CHEBI%3A&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;17665&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...would return JSON-formatted data that could be immediately dropped into your web application of choice. Which would make all of these Java / ant / libSBML dependencies (and much of this blog post) redundant. I'll look into it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;However, this is just one simple, command-line tool. There are more far things in the library to utilise. ChEBI, KEGG Compound and PubChem terms can return formulae and InChI strings. UniProt terms can return sequences, taxonomy, encoding genes, maybe even phosphorylation sites. With "proper" ontologies such as ChEBI, we can explore the ontology hierarchy, such that we can also ask what "parents" or "children" G6P has, returning stereochemically-specific molecules and related molecules such as glucose itself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other tools exploit these  this to provide "proper" applications. One of which is an annotation tool (think semanticSBML or &lt;a href="http://www.ncl.ac.uk/cisban/saint/"&gt;Saint&lt;/a&gt;) that takes a non-annotated SBML file and uses the search facilities above to annotate compartments, metabolites and enzymes, based upon their name attribute:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 272px;" src="http://1.bp.blogspot.com/_sf3PjnA5kns/S3k6wHKJzeI/AAAAAAAAAEY/aX2PZVe-1Jc/s400/sbmlAnnotatorWizard.png" border="0" alt="SBML Annotator Wizard" id="BLOGGER_PHOTO_ID_5438442623256350178" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll package this up and post more of this ramble then.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, thanks to my buddies whose work I supplement. If you're interested, please read their papers:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bioinformatics.oxfordjournals.org/cgi/content/short/26/3/421?rss=1"&gt;Annotation and merging of SBML models with semanticSBML&lt;/a&gt;. &lt;i&gt;Krause F, Uhlendorf J., Lubitz T., Schulz M., Klipp E., Liebermeister W&lt;/i&gt;. Bioinformatics (2010) &lt;b&gt;26&lt;/b&gt;(3):421-422.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bioinformatics.oxfordjournals.org/cgi/content/full/25/22/3026"&gt;Saint: a lightweight integration environment for model annotation&lt;/a&gt;. Lister AL, Pocock M, Taschuk M, Wipat A. Bioinformatics (2009) &lt;b&gt;25&lt;/b&gt;(22):3026-3027.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;And maybe this one:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bioinformatics.oxfordjournals.org/cgi/content/abstract/btp392"&gt;libAnnotationSBML: a library for exploiting SBML annotations&lt;/a&gt;. &lt;i&gt;Swainston N, Mendes P&lt;/i&gt;. Bioinformatics (2009) &lt;b&gt;25&lt;/b&gt;(17):2292-2293.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-3798579470390850403?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/3798579470390850403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2010/02/computational-tools-for-annotation-of.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3798579470390850403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3798579470390850403'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2010/02/computational-tools-for-annotation-of.html' title='Computational Tools for the Annotation of SBML Models: the sequel'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_sf3PjnA5kns/S3XjkljPTUI/AAAAAAAAAEQ/5ejHbRAc-ME/s72-c/computers-electron2.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-3641044395532808469</id><published>2009-11-02T10:18:00.014Z</published><updated>2010-04-08T12:12:29.585+01:00</updated><title type='text'>Coo-eee!!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=dn5f0-y71tE"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_sf3PjnA5kns/Su6yGtZfvCI/AAAAAAAAADw/2ae9utWkufA/s200/kim-waving.JPG" border="1" alt="" id="BLOGGER_PHOTO_ID_5399448831599295522" /&gt;&lt;/a&gt;&lt;br /&gt;I'm waving!!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not an earth-shattering confession, obviously. Seems that everyone is. Just an excuse to legitimise the inclusion of a picture of Kim &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Jong&lt;/span&gt;&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Il&lt;/span&gt;&lt;/span&gt; in a blog about software development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyways, my &lt;a href="http://neilswainston.blogspot.com/2009/10/we-are-robots.html"&gt;previous entry&lt;/a&gt; discussed the relative ease of writing Robots for Google Wave. This was clearly written before I had an account and therefore wasn't tested, and as a consequence I am now wiping metaphorical egg from my face.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thankfully, though, I received an invite on Friday, courtesy of &lt;a href="http://friendfeed.com/neilfws"&gt;Neil Saunders&lt;/a&gt; (many thanks, Neil) and set about to work. I'd already been alerted by a curious tester with far too much time on his hands that my Robot was an embarrassing failure, and quickly discovered this for myself as I added it to my first Wave.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first problem (#1) was that I hadn't created an implementation of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ProfileServlet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, effectively identifying the Robot, giving it a name and an avatar and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;whathaveyou&lt;/span&gt;&lt;/span&gt;. I used the now clearly obsolete approach of marking all of this up in the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;capabilities.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;xml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; file. Still, dead easy to fix, and the &lt;a href="http://mcisb.svn.sourceforge.net/viewvc/mcisb/mcisb-dataviewer/src/org/mcisb/google/dataviewer/DataViewerProfileServlet.java"&gt;source code&lt;/a&gt; for the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ProfileServlet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt; is available&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a cheeky redeploy, the Robot was indeed visible and "worked" to a fashion, in so far as, on submission of a Blip, it matched &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;UniProt&lt;/span&gt; names and attempted to append appropriate applet code to the end of the Blip. Problem #2, however, appeared to be that the applet code was either stripped from the Blip or never added. Using the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;appendMarkup&lt;/span&gt;()&lt;/span&gt; method of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;TextView&lt;/span&gt;&lt;/span&gt;, I was able to add hyperlink markup (&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;a&lt;/span&gt; tags), but unable to add &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;object&lt;/span&gt; tags. (I attempted to append an &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;object&lt;/span&gt; tag embedding a YouTube video and this failed.) It's also not just a case of clicking on View Source Code to attempt to uncover what's gone wrong - I'm rather spoiled with Eclipse and Java coding as the debugging facility clearly allows programmers of moderate abilities to write something half decent without really trying. Debugging the Robot was/is largely done using the "trial-and-swear-lots" approach.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Undeterred, I noticed that one of my "Welcome to Wave" Waves contained an embedded YouTube video. Eu-bloody-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;reka&lt;/span&gt;. The key to my embed-an-object quandary was - as I first suspected - to wrap the applet up in a Gadget. This proved to be fairly &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;straightfoward&lt;/span&gt;, following the &lt;a href="http://code.google.com/apis/wave/extensions/gadgets/guide.html"&gt;tutorial&lt;/a&gt; provided. Effectively, a Gadget is written as an XML file, accessible in the same way that standard html files are accessible (from the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;war&lt;/span&gt; directory), in which HTML and JavaScript can be embedded. I wrote one, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;&lt;a href="http://mcisb.svn.sourceforge.net/viewvc/mcisb/mcisb-dataviewer/war/proteome.xml"&gt;proteome&lt;/a&gt;&lt;/span&gt;&lt;a href="http://mcisb.svn.sourceforge.net/viewvc/mcisb/mcisb-dataviewer/war/proteome.xml"&gt;.&lt;/a&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;&lt;a href="http://mcisb.svn.sourceforge.net/viewvc/mcisb/mcisb-dataviewer/war/proteome.xml"&gt;xml&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;, which contained the markup for my applet object, and some JavaScript to parse the query string containing parameters for the applet. The only Gadget-specific task was to ensure that the Gadget would resize itself appropriately, depending upon the size of the applet (thanks to another &lt;a href="http://code.google.com/apis/gadgets/docs/ui.html#Dyn_Height"&gt;tutorial entry&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The upshot of it all is that it kind of, nearly, possibly, maybe works ...ish if you squint hard enough...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_sf3PjnA5kns/Su7JERGTw_I/AAAAAAAAAEI/iYzGhS3U0BA/s1600-h/wave.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 375px;" src="http://1.bp.blogspot.com/_sf3PjnA5kns/Su7JERGTw_I/AAAAAAAAAEI/iYzGhS3U0BA/s400/wave.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5399474078410327026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are still issues of varying magnitudes (the applets take ages to load, randomly fail to load at all, or - most annoyingly - load and then disappear virtually immediately). Also, multiple applets can be loaded for the same protein, which is pointless as they all show the same data. I'll get on to these, but would love to know more about the life cycle of a Blip / Gadget - who or what is calling 'stop' on my applet?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More importantly, I've twigged that applets are pretty rubbish in this context. I'm using about 2% of the facilities of Gadgets, and my main concern is that I'm using no concept of shared &lt;i&gt;state&lt;/i&gt; between users. This doesn't matter so much in this context - viewing data - but if we wanted to do anything more sophisticated, manipulating data and sharing the outcome, I'd have to learn of all that fancy JavaScript that so far I've studiously ignored as it scares me. I also have no idea how to generate anything graphical in this context (what on Earth is that &lt;a href="http://code.google.com/apis/wave/extensions/gadgets/guide.html"&gt;chess game&lt;/a&gt; example written in?!?).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Still bugs to fix and still &lt;i&gt;lots&lt;/i&gt; to learn.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Update, April 2010: Lessons have been learned and described in a &lt;a href="http://neilswainston.blogspot.com/2010/04/joining-party-after-everyones-left.html"&gt;follow-up post&lt;/a&gt;. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-3641044395532808469?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/3641044395532808469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2009/11/coo-eee.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3641044395532808469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/3641044395532808469'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2009/11/coo-eee.html' title='Coo-eee!!'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sf3PjnA5kns/Su6yGtZfvCI/AAAAAAAAADw/2ae9utWkufA/s72-c/kim-waving.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-2010554334298169981</id><published>2009-10-15T17:10:00.015+01:00</published><updated>2010-07-15T15:46:58.368+01:00</updated><title type='text'>We are the Robots</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=VXa9tXcMhXQ"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 153px; height: 150px;" src="http://mymlanthereal.files.wordpress.com/2008/12/kraftwerk_the_man_machine_album_cover.jpg" border="1" alt="" /&gt;&lt;/a&gt;Never one to be influenced by Trending Topics in Twitter, I've managed to find a cheeky day in an otherwise packed schedule to dip my toes into the &lt;a href="http://wave.google.com/help/wave/closed.html"&gt;Google Wave&lt;/a&gt;s by writing my first Robot.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Google Wave has been modestly described as "&lt;a href="http://radar.oreilly.com/2009/05/google-wave-what-might-email-l.html"&gt;What Email Might Look Like If It Were Invented Today&lt;/a&gt;", and the account thus linked is far better than anything that I could add. I'm assuming that most, if not all, of you who are reading this now know more about Google Wave than you do about your own spouses, so I'll not dwell on Wave itself, but instead turn my attention to my Noddy Guide to Writing Robots.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For my sins, I manage data for the &lt;a href="http://www.mcisb.org/"&gt;Manchester Centre for Integrative Systems Biology&lt;/a&gt;, and in the last couple of weeks, I've been revisiting some work that I've done in proteomics and mass spectrometry. For no particular reason, I've selected this as my Google Wave Robot use case, and - hopefully - I've developed a little something that one can add to a Wave to enliven it with an interactive mass spectra viewing tool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Robot himself lives at the following address...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://systems-biology-data.appspot.com/"&gt;http://systems-biology-data.appspot.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...and the premise can be seen by visiting the link and typing in "I love PYK1_YEAST and other proteins" or something to that end. Essentially, I wanted to create something that would scan Blips, looking for UniProt names in the text (HXK1_HUMAN, for example). This would then query our proteomics data webservice, and return any data in a nice-if-not-entirely-pointless interactive applet, showing the peptides identified for that protein. (If this really does work, then searching our dataset for proteins involved in yeast glycolysis will get you some hits. Anything else will currently return a depressing grey rectangle).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In an ideal world, something like the following should be appended to the Blip...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_sf3PjnA5kns/St276EPAhNI/AAAAAAAAADI/ggIf-DIIDe8/s1600-h/proteomeViewer.png"&gt;&lt;img style="block:left; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 298px;" src="http://4.bp.blogspot.com/_sf3PjnA5kns/St276EPAhNI/AAAAAAAAADI/ggIf-DIIDe8/s400/proteomeViewer.png" border="1" alt="" id="BLOGGER_PHOTO_ID_5394674534903219410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The little mock-up that I have at the above address now appears to work. (No doubt this will screw up the minute that I publish this...). However, there were a number of gotchas that I had to address on the way, and in the interests of open science, common decency and my innate benevolence, I feel that I should share my impressive collection of Exceptions with you...&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;ResponseTooLargeException&lt;/span&gt;. Upon successfully matching one or more UniProt names, my Robot makes a request to my webservice for some mass spec data. If successful, this is then passed into the applet as a parameter, and - good times - all is well. One would hope. In reality, the mass spec data that it is after is a large pair of arrays, which sadly is a step too far and a response too large for the Google App Engine. The solution to this little quandary was to embed the webservice calling within the applet itself, rather than calling it outside and passing the results in. This also solved a niggling &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;java.io.IOException: Timeout while fetching...&lt;/span&gt; problem, which highlights the impatience of the Google App Engine and it's max timeout of 10 seconds.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;java.net.MalformedURLException: Invalid URL: http://beaconw.cs.manchester.ac.uk:8092/mcisb-web/DataViewer/index.jsp&lt;/span&gt;. Anyone see anything wrong with that? Me neither. A more lovely URL you could never wish to meet. However, on &lt;a href="http://code.google.com/appengine/docs/java/urlfetch/overview.html"&gt;further analysis&lt;/a&gt;, it seems that calling anything that is neither port 80 or 443 leads to failure and abject disappointment. My ingenious solution was to reconfigure Tomcat to run on port 80.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;So my take-home messages are, if you're calling anything from a Robot, make it short and snappy and on port 80/443. Obviously, your users will also thank you for adhering to the first bit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as the use of any of this goes, I'm not sure. I know that currently we ping e-mails around to one another with attachments containing Excel files with list of proteins that we've identified. Flirting with understatement, perhaps, but we should be able to improve on this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My next thought was that Google Wave will only be as good as the Robots and Gadgets that get developed for it. Apart from the niggles described above, 98% of the work is involved in generating the back-end database, web service and applet. The 2% of wrapping it into a Robot should be relatively easy. I understand that Cameron Neylon has developed a nice Robot that takes advantage of the ChemSpider webservice. Again, this is only possible because there is a comprehensive database and a webservice to call.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My - what are we on? - third thought is that with all of this whizz-bang technology, relying on applets is a bit 1996. I'm sure that there are far more sophisticated and applicable means of displaying such data using the Google suite of tools - I just happen to be an old dinosaur that is sticking to what he knows. But - hey - it's a proof-of-principle. Any suggested improvements would be greatly appreciated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Speaking of which...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You may have gathered that I've reared my ugly head on &lt;a href="http://friendfeed.com/neilswainston/comments"&gt;FriendFeed&lt;/a&gt; a few times in the last week, like an unpopular adolescent with a couple of bottles of fluorescent alcopops, attempting to get an invite to the cool kids' party. The sad fact is that I've not been able to test this (outside of the mock-up at the above URL) as I am, alas, &lt;i&gt;sans account.&lt;/i&gt; I would be very grateful if someone with a fistful of invites could casually throw one my way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Feel free to try it out in its intended environment, though. I'd be amazed if it works first time, but then again, the actual event handling bit that gets called when a Blip is updated is about three lines long, so you never know...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, if you like this sort of thing, source code is available from &lt;a href="http://mcisb.svn.sourceforge.net/viewvc/mcisb/mcisb-dataviewer/"&gt;SourceForge&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Update: I did manage to get an invite, have necked my alcopops, and have tried testing the Robot within wave itself: &lt;a href="http://neilswainston.blogspot.com/2009/11/coo-eee.html"&gt;Coo-eee!!&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-2010554334298169981?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/2010554334298169981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2009/10/we-are-robots.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/2010554334298169981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/2010554334298169981'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2009/10/we-are-robots.html' title='We are the Robots'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_sf3PjnA5kns/St276EPAhNI/AAAAAAAAADI/ggIf-DIIDe8/s72-c/proteomeViewer.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-4059229894122193329</id><published>2009-07-07T09:26:00.010+01:00</published><updated>2009-10-20T12:02:26.285+01:00</updated><title type='text'>The not-so-Great Software Giveaway</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=gWgwYV_sNJA"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 158px; height: 150px;" src="http://www.tcnj.edu/~drew6/panda01.jpg" border="1" alt="" /&gt;&lt;/a&gt;All of the code that I cobble together is freely available. Immediately. I check in changes on an hourly basis to the following address: &lt;a href="http://mcisb.sourceforge.net/"&gt;http://mcisb.sourceforge.net&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few of my colleagues think it ridiculous that the lifeblood of my future potential publication earnings are thrown out willy-nilly to the big, bad world at large. "What if someone downloads your stuff, develops it further, and then publishes it before you?" is the usual line of questioning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To be honest, I'd be more surprised if Halley's Comet was to come hurtling to Earth, crashing into Oslo as I was picking up my Nobel Prize on the same day that Middlesbrough beat Newcastle 6-5 in the Champions League final.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my experience, even when people are encouraged to use software that someone else has written (&lt;a href="http://sbml.org/Community/Programs/libAnnotationSBML"&gt;ahh, go on, go on, go on, please, go on, try it, feel free, etc. etc.&lt;/a&gt;), the chances of a successful partnership are up there with that of mating pandas. And this is software that is commented, documented (a little - ahem) and - yes, good grief - even tested.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So the other junk that you have lying around on your disk or repository is unlikely to lead to a publication gazumping. In fact, in my opinion again, if someone were to do this I would be almost flattered. Bioinformatics is littered with random, undocumented code for proprietary use by a single group, which then withers on the vine as soon as the grant ends and the writer clears off and gets a proper job in finance. If some &lt;i&gt;does&lt;/i&gt; actually use your code, it's perhaps a sign that a) what you are doing is useful, and b) you're a reasonably good programmer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Neither of which really applies to me. So, help yourself, and happy gazumping.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;P.S. I am mindful of the fact that Jeremy Clarkson got stung for making similar claims of debunking paranoia regarding the availability of his own &lt;a href="http://news.bbc.co.uk/1/hi/entertainment/7174760.stm"&gt;bank details&lt;/a&gt;. Still, he's a moron and deserves everything he gets. In my opinion.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-4059229894122193329?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/4059229894122193329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2009/07/not-so-great-software-giveaway.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/4059229894122193329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/4059229894122193329'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2009/07/not-so-great-software-giveaway.html' title='The not-so-Great Software Giveaway'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-5089807158662235357</id><published>2009-05-14T18:03:00.011+01:00</published><updated>2009-10-20T12:04:32.397+01:00</updated><title type='text'>Publish, perish, do neither?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.youtube.com/watch?v=32C0eKRQVt8"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 158px; height: 150px;" src="http://1.bp.blogspot.com/_sf3PjnA5kns/SgxPsSFp_pI/AAAAAAAAACg/3grJ_H6kStE/s200/dr-evil.jpg" border="1" alt="" id="BLOGGER_PHOTO_ID_5335727280715595410" /&gt;&lt;/a&gt;I've recently cobbled together a number of Java classes that I've been working on for a number of years into something approaching a coherent library.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Given the current vogue for giving names to objects, I plumbed for &lt;b&gt;libAnnotationSBML&lt;/b&gt;. Not the catchiest, but one that attempts to convey that:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;the work is related to the infinitely more successful, useful and downright better &lt;a href="http://sbml.org/Software/libSBML"&gt;libSBML&lt;/a&gt;&lt;/li&gt;&lt;li&gt;the work is related to &lt;a href="http://www.ebi.ac.uk/miriam/main/mdb?section=standard"&gt;SBML annotations&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In making both of these points, I feel it succeeds admirably.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyways, on to my point. As well as &lt;a href="http://www.slideshare.net/neilswainston/libannotationsbml"&gt;presenting&lt;/a&gt; this to a generally warm crowd at a recent &lt;a href="http://www.biomodels.net/meetings/2009/"&gt;SBML shindig&lt;/a&gt;, I've also attempted to publish this work in a proper grown-up scientific journal. One review to this made many valid, useful and intelligent suggestions, while the other responded along the lines of "who the hell would be interested in this?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Both had points. One perhaps slightly more thought-through than the other. I can assume the first reviewer was directly interested in the work and was effectively a member of its target audience. I also assume that the second reviewer was &lt;i&gt;not&lt;/i&gt; a member of the target audience and hence &lt;a href="http://s.bebo.com/app-image/7931873121/5411656627/PROFILE/i.quizzaz.com/img/q/u/08/04/18/snoop-dogg.jpg"&gt;dissed it to the max&lt;/a&gt;. However, I can forgive him/her this, as the work is so very specialised that at least 99.99% of the journal's readership would have no interest in it whatsoever. But isn't this the case for at least 99.99% of articles that do get published?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today I put a link and a few explanatory words about the work on the &lt;a href="http://sbml.org/Community/Programs/libAnnotationSBML"&gt;SBML website&lt;/a&gt;, along with a message on their mailing list and a nod towards their &lt;a href="http://twitter.com/sbmlnews"&gt;twitter&lt;/a&gt; account. Effectively, I've targeted the 0.01% who &lt;i&gt;may&lt;/i&gt; be interested very effectively, and not annoyed the 99.99% who wouldn't give a monkey's.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, my question is, do I &lt;i&gt;need&lt;/i&gt; to publish this work in a proper grown-up journal? Wouldn't I just be doing it on the off chance that my h-index score enjoys a modest bounce?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or should I just be writing more interesting papers?&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-5089807158662235357?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/5089807158662235357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2009/05/publish-perish-do-neither.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/5089807158662235357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/5089807158662235357'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2009/05/publish-perish-do-neither.html' title='Publish, perish, do neither?'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_sf3PjnA5kns/SgxPsSFp_pI/AAAAAAAAACg/3grJ_H6kStE/s72-c/dr-evil.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-905793152762173558.post-6743678254029330045</id><published>2009-04-30T16:56:00.009+01:00</published><updated>2009-04-30T21:50:14.000+01:00</updated><title type='text'>Confessions of a cynical blogger</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://twitter.com/MCHammer"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 150px; height: 150px;" src="http://aarkangel.files.wordpress.com/2008/11/0094631039058.jpg" border="1" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;After a very short month, I'm officially bored of Twitter. The lameness of my inane updates would, I think, have made this obvious. (See &lt;a href="http://www.twitter.com/neilswainston"&gt;http://www.twitter.com/neilswainston&lt;/a&gt; for clear confirmation of this fact).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Much as I enjoy the equally inane observations of &lt;a href="http://twitter.com/MCHammer"&gt;MC Hammer&lt;/a&gt;, I've more-or-less given up on the medium.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next obvious step is to start a blog.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next obvious question is "why?" I'm undertaking this purely from a work-context (or should that be "work") and I know that a couple of buddies (&lt;a href="http://duncan.hull.name/"&gt;Duncan Hull&lt;/a&gt; and &lt;a href="ttp://themindwobbles.wordpress.com/"&gt;Allyson Lister&lt;/a&gt;) conspire to provide interesting and readable blogs. I also recently read the rather good "&lt;a href="http://en.wikipedia.org/wiki/Here_comes_everybody"&gt;Here Comes Everybody&lt;/a&gt;" by Clay Shirky and this has gone some way to convince me that this is not an altogether pointless exercise.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, I'm not sure that the banality of my daily geeking would be of interest to the outside world, and I suspect that all of this nonsense will prove to be a waste of time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'd be very happy to be proven wrong, though.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/905793152762173558-6743678254029330045?l=neilswainston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://neilswainston.blogspot.com/feeds/6743678254029330045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://neilswainston.blogspot.com/2009/04/confessions-of-cynical-blogger.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/6743678254029330045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/905793152762173558/posts/default/6743678254029330045'/><link rel='alternate' type='text/html' href='http://neilswainston.blogspot.com/2009/04/confessions-of-cynical-blogger.html' title='Confessions of a cynical blogger'/><author><name>Neil Swainston</name><uri>http://www.blogger.com/profile/04760793596282530854</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://3.bp.blogspot.com/_sf3PjnA5kns/SfmwaLvjLeI/AAAAAAAAAAw/nu70mF6e4O0/S220/me.png'/></author><thr:total>1</thr:total></entry></feed>
