简单访问 NMR 图谱
到目前为止,我们所展示的示例肯定不是非常有用。在 Mnova 中编写脚本的好处在于,它可用于操作 Mnova 中的对象(如波谱、分子、图片等)并自动执行重复性任务。本节将介绍如何在脚本框架内访问 NMR 图谱。
请看以下代码片段:
/*globals Application, File, TextStream*/
/*jslint indent:4, plusplus: true*/
function dumpSpectrum() {
"use strict";
//获取活动频谱
var d、dumpStream、colCount、rowCount、r、c、
spec = Application.nmr.activeSpectrum()、
dumpFile = new File("C:/mnova/dump.txt");
//函数 isValid 通知所获得的频谱是否正确
if (spec.isValid()) {
if (dumpFile.open(File.WriteOnly)) {
dumpStream = new TextStream(dumpFile);
try {
//转储频谱信息
dumpStream.writeln("Solvent:\t", spec.solvent);
//转储每个维度的信息
for (d = 1; d <= spec.dimCount; d++) {
dumpStream.writeln("Dimension:\t", d);
dumpStream.writeln("Frequency:\t", spec.frequency());
dumpStream.writeln("Lowest Frequency:\t", spec.hz());
dumpStream.writeln("Nucleus:\t", spec.nucleus(d));
dumpStream.writeln("Spectral Size:\t", spec.count(d));
}
//转储波谱点的值
if (spec.dimCount === 1) {
rowCount = spec.count();
for (r = 0; r < rowCount; r++) {
dumpStream.writeln(spec.real(r), "\t", spec.imag(r));
}
} else if (spec.dimCount === 2) {
colCount = spec.count(1);
rowCount = spec.count(2);
for (r = 0; r < rowCount; r++) {
for (c = 0; c < colCount; c++) {
dumpStream.write(spec.real(r,c));
if (c < colCount - 1) {
dumpStream.write("\t");
}
}
dumpStream.writeln();
}
}
} finally {
dumpFile.close();
}
}
}
}
首先要注意的是nmr对象。该对象允许访问 NMR 插件框架,因此可以访问 Mnova 中的 NMR 波谱。 例如,通过spec = Application.nmr.activeSpectrum()function 可以选择 Mnova 中的当前有效波谱。从这一点,您可以读取 NMR 图谱的相关信息,例如点数、谱宽等。
现在我们来看一个更全面的示例,逐步说明如何访问 Mnova 页面中的所有对象。
访问多个对象:布局脚本
作为一个示例,我们将创建一个脚本,用于组织页面中的不同对象。出于显而易见的原因,这个脚本将被称为布局脚本。
首先,打开一个波谱、一个分子和一张图片(例如,可以是贵公司的徽标)。 下图显示了本示例的初始条件:

这里的目标是创建一个脚本,将这 3 个对象排列在一起,使图片位于页面左侧,而波谱和分子则移到图片旁边。
// <图形用户界面 menuname="布局 "shortcut="Ctrl+2" tooltip="Layout" />
function layout() {
var i, item, width, height、
w = mainWindow.activeWindow()、
p = w.curPage()、
n = p.itemCount();
for(i = 0; i < n; i++) {
item = p.item(i);
width = item.width;
height = item.height;
switch(item.name) {
case "NMR Spectrum":
item.left = p.left + 50;
item.right = p.right - 10;
item.top = p.top + 20;
item.bottom = p.bottom;
断开;
case "分子":
item.left = p.left + 50;
item.right = item.left + width;
item.top = p.top;
item.bottom = p.top + height;
断开;
case "图像":
item.left = p.left;
item.right = item.left + width;
item.top = p.top;
item.bottom = item.top + height;
断开;
}
}
w.update();
}
Mnova 中的每个对象都包含在页面中,而页面又包含在文档中。因此,我们首先要访问的是文档。这可以在这一行中完成:
w = mainWindow.activeWindow()、
基本上,我们通过 应用程序对象访问文档窗口。
有了文档后,我们就可以通过 Page 对象轻松访问当前活动页面,如下所示:
p = w.curPage()、
现在,我们可以浏览该页面中包含的所有对象了。对于每个对象,我们都会在切换命令中检查其确切类型,然后相应地调整对象的位置。这就是本例的结果。

