Page History
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
from psana import DataSource
from psmon import publish
from psmon.plots import Image,XYPlot
import os, sys, time
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
os.environ['PS_SRV_NODES']='1'
os.environ['PS_SMD_N_EVENTS']='1'
# passing exp and runnum
exp=sys.argv[1]
runnum=int(sys.argv[2])
mount_dir = '/sdf/data/lcls/drpsrcf/ffb'
#mount_dir = '/cds/data/drpsrcf'
xtc_dir = os.path.join(mount_dir, exp[:3], exp, 'xtc')
ds = DataSource(exp=exp,run=runnum,dir=xtc_dir,intg_det='andor_vls',
batch_size=1,
psmon_publish=publish,
detectors=['timing','andor_vls','atmopal'],
max_events=0,
live=True)
# we will remove this for batch processing and use "psplot" instead
# publish.local = True
def my_smalldata(data_dict):
if 'unaligned_andor_norm' in data_dict:
andor_norm = data_dict['unaligned_andor_norm'][0]
myplot = XYPlot(0,f"Andor (normalized) run:{runnum}",range(len(andor_norm)),andor_norm)
publish.send('ANDOR',myplot)
if 'sum_atmopal' in data_dict:
atmopal_sum = data_dict['sum_atmopal']
myplot = XYPlot(0,f"Atmopal (sum) run:{runnum}",range(len(atmopal_sum)), atmopal_sum)
publish.send('ATMOPAL', myplot)
for myrun in ds.runs():
andor = myrun.Detector('andor_vls')
atmopal = myrun.Detector('atmopal')
timing = myrun.Detector('timing')
smd = ds.smalldata(filename='mysmallh5.h5',batch_size=5, callbacks=[my_smalldata])
norm = 0
ndrop_inhibit = 0
sum_atmopal = None
cn_andor_events = 0
cn_intg_events = 0
ts_st = None
for nstep,step in enumerate(myrun.steps()):
print('step:',nstep)
for nevt,evt in enumerate(step.events()):
if ts_st is None: ts_st = evt.timestamp
cn_intg_events += 1
andor_img = andor.raw.value(evt)
atmopal_img = atmopal.raw.image(evt)
if atmopal_img is not None:
if sum_atmopal is None:
sum_atmopal = atmopal_img[0,:]
else:
sum_atmopal += atmopal_img[0,:]
# also need to check for events missing due to damage
# (or compare against expected number of events)
ndrop_inhibit += timing.raw.inhibitCounts(evt)
smd.event(evt, mydata=nevt) # high rate data saved to h5
# need to check Matt's new timing-system data on every
# event to make sure we haven't missed normalization
# data due to deadtime
norm+=nevt # fake normalization
if andor_img is not None:
cn_andor_events += 1
#print('andor data on evt:',nevt,'ndrop_inhibit:',ndrop_inhibit)
print(f'BD{rank-1}: #andor_events: {cn_andor_events} #intg_event:{cn_intg_events} st: {ts_st} en:{evt.timestamp}')
# check that the high-read readout group (2) didn't
# miss any events due to deadtime
if ndrop_inhibit[2]!=0: print('*** data lost due to deadtime')
# need to prefix the name with "unaligned_" so
# the low-rate andor dataset doesn't get padded
# to align with the high rate datasets
smd.event(evt, mydata=nevt,
unaligned_andor_norm=(andor_img/norm),
sum_atmopal=sum_atmopal)
norm=0
ndrop_inhibit=0
sum_atmopal = None
cn_intg_events = 0
ts_st = None
smd.done()
|
...
Overview
Content Tools