Page History
...
Code Block |
---|
from psana import * dsource = MPIDataSource('exp=xpptut15:run=54:smd') cspaddet = Detector('cspad') smldata = dsource.small_data('run54.h5',gather_interval=100) partial_run_sum = None for nevt,evt in enumerate(dsource.events()): calib = cspaddet.calib(evt) if calib is None: continue cspad_sum = calib.sum() # number cspad_roi = calib[0][0][3:5] # array if partial_run_sum is None: partial_run_sum = cspad_roi else: partial_run_sum += cspad_roi # save per-event data smldata.event(cspad_sum=cspad_sum,cspad_roi=cspad_roi) if nevt>3: break # get "summary" data run_sum = smldata.sum(partial_run_sum) # save HDF5 file, including summary data smldata.save(run_sum=run_sum) |
"smd" mode (given to the MPIDataSource object) stands for "small data". It tells the software to use an identical copy of the full xtc data, but with all the large data (default >1kB) removed. Objects like camera images are replaced with a small "pointer" to the big data in the full xtc file. This allows all CPU cores to read through all the small-data quickly, and psana only fetches the large data when requested by the user with python methods like det.calib(evt) and det.image(evt). This is the mechanism used to allow for real-time MPI parallelization.
Run the script on 2 cores with this command to produce a "run54.h5" file:
...