Fast building SMILES structure viewer with Dingo and WPF

Indigo is recently introduced as open-source chemoinformatics toolkit <1>, <2>.

Dingo is a molecule and reaction rendering library included in Indigo and with .NET C# wrapper to make it possible for me to build a WPF app with it. Dingo and WPF make things so simple.

Amazing feeling to stand on the giant’s shoulder. Not too much code pasted here

Compound class to transform SMILES to Bitmap objects with Dingo

    public class Compound
    {
        public String smi{ get; set;}
        public Compound(String smiles)
        {
            smi = smiles;
        }
        public BitmapSource bmp {
            get{
                return Smi2Bitmap(smi, 160, 160);
            }
        }
        public static BitmapSource loadBitmap(System.Drawing.Bitmap source)
        {
            return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(source.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        }
        public static BitmapSource Smi2Bitmap(String smi, int Width, int Height)
        {
            Dingo dg = new Dingo();
            dg.loadMolecule(smi);
            dg.setBackgroundColor(System.Drawing.Color.White);
            System.Drawing.Bitmap bmp = dg.renderToBitmap(Width, Height);
            return loadBitmap(bmp);
        }
    }

SMILES file reader

    public class SMIReader: System.Collections.IEnumerable
    {
        private StreamReader sr;
        public SMIReader(String path)
        {
            sr = new StreamReader(path);
        }
        public IEnumerator GetEnumerator()
        {
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                yield return new Compound(line.Split('\t')[0].Split(' ')[0]);
            }
        }
    }

XAML code of the listbox

Notes: To show as many structure pictures blocks on screen the WrapPanel is used as ItemsPanel. This depresses performance for large file that all SMILES are read in but lazy loaded in the default StackPanel mode.

            <ListBox Name="list1" Height="539" Width="790"
                     ItemTemplate="{StaticResource MolListboxTemplate}"
                     ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                     IsSynchronizedWithCurrentItem ="True">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>

Item template of the listbox to support structure images displaying

    <Window.Resources>
        <DataTemplate x:Key="MolListboxTemplate">
            <WrapPanel Margin="3">
                <StackPanel>
                    <Image Source="{Binding bmp}" Height="160" Width="160"></Image>
                    <TextBox Text="{Binding smi}" Width="160"></TextBox>
                </StackPanel>
            </WrapPanel>
        </DataTemplate>
    </Window.Resources>

Button event to trigger databinding

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
            ofd.Filter = "SMILES file(*.smi)|*.smi";
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                String path = ofd.FileName;
                textBlock1.Text = path;
                list1.ItemsSource = new nchem.SMIReader(path);
            }
        }

Done.

应对清华图书馆电子资源校外访问系统的BUG的办法

以前下载ACS文献的时候,遇到这个系统的javascript的BUG问题,研究了好久找到了对策:解决通过图书馆帐号下载ACS paper pdf的问题。归根结底是URL的处理问题。

ACM

最近下载ACM文献,又发现PDF下载不了。不过已经了解了电子资源校外访问控制系统的这类毛病,还是很快猜出了解决办法。

这个系统中,在ACM搜索后,paper详细信息页面的URL是这个样子的

http://infosource.lib.tsinghua.edu.cn:8080/~/WACS/acm.lib.tsinghua.edu.cn/acm/Detail.nsp?......

在点击PDF下载之后,就变成这个样子了

http://166.111.120.94/~/WACS/http://acm.lib.tsinghua.edu.cn/acm/ContentLoader.nsp?view=%2F1510000%2F1502661%2Fp47-vig.pdf

我猜以前 infosource.lib.tsinghua.edu.cn 的ip就是可爱的166.111段的这个IP,不过现在的确换掉了。以前的代码恐怕是直接用的IP而不是域名,后来疏于维护,于是就翘掉了。

所以解决的办法也挺简单,把166.111.120.94像下面这样换成域名就行了

http://infosource.lib.tsinghua.edu.cn:8080/~/WACS/http://acm.lib.tsinghua.edu.cn/acm/ContentLoader.nsp?view=%2F1510000%2F1502661%2Fp47-vig.pdf

ACS

这个系统访问ACS的最新故障是,点击ACS的链接啥也不出现。URL是这样的

