Changes to psi_device and app_config to add gui options for JFJoch. PSI-device now parses these messages in a message to JFJoch

This commit is contained in:
Appleby Martin Vears
2024-11-25 11:10:19 +01:00
parent 7014351eb4
commit 5d4808e6a1
2 changed files with 169 additions and 49 deletions

View File

@@ -138,6 +138,7 @@ class Jungfrau:
bs_channels = cfg.value(AppCfg.DAQ_BS_CH)
pv_channels = cfg.value(AppCfg.DAQ_PV_CH)
loc=cfg.value(AppCfg.DAQ_LOC)
run=cfg.value(AppCfg.DAQ_RUN)
dt_misc = cfg.value(AppCfg.DT_MISC)
code_gen=kwargs.get('code_gen',0)
sync_mode=dt_misc['sync_mode']
@@ -145,15 +146,19 @@ class Jungfrau:
self.n_pulses_run = None
if loc['jungfraujoch']:
try:
self.jfj = JFJ("http://sf-daq-2:5232")
#self.jfj = JFJ("http://sf-daq-2:5232") old port
self.jfj = JFJ("http://sf-daq-2:8080") #new port
self.detectors=None
_log.info(f'JungFrauJoch connected')
print('JungFrauJoch connected')
except NameError as e:
self.jfj = None
_log.critical(f'JungfrauJoch not connected: {e}')
is_scan_step=False
else:
self.jfj = None
_log.info(f'JungFrauJoch is not in use')
print('JungFrauJoch not in use')
if sync_flag==0:
grid_cnt=kwargs['grid']['count']
repetitions=grid_cnt[0] #'x' or number of columns
@@ -168,23 +173,43 @@ class Jungfrau:
else:
wait_pulses=kwargs['twait']//kwargs['tmove']
#xray_seq=[0,]*wait_pulses+[1] # multiplier is proportional to wait_time i.e. 10 ms = 1, 20 ms =2, 30 ms =3.
xray_sequence=[0,]*wait_pulses+[1]
cta.seq[200]=xray_sequence*cta_multiplier # x-ray_shutter
cta.seq[214] = [1,] + [0,] * (len(xray_sequence * cta_multiplier) -1)
trigger_sequence=[1,]*wait_pulses+[1]
cta.seq[215]=trigger_sequence*(cta_multiplier//2) # laser_shutter
image_label_sequence = [0,] * wait_pulses + [1] + [0,] * wait_pulses + [0]
cta.seq[216]=image_label_sequence*(cta_multiplier//2)
cta.seq[219] = xray_sequence * cta_multiplier
#xray_sequence=[0,]*wait_pulses+[1]
#cta.seq[200]=xray_sequence*cta_multiplier # x-ray_shutter
#cta.seq[214] = [1,] + [0,] * (len(xray_sequence * cta_multiplier) -1)
#trigger_sequence = [1,] + [0,] * wait_pulses + [0,] * wait_pulses + [0]
#cta.seq[215]=trigger_sequence*(cta_multiplier//2) # laser_shutter
#image_label_sequence = [0,] * wait_pulses + [1] + [0,] * wait_pulses + [0]
#cta.seq[216]=image_label_sequence*(cta_multiplier//2)
#cta.seq[219] = xray_sequence * cta_multiplier
on_off_ratio = 2 #1 on to 1 off which means 2 in the whole sequence
xray_sequence = [0,] * (wait_pulses - 1) + [1,] + [0,]
cta.seq[200] = xray_sequence * cta_multiplier # x-ray_shutter
cta.seq[214] = [1,] + [0,] * (len(xray_sequence * cta_multiplier) -1) #start motion
if run["triggered"]:
trigger_on = [0,] * wait_pulses + [1,]
trigger_off = [0,] + [0,] * wait_pulses
trigger_sequence = trigger_on * (on_off_ratio-1) + trigger_off
image_on = [0,] * (wait_pulses - 1) + [1,] + [0,]
image_label_sequence = [0,] +[0,] * wait_pulses + image_on * (on_off_ratio-1)
cta.seq[215] = trigger_sequence * (cta_multiplier//on_off_ratio) # trigger (laser_shutter or droplet ejector)
cta.seq[216] = image_label_sequence * (cta_multiplier//on_off_ratio) # image label (on or off)
else:
no_trigger_sequence = [0,] * (wait_pulses - 1) + [0,] + [0,]
cta.seq[215] = no_trigger_sequence * cta_multiplier # x-ray_shutter # trigger (laser_shutter or droplet ejector)
cta.seq[216] = no_trigger_sequence * cta_multiplier # x-ray_shutter # image label (on or off)1
cta.seq[219] = xray_sequence * cta_multiplier # detector trigger
else:
print('not code gen 3')
# no extra rows 1:1
cta.seq[214]=[1,]+[0,]*(cta_multiplier-1) #start motion
cta.seq[200]=[1,]*cta_multiplier # x-ray_shutter
cta.seq[200]=[1,]*cta_multiplier #uncomment me for normal operation
#cta.seq[200]=[1,0,]*(cta_multiplier//2) # x-ray_shutter
cta.seq[219]=[1,]*cta_multiplier #trigger detector
cta.seq[215]=[1,0,]*(cta_multiplier//2) # Trigger 1:1
cta.seq[216]=[1,0,]*(cta_multiplier//2) # Label image light dark 1:1
if run["triggered"]:
cta.seq[215]=[1,0,]*(cta_multiplier//2) # Trigger 1:1
cta.seq[216]=[1,0,]*(cta_multiplier//2) # Label image light dark 1:1 #change back to 1,0 for normal on off measurements
self.n_pulses_run = len(cta.seq[200])*repetitions
self.bsdata_scalar = self.n_pulses_run/number_of_appertures
@@ -212,9 +237,9 @@ class Jungfrau:
cfg=app._cfg
run=cfg.value(AppCfg.DAQ_RUN)
loc=cfg.value(AppCfg.DAQ_LOC)
#data_proc=cfg.value(AppCfg.DATA_PROC)
#daq_sample=cfg.value(AppCfg.DAQ_SAMPLE)
#daq_uc=cfg.value(AppCfg.DAQ_UC)
data_proc=cfg.value(AppCfg.DATA_PROC)
daq_sample=cfg.value(AppCfg.DAQ_SAMPLE)
daq_uc=cfg.value(AppCfg.DAQ_UC)
try:
self._pulse_id_start=int(self._pv_pulse_id.value)
except TypeError as e:
@@ -228,12 +253,18 @@ class Jungfrau:
_log.info(f'self.n_pulses_run {self.n_pulses_run} is not equal to n_pulses_run {n_pulses_run}')
#n_pulses_run*=2 # comment me out please when not using 10 ms wait (for stop and go)
images_per_file = run['block_size']
sample_name = run['prefix'] #daq_sample['sample_name'] #protein_name
sample_name = daq_sample['protein'] #protein_name
prefix = run['prefix']
user_tag = f'{sample_name}_{prefix}'
if self.jfj:
daq_uc={"a":70,"b":70,"c":70,"alpha":90,"beta":90,"gamma":90}
#daq_uc={"a":70,"b":70,"c":70,"alpha":90,"beta":90,"gamma":90}
unit_cell = {"a":daq_uc['a'],"b":daq_uc['b'], "c":daq_uc['c'],"alpha":daq_uc['alpha'], "beta":daq_uc['beta'], "gamma":daq_uc['gamma']}
geometry_file_location = loc['geometry_file_location']
trigger_event = loc['event_trigger']
trigger_flag = run['triggered']
trigger_delay = run['laser_delay']
laser_energy = run['laser_pulse_energy']
transmission_ATT53 = epics.caget("SARFE10-OATT053:UsrRec.TD")
transmission_ATT150 = epics.caget("SAROP31-OATA150:UsrRec.TD")
transmission = transmission_ATT53*transmission_ATT150
@@ -250,16 +281,21 @@ class Jungfrau:
_log.info(f'got endstation through gui:{endstation}')
jfj_file_prefix = f'sf/{endstation}/data/{pgroup}/raw/run{run_number:04}-{user_tag}/data/acq'
header_appendix ='{'
#for key in data_proc.keys():
# value = data_proc[key]
# pair =f'"{key}":{value},'
# header_appendix+=pair
header_appendix+='}' #some keys are different in JFJoch
header_appendix = {}
for key in data_proc.keys():
value = data_proc[key]
header_appendix[f'{key}']=value
header_appendix['geometry_file_location'] = geometry_file_location
header_appendix['trigger_flag'] = trigger_flag
header_appendix['trigger_delay'] = trigger_delay
header_appendix['trigger_event'] = trigger_event
header_appendix['laser_pulse_energy'] = trigger_delay
header_appendix['file_prefix'] = f'run{run_number:04}-{user_tag}'
self.jfj.acquire(beam_x_pxl = loc['beam_x'], beam_y_pxl = loc['beam_y'], detector_distance_mm = detector_distance_mm, incident_energy_keV = loc['incident_energy_kev'], transmission = transmission,
sample_name = sample_name, run_number = run_number, file_prefix = jfj_file_prefix, experiment_group=pgroup, ntrigger = self.images, images_per_file = images_per_file,
unit_cell=unit_cell, space_group_number='42',#daq_uc['space_group_number'],
unit_cell=unit_cell, space_group_number=daq_uc['space_group_number'],
header_appendix=header_appendix
)
_log.info('JFJ primed')