From 28263aaefb3cddf1ed95547e7c575ebbeba4cb65 Mon Sep 17 00:00:00 2001 From: ryantan Date: Tue, 15 Apr 2025 15:23:42 +0200 Subject: [PATCH] upper limit of Babs check in b_field_rotation added --- Mag_Field_Sweep_2024_10_21.py | 59 +++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/Mag_Field_Sweep_2024_10_21.py b/Mag_Field_Sweep_2024_10_21.py index 61b7f00..0ccfa9b 100644 --- a/Mag_Field_Sweep_2024_10_21.py +++ b/Mag_Field_Sweep_2024_10_21.py @@ -764,7 +764,7 @@ def b_field_rotation(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.R Babs:float, startangle:float, endangle:float, angle_stepsize:float, Settings:str, clockwise=True, base_file_name='', zerowhenfin_bool=False)->None: # TODO: update docs """Rotation of the b-field in discrete steps, spectrum is measured at each discrete step in the rotation. Scan angle is - defined as the angle between the x-axis and the current B-field vector, i.e., in the anticlockwise direction. + defined as the angle between the x-axis and the current B-field vector, i.e., in the anticlockwise direction. Args: instr1 (pyvisa.resources.Resource): _description_ @@ -779,6 +779,8 @@ def b_field_rotation(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.R # TODO: possibly rename instr1 and instr2 to the dual and single power supplies respectively?? # TODO: add logging to the script + # TODO: add check if Babs is within the limits of the power supply, and if not, raise an error + # defines the folder, in which the data from the spectrometer is temporarily stored in temp_folder_path = "C:/Users/localadmin/Desktop/Users/Lukas/B_Field_Dump" @@ -838,8 +840,11 @@ def b_field_rotation(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.R write_no_echo(instr1, f'RATE 0 {min_range_lst[0]};RATE 1 {min_range_lst[1]}') write_no_echo(instr2, f'RATE 0 {min_range_lst[0]};RATE 1 {min_range_lst[1]}') - write_no_echo(instr1, f'CHAN 2;ULIM {Babs*10};SWEEP UP') # sets to B_x, the B_x upper limit and sweeps the magnet field to the upper limit - print(f'SWEEPING B-X TO {Babs} T NOW') + if Babs <= BX_MAX: + write_no_echo(instr1, f'CHAN 2;ULIM {Babs*10};SWEEP UP') # sets to B_x, the B_x upper limit and sweeps the magnet field to the upper limit + print(f'SWEEPING B-X TO {Babs} T NOW') + else: + raise ValueError(f'{Babs=}T value exceeds the max limit of the Bx field {BX_MAX}T!') # wait for Babs to be reached by the Bx field actual_bval = sep_num_from_units(query_no_echo(instr1, 'IMAG?'))[0]*0.1 # convert kG to T @@ -961,7 +966,7 @@ def b_field_rotation(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.R wl = np.array(loaded_files.wavelength) np.savetxt("Wavelength.txt", wl) - # TODO: data struct of device_target_values is not correct + # NOTE: data struct of device_target_values is a list of dictionaries, where each dictionary contains the target values for each device device_target_values = [{'2301034': bval[0], '2101014': bval[1]} for bval in cartesian_coords] # call the helper function to carry out the rotation/measurement of spectrum @@ -972,8 +977,50 @@ def b_field_rotation(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.R # b_sweep_val and implement it in this function def sweep_b_angle(instr1:pyvisa.resources.Resource, instr2:pyvisa.resources.Resource, min_bval:float, max_bval:float, res:float, - Settings:str, clockwise=True, base_file_name='', zerowhenfin_bool=False): - pass + Settings:str, clockwise=True, base_file_name='', + reversescan_bool=False, zerowhenfin_bool=False, loopscan_bool=False): + + # defines the folder, in which the data from the spectrometer is temporarily stored in + temp_folder_path = "C:/Users/localadmin/Desktop/Users/Lukas/B_Field_Dump" + # temp_folder_path = "C:/Users/localadmin/Desktop/Users/Lukas/2024_02_08_Map_test" + + if base_file_name =='': + base_file_name = datetime.datetime.now().strftime('%Y_%m_%d_%H.%M') + + start_time = time.time() # start of the scan function + + startangle = startangle % 360 + endangle = endangle % 360 # ensures that the angles are within [0,360) + + idnstr1 = query_no_echo(instr1, '*IDN?') + idnstr2 = query_no_echo(instr2, '*IDN?') + + intensity_data = [] # To store data from each scan + cwd = os.getcwd() # save original directory + + # find which one is the dual power supply, then, ramp B_x to Babs value + if '2301034' in idnstr1: # serial no. the dual power supply + pass + elif '2101034' in idnstr2: + # swap instruments, instr 1 to be the dual power supply (^= x-axis) + instr1, instr2 = instr2, instr1 + + # save initial low and high sweep limits of each device, and set them back after the rotation + instr1_bsettings = list(sep_num_from_units(el) for el in query_no_echo(instr1, 'UNITS?;LLIM?;ULIM?').split(';')) # deliver a 3 element tuple of tuples containing the set unit, llim and ulim + instr2_bsettings = list(sep_num_from_units(el) for el in query_no_echo(instr2, 'UNITS?;LLIM?;ULIM?').split(';')) # deliver a 3 element tuple of tuples containing the set unit, llim and ulim + if instr1_bsettings[0][0] == 'T': + instr1_bsettings[1][0] = instr1_bsettings[1][0]*0.1 # rescale kG to T, device accepts values only in kG or A, eventho we set it to T + instr1_bsettings[2][0] = instr1_bsettings[2][0]*0.1 + if instr2_bsettings[0][0] == 'T': + instr2_bsettings[1][0] = instr2_bsettings[1][0]*0.1 # rescale kG to T, device accepts values only in kG or A, eventho we set it to T + instr2_bsettings[2][0] = instr2_bsettings[2][0]*0.1 + + # initialise the sweep angle list as well as the sweep limits and directions for each instrument + instr1_lim, instr2_lim = 'LLIM', 'ULIM' + instr1_sweep, instr2_sweep = 'DOWN', 'UP' + + # TODO: see later parts of b_field_rotation from line 820 onwards, and see if same logic can be applied here + ################################################################# END OF FUNCTION DEFS ###########################################################################################