Produced by psana/src/dgram.cc.
Accessed from psana event with a pattern like:
evt._dgrams[nDgram].detname[nSegment].drpClassName.attr1.attr2...
- detname is defined by the hutch. For example: "xppcspad" or "xpphsd"
- nSegment is an integer, denoting which portion of a larger detector this is (e.g. cspad panel number)
- drpClassName is defined by the DRP segment-level software via the "Alg" parameter to xtcdata/xtcdata/xtc/ShapesData.hh:Names class. For example: "raw", "fex", "roi1", "roi2"
A complication: the different detector segments can be split over several datagrams (offline event-build) or be all in one datagram (online event-build)
Some Examples and Special Cases
From a conversation with Mona Uervirojnangkoorn on Aug. 27, 2020.
for epics scans:
dgram[0].scans[0].raw.motor2
det = Detector('motor2')
val = det(evt) (timestamp in the event is used to do lookup in stepstore)
could do:
val = det(step) (and get timestamp from the step to do stepstore lookup)
for epics values:
SIOC::SYS0::VARNAME maps to SIOC__SYS0__VARNAME (maybe)
dgram[0].epics[0].raw.SIOC::SYS0::VARNAME
Detector('SIOC::SYS0::VARNAME')
dgram[0].epics[0].raw.SIOC__SYS0__VARNAME
det = Detector('motor1')
val = det(evt)
for "jump" each detector owns a stepstore and the detector uses it to to return correct value.
for normal detectors:
dgram[0].tmoopal[0].raw
Detector('tmoopal')
proposal for configuration scans ... try to put it in the main detector interface:
det = Detector('tmoopal')
dgram[0].tmoopal[0].cfgscan.user.blacklevel (maybe cfgscan is similar to raw/fex: optionally present)
val = det.cfgscan.user.blacklevel(evt or step)
jumping works
"cfgscan" would be a detector base-class attribute only if being scanned
(no attribute if not being scanned!)