From 5d4808e6a1186c18ad41db2276f37a4ba431e2ba Mon Sep 17 00:00:00 2001 From: Appleby Martin Vears Date: Mon, 25 Nov 2024 11:10:19 +0100 Subject: [PATCH] Changes to psi_device and app_config to add gui options for JFJoch. PSI-device now parses these messages in a message to JFJoch --- app_config.py | 134 ++++++++++++++++++++++++++++++++++++++++---------- psi_device.py | 84 ++++++++++++++++++++++--------- 2 files changed, 169 insertions(+), 49 deletions(-) diff --git a/app_config.py b/app_config.py index 2a69b6a..3871b12 100644 --- a/app_config.py +++ b/app_config.py @@ -57,9 +57,13 @@ class AppCfg(QSettings): DT_HOST="deltatau/host" DT_MISC="deltatau/miscellaneous" + DATA_PROC="data_processing" + DAQ_DET="daq/detector" #json DAQ_LOC="daq/location" #json DAQ_RUN="daq/run" #json + DAQ_SAMPLE="daq/sample"#json + DAQ_UC="daq/unit_cell" #json DAQ_BS_CH="daq/bs_channels" #list of str DAQ_PV_CH="daq/pv_channels" #list of str @@ -120,6 +124,23 @@ class AppCfg(QSettings): dflt.append((AppCfg.DT_HOST, 'SAR-CPPM-EXPMX1')) if AppCfg.DT_MISC not in keys: dflt.append((AppCfg.DT_MISC,{'show_plots':True, 'vel_scl':1.0, 'fel_per':10.0, 'time_ofs':0.03, 'time_cor':0.0005, 'sync_mode':1, 'sync_flag':3, 'verbose':0xff})) + + if AppCfg.DATA_PROC not in keys: + dflt.append((AppCfg.DATA_PROC, { + 'indexing' : "xgandalf-latt-cell", + 'peaks' : "peakfinder8", + 'integration' : "rings-nocen-nograd", + 'tolerance': "10.0,10.0,10.0,2,3,2", + 'threshold': 10, + 'min-snr' : 5, + 'int-radius' : "5,7,9", + 'min-pix-count' : 1, + 'min-peaks' : 6, + 'multi' : False, + 'check-peaks' : False, + 'retry' : False, + })) + if AppCfg.DAQ_DET not in keys: dflt.append((AppCfg.DAQ_DET, { "name" : "JF17T16V01", @@ -133,9 +154,31 @@ class AppCfg(QSettings): "crystfel_lists_laser" : True, })) if AppCfg.DAQ_LOC not in keys: - dflt.append((AppCfg.DAQ_LOC, {'end_station':"cristallina", 'p_group':"p20516", 'jungfraujoch' : False,})) + dflt.append((AppCfg.DAQ_LOC, { + 'end_station': "cristallina", + 'p_group': "p20516", + 'jungfraujoch': False, + 'event_trigger': 63, + 'beam_x': 1613.0, + 'beam_y': 1666.0, + 'incident_energy_kev': 12.4, + 'geometry_file_location': "/res/geometry_files/JF17T16V01.geom", + })) + + if AppCfg.DAQ_SAMPLE not in keys: + dflt.append((AppCfg.DAQ_SAMPLE, {'protein':'hewl',})) + if AppCfg.DAQ_UC not in keys: + dflt.append((AppCfg.DAQ_UC, {'a':78.0, 'b':78.0, 'c':38.0 , 'alpha':90.0, 'beta':90.0, 'gamma':90.0, 'space_group_number':96,})) if AppCfg.DAQ_RUN not in keys: - dflt.append((AppCfg.DAQ_RUN, {'prefix':'jf', 'padding':10, 'cell_name' : 'na', 'block_size':1000,})) + dflt.append((AppCfg.DAQ_RUN, { + 'prefix':'jf', + 'padding':10, + 'cell_name' : 'na', + 'triggered': False, + 'laser_delay': '', + 'laser_pulse_energy': '', + 'block_size':1000, + })) #if AppCfg.DAQ_BS_CH not in keys: dflt.append((AppCfg.DAQ_BS_CH, ("SARES30-LSCP1-CRISTA1:CH0:1","SAR-CVME-TIFALL6:EvtSet", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG", "SARFE10-PBIG050-EVR0:CALCI", "SARFE10-PBPG050:HAMP-INTENSITY-CAL", "SARFE10-PBPS053:INTENSITY", "SARFE10-PBPS053:XPOS", "SARFE10-PBPS053:YPOS", "SARFE10-PSSS059:SPECTRUM_X", "SARFE10-PSSS059:SPECTRUM_Y", "SARFE10-PSSS059:SPECTRUM_Y_SUM", @@ -199,7 +242,8 @@ class AppCfg(QSettings): AppCfg.GEO_FND_FID, AppCfg.GEO_AUTOFOC, AppCfg.DFT_POS_DET,AppCfg.DFT_POS_GONIO,AppCfg.DFT_POS_PST,AppCfg.DFT_POS_COL,AppCfg.DFT_POS_BKLGT, AppCfg.DT_MISC, - AppCfg.DAQ_DET,AppCfg.DAQ_LOC,AppCfg.DAQ_RUN,AppCfg.DAQ_BS_CH,AppCfg.DAQ_PV_CH + AppCfg.DATA_PROC, + AppCfg.DAQ_DET,AppCfg.DAQ_LOC,AppCfg.DAQ_RUN,AppCfg.DAQ_BS_CH,AppCfg.DAQ_PV_CH,AppCfg.DAQ_UC,AppCfg.DAQ_SAMPLE ): val=json.dumps(val, cls=MyJsonEncoder) val=val.replace('"',"'") @@ -226,7 +270,8 @@ class AppCfg(QSettings): AppCfg.GEO_FND_FID, AppCfg.GEO_AUTOFOC, AppCfg.DFT_POS_DET,AppCfg.DFT_POS_GONIO,AppCfg.DFT_POS_PST,AppCfg.DFT_POS_COL,AppCfg.DFT_POS_BKLGT, AppCfg.DT_MISC, - AppCfg.DAQ_DET,AppCfg.DAQ_LOC,AppCfg.DAQ_RUN,AppCfg.DAQ_BS_CH,AppCfg.DAQ_PV_CH + AppCfg.DATA_PROC, + AppCfg.DAQ_DET,AppCfg.DAQ_LOC,AppCfg.DAQ_RUN,AppCfg.DAQ_BS_CH,AppCfg.DAQ_PV_CH,AppCfg.DAQ_UC,AppCfg.DAQ_SAMPLE ): if val is not None: val=val.replace("'",'"') @@ -281,10 +326,15 @@ class WndParameter(QMainWindow): geo_cam_param = cfg.value(AppCfg.GEO_CAM_PARAM) dt_host = cfg.value(AppCfg.DT_HOST) dt_misc = cfg.value(AppCfg.DT_MISC) + + data_proc = cfg.value(AppCfg.DATA_PROC) daq_det = cfg.value(AppCfg.DAQ_DET) daq_loc = cfg.value(AppCfg.DAQ_LOC) daq_run = cfg.value(AppCfg.DAQ_RUN) + + daq_sample = cfg.value(AppCfg.DAQ_SAMPLE) + daq_uc = cfg.value(AppCfg.DAQ_UC) tip_sync_mode='''\ default=2 @@ -387,8 +437,8 @@ verbose bits: {'name':'pos_diode','title':'Diode pos', 'value':dft_pos_bklgt.get('pos_diode', 0), 'type':'float','limits':(-31000, 1500), 'step':10, 'decimals':5, 'suffix':'ustep'}, ]}, {'name': AppCfg.DFT_POS_DET, 'title':'detector reference positions', 'type':'group','expanded':False, 'children':[ - {'name':'pos_in', 'title':'In position', 'value':dft_pos_det.get('pos_in',0), 'type':'float', 'limits':(-200, 200),'step':0.1, 'decimals':5, 'suffix':' mm'}, - {'name':'pos_out','title':'Out position', 'value':dft_pos_det.get('pos_out',0), 'type':'float', 'limits':(-200, 200),'step':0.1, 'decimals':5, 'suffix':' mm'}, + {'name':'pos_in', 'title':'In position', 'value':dft_pos_det.get('pos_in',0), 'type':'float', 'limits':(112, 280),'step':0.1, 'decimals':5, 'suffix':' mm'}, + {'name':'pos_out','title':'Out position', 'value':dft_pos_det.get('pos_out',0), 'type':'float', 'limits':(112, 280),'step':0.1, 'decimals':5, 'suffix':' mm'}, {'name':'set_in', 'title':'use current position as "in"', 'type':'action'}, {'name':'set_out', 'title':'use current position as "out"', 'type':'action'}, ]}, @@ -411,29 +461,62 @@ verbose bits: {'name':'verbose', 'value':dt_misc['verbose'], 'type':'int', 'tip':tip_verbose}, ]}, ]}, - + {'name': AppCfg.DATA_PROC, 'title':'data processing parameters', 'type':'group','expanded':False, 'children':[ + {'name':'indexing', 'value':data_proc['indexing'], 'type':'str', 'tip':"default=xgandalf-latt-cell"}, + {'name':'peaks', 'value':data_proc['peaks'], 'type':'str', 'tip':"default=peakfinder8"}, + {'name':'integration', 'value':data_proc['integration'], 'type':'str', 'tip':"default=rings-nocen-nograd"}, + {'name':'tolerance', 'value':data_proc['tolerance'], 'type':'str', 'tip':"default=10.0,10.0,10.0,2,3,2"}, + {'name':'threshold', 'value':data_proc['threshold'], 'type':'int', 'tip':"default=10"}, + {'name':'min-snr', 'value':data_proc['min-snr'], 'type':'int', 'tip':"default=5"}, + {'name':'min-pix-count', 'value':data_proc['min-pix-count'], 'type':'int', 'tip':"default=1"}, + {'name':'min-peaks', 'value':data_proc['min-peaks'], 'type':'int', 'tip':"default=6"}, + {'name':'int-radius', 'value':data_proc['int-radius'], 'type':'str', 'tip':"default=5,7,9"}, + {'name':'multi', 'value':data_proc['multi'], 'type':'bool', 'tip':"default=False"}, + {'name':'check-peaks', 'value':data_proc['check-peaks'], 'type':'bool', 'tip':"default=False"}, + {'name':'retry', 'value':data_proc['retry'], 'type':'bool', 'tip':"default=False"}, + ]}, {'name':'data acquisition', 'type':'group','expanded':False, 'children':[ - {'name':AppCfg.DAQ_DET, 'title':'detector', 'type':'group', 'children':[ - {'name':'name', 'value':daq_det['name'], 'type':'str',}, - {'name':'adc_to_energy', 'value':daq_det['adc_to_energy'], 'type':'bool'}, - {'name':'compression', 'value':daq_det['compression'], 'type':'bool'}, - {'name':'factor', 'value':daq_det['factor'], 'type':'float','step':0.01}, - {'name':'geometry', 'value':daq_det['geometry'], 'type':'bool'}, + {'name':AppCfg.DAQ_DET, 'title':'legacy daq parameters', 'type':'group', 'children':[ + {'name':'name', 'value':daq_det['name'], 'type':'str',}, + {'name':'adc_to_energy', 'value':daq_det['adc_to_energy'], 'type':'bool'}, + {'name':'compression', 'value':daq_det['compression'], 'type':'bool'}, + {'name':'factor', 'value':daq_det['factor'], 'type':'float', 'step':0.01}, + {'name':'geometry', 'value':daq_det['geometry'], 'type':'bool'}, {'name':'double_pixels_action', 'value':daq_det['double_pixels_action'], 'type':'str'}, - {'name':'remove_raw_files', 'value':daq_det['remove_raw_files'], 'type':'bool'}, - {'name':'save_dap_results', 'value':daq_det['save_dap_results'], 'type':'bool'}, - {'name':'crystfel_lists_laser','value':daq_det['crystfel_lists_laser'],'type':'bool'} + {'name':'remove_raw_files', 'value':daq_det['remove_raw_files'], 'type':'bool'}, + {'name':'save_dap_results', 'value':daq_det['save_dap_results'], 'type':'bool'}, + {'name':'crystfel_lists_laser', 'value':daq_det['crystfel_lists_laser'], 'type':'bool'} ]}, - {'name':AppCfg.DAQ_LOC, 'title':'location', 'type':'group', 'children':[ - {'name':'end_station', 'value':daq_loc['end_station'], 'type':'str',}, - {'name':'p_group', 'value':daq_loc['p_group'], 'type':'str'}, - {'name':'jungfraujoch', 'value':daq_loc['jungfraujoch'], 'type':'bool'}, + {'name':AppCfg.DAQ_LOC, 'title':'data handling', 'type':'group', 'children':[ + {'name':'end_station', 'value':daq_loc['end_station'], 'type':'str',}, + {'name':'p_group', 'value':daq_loc['p_group'], 'type':'str'}, + {'name':'jungfraujoch', 'value':daq_loc['jungfraujoch'], 'type':'bool'}, + {'name':'event_trigger', 'value':daq_loc['event_trigger'], 'type':'int', 'limits':(1, 256)}, + {'name':'beam_x', 'value':daq_loc['beam_x'], 'type':'float','step':0.001, 'decimals':3}, + {'name':'beam_y', 'value':daq_loc['beam_y'], 'type':'float','step':0.001, 'decimals':3}, + {'name':'incident_energy_kev', 'value':daq_loc['incident_energy_kev'], 'type':'float','step':0.001, 'decimals':5}, + {'name':'geometry_file_location', 'value':daq_loc['geometry_file_location'], 'type':'str',}, ]}, - {'name':AppCfg.DAQ_RUN, 'title':'location', 'type':'group', 'children':[ - {'name':'prefix', 'value':daq_run['prefix'], 'type':'str',}, - {'name':'padding','value':daq_run['padding'], 'type':'int'}, - {'name':'cell_name', 'value':daq_run['cell_name'], 'type':'str'}, - {'name':'block_size', 'value':daq_run['block_size'], 'type':'int'}, + {'name':AppCfg.DAQ_RUN, 'title':'run paramters', 'type':'group', 'children':[ + {'name':'prefix', 'value':daq_run['prefix'], 'type':'str'}, + {'name':'padding', 'value':daq_run['padding'], 'type':'int'}, #at some point move to old_daq_config + {'name':'cell_name', 'value':daq_run['cell_name'], 'type':'str'}, #at some point move to old_daq_config + {'name':'laser_delay', 'value':daq_run['laser_delay'], 'type':'str'}, + {'name':'laser_pulse_energy', 'value':daq_run['laser_pulse_energy'], 'type':'str'}, + {'name':'triggered', 'value':daq_run['triggered'], 'type':'bool'}, + {'name':'block_size', 'value':daq_run['block_size'], 'type':'int'}, + ]}, + {'name':AppCfg.DAQ_SAMPLE, 'title':'sample paramters', 'type':'group', 'children':[ + {'name':'protein', 'value':daq_sample['protein'], 'type':'str',}, + {'name':AppCfg.DAQ_UC, 'title':'unit cell', 'type':'group', 'children':[ + {'name':'a', 'value':daq_uc['a'], 'type':'float', 'step':0.001, 'decimals':3}, + {'name':'b', 'value':daq_uc['b'], 'type':'float', 'step':0.001, 'decimals':3}, + {'name':'c', 'value':daq_uc['c'], 'type':'float', 'step':0.001, 'decimals':3}, + {'name':'alpha', 'value':daq_uc['alpha'], 'type':'float', 'step':0.001, 'decimals':3}, + {'name':'beta', 'value':daq_uc['beta'], 'type':'float', 'step':0.001, 'decimals':3}, + {'name':'gamma', 'value':daq_uc['gamma'], 'type':'float', 'step':0.001, 'decimals':3}, + {'name':'space_group_number', 'value':daq_uc['space_group_number'], 'type':'int'}, + ]}, ]}, {'name':AppCfg.DAQ_BS_CH, 'title':'list of beam-sync channels','value':' '.join(cfg.value(AppCfg.DAQ_BS_CH)), 'type':'str'}, {'name':AppCfg.DAQ_PV_CH, 'title':'list of PV channels','value':' '.join(cfg.value(AppCfg.DAQ_PV_CH)), 'type':'str'}, @@ -560,6 +643,7 @@ verbose bits: cfg.setValue(nm,lst) elif par_nm in (AppCfg.GBL_MISC,AppCfg.DT_MISC, AppCfg.GEO_FND_FID,AppCfg.GEO_AUTOFOC, + AppCfg.DAQ_UC, AppCfg.DAQ_SAMPLE, AppCfg.DATA_PROC, AppCfg.DAQ_DET,AppCfg.DAQ_LOC,AppCfg.DAQ_RUN): d=dict(map(lambda x:(x.name(),x.value()), parent.children())) cfg.setValue(par_nm, d) diff --git a/psi_device.py b/psi_device.py index 256e019..6f3b1ee 100644 --- a/psi_device.py +++ b/psi_device.py @@ -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')