10. EPICS AreaDetector查看器

../_images/epics_logo.png

EPICS

EPICS AreaDetector系统在戴蒙德公司广泛用于诊断相机和实验X射线探测器。GDA插件 uk.ac.gda.epics.adviewer 提供用于在RCP GUI中可视化此类系统的代码。

ADViewer提供3个视图:

  • MJPegView -要显示来自MJPEG插件的流,
    ../_images/I13PCOLiveView.png
  • HistogramView -对于来自统计插件的数据的显示,
    ../_images/PCOHistogramView.png
  • TwoDArrayView -用于将数组插件PV的内容显示为2D图像
    ../_images/PCOArrayView.png

因为来自MJPEG视图的图像通常是相机图像的8位表示,所以通常使用PROC插件来选择相机图像中要用8位刻度表示的值的范围。

范围由2个数字组成:

    1. 图像中要表示为0的值

    1. 图像中要表示为255的值。

所有其他值都会相应缩放。

(A)和(B)的值可以由用户根据相机图像的直方图的显示来控制,或者从相同的数据自动控制。在自动模式下,(A)和(B)的值被选择为5%和95%的百分位值。

在探测器图像较大的情况下,简单地从IOC的阵列插件拉取数据可能会很慢。在这种情况下,用户可能更喜欢改为选择相机图像的感兴趣区域。ADViewer通过自动启用ROI插件使这一点变得简单。

EPICS AreaDetector插件彼此独立工作,可以在运行时一起配置。ADViewer假定存在一组特定的插件,并以某种方式连接。这如下图所示

../_images/ADViewPlugins.png

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>