10. EPICS AreaDetector查看器¶
EPICS AreaDetector系统在戴蒙德公司广泛用于诊断相机和实验X射线探测器。GDA插件 uk.ac.gda.epics.adviewer
提供用于在RCP GUI中可视化此类系统的代码。
ADViewer提供3个视图:
- MJPegView -要显示来自MJPEG插件的流,
- HistogramView -对于来自统计插件的数据的显示,
- TwoDArrayView -用于将数组插件PV的内容显示为2D图像
因为来自MJPEG视图的图像通常是相机图像的8位表示,所以通常使用PROC插件来选择相机图像中要用8位刻度表示的值的范围。
范围由2个数字组成:
图像中要表示为0的值
图像中要表示为255的值。
所有其他值都会相应缩放。
(A)和(B)的值可以由用户根据相机图像的直方图的显示来控制,或者从相同的数据自动控制。在自动模式下,(A)和(B)的值被选择为5%和95%的百分位值。
在探测器图像较大的情况下,简单地从IOC的阵列插件拉取数据可能会很慢。在这种情况下,用户可能更喜欢改为选择相机图像的感兴趣区域。ADViewer通过自动启用ROI插件使这一点变得简单。
EPICS AreaDetector插件彼此独立工作,可以在运行时一起配置。ADViewer假定存在一组特定的插件,并以某种方式连接。这如下图所示
10.1. 当插件符合DLS AreaDetector插件标准时,如何将ADViewer视图添加到GUI¶
如果ADViewer视图访问的EPICS区域检测器插件的PV遵循以下约定:
ADBase PV = <Prefix>CAM:*
Array Plugin PV = <Prefix>ARR:*
ROI Plugin PV = <Prefix>ROI:*
MPG Plugin PV = <Prefix>MJPG:*
MPG's PROC Plugin PV = <Prefix>PROC:*
STAT Plugin PV = <Prefix>STAT:*
然后,只需添加代码调用命令org.eclipse.ui.views.showView,参数org.eclipse.ui.views.showView.viewId设置为uk.ac.gda.epics.adviewer.mpegview、uk.ac.gda.epics.adviewer.histogramview或uk.ac.gda.epics.adviewer.twodArrayView和参数org.eclipse.ui.views.showView.ond<Label>的值用于命名视图的实例。
将以下代码片断添加到plugin.xml文件以便于从菜单系统访问视图是正常的:
<menuContribution
allPopups="false"
locationURI="menu:window?after=showView">
<menu
label="Area Detectors">
<command
commandId="org.eclipse.ui.views.showView"
label="Pilatus4M"
style="push">
<parameter
name="org.eclipse.ui.views.showView.viewId"
value="uk.ac.gda.epics.adviewer.mpegview">
</parameter>
<parameter
name="org.eclipse.ui.views.showView.secondaryId"
value="pv//Pilatus4M//BLXXI-EA-DET-02@">
</parameter>
</command>
</menu>
</menuContribution>
在添加菜单上方的代码片断中,“区域检测器”将被添加到窗口菜单中。此新菜单将有一个名为“Pilatus4M”的项目,它将打开连接到PV“BLXXI-EA-DET-02:*”的MPEG查看器。
10.2. 当插件不符合DLS AreaDetector插件标准时,如何将ADViewer视图添加到GUI¶
如果一个或多个插件后缀与上面列出的约定不匹配,那么您需要做两件事。首先注册一个支持接口uk.ac.gda.epics.adviewer.ADPVSuffiies的服务;一种简单的方法是使用uk.ac.gda.epics.adviewer.SimpleADPVSuffix并覆盖它的一个或多个后缀属性。这在下面的示例中完成,其中MPG插件PV后缀设置为FFMPEG:
<bean class="gda.rcp.util.OSGIServiceRegister">
<property name="class" value="uk.ac.gda.epics.adviewer.ADPVSuffixes" />
<property name="service">
<bean class="uk.ac.gda.epics.adviewer.SimpleADPVSuffixes">
<property name="mpgSuffix" value="FFMPEG:" />
</bean>
</property>
<property name="properties">
<bean class="uk.ac.gda.util.dictionary.MapBasedDictionary">
<property name="map">
<map>
<entry key="SERVICE_NAME" value="diagnosticCameraType" />
</map>
</property>
</bean>
</property>
</bean>
其次,在声明菜单组件时,您需要将新服务的名称附加到辅助ID,并使用‘/’分开:
<menuContribution
allPopups="false"
locationURI="menu:window?after=showView">
<menu
label="Area Detectors">
<command
commandId="org.eclipse.ui.views.showView"
label="Pilatus4M"
style="push">
<parameter
name="org.eclipse.ui.views.showView.viewId"
value="uk.ac.gda.epics.adviewer.mpegview">
</parameter>
<parameter
name="org.eclipse.ui.views.showView.secondaryId"
value="pv//Pilatus4M//BLXXI-EA-DET-02@/diagnosticCameraType">
</parameter>
</command>
</menu>
</menuContribution>
10.3. 如何通过定义特定于检测器的ADController将ADViewer视图添加到GUI¶
如果ADViewer视图访问的EPICS区域检测器插件的PV不遵循上面的约定,那么您需要告诉系统PV。目前,这是通过提供访问PV的类的实例来实现的。此类的类型为uk.ac.gda.epics.adviewer.ADController。视图使用用于打开视图的辅助ID中指定的名称通过OSGi服务访问实例。使用名为的文件中的Spring Config声明完成实例和注册 property
.
下面是一个Spring Config文件示例,其中声明了ADController实例及其依赖的引用bean。使用OSGIServiceRegister将导致实例注册为类型为uk.ac.gda.epics.adviewer.ADController的OSGI服务,并将属性‘service_name’设置为‘d1’。::
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:corba="http://www.diamond.ac.uk/schema/gda/corba"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.diamond.ac.uk/schema/gda/corba http://www.diamond.ac.uk/schema/gda/corba/gda-corba-1.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="d1_cam_base" class="gda.spring.V17ADBaseFactoryBean">
<property name="prefix" value="BL13I-DI-PHDGN-01:CAM:" />
</bean>
<bean id="d1_arr" class="gda.spring.V17NDArrayFactoryBean">
<property name="prefix" value="BL13I-DI-PHDGN-01:ARR:" />
</bean>
<bean id="d1_stat" class="gda.spring.V17NDStatsFactoryBean">
<property name="prefix" value="BL13I-DI-PHDGN-01:STAT:" />
</bean>
<bean id="d1_proc" class="gda.spring.V17NDProcessFactoryBean">
<property name="prefix" value="BL13I-DI-PHDGN-01:PROC:" />
</bean>
<bean id="d1_roi" class="gda.spring.V17NDROIFactoryBean">
<property name="prefix" value="BL13I-DI-PHDGN-01:ROI:" />
</bean>
<bean id="d1_ffmpeg" class="gda.spring.V17FfmpegStreamFactoryBean">
<property name="prefix" value="BL13I-DI-PHDGN-01:FFMPEG:" />
</bean>
<bean id="d1ADController"
class="uk.ac.gda.epics.adviewer.ADControllerImpl">
<property name="serviceName" value="d1"/>
<property name="imageNDStats" ref="d1_stat" />
<property name="liveViewNDProc" ref="d1_proc" />
<property name="imageNDArray" ref="d1_arr" />
<property name="detectorName" value="d1" />
<property name="adBase" ref="d1_cam_base" />
<property name="ffmpegStream" ref="d1_ffmpeg" />
<property name="imageNDROI" ref="d1_roi"/>
</bean>
<bean id="d1dictionary" class="uk.ac.gda.util.dictionary.MapBasedDictionary">
<property name="map">
<map>
<entry key="SERVICE_NAME" value="d1" />
</map>
</property>
</bean>
<bean class="gda.rcp.util.OSGIServiceRegister">
<property name="class" value="uk.ac.gda.epics.adviewer.ADController" />
<property name="service" ref="d1ADController" />
<property name="properties" ref="d1dictionary" />
</bean>
</beans>
10.4. 使用gda.rcp.views.OpenViewListBoxComposite¶
向用户提供AD查看器视图列表的一种简单方法是,将OpenViewListBoxComposite与gda.rcp.views.OpenViewOptionImpl实例中描述的视图一起使用,并将SecudaryId属性设置为实现ADController或uk.ac.gda.epics.adviewer.views.ADOpenViewOption的OSGi服务的名称(如果插件有公共的PVPrefix:
<bean class="gda.rcp.views.OpenViewListBoxCompositeFactory">
<property name="label" value="Cameras"></property>
<property name="tooltipText"
value="Open the live view for the selected camera"></property>
<property name="options">
<list>
<bean class="gda.rcp.views.OpenViewOptionImpl">
<constructor-arg value="Select a camera" />
<constructor-arg value="" />
<constructor-arg value="" />
</bean>
<bean class="uk.ac.gda.epics.adviewer.views.ADOpenViewOption">
<constructor-arg value="d5" />
<constructor-arg value="d5" />
<constructor-arg value="MPEG"/>
<constructor-arg value="BL13J-DI-PHDGN-05:"/>
<constructor-arg value="diagnosticCameraType"/>
</bean>
</list>
</property>
</bean>