http://infosource.lib.tsinghua.edu.cn:8080/~/WACS/pubs.acs.org/journals/query/subscriberSearch.jsp

解决的方法就是,不理丫的。直接去pub.acs.org去查,查到了,比如

http://pubs.acs.org/doi/abs/10.1021/ci900157k

拼接到这个系统的URL里

http://infosource.lib.tsinghua.edu.cn:8080/~/WACS/pubs.acs.org/doi/abs/10.1021/ci900157k

然后就好啦:D 然后该干嘛就干嘛

虽然这个系统主要都是自己人在用,但是还是希望做得好一点,不要搞得跟黑客入门小测验似的(虽然这也是鉴定校友身份的一个办法)。就算是我这个非成功不著名校友的一点点期望吧。

 

MOL Reader and SMILES Writer in Javascript

Yes, it is named by me as jsBabel. There’s too little functionality.

It is

  • Written by Javascript.
  • Implementation of span-tree generation and serialization.
  • Modeling chemical compound in js.
  • To help enhance the js molecule editor Chemhack jsmoleditor and Chemdoodle. They are excellent ideas but have no SMILES output function.
  • In beta and many known and unknown errors.
  • Going to be opensource if one or more folks is interested in it.
  • Free to be downloaded, modified, re-published now.

A nice week end.

用Microsoft BarCode Control 9.0控件显示条形码

条形码的编码等基本知识(百度百科)

Microsoft BarCode Control用在Access等开发环境中,可以进行数据绑定。绑定的目标属性是value。

Microsoft BarCode Control的value属性,是要编入条形码的信息字符串。

根据不同的编码规则,value要符合改规则规定的字符串形式,否则会显示一片空白。比如CODE 39编码,不能用小写字母;比如EAN-13编码,要用恰好13个数字,多了或者少了或者加入了字母,不是变白板就是变样(分割用的线没了)。

有的条码限制了大小尺寸,调也没用,比如EAN-13;有的可以调整。比如CODE 128

[微软] Microsoft BarCode Control的参考文档(CHM)下载

EMS单用的是CODE 39码。

Microsoft BarCode Control支持的编码方式包括

Style(样式) 0 - UPC-A 1 - UPC-E 2 - JAN-13 3 - JAN-8 4 - Casecode 5 - NW-7 6 - Code-39 7 - Code-128 8 - US Postnet 9 - US Postal FIM 10 - JP Post

伪命题: 中关村人平均寿命53岁

华西都市报原文,引用报道很多,引用其中一篇 IT精英猝死引热议 报告称中关村人平均寿命53岁

证明其伪命题如下:

  • 中关村的开发从1998年开始。引文 中关村历史回顾:从初创期到发展期
  • 这个行业初创,老年人不会多。且估计98年的时候,往多了算,主力的人员算作平均年龄40岁吧。
  • 这些人到现在平均年龄50岁。
  • 的确有一些人50岁左右就死了,他们就是华西都市报的采样数据。
  • 有没有活到60、70、80岁以上的人呢?肯定是有的,但是他们现在还没死。所以没有归纳到采样数据里。

哗众取宠。

村里的民工可以安心了。

 

SQL Server CLR的进程和线程

结论

  • SQL Server CLR是一个多线程运行的环境。
  • 静态变量等线程安全问题,在CLR环境中存在。

摘录《Professional SQL Server™ 2005 CLR Programming》

SQL Server 2005 hosts the CLR in a “sandbox”-like environment in-process to itself, as you can see Figure 1-2. When a user requests a SQL CLR object for the first time, SQL Server will load the .NET execution engine mscoree.dll (which is the CLR) into memory. 

实验

CLR代码

public partial class ProcessThread
{
    public static int static_i=0;

    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static SqlString PID()
    {
        return  Process.GetCurrentProcess().Id.ToString();
    }

    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static SqlString TID()
    {
        return AppDomain.GetCurrentThreadId().ToString()+ ":"+
            System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
    }

    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
    public static SqlString StaticI()
    {
        return (static_i++).ToString();
    }

};

安装CLR的SQL代码

CREATE ASSEMBLY sqlclr_test
FROM 'C:\SQLCLR\bin\Release\sqlclr.dll'
WITH permission_set = UNSAFE;
GO

create function fn_processid () returns nvarchar(max)
as external name sqlclr_test.ProcessThread.PID
GO
create function fn_threadid () returns nvarchar(max)
as external name sqlclr_test.ProcessThread.TID
GO
create function fn_statici () returns nvarchar(max)
as external name sqlclr_test.ProcessThread.StaticI
GO

测试用查询命令

select
    dbo.fn_processid() as [ProcessID],
    dbo.fn_threadid()  as [ThreadID],
    dbo.fn_statici()   as [StaticI]

返回结果

ProcessID ThreadID StaticI
1608 5820:4 11

系统进程截图 (Process Explorer) 

线程模型

现象 

  1. 每次执行查询命令,得到的ThreadID会发生变化,在SQL Server的进程包含的线程池中轮转。
  2. 每次执行查询命令,不论是否同一个线程,StaticI的值会增加。
  3. SQL Server的用户进程(登录),与所执行的线程编号几乎没有关系。

 

关于化学结构式web显示和输入

将化学结构式在网页上显示出来,是基于WEB的化合物注册系统(compound registry system)中必不可少的功能,也能用于化学品研发、销售企业的产品宣传网站。而要实现结构式检索,就要有结构式输入的功能。

我所知道的化学结构式web显示的方法,从技术手段上来说可以分为以下几种

  • 预生成图片。
  • 使用在线结构图生成服务。
  • 使用浏览器插件(java或activex)。
  • 基于Javascript和AJAX的方案。

预生成图片

在后台用工具将结构式信息都转换成图片格式(PNG, JPEG等),再将图片上传到网站服务器,用普通的图片显示方式显示出来。需要注意的就是一般的产品目录中,产品数量较大,是用数据库生成的列表,批量生成的图片,就需要用产品编号、CAS编号等相对固定的编码对应起来。

后台生成图片的工具很多,大部分化学信息学软件都可以做得到。但是为了方便批量操作,尽量选择有编程接口的软件,至少也要能够通过命令行调用的软件。

使用在线结构图生成服务

可以利用的服务,我在之前的这篇在线化学结构式图片生成服务中详细介绍过。前提基本都是要有化合物的SMILES编码信息。这样做的好处是,不用自己生成图片,不用占用自己网站的空间,甚至不用占用自己网站的带宽。同样潜在的问题是要依赖第三方服务的准确性、可靠性和稳定性。

使用浏览器插件

使用浏览器插件恐怕是最常见的解决方案。一般来说,这样的插件都需要用结构式的mol格式作为输入,mol格式可以从SDFile的连接表部分导出。关于mol 和SDFile格式请参考 Chemical table files。目前也只有使用插件,能够实现结构式的输入。

最常见的网页插件有

 

JMEhttp://www.molinspiration.com/jme/,java applet

我所见过的90%以上的在web中显示和输入结构式的浏览器插件,都是用JME来实现的。JME的作者没有声称过这个软件是免费的,非商业用户需要向他发一个邮件来索要。而实际上既然是java applet,直接下载下来用也很容易。而事实上大多数的人都是这么做的。

这个软件估计至少有10年历史了,作者是Peter Ertl


Jmolhttp://jmol.sourceforge.net/, java applet

没有用过。开源的项目,支持的格式非常多,不过还是不支持SMILES/InChI。

 

Chemdraw pluginhttp://www.cambridgesoft.com/software/details/?ds=2&dsv=93, activex

不是免费的,在工作中用到过。功能非常强大,结构式编辑功能与Chemdraw软件基本相当,远远超出其他插件。

 

Chemwriterhttp://metamolecular.com/chemwriter/, java applet

Chemwrite应用并不广泛,功能也不强大,只能说图片显示的质量要比JME好不少,进行了边缘平滑的处理。之所以要提到,是因为这个软件的作者是 Depth-first 这个化学信息学博客的作者Rich Apodaca,我在这里学到了很多有用的知识。

 

 

JChemPaint, http://apps.sourceforge.net/mediawiki/cdk/index.php?title=JChemPaint, java applet

基于CDK项目的一个衍生产品。

 

基于Javascript和AJAX的方案

不论java applet还是activex,都对客户端有所要求。java applet要求客户访问网站的时候,要安装java运行时环境;activex默认在浏览器中不能运行,要客户判断安装并执行,因为有臭名昭著的安全问题。而基于Javascript和AJAX的方案,能够解决这些问题,也符合Web2.0的趋势。

 

