EPICS IOC record search and meta information tool.
Spiritual successor of recordwhat.
https://pcdshub.github.io/whatrecord/
Lark grammar-based parsers which parse any of the following into easy-to-use Python dataclasses:
- EPICS access security files (.acf)
- EPICS autosave save files (.sav)
- EPICS V3 database files
- EPICS V4 database files
- EPICS msi-style template/substitutions files (.template/.substitutions)
- EPICS gateway configuration (.pvlist)
- EPICS sequencer state notation language programs (.st)
- EPICS StreamDevice protocols (.proto)
All of the above can be easily serialized to JSON for interoperability.
Pseudo-IOC shell interpreter:
- Reads st.cmd files as if it were an IOC
- Loads and lints record files (and other supported formats above)
- Builds inter- and intra- IOC PV relationship graphs
- Stores context information about where each record/field/etc came from
API server
- IOC finder (LCLS IOC manager, list of files, or external script)
- Provides access to all parsed information above
- Preliminary asyncio-based client to talk with the server
Frontend
- User-friendly vue.js v3 frontend that communicates with API server
- Interfaces for:
- Searching for records
- Record relationships (processing and links, cross-IOC links)
- IOC information
- Gateway configuration overview
- Duplicate records
- Optional plugins
Plugins
- happi devices
- Simple LDAP search (LCLS hosts, "netconfig")
- LCLS-specific epicsArch / logbook DAQ PVs
- TwinCAT PLC source code (pytmc)
Makefile / build system information
- Determine build dependencies from a
Makefile
- Recursively inspect sub-dependencies
- Graph IOC dependency information or output it as JSON
Command-line tools
whatrecord lint
- lint a databasewhatrecord parse
- parse supported formatswhatrecord server
- start the API serverwhatrecord graph
- graph PV relationships, SNL diagrams, IOC dependencies
Requirements:
- Python 3.9
- aiohttp
- apischema[graphql]
- graphviz
- jinja2
- lark
See /docker to set up a Python 3.10-based whatrecord container. A docker-compose configuration for starting up the frontend/backend servers is also provided. Note that the default configuration only indexes the whatrecord-provided IOCs.
Search for records and view relationships:
View StreamDevice protocol information:
See where your qsrv pvAccess keys come from:
See access security settings:
View all of your IOCs in one place and browse their records by type:
View inter-IOC record relationships:
View all of your ophyd/happi devices and their relevant PVs:
View LDAP-provided settings:
(LCLS-specific) View epicsArch DAQ PVs:
View gateway PVList configurations:
View record duplicates:
View API server logs:
See per-parameter values:
See database lint:
Use whatrecord deps --graph
to inspect IOCs/modules with make
and
generate a dependency graph of modules:
Use whatrecord graph
to graph state notation language .st
file
logic:
Use an external tool like jq
to sift through information from whatrecord's
JSON output:
$ whatrecord parse whatrecord/tests/iocs/db/pva/iq.db | jq '.records[] | [.name, .record_type, .fields.OUT.value]' [ "$(PREFIX)Rate", "ao", "$(PREFIX)dly_.ODLY NPP" ] [ "$(PREFIX)Delta", "ao", null ] ... $ whatrecord parse whatrecord/tests/iocs/db/pva/iq.db | jq '.records[] | [ .name, .info["Q:group"]]' [ "$(PREFIX)Rate", null ] [ "$(PREFIX)Phase:I", { "$(PREFIX)iq": { "phas.i": { "+type": "plain", "+channel": "VAL" } } } ] ...