历经磨难,Cytoscape终于迎来了3.0的发布。API完全不兼容了,各种插件必须要升级才能在3.0中运行。
追随乔大爷的脚步,Cytoscape 3.0的插件(plug-in)改名叫应用(app),还开了一个App Store。看看Cytoscape的红火,各行各业都是打造产业链和共赢的生态环境才能获得大的成功,互联网如此,移动设备如此,生命科学也是如此。不仅仅是API的变动,开发方式也发生了巨大的改变。为了一定程度上的兼容性,Cytoscape 3.0中的应用分为两种:
- 简单应用(simple App):基本等同于以前2.X版本中的插件,开发方式基本一致;
- 套装应用(Bundle App):基于OGSi的应用,可以为其他应用提供API、不会出现库的版本冲突等。
先说说简单应用的开发,给个最简单的例子,例子来自Creating a Simple Cytoscape 3 App,稍作修改和说明。
这个简单应用有两个类:
- HideSingletonNodesApp:应用的入口,必须继承AbstractCySwingApp。
这个类的代码如下,保存到HideSingletonNodesApp.java文件:
import org.cytoscape.app.swing.AbstractCySwingApp;
import org.cytoscape.app.swing.CySwingAppAdapter;
public class HideSingletonNodesApp extends AbstractCySwingApp
{
public HideSingletonNodesApp(CySwingAppAdapter adapter)
{
super(adapter);
adapter.getCySwingApplication()
.addAction(new MenuAction(adapter));
}
}
- MenuAction类:在Cytoscape的Select菜单中加入菜单项,实现隐藏孤立点(跟其他所有点都不相连的点)功能:
这个类的代码如下,保存到MenuAction.java文件:
import java.awt.event.ActionEvent;
import org.cytoscape.app.CyAppAdapter;
import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.application.swing.AbstractCyAction;
import org.cytoscape.model.CyEdge;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode;
import org.cytoscape.view.model.CyNetworkView;
import org.cytoscape.view.presentation.property.BasicVisualLexicon;
public class MenuAction extends AbstractCyAction {
private final CyAppAdapter adapter;
public MenuAction(CyAppAdapter adapter) {
super("Hide unconnected nodes",
adapter.getCyApplicationManager(),
"network",
adapter.getCyNetworkViewManager());
this.adapter = adapter;
setPreferredMenu("Select");
}
public void actionPerformed(ActionEvent e) {
final CyApplicationManager manager = adapter.getCyApplicationManager();
final CyNetworkView networkView = manager.getCurrentNetworkView();
final CyNetwork network = networkView.getModel();
for (CyNode node : network.getNodeList()) {
if (network.getNeighborList(node, CyEdge.Type.ANY).isEmpty())
networkView.getNodeView(node).setVisualProperty(
BasicVisualLexicon.NODE_VISIBLE, false);
}
networkView.updateView();
}
}
这个简单应用的代码就是这样。接下来还需要一个文件描述应用的基本情况,供Cytoscape在加载应用时读取。这个文件是app-manifest:
1
2 3 4 5 |
Cytoscape
-
App
-
Version
:
0.1
Cytoscape - App - Name : HideSingletonNodesApp Cytoscape - App : HideSingletonNodesApp Cytoscape - App - Works - With : 3.0 Cytoscape - API - Compatibility : 3.0 |
第一行是应用的版本号,第二行是应用名称,第三行是应用入口类,接下来是应用运行的Cytoscape版本。Cytoscape网站上给出的教程中的文件到此就结束了。但这样得到的应用加载时会保存,提示缺少第5行这样的信息,即应用所兼容的API版本。
把上述三个文件放到同一个目录下,下载Cytoscape3-api.jar放到同一目录下,编译打包:
1
2 |
javac
-
cp
Cytoscape3
-
api
.
jar
*.
java
jar cfm HideSingletonNodesApp . jar app - manifest *. class |
在当前目录下得到的HideSingletonNodesApp.jar。到Cytoscape中,Apps -> App Manager -> Install from File .. ,安装这个Jar文件。安装后可以在Currently Installed中看到应用的基本信息,在Select菜单的最下面可以看到Hide unconnected nodes菜单项。
就现在Cytoscape的应用情况来看,大部分的应用按照Simple App的形式开发就足够了。但诸如MCODE之类准官方的应用都迁移到了套装应用的模式上,这是未来的趋势。但相互之间API的依赖,会不会陷入Linux库依赖一样的情况?毕竟,Cytoscape不是给计算机玩家用的,很多用户是生物医学的人,简单易用直观是才是王道。
迫于用户反馈,我们的插件也得升级了。ClusterViz发布三年,没发文章,倒是被人用在了一些大项目中,还发了NG之类的好文章;发了文章的一些东西反倒是没人用。这跟Journal of Statistical Software能成为影响因子最高的统计学期刊或许是一个道理:show me the codes!
注:原文地址:http://gossipcoder.com/?p=1376
参考链接:http://opentutorials.cgl.ucsf.edu/index.php/Tutorial:Creating_a_Simple_Cytoscape_3_App