调整布局脚本
现在我们将修改布局脚本,以实现以下两个目标:
1.从文件中加载图像
2.执行脚本时在页面上自动显示图谱标题
首先,我们将演示如何从磁盘加载图片。为此,您必须使用序列化对象。例如,假设图片位于c:/mnova/logo.png,则可以使用以下代码:
serialization.open("c:/mnova/logo.png");
接下来是如何在页面上显示一些参数(波谱宽度、溶剂、核)。为此,有必要创建一个专门的 NMR 波谱对象,而不是使用每个项目对象中的默认属性。请参见以下代码片段:
"<b>频率(兆赫):</b> {0}<br/>\
<b>波谱宽度(赫兹):</b> {1}<br/>\
<b>溶剂:</b> {2}<br/>\
<b>Nucleus: </b> {3}".format(specItem.frequency().toFixed(4)、
specItem.scaleWidth().toFixed(2)、
specItem.solvent、
specItem.nucleus())、
true
);
将脚本保存到 Mnova 脚本文件夹后(请注意,脚本文件必须与要调用的函数名称相同,在本例中,脚本名称必须为 "layout2.qs"),然后重新启动程序,就可以按照 "选项/自定义 "菜单将其添加到工具栏中。

这将显示 "自定义工具栏 "对话框。然后,点击 "New Tab(新建标签)"按钮创建一个新工具栏,并点击 "Rename(重命名)"按钮更改其名称(脚本工具栏)。

接着,在 "命令 "菜单(位于窗口左侧)中找到 "脚本 "图标(布局),点击 "添加 "按钮,将 "布局 "脚本添加到脚本工具栏的 "新组 "中。

最后,点击 "确定",你就可以在 "新工具栏 "中看到 "布局 "图标了。

您还可以在 "自定义上下文菜单 "对话框中按照类似步骤在任何现有的上下文菜单中引入脚本。
自定义 NMR 处理
通过脚本处理 NMR 图谱有两种方法:
1.通过处理模板
2.使用处理界面
1 处理模板
Mnova 可通过脚本使用处理模板(使用全处理功能生成)处理一维或二维 NMR 图谱。正如您在下面的示例中看到的,您可以(通过简单的脚本)处理任何类型的频谱(1H、13C、1D 或 2D)。您只需为每个实验创建处理模板即可。在下面的示例中,我们创建了 3 个不同的处理模板,一个用于处理 1H-NMR 图谱 (1H.mnp),第二个用于处理 13C-NMR 图谱 (13C.mnp),最后一个用于处理 COSY 图谱 (COSY.mnp)。正如您在脚本中看到的,这三个模板都保存在 c:/mnova/(当然您也可以更改路径和模板文件的名称)。
**globals Application*/
/*缩进:4*/
函数 procTemplate() {
"use strict";
var procFileName、
spec = Application.nmr.activeSpectrum();
if (!spec.isValid()) {
返回;
}
如果(spec.dimCount === 1){
if (spec.nucleus() === "1H"){
procFileName = "c:/mnova/1H.mnp";
} else if (spec.nucleus() === "13C"){
procFileName = "c:/mnova/13C.mnp";
}
} else if (spec.dimCount === 2) {
if (spec.nucleus(1) === "1H" && spec.nucleus(2) === "1H"){
procFileName = "c:/mnova/COSY.mnp";
}
}
if (procFileName) {
Application.nmr.processSpectrum(spec, procFileName);
}
}
2 处理界面
处理界面可以更改或应用 Mnova 中的任何处理操作。
例如,让我们制作一个简单的脚本,设置指数加权函数:
/*globals Application*/
/*jslint 缩进:4*/
函数 myProcess() {
"严格使用";
var spec = Application.nmr.activeSpectrum()、
p = spec.proc;
p.setParameter("Apodization[1].Apply", true);
p.setParameter("Apodization[1].Exp.Apply", true);
p.setParameter("Apodization[1].Exp.Value", 0.5);
spec.process(p);
Application.mainWindow.activeDocument.update();
}
创建表示当前活动频谱的频谱对象后,我们将创建一个处理变量 (p),表示对该特定频谱的处理操作。创建新对象后,我们可以使用 getParameter 和 setParameter 函数读取或更改其值。例如,在本示例中,我们首先将 "Apodization "属性设置为 true(否则将不应用 "Apodization"),然后将指数函数设置为 true,再将线展宽设置为 0.5 Hz。
最后,我们将处理对象赋值给频谱对象(p =spec.proc;),并调用spec.process(); 实际应用所有处理操作。
注:有关脚本文档的详细信息,请查看 Mnova 安装文件夹,地址为
C:\Program Files\Mestrelab Research S.L\MestReNova\documents\scripts
|