Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions slac_db/create/combined.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,14 @@ def _build():
for r in slac_db.oracle.get_all_rows():
if r["element"] not in self.device_names:
continue
cs_name = r["control system name"] or ""
# Klystron stations share keyword=LCAV with TCAVs but need
# their own accessor block keyed as "KLYS".
d_type = "KLYS" if "KLYS" in cs_name else r["keyword"]
yield from _meta(
r["element"],
r["control system name"],
r["keyword"],
cs_name,
d_type,
)

def _get_accessors(d_type, address):
Expand All @@ -99,6 +103,7 @@ def _get_accessors(d_type, address):
yield (address, accessor)

def _meta(device, pv_head, d_type):
override = self.accessor_overrides.get(device, {})
for pv_tail in self.address_map.get(pv_head, [None]):
if pv_tail is None:
continue
Expand All @@ -110,9 +115,18 @@ def _meta(device, pv_head, d_type):
accessor_name=accessor,
)
for address, accessor in accessor_names
if accessor not in override
]
for accessor_name, cs_address in override.items():
if cs_address:
yield PKDict(
device_name=device,
cs_address=cs_address,
accessor_name=accessor_name,
)

self.accessor_map = slac_db.io.read_dict(_ACCESSOR_YAML)
self.accessor_overrides = self.accessor_map.pop("_overrides", {})
self.accessor_meta = list(_build())

def _address_map(self):
Expand Down
33 changes: 32 additions & 1 deletion slac_db/create/lcls_elements.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,38 @@ def __init__(self, csv_source=None):
def _parse_csv(self, reader):
names = [r.lower() for r in next(reader)]
i = 0
# Track station names already recorded for KLYS sub-cavity dedup.
# Maps station_name -> index in self.rows for the canonical row.
# Keyed on the stripped element name (e.g. "K21_5") so that dirty
# cs_name data (truncated or transposed digits in sectors 12-19)
# cannot produce duplicate station entries.
_klys_seen = {}
for row in reader:
values = [None if v == '' else v for v in row]
self.rows[i] = dict(zip(names, values))
d = dict(zip(names, values))
element = d.get("element") or ""
cs_name = d.get("control system name") or ""
keyword = d.get("keyword") or ""
# Deduplicate klystron sub-cavities (K21_5A/B/C/D -> K21_5).
# A sub-cavity row is an LCAV whose element ends in A-D and whose
# cs_name contains "KLYS" (handles both "KLYS:LI{s}:{n}1" and
# legacy reversed form "LI{s}:KLYS:{n}1" used in sectors 12-19).
# Dedup key is the station name (element minus trailing letter) so
# that cs_name inconsistencies in the source data don't create
# duplicate entries (e.g. K12_3A has cs LI12:KLYS:3 while
# K12_3B/C/D have LI12:KLYS:31).
if (
keyword == "LCAV"
and "KLYS" in cs_name
and len(element) > 1
and element[-1] in "ABCD"
):
station = element[:-1] # e.g. "K21_5A" -> "K21_5"
if station in _klys_seen:
# Already have a row for this station; skip this sub-cavity.
continue
# First time seeing this station: record it and rename element.
d["element"] = station
_klys_seen[station] = i
self.rows[i] = d
i += 1
91 changes: 91 additions & 0 deletions slac_db/package_data/accessor_names.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions slac_db/package_data/device.sqlite3

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions slac_db/package_data/lcls_elements.sqlite3

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading