This note describes area detector interface methods to access raw and calibrated data, reconstruct image for mutli-panel detector, retrieve calibration constants, geometry parameters, define the mask for pixel array, etc.
Code discussed in this note works on psana nodes which have access to data in lcls2 environment described in LCLS-II psana Environment.
To run examples one has to ssh to psana node and set environment
ssh -Y pslogin.slac.stanford.edu ssh -Y psana source /cds/sw/ds/ana/conda2/manage/bin/psconda.sh |
Most updated description of this interface is on git in the head of the file detector/areadetector.py
from psana import DataSource ds = DataSource(exp='tmoc00318',run=10, dir='/cds/data/psdm/prj/public01/xtc') orun = next(ds.runs()) det = orun.Detector('epix100') |
Methods guaranteed for all area detectors - raw, calib, and image:
for evt orun.events(): o = det.raw raw = o.raw(evt) clb = o.calib(evt) img = o.image(evt) |
kwa = <dict-of-mask-parameters> a = o.calib(evt, cmpars=(7,2,100,10), **kwa) a = o.image(evt, nda=None, **kwa) # reduced shape for available segment only a = o.image(evt, nda=None, value_for_missing_segments=800, **kwa) # full image including missing segments |
All detector calibration constants (np.array) and associated metadata (dict) are available through the dictionary det.calibconst with calibration type as a key. For example:
peds, meta = det.calibconst['pedestals'] |
Possible calibration types: pedestals, pixel_status, pixel_rms, pixel_gain, pixel_mask,
etc.
See for details Area detector mask examples.
from psana.detector.mask import Mask, DTYPE_MASK kwa = {'status':True, 'status_bits':0xffff, 'stextra_bits':(1<<64)-1, 'gain_range_inds':(0,1,2,3,4),\ 'neighbors':False, 'rad':3, 'ptrn':'r',\ 'edges':False, 'width':0, 'edge_rows':10, 'edge_cols':5,\ 'center':False, 'wcenter':0, 'center_rows':5, 'center_cols':3,\ 'calib':False,\ 'umask':None,\ 'force_update':False, 'dtype':DTYPE_MASK} m = Mask(det, **kwa) m = Mask(det) # minimal version. |
m.set_mask(**kwa) # forced update of cached mask. mask = m.mask(**kwa) # returns cached mask. mask = m.mask_default() mask = m.mask_calib_or_default() # if available returns mask from "pixel_mask" calibration type, otherwise array of ones. mask = m.mask_from_status(status_bits=0xffff, stextra_bits:(1<<64)-1, gain_range_inds=(0,1,2,3,4), dtype=DTYPE_MASK) mask = m.mask_edges(width=0, edge_rows=1, edge_cols=1, dtype=DTYPE_MASK) mask = m.mask_center(wcenter=0, center_rows=1, center_cols=1, dtype=DTYPE_MASK) mask = m.mask_neighbors(mask, rad=9, ptrn='r') |
# direct access to calibration constants and derived arrays peds = o._pedestals() gain = o._gain() # ADU/keV gfac = o._gain_factor() # keV/ADU rms = o._rms() status = o._status() arrx, arry, arrz = o._pixel_coords(do_tilt=True, cframe=0) indx, indy, indz = o._pixel_coord_indexes(pix_scale_size_um=None, xy0_off_pix=None, do_tilt=True, cframe=0) # array of the common mode increment incr = o._common_mode_increment(evt, cmpars=(0,7,100,10)) |