<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;C0cDQXk9fCp7ImA9WxJUFko.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482</id><updated>2009-07-15T08:17:50.764-07:00</updated><title>Noel O'Blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>135</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/baoilleach" type="application/atom+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">baoilleach</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;C0cDQXk8cSp7ImA9WxJUFko.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-5506681331702119022</id><published>2009-07-15T08:03:00.000-07:00</published><updated>2009-07-15T08:17:50.779-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-15T08:17:50.779-07:00</app:edited><title>ANN: Symposium on Visual Analysis of Chemical Data (ACS Spring 2010)</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3159/3026852045_0911380467_m.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 180px;" src="http://farm4.static.flickr.com/3159/3026852045_0911380467_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;b&gt;&lt;center&gt;First Call for Papers:&lt;br /&gt;Visual Analysis of Chemical Data&lt;br /&gt;239th ACS National Meeting&lt;br /&gt;San Francisco, March 21-25, 2010&lt;br /&gt;CINF Division&lt;/center&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Dear Colleagues,&lt;br /&gt;&lt;br /&gt;We wish to announce an upcoming symposium focusing on innovative methods for visual representation and analysis of chemical data. Just as Edward Tufte has championed maximizing clarity and information content in statistical graphics, there is a need for methods to display chemical information that will maximize understanding, and allow rapid analysis and decision making.&lt;br /&gt;&lt;br /&gt;We invite you to submit contributions that address various aspects of visualization of chemical data (such as structures, SAR data, literature, patents) including, but not limited to, the following topics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;With an ever increasing pool of descriptors, along with new and more sophisticated machine learning methods, QSAR models are becoming more difficult to interpret. How can information on model reliability, the presence of activity cliffs, and the range of applicability of a model and other relevant model properties be easily depicted?&lt;/li&gt;&lt;li&gt;Recently, virtual worlds 3D such as Second Life have presented new opportunities and challenges for the representation of chemical data. What is the potential of such a medium in education and communicating with the chemistry community?&lt;/li&gt;&lt;li&gt;Social software allows for rapid and convenient sharing of chemical data.  Examples include Google Spreadsheets, ManyEyes, DabbleDB, and wikis, including Wikipedia.  What are the implications for chemical research and education?&lt;/li&gt;&lt;li&gt;The visualization of the contents of large chemical datasets presents particular problems. How can an overview of the dataset be visualized so that it presents both the nature of the contents as well as the degree of diversity and similarity within the dataset? How can different datasets be visually compared?&lt;/li&gt;&lt;li&gt;Depicting 3D chemical information in 2D involves a loss of information. However, innovative 2D visualization methods can restore the most relevant information.&lt;/li&gt;&lt;li&gt;Chemical information comprises a diverse array of data types including chemical structures and diagrams (2D and 3D), associated assay results, conformations, QSAR models and their predictions. The visualization and integration of all these data into a single interface that aids interpretation and analysis is a continuing challenge.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;We would also like to point out that sponsorship opportunities are available.&lt;br /&gt;&lt;br /&gt;The on-line abstract submission system (&lt;a href="http://oasys.acs.org/acs/239nm/oasys.htm"&gt;OASYS&lt;/a&gt;) will be open for submissions from 24th August. A second announcement will be made at that time.&lt;br /&gt;&lt;br /&gt;Please contact Andrew, Jean-Claude or myself if you have any questions.&lt;br /&gt;&lt;br /&gt;Yours sincerely,&lt;br /&gt;   Noel O'Boyle&lt;br /&gt;&lt;br /&gt;On behalf of the symposium organizers:&lt;br /&gt;&lt;br /&gt;Dr. Jean-Claude Bradley,&lt;br /&gt;Drexel University, PA&lt;br /&gt;bradlejc@drexel.edu&lt;br /&gt;&lt;br /&gt;Dr. Andrew Lang,&lt;br /&gt;Oral Roberts University, OK&lt;br /&gt;alang@oru.edu&lt;br /&gt;&lt;br /&gt;Dr. Noel O’Boyle,&lt;br /&gt;Cambridge Crystallographic Data Centre, U.K.&lt;br /&gt;oboyle@ccdc.cam.ac.uk&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/prehensile/"&gt;prehensile&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-5506681331702119022?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=DJIelNHsDYU:j_Qba_YyBiI:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=DJIelNHsDYU:j_Qba_YyBiI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=DJIelNHsDYU:j_Qba_YyBiI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/DJIelNHsDYU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/5506681331702119022/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=5506681331702119022" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/5506681331702119022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/5506681331702119022?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/07/ann-symposium-on-visual-analysis-of.html" title="ANN: Symposium on Visual Analysis of Chemical Data (ACS Spring 2010)" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE8GRnc5cSp7ImA9WxJVGUU.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-1219001628915273130</id><published>2009-07-07T08:50:00.000-07:00</published><updated>2009-07-07T09:07:07.929-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T09:07:07.929-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Sledgehammer, meet nut - Using Eclipse for Python</title><content type="html">I usually use gvim or IDLE to edit Python files, but today I thought I'd try something a bit more heavyweight: &lt;a href="http://eclipse.org/"&gt;Eclipse&lt;/a&gt;. Eclipse is widely used in the Java world. It's open source and freely available, and most importantly there is a Python plugin for Eclipse called &lt;a href="http://pydev.sf.net/"&gt;PyDev&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So what does Eclipse have that IDLE doesn't? Well, integration with the Python debugger for a start. Also, this sort of code completion is quite handy (click for a larger image):&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_x5Hz3F0jd4Q/SlNwKq22M3I/AAAAAAAAAt0/eliN5O1NApo/s1600-h/blogpydev.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_x5Hz3F0jd4Q/SlNwKq22M3I/AAAAAAAAAt0/eliN5O1NApo/s400/blogpydev.png" alt="" id="BLOGGER_PHOTO_ID_5355747710478988146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It also has nice integration with &lt;a href="http://www.logilab.org/project/pylint"&gt;PyLint&lt;/a&gt; (see the bottom pane in the following figure) which catches various errors (e.g. mispelled variables) before you run a script:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_x5Hz3F0jd4Q/SlNwWOxuCAI/AAAAAAAAAt8/reFf5dRiMko/s1600-h/blogpydev_b.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 301px;" src="http://4.bp.blogspot.com/_x5Hz3F0jd4Q/SlNwWOxuCAI/AAAAAAAAAt8/reFf5dRiMko/s400/blogpydev_b.png" alt="" id="BLOGGER_PHOTO_ID_5355747909099718658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here are some notes:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I followed these &lt;a href="http://pydev.sourceforge.net/download.html"&gt;installation instructions&lt;/a&gt; and then sped through the &lt;a href="http://www.fabioz.com/pydev/manual_101_root.html"&gt;manual&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Pydev currently supports Eclipse 3.2 to 3.4. It took a while to find an Eclipse download page with version 3.4 but &lt;a href="http://download.eclipse.org/eclipse/downloads/"&gt;here&lt;/a&gt; it is. I installed Eclipse SDK 3.4.2.&lt;/li&gt;&lt;li&gt;Start Eclipse, and click on Help/Software Updates. Add http://pydev.sourceforge.net/updates/ to the list of update sites. Tick the box and click Install to install PyDev.&lt;/li&gt;&lt;li&gt;Following the details at http://www.fabioz.com/pydev/manual_101_interpreter.html, I added a Python interpreter (Name="Python 2.5", Executable="C:\Python25\python.exe").&lt;/li&gt;&lt;li&gt;Installing pylint on Windows is a pain, so I used &lt;a href="http://peak.telecommunity.com/DevCenter/EasyInstall"&gt;easy install&lt;/a&gt;:&lt;pre&gt;C:\Python25\Scripts\easy_install.exe pylint&lt;/pre&gt; In the PyLint configuration, you need to specify the location of lint.py. Mine was at C:\Python25\Lib\site-packages\pylint-0.18.0-py2.5.egg\pylint\lint.py.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-1219001628915273130?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=qTZDhqq8jWY:aA8_FDiWOEE:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=qTZDhqq8jWY:aA8_FDiWOEE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=qTZDhqq8jWY:aA8_FDiWOEE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/qTZDhqq8jWY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/1219001628915273130/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=1219001628915273130" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1219001628915273130?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1219001628915273130?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/07/sledgehammer-meet-nut-using-eclipse-for.html" title="Sledgehammer, meet nut - Using Eclipse for Python" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_x5Hz3F0jd4Q/SlNwKq22M3I/AAAAAAAAAt0/eliN5O1NApo/s72-c/blogpydev.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CEcGR3Y8eSp7ImA9WxJVEkU.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-3514966645849351370</id><published>2009-06-29T06:16:00.000-07:00</published><updated>2009-06-29T06:27:06.871-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-29T06:27:06.871-07:00</app:edited><title>I'll fix the bug...but only if you give me a public domain test file</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/RoSwNm96JQI/AAAAAAAAAVk/6PbFyht0f60/s1600/mesh.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 160px; height: 120px;" src="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/RoSwNm96JQI/AAAAAAAAAVk/6PbFyht0f60/s1600/mesh.gif" border="0" alt="" /&gt;&lt;/a&gt;Recently, &lt;a href="http://avogadro.sf.net"&gt;Avogadro&lt;/a&gt;/&lt;a href="http://openbabel.org"&gt;OpenBabel&lt;/a&gt; have been increasing their support for computational chemistry log files. I am hoping that they will learn from our experience at GaussSum/cclib. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://gausssum.sf.net"&gt;GaussSum&lt;/a&gt; was the first Python program I ever wrote, and still bears the hallmarks. When I first started GaussSum (a program which analyses the results of comp chem calculations), I would use the test cases from users to fix bugs. Then over time, I'd lose the test cases as I moved from computer to computer. I couldn't place the test cases in my version control system as the test cases might have been the results of someone's research, and they mightn't be happy to see them publicly available.&lt;br /&gt;&lt;br /&gt;Things came to head when dealing with the parsing of vibrational frequencies in the various versions of GAMESS. It turned out that each version of GAMESS (PC-GAMESS, WinGAMESS and GAMESS US) had slightly different output for vibrational frequencies. I ended up bouncing between code that worked for WinGAMESS but not GAMESS and vice versa, depending on who sent me the last bug report. In other words, I was wasting my time fixing bugs which might reappear later. It was around this time that (a) I realised I needed a test suite, and (b) I needed public domain test files, so I could use them in my test suite.&lt;br /&gt;&lt;br /&gt;The parser used by GaussSum is now available as a separate project, &lt;a href="http://cclib.sf.net"&gt;cclib&lt;/a&gt;, and is developed in collaboration with Adam Tenderholt and Karol Langner. This time I put a lot of thought into the test suite, and I think we've done very well. The parsers are initially developed using a set of calculations which are the same for each comp chem package; our test suite ensures that the same results are found in each case and that the units are consistent. We only fix bugs for which a public domain test file is provided ("I place this file in the public domain" is all we need to hear), and regression tests are easily added to the test suite. Our test suite has the final say on commits; commits are reverted if they cause an existing test to fail. This guarantees that cclib can only improve over time.&lt;br /&gt;&lt;br /&gt;The inevitable consequence of this policy is that some reported bugs don't get fixed. Sometimes the reporter simply does not respond to the query to place it in the public domain. On two occasions, the reporter was working in a pharmaceutical company and felt it was more hassle than it was worth to do the necessary paperwork to place it in the public domain. So it goes... On the other hand, we do now have a set of more than 200 comp chem log files which go a long way to ensuring that our parsers can handle anything that is thrown at them. The best way of getting these files is to check the &lt;a href="http://cclib.svn.sourceforge.net/viewvc/cclib/trunk/data/"&gt;data&lt;/a&gt; directory of cclib out of subversion and run wget.sh.&lt;br /&gt;&lt;br /&gt;In conclusion, if you are thinking of writing software that handles comp chem files, either try to collaborate with others who are working on the same problem (e.g. cclib or OpenBabel), or at the very least take into account some of the comments here. Otherwise, you are simply building a house of cards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-3514966645849351370?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=cLQ4HCCqPuY:0tR2qOfJ8yY:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=cLQ4HCCqPuY:0tR2qOfJ8yY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=cLQ4HCCqPuY:0tR2qOfJ8yY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/cLQ4HCCqPuY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/3514966645849351370/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=3514966645849351370" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3514966645849351370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3514966645849351370?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/06/ill-fix-bugbut-only-if-you-give-me.html" title="I'll fix the bug...but only if you give me a public domain test file" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/RoSwNm96JQI/AAAAAAAAAVk/6PbFyht0f60/s72-c/mesh.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;DEECQno9eSp7ImA9WxJWFE8.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-8786195409056253175</id><published>2009-06-19T08:39:00.000-07:00</published><updated>2009-06-19T08:51:03.461-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-19T08:51:03.461-07:00</app:edited><title>Using PyActiveResource to access ChemCaster</title><content type="html">&lt;a href="http://chemcaster.com/"&gt;ChemCaster&lt;/a&gt;, from Rich's &lt;a href="http://metamolecular.com/"&gt;Metamolecular&lt;/a&gt;, is a platform for developing web-based cheminformatics applications. The advantage of such a system is that the user does not need to install any special software, nor does the application developer need to maintain a server.&lt;br /&gt;&lt;br /&gt;Rich invited me to take it for a spin, so I signed up for a trial account and moved quickly on to my first problem, how do I access the API through Python? &lt;br /&gt;&lt;br /&gt;It turns out that RESTful APIs tend to have common patterns, a fact which is taken advantage of by &lt;a href="http://api.rubyonrails.org/files/vendor/rails/activeresource/README.html"&gt;Active Resource&lt;/a&gt;, a Ruby library for defining classes which directly map onto the objects implied by a RESTful API. Or something like that - I neglected to read any documentation. Instead I just took Rich's &lt;a href="http://products.metamolecular.com/2009/05/09/the-chemcaster-web-api"&gt;example&lt;/a&gt; and tried to code it up in Python using &lt;a href="http://code.google.com/p/pyactiveresource/"&gt;PyActiveResource&lt;/a&gt; (this is a documentation-free project so using it is quite exciting).&lt;br /&gt;&lt;br /&gt;Et voil&amp;aacute;&lt;script src="http://gist.github.com/125429.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-8786195409056253175?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=9kMN3GSqtYA:RliWNxYAxwk:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=9kMN3GSqtYA:RliWNxYAxwk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=9kMN3GSqtYA:RliWNxYAxwk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/9kMN3GSqtYA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/8786195409056253175/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=8786195409056253175" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/8786195409056253175?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/8786195409056253175?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/06/using-pyactiveresource-to-access.html" title="Using PyActiveResource to access ChemCaster" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;AkcHRnY9cCp7ImA9WxJXF00.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-5885228083612353951</id><published>2009-06-09T01:32:00.000-07:00</published><updated>2009-06-11T01:13:57.868-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-11T01:13:57.868-07:00</app:edited><title>From zero to Zotero - One man's journey out of PDF hell</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3180/3007800629_55a3cf70e1_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://farm4.static.flickr.com/3180/3007800629_55a3cf70e1_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://www.zotero.org"&gt;Zotero&lt;/a&gt; is a reference management software. Sorry, let me correct that - Zotero is &lt;b&gt;THE&lt;/b&gt; reference management software.  I had tried Zotero before, and it certainly looked good; but frankly I couldn't figure out how to get it to work and so reverted to my usual system, the 'zero' of the title. Hearing the &lt;a href="http://quintessenceofham.org/2009/06/04/thomson-reuters-lawsuit-dismissed/"&gt;news&lt;/a&gt; that Endnote vs. Zotero was just thrown out of court, I decided to try it again.&lt;br /&gt;&lt;br /&gt;And it's just amazing.&lt;br /&gt;&lt;br /&gt;Let me begin by describing a typical workflow:&lt;br /&gt;(1) Go to the summary page for an ACS paper online&lt;br /&gt;(2) Click on the icon that appears in the address bar (looks like a sheet of paper with writing).&lt;br /&gt;&lt;br /&gt;That's it. You've just saved the PDF, the HTML full-text and the paper's metadata.&lt;br /&gt;&lt;br /&gt;If you've created an account on zotero.org (free of course!), you can synch your library so that multiple computers can share the same data. And best of all you can also synch the attachments (i.e. PDFs, HTML pages) if you have a WebDAV account (e.g. from your university or in my case, &lt;a href="http://jungledisk.com"&gt;JungleDisk Plus&lt;/a&gt;/Amazon S3). If that wasn't enough, it also integrates with Word to make it easy to prepare a publication (&lt;del&gt;though I haven't tested this&lt;/del&gt; &lt;b&gt;Update&lt;/b&gt;: it works just fine, but you first need to install the bibliographic styles you need from Zotero settings/Preferences/Styles/Get additional styles).&lt;br /&gt;&lt;br /&gt;In other words, Zotero makes it easy to download papers, back them up, make them accessible from any computer and reference them in papers.&lt;br /&gt;&lt;br /&gt;Zotero is open source and freely available from &lt;a href="http://www.zotero.org"&gt;www.zotero.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notes:&lt;/b&gt; I'm using Zotero 2.0b5. In the Zotero preferences (click on the gear icon), choose "Automatically attach PDFs and other files when saving items" in the General Tab. JungleDisk and Amazon cost money (we're talking around $1.50 a month), but there may be free alternatives for WebDAV. For any websites that aren't currently supported by Zotero, adding new translators has been made easy. All of the JavaScript files for the translators are stored in a folder on your computer and can easily be extended or added to. That said, I've had no trouble downloading PDFs from Sciencedirect, ACS, RSC, Wiley or BMC.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/jazzmodeus/"&gt;jazzmodeus&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-5885228083612353951?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=f6XkKrzUoX0:BpU1TYdGDNE:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=f6XkKrzUoX0:BpU1TYdGDNE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=f6XkKrzUoX0:BpU1TYdGDNE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/f6XkKrzUoX0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/5885228083612353951/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=5885228083612353951" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/5885228083612353951?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/5885228083612353951?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/06/from-zero-to-zotero-one-mans-journey.html" title="From zero to Zotero - One man's journey out of PDF hell" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;DUcHQHgyfSp7ImA9WxJXEUQ.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-6336982203021295111</id><published>2009-06-05T03:09:00.000-07:00</published><updated>2009-06-05T03:17:11.695-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-05T03:17:11.695-07:00</app:edited><title>The best time to optimise</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1175/908946494_c37f4e8970_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://farm2.static.flickr.com/1175/908946494_c37f4e8970_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;As a scientist, I worry more about bugs in software than about speed. Changing correct code to improve speed can introduce errors as well as make it unreadable for others. Sometimes though it's nice to find cases where simple changes can improve the performance.&lt;br /&gt;&lt;br /&gt;The 3D structure generation code in OpenBabel uses templates to handle the geometry of rings. There are about 2500 templates, which are represented by SMARTS patterns and associated coordinates (see fragments.txt in the distribution). The SMARTS patterns are ordered from large to small. Now, testing 2500 SMARTS patterns against a molecule takes a wee while so I was interested in seeing whether the process could be speeded up.&lt;br /&gt;&lt;br /&gt;To begin with, I timed the code for a test set of 1000 PubChem molecules: it took 60ms per structure. Considering that the easiest way to speed something up is to avoid doing it in the first place, I changed the loop to terminate once all ring atoms had been matched. This brought it down to 38ms per structure. Then I changed it so that it skipped any SMARTS patterns that had more atoms than the number of ring atoms in the molecule: now down to 30ms. This is now within an order of magnitude of greased lightning.&lt;br /&gt;&lt;br /&gt;In fact, I could have done slightly better than this; I could have skipped any SMARTS patterns with more atoms than the number of atoms in the largest isolated ring system in the molecule. Calculating this value is a bit of work though and may offset the associated performance gain, and so this has been left as an exercise for the reader.&lt;br /&gt;&lt;br /&gt;How else could this code be speeded up? Well, the SMARTS matcher can itself be improved. It currently uses an exhaustive depth-first search algorithm instead of something more optimal like Vflib2. This would improve performance across the board as the SMARTS code is widely used for a variety of tasks. Alternatively, the SMARTS patterns could be fingerprinted based on particular common patterns, e.g. 5-membered rings. If a molecule had no 5-membered rings, such patterns could be skipped.&lt;br /&gt;&lt;br /&gt;To begin with, though, the code should be profiled more precisely. It may be that 25 of those 30ms have nothing to do with this loop. In that case, further optimisations may be more work than they are worth. &lt;br /&gt;&lt;br /&gt;These are the sorts of small studies that would fit nicely into a summer project for an undergrad computer science or chemistry student. If you want to sponsor OpenBabel development in this way, &lt;a href="mailto:openbabel-devel@lists.sf.net"&gt;contact us&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/laserstars/"&gt;jpctalbot&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-6336982203021295111?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=SJ9LFPmEaRU:FTbjbXYznJQ:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=SJ9LFPmEaRU:FTbjbXYznJQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=SJ9LFPmEaRU:FTbjbXYznJQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/SJ9LFPmEaRU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/6336982203021295111/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=6336982203021295111" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/6336982203021295111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/6336982203021295111?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/06/best-time-to-optimise.html" title="The best time to optimise" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkQDRncyeSp7ImA9WxJQFEg.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-218542366793194929</id><published>2009-05-27T09:13:00.000-07:00</published><updated>2009-05-27T11:52:57.991-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-27T11:52:57.991-07:00</app:edited><title>The RSC - Value for money?</title><content type="html">I don't usually advertise for chemical societies, but in these recessionary times I thought the following might be of interest to some readers.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rsc.org"&gt;RSC&lt;/a&gt; members have:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;free access to Wiley, Elsevier, and Springer chemistry journals&lt;/li&gt;&lt;li&gt;free access to 913 chemistry e-books from a variety of sources&lt;/li&gt;&lt;li&gt;20% off Pearson Education Books, 30% off Wiley, 35% off Blackwell&lt;/li&gt;&lt;li&gt;and most importantly, £5 off Pizza Express Club membership&lt;/li&gt;&lt;/ul&gt;Sure, chemistry societies organise conferences, enable networking, provide travel grants, and lobby politicians; but any society that doesn't look after its most vulnerable members by providing discounted pizza is not a society I want to be a member of.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-218542366793194929?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=xmQqTEoN46I:R2BFrFIjrco:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=xmQqTEoN46I:R2BFrFIjrco:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=xmQqTEoN46I:R2BFrFIjrco:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/xmQqTEoN46I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/218542366793194929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=218542366793194929" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/218542366793194929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/218542366793194929?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/05/rsc-value-for-money.html" title="The RSC - Value for money?" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;A0ECQng6fip7ImA9WxJRGUw.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-934723755945700861</id><published>2009-05-21T08:22:00.000-07:00</published><updated>2009-05-21T08:27:43.616-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-21T08:27:43.616-07:00</app:edited><title>Have your hamburger and eat it - Edit molecules in PDFs II</title><content type="html">In &lt;a href="http://baoilleach.blogspot.com/2008/12/have-your-hamburger-and-eat-it-edit.html"&gt;Part I&lt;/a&gt;, I showed how to hack some code together that allowed you to paste images directly from the clipboard (e.g. from a PDF) into Beda's BKChem, a 2D drawing program. The magic conversion from image to chemical was done by Igor's &lt;a href="http://osra.sf.net"&gt;OSRA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Well, Igor has taken this idea and run with it. The &lt;a href="http://osra.sf.net"&gt;latest version&lt;/a&gt; of OSRA now includes plugins for &lt;a href="bkchem.zirael.org"&gt;BKChem&lt;/a&gt;, &lt;a href="http://www.symyx.com/micro/getdraw/"&gt;Symyx Draw&lt;/a&gt;, &lt;a href="http://molsketch.sf.net"&gt;MolSketch&lt;/a&gt; and &lt;a href="http://accelrys.com/products/scitegic/"&gt;Pipeline Pilot&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;If you use the Windows installer, the Symyx Draw plugin is automatically installed and adds an "Import Structures from OSRA" option to the File menu. The first time you choose it, you will need to change the path to something like "C:\Program Files\osra\osra.exe" under "Settings...". Here's the plugin in action:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/ShVyJ7f0HoI/AAAAAAAAAs4/yrlcglO4YQA/s1600-h/osrablog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 389px;" src="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/ShVyJ7f0HoI/AAAAAAAAAs4/yrlcglO4YQA/s400/osrablog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5338298448233111170" /&gt;&lt;/a&gt;&lt;br /&gt;Note that the other plugins appear to be only available from the Windows .zip release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-934723755945700861?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=ay8oUtb_5Fk:RyJSS4I2z0k:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=ay8oUtb_5Fk:RyJSS4I2z0k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=ay8oUtb_5Fk:RyJSS4I2z0k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/ay8oUtb_5Fk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/934723755945700861/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=934723755945700861" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/934723755945700861?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/934723755945700861?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/05/have-your-hamburger-and-eat-it-edit.html" title="Have your hamburger and eat it - Edit molecules in PDFs II" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/ShVyJ7f0HoI/AAAAAAAAAs4/yrlcglO4YQA/s72-c/osrablog.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;D04HQn4_fSp7ImA9WxJRFkk.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-3864246577441938019</id><published>2009-05-16T03:26:00.000-07:00</published><updated>2009-05-18T04:25:33.045-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-18T04:25:33.045-07:00</app:edited><title>How do enzyme mechanisms evolve?</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2361/1986026759_232624cf71_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 240px;" src="http://farm3.static.flickr.com/2361/1986026759_232624cf71_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;Evolution is a fascinating topic. Although the principal mechanism by which evolution occurs is quite simple to understand, namely the introduction of changes (mutations) into the DNA, the consequences that follow are enormous. &lt;br /&gt;&lt;br /&gt;The term selective pressure is used to describe an imaginary operator that affects the incidence of particular mutations in a population. What makes evolution difficult for me to get my head around is that selection operates on many levels. In a population, a particular physical characteristic might be more advantageous (think of the famous finches) or more attractive. In your DNA, a particular mutation might preserve the amino acid coded for, or it may change to another amino acid that does not affect the protein's function. On the other hand, if the amino acid is involved in the catalytic action of the protein it's going to be conserved, right? But then how do new mechanisms evolve?&lt;br /&gt;&lt;br /&gt;My former postdoc supervisor, &lt;a href="http://www-mitchell.ch.cam.ac.uk/"&gt;Dr. John Mitchell&lt;/a&gt;, is currently advertising a PhD position on "&lt;a href="http://www-mitchell.ch.cam.ac.uk/PhD_evolution.html"&gt;Modelling the Evolution of Enzyme Catalysis&lt;/a&gt;" at the University of St. Andrews. I'm particularly interested in this project as it builds on &lt;a href="http://baoilleach-papercuts.blogspot.com/2007/04/how-similar-are-two-reaction-mechanisms.html"&gt;earlier work&lt;/a&gt; I carried out in the Mitchell Group along with &lt;a href="http://www.ebi.ac.uk/Information/Staff/person_maintx.php?s_person_id=711"&gt;Gemma Holliday&lt;/a&gt; and &lt;a href="http://babbittlab.ucsf.edu/daniel.html"&gt;Daniel Almonacid&lt;/a&gt;. Here's an excerpt from the project description:&lt;blockquote&gt;We will create a simulation using a population of model enzyme-catalysed reactions, mimicking a state early in evolutionary history, and allow them to evolve in EC space. The reactions will consist of steps and be represented, in a manner familiar from genetic algorithms, by "chromosomes" describing the chemical properties of each step. Parameters will control the likelihood of different kinds of evolutionary event, such as a change of substrate with the same underlying chemical mechanism, taking place. The simulations will be calibrated, and then compared with the results from a study of real-world convergent and divergent evolution.&lt;/blockquote&gt;Cool. Closing date 31 July.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/cpurrin1/"&gt;Colin Purrington&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-3864246577441938019?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=oINSaooGSQY:VJdyA48oDgU:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=oINSaooGSQY:VJdyA48oDgU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=oINSaooGSQY:VJdyA48oDgU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/oINSaooGSQY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/3864246577441938019/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=3864246577441938019" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3864246577441938019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3864246577441938019?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/05/how-do-enzyme-mechanisms-evolve.html" title="How do enzyme mechanisms evolve?" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUcARn4_eSp7ImA9WxJSFUQ.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-1140760841327357197</id><published>2009-05-05T09:12:00.000-07:00</published><updated>2009-05-06T01:04:07.041-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T01:04:07.041-07:00</app:edited><title>Manipulating PDFs with Open Source Tools - Part II</title><content type="html">&lt;a href="http://baoilleach.blogspot.com/2007/10/at-last-merge-split-and-create-pdfs.html"&gt;Part I&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1421/1471885399_18ac431eab_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 160px; height: 240px;" src="http://farm2.static.flickr.com/1421/1471885399_18ac431eab_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;There are a couple of journals that have rather generous margins around the text. I prefer to print out two pages per sheet to avoid wasting paper, so it would be nice to be able to remove those margins and increase the size of the text instead.&lt;br /&gt;&lt;br /&gt;pdfcrop by Heiko Oberdiek allows you to do just that. It's included with Debian Linux, and "sudo apt-get install texlive-pdfetex" will install it. On other (lesser) Linux distributions you may have to check &lt;a href="http://www.cpan.org"&gt;CPAN&lt;/a&gt; or &lt;a href="http://www.ctan.org"&gt;CTAN&lt;/a&gt;. Once installed, a straightforward "pdfcrop withmargin.pdf nomargin.pdf" will do the conversion.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; A reader points out that &lt;a href="http://www.tug.org/texlive/"&gt;Tex Live 2008&lt;/a&gt; includes pdfcrop and is available for both Windows and Linux.&lt;br /&gt;&lt;br /&gt;Note that pdfcrop should not be confused with &lt;a href="http://pdfcrop.sf.net"&gt;PDFCrop&lt;/a&gt;. There's also a patch of pdfcrop called &lt;a href="http://code.google.com/p/pdfcrop2/"&gt;pdfcrop2&lt;/a&gt;, but I think that covers the current crop.&lt;br /&gt;&lt;br /&gt;And spare a thought for &lt;a href="http://en.wikipedia.org/wiki/Fermat%27s_Last_Theorem"&gt;Fermat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/bgjohnson/"&gt;B.G. Johnson&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-1140760841327357197?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=fsxFVU7wcXY:ty79O7f_NLo:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=fsxFVU7wcXY:ty79O7f_NLo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=fsxFVU7wcXY:ty79O7f_NLo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/fsxFVU7wcXY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/1140760841327357197/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=1140760841327357197" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1140760841327357197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1140760841327357197?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/05/manipulating-pdfs-with-open-source.html" title="Manipulating PDFs with Open Source Tools - Part II" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUEHSHk7cSp7ImA9WxJSFU4.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-3402450883199558781</id><published>2009-05-05T08:33:00.001-07:00</published><updated>2009-05-05T08:33:59.709-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-05T08:33:59.709-07:00</app:edited><title>ChemPad - Protecting you from chemical structure software</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://graphics.cs.brown.edu/research/chempad/ChemPadIcon.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 64px; height: 64px;" src="http://graphics.cs.brown.edu/research/chempad/ChemPadIcon.png" border="0" alt="" /&gt;&lt;/a&gt;A colleague has just pointed me to &lt;a href="http://graphics.cs.brown.edu/research/chempad/home.html"&gt;ChemPad&lt;/a&gt;, an interesting piece of software that allows chemists to draw chemical diagrams directly into a computer on a Tablet PC. It was designed as a tool to enable undergraduate chemists to quickly enter chemical structures and generate 3D diagrams with which they could gain a deeper understanding of structures. Hash and wedge bonds are understood and are converted faithfully to 3D, for example.&lt;br /&gt;&lt;br /&gt;From the point of view of teaching chemistry undergraduates, such software may be preferable to ChemDraw and friends as it allows them to develop the skill of drawing diagrams by hand. Of course, not everyone has a tablet PC but one could imagine similar software for the iPhone or just a regular PC driven by a mouse.&lt;br /&gt;&lt;br /&gt;ChemPad is free but not open source, and Windows only. The &lt;a href="http://graphics.cs.brown.edu/research/chempad/home.html"&gt;ChemPad website&lt;/a&gt; has tutorials and videos of the software in use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-3402450883199558781?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=U8FhR3TcYnQ:YOizMceXOFk:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=U8FhR3TcYnQ:YOizMceXOFk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=U8FhR3TcYnQ:YOizMceXOFk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/U8FhR3TcYnQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/3402450883199558781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=3402450883199558781" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3402450883199558781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3402450883199558781?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/05/chempad-protecting-you-from-chemical.html" title="ChemPad - Protecting you from chemical structure software" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;DkUMR3oycSp7ImA9WxJTFUs.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-7600793458343348205</id><published>2009-04-24T02:00:00.000-07:00</published><updated>2009-04-24T02:11:26.499-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-24T02:11:26.499-07:00</app:edited><title>Broken symmetry - Can SMILES and InChI ensure canonicalisation?</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3032/2446394912_5c2c32097b_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://farm4.static.flickr.com/3032/2446394912_5c2c32097b_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;I've been working on the SMILES code in OpenBabel over the last while. The longer I've spent on it, the more impressed I've been with how it has been handled in the code and also with what a great idea SMILES was in the first place. The same goes for &lt;a href="http://www.inchi.info/"&gt;InChI&lt;/a&gt;, which has a slightly different goal, but which goes the extra mile and solves normalisation problems which I didn't even know existed.&lt;br /&gt;&lt;br /&gt;But do they work? Can their canonicalisation procedures ensure that two identical molecular graphs result in the same canonical SMILES or InChI?&lt;br /&gt;&lt;br /&gt;The InChI canonicalisation procedure is summarised in Rich's &lt;a href="http://depth-first.com/articles/2006/08/12/inchi-canonicalization-algorithm"&gt;post&lt;/a&gt;. The Daylight algorithm is in &lt;a href="http://dx.doi.org/10.1021/ci00062a008"&gt;Weininger*3, JCICS, 1989, 29, 97&lt;/a&gt;. And the review of the field that throws both into question is Ivanciuc's review of Processing Constitutional Information in Gasteiger's Handbook of Cheminformatics.&lt;br /&gt;&lt;br /&gt;The key question here is whether the SMILES and InChI algorithms are capable of identifying automorphisms. There is a brute force way to do this, but both SMILES and InChI try to avoid this by identifying symmetry classes using extended connectivity and various graph invariants. An explicit automorphism check is not described as part of either algorithm but yet Ivanciuc argues repeatedly (e.g. at the end of 5.1.4) that any canonicalisation algorithm that does not include an explicit automorphism check "is incomplete, and its use in a chemical database...is unreliable".&lt;br /&gt;&lt;br /&gt;The funny thing is that although the SMILES paper came out several years prior to Gasteiger's handbook (1993 vs. 2003), it is not referenced. Furthermore, the InChI developers have followed the same route more recently.&lt;br /&gt;&lt;br /&gt;I leave the following question as an exercise for the reader: if a counterexample to the SMILES or InChI algorithms existed, how would one find it?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/23174201@N06/"&gt;_Blaster_&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-7600793458343348205?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=pM1c9O0oVjA:DNXnwFCOZK4:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=pM1c9O0oVjA:DNXnwFCOZK4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=pM1c9O0oVjA:DNXnwFCOZK4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/pM1c9O0oVjA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/7600793458343348205/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=7600793458343348205" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/7600793458343348205?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/7600793458343348205?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/04/broken-symmetry-can-smiles-and-inchi.html" title="Broken symmetry - Can SMILES and InChI ensure canonicalisation?" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;DUEMR3s4eyp7ImA9WxVaFkQ.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-3425298507502281224</id><published>2009-04-14T01:18:00.000-07:00</published><updated>2009-04-14T01:28:06.533-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-14T01:28:06.533-07:00</app:edited><title>Are you on my side or not? It's E/Z</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/101/316822936_ac964245d2_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 160px;" src="http://farm1.static.flickr.com/101/316822936_ac964245d2_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;Handling cis/trans stereochemistry with SMILES should be easy, right? You have the canonical examples for &lt;i&gt;trans&lt;/i&gt;:&lt;br /&gt;&lt;pre&gt;A. I/C=C/Cl&lt;br /&gt; (I is down, Cl is up)&lt;br /&gt;B. I\C=C\Cl&lt;br /&gt; (I is up, Cl is down)&lt;/pre&gt;and &lt;i&gt;cis&lt;/i&gt;:&lt;br /&gt;&lt;pre&gt;C. I/C=C\Cl (both are down)&lt;br /&gt;D. I\C=C/Cl (both are up)&lt;/pre&gt;The "/" or "\" symbols should be chosen based on whether the substituent occurs before or after the atom attached to the double-bond. Bearing this in mind, the following represents the same &lt;i&gt;trans&lt;/i&gt; structure as A:&lt;pre&gt;E. C(=C/Cl)\I&lt;/pre&gt;Note that the effect of moving the "I" from one side of the "C" to the other (that is, A vs E) causes the bond symbol to change.&lt;br /&gt;&lt;br /&gt;When ring closures occur on the double bond, a further complication arises as the stereobond appears twice, once at each end of the ring closure. The symbol indicating the stereochemistry should only appear at the end on the double bond:&lt;br /&gt;&lt;pre&gt;F. I/C=C\1/CCCN1&lt;/pre&gt;Of course, where two substituents are shown explicitly at one end of a double bond, it's not necessary to show the stereochemisty for both of the bonds (although it makes things clearer). That is, the following two representations are identical to F:&lt;pre&gt;G. I/C=C1/CCCN1&lt;br /&gt;H. I/C=C\1CCCN1&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/suttonhoo22/"&gt;suttonhoo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-3425298507502281224?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=40zarzCL2tw:KpBqNIwsjaw:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=40zarzCL2tw:KpBqNIwsjaw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=40zarzCL2tw:KpBqNIwsjaw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/40zarzCL2tw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/3425298507502281224/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=3425298507502281224" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3425298507502281224?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/3425298507502281224?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/04/are-you-on-my-side-or-not-its-ez.html" title="Are you on my side or not? It's E/Z" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D0EMRXc4fSp7ImA9WxVbF0s.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-1730078076838725784</id><published>2009-04-03T06:02:00.000-07:00</published><updated>2009-04-03T06:34:44.935-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-03T06:34:44.935-07:00</app:edited><title>Some short stories</title><content type="html">&lt;ul&gt;&lt;li&gt;I want to flag up &lt;b&gt;Andrew Dalke's course&lt;/b&gt; at the end of April on &lt;a href="http://www.dalkescientific.com/training/#leipzig"&gt;Python and cheminformatics&lt;/a&gt;. While I might disagree with Andrew's toolkit of choice, there's no doubt that the skills learnt will be of great benefit to any cheminformatician in their day-to-day work. As well as a cheminformatics portion, the course includes matplotlib (plotting), communicating with Excel, XML processing, subprocess (for calling command-line programs), NumPy, R, SQL and Django.&lt;/li&gt;&lt;li&gt;The first issue of &lt;a href="http://www.jcheminf.com/"&gt;Journal of Cheminformatics&lt;/a&gt; has hit the electronic shelves. Point your RSS reader to the &lt;a href="http://www.jcheminf.com/rss/"&gt;feed&lt;/a&gt;. Best of luck to Christoph and David.&lt;/li&gt;&lt;li&gt;Is 2009 the year of OChRe on the desktop? After almost a decade of little development in this area, we have in quick succession papers on &lt;a href="http://baoilleach.blogspot.com/2009/02/new-software-for-ochre-chemreader.html"&gt;ChemReader&lt;/a&gt;, &lt;a href="http://baoilleach.blogspot.com/2009/02/extract-of-chemical-paper-on-osra.html"&gt;OSRA&lt;/a&gt; and now &lt;a href="http://pubs.acs.org/doi/abs/10.1021/ci800449t"&gt;Clide Pro&lt;/a&gt;, an update of the venerable Clide. The techniques used by the new version are described in detail in the paper. Unfortunately, there is little in the way of comparison either to the original Clide or other OChRe software. On the plus side, the dataset of images discussed in the paper has been made available as supporting material with the intention of forming part of a community benchmark for performance comparisons (although it's not clear whether this dataset was also used for training the software).&lt;/li&gt;&lt;li&gt;There seems to be some confusion over the name of this field. Is it OSR (Optical Stucture Recognition, according to OSRA), OCR (Optical Chemical Recognition, ala chemOCR), OCSR (you guessed it, Optical Chemical Structure Recognition, as referred to in the Clide Pro paper), or OChRe (Optical Chemical Recognition again, but spelling out a real word; it also has that InChI up-and-down thing going on)?&lt;/li&gt;&lt;li&gt;Did your experiments fail again? Tell me about it. I mean that literally, because you've got your choice of journals to publish in. There's the &lt;a href="http://www.arjournals.com/ojs/index.php?journal=Chem&amp;amp;page=index"&gt;All Results Journal&lt;/a&gt; ("all results are good results") or (for the more mathematically inclined) &lt;a href="http://math.rejecta.org/"&gt;Rejecta Mathematica&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-1730078076838725784?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=QUY1LF_aqIM:cLL8wDCEX_A:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=QUY1LF_aqIM:cLL8wDCEX_A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=QUY1LF_aqIM:cLL8wDCEX_A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/QUY1LF_aqIM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/1730078076838725784/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=1730078076838725784" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1730078076838725784?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1730078076838725784?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/04/some-short-stories.html" title="Some short stories" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;DUEHR3s6fSp7ImA9WxVUGEU.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-2818989542913244159</id><published>2009-03-24T02:08:00.000-07:00</published><updated>2009-03-24T02:40:36.515-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T02:40:36.515-07:00</app:edited><title>The Clockwisdom of SMILES Part II</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/98/245744537_9b2401b807_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 160px;" src="http://farm1.static.flickr.com/98/245744537_9b2401b807_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;As many readers of this blog will be aware, a chiral SMILES is not a lopsided grin. Instead it is a way of describing the relative spatial arrangement of groups around a chiral centre using SMILES notation.&lt;br /&gt;&lt;br /&gt;The following examples investigate this notation. The stereotypical examples are the following:&lt;pre&gt;A. C[C@](Br)(Cl)I - ACW(C,Br,Cl,I)&lt;br /&gt;B. C[C@H](Br)I    - ACW(C,H,Br,I)&lt;/pre&gt;where ACW(w,x,y,z) indicates anticlockwise in terms of x,y,z when looking from w. However, note that the first group does not necessarily need to appear before the chiral carbon:&lt;pre&gt;C. [C@](C)(Br)(Cl)I - ACW(C,Br,Cl,I) (Same as A)&lt;br /&gt;D. [C@H](C)(Br)I    - ACW(H,C,Br,I)  (Opposite of B)&lt;/pre&gt;&lt;br /&gt;What about ring closures? These are handled as followed:&lt;pre&gt;E. C[C@H]1CCN1 -&lt;br /&gt;   ACW(C,H,N,C) (the 1 indicates a bond to the chiral C)&lt;br /&gt;F. C[C@]12N(CC2)C1 -&lt;br /&gt;   ACW(C, the C1 carbon, the C2 carbon, N)&lt;br /&gt;G. C[C@@]21N(CC2)C1 -&lt;br /&gt;   CW(C, the C2 carbon, the C1 carbon, N) (the same as F)&lt;/pre&gt;&lt;br /&gt;Note that ring closures directly before an atom do not indicate a bond to that atom. Try to draw the following and compare your result to that given by Daylight's &lt;a href="http://www.daylight.com/daycgi/depict/"&gt;Depict service&lt;/a&gt;:&lt;pre&gt;H. [C@@]123[C@H](C(C=C3)(C)C)CC[C@@](C1)(CCC2)C&lt;/pre&gt;If you got that right, consider yourself a SMILES ninja.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Credit&lt;/b&gt;: Thanks to &lt;a href="http://www.emolecules.com"&gt;Craig James&lt;/a&gt; for his patient explanations.&lt;br /&gt;&lt;b&gt;Image credit&lt;/b&gt;: &lt;a href="http://www.flickr.com/photos/sean-b/"&gt;sean-b&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-2818989542913244159?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=QhekhhLkLXw:2ymZYBXN8fw:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=QhekhhLkLXw:2ymZYBXN8fw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=QhekhhLkLXw:2ymZYBXN8fw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/QhekhhLkLXw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/2818989542913244159/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=2818989542913244159" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/2818989542913244159?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/2818989542913244159?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/03/clockwisdom-of-smiles-part-ii.html" title="The Clockwisdom of SMILES Part II" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DU8NQ3k5fyp7ImA9WxVUFUU.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-2310090857160566424</id><published>2009-03-20T15:01:00.000-07:00</published><updated>2009-03-20T15:24:52.727-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-20T15:24:52.727-07:00</app:edited><title>Time for a test - Any questions?</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/62/202872717_a8a4799419_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://farm1.static.flickr.com/62/202872717_a8a4799419_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;I'm a great believer in tests for code quality. In fact, I don't want to contribute code to a project if I can't add a test to the test suite. This is particularly important in collaborative projects where changes by others might impact on bugs I've fixed or features I've added. I've learned my lesson in the past. With a test suite, I can be sure that everything is still working the way I expect it.&lt;br /&gt;&lt;br /&gt;I've recently started a new test suite for OpenBabel called &lt;b&gt;&lt;a href="http://github.com/baoilleach/obunittest/tree/master"&gt;obunittest&lt;/a&gt;&lt;/b&gt;. Although OpenBabel already has a test suite ("make test"), I wanted to have a test suite written in Python where people could easily add new tests.&lt;br /&gt;&lt;br /&gt;obunittest is hosted at &lt;a href="http://github.com"&gt;github&lt;/a&gt; and all of the necessary instructions are available at the &lt;a href="http://github.com/baoilleach/obunittest/tree/master"&gt;obunittest website&lt;/a&gt; (just scroll down). Git itself isn't required, but you may find it interesting to use - to do so, just create an account on github and fork my project. &lt;br /&gt;&lt;br /&gt;So this is &lt;i&gt;your&lt;/i&gt; chance to add a test for OpenBabel. Now while this might not be everyone's idea of a fun time, if there's some feature of OpenBabel upon which you rely, write a test for it and send it to me (or "git it" to me). This will ensure that that particular feature will always work in future OpenBabel releases. The same goes if there's something that you know is currently broken - just write a test. Remember that a stitch in time means you won't be saying "darn".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit&lt;/b&gt;: &lt;a href="http://www.flickr.com/photos/dullhunk/"&gt;Duncan Hull&lt;/a&gt; (hi!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-2310090857160566424?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=cCrRNm-JgKc:jT6h-Q9y5QY:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=cCrRNm-JgKc:jT6h-Q9y5QY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=cCrRNm-JgKc:jT6h-Q9y5QY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/cCrRNm-JgKc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/2310090857160566424/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=2310090857160566424" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/2310090857160566424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/2310090857160566424?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/03/time-for-test-any-questions.html" title="Time for a test - Any questions?" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CU4FSHk_fSp7ImA9WxVUFEQ.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-6284409692418231347</id><published>2009-03-18T02:36:00.000-07:00</published><updated>2009-03-19T13:18:39.745-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-19T13:18:39.745-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenBabel" /><title>The Clockwisdom of SMILES</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3136/2895535441_705de327da_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 181px;" src="http://farm4.static.flickr.com/3136/2895535441_705de327da_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;I was recently confronted with a question that many of us face at some point in our lives: how many ways can the groups attached to a chiral C be moved around in a SMILES string while retaining the clockwisdom?&lt;br /&gt;&lt;br /&gt;What's all this about clockwisdom? Well, a chiral SMILES string can indicate R or S around a tetrahedral centre using C@ or C@@. The difference is that R or S refer to clockwisdom of groups arranged by CIP priority (with the lowest priority facing away), whereas @ and @@ refer to clockwisdom of groups arranged in order of their appearance in the SMILES string (with the first appearing facing towards) &lt;b&gt;[1]&lt;/b&gt;. Whether this was a good design decision by the Daylight gurus, I'm not 100% sure, but that's how it is.&lt;br /&gt;&lt;br /&gt;So in short, if you change the order of groups in the SMILES string, you may need to change the clockwisdom to ensure that stereochemistry is preserved. Specifically, if you swap two groups you will get the other enantiomer ("putting the SMILES on the other face"?) unless you flip the clockwisdom; that is, Cl[C@@](Br)(C)I is the same enantiomer as Cl[C@](Br)(I)C. Another swap and we get back a SMILES string with the original clockwisdom.&lt;br /&gt;&lt;br /&gt;So I started off by trying to think of a clever program to identify how many swaps were required to convert between two orderings of groups. Next I tried to write a few loops that would simply perform all possible swaps of groups to generate all of rearrangments, but that missed a few. In the end, I just wrote the dumbest program I could think of and got the following results. For an original ordering of groups 0123, the following orderings have the same clockwisdom: 1032, 3021, 2013, 3210, 1320, 3102, 0123, 0231, 0312, 2301, 1203, 2130.&lt;br /&gt;&lt;br /&gt;And the point of all this? OpenBabel was not generating the correct stereochemistry around tetrahedral carbons in canonical SMILES. Now &lt;a href="http://openbabel.svn.sourceforge.net/viewvc/openbabel?view=rev&amp;revision=2929"&gt;fixed&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update (19/03/09):&lt;/b&gt; &lt;a href="http://timvdm.blogspot.com/"&gt;Tim Vandermeersch&lt;/a&gt; pointed out to me a neat way of determining the parity of a particular ordering of groups. Simply count the number of pairs in the ordering where one number is larger than another number to its right. For example, for 1032, there are two pairs (10, 32); for 3021, there are 3 pairs (32, 31, 21). Orderings with even numbers of pairs have one parity while orderings with odd number of pairs have the opposite parity.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[1]&lt;/b&gt; The OpenSMILES specification on &lt;a href="http://www.opensmiles.org/spec/open-smiles-3-input.html#3.9"&gt;stereochemistry&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/swamibu/"&gt;Swamibu&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-6284409692418231347?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=2diT4D6KxCk:tXJRdAUFegA:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=2diT4D6KxCk:tXJRdAUFegA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=2diT4D6KxCk:tXJRdAUFegA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/2diT4D6KxCk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/6284409692418231347/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=6284409692418231347" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/6284409692418231347?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/6284409692418231347?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/03/clockwisdom-of-smiles.html" title="The Clockwisdom of SMILES" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;DUcBSXY5cCp7ImA9WxVVEE8.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-5948696789678219393</id><published>2009-03-02T06:15:00.000-08:00</published><updated>2009-03-02T12:50:58.828-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-02T12:50:58.828-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Review of Hello World - Computer Programming for Kids and Other Beginners</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.manning.com/sande/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 215px;" src="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/Savs-TKMDVI/AAAAAAAAAso/ljc9-utPhlY/s400/comp.png" alt="" id="BLOGGER_PHOTO_ID_5308597140825312594" border="0" /&gt;&lt;/a&gt;My generation were among the first children to learn programming. Thanks to the BBC Microcomputer (in my part of the world), kids were provided with a computer and a manual that taught computer programming in both BASIC and Logo. The local library had a complete set of Usborne books that covered everything from arcade games, to fantasy adventures (the old-school text only type, that is), to assembly language programming and sorting algorithms. And these were for children.&lt;br /&gt;&lt;br /&gt;So what was it about programming on the BBC (or ZX Spectrum or Commodore 64) that drew kids in? For me it was all about graphics. Drawing circles could only be done dot by dot and led easily to drawing ellipses, and then to &lt;a href="http://en.wikipedia.org/wiki/Hyperboloid"&gt;hyperboloids of revolution&lt;/a&gt; (think cooling towers) whose top you could twist. I read Chaos by James Gleick, couldn't believe the simplicity of generating the Mandelbrot fractal, and lifted my jaw off the floor the first time my BBC drew the little Mandelbeetle (I'm not the only one - see also &lt;a href="http://wwmm.ch.cam.ac.uk/blogs/murrayrust/?p=201"&gt;PMR&lt;/a&gt;). I did some astronomy at school and plotted the night sky for different months of the year. And so on.&lt;br /&gt;&lt;br /&gt;Since then we've seen the rise of the PC and Windows, which in fairness had QBasic for quite some time (I am a &lt;a href="http://en.wikipedia.org/wiki/Nibbles_%28computer_game%29"&gt;Nibbles&lt;/a&gt; master). However, as David Brin pointed out ("&lt;a href="http://www.salon.com/tech/feature/2006/09/14/basic/index.html"&gt;Why Johnny can't code&lt;/a&gt;", 2006) today there's no easy way for kids to get hooked on programming. Even my favourite language, Python, is lacking here. Out of the box the only usable graphics library for kids is the turtle module, an implementation of LOGO:&lt;pre&gt;C:\Documents and Settings\oboyle&gt; python&lt;br /&gt;Python 2.6.1 (r261:67517, Dec  4 2008, ...&lt;br /&gt;Type "help", "copyright", "credits" ...&lt;br /&gt;&gt;&gt;&gt; from turtle import *&lt;br /&gt;&gt;&gt;&gt; for i in range(10):&lt;br /&gt;...     for j in range(5):&lt;br /&gt;...             forward(100)&lt;br /&gt;...             left(360/5)&lt;br /&gt;...     left(360/10)&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/SavrifkoNDI/AAAAAAAAAsg/3KpEicOcYVw/s1600-h/turtle.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 337px; height: 331px;" src="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/SavrifkoNDI/AAAAAAAAAsg/3KpEicOcYVw/s400/turtle.png" alt="" id="BLOGGER_PHOTO_ID_5308595563609470002" border="0" /&gt;&lt;/a&gt;It seems to work quite well, although the &lt;a href="http://docs.python.org/library/turtle.html"&gt;documentation&lt;/a&gt; is aimed at computer science majors rather than teachers (never mind kids). Also, the demo files are only available in the source distribution (you can get them from SVN &lt;a href="http://svn.python.org/view/python/tags/r261/Demo/turtle/"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;While Logo might be quite good for introducing the basics of programming languages, its graphics capabilities are limited. &lt;a href="http://www.pygame.org/"&gt;pygame&lt;/a&gt; is really the way to go. This is one of the big third-party Python extensions that incorporates support for sound, graphics and input devices. As the name implies it has everything necessary to write a decent computer game (see for example, the list of pygame &lt;a href="http://www.pygame.org/tags/arcade"&gt;arcade games&lt;/a&gt;). The downside is that this library makes no effort to cater for kids.&lt;br /&gt;&lt;br /&gt;Enter a recent publication from Manning, "&lt;a href="http://www.manning.com/sande/"&gt;Hello World! - Computer programming for kids and other beginners&lt;/a&gt;" by Warren and Carter Sande. Written with 12 year old kids in mind, the preface makes it clear that the authors (one a 12-year old kid himself) know their target audience well:&lt;blockquote&gt;"For kids especially, one of the most fun parts of using a computer is playing games, with graphics and sound. We’re going to learn how to make our own games and do lots of things with graphics and sound as we go along. Here are pictures of some of the programs we’ll be making:"&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_x5Hz3F0jd4Q/SaxF_y74rKI/AAAAAAAAAsw/idjzk1olC14/s1600-h/marslander.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 223px; height: 310px;" src="http://2.bp.blogspot.com/_x5Hz3F0jd4Q/SaxF_y74rKI/AAAAAAAAAsw/idjzk1olC14/s400/marslander.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5308695023069998242" /&gt;&lt;/a&gt; (&lt;span style="font-style:italic;"&gt;Figure published with permission from Manning Publications&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Lunar lander! Slalom racing! The Sandes have reinvented the Usborne books for the YouTellyTub generation, and then some. Assuming no previous programming knowledge (a reasonable assumption when you're 12), the book teaches Python programming with the goal of writing computer games. The initial chapters cover the basics from variables, through maths, "if" statements and loops. But there's also already the fun stuff like getting input and simple graphical dialogs, and in case attention is waning Chapter 10 (of 24) has the complete listing for a Skiing game. As the book says:"One of the great traditions of learning to program is typing in code you don’t understand. Really!"&lt;br /&gt;&lt;br /&gt;After introducing lists, functions, objects and modules, pygame enters the picture in Chapter 16 which covers drawing, images and animation. The following chapters cover sprites and collision detection, events and sound. The final chapters return to useful Python modules such as handling strings, file input and output, and using random numbers. All of the code examples are available for download from the &lt;a href="http://www.manning.com/sande/"&gt;book's website&lt;/a&gt;, along with a simple installer that contains all of the examples and modules required, along with Python itself.&lt;br /&gt;&lt;br /&gt;As you might have guessed, I think this is a great book that fills a real niche - I don't know of any other programming book on the market that targets kids. What's amazing is that it has set its sights so high, and yet manages to meet its goals. I think it would be great to see this book promoted as a way of teaching programming in primary schools. In the meanwhile if you know any 12+ kids interested in computers, give them an opportunity to develop a fascinating hobby and get them this book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-5948696789678219393?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=bkQOZ6DA6u8:OiZ7W0_oRbY:ANkz6nJbUoM"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?d=ANkz6nJbUoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/baoilleach?a=bkQOZ6DA6u8:OiZ7W0_oRbY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/baoilleach?i=bkQOZ6DA6u8:OiZ7W0_oRbY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/bkQOZ6DA6u8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/5948696789678219393/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=5948696789678219393" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/5948696789678219393?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/5948696789678219393?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/03/review-of-hello-world-computer.html" title="Review of Hello World - Computer Programming for Kids and Other Beginners" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_x5Hz3F0jd4Q/Savs-TKMDVI/AAAAAAAAAso/ljc9-utPhlY/s72-c/comp.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;CE8AQHs5eCp7ImA9WxVVEEw.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-8290023308485114690</id><published>2009-02-20T09:04:00.000-08:00</published><updated>2009-03-02T08:54:01.520-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-02T08:54:01.520-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Repeat after me - for loop in Python</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1238/1471587677_39183c9bb7_m.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 160px; height: 240px;" src="http://farm2.static.flickr.com/1238/1471587677_39183c9bb7_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;i&gt;for loops&lt;/i&gt; allow you to repeat the same set of instructions multiple times with a different value of a particular variable.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;How do I loop in Python?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Python &lt;i&gt;for loop&lt;/i&gt; has the following general form:&lt;pre&gt;for myvar in myiterator:&lt;br /&gt;   # do something with myvar&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;How do I loop over a list?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you coming from other languages such as C, you might be used to:&lt;pre&gt;for i in range(len(mylist)):&lt;br /&gt;   myvar = mylist[i]&lt;br /&gt;   # do something with myvar&lt;/pre&gt;&lt;br /&gt;In Python, it's much better (that is, the intention is clearer) if you do the following instead:&lt;pre&gt;for myvar in mylist:&lt;br /&gt;   # do something with myvar&lt;/pre&gt;&lt;br /&gt;If you suddenly realise you want the value of the index i, you can easily adapt the previous loop:&lt;pre&gt;for i, myvar in enumerate(mylist):&lt;br /&gt;   # do something with myvar&lt;br /&gt;   # do something with i&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;How do I loop over two lists simultaneously?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's say you have a list of people's firstnames and another list containing their surnames, and you want to write them on the screen. Don't do the following:&lt;pre&gt;for i in range(len(firstnames)):&lt;br /&gt;    print "%s %s" % (firstnames[i], secondnames[i])&lt;/pre&gt;&lt;br /&gt;Instead, you should make the intention of the code clear by using zip as follows:&lt;pre&gt;for firstname, secondname in zip(firstnames, secondnames):&lt;br /&gt;    print "%s %s" % (firstname, secondname)&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Loop pattern #1 - Building a new list from an old&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;newlist = []&lt;br /&gt;for mynum in mylist:&lt;br /&gt;   newnum = mynum*2&lt;br /&gt;   newlist.append(newnum)&lt;/pre&gt;&lt;br /&gt;In the case of this simple example, it should be done as a list comprehension instead:&lt;pre&gt;newlist = [mynum*2 for mynum in mylist]&lt;/pre&gt;&lt;br /&gt;Here is a slightly more complicated example, involving an "if" statement that acts as a filter for even numbers:&lt;pre&gt;newlist = []&lt;br /&gt;for mynum in mylist:&lt;br /&gt;   if mynum % 2 == 0:&lt;br /&gt;       newnum = mynum*2&lt;br /&gt;       newlist.append(newnum)&lt;/pre&gt;&lt;br /&gt;Again, this can be done instead as a list comprehension:&lt;pre&gt;newlist = [mynum*2 for mynum in mylist if mynum % 2 == 0]&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;Loop pattern #2 - Summing things up&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another common pattern is totalling things up using a list:&lt;pre&gt;total = 0&lt;br /&gt;for mynum in mylist:&lt;br /&gt;   total += mynum&lt;/pre&gt;&lt;br /&gt;Although in this case, it would be easier to just use:&lt;pre&gt;total = sum(mylist)&lt;/pre&gt;&lt;br /&gt;One thing to be careful of though is that using "+" to add strings is slow. If speed is important, avoid the following:&lt;pre&gt;longstring = ""&lt;br /&gt;for myvar in mylist:&lt;br /&gt;   # Create smallstring here somehow&lt;br /&gt;   longstring += smallstring&lt;/pre&gt;Instead use pattern #1 to create a list of strings, and join them at the end:&lt;pre&gt;stringlist = []&lt;br /&gt;for myvar in mylist:&lt;br /&gt;   # Create smallstring here somehow&lt;br /&gt;   stringlist.append(smallstring)&lt;br /&gt;longstring = "".join(stringlist)&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;Loop pattern #3 - Filling in a dictionary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A common pattern is to update information in a dictionary using a loop. Let's take an example of counting up how many people have a particular firstname given a list of firstnames.&lt;br /&gt;&lt;br /&gt;The problem here is that it is necessary to check whether a particular key is in the dictionary before updating it. This can leads to awkward code like the following:&lt;pre&gt;name_freq = {}&lt;br /&gt;for firstname in firstnames:&lt;br /&gt;   if firstname in name_freq:&lt;br /&gt;       name_freq[firstname] += 1&lt;br /&gt;   else:&lt;br /&gt;       name_freq[fistname] = 1&lt;/pre&gt;&lt;br /&gt;Now while this can be improved somewhat by using name_freq.get(firstname, 0), that's getting a bit complicated (and doesn't extend to dictionaries of lists). Instead you should use a defaultdict, a special dictionary that has a default value, as follows:&lt;pre&gt;from collections import defaultdict&lt;br /&gt;name_freq = defaultdict(int)&lt;br /&gt;for firstname in firstnames:&lt;br /&gt;    name_freq[firstname] += 1&lt;/pre&gt;&lt;br /&gt;And what about where you wanted to store the corresponding surnames in a dictionary by firstnames? Use a defaultdict(list), of course:&lt;pre&gt;from collections import defaultdict&lt;br /&gt;same_firstname = defaultdict(list)&lt;br /&gt;for firstname, surname in zip(firstnames, surnames):&lt;br /&gt;    same_firstname[firstname].append(surname)&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Loop pattern #4 - Don't use a loop&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Think dictionary, set, and sort. A lot of tricky algorithms can be implemented in a few lines with one or two of these guys.&lt;br /&gt;&lt;br /&gt;A trivial example is finding unique items in a list: set(mylist). Want to check whether that genome sequence only contains 4 letters?: assert len(set(mygenome))==4&lt;br /&gt;&lt;br /&gt;The following example uses sort. Given a set of docking scores for 10 poses, find which poses have the top three scores. Here's a solution using the so-called decorate-sort-undecorate paradigm:&lt;pre&gt;# Decorate ("stick your data in a tuple with other stuff")&lt;br /&gt;tmp = [(x,i) for i,x in enumerate(pose_scores)]&lt;br /&gt;# Sort (uses the items in the first position of the tuple)&lt;br /&gt;tmp.sort(reverse=True)&lt;br /&gt;# Undecorate ("get your data back out of the tuple")&lt;br /&gt;top_poses = [z[1] for z in tmp]&lt;br /&gt;&lt;br /&gt;print top_poses[:3]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Image credit:&lt;/b&gt; &lt;a href="http://www.flickr.com/photos/panca_satrio/"&gt;PanCa SatRio&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-8290023308485114690?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=VHjA0iwj"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?d=243" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=knfszqhT"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?i=knfszqhT" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/--lgBTnY2NE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/8290023308485114690/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=8290023308485114690" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/8290023308485114690?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/8290023308485114690?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/02/repeat-after-me-for-loop-in-python.html" title="Repeat after me - for loop in Python" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry gd:etag="W/&quot;DkINQXg9eip7ImA9WxVWEE4.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-1394514205411336347</id><published>2009-02-18T23:55:00.001-08:00</published><updated>2009-02-19T01:09:50.662-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-19T01:09:50.662-08:00</app:edited><title>Extract of chemical - Paper on OSRA published</title><content type="html">It seems like &lt;a href="http://baoilleach.blogspot.com/2009/02/new-software-for-ochre-chemreader.html"&gt;only last week&lt;/a&gt; that another paper was published on an Optical Chemical Recognition software. This week it's the turn of OSRA, the work of Igor Filippov, which has previously been discussed in several posts on this blog:&lt;blockquote&gt;Igor V. Filippov and Marc C. Nicklaus. &lt;a href="http://dx.doi.org/10.1021/ci800067r"&gt;Optical Structure Recognition Software To Recover Chemical Information: OSRA, An Open Source Solution&lt;/a&gt;. J. Chem. Inf. Model. 2009, In press.&lt;/blockquote&gt;&lt;br /&gt;Unlike all existing software, OSRA is open source. You can get it right now from its &lt;a href="http://osra.sf.net"&gt;web site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One interesting point raised in the paper is how best to assess performance. It appears that a Tanimoto type fingerprint is highly penalised if even a single error is made. This is because an error such as replacement of an O with a C, although visually minor and easily corrected in a drawing package, is highly significant chemically. Perhaps a simple count of (bonds in common)/(union of bonds) would suffice although this would require mapping of bonds from the original structure to the recognised structure (the new &lt;a href="http://wwwdev.ebi.ac.uk/thornton-srv/software/SMSD/"&gt;SMSD tool&lt;/a&gt; by Syed Asad Rahman from Janet Thornton's group might help here).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-1394514205411336347?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=SZESAI2I"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?d=243" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=MmINBJSf"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?i=MmINBJSf" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/zksOGRBCDcc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/1394514205411336347/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=1394514205411336347" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1394514205411336347?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/1394514205411336347?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/02/extract-of-chemical-paper-on-osra.html" title="Extract of chemical - Paper on OSRA published" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0cBRHg-eyp7ImA9WxVQGU8.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-7035420633960927980</id><published>2009-02-06T03:37:00.000-08:00</published><updated>2009-02-06T03:50:55.653-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-06T03:50:55.653-08:00</app:edited><title>New software for OChRe - ChemReader</title><content type="html">The good news is that the field of Optical Chemical Recognition (OChRe) has just received a new entry, &lt;b&gt;ChemReader&lt;/b&gt;:&lt;blockquote&gt;J Park, GR Rosania, KA Shedden, M Nguyen, N Lyu, K Saitou. &lt;a href="http://www.journal.chemistrycentral.com/content/3/1/4"&gt;Automated extraction of chemical structure information from digital raster images&lt;/a&gt;. Chem. Cent. J. 2009, 3, 4.&lt;/blockquote&gt;&lt;br /&gt;According to the test set used (and it's not stated whether the test set was also used to train the software) the results are very good, and not just for ChemReader - &lt;a href="http://osra.sf.net"&gt;OSRA&lt;/a&gt; is doing pretty well also:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_x5Hz3F0jd4Q/SYwh94UqtVI/AAAAAAAAAsY/EdteaXzDFhk/s1600-h/table.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 155px;" src="http://4.bp.blogspot.com/_x5Hz3F0jd4Q/SYwh94UqtVI/AAAAAAAAAsY/EdteaXzDFhk/s400/table.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5299648208483038546" /&gt;&lt;/a&gt;&lt;br /&gt;And the bad news? Rajarshi &lt;a href="http://rguha.wordpress.com/2009/02/01/papers-about-systems-you-cant-use-or-buy/"&gt;recently&lt;/a&gt; discussed the phenomenon of publishing papers describing software which can neither be purchased nor obtained for free. This is also the case for ChemReader. As the software is not open source, it cannot be made available as it relies on the open source libraries GOCR and Greystoration (also used by OSRA). However, the authors are "planning that ChemReader becomes commercially available in the near future, with removal of open source parts". Doesn't that mean that the final performance of the software, as well as the algorithms used, will be different from that described in the paper?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-7035420633960927980?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=1iYEfd95"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?d=243" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=PZn4ArnM"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?i=PZn4ArnM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/ZOgAj6GORyM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/7035420633960927980/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=7035420633960927980" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/7035420633960927980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/7035420633960927980?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/02/new-software-for-ochre-chemreader.html" title="New software for OChRe - ChemReader" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_x5Hz3F0jd4Q/SYwh94UqtVI/AAAAAAAAAsY/EdteaXzDFhk/s72-c/table.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE4FRXszcSp7ImA9WxVQFkg.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-900445050668072513</id><published>2009-02-03T01:07:00.000-08:00</published><updated>2009-02-03T01:21:54.589-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-03T01:21:54.589-08:00</app:edited><title>Of OChRe, OSRA and OASA (but not OSCAR) Part II</title><content type="html">In an &lt;a href="http://baoilleach.blogspot.com/2008/11/of-ochre-osra-and-oasa-but-not-oscar.html"&gt;earlier post&lt;/a&gt; I showed a way of testing the performance of an optical chemical recognition (OChRe) software, &lt;a href="http://osra.sf.net"&gt;OSRA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Since then, a new version of OSRA has been released (1.1.0). In addition, a new version of &lt;a href="http://bkchem.zirael.org/oasa_en.html"&gt;OASA&lt;/a&gt; has been released which can handle multiple molecules (this caused problems with the earlier test where a disconnected molecule was produced).&lt;br /&gt;&lt;br /&gt;The results are shown &lt;b&gt;&lt;a href="http://publishious.org/site_media/blog_d/index.html"&gt;here&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;(1) I used Xe to indicate an unknown atom type (only occurs once).&lt;br /&gt;(2) If OSRA detects multiple molecules in the original image, a multi-mol SDF is created where the coordinates do not correspond to the original location in the image. Where this occured here, I have just depicted the first molecule.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-900445050668072513?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=t2VqjJu9"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?d=243" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=4BVFJ3OF"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?i=4BVFJ3OF" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/cses0IfXsKo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/900445050668072513/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=900445050668072513" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/900445050668072513?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/900445050668072513?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/02/of-ochre-osra-and-oasa-but-not-oscar.html" title="Of OChRe, OSRA and OASA (but not OSCAR) Part II" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUcDRHo6cCp7ImA9WxVQFE8.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-211792764058618593</id><published>2009-01-30T09:21:00.000-08:00</published><updated>2009-01-31T10:37:55.418-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-31T10:37:55.418-08:00</app:edited><title>TwistyMol is dead - Long live TwirlyMol</title><content type="html">My first attempt at a Javascript molecular viewer culminated in &lt;a href="http://baoilleach.blogspot.com/2009/01/turn-turn-turn-twistymol-ready-for.html"&gt;TwistyMol&lt;/a&gt;. For TwistyMol, I took as my starting point &lt;a href="http://ejohn.org/blog/processingjs/"&gt;processing.js&lt;/a&gt; and consequently ran into some difficulties on IE, which doesn't support Canvas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TwirlyMol&lt;/b&gt; is my attempt to start over with a browser-independent Javascript vector graphics library. I googled a bit and came across some &lt;a href="http://stackoverflow.com/questions/410146/vector-graphics-in-javascript"&gt;pointers&lt;/a&gt; on Stack Overflow (a Q&amp;A website that does things in a new way). I choose to go ahead with &lt;a href="http://docs.dojocampus.org/dojox/gfx"&gt;dojox.gfx&lt;/a&gt;, which is an experimental component of the &lt;a href="http://dojotoolkit.org"&gt;Dojo&lt;/a&gt; javascript library. On IE, it uses VML, while on Firefox, it uses SVG (Canvas is also supported). I reckoned that this might improve performance on IE. Also, Dojo is likely to be better supported going forward, unlike processing.js which is essentially a one-man job (sure, the one man is the author of jQuery, but still) and its goal is quite different.&lt;br /&gt;&lt;br /&gt;So, here's the &lt;b&gt;&lt;a href="http://www.redbrick.dcu.ie/~noel/blog/molecproc/twirlymol.html"&gt;demo&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;It's ready to use for whatever you want. If you think about it, the code behind TwirlyMol can easily be adapted to displaying other types of 3D data, for example principal components graphs. What else would be useful? That's up to your imagination (comments below welcome).&lt;br /&gt;&lt;br /&gt;And I think this draws to a close my involvement in Javascript molecular viewers. Hope y'all had fun. I've put &lt;a href="http://github.com/baoilleach/twirlymol/tree/master"&gt;the code&lt;/a&gt; up on Github just to see what happens. Maybe someone wants to add perspective.&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;(1) Colours of atoms taken from the &lt;a href="http://bodr.sf.net"&gt;Blue Obelisk Data Repository&lt;/a&gt;. Even if you don't understand what the &lt;a href="http://blueobelisk.org"&gt;Blue Obelisk&lt;/a&gt; is about, I'm sure you can appreciate the benefit of shared chemical resources like these data.&lt;br /&gt;(2) IE performance is still much slower than Firefox, but is better than with Twistymol.&lt;br /&gt;(3) With Firefox, adding a large number of SVG molecules to a page is much slower than with Canvas. If doing this in practice, you'll need to add them in chunks of 50 or so, with a setTimeout() to add the next 50.&lt;br /&gt;(4) Coding Javascript for IE really is frustrating.&lt;br /&gt;(5) If you use mouse gestures, rotating or zooming with the right mouse button can trigger a gesture event. One way around this would be to implement support for modifier keys so that shift+left button causes right button behaviour, while alt+left would cause middle button behaviour. This would be quite easy as the dojox.gjx library has a function for testing whether shift is held down (I can't remember about the alt).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-211792764058618593?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=VsPfjWrS"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?d=243" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=CstJBaIz"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?i=CstJBaIz" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/04Snsgzjjd4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/211792764058618593/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=211792764058618593" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/211792764058618593?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/211792764058618593?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/01/twistymol-is-dead-long-live-twirlymol.html" title="TwistyMol is dead - Long live TwirlyMol" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;DkcHR306fyp7ImA9WxVRFkg.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-6807803941382671744</id><published>2009-01-22T11:45:00.000-08:00</published><updated>2009-01-22T11:53:56.317-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-22T11:53:56.317-08:00</app:edited><title>Turn, turn, turn - TwistyMol ready for action</title><content type="html">A new version of TwistyMol is available. It's now ready for use by others (that means YOU). Here's a &lt;a href="http://www.redbrick.dcu.ie/~noel/blog/molecproc/jstwistymol.html"&gt;simple example&lt;/a&gt; and here's &lt;a href="http://www.redbrick.dcu.ie/~noel/blog/molecproc/multitwistymol.html"&gt;another&lt;/a&gt; with a few more molecules.&lt;br /&gt;&lt;br /&gt;What's changed since last time? Well I've added in an SDF file parser, made it possible to have multiple TwistyMols on the same page, sorted out the rotation (at least for the moment) and gone a bit overboard on the shadows. Performance on IE is still a big problem, and displaying more than a handful of molecules at the same time is out of the question (too slow). I still don't know if this is an intrinsic problem with VML or just the whole Canvas to Excanvas to VML conversion.&lt;br /&gt;&lt;br /&gt;If you want to use it yourself, download the Javascript files referenced in the HEAD section of the demo page, and look at the code on the demo page itself. The only tricky part is getting the SDF file into Javascript - you'll either have to place it on a webserver and use an Ajax call or do as I did and convert it to a Javascript string variable (hint: read() it in with Python and convert \n to \\n).&lt;br /&gt;&lt;br /&gt;Feel free to modify and distribute the code. You could add a comment below with a link if you use it anywhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-6807803941382671744?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=0lbw5KPF"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?d=243" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=C7QHg9j3"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?i=C7QHg9j3" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/oEFKNFoKk14" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/6807803941382671744/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=6807803941382671744" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/6807803941382671744?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/6807803941382671744?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/01/turn-turn-turn-twistymol-ready-for.html" title="Turn, turn, turn - TwistyMol ready for action" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;DEUAQX06fCp7ImA9WxVSGEk.&quot;"><id>tag:blogger.com,1999:blog-7844526396210378482.post-4695208068472051170</id><published>2009-01-13T03:24:00.000-08:00</published><updated>2009-01-13T03:30:40.314-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-13T03:30:40.314-08:00</app:edited><title>Molecular viewer now works on Internet Explorer</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_x5Hz3F0jd4Q/SWx6FNjWB2I/AAAAAAAAAsI/AYcdHK-Dxfc/s1600-h/molecule.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 230px; height: 213px;" src="http://1.bp.blogspot.com/_x5Hz3F0jd4Q/SWx6FNjWB2I/AAAAAAAAAsI/AYcdHK-Dxfc/s400/molecule.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5290737892209330018" /&gt;&lt;/a&gt;I've managed to get my mimimal molecular viewer (see &lt;a href="http://baoilleach.blogspot.com/2009/01/minimol-minimal-molecular-viewer-for.html"&gt;previous post&lt;/a&gt;) working on Internet Explorer. Smooth, it is not, but at least it works (I recommend Firefox instead). I've also renamed it to TwistyMol. Minimol sounded a bit boring, like Microsoft. You can try it out &lt;b&gt;&lt;a href="http://www.redbrick.dcu.ie/~noel/blog/molecproc/twistymol.html"&gt;here&lt;/a&gt;&lt;/b&gt;.                          &lt;br /&gt;&lt;br /&gt;So what was the problem with Internet Explorer? Well, for graphics, TwistyMol uses processing.js which draws the molecule using the Canvas tag. Unfortunately, Internet Explorer is the only browser that doesn't support Canvas; instead, it has invented its own system called VML (Vector Markup Language). So, for IE users, I need to import the &lt;a href="http://excanvas.sf.net"&gt;ExplorerCanvas&lt;/a&gt; Javascript library developed by Google; this converts all calls to Canvas to their equivalent in VML. (I also needed to make a few changes to processing.js to enable IE support.)&lt;br /&gt;&lt;br /&gt;Next steps - sort out the rotation (&lt;a href="http://baoilleach.blogspot.com/2009/01/minimol-minimal-molecular-viewer-for.html#comment-7453610439664472103"&gt;Simon&lt;/a&gt; suggested a possible solution), turn the Javascript into proper Javascript (encapsulate it a bit), stick in a file format parser (I'm hoping Rich will come through on this one), and deploy to the masses.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7844526396210378482-4695208068472051170?l=baoilleach.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=7MiYzMzO"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?d=243" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/baoilleach?a=qjw3uMjd"&gt;&lt;img src="http://feeds.feedburner.com/~f/baoilleach?i=qjw3uMjd" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/baoilleach/~4/zaQS4aDT3z4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://baoilleach.blogspot.com/feeds/4695208068472051170/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7844526396210378482&amp;postID=4695208068472051170" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/4695208068472051170?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7844526396210378482/posts/default/4695208068472051170?v=2" /><link rel="alternate" type="text/html" href="http://baoilleach.blogspot.com/2009/01/molecular-viewer-now-works-on-internet.html" title="Molecular viewer now works on Internet Explorer" /><author><name>baoilleach</name><uri>http://www.blogger.com/profile/03288289351940689018</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03091106344090647864" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_x5Hz3F0jd4Q/SWx6FNjWB2I/AAAAAAAAAsI/AYcdHK-Dxfc/s72-c/molecule.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry></feed>
