An EPICS areaDetector driver for the Pilatus pixel array detectors from Dectris.
Additional information:
An EPICS areaDetector driver for the Pilatus pixel array detectors from Dectris.
Home Page: https://areadetector.github.io/areaDetector/ADPilatus/pilatusDoc.html
An EPICS areaDetector driver for the Pilatus pixel array detectors from Dectris.
Additional information:
I have two Pilatus detectors that, when run above a certain rate (I have been testing at 200Hz), seem to occasionally produce corrupt tiff files. The driver fails to read the file with:
2020/01/08 11:01:01.090 pilatusDetector::readTiff, file size incorrect =9906100, should be 9906116
and retries forever. It has to be Stopped to break it out, although I have seen this fail at least once and I had to restart the IOC.
I have added in some logic to only retry five times and then drop out and pass on an empty NDArray to try and figure out what is going on. I found that about 2% 0.2% of frames have this problem and that they are always 16 bytes smaller than expected. I think this change will be sufficient for the particular use case, but I wonder if there is a better solution to stop this from happening at all.
@MarkRivers is this something you have seen before? I think it is only since I updated to version R2-7, but it may just be that the beamline is running it faster now. I also can't see any changes that could cause this new behaviour.
The TIFF files written by camserver contain lots of useful information in the ImageDescription tag. It would be good to get this information into areaDetector as an attribute that can then be saved in other files.
NDArrayCounter
gets incremented before checking if the image actually exists if ADNumImages
> 1.
ADPilatus/pilatusApp/src/pilatusDetector.cpp
Line 1360 in 5a649ce
When reading detector temp and humidity, there is an entry for Channel 3 that is unlikely to exist. And worse, if it exists it overrides Channel 0:
if ((substr = strstr(this->fromCamserver, "Channel 3")) != NULL) {
sscanf(substr, "Channel 3: Temperature = %fC, Rel. Humidity = %f", &temp, &humid);
setDoubleParam(PilatusThTemp0, temp);
setDoubleParam(PilatusThHumid0, humid);
}
IMHO I believe this piece of code should be removed to avoid confusion.
However, I ignore if there is a case of Pilatus systems where the channels are numbered [1..3] instead of [0..2] by CamServer -- if that's the case then it should be properly documented, and set ADTemperature
as well.
Thanks,
Armando
Add a PV to show the remaining collection time, like in the marCCD and mar345.
I started IOC with the attached "st.cmd". The detector I'm using is Pilatus 300K, IP address 192.168.10.5.
When I tried to acquire an image, the camserver status shows "timeout, ....".
The Temperature on MEDM screen (attached) also shows 0, which is not correct.
The communication between the IOC and camserver seems to be working, as I can see the messages on the camserver output.
====================================================================================
IOC startup log:
./st.cmd
#!/opt/epics/modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADPilatus/iocs/pilatusIOC/bin/linux-x86_64/pilatusDetectorApp
< envPaths
epicsEnvSet("IOC","iocPilatus")
epicsEnvSet("TOP","/opt/epics/modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADPilatus/iocs/pilatusIOC")
epicsEnvSet("ADPILATUS","/opt/epics/modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADPilatus/iocs/pilatusIOC/../..")
epicsEnvSet("SUPPORT","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support")
epicsEnvSet("ASYN","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/asyn-R4-38")
epicsEnvSet("AREA_DETECTOR","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7")
epicsEnvSet("ADSUPPORT","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADSupport")
epicsEnvSet("ADCORE","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore")
epicsEnvSet("AUTOSAVE","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/autosave-R5-10")
epicsEnvSet("BUSY","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/busy-R1-7-2")
epicsEnvSet("CALC","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/calc-R3-7-4")
epicsEnvSet("SNCSEQ","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/seq-2-2-7")
epicsEnvSet("SSCAN","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/sscan-R2-11-3")
epicsEnvSet("DEVIOCSTATS","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/iocStats-3-1-16")
epicsEnvSet("STD","/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/std-R3-6-1")
epicsEnvSet("EPICS_BASE","/opt/epics/base-7.0.4")
errlogInit(20000)
dbLoadDatabase("/opt/epics/modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADPilatus/iocs/pilatusIOC/dbd/pilatusDetectorApp.dbd")
pilatusDetectorApp_registerRecordDeviceDriver(pdbbase)
# Prefix for all records
epicsEnvSet("PREFIX", "13PIL1:")
# The port name for the detector
epicsEnvSet("PORT", "PIL")
# The queue size for all plugins
epicsEnvSet("QSIZE", "20")
# The maximim image width; used for row profiles in the NDPluginStats plugin
epicsEnvSet("XSIZE", "487")
# The maximim image height; used for column profiles in the NDPluginStats plugin
epicsEnvSet("YSIZE", "195")
# The maximum number of time seried points in the NDPluginStats plugin
epicsEnvSet("NCHANS", "2048")
# The maximum number of frames buffered in the NDPluginCircularBuff plugin
epicsEnvSet("CBUFFS", "500")
# The search path for database files
epicsEnvSet("EPICS_DB_INCLUDE_PATH", "/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db")
###
# Create the asyn port to talk to the Pilatus on port 41234.
#drvAsynIPPortConfigure("camserver","gse-pilatus1:41234")
drvAsynIPPortConfigure("camserver","192.168.10.5:41234")
# Uncomment the following to enable asynTrace on the camserver port
#asynSetTraceIOMask("camserver",0,2)
#asynSetTraceMask("camserver",0,9)
# Set the input and output terminators.
asynOctetSetInputEos("camserver", 0, "\0x18")
Set EOS failed: camserver illegal eoslen 4
asynOctetSetOutputEos("camserver", 0, "\n")
pilatusDetectorConfig("PIL", "camserver", 487, 195, 0, 0)
2022/12/14 12:18:35.447 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:36.468 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
dbLoadRecords("/opt/epics/modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADPilatus/iocs/pilatusIOC/../../db/pilatus.template","P=13PIL1:,R=cam1:,PORT=PIL,ADDR=0,TIMEOUT=1,CAMSERVER_PORT=camserver")
# Create a standard arrays plugin
NDStdArraysConfigure("Image1", 5, 0, "PIL", 0, 0)
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db/NDStdArrays.template", "P=13PIL1:,R=image1:,PORT=Image1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL,TYPE=Int32,FTVL=LONG,NELEMENTS=94965")
# Load all other plugins using commonPlugins.cmd
< /opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/iocBoot/commonPlugins.cmd
# This is an example file for creating plugins
# It uses the following environment variable macros
# Many of the parameters defined in this file are also in commonPlugins_settings.req so if autosave is being
# use the autosave value will replace the value passed to this file.
# $(PREFIX) Prefix for all records
# $(PORT) The port name for the detector. In autosave.
# $(QSIZE) The queue size for all plugins. In autosave.
# $(XSIZE) The maximum image width; used to set the maximum size for row profiles in the NDPluginStats plugin and 1-D FFT
# profiles in NDPluginFFT.
# $(YSIZE) The maximum image height; used to set the maximum size for column profiles in the NDPluginStats plugin
# $(NCHANS) The maximum number of time series points in the NDPluginStats, NDPluginROIStats, and NDPluginAttribute plugins
# $(CBUFFS) The maximum number of frames buffered in the NDPluginCircularBuff plugin
# $(MAX_THREADS) The maximum number of threads for plugins which can run in multiple threads. Defaults to 5.
# Create a netCDF file saving plugin
NDFileNetCDFConfigure("FileNetCDF1", 20, 0, "PIL", 0)
dbLoadRecords("NDFileNetCDF.template","P=13PIL1:,R=netCDF1:,PORT=FileNetCDF1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create a TIFF file saving plugin
NDFileTIFFConfigure("FileTIFF1", 20, 0, "PIL", 0)
dbLoadRecords("NDFileTIFF.template", "P=13PIL1:,R=TIFF1:,PORT=FileTIFF1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create a JPEG file saving plugin
NDFileJPEGConfigure("FileJPEG1", 20, 0, "PIL", 0)
dbLoadRecords("NDFileJPEG.template", "P=13PIL1:,R=JPEG1:,PORT=FileJPEG1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create a NeXus file saving plugin
NDFileNexusConfigure("FileNexus1", 20, 0, "PIL", 0)
dbLoadRecords("NDFileNexus.template", "P=13PIL1:,R=Nexus1:,PORT=FileNexus1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create an HDF5 file saving plugin
NDFileHDF5Configure("FileHDF1", 20, 0, "PIL", 0)
dbLoadRecords("NDFileHDF5.template", "P=13PIL1:,R=HDF1:,PORT=FileHDF1,ADDR=0,TIMEOUT=1,XMLSIZE=2048,NDARRAY_PORT=PIL")
# Create a Magick file saving plugin
#NDFileMagickConfigure("FileMagick1", $(QSIZE), 0, "$(PORT)", 0)
#dbLoadRecords("NDFileMagick.template","P=$(PREFIX),R=Magick1:,PORT=FileMagick1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
# Create 4 ROI plugins
NDROIConfigure("ROI1", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDROI.template", "P=13PIL1:,R=ROI1:, PORT=ROI1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
NDROIConfigure("ROI2", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDROI.template", "P=13PIL1:,R=ROI2:, PORT=ROI2,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
NDROIConfigure("ROI3", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDROI.template", "P=13PIL1:,R=ROI3:, PORT=ROI3,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
NDROIConfigure("ROI4", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDROI.template", "P=13PIL1:,R=ROI4:, PORT=ROI4,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create 8 ROIStat plugins
NDROIStatConfigure("ROISTAT1", 20, 0, "PIL", 0, 8, 0, 0, 0, 0, 5)
dbLoadRecords("NDROIStat.template", "P=13PIL1:,R=ROIStat1: ,PORT=ROISTAT1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:1:,PORT=ROISTAT1,ADDR=0,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:2:,PORT=ROISTAT1,ADDR=1,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:3:,PORT=ROISTAT1,ADDR=2,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:4:,PORT=ROISTAT1,ADDR=3,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:5:,PORT=ROISTAT1,ADDR=4,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:6:,PORT=ROISTAT1,ADDR=5,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:7:,PORT=ROISTAT1,ADDR=6,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDROIStatN.template", "P=13PIL1:,R=ROIStat1:8:,PORT=ROISTAT1,ADDR=7,TIMEOUT=1,NCHANS=2048")
# Create a processing plugin
NDProcessConfigure("PROC1", 20, 0, "PIL", 0, 0, 0)
dbLoadRecords("NDProcess.template", "P=13PIL1:,R=Proc1:, PORT=PROC1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create a TIFF file plugin to read dark and flatfield images into the processing plugin
NDFileTIFFConfigure("PROC1TIFF", 20, 0, "PIL", 0)
dbLoadRecords("NDFileTIFF.template", "P=13PIL1:,R=Proc1:TIFF:,PORT=PROC1TIFF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create a scatter plugin
NDScatterConfigure("SCATTER1", 20, 0, "PIL", 0, 0, 0)
dbLoadRecords("NDScatter.template", "P=13PIL1:,R=Scatter1:, PORT=SCATTER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create a gather plugin with 8 ports
NDGatherConfigure("GATHER1", 20, 0, 8, 0, 0)
dbLoadRecords("NDGather.template", "P=13PIL1:,R=Gather1:, PORT=GATHER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=1, PORT=GATHER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=2, PORT=GATHER1,ADDR=1,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=3, PORT=GATHER1,ADDR=2,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=4, PORT=GATHER1,ADDR=3,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=5, PORT=GATHER1,ADDR=4,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=6, PORT=GATHER1,ADDR=5,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=7, PORT=GATHER1,ADDR=6,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDGatherN.template", "P=13PIL1:,R=Gather1:, N=8, PORT=GATHER1,ADDR=7,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create 5 statistics plugins
NDStatsConfigure("STATS1", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDStats.template", "P=13PIL1:,R=Stats1:, PORT=STATS1,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=487,YSIZE=195,NCHANS=2048,NDARRAY_PORT=PIL")
NDTimeSeriesConfigure("STATS1_TS", 20, 0, "STATS1", 1, 23)
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db/NDTimeSeries.template", "P=13PIL1:,R=Stats1:TS:, PORT=STATS1_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS1,NDARRAY_ADDR=1,NCHANS=2048,ENABLED=1")
NDStatsConfigure("STATS2", 20, 0, "ROI1", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDStats.template", "P=13PIL1:,R=Stats2:, PORT=STATS2,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=487,YSIZE=195,NCHANS=2048,NDARRAY_PORT=PIL")
NDTimeSeriesConfigure("STATS2_TS", 20, 0, "STATS2", 1, 23)
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db/NDTimeSeries.template", "P=13PIL1:,R=Stats2:TS:, PORT=STATS2_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS2,NDARRAY_ADDR=1,NCHANS=2048,ENABLED=1")
NDStatsConfigure("STATS3", 20, 0, "ROI2", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDStats.template", "P=13PIL1:,R=Stats3:, PORT=STATS3,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=487,YSIZE=195,NCHANS=2048,NDARRAY_PORT=PIL")
NDTimeSeriesConfigure("STATS3_TS", 20, 0, "STATS3", 1, 23)
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db/NDTimeSeries.template", "P=13PIL1:,R=Stats3:TS:, PORT=STATS3_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS3,NDARRAY_ADDR=1,NCHANS=2048,ENABLED=1")
NDStatsConfigure("STATS4", 20, 0, "ROI3", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDStats.template", "P=13PIL1:,R=Stats4:, PORT=STATS4,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=487,YSIZE=195,NCHANS=2048,NDARRAY_PORT=PIL")
NDTimeSeriesConfigure("STATS4_TS", 20, 0, "STATS4", 1, 23)
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db/NDTimeSeries.template", "P=13PIL1:,R=Stats4:TS:, PORT=STATS4_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS4,NDARRAY_ADDR=1,NCHANS=2048,ENABLED=1")
NDStatsConfigure("STATS5", 20, 0, "ROI4", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDStats.template", "P=13PIL1:,R=Stats5:, PORT=STATS5,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=487,YSIZE=195,NCHANS=2048,NDARRAY_PORT=PIL")
NDTimeSeriesConfigure("STATS5_TS", 20, 0, "STATS5", 1, 23)
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db/NDTimeSeries.template", "P=13PIL1:,R=Stats5:TS:, PORT=STATS5_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS5,NDARRAY_ADDR=1,NCHANS=2048,ENABLED=1")
# Create a transform plugin
NDTransformConfigure("TRANS1", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDTransform.template", "P=13PIL1:,R=Trans1:, PORT=TRANS1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create an overlay plugin with 8 overlays
NDOverlayConfigure("OVER1", 20, 0, "PIL", 0, 8, 0, 0, 0, 0, 5)
dbLoadRecords("NDOverlay.template", "P=13PIL1:,R=Over1:, PORT=OVER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:1:,NAME=ROI1, SHAPE=1,O=Over1:,XPOS=13PIL1:ROI1:MinX_RBV,YPOS=13PIL1:ROI1:MinY_RBV,XSIZE=13PIL1:ROI1:SizeX_RBV,YSIZE=13PIL1:ROI1:SizeY_RBV,PORT=OVER1,ADDR=0,TIMEOUT=1")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:2:,NAME=ROI2, SHAPE=1,O=Over1:,XPOS=13PIL1:ROI2:MinX_RBV,YPOS=13PIL1:ROI2:MinY_RBV,XSIZE=13PIL1:ROI2:SizeX_RBV,YSIZE=13PIL1:ROI2:SizeY_RBV,PORT=OVER1,ADDR=1,TIMEOUT=1")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:3:,NAME=ROI3, SHAPE=1,O=Over1:,XPOS=13PIL1:ROI3:MinX_RBV,YPOS=13PIL1:ROI3:MinY_RBV,XSIZE=13PIL1:ROI3:SizeX_RBV,YSIZE=13PIL1:ROI3:SizeY_RBV,PORT=OVER1,ADDR=2,TIMEOUT=1")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:4:,NAME=ROI4, SHAPE=1,O=Over1:,XPOS=13PIL1:ROI4:MinX_RBV,YPOS=13PIL1:ROI4:MinY_RBV,XSIZE=13PIL1:ROI4:SizeX_RBV,YSIZE=13PIL1:ROI4:SizeY_RBV,PORT=OVER1,ADDR=3,TIMEOUT=1")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:5:,NAME=Cursor1,SHAPE=1,O=Over1:,XPOS=junk, YPOS=junk, XSIZE=junk, YSIZE=junk, PORT=OVER1,ADDR=4,TIMEOUT=1")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:6:,NAME=Cursor2,SHAPE=1,O=Over1:,XPOS=junk, YPOS=junk, XSIZE=junk, YSIZE=junk, PORT=OVER1,ADDR=5,TIMEOUT=1")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:7:,NAME=Box1, SHAPE=1,O=Over1:,XPOS=junk, YPOS=junk, XSIZE=junk, YSIZE=junk, PORT=OVER1,ADDR=6,TIMEOUT=1")
dbLoadRecords("NDOverlayN.template","P=13PIL1:,R=Over1:8:,NAME=Box2, SHAPE=1,O=Over1:,XPOS=junk, YPOS=junk, XSIZE=junk, YSIZE=junk, PORT=OVER1,ADDR=7,TIMEOUT=1")
# Create 2 color conversion plugins
NDColorConvertConfigure("CC1", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDColorConvert.template", "P=13PIL1:,R=CC1:, PORT=CC1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
NDColorConvertConfigure("CC2", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDColorConvert.template", "P=13PIL1:,R=CC2:, PORT=CC2,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create a circular buffer plugin
NDCircularBuffConfigure("CB1", 20, 0, "PIL", 0, 500, 0)
dbLoadRecords("NDCircularBuff.template", "P=13PIL1:,R=CB1:, PORT=CB1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=PIL")
# Create an NDAttribute plugin with 8 attributes
NDAttrConfigure("ATTR1", 20, 0, "PIL", 0, 8, 0, 0, 0)
dbLoadRecords("NDAttribute.template", "P=13PIL1:,R=Attr1:, PORT=ATTR1,ADDR=0,TIMEOUT=1,NCHANS=2048,NDARRAY_PORT=PIL")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:1:, PORT=ATTR1,ADDR=0,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:2:, PORT=ATTR1,ADDR=1,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:3:, PORT=ATTR1,ADDR=2,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:4:, PORT=ATTR1,ADDR=3,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:5:, PORT=ATTR1,ADDR=4,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:6:, PORT=ATTR1,ADDR=5,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:7:, PORT=ATTR1,ADDR=6,TIMEOUT=1,NCHANS=2048")
dbLoadRecords("NDAttributeN.template", "P=13PIL1:,R=Attr1:8:, PORT=ATTR1,ADDR=7,TIMEOUT=1,NCHANS=2048")
NDTimeSeriesConfigure("ATTR1_TS", 20, 0, "ATTR1", 1, 8)
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/db/NDTimeSeries.template", "P=13PIL1:,R=Attr1:TS:, PORT=ATTR1_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=ATTR1,NDARRAY_ADDR=1,NCHANS=2048,ENABLED=1")
# Create an FFT plugin
NDFFTConfigure("FFT1", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDFFT.template", "P=13PIL1:, R=FFT1:, PORT=FFT1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=PIL, NAME=FFT1, NCHANS=487")
# Create 2 Codec plugins
NDCodecConfigure("CODEC1", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDCodec.template", "P=13PIL1:, R=Codec1:, PORT=CODEC1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=PIL")
NDCodecConfigure("CODEC2", 20, 0, "PIL", 0, 0, 0, 0, 0, 5)
dbLoadRecords("NDCodec.template", "P=13PIL1:, R=Codec2:, PORT=CODEC2, ADDR=0, TIMEOUT=1, NDARRAY_PORT=PIL")
set_requestfile_path("./")
set_requestfile_path("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/ADApp/Db")
set_requestfile_path("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADCore/iocBoot")
set_savefile_path("./autosave")
set_pass0_restoreFile("auto_settings.sav")
set_pass1_restoreFile("auto_settings.sav")
save_restoreSet_status_prefix("13PIL1:")
dbLoadRecords("/opt/epics/base-7.0.4/../modules/synApps_6_1_epics7/support/autosave-R5-10/asApp/Db/save_restoreStatus.db", "P=13PIL1:")
# Optional: load NDPluginPva plugin
#NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
#dbLoadRecords("NDPva.template", "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
# Must start PVA server if this is enabled
#startPVAServer
# Optional: load ffmpegServer plugin
#ffmpegServerConfigure(8081)
#ffmpegStreamConfigure("FfmStream1", 2, 0, "$(PORT)", 0, -1, 0)
#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegStream.template", "P=$(PREFIX),R=ffmstream1:,PORT=FfmStream1,NDARRAY_PORT=$(PORT)")
#ffmpegFileConfigure("FfmFile1", 16, 0, "$(PORT)", 0, -1, 0)
#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegFile.template", "P=$(PREFIX),R=ffmfile1:,PORT=FfmFile1,NDARRAY_PORT=$(PORT)")
# Optional: load NDPluginEdge plugin
#NDEdgeConfigure("EDGE1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0)
#dbLoadRecords("$(ADPLUGINEDGE)/db/NDEdge.template", "P=$(PREFIX),R=Edge1:, PORT=EDGE1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
#set_requestfile_path("$(ADPLUGINEDGE)/edgeApp/Db")
# Optional: load NDPluginCV plugin
#NDCVConfigure("CV1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
#dbLoadRecords("$(ADCOMPVISION)/db/NDCV.template", "P=$(PREFIX),R=CV1:, PORT=CV1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
#set_requestfile_path("$(ADCOMPVISION)/adcvApp/Db")
# Optional: load NDPluginBar plugin
#NDBarConfigure("BAR1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
#dbLoadRecords("$(ADPLUGINBAR)/db/NDBar.template", "P=$(PREFIX),R=Bar1:, PORT=BAR1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
#set_requestfile_path("$(ADPLUGINBAR)/barApp/Db")
# Optional: load scan records
#dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=$(PREFIX),MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=10")
#set_requestfile_path("$(SSCAN)/sscanApp/Db")
# Optional: load sseq record for acquisition sequence
#dbLoadRecords("$(CALC)/calcApp/Db/sseqRecord.db", "P=$(PREFIX), S=AcquireSequence")
#set_requestfile_path("$(CALC)/calcApp/Db")
# Optional: load devIocStats records (requires DEVIOCSTATS module)
#dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db", "IOC=$(PREFIX)")
# Optional: load alive record (requires ALIVE module)
#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=192.168.1.254")
# Set the callback queue size to 5000, up from default of 2000 in base.
# This can be needed to avoid errors "callbackRequest: cbLow ring buffer full".
callbackSetQueueSize(5000)
set_requestfile_path("/opt/epics/modules/synApps_6_1_epics7/support/areaDetector-R3-7/ADPilatus/iocs/pilatusIOC/../../pilatusApp/Db")
# Uncomment to enable asynTrace on the driver port
#asynSetTraceMask("$(PORT)",0,255)
iocInit()
Starting iocInit
############################################################################
## EPICS R7.0.4
## Rev. 2022-09-22T14:49-0700
############################################################################
reboot_restore: entry for file 'auto_settings.sav'
reboot_restore: Found filename 'auto_settings.sav' in restoreFileList.
*** restoring from './autosave/auto_settings.sav' at initHookState 6 (before record/device init) ***
reboot_restore: done with file 'auto_settings.sav'
iocRun: All initialization complete
# save things every thirty seconds
create_monitor_set("auto_settings.req", 30,"P=13PIL1:")
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
save_restore:readReqFile: unable to open file sseq_settings.req. Exiting.
epics> 2022/12/14 12:18:40.402 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
auto_settings.sav: 1321 of 1321 PV's connected
2022/12/14 12:18:41.405 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:42.426 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:43.426 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:44.428 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:49.430 pilatusDetector:readCamserver, timeout=5.000000, status=1 received 0 bytes
2022/12/14 12:18:50.450 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:51.452 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:52.453 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:53.455 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
2022/12/14 12:18:54.459 pilatusDetector:readCamserver, timeout=1.000000, status=1 received 0 bytes
[st.cmd.txt](https://github.com/areaDetector/ADPilatus/files/10231396/st.cmd.txt)
![image](https://user-images.githubusercontent.com/15041332/207706636-2de2be47-2456-43ee-b320-0b31176d1e21.png)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.