Page History
...
Code Block | ||
---|---|---|
| ||
from psana import DataSource import numpy as np import os # OPTIONAL callback with "gathered" small data from all cores. # usually used for creating realtime plots when analyzing from # DAQ shared memory. Called back on each SRV node. def my_smalldata(data_dict): print(data_dict) # Use this function to decide if you want to fetch large data for this event # and/or direct an event to process on a particular 'rank' # (this rank number should be between 1 and total no. of ranks - 3 # since 3 ranks are reserved). If this detector is needed, make sure # to define this detector in as_smds argument for DataSource (see below). # All epics and scan detectors are available automatically. def smd_callback(run): opal = run.Detector('tmo_opal1') epics_det = run.Detector('IM2K4_XrayPower') n_bd_nodes = 3 # for mpirun -n 6, 3 ranks are reserved so there are 3 bd ranks left for i_evt, evt in enumerate(run.events()): img = opal.raw.image(evt) epics_val = epics_det(evt) dest = (evt.timestamp % n_bd_nodes) + 1 if epics_val is not None: # Set the destination (rank no.) where this event should be sent to evt.set_destination(dest) yield evt # sets the number of h5 files to write. 1 is sufficient for 120Hz operation # optional: only needed if you are saving h5. os.environ['PS_SRV_NODES']='1' ds = DataSource(exp='tmoc00118', run=222, dir='/cds/data/psdm/prj/public01/xtc', max_events = 10, detectors = ['epicsinfo', 'tmo_opal1', 'ebeam'], # only reads these detectors (faster) smd_callback= smd_callback, # smalldata callback (see notes above) small_xtc = ['tmo_opal1'], # detectors to be used in smalldata callback ) # batch_size is optional. specifies how often the dictionary of small # user data is gathered. if you write out large data (NOT RECOMMENDED) it needs to be set small. smd = ds.smalldata(filename='mysmallh5.h5', batch_size=5, callbacks=[my_smalldata]) for run in ds.runs(): opal = run.Detector('tmo_opal1') ebeam = run.Detector('ebeam') runsum = np.zeros((3),dtype=float) # beware of datatypes when summing: can overflow for evt in run.events(): img = opal.raw.image(evt) photonEnergy = ebeam.raw.ebeamPhotonEnergy(evt) if img is None or photonEnergy is None: continue evtsum = np.sum(img) # pass either dictionary or kwargs smd.event(evt, evtsum=evtsum, photonEnergy=photonEnergy) runsum += img[0,:3] # local sum on one mpi core # optional summary data for whole run if smd.summary: tot_runsum = smd.sum(runsum) # sum (or max/min) across all mpi cores. Must be numpy array or None. # pass either dictionary or kwargs smd.save_summary({'sum_over_run' : tot_runsum}, summary_int=1) smd.done() |
Excluding Detectors
You can exclude detectors when creating a new datasource with xdetectors=[]
argument.
Code Block | ||
---|---|---|
| ||
# Create a datasource and tell it to exclude two detectors
from psana import DataSource
ds = DataSource(exp='tmoc00118', run=222, dir='/cds/data/psdm/prj/public01/xtc',
xdetectors = ['hsd'], # all other detectors will be available
max_events = 10)
run = next(ds.runs())
# Create these detectors normally
opal = run.Detector('tmo_opal1')
ebeam = run.Detector('ebeam')
for i, evt in enumerate(run.events()):
img = opal.raw.image(evt)
photonEnergy = ebeam.raw.ebeamPhotonEnergy(evt)
print(f'got evt={i} ts={evt.timestamp} img={img.shape} {photonEnergy=}') |
Note that other detectors that are also part of the excluded stream will also be excluded. You'll see a warning message like this one:
Code Block | ||
---|---|---|
| ||
Warning: Stream-8 has one or more detectors matched with the excluded set. All detectors in this stream will be excluded. |
If you're trying to access detectors that are part of the excluded list, you'll see DetectorNameError
message below:
Code Block | ||
---|---|---|
| ||
Traceback (most recent call last):
File "/cds/home/m/monarin/lcls2/psana/psana/tests/dummy.py", line 12, in <module>
ebeam = run.Detector('ebeam')
File "/cds/home/m/monarin/lcls2/psana/psana/psexp/run.py", line 119, in Detector
raise DetectorNameError(err_msg)
psana.psexp.run.DetectorNameError: No available detector class matched with ebeam. If this is a new detector/version, make sure to add new class in detector folder. |
Accessing Event Codes
LCLS1-style event codes can be accessed using the "timing" detector:
...
Overview
Content Tools