将多个 STEM 信号读入多个数据立方体

Reading in multiple STEM signals into multiple datacubes

我编写了一个通过焦点的 STEM 采集脚本,该脚本使用 DSAcquire 函数读取图像,其中我使用 DSAcquireData(img, signalindex, etc.).

指定要读取的信号

上面的好处是我可以在图像不出现在屏幕上的情况下读取图像,将其复制到数据立方体中,然后获取系列中的下一个,等等。

如果我想使用两个信号而不是一个(例如 HAADF 和 BF),看起来唯一的方法是在设置 digiscan 参数后使用 DSStartAcquisition

我应该如何将信号复制到两个预分配的图像堆栈(stack1stack2)?最好不要让数十张图片把屏幕弄得乱七八糟(但最好有一定程度的进步?)

这样做的一种方法 - 通过迭代 x 个单独的采集是 F1 帮助示例的直接扩展:

// Acquire 2 signals simultaneously, e.g. HAADF and BF detector


number paramID
number width    = 512 // pixel
number height   = 512 // pixel
number rotation = 0   // degree
number pixelTime= 2   // microseconds
number lSynch   = 1   // activated
paramID = DSCreateParameters( width, height, rotation, pixelTime, lSynch )

number signalIndex, dataType, selected, imageID
signalIndex = 0
dataType    = 2 // 2 byte data
selected    = 1 // acquire this signal

image img1 := IntegerImage( "Signal 1", dataType, 0, width, height )
img1.ShowImage()
imageID     = img1.ImageGetID() // use displayed image
DSSetParametersSignal( paramID, signalIndex, dataType, selected, imageID )

signalIndex = 1
dataType    = 2 // 2 byte data
selected    = 1 // acquire this signal

image img2 := IntegerImage( "Signal 1", dataType, 0, width, height )
img2.Showimage()
imageID     = img2.ImageGetID() // use displayed image
DSSetParametersSignal( paramID, signalIndex, dataType, selected, imageID )

number continuous  = 0 // 0 = single frame, 1 = continuous
number synchronous = 1 // 0 = return immediately, 1 = return when finished

// Create stack to copy data to
number nplanes = 10
image stack1 := img1.ImageClone()
stack1.ImageResize(3,width,height,nplanes)
stack1.SetName("Signal 1 (stack)")
stack1.ShowImage()

image stack2 := img2.ImageClone()
stack2.ImageResize(3,width,height,nplanes)
stack2.SetName("Signal 2 (stack)")
stack2.ShowImage()

//Quickly arrange image
EGUPerformActionWithAllShownImages("arrange")

// Iterated acquisition
for( number i=0; i<nPlanes; i++ )
{
    DSStartAcquisition( paramID, continuous, synchronous )
    // Copy data
    stack1.slice2(0,0,i, 0,width,1, 1,height,1) = img1
    stack2.slice2(0,0,i, 0,width,1, 1,height,1) = img2
}
DSDeleteParameters( paramID ) // remove parameters from memory

但是,这将在每一帧重新开始新的 Digiscan 采集。您可能更喜欢通过连续采集和图像侦听器来执行此操作。

为此,您很可能会按照 F1 帮助中的说明连接 image-listener:

Digiscan 采集 - 根据速度 - 将每帧更新图像数次,因此您需要检查它是否 end-of-frame。

执行此操作的一种方法是使用 data_value_changed 事件,然后检查图像中的最后一个像素是否已更改值。另一种选择是使用 tags_changed 事件,因为显然采集图像的标签每帧更新一次。不过,这两种选择都有一些潜在的问题。

另请参阅最近关于此主题的非常相关的问题: