<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8333362953216176367</id><updated>2012-02-01T08:20:10.037+01:00</updated><title type='text'>The plate is bad</title><subtitle type='html'>chemoinformatics and whatnot</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-6043868383597446447</id><published>2011-12-23T13:26:00.000+01:00</published><updated>2012-01-09T15:08:36.402+01:00</updated><title type='text'>Christmas presents</title><content type='html'>&lt;p&gt;Jérôme Pansanel has completed the new serialization code for mychem and pgchem, so there is no need to handle stereo and non-stereo queries differently anymore. I have moved the index functions to GCC's vector extensions where applicable, and the first result is that index build times have been roughly cut by half while substructure search times have improved, but not that much.&lt;/p&gt;&lt;h3&gt;Index build times&lt;/h3&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;System&lt;/th&gt;&lt;th&gt;Index build time&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;pgchem with OpenBabel or Indigo&lt;/td&gt;&lt;td&gt;352137 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;pgchem with OpenBabel or Indigo vectorized&lt;/td&gt;&lt;td&gt;192815 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h4&gt;OpenBabel with binary storage and FP2 fingerprint vectorized&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;4840&lt;/td&gt;&lt;td&gt;98416 ms&lt;/td&gt;&lt;td&gt;4840&lt;/td&gt;&lt;td&gt;17044 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;260&lt;/td&gt;&lt;td&gt;94053 ms&lt;/td&gt;&lt;td&gt;260&lt;/td&gt;&lt;td&gt;1564 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;113690 ms&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;34504 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;26910&lt;/td&gt;&lt;td&gt;99365 ms&lt;/td&gt;&lt;td&gt;26910&lt;/td&gt;&lt;td&gt;55154 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;Merry Christmas and a happy new year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-6043868383597446447?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/6043868383597446447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/christmas-presents.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6043868383597446447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6043868383597446447'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/christmas-presents.html' title='Christmas presents'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-8732838856111259921</id><published>2011-12-17T16:10:00.001+01:00</published><updated>2011-12-17T16:12:17.893+01:00</updated><title type='text'>Benchmark data published</title><content type='html'>The base data used in the previous benchmarks can be found here:&amp;nbsp;&lt;a href="http://pgfoundry.org/frs/?group_id=1000059" target="_blank"&gt;pubchem_0_100000&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-8732838856111259921?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/8732838856111259921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/benchmark-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/8732838856111259921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/8732838856111259921'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/benchmark-data.html' title='Benchmark data published'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-419019075432061073</id><published>2011-12-15T11:04:00.000+01:00</published><updated>2011-12-16T14:50:33.037+01:00</updated><title type='text'>Selected GH17 results for 10^6 structures</title><content type='html'>&lt;h3&gt;GH17 substructure search speed&lt;/h3&gt;&lt;br/&gt;&lt;h4&gt;OpenBabel with binary+SMILES storage and FP2 fingerprint&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;4840&lt;/td&gt;&lt;td&gt;108807 ms&lt;/td&gt;&lt;td&gt;4840&lt;/td&gt;&lt;td&gt;21164 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;260&lt;/td&gt;&lt;td&gt;105050 ms&lt;/td&gt;&lt;td&gt;260&lt;/td&gt;&lt;td&gt;1934 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;118978 ms&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;52416 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;26910&lt;/td&gt;&lt;td&gt;109886 ms&lt;/td&gt;&lt;td&gt;26910&lt;/td&gt;&lt;td&gt;64742 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h4&gt;Indigo with binary storage and ext+sub fingerprint&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;4840&lt;/td&gt;&lt;td&gt;213075 ms&lt;/td&gt;&lt;td&gt;4840&lt;/td&gt;&lt;td&gt;27887 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;410&lt;/td&gt;&lt;td&gt;178963 ms&lt;/td&gt;&lt;td&gt;410&lt;/td&gt;&lt;td&gt;4451 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;251938 ms&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;39134 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;27100&lt;/td&gt;&lt;td&gt;172534 ms&lt;/td&gt;&lt;td&gt;27100&lt;/td&gt;&lt;td&gt;80523 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h4&gt;Bingo 1.7beta2 with molfiles as text storage&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;4710&lt;/td&gt;&lt;td&gt;647889 ms&lt;/td&gt;&lt;td&gt;4710&lt;/td&gt;&lt;td&gt;21733 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;410&lt;/td&gt;&lt;td&gt;538784 ms&lt;/td&gt;&lt;td&gt;410&lt;/td&gt;&lt;td&gt;6658 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;675093 ms&lt;/td&gt;&lt;td&gt;580&lt;/td&gt;&lt;td&gt;12418 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;27100&lt;/td&gt;&lt;td&gt;528891 ms&lt;/td&gt;&lt;td&gt;27100&lt;/td&gt;&lt;td&gt;28541 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h3&gt;Index build times&lt;/h3&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;System&lt;/th&gt;&lt;th&gt;Index build time&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;pgchem with OpenBabel or Indigo&lt;/td&gt;&lt;td&gt;352137 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bingo&lt;/td&gt;&lt;td&gt;3458681ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;br/&gt;Again, Bingo without it's index is apparently killed by the overhead of parsing text into the internal molecule format. With index it's a mixed bag, while it shines at GH13 and GH16, pgchem is about equal or faster at GH2 and GH7.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-419019075432061073?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/419019075432061073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/selected-gh17-results-for-106.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/419019075432061073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/419019075432061073'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/selected-gh17-results-for-106.html' title='Selected GH17 results for 10^6 structures'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-1987102756664153721</id><published>2011-12-14T08:56:00.000+01:00</published><updated>2011-12-15T08:57:32.486+01:00</updated><title type='text'>GH17 results</title><content type='html'>&lt;p&gt;Mikhail Rybalkin from GGA Software asked me to do this, so here it is...&lt;/p&gt;&lt;h3&gt;The GH17 test queries used&lt;/h3&gt;&lt;br/&gt;&lt;i&gt;There is a small set of queries used in article Chemical substructure search in SQL by Golovin and Henrick.These queries were lately reused in other articles:&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;GH1 ONC1CC(C(O)C1O)[n]2cnc3c(NC4CC4)ncnc23&lt;br/&gt;GH2 Nc1ncnc2[n]cnc12&lt;br/&gt;GH3 CNc1ncnc2[n](C)cnc12&lt;br/&gt;GH4 Nc1ncnc2[n](cnc12)C3CCCC3&lt;br/&gt;GH5 CC12CCC3C(CCC4=CC(O)CCC34C)C1CCC2&lt;br/&gt;GH6 OC2=CC(=O)c1c(cccc1)O2&lt;br/&gt;GH7 Nc1nnc(S)s1&lt;br/&gt;GH8 C1C2SCCN2C1&lt;br/&gt;GH9 CP(O)(O)=O&lt;br/&gt;GH10 CCCCCP(O)(O)=O&lt;br/&gt;GH11 N2CCC13CCCCC1C2Cc4c3cccc4&lt;br/&gt;GH12 s1cncc1&lt;br/&gt;GH13 C34CCC1C(CCC2CC(=O)CCC12)C3CCC4&lt;br/&gt;GH14 CCCCCCCCCCCP(O)(O)=O&lt;br/&gt;GH15 CC1CCCC1&lt;br/&gt;GH16 CCC1CCCC1&lt;br/&gt;GH17 CCCC1CCCC1&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;GH17 substructure search speed&lt;/h3&gt;&lt;br/&gt;&lt;h4&gt;OpenBabel with binary+SMILES storage and FP2 fingerprint&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;9517 ms&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;25 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;484&lt;/td&gt;&lt;td&gt;8519 ms&lt;/td&gt;&lt;td&gt;484&lt;/td&gt;&lt;td&gt;111 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH3&lt;/td&gt;&lt;td&gt;63&lt;/td&gt;&lt;td&gt;8632 ms&lt;/td&gt;&lt;td&gt;63&lt;/td&gt;&lt;td&gt;43 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;8950 ms&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;48 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH5&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;10020 ms&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;78 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH6&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;8696 ms&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;32 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;8279 ms&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;31 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH8&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;8454 ms&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;56 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH9&lt;/td&gt;&lt;td&gt;348&lt;/td&gt;&lt;td&gt;8068 ms&lt;/td&gt;&lt;td&gt;348&lt;/td&gt;&lt;td&gt;71 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH10&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;8820 ms&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;21 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH11&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;9113 ms&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;52 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH12&lt;/td&gt;&lt;td&gt;831&lt;/td&gt;&lt;td&gt;7920 ms&lt;/td&gt;&lt;td&gt;831&lt;/td&gt;&lt;td&gt;124 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;9864 ms&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;448 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH14&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;9998 ms&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;36 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH15&lt;/td&gt;&lt;td&gt;3008&lt;/td&gt;&lt;td&gt;8549 ms&lt;/td&gt;&lt;td&gt;3008&lt;/td&gt;&lt;td&gt;555 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;2691&lt;/td&gt;&lt;td&gt;8665 ms&lt;/td&gt;&lt;td&gt;2691&lt;/td&gt;&lt;td&gt;501 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH17&lt;/td&gt;&lt;td&gt;2290&lt;/td&gt;&lt;td&gt;8717 ms&lt;/td&gt;&lt;td&gt;2290&lt;/td&gt;&lt;td&gt;560 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h4&gt;Indigo with binary storage and ext+sub fingerprint&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;28161 ms&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;32 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;484&lt;/td&gt;&lt;td&gt;19188 ms&lt;/td&gt;&lt;td&gt;484&lt;/td&gt;&lt;td&gt;187 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH3&lt;/td&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;20498 ms&lt;/td&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;78 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;23388 ms&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;33 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH5&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;25887 ms&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;62 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH6&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;21034 ms&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;31 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;16302 ms&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;31 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH8&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;16629 ms&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;78 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH9&lt;/td&gt;&lt;td&gt;373&lt;/td&gt;&lt;td&gt;14005 ms&lt;/td&gt;&lt;td&gt;373&lt;/td&gt;&lt;td&gt;98 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH10&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;16881 ms&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;21 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH11&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;24091 ms&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;78 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH12&lt;/td&gt;&lt;td&gt;829&lt;/td&gt;&lt;td&gt;14842 ms&lt;/td&gt;&lt;td&gt;829&lt;/td&gt;&lt;td&gt;210 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;24470 ms&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;133 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH14&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;21403 ms&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;36 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH15&lt;/td&gt;&lt;td&gt;3047&lt;/td&gt;&lt;td&gt;15817 ms&lt;/td&gt;&lt;td&gt;3047&lt;/td&gt;&lt;td&gt;749 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;2710&lt;/td&gt;&lt;td&gt;16767 ms&lt;/td&gt;&lt;td&gt;2710&lt;/td&gt;&lt;td&gt;732 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH17&lt;/td&gt;&lt;td&gt;2304&lt;/td&gt;&lt;td&gt;17524 ms&lt;/td&gt;&lt;td&gt;2304&lt;/td&gt;&lt;td&gt;788 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h4&gt;Bingo 1.7beta2 with molfiles as text storage&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;70277 ms&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;125 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;471&lt;/td&gt;&lt;td&gt;56821 ms&lt;/td&gt;&lt;td&gt;471&lt;/td&gt;&lt;td&gt;156 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH3&lt;/td&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;57754 ms&lt;/td&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;125 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;60067 ms&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;125 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH5&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;65586 ms&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;140 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH6&lt;/td&gt;&lt;td&gt;79&lt;/td&gt;&lt;td&gt;57188 ms&lt;/td&gt;&lt;td&gt;79&lt;/td&gt;&lt;td&gt;125 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;52134 ms&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;125 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH8&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;51685 ms&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;140 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH9&lt;/td&gt;&lt;td&gt;373&lt;/td&gt;&lt;td&gt;47613 ms&lt;/td&gt;&lt;td&gt;373&lt;/td&gt;&lt;td&gt;138 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH10&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;49961 ms&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;110 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH11&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;61176 ms&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;125 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH12&lt;/td&gt;&lt;td&gt;774&lt;/td&gt;&lt;td&gt;50281 ms&lt;/td&gt;&lt;td&gt;829&lt;/td&gt;&lt;td&gt;156 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;61108 ms&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;156 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH14&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;53636 ms&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;140 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH15&lt;/td&gt;&lt;td&gt;3047&lt;/td&gt;&lt;td&gt;50213 ms&lt;/td&gt;&lt;td&gt;3047&lt;/td&gt;&lt;td&gt;343 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;2710&lt;/td&gt;&lt;td&gt;51227 ms&lt;/td&gt;&lt;td&gt;2710&lt;/td&gt;&lt;td&gt;327 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH17&lt;/td&gt;&lt;td&gt;2304&lt;/td&gt;&lt;td&gt;51495 ms&lt;/td&gt;&lt;td&gt;2304&lt;/td&gt;&lt;td&gt;362 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h3&gt;Fingerprint efficiency (with regard to false positives)&lt;/h3&gt;&lt;br/&gt;&lt;h4&gt;FP2&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Candidates screened&lt;/th&gt;&lt;th&gt;Hits matched&lt;/th&gt;&lt;th&gt;false positives&lt;/th&gt;&lt;th&gt;Efficiency&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;485&lt;/td&gt;&lt;td&gt;484&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0.998&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH3&lt;/td&gt;&lt;td&gt;69&lt;/td&gt;&lt;td&gt;63&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;0.913&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH4&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;0.135&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH5&lt;/td&gt;&lt;td&gt;120&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;84&lt;/td&gt;&lt;td&gt;0.300&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH6&lt;/td&gt;&lt;td&gt;79&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;79&lt;/td&gt;&lt;td&gt;0.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;0.634&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH8&lt;/td&gt;&lt;td&gt;177&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;0.960&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH9&lt;/td&gt;&lt;td&gt;377&lt;/td&gt;&lt;td&gt;348&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;0.923&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH10&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0.973&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH11&lt;/td&gt;&lt;td&gt;123&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0.537&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH12&lt;/td&gt;&lt;td&gt;831&lt;/td&gt;&lt;td&gt;831&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;1346&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;1288&lt;/td&gt;&lt;td&gt;0.043&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH14&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;0.200&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH15&lt;/td&gt;&lt;td&gt;3760&lt;/td&gt;&lt;td&gt;3008&lt;/td&gt;&lt;td&gt;752&lt;/td&gt;&lt;td&gt;0.800&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;3305&lt;/td&gt;&lt;td&gt;2691&lt;/td&gt;&lt;td&gt;614&lt;/td&gt;&lt;td&gt;0.814&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH17&lt;/td&gt;&lt;td&gt;3305&lt;/td&gt;&lt;td&gt;2290&lt;/td&gt;&lt;td&gt;715&lt;/td&gt;&lt;td&gt;0.762&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h4&gt;ext+sub&lt;/h4&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Candidates screened&lt;/th&gt;&lt;th&gt;Hits matched&lt;/th&gt;&lt;th&gt;false positives&lt;/th&gt;&lt;th&gt;Efficiency&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH2&lt;/td&gt;&lt;td&gt;484&lt;/td&gt;&lt;td&gt;484&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH3&lt;/td&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH5&lt;/td&gt;&lt;td&gt;47&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;0.766&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH6&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH7&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH8&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH9&lt;/td&gt;&lt;td&gt;373&lt;/td&gt;&lt;td&gt;373&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH10&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH11&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH12&lt;/td&gt;&lt;td&gt;829&lt;/td&gt;&lt;td&gt;829&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1.000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH13&lt;/td&gt;&lt;td&gt;259&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;201&lt;/td&gt;&lt;td&gt;0.224&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH14&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;0.200&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH15&lt;/td&gt;&lt;td&gt;3061&lt;/td&gt;&lt;td&gt;3047&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;0.995&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH16&lt;/td&gt;&lt;td&gt;2720&lt;/td&gt;&lt;td&gt;2710&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;0.996&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GH17&lt;/td&gt;&lt;td&gt;2720&lt;/td&gt;&lt;td&gt;2304&lt;/td&gt;&lt;td&gt;416&lt;/td&gt;&lt;td&gt;0.847&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;h3&gt;Index build times&lt;/h3&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;System&lt;/th&gt;&lt;th&gt;Index build time&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;pgchem with OpenBabel or Indigo&lt;/td&gt;&lt;td&gt;25690 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bingo&lt;/td&gt;&lt;td&gt;336319 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;/br&gt;Indigo's ext+sub fingerprint is truly more selective than FP2. Still, OpenBabel with binary storage shows the better prformance because of its &lt;s&gt;faster matcher&lt;/s&gt; lower query overhead.&lt;p&gt;Also, the result for GH3, GH7, GH9, GH12, GH15, GH16, and GH17 are different between OpenBabel and Indigo, and Bingo finds 79 hits for GH6 where pgchem finds zero.&lt;/p&gt;&lt;p&gt;Index building on pgchem is 13 times faster than Bingo, but since pgchem (currently) does not support features like tautomer searching or SMARTS searching with index support this comparison is a bit like apples and oranges.&lt;/p&gt;&lt;p&gt;The slow performance of Bingo without index, comparable to pgchem without binary storage, is quite likely a result of the storage of molecules in textual representation. Parsing text to binary molecules is a first class performance killer. Unfortunately, there is no way to convert molecules into native format directly with Bingo for PostgreSQL, but Bingo does the conversion implicitly when building the index.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-1987102756664153721?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/1987102756664153721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/gh17-results.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1987102756664153721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1987102756664153721'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/gh17-results.html' title='GH17 results'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-6391094398419006782</id><published>2011-12-09T15:03:00.001+01:00</published><updated>2011-12-12T10:41:12.290+01:00</updated><title type='text'>OBMol de-/serialization revisited</title><content type='html'>The current serialization/deserialization mechanism in pgchem and mychem does not preserve stereochemistry of OBMol objects properly. As Tim Vandermeersch wrote:&lt;p&gt;&lt;i&gt;The OBChiralData isn't used anymore. Also the functionsOBAtom::IsClockwise, and OBAtom::IsAntiClockwise are obsolate.Instead, you should serialize the OBCisTransStereo andOBTetrahedralStereo data objects.&lt;/i&gt;&lt;/p&gt;Fortunately (for me, since I don't have the time at the moment), Jérôme Pansanel has:&lt;p&gt;&lt;i&gt;...started the serialization of the OBCisTransStereoand OBTetrahedralStereo objects.&lt;/i&gt;&lt;p&gt;For the time being, I have tried the following workaround and it seems to be working well. First, I have removed now unneccessary code from the unserialization:&lt;/p&gt;&lt;div style="font-size:11px"&gt;&lt;pre&gt;&lt;br /&gt;&lt;strong&gt;bool&lt;/strong&gt; &lt;font color="#2040a0"&gt;unserializeOBMol&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;OBBase&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt; &lt;font color="#2040a0"&gt;pOb&lt;/font&gt;, &lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;serializedInput&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;OBMol&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt; &lt;font color="#2040a0"&gt;pmol&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;pOb&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;CastAndClear&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2040a0"&gt;OBMol&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;OBMol&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#2040a0"&gt;mol&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;pmol&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;strong&gt;unsigned&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;i&lt;/font&gt;,&lt;font color="#2040a0"&gt;natoms&lt;/font&gt;,&lt;font color="#2040a0"&gt;nbonds&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;unsigned&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;intptr&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;unsigned&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;serializedInput&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#2040a0"&gt;intptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;natoms&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;intptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#2040a0"&gt;intptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;nbonds&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;intptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#2040a0"&gt;intptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;_ATOM&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;atomptr&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;_ATOM&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;intptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;mol&lt;/font&gt;.&lt;font color="#2040a0"&gt;ReserveAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;natoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;OBAtom&lt;/font&gt; &lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;stereo&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;for&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt; &lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;natoms&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt; &lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetIdx&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;idx&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetHyb&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;hybridization&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetAtomicNum&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;atomicnum&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetIsotope&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;unsigned&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;isotope&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetFormalCharge&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;formalcharge&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;stereo&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;stereo&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;stereo&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;3&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetChiral&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetSpinMultiplicity&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;short&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;spinmultiplicity&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;aromatic&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetAromatic&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;mol&lt;/font&gt;.&lt;font color="#2040a0"&gt;AddAtom&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;atom&lt;/font&gt;.&lt;font color="#2040a0"&gt;Clear&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;_BOND&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;bondptr&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;_BOND&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;atomptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;unsigned&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;start&lt;/font&gt;,&lt;font color="#2040a0"&gt;end&lt;/font&gt;,&lt;font color="#2040a0"&gt;order&lt;/font&gt;,&lt;font color="#2040a0"&gt;flags&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;for&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;nbonds&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;flags&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;start&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;bondptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;beginidx&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;end&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;bondptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;endidx&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;order&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;bondptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;order&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;start&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;end&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;order&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;start&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;natoms&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;end&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;natoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;order&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;unsigned&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;order&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;4&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; ? &lt;font color="#FF0000"&gt;5&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;order&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;stereo&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;bondptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;stereo&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;stereo&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;stereo&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;flags&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;OB_WEDGE_BOND&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;      &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;stereo&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;6&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;flags&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;OB_HASH_BOND&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;      &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bondptr&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2040a0"&gt;aromatic&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;font color="#2040a0"&gt;flags&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;OB_AROMATIC_BOND&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;mol&lt;/font&gt;.&lt;font color="#2040a0"&gt;AddBond&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;start&lt;/font&gt;,&lt;font color="#2040a0"&gt;end&lt;/font&gt;,&lt;font color="#2040a0"&gt;order&lt;/font&gt;,&lt;font color="#2040a0"&gt;flags&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#2040a0"&gt;bondptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;intptr&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;unsigned&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;bondptr&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;mol&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetAromaticPerceived&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#2040a0"&gt;mol&lt;/font&gt;.&lt;font color="#2040a0"&gt;SetKekulePerceived&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;true&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Then, when matching, I check if the query might contain tetrahedral stereo. If yes, I build the target OBMol fresh from SMILES, if no directly from the serialized object:&lt;div style="font-size:11px"&gt;&lt;pre&gt;&lt;br /&gt; &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;strchr&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;querysmi&lt;/font&gt;, &lt;font color="#008000"&gt;'@'&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;NULL&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#444444"&gt;//Match against an OBMol generated from SMILES&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;    &lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;         &lt;font color="#444444"&gt;//Match against an OBMol deserialized from binary&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-6391094398419006782?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/6391094398419006782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/openbabel-deserialization-revisited.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6391094398419006782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6391094398419006782'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/openbabel-deserialization-revisited.html' title='OBMol de-/serialization revisited'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-6545548890771355729</id><published>2011-12-06T12:18:00.001+01:00</published><updated>2011-12-09T10:51:38.270+01:00</updated><title type='text'>First Light</title><content type='html'>As promised, here the first results for substructure searching &lt;i&gt;c1ccccc1Cl&lt;/i&gt; on the first 100000 compounds from Pubchem: &lt;i&gt;select * from pubchem.compound where compound &gt;= 'c1ccccc1Cl'::molecule&lt;/i&gt;&lt;br /&gt;&lt;br/&gt;&lt;h3&gt;Substructure search speed&lt;/h3&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Rank&lt;/th&gt;&lt;th&gt;Build&lt;/th&gt;&lt;th&gt;Storage&lt;/th&gt;&lt;th&gt;Fingerprint&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;no Index&lt;/th&gt;&lt;th&gt;Hits&lt;/th&gt;&lt;th&gt;with Index&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;OpenBabel&lt;/td&gt;&lt;td&gt;binary+SMILES&lt;/td&gt;&lt;td&gt;FP2&lt;/td&gt;&lt;td&gt;8070&lt;/td&gt;&lt;td&gt;9236 ms&lt;/td&gt;&lt;td&gt;8067&lt;/td&gt;&lt;td&gt;936 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Indigo&lt;/td&gt;&lt;td&gt;binary&lt;/td&gt;&lt;td&gt;ext+sub&lt;/td&gt;&lt;td&gt;8049&lt;/td&gt;&lt;td&gt;24821 ms&lt;/td&gt;&lt;td&gt;8049&lt;/td&gt;&lt;td&gt;2418 ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;OpenBabel&lt;/td&gt;&lt;td&gt;SMILES&lt;/td&gt;&lt;td&gt;FP2&lt;/td&gt;&lt;td&gt;8070&lt;/td&gt;&lt;td&gt;57971 ms&lt;/td&gt;&lt;td&gt;8067&lt;/td&gt;&lt;td&gt;5432 ms&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;I've checked why the OpenBabel FP2 fingerprint eliminates three structures that otherwise would pass: Using the VF2 OBIsomorphismMapper instead of the OBSmartsPattern, it's also 8067 without index. But it's about four times  slower, 90526 ms without index, 8798 with index.&lt;br/&gt;The structures in question are: 80944, 83450 and 99925 and I'm pretty sure it's caused by differences in aromaticity detection.&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;Stereochemistry in substructure searches&lt;/h3&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Check&lt;/th&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Expected&lt;/th&gt;&lt;th&gt;Indigo binary&lt;/th&gt;&lt;th&gt;OpenBabel SMILES&lt;/th&gt;&lt;th&gt;OpenBabel binary&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;R/S different&lt;/td&gt;&lt;td&gt;select 'C[C@H]([C@@H](C(=O)O)N)O'::molecule &lt;= 'O=C(O)[C@H](N)[C@@H](O)C'::molecule&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;pass&lt;/td&gt;&lt;td&gt;fail&lt;/td&gt;&lt;td&gt;fail&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;R/S same&lt;/td&gt;&lt;td&gt;select 'C[C@H]([C@@H](C(=O)O)N)O'::molecule &lt;= 'C[C@H]([C@@H](C(=O)O)N)O'::molecule&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;pass&lt;/td&gt;&lt;td&gt;pass&lt;/td&gt;&lt;td&gt;pass&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;E/Z different&lt;/td&gt;&lt;td&gt;select 'C(=C\Cl)\Cl'::molecule &lt;= 'C(=C/Cl)\Cl'::molecule&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;pass&lt;/td&gt;&lt;td&gt;fail&lt;/td&gt;&lt;td&gt;fail&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;OpenBabel fails the 'E/Z different' and 'R/S different' checks, but these are known issues up to version 2.3.1. &lt;s&gt;More disturbing are the issues with 'R/S different'. For SMILES I can reproduce it with obgrep, so it's not my code causing it.&lt;/s&gt;&lt;br/&gt;&lt;/br&gt;Indigo has no obvious issues with matching R/S and E/Z stereochemistry. &lt;s&gt;Speedwise, OpenBabel with binary storage would be the leader of the pack, but has inconsistent behaviour compared with it's SMILES storage sibling.&lt;/s&gt; So the serialization/deserialization code clearly is missing something. But I've found a simple workaround:  If the query contains chirality information it uses SMILES, otherwise binary. Speedwise, OpenBabel with binary storage now is the leader of the pack.&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;Fingerprint efficiency&lt;/h3&gt;&lt;br/&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;Fingerprint type&lt;/th&gt;&lt;th&gt;Candidates screened&lt;/th&gt;&lt;th&gt;Hits matched&lt;/th&gt;&lt;th&gt;false positives&lt;/th&gt;&lt;th&gt;Efficiency&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ext+sub&lt;/td&gt;&lt;td&gt;8090&lt;/td&gt;&lt;td&gt;8049&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;0.995&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FP2&lt;/td&gt;&lt;td&gt;8145&lt;/td&gt;&lt;td&gt;8067&lt;/td&gt;&lt;td&gt;78&lt;/td&gt;&lt;td&gt;0.99&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;Pretty close.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-6545548890771355729?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/6545548890771355729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/first-light.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6545548890771355729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6545548890771355729'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/12/first-light.html' title='First Light'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5292464537709155648</id><published>2011-11-30T15:39:00.001+01:00</published><updated>2011-12-06T13:59:09.725+01:00</updated><title type='text'>What's up, doc?</title><content type='html'>&lt;br /&gt;OK, I have now a working (i.e. not crashing &amp;amp; giving meaningful results) hybrid version of pgchem::tigress with OpenBabel and Indigo, where the OpenBabel functions in the search engine have been replaced by Indigo functionality.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;To see if it can be done :-)&lt;/li&gt;&lt;li&gt;To learn more about programming with Indigo&lt;/li&gt;&lt;li&gt;To see which is faster&lt;/li&gt;&lt;li&gt;Indigo has better reaction support as it seems&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Interestingly I could keep the external interface almost stable. As only a dozen or so functions outside the search engine are affected by the change, I think with some #IFDEFs I can make a common codebase that compiles either to 100% OpenBabel or the hybrid version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-5292464537709155648?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5292464537709155648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/11/ok-i-have-now-working-i.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5292464537709155648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5292464537709155648'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/11/ok-i-have-now-working-i.html' title='What&apos;s up, doc?'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-620365598131521902</id><published>2011-11-14T10:09:00.001+01:00</published><updated>2011-11-17T11:49:39.440+01:00</updated><title type='text'>R-Matrix implementation with Indigo</title><content type='html'>Long time no see.&lt;br /&gt;&lt;br /&gt;I have been trying programming with Indigo recently and here is my first, straightforward (to avoid the term 'naive') implementation of an Ugi like R-Matrix (Gasteiger/Engel, Chemoinformatics, 2003, Wiley-VCH, p. 185ff.) for adding make/break/change bond detection to its reaction mapper:&lt;br /&gt;&lt;div style="font-size:11px"&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;quot;indigo.h&amp;quot;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;static&lt;/strong&gt; &lt;font color="#2040a0"&gt;inline&lt;/font&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;mp&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;column&lt;/font&gt;, &lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;row&lt;/font&gt;, &lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;maxRows&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;    &lt;strong&gt;return&lt;/strong&gt; &lt;font color="#2040a0"&gt;column&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;row&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;maxRows&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;main&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;argc&lt;/font&gt;, &lt;strong&gt;char&lt;/strong&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;argv&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;index&lt;/font&gt;, &lt;font color="#2040a0"&gt;reaction&lt;/font&gt;, &lt;font color="#2040a0"&gt;reactant&lt;/font&gt;, &lt;font color="#2040a0"&gt;product&lt;/font&gt;, &lt;font color="#2040a0"&gt;atom&lt;/font&gt;, &lt;font color="#2040a0"&gt;bond&lt;/font&gt;, &lt;font color="#2040a0"&gt;atomIter&lt;/font&gt;, &lt;font color="#2040a0"&gt;reactantIter&lt;/font&gt;, &lt;font color="#2040a0"&gt;productIter&lt;/font&gt;, &lt;font color="#2040a0"&gt;neighborIter&lt;/font&gt;, &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;, &lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;targetMappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;bondMakeBreak&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;strong&gt;int&lt;/strong&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;, &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;eMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;//, &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;rMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;qword&lt;/font&gt; &lt;font color="#2040a0"&gt;session&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoAllocSessionId&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoSetSessionId&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;session&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;%s&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;indigoVersion&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;reaction&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoLoadReactionFromFile&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;c:/temp/testrxn.rxn&amp;quot;&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    //&lt;font color="#2040a0"&gt;indigoFoldHydrogens&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;handle&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoDearomatize&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;1:%s&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;indigoGetLastError&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoAutomap&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;,&lt;font color="#008000"&gt;&amp;quot;discard&amp;quot;&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;reactantIter&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoIterateReactants&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;while&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactant&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoNext&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactantIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;indigoCountAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactant&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactantIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;calloc&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;,&lt;strong&gt;sizeof&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;eMatrix&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;calloc&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;,&lt;strong&gt;sizeof&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    //&lt;font color="#2040a0"&gt;rMatrix&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="#2040a0"&gt;calloc&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;,&lt;strong&gt;sizeof&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;reactantIter&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoIterateReactants&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;while&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactant&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoNext&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactantIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;atomIter&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoIterateAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactant&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;        &lt;strong&gt;while&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoNext&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atomIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;            &lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoGetAtomMappingNumber&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;,&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;%i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;indigoGetExplicitValence&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt;, &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#2040a0"&gt;valence&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;%i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;valence&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;mp&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;valence&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            &lt;font color="#2040a0"&gt;neighborIter&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoIterateNeighbors&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            &lt;strong&gt;while&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoNext&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;neighborIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;            &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;targetMappingNumber&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoGetAtomMappingNumber&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;,&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;index&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;mp&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;targetMappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;                &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;index&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;                &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;                    &lt;font color="#2040a0"&gt;bond&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;indigoBond&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;                    &lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;index&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;indigoBondOrder&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bond&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;                &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;            &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;neighborIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atomIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reactantIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;productIter&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoIterateProducts&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;while&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;product&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoNext&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;productIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;atomIter&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoIterateAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;product&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;        &lt;strong&gt;while&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoNext&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atomIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;            &lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoGetAtomMappingNumber&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;,&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;%i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;indigoGetExplicitValence&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt;, &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#2040a0"&gt;valence&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;%i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;valence&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;eMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;mp&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;valence&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            &lt;font color="#2040a0"&gt;neighborIter&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoIterateNeighbors&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            &lt;strong&gt;while&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoNext&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;neighborIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;            &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;targetMappingNumber&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;indigoGetAtomMappingNumber&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;,&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;index&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;mp&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;mappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;targetMappingNumber&lt;/font&gt;, &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;                //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;%i&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;indigoBondOrder&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bond&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;                &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;eMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;index&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;                &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;                    &lt;font color="#2040a0"&gt;bond&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;indigoBond&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atom&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;                    &lt;font color="#2040a0"&gt;eMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;index&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;indigoBondOrder&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bond&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;                &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;            &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;            &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;neighborIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;atomIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;productIter&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;for&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt; &lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt; &lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2040a0"&gt;bondMakeBreak&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;eMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;        //&lt;font color="#2040a0"&gt;rMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;bondMakeBreak&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;        &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bondMakeBreak&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;            &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;change: %i to %i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; / &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;%&lt;/font&gt; &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            &lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;make: %i to %i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; / &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;%&lt;/font&gt; &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;        &lt;strong&gt;else&lt;/strong&gt; &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bondMakeBreak&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;            &lt;strong&gt;if&lt;/strong&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;change: %i to %i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; / &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;%&lt;/font&gt; &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;            &lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;                &lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;break: %i to %i&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; / &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;,&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;i&lt;/font&gt; &lt;font color="4444FF"&gt;%&lt;/font&gt; &lt;font color="#2040a0"&gt;totalAtoms&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;        &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;2:%s&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;indigoGetLastError&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoSaveRxnfileToFile&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;,&lt;font color="#008000"&gt;&amp;quot;c:/temp/testrxn_mapped.rxn&amp;quot;&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    //&lt;font color="#2040a0"&gt;printf&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#008000"&gt;&amp;quot;3:%s&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;,&lt;font color="#2040a0"&gt;indigoGetLastError&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoFree&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;reaction&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;indigoReleaseSessionId&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;session&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;free&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    &lt;font color="#2040a0"&gt;free&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;eMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;    //&lt;font color="#2040a0"&gt;free&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;rMatrix&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;return&lt;/strong&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;At the moment it has the following shortcomings:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;50% too much memory consumption, since only half of the R-Matrix would suffice&lt;/li&gt;&lt;li&gt;Each bond is found twice (Atom1 to Atom2 and Atom2 to Atom1)&lt;/li&gt;&lt;li&gt;The make/break/change info is not added to the mapped reaction file&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-620365598131521902?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/620365598131521902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/11/r-matrix-implementation-with-indigo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/620365598131521902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/620365598131521902'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/11/r-matrix-implementation-with-indigo.html' title='R-Matrix implementation with Indigo'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5368799453564690696</id><published>2011-05-23T13:54:00.001+02:00</published><updated>2011-05-23T13:56:57.615+02:00</updated><title type='text'>Putting things into perspective</title><content type='html'>How to do it the wrong way:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jurvetson/5731894295"&gt;Radiation in Japan&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am no physicist, but this is so straightforward ignorant of factors like long term exposure effects, ingestion of radionuclides and non-uniform contamination that it leaves me speechless.&lt;br /&gt;&lt;br /&gt;Dear silicon valley executives with geiger counters, leave them at home. Please.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-5368799453564690696?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5368799453564690696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/05/putting-things-into-perspective.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5368799453564690696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5368799453564690696'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/05/putting-things-into-perspective.html' title='Putting things into perspective'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-1321756664459123175</id><published>2011-05-09T13:19:00.001+02:00</published><updated>2011-05-09T13:19:57.653+02:00</updated><title type='text'>JSDraw available again</title><content type='html'>Apprently, the HTML/JavaScript chemical editor JSDraw is available again:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scilligence.com/web/jsdraw.aspx"&gt;JSDraw&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As being haunted by 'issues' with plugin type editors based on Java or ActiveX for years, it's nice to see that browser-native editing/depiction of chemical structures is gaining more and more momentum.&lt;br /&gt;&lt;br /&gt;The other players I know of are: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://chemwriter.com/"&gt;ChemWriter&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ggasoftware.com/opensource/ketcher"&gt;Ketcher&lt;/a&gt;&lt;br /&gt;&lt;a href="http://web.chemdoodle.com/demos/sketcher"&gt;Sketcher 2D&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-1321756664459123175?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/1321756664459123175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/05/jsdraw-available-again.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1321756664459123175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1321756664459123175'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/05/jsdraw-available-again.html' title='JSDraw available again'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-8122322495522693497</id><published>2011-04-29T12:29:00.012+02:00</published><updated>2011-05-02T12:22:50.283+02:00</updated><title type='text'>Java in-memory compression</title><content type='html'>Sometimes it would be nice to have a means to compress seldom used objects in memory to time for space (since compression/decompression takes a bit of overhead time). Especially in chemoinformatics applications where objects often carry substantial compactible information, e.g. textual representations of structures, the compression ratio is quite noticable.&lt;br /&gt;&lt;br /&gt;Sure, one could do it for every variable individually, but how about compressing whole Objects using the standard serializing mechanism?&lt;br /&gt;&lt;br /&gt;If you use WEKA, you have the &lt;a href="http://weka.sourceforge.net/doc.dev/weka/core/SerializedObject.html"&gt;SerializedObject&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If not - enter the CompressedReference:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.io.ByteArrayInputStream;&lt;br /&gt;import java.io.ByteArrayOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.ObjectInputStream;&lt;br /&gt;import java.io.ObjectOutputStream;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.zip.GZIPInputStream;&lt;br /&gt;import java.util.zip.GZIPOutputStream;&lt;br /&gt;&lt;br /&gt;public class CompressedReference&amp;lt;T extends Serializable&amp;gt; implements Serializable {&lt;br /&gt;&lt;br /&gt;private static final long serialVersionUID = 7967994340450625830L;&lt;br /&gt;&lt;br /&gt;private byte[] theCompressedReferent = null;&lt;br /&gt;&lt;br /&gt;public CompressedReference(T referent) {&lt;br /&gt;try {&lt;br /&gt;compress(referent);&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int size() {&lt;br /&gt;return theCompressedReferent.length;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public  T get() {&lt;br /&gt;try {&lt;br /&gt;return decompress();&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;} catch (ClassNotFoundException e) {&lt;br /&gt;// TODO Auto-generated catch block&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private  void compress(T referent) throws IOException {&lt;br /&gt;&lt;br /&gt;ByteArrayOutputStream bos = new ByteArrayOutputStream();&lt;br /&gt;GZIPOutputStream zos = new GZIPOutputStream(bos);&lt;br /&gt;ObjectOutputStream ous = new ObjectOutputStream(zos);&lt;br /&gt;&lt;br /&gt;ous.writeObject(referent);&lt;br /&gt;&lt;br /&gt;zos.finish();&lt;br /&gt;&lt;br /&gt;bos.flush();&lt;br /&gt;&lt;br /&gt;theCompressedReferent = bos.toByteArray();&lt;br /&gt;&lt;br /&gt;bos.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;private  T decompress() throws IOException, ClassNotFoundException {&lt;br /&gt;T tmpObject = null;&lt;br /&gt;ByteArrayInputStream bis = new ByteArrayInputStream(theCompressedReferent);&lt;br /&gt;GZIPInputStream zis = new GZIPInputStream(bis);&lt;br /&gt;ObjectInputStream ois = new ObjectInputStream(zis);&lt;br /&gt;tmpObject = (T) ois.readObject();&lt;br /&gt;&lt;br /&gt;ois.close();&lt;br /&gt;&lt;br /&gt;return tmpObject;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;A quick test shows 528 byte size for a String of 250 characters (since Unicode needs two bytes per char) and 64 bytes after compression, a ratio of about 8:1. The only requirement is that the Object stored in the reference has to implement Serializable.&lt;br /&gt;&lt;br /&gt;And yes, I have to clear those TODO reminders... ;-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;The compression ratio for a CDK Molecule representation of 2-Fluoronaphthalene is about 3:1.&lt;br /&gt;The compression ratio for the V2000 mofile of 2-Fluoronaphthalene is about 7:1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-8122322495522693497?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/8122322495522693497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2011/04/java-in-memory-compression.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/8122322495522693497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/8122322495522693497'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2011/04/java-in-memory-compression.html' title='Java in-memory compression'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-2149617301612464658</id><published>2010-11-26T13:37:00.000+01:00</published><updated>2010-11-26T13:37:12.349+01:00</updated><title type='text'>pgchem::tigress sets new world record!</title><content type='html'>The &lt;a href="http://www.ipb-halle.de/en/"&gt;IPB &lt;/a&gt;now has successfully loaded ~28 million structures from &lt;a href="http://pubchem.ncbi.nlm.nih.gov/"&gt;pubchem &lt;/a&gt;into a &lt;a href="http://pgfoundry.org/projects/pgchem/"&gt;pgchem::tigress&lt;/a&gt;&amp;nbsp;/&amp;nbsp;&lt;a href="http://www.postgresql.org/"&gt;PostgreSQL &lt;/a&gt;database.&lt;br /&gt;&lt;br /&gt;This is the largest installation I know of and therefore sets a new world record - for pgchem. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-2149617301612464658?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/2149617301612464658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/pgchemtigress-sets-new-world-record.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2149617301612464658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2149617301612464658'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/pgchemtigress-sets-new-world-record.html' title='pgchem::tigress sets new world record!'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-3982400900692928972</id><published>2010-11-12T14:59:00.008+01:00</published><updated>2010-11-29T08:40:43.054+01:00</updated><title type='text'>Development of pgchem::tigress 2.0 has started</title><content type='html'>I finally managed to get &lt;a href="http://openbabel.org/wiki/Main_Page"&gt;OpenBabel&lt;/a&gt;&amp;nbsp;2.3.0 and &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;&amp;nbsp;9.x to talk to each other on Windows. This only works when building with the MinGW Makefiles, not with MSYS, as PostgreSQL does &lt;b&gt;not&lt;/b&gt; like mixing with the MSYS runtime libraries. And still a static build of &lt;i&gt;libopenbabel&lt;/i&gt; and &lt;i&gt;libinchi&lt;/i&gt; is required.&lt;br /&gt;&lt;br /&gt;The overall good news is that the &lt;i&gt;Makefile&lt;/i&gt; could be simplified a lot with help from Steffen Neumann from the&amp;nbsp;&lt;a href="http://www.ipb-halle.de/en/"&gt;Leibniz Institute of Plant Biochemistry&lt;/a&gt;&amp;nbsp;and all current functions are still working with OB 2.3. The build process on Windows is still a bitch compared to building on Posix systems, though.&lt;br /&gt;&lt;br /&gt;The roadmap for 2.0:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A lot of code needs cleanup, &lt;strike&gt;especially the &lt;i&gt;make_molecule()&lt;/i&gt; function, which is unreadable and error prone&lt;/strike&gt;. Mr. Neumann has also identified various possible memory leaks that need to be fixed&lt;/li&gt;&lt;li&gt;&lt;s&gt;Allow 2D coordinate generation for Molfile output&lt;/s&gt;&lt;/li&gt;&lt;li&gt;&lt;s&gt;Using &lt;i&gt;OBQuery&lt;/i&gt; for non-SMARTS substructure searching&lt;/s&gt;&lt;/li&gt;&lt;li&gt;&lt;s&gt;Add &lt;a href="http://www.silicos.be/spectrophore.html"&gt;Spectrophore&lt;/a&gt;(TM) output&lt;/s&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Add support for exporting Andrew Dalke's&amp;nbsp;&lt;a href="http://code.google.com/p/chem-fingerprints/"&gt;chemfp&lt;/a&gt;&amp;nbsp;formats &amp;nbsp;(at least &lt;a href="http://code.google.com/p/chem-fingerprints/wiki/FPS"&gt;FPS&lt;/a&gt;)&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Move SVG output from &lt;a href="http://scitouch.net/indigo/dingo"&gt;Dingo&lt;/a&gt; to OB, having one library less to care for&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;Add the fingerprint&amp;nbsp;&amp;nbsp;linear&amp;nbsp;optimizer in a generally usable implementation&lt;/li&gt;&lt;li&gt;See if the new stereochemistry inside OB fixes various issues that were reported&lt;/li&gt;&lt;li&gt;&lt;strike&gt;Basic reaction support &lt;/strike&gt;&lt;/li&gt;&lt;li&gt;Win64 builds ?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This will take some time, so don't hold your breath. Since there are already some bugs reported for OB 2.3.0 I guess I'll have to wait for those being fixed before a production release of &lt;a href="http://pgfoundry.org/projects/pgchem/"&gt;pgchem::tigress&lt;/a&gt; 2.0 becomes available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-3982400900692928972?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/3982400900692928972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/development-of-pgchemtigress-20-has.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/3982400900692928972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/3982400900692928972'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/development-of-pgchemtigress-20-has.html' title='Development of pgchem::tigress 2.0 has started'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-1577572719191877313</id><published>2010-11-09T14:23:00.002+01:00</published><updated>2010-12-06T15:12:31.391+01:00</updated><title type='text'>GCC6 Day Three (09.11)</title><content type='html'>&lt;span class="Apple-style-span" style="color: #474b4e; font-family: Helvetica,Arial,sans-serif; font-size: 13px; line-height: 18px;"&gt;So, I rediscovered my notes from day three. Unfortunately there are only two lectures I can really write something about:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #474b4e; font-family: Helvetica,Arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://baoilleach.blogspot.com/"&gt;Noel O'Boyle&lt;/a&gt;s lecture about the in-silico design of polymers with optimal properties for organic solar cells. As far as I understood this, the predicted efficency for organic solar cells is about 13 %. Experimentally 6 % have been reached yet. By using&amp;nbsp;&lt;a href="http://openbabel.org/wiki/Main_Page"&gt;OpenBabel&lt;/a&gt;&amp;nbsp;together with&lt;a href="http://www.blogger.com/goog_633415011"&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://cclib.sourceforge.net/wiki/index.php/Main_Page"&gt;cclib&lt;/a&gt; and Gaussian, synthetically accessible polymers with 11 % predicted efficiency could be designed.&lt;/li&gt;&lt;li&gt;Roger Sayle from&amp;nbsp;&lt;a href="http://nextmovesoftware.com/"&gt;NextMove&lt;/a&gt;&amp;nbsp;showed his recent work on a chemistry aware spell checker, based on the observation, that the current problems with chemical text mining do not come from poor OCR or poor name2structure conversion, but mainly from bad input because of typos etc. in the source texts and common spell checking software cannot cope with this.&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/8333362953216176367-1577572719191877313?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/1577572719191877313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-day-three-0911.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1577572719191877313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1577572719191877313'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-day-three-0911.html' title='GCC6 Day Three (09.11)'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-7105239748116802116</id><published>2010-11-08T16:46:00.017+01:00</published><updated>2010-11-26T14:09:48.790+01:00</updated><title type='text'>GCC6 Day Two (08.11)</title><content type='html'>So, I rediscovered my notes from day two. Unfortunately there are only two lectures I can really write something about:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The &lt;b&gt;&lt;a href="http://www.blogger.com/goog_105081452"&gt;WizePairZ&lt;/a&gt;&lt;/b&gt;&lt;a href="http://pubs.acs.org/doi/abs/10.1021/ci100084s"&gt; &lt;/a&gt;&amp;nbsp;algorithm was quite interesting. It aims to solve the problem that often unwanted properties of drug candidates scale in correlation with wanted properties. The idea behind WizePairZ is to automatically find transformations from one moelcule to another that reduce unwanted properties (ideally while improving wanted properties). Then such transformations are applied to molecules which are close to the boundary between 'unwanted' and 'wanted' space in order to push them over the boundary.&lt;/li&gt;&lt;li&gt;The in-silico prediction of &lt;b&gt;Phototocicity&lt;/b&gt; aims to find molecular descriptors and associated models that allow to predict the potential phototoxicity of substances, especially their UV absorption between 290 - 450 nm wavelength where the human skin doesn't filter anymore and the ozone layer doesn't filter yet.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-7105239748116802116?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/7105239748116802116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-day-two-0811.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/7105239748116802116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/7105239748116802116'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-day-two-0811.html' title='GCC6 Day Two (08.11)'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-6199752483122058831</id><published>2010-11-08T06:57:00.003+01:00</published><updated>2010-11-26T14:26:49.313+01:00</updated><title type='text'>GCC6 Day One  (07.11)</title><content type='html'>&lt;br /&gt;Arrived 14:00 in Goslar&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's new in &lt;a href="http://www.knime.org/"&gt;Knime&lt;/a&gt; presentation:&lt;/b&gt;&lt;br /&gt;Mainly usability improvements, like conditional paths through workflows and annotations. This is really getting somewhere.&amp;nbsp;Release planned for December 6th 2010&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My presentation:&lt;/b&gt;&lt;br /&gt;I was not boohed from the stage&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.mosgrid.de/"&gt;MOSGrid&lt;/a&gt; presentation:&lt;/b&gt;&lt;br /&gt;It's a&amp;nbsp;molecular simulation grid driven by a consortium of academia and industry, lead by the University of Cologne&lt;br /&gt;&lt;br /&gt;The planned usage is, that you can specify a task through a web interface in&amp;nbsp;MSML (molecular simulation markup laguage), which describes a task for the grid, then the MSML is translated into input specific to a program (e.g. Gaussian).&lt;br /&gt;The program is then run on the grid and the program specific output is translated again into MSML and returned to the user.&lt;br /&gt;&lt;br /&gt;Currently&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gaussian&lt;/li&gt;&lt;li&gt;Turbomole&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;are supported.&lt;br /&gt;&lt;br /&gt;Tasks can be chained into workflows. Lots of expertise and manpower, and if buerocracy doesn't step in the way, this could work and is worth a look. Unfortunately, the licensing of the used programs in a grid seems to be an unsolved legal problem.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Demonstration of MOSGrid:&lt;/b&gt;&lt;br /&gt;A basic web interface (to Gaussian I guess) was shown and how to run quantum calculations on the grid from there.&amp;nbsp;The interface is designed for humans. Currently there are no plans to offer this as a service to machines. Licensinsg issues of using commercial software in a grid must be ironed out to make it widely available, but beta testing will start in December to a limited number of users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-6199752483122058831?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/6199752483122058831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-day-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6199752483122058831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6199752483122058831'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-day-1.html' title='GCC6 Day One  (07.11)'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-6684201555061148921</id><published>2010-11-05T09:05:00.000+01:00</published><updated>2010-11-05T09:05:41.078+01:00</updated><title type='text'>GCC6 in Goslar</title><content type='html'>I'll be at the 6th &lt;a href="http://www.gdch.de/gcc2010"&gt;German Conference on Chemoinformatics&lt;/a&gt; in Goslar from November 7-9.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-6684201555061148921?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/6684201555061148921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-in-goslar.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6684201555061148921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6684201555061148921'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/gcc6-in-goslar.html' title='GCC6 in Goslar'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-2259104420951257801</id><published>2010-11-04T14:18:00.001+01:00</published><updated>2010-11-04T15:13:39.085+01:00</updated><title type='text'>The SMARTSViewer</title><content type='html'>This is a nifty service for visualizing SMARTS patterns from the University of Hamburg:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://smartsview.zbh.uni-hamburg.de/"&gt;SMARTSViewer&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;Probably useful when your SMARTS pattern does not match what you think it should...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-2259104420951257801?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/2259104420951257801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/smartsviewer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2259104420951257801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2259104420951257801'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/11/smartsviewer.html' title='The SMARTSViewer'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-4133031938644485309</id><published>2010-10-27T15:22:00.002+02:00</published><updated>2010-10-27T15:22:38.327+02:00</updated><title type='text'>Nasty thoughts</title><content type='html'>Typically reading the FDA Warning Letters is pretty dry stuff, but &lt;a href="http://www.fda.gov/ICECI/EnforcementActions/WarningLetters/ucm230439.htm"&gt;this&lt;/a&gt; looks like a fun product.&lt;p&gt;"The effects of ... will promote a thrilling energy, more stamina, constant readiness, &lt;b&gt;nasty thoughts&lt;/b&gt;, prolonged arousal, feelings of well being, romantic and sensual experience."&lt;p&gt;"Nasty thoughts" - those guys from Natural Wellness, LLC really should try Mefloquine...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-4133031938644485309?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/4133031938644485309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/10/nasty-thoughts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/4133031938644485309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/4133031938644485309'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/10/nasty-thoughts.html' title='Nasty thoughts'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-1751153250317544705</id><published>2010-08-11T11:05:00.001+02:00</published><updated>2010-08-11T12:05:43.780+02:00</updated><title type='text'>Searching Structures in ChemSpider from the Android Browser...</title><content type='html'>...is now implemented as empirical formula search.&lt;br /&gt;&lt;br /&gt;Not what was ultimately desired, but at least it works.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-1751153250317544705?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/1751153250317544705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/08/searching-structures-in-chemspider-from_11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1751153250317544705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1751153250317544705'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/08/searching-structures-in-chemspider-from_11.html' title='Searching Structures in ChemSpider from the Android Browser...'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-2870697338399942998</id><published>2010-08-06T10:46:00.001+02:00</published><updated>2010-08-06T10:50:17.776+02:00</updated><title type='text'>Searching Structures in ChemSpider from the Android Browser...</title><content type='html'>...does not work at the moment.&lt;br /&gt;&lt;br /&gt;Having, with the friendly help of ChemSpider support, found out how to use their web API, I tried to call it from the android browser.&lt;br /&gt;&lt;br /&gt;The HTML form works at least in Firefox, IE 6.x and Chrome, but from the Android browser it either opens the ChemSpider start page - or sometimes only a blank page.&lt;br /&gt;&lt;br /&gt;It seems that I'll have to monitor what the Android browser really sends to ChemSpider with Wireshark to find out what the problem is.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-2870697338399942998?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/2870697338399942998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/08/searching-structures-in-chemspider-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2870697338399942998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2870697338399942998'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/08/searching-structures-in-chemspider-from.html' title='Searching Structures in ChemSpider from the Android Browser...'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5727623239685599968</id><published>2010-07-23T10:54:00.001+02:00</published><updated>2010-08-20T14:12:46.835+02:00</updated><title type='text'>Thesis abstract</title><content type='html'>The storage and retrieval of chemical graphical datatypes such as structures andreactions in relational database systems is a common technique used in academia andindustry alike. Due to the computationally intensive algorithms used for (sub)graphisomorphismdetection, such systems commonly use faster screening mechanisms inorder to reduce the set of potentional match positives before applying aforementionedalgorithms.&lt;br /&gt;&lt;br /&gt;Widely used screening mechanisms are based on numerical and binary vectors, calledfingerprints, with a clear dominance of binary fingerprints due to the raw speedadvantage of bitwise operations and compactness in storage. The two most commonlyused types of binary fingerprints are path-generated and substructure-generated, bothof which have specific shortcomings, especially &lt;i&gt;blind spots&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;To overcome this shortcomings, the Pgchem::Tigress chemistry extension to thePostgreSQL object-relational database management system uses a hybrid binaryfingerprint, consisting of an invariant path-generated part and an substructure-generatedpart which is externally configurable through a dictionary of substructure patterns.&lt;br /&gt;&lt;br /&gt;This thesis presents a novel approach of using dynamic discrete optimization to find anoptimized dictionary configuration for the substructure-generated part of the fingerprintfor arbitrary sets of structural data.&lt;br /&gt;&lt;br /&gt;By means of applying the method developed in this thesis, the computational powerneccessary to run a chemical information system can be reduced by 42 percent onaverage. By improving the query throughput, upgrading the server hardware to thenext level of computational power can be avoided and thus opportunity revenues ofthe operating costs are realized.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; It is now &lt;a href="http://duepublico.uni-duisburg-essen.de/servlets/DerivateServlet/Derivate-24687"&gt;readable online&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-5727623239685599968?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5727623239685599968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/thesis-abstract.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5727623239685599968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5727623239685599968'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/thesis-abstract.html' title='Thesis abstract'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-3553773657351825984</id><published>2010-07-19T13:26:00.002+02:00</published><updated>2010-07-19T13:26:20.690+02:00</updated><title type='text'>Thesis defence</title><content type='html'>The date of my defence is 21.07.2010, 10:00-11:15 UTC+2.&lt;br /&gt;&lt;br /&gt;If  somebody's willing to cross their fingers for me, it'll be appreciated.  :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-3553773657351825984?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/3553773657351825984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/thesis-defence.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/3553773657351825984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/3553773657351825984'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/thesis-defence.html' title='Thesis defence'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-662345997049043673</id><published>2010-07-09T11:34:00.006+02:00</published><updated>2010-07-19T13:28:58.241+02:00</updated><title type='text'>ChemSpider Web API, anyone?</title><content type='html'>I'm trying to do a structure search using the published ChemSpider Web API:&amp;nbsp; &lt;a href="http://www.chemspider.com/WebAPI.aspx"&gt;http://www.chemspider.com/WebAPI.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I thought it would be sufficient to get the form they provide, put a molfile into the designated area, add an submit button and it works.&lt;br /&gt;&lt;br /&gt;&lt;form&gt;But all I get back are blank pages with no content. No error messages, nothing useful.&lt;br /&gt;&lt;br /&gt;How is the darn thing meant to be used?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Adding a method="post" to the form did the trick, but apparently only substructure searches with unlimited result set are supported. This results in very poor performance with structures of low selectivity. Still not good&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE 2:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I had an extra line in my molfile.&lt;/li&gt;&lt;li&gt;There is really a bug in the API&lt;b&gt;. &lt;/b&gt;Substructure search triggers exact search and vice versa. Since the API is heavily in use with workarounds to this bug, fixing this would break many applications.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;/form&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-662345997049043673?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/662345997049043673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/chemspider-web-api-anyone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/662345997049043673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/662345997049043673'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/chemspider-web-api-anyone.html' title='ChemSpider Web API, anyone?'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-294487780318802576</id><published>2010-07-05T15:14:00.004+02:00</published><updated>2010-07-06T13:21:25.578+02:00</updated><title type='text'>The curious case of the infinite canvas</title><content type='html'>After some fruitless attempts to extend the usable canvas of DCE ChemPad with some kind of self-made view port, in order to allow drawing of larger-than-screen structures, I think I now found a more painless way.&lt;br /&gt;&lt;br /&gt;Simply wrapping the DCE Control in a &lt;i&gt;HorizontalScrollView&lt;/i&gt; was not enough, because the &lt;i&gt;ScrollView&lt;/i&gt; intercepts too much MotionEvents, but after subclassing &lt;i&gt;HorizontalScrollView&lt;/i&gt; and overriding &lt;i&gt;onInterceptTouchEvent()&lt;/i&gt;, it seems to work as expected. The code needs some more polishing though to call it working though.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_AkjpYdM6EEo/TDMQ-rxYRPI/AAAAAAAAAB4/UChhrIH72mw/s1600/device.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_AkjpYdM6EEo/TDMQ-rxYRPI/AAAAAAAAAB4/UChhrIH72mw/s400/device.png" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As you can see on the screenshot, the structure now can be  scrolled left and right as needed to draw more than would fit on the  screen. The thin line on the bottom separates the drawing from the scrolling sensitive area, because otherwise the whole screen would be scroll sensitive and drawing while scrolling is not very precise. The screenshot is from a NexusOne with Android 2.2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-294487780318802576?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/294487780318802576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/curious-case-of-infinite-canvas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/294487780318802576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/294487780318802576'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/07/curious-case-of-infinite-canvas.html' title='The curious case of the infinite canvas'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AkjpYdM6EEo/TDMQ-rxYRPI/AAAAAAAAAB4/UChhrIH72mw/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-6683805662979605731</id><published>2010-06-02T12:06:00.003+02:00</published><updated>2010-06-02T12:08:27.742+02:00</updated><title type='text'>DCE ChemPad Update 1.1</title><content type='html'>A few bugs have been fixed (sorry, no autolayout yet :-)), all controls have been moved into the menu and no titlebar anymore to save screen estate. The vibration feedback for fusing atoms works now as expected and you can send the molfile via the phone's messaging systems. Since it seems that attachment handling is &lt;strike&gt;broken&lt;/strike&gt; not fully implemented on Android, the molfile is embedded as text in the message itself. A localized help function was added to the application.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_AkjpYdM6EEo/TAYs5DHqnlI/AAAAAAAAABo/ehajNFRECLI/s1600/device.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_AkjpYdM6EEo/TAYs5DHqnlI/AAAAAAAAABo/ehajNFRECLI/s400/device.png" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-6683805662979605731?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/6683805662979605731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/06/dce-chempad-update-11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6683805662979605731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6683805662979605731'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/06/dce-chempad-update-11.html' title='DCE ChemPad Update 1.1'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_AkjpYdM6EEo/TAYs5DHqnlI/AAAAAAAAABo/ehajNFRECLI/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5783363000180364661</id><published>2010-05-26T11:11:00.003+02:00</published><updated>2010-06-08T22:01:52.489+02:00</updated><title type='text'>DCE ChemPad 1.0 is out in the wild</title><content type='html'>DCE ChemPad is released for free on the Android Market!&lt;br /&gt;&lt;br /&gt;It shows the capabilities of the DCE Chemistry Editor Control to add a chemical editor to arbitrary Android applications.&lt;br /&gt;&lt;br /&gt;It was tested on the HTC Nexus One, ACER Liquid S 100, Motorola Milestone/Droid and the Emulator and should work with all Android versions &amp;gt;= 1.5. It does reportedly not work on the Motorola Cliq.&lt;br /&gt;&lt;br /&gt;If you have acceess to the Market, please try it and tell me what you think...&lt;br /&gt;&lt;br /&gt;Ah, screenshots:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_AkjpYdM6EEo/S_2FYCjoyuI/AAAAAAAAABg/iVmHQxp4pDQ/s1600/device.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_AkjpYdM6EEo/S_2FYCjoyuI/AAAAAAAAABg/iVmHQxp4pDQ/s400/device.png" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-5783363000180364661?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5783363000180364661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/05/dce-chempad-10-is-out-in-wild.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5783363000180364661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5783363000180364661'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/05/dce-chempad-10-is-out-in-wild.html' title='DCE ChemPad 1.0 is out in the wild'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AkjpYdM6EEo/S_2FYCjoyuI/AAAAAAAAABg/iVmHQxp4pDQ/s72-c/device.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-2733866596862988728</id><published>2010-05-07T22:43:00.001+02:00</published><updated>2010-05-11T13:26:15.470+02:00</updated><title type='text'>Aspirin for Android</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_AkjpYdM6EEo/S-k-zOjszYI/AAAAAAAAABY/4Y7ZpwOUR9Y/s1600/device.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_AkjpYdM6EEo/S-k-zOjszYI/AAAAAAAAABY/4Y7ZpwOUR9Y/s400/device.png" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-2733866596862988728?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/2733866596862988728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/05/aspirin-for-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2733866596862988728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2733866596862988728'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/05/aspirin-for-android.html' title='Aspirin for Android'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AkjpYdM6EEo/S-k-zOjszYI/AAAAAAAAABY/4Y7ZpwOUR9Y/s72-c/device.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5263770350995623381</id><published>2010-04-22T21:35:00.004+02:00</published><updated>2010-04-29T21:04:34.424+02:00</updated><title type='text'>Solving the 'big finger vs. tiny screen' problem</title><content type='html'>&lt;ul&gt;&lt;li&gt;Learn how to make custom View controls - check&lt;/li&gt;&lt;li&gt;Learn to make compound controls - check&lt;/li&gt;&lt;li&gt;Learn how to paint on the canvas - check&lt;/li&gt;&lt;li&gt;Design a effective 2D rendering pipeline for undirected graphs- check&lt;/li&gt;&lt;li&gt;Remember basic planar trigonometry - check &lt;/li&gt;&lt;li&gt;Design a fuzzy lock-on selection method for the touchscreen - check&lt;/li&gt;&lt;li&gt;Design a robust backing model - check&lt;/li&gt;&lt;li&gt;Design an effective UI for the touchscreen - check&lt;/li&gt;&lt;li&gt;Implement all the nasty details - check&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/8333362953216176367-5263770350995623381?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5263770350995623381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/solving-big-finger-vs-tiny-screen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5263770350995623381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5263770350995623381'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/solving-big-finger-vs-tiny-screen.html' title='Solving the &apos;big finger vs. tiny screen&apos; problem'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-2902935413066050253</id><published>2010-04-14T10:37:00.004+02:00</published><updated>2010-04-14T10:39:26.611+02:00</updated><title type='text'>NexusOne: Big finger vs. tiny screen</title><content type='html'>I now have a NexusOne at hand.&lt;br /&gt;&lt;br /&gt;And while it is &lt;b&gt;much&lt;/b&gt; faster than the Emulator, a very profane problem has come up. It is impossible to precisely draw a chemical structure with an editor designed for the mouse! It is just to sensitive to use it with a finger on a tiny screen. And a pen won't work with a capacitive touchscreen...&lt;br /&gt;&lt;br /&gt;Maybe i have to take an intensive look at the &lt;i&gt;android.graphics&lt;/i&gt; package.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-2902935413066050253?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/2902935413066050253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/nexusone-big-finger-vs-tiny-screen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2902935413066050253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/2902935413066050253'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/nexusone-big-finger-vs-tiny-screen.html' title='NexusOne: Big finger vs. tiny screen'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-6108961109136436969</id><published>2010-04-01T13:39:00.003+02:00</published><updated>2010-04-01T13:41:08.189+02:00</updated><title type='text'>JavaScript molecule editor roundup</title><content type='html'>Next to JsDraw which had it's 1.0 &lt;a href="http://www.chemene.com:8080/web/jsdraw.aspx"&gt;release&lt;/a&gt; recently, I've found two more pure JavaScript molecule editors:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pc.ardoino.com/pj-kem-molecular-editor/%20"&gt;WebCME&lt;/a&gt; which has a lot of features, notably a large library of molecules but is quite painful to use. This is because it's developers have chosen a system of 'select two atoms, add bond, deselect them, select another two atoms, add bond, oh wrong one, delete bond, add correct bond...' for drawing.&lt;br /&gt;&lt;br /&gt;The ChemDoodle &lt;a href="http://web.chemdoodle.com/"&gt;web components &lt;/a&gt;on the other hand have a totally minimalistic, yet powerful UI. Atoms are drawn by mouseclick, bonds drawn by mouse drag. Atom types can be changed via keyboard, bond types by mouseclick and delete is done by the Backspace or Delete key.&lt;br /&gt;&lt;br /&gt;Unfortunately none of the three works on mobile browsers. Either they don't work at all or only by half.&lt;br /&gt;&lt;br /&gt;In contrast, the &lt;a href="http://chemhack.com/jsmoleditor/"&gt;jsMolEditor &lt;/a&gt;does work even in Android WebViews, but seems to be not under development anymore. I suspect that it was abandoned in favour of JsDraw.&lt;br /&gt;&lt;br /&gt;What a pity. Having a (even simple) but working JavaScript molecule editor, that works in Smartphone WebViews would open a whole new world of applications for those devices. They now have the computational power to handle chemical data, but who wants to enter SMILES strings by hand...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-6108961109136436969?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/6108961109136436969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/javascript-molecule-editor-roundup.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6108961109136436969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/6108961109136436969'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/javascript-molecule-editor-roundup.html' title='JavaScript molecule editor roundup'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-7851111331199815141</id><published>2010-04-01T10:49:00.000+02:00</published><updated>2010-04-01T10:49:54.771+02:00</updated><title type='text'>pgchem::tigress 1.2 is out</title><content type='html'>&lt;a href="http://pgfoundry.org/projects/pgchem/"&gt;http://pgfoundry.org/projects/pgchem/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Built and tested against PostgreSQL 8.4.2 with OpenBabel 2.2.3 on XP 32 bit, Windows 7 64 bit and Ubuntu 8.04 LTS 32 bit.&lt;br /&gt;&lt;br /&gt;MACCS166 binary fingerprints.&lt;br /&gt;&lt;br /&gt;Dice and Tversky similarity.&lt;br /&gt;&lt;br /&gt;Small bug fixes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-7851111331199815141?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/7851111331199815141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/pgchemtigress-12-is-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/7851111331199815141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/7851111331199815141'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/04/pgchemtigress-12-is-out.html' title='pgchem::tigress 1.2 is out'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5649242673202893263</id><published>2010-03-16T10:47:00.001+01:00</published><updated>2010-03-16T10:48:03.958+01:00</updated><title type='text'>How to run mx on Android</title><content type='html'>&lt;a href="http://metamolecular.com/mx"&gt;mx&lt;/a&gt; runs on &lt;a href="http://developer.android.com/index.html"&gt;Android&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;To make it work, you need to build from sources and remove all references to javax.swing (which doesn't seem to break the rest of the code btw.), since Android does not contain AWT or Swing.&lt;br /&gt;&lt;br /&gt;Then repackage the jar and it can be used in Android applications. &lt;br /&gt;&lt;br /&gt;Chemistry on the smartphone, yay. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-5649242673202893263?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5649242673202893263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/03/how-to-run-mx-on-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5649242673202893263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5649242673202893263'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/03/how-to-run-mx-on-android.html' title='How to run mx on Android'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-3646396031335978667</id><published>2010-03-10T10:32:00.000+01:00</published><updated>2010-03-10T10:32:50.095+01:00</updated><title type='text'>Changing the public API between minor versions of PostgreSQL</title><content type='html'>I hate when they do this.&lt;br /&gt;&lt;br /&gt;Between 8.3 and 8.4, the API for CREATE OPERATOR CLASS has changed. Now the RECHECK flag is obsolete, letting the index dynamically decide if it is lossy or not.&lt;br /&gt;&lt;br /&gt;While this in itself is an improvement, it generates an incompatibility between GiST C code and scripts written for 8.3 and 8.4. Fortunately, the fix seems to be an easy one...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-3646396031335978667?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/3646396031335978667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/03/changing-public-api-between-minor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/3646396031335978667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/3646396031335978667'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/03/changing-public-api-between-minor.html' title='Changing the public API between minor versions of PostgreSQL'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-1562403710421767312</id><published>2010-03-03T13:55:00.002+01:00</published><updated>2010-03-03T13:56:19.436+01:00</updated><title type='text'>Wrapping native libraries with JNA: Dingo</title><content type='html'>Even with the advent of pure Java chemoinformatics toolkits like &lt;a href="http://metamolecular.com/mx"&gt;MX&lt;/a&gt; or the &lt;a href="http://sourceforge.net/projects/cdk/"&gt;CDK&lt;/a&gt;, there is a lot of interesting native code floating around on the net. Unfortunately, wrapping native code with &lt;a href="http://de.wikipedia.org/wiki/Java_Native_Interface"&gt;JNI&lt;/a&gt; is no real fun.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://jna.dev.java.net/"&gt;JNA&lt;/a&gt; comes to the rescue. It does all the neccessary loading and marshalling stuff dynamically in the background for you. All you need is a declaration of the native interface, the rest is magic.&lt;br /&gt;&lt;br /&gt;Here's an incomplete but working example for &lt;a href="http://opensource.scitouch.net/indigo/dingo"&gt;Dingo&lt;/a&gt; 1.0:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;package your_package_here&lt;your here="" package=""&gt;;&lt;/your&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import com.sun.jna.Native;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;public class NativeDingoWrapper {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; static {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Native.register("dingo");&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoSetOutputFormat(String anOutputFormat);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoSetColoring(int aColoringFlag);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoSetHighlightColorEnabled(int aHighlightFlag);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoSetHighlightThicknessEnabled(int aHighlightThicknessFlag);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoSetStereoOldStyle(int aStereoFlag);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoSetImageSize(int aWidth, int aHeight);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoLoadMolFromString(String aMol);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoLoadMolFromFile(String aFile);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoSetOutputFile(String anOutputFile);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoRender();&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; public static native int dingoMoleculeIsEmpty();&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And that's it.&lt;br /&gt;&lt;br /&gt;The only drawback of JNA is that it needs a glue DLL specific to the operating system, so theoretically it is more platform limited than JNI.&lt;br /&gt;&lt;br /&gt;But since "JNA has been built and tested on OSX (ppc, x86, x86_64), linux (x86,  amd64), FreeBSD/OpenBSD (x86, amd64), Solaris (x86, amd64, sparc, sparcv9) and  Windows (x86, amd64).  It has also been built for windows/mobile and  Linux/ppc64, although those platforms are not included in the distribution." this is a quite limited limitation for most cases.&lt;br /&gt;&lt;br /&gt;I have successfully wrapped &lt;a href="http://opensource.scitouch.net/indigo/dingo"&gt;Dingo&lt;/a&gt; and &lt;a href="http://pgfoundry.org/projects/pgchem/"&gt;Barsoi&lt;/a&gt; with JNA and up to now it just works as advertised.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-1562403710421767312?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/1562403710421767312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/03/wrapping-native-libraries-with-jna.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1562403710421767312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/1562403710421767312'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/03/wrapping-native-libraries-with-jna.html' title='Wrapping native libraries with JNA: Dingo'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5287982297011132427</id><published>2010-02-15T13:12:00.004+01:00</published><updated>2010-02-15T15:47:37.736+01:00</updated><title type='text'>Chemoinformatics in the browser: Fingerprint similarity calculation</title><content type='html'>Well there are other things that can be done in JavaScript beyond substructure search. For example, Tanimoto binary fingerprint similarity calculation needs just two short functions:&lt;br /&gt;&lt;br /&gt;function popcount(b) {&lt;br /&gt;var c, bi3b = 0xE994;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp; = 3 &amp;amp; (bi3b &amp;gt;&amp;gt; ((b &amp;lt;&amp;lt; 1) &amp;amp; 14));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c += 3 &amp;amp; (bi3b &amp;gt;&amp;gt; ((b &amp;gt;&amp;gt; 2) &amp;amp; 14));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c += 3 &amp;amp; (bi3b &amp;gt;&amp;gt; ((b &amp;gt;&amp;gt; 5) &amp;amp; 6));&lt;br /&gt;return c;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function tanimoto(fp1, fp2) {&lt;br /&gt;var a=0;&lt;br /&gt;var b=0;&lt;br /&gt;var c=0;&lt;br /&gt;&lt;br /&gt;for (var i=fp1.length-1; i&amp;gt;=0; i--) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var block_fp1=fp1[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var block_fp2=fp2[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += popcount(block_fp1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b += popcount(block_fp2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c += popcount(block_fp1 &amp;amp; block_fp2);&lt;br /&gt;}&lt;br /&gt;return c/(a+b-c);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;The fingerprints have to be converted into JavaScript arrays of equal length containing signed numbers:&lt;br /&gt;&lt;br /&gt;onclick="alert(tanimoto(new Array('1','-1073741825'),new Array('3','2147483647')));"&lt;br /&gt;&lt;br /&gt;0.9&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-5287982297011132427?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5287982297011132427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/chemoinformatics-in-browser-fingerprint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5287982297011132427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5287982297011132427'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/chemoinformatics-in-browser-fingerprint.html' title='Chemoinformatics in the browser: Fingerprint similarity calculation'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-7556553805155294587</id><published>2010-02-12T09:23:00.002+01:00</published><updated>2010-02-18T08:28:16.261+01:00</updated><title type='text'>Chemoinformatics in the browser: Firefox catches up</title><content type='html'>&amp;gt;That's a big difference. Which version of Firefox? If 3.5, have you  tried 3.6?&lt;br /&gt;&lt;br /&gt;Yes, today. Chrome 4 is not faster than Chrome 3 but Firefox 3.6 now allows jobs of about 50 structures.&lt;br /&gt;&lt;br /&gt;&lt;table style="height: 124px; width: 178px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Browser&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;max. job size&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chrome 3.x&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chrome 4.x&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Firefox 3.5.x&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Firefox 3.6.x&lt;/td&gt;&lt;td&gt;50&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IE 6.x&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IE 8.x&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Those batch sizes allow for script execution times of about 1 second. The idea behind this is, that this does not interfere with other scripts on a page if the job is running embedded, e.g. in an invisible &lt;span style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;iframe&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;If the page is dedicated, much larger jobs might be possible up to the limit of the browser that triggers the 'A script is not responding' error message.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: &lt;/b&gt;IE 8.x is twice as fast as IE 6.x, but still slow compared to the competitiors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-7556553805155294587?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/7556553805155294587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/chemoinformatics-in-browser-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/7556553805155294587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/7556553805155294587'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/chemoinformatics-in-browser-firefox.html' title='Chemoinformatics in the browser: Firefox catches up'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-4329641423541851521</id><published>2010-02-11T09:31:00.012+01:00</published><updated>2010-02-11T11:15:52.860+01:00</updated><title type='text'>Chemoinformatics in the browser: Chrome finishes first</title><content type='html'>While developing my little demo in the &lt;a href="http://theplateisbad.blogspot.com/2010/02/this-article-about-idea-of.html"&gt;previous&lt;/a&gt; article, I found that different browsers could handle different job sizes depending how fast their JavaScript engines are.&lt;br /&gt;&lt;br /&gt;Chrome 3.x finishes first before Firefox 3.x and ye olde IE 6.x is almost unusably slow for substructure searching with JavaScript.&lt;br /&gt;&lt;br /&gt;The possible job sizes are:&lt;br /&gt;&lt;br /&gt;&lt;table style="height: 124px; width: 178px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Browser&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;max. job size&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chrome 3.x&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Firefox 3.x&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IE 6.x&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Thus, the server sizes jobs according to the &lt;span style="font-family: times new roman;"&gt;user-agent&lt;/span&gt; header sent:&lt;br /&gt;&lt;pre&gt;if (uatype.find('Firefox/3') != -1):&lt;br /&gt;timeout = 500&lt;br /&gt;maxsize = 25&lt;br /&gt;elif (uatype.find('Chrome/3') != -1):&lt;br /&gt;timeout = 200&lt;br /&gt;maxsize = 100&lt;br /&gt;elif (uatype.find('MSIE') != -1):&lt;br /&gt;maxsize = 5&lt;br /&gt;timeout = 1000&lt;br /&gt;else:&lt;br /&gt;return&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;While I knew that Chrome's JavaScript engine is fast, I didn't expect it to be that dominant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-4329641423541851521?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/4329641423541851521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/chemoinformatics-in-browser-chrome.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/4329641423541851521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/4329641423541851521'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/chemoinformatics-in-browser-chrome.html' title='Chemoinformatics in the browser: Chrome finishes first'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8333362953216176367.post-5108763976342942626</id><published>2010-02-08T14:21:00.016+01:00</published><updated>2010-02-09T09:30:26.739+01:00</updated><title type='text'>Browsers of the world: Map! Reduce! Map! Reduce!</title><content type='html'>This &lt;a href="http://www.igvita.com/2009/03/03/collaborative-map-reduce-in-the-browser/"&gt;article&lt;/a&gt; about the idea of collaborative map/reduce in the browser and this &lt;a href="http://depth-first.com/articles/2008/07/15/javascript-for-cheminformatics"&gt;one&lt;/a&gt; on Depth-First gave me the idea to try something other than distributed word counting: distributed substructure matching.&lt;br /&gt;&lt;br /&gt;The server was quickly written in Python, the backend in this case is Postgresql with a table holding the structures as V2000 molfiles in plain text format. No magic so far.&lt;br /&gt;&lt;br /&gt;Here's the &lt;a href="http://gist.github.com/298151"&gt;code&lt;/a&gt; of the server.&lt;br /&gt;&lt;br /&gt;More interesting might be, how the substructure matching itself is done with 100% JavaScript. Thanks to &lt;a href="http://www.chemene.com:8080/CCD/jsdraw/"&gt;JSDraw&lt;/a&gt; a pure JavaScript structure editor, which on closer inspection has some more interesting tricks up it's sleeve, notably a substructure matching capability, this is doable now.&lt;br /&gt;&lt;br /&gt;The server schedules a job of &lt;span style="font-family:times new roman;"&gt;maxsize&lt;/span&gt; random molecules from the database and constructs a page containing those molecules as molfiles. After the page has completely loaded in the browser, the matching is done and the page is posted back to the server which parses the result. Once manually started by opening http://:8080/get, the pages keep reloading automatically by means of a &lt;span style="font-family:times new roman;"&gt;meta http-equiv="refresh"&lt;/span&gt; in the result page.&lt;br /&gt;&lt;br /&gt;Of course, the server is very basic.  It notably lacks keeping track of the results and housekeeping to restart broken jobs and uses a hardcoded substructure as search argument.&lt;br /&gt;&lt;br /&gt;But it can be done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8333362953216176367-5108763976342942626?l=theplateisbad.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theplateisbad.blogspot.com/feeds/5108763976342942626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/this-article-about-idea-of.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5108763976342942626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8333362953216176367/posts/default/5108763976342942626'/><link rel='alternate' type='text/html' href='http://theplateisbad.blogspot.com/2010/02/this-article-about-idea-of.html' title='Browsers of the world: Map! Reduce! Map! Reduce!'/><author><name>ergo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
