From f20943804ac794b2c32f17df42ed92e3b6b75fde Mon Sep 17 00:00:00 2001 From: XPD Operator Date: Tue, 13 Aug 2024 18:29:56 -0400 Subject: [PATCH] test work flow at 1LL09 with macros --- scripts/_LDRD_Kafka.py | 111 ++++++++------ scripts/_synthesis_queue_RM.py | 13 +- scripts/inputs_qserver_kafka_v2.xlsx | Bin 22130 -> 22156 bytes scripts/kafka_consumer_iterate_1LL09_v2.py | 22 ++- scripts/kafka_consumer_iterate_XPD_v2.py | 17 ++- startup/32-bundle-plan.py | 169 ++++++++++++++++++--- startup/existing_plans_and_devices.yaml | 64 ++++++++ 7 files changed, 301 insertions(+), 95 deletions(-) diff --git a/scripts/_LDRD_Kafka.py b/scripts/_LDRD_Kafka.py index 53ac759..387b8ea 100644 --- a/scripts/_LDRD_Kafka.py +++ b/scripts/_LDRD_Kafka.py @@ -4,6 +4,8 @@ import numpy as np import pandas as pd import importlib +import time +import pprint import _data_export as de from _plot_helper import plot_uvvis @@ -24,7 +26,7 @@ def _qserver_inputs(): qserver_list=[ 'zmq_control_addr', 'zmq_info_addr', - 'dummy_qserver', 'is_iteration', 'pos', + 'dummy_qserver', 'is_iteration', 'pos', 'use_OAm', 'name_by_prefix', 'prefix', 'pump_list', 'precursor_list', 'syringe_mater_list', 'syringe_list', 'target_vol_list', 'sample', @@ -142,6 +144,12 @@ def __init__(self, parameters_list, xlsx_fn, sheet_name='inputs', is_kafka=False pass + ## Reset attributes of keys in _kafka_process() to empty lists for next event + def reset_kafka_process(self): + for key in _kafka_process(): + setattr(self, key, []) + + def auto_rate_list(self, pump_list, new_points, fix_Br_ratio): """Auto transfer the predicted rates in new_points to a rate_list for qserver @@ -168,7 +176,7 @@ def auto_rate_list(self, pump_list, new_points, fix_Br_ratio): - def macro_agent(self, qserver_process, RM, check_target=False, use_OAm=False, is_1st=False): + def macro_agent(self, qserver_process, RM, check_target=False, is_1st=False): """macro to build agent, make optimization, and update agent_data This macro will @@ -185,6 +193,7 @@ def macro_agent(self, qserver_process, RM, check_target=False, use_OAm=False, is qserver_process (_LDRD_Kafka.xlsx_to_inputs, optional): qserver parameters read from xlsx. RM (REManagerAPI): Run Engine Manager API. check_target (bool, optional): Check if peak emission reaches peak target. Defaults to False. + is_ist (bool, optional): Check if it is the first precidciton. If yes, skip build agent. Returns: dict: new_points predicted by self.agent @@ -194,6 +203,27 @@ def macro_agent(self, qserver_process, RM, check_target=False, use_OAm=False, is peak_target = self.inputs.peak_target[0] peak_tolerance = self.inputs.peak_target[1] + + if check_target: + peak_diff = abs(self.PL_fitting['peak_emission'] - peak_target) + meet_target = (peak_diff <= peak_tolerance) + if meet_target: + print(f'\nTarget peak: {self.inputs.peak_target[0]} nm vs. Current peak: {self.PL_fitting["peak_emission"]} nm\n') + print(f'\nReach the target, stop iteration, stop all pumps, and wash the loop.\n') + + ### Stop all infusing pumps and wash loop + sq = importlib.import_module("_synthesis_queue_RM") + sq.wash_tube_queue2(qin.pump_list, qin.wash_tube, 'ul/min', + zmq_control_addr=qin.zmq_control_addr[0], + zmq_info_addr=qin.zmq_info_addr[0]) + + inst1 = BInst("queue_stop") + RM.item_add(inst1, pos='front') + self.agent_iteration.append(False) + + else: + self.agent_iteration.append(True) + if is_1st: pass else: @@ -201,7 +231,7 @@ def macro_agent(self, qserver_process, RM, check_target=False, use_OAm=False, is self.agent = build_agent( peak_target = peak_target, agent_data_path = self.inputs.agent_data_path[0], - use_OAm = use_OAm) + use_OAm = qin.use_OAm[0]) if len(self.agent.table) < 2: acq_func = "qr" @@ -235,26 +265,7 @@ def macro_agent(self, qserver_process, RM, check_target=False, use_OAm=False, is self.agent_data.update({'agent_target': agent_target}) self.agent_data.update({'posterior_mean': post_mean}) self.agent_data.update({'posterior_stddev': post_stddev}) - - if check_target and meet_target: - peak_diff = abs(self.PL_fitting['peak_emission'] - peak_target) - meet_target = (peak_diff <= peak_tolerance) - print(f'\nTarget peak: {self.inputs.peak_target[0]} nm vs. Current peak: {self.PL_fitting["peak_emission"]} nm\n') - print(f'\nReach the target, stop iteration, stop all pumps, and wash the loop.\n') - - ### Stop all infusing pumps and wash loop - sq = importlib.import_module("_synthesis_queue_RM") - sq.wash_tube_queue2(qin.pump_list, qin.wash_tube, 'ul/min', - zmq_control_addr=qin.zmq_control_addr[0], - zmq_info_addr=qin.zmq_info_addr[0]) - - inst1 = BInst("queue_stop") - RM.item_add(inst1, pos='front') - self.agent_iteration.append(False) - else: - self.agent_iteration.append(True) - return new_points @@ -350,7 +361,7 @@ def macro_03_stop_queue_uid(sefl, RM): - def macro_04_dummy_pdf(sefl): + def macro_04_dummy_pdf(self): """macro to setup a dummy pdf data for testing, used in kafka consumer while self.inputs.dummy_pdf[0] is True @@ -364,11 +375,11 @@ def macro_04_dummy_pdf(sefl): self.iq_data['df']: iq_df """ self.iq_data = {} - iq_array = pd.read_csv(self.iq_fn[-1], skiprows=1, names=['q', 'I(q)'], sep=' ').to_numpy().T + iq_array = pd.read_csv(self.inputs.iq_fn[-1], skiprows=1, names=['q', 'I(q)'], sep=' ').to_numpy().T # self.iq_data.append(iq_array[0]) # self.iq_data.append(iq_array[1]) # self.iq_data.append(iq_array) - iq_df = pd.read_csv(self.iq_fn[-1], skiprows=1, names=['q', 'I(q)'], sep=' ') + iq_df = pd.read_csv(self.inputs.iq_fn[-1], skiprows=1, names=['q', 'I(q)'], sep=' ') # self.iq_data.append(iq_df) iq_data = { 'Q':iq_array[0], @@ -554,6 +565,7 @@ def macro_08_no_fitting_pdf(self): # self.gr_fitting.append(gr_fit_arrary) # self.gr_fitting.append(gr_fit_df) + self.pdf_property = {} pdf_property={'Br_ratio': np.nan, 'Br_size': np.nan} self.pdf_property.update(pdf_property) @@ -600,11 +612,11 @@ def macro_10_good_bad(self, stream_name): This macro will 1. Identify a good or bad PL peak in 'take_a_uvvis' and 'fluorescence' 2. Update self.PL_goodbad - self.PL_goodbad['wavelength']: wavelenght (nm) of PL - self.PL_goodbad['intensity']: intensity of PL - self.PL_goodbad['data_id']: f'{t0[0]}_{t0[1]}_{metadata_dic["uid"][:8]}' - self.PL_goodbad['peak']: peaks from scipy.find_peaks - self.PL_goodbad['prop']: properties from scipy.find_peaks + self.PL_goodbad['wavelength']: wavelenght (nm) of PL + self.PL_goodbad['percentile_mean']: intensity of PL (percentile_mean) + self.PL_goodbad['data_id']: f'{t0[0]}_{t0[1]}_{metadata_dic["uid"][:8]}' + self.PL_goodbad['peak']: peaks from scipy.find_peaks + self.PL_goodbad['prop']: properties from scipy.find_peaks Args: stream_name (str): the stream name in scan doc to identify scan plan @@ -632,7 +644,7 @@ def macro_10_good_bad(self, stream_name): percent_range=[30, 100]) self.PL_goodbad = {} - PL_goodbad = { 'wavelength':np.asarray(x0), 'intensity':np.asarray(y0), + PL_goodbad = { 'wavelength':np.asarray(x0), 'percentile_mean':np.asarray(y0), 'data_id':data_id, 'peak':peak, 'prop':prop} self.PL_goodbad.update(PL_goodbad) @@ -645,7 +657,7 @@ def macro_11_absorbance(self, stream_name): 1. Apply a 2D line to fit the baseline of absorption spectra 2. Update self.abs_data self.abs_data['wavelength']: wavelenght of absorbance nm - self.abs_data['absorbance']: absorbance array (percentile_mean) + self.abs_data['percentile_mean']: absorbance array (percentile_mean) self.abs_data['offset']: absorbance array offset 3. Update self.abs_fitting self.abs_fitting['fit_function']: da.line_2D @@ -663,7 +675,7 @@ def macro_11_absorbance(self, stream_name): print(f'\n*** start to check absorbance at 365b nm in stream: {stream_name} is positive or not***\n') # abs_array = qepro_dic['QEPro_output'][1:].mean(axis=0) abs_array = abs_per.mean(axis=0) - wavelength = qepro_dic['QEPro_x_axis'][0] + wavelength = self.qepro_dic['QEPro_x_axis'][0] popt_abs01, _ = da.fit_line_2D(wavelength, abs_array, da.line_2D, x_range=[205, 240], plot=False) popt_abs02, _ = da.fit_line_2D(wavelength, abs_array, da.line_2D, x_range=[750, 950], plot=False) @@ -674,10 +686,10 @@ def macro_11_absorbance(self, stream_name): abs_array_offset = abs_array - da.line_2D(wavelength, *popt_abs) print(f'\nFitting function for baseline offset: {da.line_2D}\n') - ff_abs={'fit_function': da.line_2D, 'curve_fit': popt_abs} + ff_abs={'fit_function': da.line_2D, 'curve_fit': popt_abs, 'percentile_mean':abs_array} self.abs_data = {} - self.abs_data.update({'wavelength':wavelength, 'absorbance':abs_array, 'offset':abs_array_offset}) + self.abs_data.update({'wavelength':wavelength, 'percentile_mean':abs_array, 'offset':abs_array_offset}) self.abs_fitting = {} self.abs_fitting.update(ff_abs) @@ -701,12 +713,12 @@ def macro_12_PL_fitting(self): self.PL_fitting['wavelength']: wavelenght (nm) of PL between 400 ~ 800 nm self.PL_fitting['intensity']: intensity of PL (nm) between 400 ~ 800 nm self.PL_fitting['shifted_peak_idx']: peak index between 400 ~ 800 nm - + self.PL_fitting['percentile_mean']: intensity of PL (percentile_mean) """ x, y, p, f_fit, popt = da._fitting_in_kafka( self.PL_goodbad['wavelength'], - self.PL_goodbad['intensity'], + self.PL_goodbad['percentile_mean'], self.PL_goodbad['data_id'], self.PL_goodbad['peak'], self.PL_goodbad['prop'], @@ -717,7 +729,7 @@ def macro_12_PL_fitting(self): r2_idx2, _ = da.find_nearest(x, popt[1] + 3*popt[2]) r_2 = da.r_square(x[r2_idx1:r2_idx2], y[r2_idx1:r2_idx2], fitted_y[r2_idx1:r2_idx2], y_low_limit=0) - metadata_dic["r_2"] = r_2 + self.metadata_dic["r_2"] = r_2 if 'gauss' in f_fit.__name__: constant = 2.355 @@ -738,8 +750,8 @@ def macro_12_PL_fitting(self): ff={'fit_function': f_fit, 'curve_fit': popt, 'fwhm': fwhm, 'peak_emission': peak_emission, - 'wavelength': x, 'intensity': y, - 'shifted_peak_idx': p} + 'wavelength': x, 'intensity': y, 'shifted_peak_idx': p, + 'percentile_mean': self.PL_goodbad['percentile_mean']} self.PL_fitting = {} self.PL_fitting.update(ff) @@ -764,6 +776,7 @@ def macro_13_PLQY(self): x = self.PL_fitting['wavelength'] y = self.PL_fitting['intensity'] peak_emission = self.PL_fitting['peak_emission'] + fwhm = self.PL_fitting['fwhm'] PL_integral_s = integrate.simpson(y) ## Find absorbance at 365 nm from absorbance stream @@ -788,7 +801,7 @@ def macro_13_PLQY(self): def macro_14_upate_agent(self): - """macro to update agent_data in type of dict for exporting as json and wirte to sandbox + """macro to update agent_data in type of dict for exporting This macro will 1. Update self.agent_data with @@ -800,7 +813,7 @@ def macro_14_upate_agent(self): """ - ## Creat agent_data in type of dict for exporting as json and wirte to sandbox + ## Creat agent_data in type of dict for exporting if 'agent_target' in self.agent_data.keys(): pass else: @@ -847,7 +860,7 @@ def macro_15_save_data(self, stream_name): df['wavelength_nm'] = x0 df['absorbance_mean'] = self.abs_data['absorbance'] df['absorbance_offset'] = self.abs_data['offset'] - df['fluorescence_mean'] = self.PL_goodbad['intensity'] + df['fluorescence_mean'] = self.PL_goodbad['percentile_mean'] f_fit = self.PL_fitting['fit_function'] popt = self.PL_fitting['curve_fit'] df['fluorescence_fitting'] = f_fit(x0, *popt) @@ -880,8 +893,8 @@ def macro_16_num_good(self, stream_name): stream_name (str): the stream name in scan doc to identify scan plan """ - type_peak = type(kafka_process.PL_goodbad['peak']) - type_prop = type(kafka_process.PL_goodbad['prop']) + type_peak = type(self.PL_goodbad['peak']) + type_prop = type(self.PL_goodbad['prop']) ## Append good/bad idetified results if stream_name == 'take_a_uvvis': @@ -897,8 +910,8 @@ def macro_16_num_good(self, stream_name): print('\n*** export, identify good/bad, fitting complete ***\n') print(f"\n*** {self.sample_type} of uid: {self.uid[:8]} has: ***\n" - f"{self.optical_property = }***\n" - f"{self.pdf_property = }***\n") + f"*** {self.optical_property = } ***\n" + f"*** {self.pdf_property = } ***\n") def macro_17_add_queue(self, stream_name, qserver_process, RM): @@ -955,12 +968,12 @@ def macro_17_add_queue(self, stream_name, qserver_process, RM): RM.queue_start() ## Add predicted new points from ML agent into qserver - elif (stream_name == 'fluorescence') and (self.inputs.USE_AGENT_iterate[0]) and (self.inputs.agent_iteration[-1]): + elif (stream_name == 'fluorescence') and (self.inputs.USE_AGENT_iterate[0]) and (self.agent_iteration[-1]): print('*** Add new points from agent to the fron of qsever ***\n') new_points = self.macro_agent(qserver_process, RM, check_target=True) - print(f'*** New points from agent: {new_points} ***\n') + print(f'*** New points from agent:\n {pprint.pformat(new_points, indent=1)} ***\n') rate_list = self.auto_rate_list(qin.pump_list, new_points, self.inputs.fix_Br_ratio) diff --git a/scripts/_synthesis_queue_RM.py b/scripts/_synthesis_queue_RM.py index 76a0f93..0ac834d 100644 --- a/scripts/_synthesis_queue_RM.py +++ b/scripts/_synthesis_queue_RM.py @@ -203,7 +203,7 @@ def synthesis_queue_xlsx(parameter_obj): ## 6. Start xray_uvvis bundle plan to take real data ('pe1c' or 'det') - scanplan = BPlan('xray_uvvis_plan', det1, det2, + scanplan = BPlan('xray_uvvis_plan2', det1, det2, num_abs=num_abs, num_flu=num_flu, sample_type=sample[i], @@ -211,8 +211,7 @@ def synthesis_queue_xlsx(parameter_obj): correction_type='Reference', pump_list=pump_list, precursor_list=precursor_list, - mixer=mixer, - dilute_pump=pump_list[-1]) + mixer=mixer) RM.item_add(scanplan, pos=pos) ## 6.1 sleep 20 seconds for stopping @@ -424,7 +423,7 @@ def synthesis_queue( ## 6. Start xray_uvvis bundle plan to take real data ('pe1c' or 'det') - scanplan = BPlan('xray_uvvis_plan', det1, 'qepro', + scanplan = BPlan('xray_uvvis_plan2', det1, 'qepro', num_abs=num_abs, num_flu=num_flu, sample_type=sample[i], @@ -432,8 +431,7 @@ def synthesis_queue( correction_type='Reference', pump_list=pump_list, precursor_list=precursor_list, - mixer=mixer, - dilute_pump=pump_list[-1]) + mixer=mixer) RM.item_add(scanplan, pos=pos) ## 6.1 sleep 20 seconds for stopping @@ -647,8 +645,7 @@ def synthesis_queue3( correction_type='Reference', pump_list=pump_list, precursor_list=precursor_list, - mixer=mixer, - dilute_pump=pump_list[-1]) + mixer=mixer) RM.item_add(scanplan, pos=pos) ## 6.1 sleep 20 seconds for stopping diff --git a/scripts/inputs_qserver_kafka_v2.xlsx b/scripts/inputs_qserver_kafka_v2.xlsx index 38112e535fc08b6de7f0261aaebd64fc540e5d0d..163640ac112fb724914115aca51685a773d4f6dc 100644 GIT binary patch delta 17551 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%0A7V9b>Y9E`~C+ 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 delta 17460 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