• areadetector ADURL模块应用在面探测控制的初步应用


    本章中讨论了使用ADURL控制面探测器Lambda的过程:

    ADURL的使用请见:

    EPICS -- areaDetector URL驱动程序-CSDN博客

    需要启动一个ADURL的IOC程序,并且设置相关的插件中参数的值:

    1. # st.cm
    2. < envPaths
    3. < st_base.cmd
    4. dbpf 13URL1:cam1:URL1 "/home/xspadmin/data/data_00000_raw/data_00000_raw_000000.tif"
    5. dbpf 13URL1:image1:EnableCallbacks "1"
    6. dbpf 13URL1:Pva1:EnableCallbacks "1"
    7. dbpf 13URL1:image1:BlockingCallbacks "1"
    8. dbpf 13URL1:Pva1:BlockingCallbacks "1"
    9. dbpf 13URL1:TIFF1:EnableCallbacks "1"
    10. dbpf 13URL1:TIFF1:BlockingCallbacks "1"
    11. dbpf 13URL1:cam1:ImageMode "Single"

    以下是这款面探测器的介绍:

    技术信息:Lambda是一个55um像素大小并且具有高帧率功能的单光子计数X射线探测器。一个Si 250K系统的技术规格如下表所示:

    模块数目1个模块带有1个连接了4个读出芯片的传感器
    传感器Si二极管阵列
    量子效率95%@8KeV, 70%@12KeV,10%@25KeV
    读出芯片Medipix3RXv2
    像素尺寸55 X 55 um^2
    传感器尺寸28.4 X 28.4 mm^2
    格式512 X 512 pixels(262144)
    动态范围最大24位(取决于读出模式)
    每个像素计数率限制

    200000个/像素/s(不带计数率校准)

    800000个/像素/s(如果计数率校准测量和使用)

    能量范围6keV ~ 20kev
    能量分辨率2keV
    最大帧率

    2000Hz@12-bit模式

    4000Hz@6-bit模式

    24000Hz@1-bit模式

    读出时间

    12-bit, 6-bit, 1-bit模式,无读出时间

    24-bit模式,1ms

    点扩散函数1像素FWHM
    数据格式Hdf5(Nexus标准)
    外部触发/门控3.3V
    软件接口基于C++的硬件库,python包
    冷却气冷,水冷
    尺寸150.5mm长,85mm宽和40mm长
    重量1.2kg
    过压类别0
    污染等级II

    对厂家提供探测器操作的Python代码进行封装,编写一个采集保存的py文件:

    1. import xspcontrol as xc
    2. import pyxsp as px
    3. s = xc.System('/opt/xsp/config/system.yml')
    4. d = s.open_detector('lambda')
    5. r = s.open_receiver('lambda/1')
    6. d.number_of_frames = 1
    7. d.shutter_time = 1000.0
    8. d.bit_depth = px.BitDepth.DEPTH_12
    9. w = xc.Writer()
    10. w.save_to_file = True
    11. w.save_mode = xc.SaveMode.OVERWRITE
    12. w.save_directory = '/home/xspadmin/data'
    13. w.save_file_prefix = 'data'
    14. s.set_writer('lambda/1', w)
    15. while not r.ready:
    16. time.sleep(1)
    17. s.start_acquisition()
    18. del r
    19. del d
    20. del w
    21. del s

    由于探测器的数据文件格式为nexus,而ADURL模块不能读取这个格式的文件,需要进行格式类型的转换,厂家也提供了将nexus格式转为tif格式的python程序ConvertNxsToTIFF.py,转换后的文件格式是ADURL模块可以读取的;编写一个bash脚本execute.sh,将采集和转换放在一个脚本中,并且触发ADURL模块程序进行数据读取:

    1. #!/bin/bash
    2. # 删除指定路径下所有文件,此路径提供给探测器保存数据使用
    3. rm -rf /home/xspadmin/data/*
    4. # 触发探测器采集,并且保存数据到指定路径
    5. python /home/xspadmin/command/collect.py
    6. # 把nxs文件转成tif文件,ADURL模块才能读取
    7. python /home/xspadmin/NxsToTiff_Scripts/ConvertNxsToTIFF.py --r /home/xspadmin/data/data_00000.nxs
    8. # 触发ADURL模块读取数据
    9. caput 13URL1:cam1:Acquire 1

    编写一个IOC程序来执行以上的bash脚本,在这个IOC程序中使用了一个sub记录,此记录执行时可以调用系统命令来执行这个程序脚本。

    以下是这个C程序:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. int mySubDebug = 0;
    9. static char cmdstr[100];
    10. static long mySubInit(struct subRecord *precord)
    11. {
    12. if (mySubDebug)
    13. {
    14. printf("Record %s called mySubInit(%p)\n", precord->name, (void *)precord);
    15. }
    16. printf("subInit was called\n");
    17. return 0;
    18. }
    19. static long mySubProcess(struct subRecord * precord)
    20. {
    21. if(mySubDebug)
    22. {
    23. printf("Record %s called mySubProcess(%p)\n", precord->name,(void *)precord);
    24. }
    25. precord->val++;
    26. sprintf(cmdstr, "%s", precord->desc);
    27. printf("execute command: %s\n", cmdstr);
    28. system(cmdstr);
    29. return 0;
    30. }
    31. epicsExportAddress(int, mySubDebug);
    32. epicsRegisterFunction(mySubInit);
    33. epicsRegisterFunction(mySubProcess);

    对应的db文件如下:

    1. record(sub, "$(P)$(R)ExecuteLambda")
    2. {
    3. field(SNAM,"mySubProcess")
    4. field(DESC, "execute.sh")
    5. }

    对应的启动文件为:

    1. #!../../bin/linux-x86_64/lambda
    2. #- You may have to change lambda to something else
    3. #- everywhere it appears in this file
    4. < envPaths
    5. cd "${TOP}"
    6. ## Register all support components
    7. dbLoadDatabase "dbd/lambda.dbd"
    8. lambda_registerRecordDeviceDriver pdbbase
    9. ## Load record instances
    10. dbLoadRecords("db/lambda.db","P=13URL1:,R=cam1:")
    11. cd "${TOP}/iocBoot/${IOC}"
    12. iocInit

    编译以上程序,并且启动以上IOC:

    1. epics> dbl
    2. 13URL1:cam1:ExecuteLambda

    执行通道访问命令运行一次sub记录:

     xspadmin@xspserver:/usr/local/EPICS/lambda/iocBoot/ioclambda$ caput 13URL1:cam1:ExecuteLambda.PROC 1

    如果设置了ImageJ插件中数据的访问通道:

    在ADURL读取了数据后,将实时显示这个数据:

  • 相关阅读:
    leetcode 558 设计内存文件系统
    springboot+音乐播放小程序 毕业设计-附源码191730
    QT对象树机制
    【谷粒商城 - k8s、devOps专栏】
    服装软件只有实现信息交互的自然流畅,才能称之为“融合”。
    毕业3年...设计行业一事无成,北漂闯荡转行成功
    解决linux 中IDEA/pycharm/webStorm系列软件,中文输入法一直在左下角,[软件源Release” 没有 Release 文件],docker安装失败
    “当下的力量”9月读书笔记
    ArcGIS软件制作双变量等值区域地图(Bivariate Choropleth Maps)
    猿创征文|【FreeSwitch开发实践】使用sipp对FreeSwitch进行压力测试
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/134436242