Environment
To obtain the environment to run psana2, execute the following:
source /reg/g/psdm/sw/conda2/manage/bin/psconda.sh
Note that LCLS-II psana is not compatible with LCLS-I psana, so environments must activate one or the other, but not both.
Detector Names
Use this command to see non-epics detector names (see "Detector Interface" example below):
(ps-4.1.0) psanagpu101:lcls2$ detnames exp=tmoc00118,run=123 --------------------- Name | Data Type --------------------- epicsinfo | epicsinfo timing | raw hsd | raw gmdstr0 | raw etc.
Use the same command with the "-e" option to see epics detector names (see "Detector Interface" example below). These are slowly varying variables (like temperatures) that are not strongly time correlated with the non-epics data:
(ps-4.1.0) psanagpu101:lcls2$ detnames -e exp=tmoc00118,run=123 --------------------------- Name | Data Type --------------------------- StaleFlags | raw Keithley_Sum | raw IM2K4_XrayPower | raw IM3K4_XrayPower | raw etc.
Using the Detector Interface
Standard (per-shot) detectors and the slower epics variables can be accessed as shown here using the names discovered with the commands above. You can use tab-completion in ipython or the jupyternotebook to explore what you can do with the various detector objects:
from psana import DataSource ds = DataSource(exp='tmoc00118',run=123) myrun = next(ds.runs()) opal = myrun.Detector('tmoopal') epics_det = myrun.Detector('IM2K4_XrayPower') for evt in myrun.events(): img = opal.raw.image(evt) epics_val = epics_det(evt) # check for missing data if img is None or epics_val is None: print('none') continue print(img.shape,epics_val)
Example Script Producing Small HDF5 File
You can run this script with MPI: PS_SRV_NODES=2; mpirun -n 6 python example.py
It also works on one core with: python example.py. See MPI rank/task diagram here.
This mechanism by defaults produces "aligned" datasets where missing values are padded (with NaN's for floats, and -99999 for integers). To create an unaligned dataset (without padding) prefix the name of the variable with "unaligned_".
from psana import DataSource import numpy as np # called back on each SRV node, for every smd.event() call below def test_callback(data_dict): print(data_dict) ds = DataSource(exp='tmoc00118', run=123) # batch_size here specifies how often the dictionary of information # is sent to the SRV nodes smd = ds.smalldata(filename='my.h5', batch_size=5, callbacks=[test_callback]) run = next(ds.runs()) # necessary (instead of "None") since some ranks may not receive events # and the smd.sum() below could fail arrsum = np.zeros((2), dtype=np.int) for i,evt in enumerate(run.events()): myones = np.ones_like(arrsum) smd.event(evt, myfloat=2.0, arrint=myones) arrsum += myones if smd.summary: smd.sum(arrsum) smd.save_summary({'summary_array' : arrsum}, summary_int=1) smd.done()
MPI Task Structure
To allow for scaling, many hdf5 files are written, one per "SRV" node. The total number of SRV nodes is defined by the environment variable PS_SRV_NODES (defaults to 0). These many hdf5 files are joined by psana into what appears to be one file using the hdf5 "virtual dataset" feature.