MX-GWThttp://chemhack.com/mx-gwt/, 纯javascript

这是国内的一位叫Duan Lian的同学的作品。是我知道的和见过的唯一的用纯粹的javascript实现的结构式显示和输入方案。这个软件实际上是把Rich Apodaca用java开发的一个轻量级的化学信息处理库,MX,通过Google的GWT编译成javascript,使之能在浏览器里运行。非常棒。

 

Molinspiration WebMEhttp://www.molinspiration.com/docu/webme/index.html, AJAX

是开发JME的公司Molinspiration最近开发的AJAX的方案,需要服务器的支持。如果愿意买这个软件的话,Molinspiration提供服务器端支持。对客户来说,仍然只要能支持js的浏览器就行了。

 

PubChem edithttp://pubchem.ncbi.nlm.nih.gov/edit/, AJAX

PubChem在线服务的结构式输入工具,可以拆出来用。而且PubChem也足够开放,提供了很详细的使用说明,包括如何把输入的结构传递到表单。在在线化学结构式图片生成服务提到过,这个编辑器背后隐藏着一个通过SMILES来显示结构式的接口。

 

 

活的数据,中国30年

非常值得看的一段视频,数据可视化演示得精彩。

讲演的大爷以前是研究社会发展的,研究的数据也与此有关。其中一共有三个片段分别提到了中国。对中国的发展历程,展示的很生动。

家庭人口和人均寿命

  • 纵坐标是平均寿命,横坐标是家庭人口(准确讲是“每个母亲的孩子数”)。
  • 总体来讲,是发展中国家(红点)家庭人口多,平均寿命低,发达国家相反。
  • 62年时,最左边的大红点是中国,下面的红点是印度。那个时候中国就比印度平均寿命高。
  • 随着时间变化,国家都在发展,大多数国家都移动到了“家庭人口少,平均寿命高”的位置。
  • 中国的发展速度,始终是领先于印度。
  • 中国在60年代有一次很诡异的平均寿命下降的动作,是那场天灾人祸。
  • 中国跑得快,肯定和计划生育相关。

婴儿的成活率

  • 世界各国的婴儿成活率(纵轴),与经济水品(横轴GDP)有明显的线性关系。
  • 中国(图中的大黄点),在时间上的变化很有趣。
  • 1978年之前的“毛时代”,中国的经济水品一直处于世界的末位,但是婴儿的成活率却是大大高于这条规律直线。这就是成就。很多人怀念、赞赏毛时代的体制,不全无道理。
  • 1978年之后的“邓时代”,中国的经济水平迅速攀升,但是婴儿成活率却没有提高。加迅速地回归到规律直线。
  • 简单的讲,改革开放后中国人生活水准的提高速度,与中国经济发展的速度不匹配。

收入分布

  • 红色是中国的收入分布;绿色是美国。
  • 在1972年,“根本没有交集”,美国最穷的人也比中国最富的人有钱。
  • 曲线的宽度是贫富差距。1972年中国贫富差距很小,美国很大。
  • 1999年,中国“像一个幽灵一样”,扑向美国。这段动画非常形象。
  • 但是1999年,中国的收入分布形状,很明显地展示了中国的贫富差距增大的趋势。
 

 

Mind Map of ITIL v3

The original content is created by the blog ITIL SERVICE MANAGEMENT on the post ITIL V3 Mind Map Download OCT 7, 2007. The author has moved the MindManager file to google pages and is downloadable following the post’s comments.

This MindManger has a filename extension of mmap. I imported it to the free mind map software FreeMind ( there’s a portable version at http://portableapps.com/node/6903) and FreeMind is so powerful to export the mindmap into a feature rich flash format. You can find it on my site, follow the link and enjoy.

http://charliezhu.com/itil/ITILV3.mmap48083.html

化学信息软件开发工具时间线

http://www.dalkescientific.com/writings/diary/archive/2008/09/20/euroqsar.html 

Next Page »

Random posts

  • 聚会照片
  • 有人扒我的网站
  • 我的1997和2007
  • MOL Reader and SMILES Writer in Javascript
  • 喜洋洋与灰太狼