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

问题描述

我编写了一个通过焦点的stem采集脚本,该脚本使用DSAcquire函数读取图像,在其中指定要使用DSAcquireData(img,signalindex,etc.)读取的信号。

上述优点是我可以读入图像而不将其显示在屏幕上,将其复制到数据立方体中,然后获取系列中的下一个图像,等等。

如果我要使用两个信号而不是一个(例如HAADF和BF),似乎唯一的方法是在设置digiscan参数后使用DsstartAcquisition

我应该如何将信号复制到两个预先分配的图像堆栈(stack1stack2)中?最好不要有数十个图像使屏幕混乱(但理想情况下有一定程度的进展吗?)

解决方法

做到这一点的一种方法-通过迭代x次单个获取来直接扩展F1帮助示例:

enter image description here

// 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",width,height )
img1.ShowImage()
imageID     = img1.ImageGetID() // use displayed image
DSSetParametersSignal( paramID,signalIndex,imageID )

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

image img2 := IntegerImage( "Signal 1",height )
img2.Showimage()
imageID     = img2.ImageGetID() // use displayed image
DSSetParametersSignal( paramID,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,nplanes)
stack1.SetName("Signal 1 (stack)")
stack1.ShowImage()

image stack2 := img2.ImageClone()
stack2.ImageResize(3,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,i,1,1) = img1
    stack2.slice2(0,1) = img2
}
DSDeleteParameters( paramID ) // remove parameters from memory

但是,这将在每帧重新开始新的Digiscan采集。您可能希望通过连续采集和图像侦听器来完成此操作。

为此,您很可能按照F1帮助中的说明连接图像侦听器: enter image description here

根据速度的不同,Digiscan采集将每帧更新几次图像,因此您需要检查一下是否是帧结束。

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

另请参阅与此主题相关的最新问题:Fastest way to see which pixel has changed when using a listener