Commit 38bcc0ba authored by Nicolas Nunez Barreto's avatar Nicolas Nunez Barreto

muchas cosas cambiaron mi joven padawan

parent d816ca59
import numpy as np
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
class PMTCalibration(EnvExperiment):
"""Blinking script plotting for pmt calibration """
def build(self):
self.setattr_device("ccb")
self.setattr_device("scheduler")
self.setattr_device("core")
self.pmt = self.get_device("ttl0")
self.laserUV = UrukulCh(self, ch=2, freq=110.0, amp=0.3, name="UV") #corresponde a 0.7 Vpp
self.laserIR = UrukulCh(self, ch=1, freq=208.0, amp=0.35, name="IR") #corresponde a 0.8 Vpp
self.setattr_argument(f"t_readout",
NumberValue(100*ms, unit='ms', scale=ms, min=1*ms),
"PMT Calibration")
@rpc
def create_datasets(self):
self.set_dataset("pmt_counts_on", np.zeros(1, dtype=int), broadcast=True, archive=False)
self.set_dataset("pmt_counts_off", np.zeros(1, dtype=int), broadcast=True, archive=False)
@rpc
def create_applets(self):
self.ccb.issue("create_applet", "calibration_pmt_blinking",
"${python} -m pyLIAF.artiq.applets.realtime "
"200 "
"pmt_counts_on "
"--y2 pmt_counts_off")
@kernel
def init_kernel(self):
self.core.reset()
self.laserIR.initialize_channel()
self.laserUV.initialize_channel()
self.pmt.input()
delay(10*us)
self.laserIR.set_channel()
self.laserUV.set_channel()
self.core.wait_until_mu(now_mu())
delay(1*ms)
self.laserIR.on()
self.laserUV.on()
def run(self):
self.create_datasets()
self.create_applets()
self.init_kernel()
try:
while True:
self.measure_counts()
while self.scheduler.check_pause():
print("PAUSED BLINKING")
self.core.comm.close()
self.scheduler.pause()
# TODO: reset freqs/amps
print("RESUMED BLINKING")
except TerminationRequested:
self.cleanup()
print("STOPPED BLINKING")
@kernel
def readout(self):
"""Registro de cuentas emitidas"""
here = self.pmt.gate_rising(self.t_readout)
cuentas = self.pmt.count(here)
delay(1*us)
return cuentas
@kernel
def measure_counts(self):
self.core.break_realtime()
self.laserUV.on()
self.laserIR.off()
self.mutate_dataset("pmt_counts_off", 0, self.readout())
at_mu(self.core.get_rtio_counter_mu() + 10000)
self.laserIR.on()
self.mutate_dataset("pmt_counts_on", 0, self.readout())
@kernel
def cleanup(self):
self.core.break_realtime()
self.laserIR.off()
self.laserUV.off()
...@@ -92,7 +92,7 @@ class PMTCalibration(EnvExperiment): ...@@ -92,7 +92,7 @@ class PMTCalibration(EnvExperiment):
@rpc(flags={"async"}) @rpc(flags={"async"})
def measure_PD(self, dump=False): def measure_PD(self, dump=False):
value = rpi.ReadPD_average_pi(0, 1) value = rpi.ReadPD_average_pi(2, 1)
#print(type(value)) #print(type(value))
if not dump: if not dump:
self.mutate_dataset("Current_PD", 0, np.abs(value)) self.mutate_dataset("Current_PD", 0, np.abs(value))
......
import numpy as np
from time import sleep
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
#from pyLIAF.RedPitaya import Read_analog as rp
from pyLIAF.RaspberryPi.PD_reader import PDreader as rpi
from scipy import interpolate
class IR_LaserPowerCalibration_BS(EnvExperiment):
"""Multiple powers - Binary search - IR Laser power calibration with photodiode and a raspberry pi """
def build(self):
self.setattr_device("ccb")
self.setattr_device("scheduler")
self.setattr_device("core")
self.laserIR = UrukulCh(self, ch=1, freq=208.0, amp=0.3, name="IR") #corresponde a 0.7 Vpp
self.setattr_argument("Target_PD_Value", NumberValue(0.4, min=0.01, max=3), "Calibration_parameters")
self.setattr_argument("Max_amplitude", NumberValue(0.30, min=0.01, max=0.35), "Calibration_parameters")
self.setattr_argument("Min_amplitude", NumberValue(0.01, min=0.01, max=0.35), "Calibration_parameters")
#self.setattr_argument("tolerance", NumberValue(0.005, max=0.5), "Calibration_parameters")
self.setattr_argument("Calibration_freqs_IR", Scannable(
default=CenterScan(208*MHz, 10*MHz, 0.1*MHz),
unit="MHz",
scale=MHz,
global_min = 1*MHz,
global_max = 400*MHz
)
)
@rpc
def create_datasets(self):
#self.set_dataset("PD_UV_counts", list(np.zeros(len(self.Calibration_freqs.sequence)*len(self.Calibration_amps.sequence), dtype=int)), broadcast=True, archive=True)
self.set_dataset("Current_PD_IR", np.array([0.05]), broadcast=True, archive=False)
self.set_dataset("Calibration_freqs", self.Calibration_freqs_IR.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_freqs_IR", self.Calibration_freqs_IR.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_amps_IR", np.zeros(len(self.Calibration_freqs_IR.sequence), dtype=float), broadcast=True, archive=True)
@rpc(flags={"async"})
def create_applets(self):
self.ccb.issue("create_applet", "IR_powercalibration_BS",
"${python} -m pyLIAF.artiq.applets.plot_xy "
"Experiment_amps_IR "
"--x Calibration_freqs")
@rpc(flags={"async"})
def Binary_Search(self, pd_value, initial_amplitude, final_amplitude, current_freq):
mid_amplitude = round(0.5*(initial_amplitude+final_amplitude), 4)
#print(f'mid_amplitude: {mid_amplitude}')
if abs(initial_amplitude - mid_amplitude) < 0.00001 or abs(final_amplitude - mid_amplitude) < 0.00001:
#print('toco un borde jejox')
return mid_amplitude
#else:
if mid_amplitude > self.Max_amplitude or mid_amplitude < self.Min_amplitude:
print('Pusiste al reves los limites')
raise
self.change_frequency(current_freq, mid_amplitude)
#self.measure_PD(dump=True)
self.measure_PD()
measured_PD = self.get_dataset("Current_PD_IR")[0]
if np.abs(measured_PD - pd_value) > 0.00005:
if measured_PD > pd_value:
return self.Binary_Search(pd_value, initial_amplitude, mid_amplitude, current_freq)
elif measured_PD < pd_value:
return self.Binary_Search(pd_value, mid_amplitude, final_amplitude, current_freq)
else:
#print('no se, fijate, paso algo')
return 0
else:
return mid_amplitude
@rpc(flags={"async"})
def measure_PD(self, dump=False): #este dump esta al pedo, habra que sacarlo en el futuro
value = rpi.ReadPD_average_pi(0, 1)
print(value)
if not dump:
self.mutate_dataset(f"Current_PD_IR", 0, np.abs(value))
@kernel
def init_kernel(self):
self.core.reset()
delay(1*ms)
self.core.break_realtime()
#self.laserIR.initialize_channel()
delay(100*us)
self.laserIR.set_channel()
self.core.wait_until_mu(now_mu())
delay(1*ms)
self.laserIR.on()
@kernel
def change_frequency(self, freq, amp):
self.core.break_realtime()
delay(50*ms)
self.laserIR.set_frequency(freq, amp)
delay(50*ms)
def run(self):
self.create_datasets()
self.create_applets()
self.init_kernel()
i = 0
self.measure_PD(dump=True)
initial_amplitude = self.Min_amplitude
final_amplitude = self.Max_amplitude
initial_PD = self.Target_PD_Value
for freq in self.Calibration_freqs_IR.sequence:
self.change_frequency(freq, initial_amplitude)
#self.measure_PD(dump=True)
calibrated_amplitude = self.Binary_Search(initial_PD, initial_amplitude, final_amplitude, freq)
print(f'Done freq {freq}')
self.mutate_dataset("Experiment_amps_IR", i, calibrated_amplitude)
#initial_amplitude = calibrated_amplitude-0.1
#final_amplitude = calibrated_amplitude+0.1
i = i + 1
import numpy as np
from time import sleep
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
from pyLIAF.RedPitaya import Read_analog as rp
from scipy import interpolate
class IR_LaserPowerCalibration_BS(EnvExperiment):
"""Binary search - IR Laser power calibration with photodiode and a red pitaya """
def build(self):
self.setattr_device("ccb")
self.setattr_device("scheduler")
self.setattr_device("core")
self.setattr_argument("Calibration_freqs_IR", Scannable(
default=CenterScan(208*MHz, 10*MHz, 0.1*MHz),
unit="MHz",
scale=MHz,
global_min = 1*MHz,
global_max = 400*MHz
)
)
@rpc
def create_datasets(self):
#self.set_dataset("PD_UV_counts", list(np.zeros(len(self.Calibration_freqs.sequence)*len(self.Calibration_amps.sequence), dtype=int)), broadcast=True, archive=True)
self.set_dataset("Current_PD_IR", np.array([0.05]), broadcast=True, archive=False)
self.set_dataset("Calibration_freqs", self.Calibration_freqs_IR.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_freqs_IR_final", self.Calibration_freqs_IR.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_amps_IR_final", np.zeros(len(self.Calibration_freqs_IR.sequence), dtype=float), broadcast=True, archive=True)
@rpc(flags={"async"})
def run(self):
Calibrated_Experiment_freqs = self.get_dataset("Experiment_freqs_IR")
Calibrated_Experiment_amps = list(self.get_dataset("Experiment_amps_IR"))
def run(self):
self.create_datasets()
self.init_kernel()
import numpy as np
from time import sleep
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
from pyLIAF.RedPitaya import Read_analog as rp
from scipy import interpolate
class LaserPowerCalibration(EnvExperiment):
"""Testing UV Laser power calibration with photodiode and a red pitaya """
def build(self):
self.setattr_device("ccb")
self.setattr_device("scheduler")
self.setattr_device("core")
self.laserUV = UrukulCh(self, ch=2, freq=110.0, amp=0.3, name="UV") #corresponde a 0.7 Vpp
@rpc
def create_datasets(self):
self.Test_Experiment_freqs = self.get_dataset("Experiment_freqs")
self.Test_Experiment_amps = self.get_dataset("Experiment_amps")
self.set_dataset("Test_Experiment_freqs", self.Test_Experiment_freqs, broadcast=True, archive=True)
self.set_dataset("Test_Experiment_amps", self.Test_Experiment_amps, broadcast=True, archive=True)
self.set_dataset("Test_Measured_PD_UV_counts", list(np.zeros(len(self.Test_Experiment_freqs), dtype=int)), broadcast=True, archive=True)
@rpc(flags={"async"})
def create_applets(self):
self.ccb.issue("create_applet", "verification_powercalibration",
"${python} -m pyLIAF.artiq.applets.plot_xy "
"Test_Measured_PD_UV_counts "
"--x Test_Experiment_freqs")
"""
@rpc(flags={"async"})
def measure_PD(self, i):
#sleep(1)
value = rp.ReadVoltage()
print(np.abs(value))
self.mutate_dataset("Test_Measured_PD_UV_counts", i, np.abs(value))
"""
@rpc(flags={"async"})
def measure_PD(self, i, dump=False):
if not self.RPstatus:
self.rp_s = rp.Initiate_comm()
self.RPstatus = True
value = rp.ReadVoltage(self.rp_s)
print(value)
if not dump:
self.mutate_dataset(f"Test_Measured_PD_UV_counts", i, np.abs(value))
@kernel
def init_kernel(self):
self.core.reset()
self.laserUV.initialize_channel()
delay(10*us)
self.laserUV.set_channel()
self.core.wait_until_mu(now_mu())
delay(1*ms)
self.laserUV.on()
@kernel
def change_frequency(self, freq, amp):
self.core.break_realtime()
delay(50*ms)
self.laserUV.set_frequency(freq, amp)
delay(50*ms)
def run(self):
self.create_datasets()
self.create_applets()
self.init_kernel()
self.RPstatus = False
self.No_freqs = len(self.Test_Experiment_freqs)
i = 0
self.measure_PD(0, dump=True)
for amp, freq in zip(self.Test_Experiment_amps, self.Test_Experiment_freqs):
print(amp, freq)
#self.change_frequency(freq, 0.12)
self.change_frequency(freq, amp)
self.measure_PD(0, dump=True)
self.measure_PD(i)
i = i + 1
import numpy as np
from time import sleep
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
from pyLIAF.RedPitaya import Read_analog as rp
from scipy import interpolate
class InvLaserPowerCalibration(EnvExperiment):
"""INVERSED UV Laser power calibration with photodiode and a red pitaya """
def build(self):
self.setattr_device("ccb")
self.setattr_device("scheduler")
self.setattr_device("core")
self.laserUV = UrukulCh(self, ch=2, freq=110.0, amp=0.3, name="UV") #corresponde a 0.7 Vpp
self.setattr_argument("Do_calibration", BooleanValue(False), "Calibration_parameters")
self.setattr_argument("Calibration_PD_Value", NumberValue(0.2, min=0.01, max=0.5, ndecimals=5), "Calibration_parameters")
self.setattr_argument("Calibration_freqs", Scannable(
default=CenterScan(110*MHz, 10*MHz, 0.1*MHz),
unit="MHz",
scale=MHz,
global_min = 1*MHz,
global_max = 400*MHz
)
)
self.setattr_argument("Calibration_amps", Scannable(
default=CenterScan(0.2, 0.1, 0.01),
global_min = 0,
global_max = 0.3
)
)
# self.setattr_argument("Experiment_frequencies", Scannable(
# default=CenterScan(110*MHz, 10*MHz, 0.1*MHz),
# unit="MHz",
# scale=MHz,
# global_min = 1*MHz,
# global_max = 400*MHz
# )
# )
@rpc
def create_datasets(self):
if self.Do_calibration:
self.set_dataset("PD_UV_counts", list(np.zeros(len(self.Calibration_freqs.sequence)*len(self.Calibration_amps.sequence), dtype=int)), broadcast=True, archive=True)
self.set_dataset("Calibration_freqs", len(self.Calibration_amps.sequence)*self.Calibration_freqs.sequence, broadcast=True, archive=True)
self.set_dataset("Calibration_amps", self.Calibration_amps.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_freqs", self.Calibration_freqs.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_amps", np.zeros(len(self.Calibration_freqs.sequence), dtype=float), broadcast=True, archive=True)
@rpc(flags={"async"})
def create_applets(self):
self.ccb.issue("create_applet", "powercalibration",
"${python} -m pyLIAF.artiq.applets.plot_xy "
"PD_UV_counts "
"--x Calibration_freqs")
@rpc(flags={"async"})
def RemoveZeros(calib, freqs):
i, j = 0, 1
new_calib = calib
while i < len(calib):
if new_calib[0] == 0:
new_calib = new_calib[1:]
i = i + 1
else:
init_len = len(new_calib)
final_calib = new_calib
while j < init_len:
if final_calib[-1] == 0:
final_calib = final_calib[:-1]
j = j + 1
else:
if j == 1:
return freqs[i:], final_calib
else:
return freqs[i:-j+1], final_calib
@rpc(flags={"async"})
def Calibrate_amplitudes(self):
Interpolation_functions = []
PD_UV_counts = self.get_dataset("PD_UV_counts")
n = len(self.Calibration_freqs.sequence)
PD_split = np.matrix([PD_UV_counts[i * n:(i + 1) * n] for i in range((len(PD_UV_counts) + n - 1) // n )])
PD_T = np.transpose(PD_split)
amps = self.Calibration_amps.sequence
for i in range(len(PD_T)):
#PD_values = np.array(PD_T[i][0])[0]
PD_values = np.array(PD_T[i])[0]
f = interpolate.interp1d(PD_values, amps, kind='linear')
Interpolation_functions.append(f)
Calibration_PD_Value = self.Calibration_PD_Value
Calibrated_Amplitudes = []
for fi in Interpolation_functions:
try:
Calibrated_Amplitudes.append(float(fi(Calibration_PD_Value)))
except:
Calibrated_Amplitudes.append(0)
print('no, rey')
#Freqs_withoutZeros, Calibs_withoutZeros = RemoveZeros(Calibs, freqs)
Function_Calibs_vs_freq = interpolate.interp1d(self.Calibration_freqs.sequence, Calibrated_Amplitudes, kind='linear')
i = 0
for freq in self.Calibration_freqs.sequence:
calibamp = Function_Calibs_vs_freq(freq)
print(calibamp)
self.mutate_dataset("Experiment_amps", i, calibamp)
i = i + 1
print('okarda con la calibreta')
@rpc(flags={"async"})
def Calibrate_amplitudes_v2(self):
Interpolation_functions = []
PD_UV_counts = self.get_dataset("PD_UV_counts")
n = len(self.Calibration_freqs.sequence)
PD_split = np.matrix([PD_UV_counts[i * n:(i + 1) * n] for i in range((len(PD_UV_counts) + n - 1) // n )])
PD_T = PD_split
#PD_T = PD_split
amps = self.Calibration_amps.sequence
Calibration_PD_Value = self.Calibration_PD_Value
Calibrated_Amplitudes = []
for i in range(len(PD_T)):
PD_values = np.array(PD_T[i])[0]
print(len(PD_values))
print(len(amps))
j = 0
while j < len(PD_values):
if PD_values[j] < Calibration_PD_Value:
j = j + 1
elif PD_values[j] > Calibration_PD_Value:
Calibrated_Amplitudes.append(amps[j])
break
else:
Calibrated_Amplitudes.append(0)
print('malardo')
break
i = 0
for i in range(len(Calibrated_Amplitudes)):
self.mutate_dataset("Experiment_amps", i, Calibrated_Amplitudes[i])
i = i + 1
print('okarda con la calibreta')
@rpc(flags={"async"})
def measure_PD(self, i):
value = rp.ReadVoltage()
print(value)
if i%self.No_freqs == 0:
sleep(0.3)
value = rp.ReadVoltage()
sleep(0.3)
print(f"Corrected value: {value}")
self.mutate_dataset(f"PD_UV_counts", i, np.abs(value))
@kernel
def init_kernel(self):
self.core.reset()
self.laserUV.initialize_channel()
delay(10*us)
self.laserUV.set_channel()
self.core.wait_until_mu(now_mu())
delay(1*ms)
self.laserUV.on()
@kernel
def change_frequency(self, freq, amp):
self.core.break_realtime()
delay(50*ms)
self.laserUV.set_frequency(freq, amp)
#def GetTargetAmplitude(self, amplitudes, PD_values, i):
#f = interpolate.interp1d(amplitudes, PD_values)
#amplitudes_interpoladas = np.arange()
def run(self):
self.create_datasets()
self.create_applets()
self.init_kernel()
self.No_freqs = len(self.Calibration_freqs.sequence)
i = 0
if self.Do_calibration:
print('Usaremos mediciones nuevas')
for freq in self.Calibration_freqs.sequence:
print(freq)
for amp in self.Calibration_amps.sequence:
self.change_frequency(freq, amp)
self.measure_PD(i)
i = i + 1
self.Calibrate_amplitudes()
else:
print('Usando mediciones ya hechas')
self.Calibrate_amplitudes_v2()
import numpy as np
from time import sleep
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
from pyLIAF.RedPitaya import Read_analog as rp
from scipy import interpolate
class LaserPowerCalibration_v2(EnvExperiment):
"""V2 - Binary search - UV Laser power calibration with photodiode and a red pitaya """
def build(self):
self.setattr_device("ccb")
self.setattr_device("scheduler")
self.setattr_device("core")
self.laserUV = UrukulCh(self, ch=2, freq=110.0, amp=0.3, name="UV") #corresponde a 0.7 Vpp
self.setattr_argument("Target_PD_Value", NumberValue(0.2, min=0.01, max=0.5), "Calibration_parameters")
self.setattr_argument("Max_amplitude", NumberValue(0.25, min=0.01, max=0.5), "Calibration_parameters")
self.setattr_argument("Min_amplitude", NumberValue(0.01, min=0.01, max=0.5), "Calibration_parameters")
self.setattr_argument("tolerance", NumberValue(0.005, max=0.5), "Calibration_parameters")
self.setattr_argument("Calibration_freqs", Scannable(
default=CenterScan(110*MHz, 10*MHz, 0.1*MHz),
unit="MHz",
scale=MHz,
global_min = 1*MHz,
global_max = 400*MHz
)
)
@rpc
def create_datasets(self):
#self.set_dataset("PD_UV_counts", list(np.zeros(len(self.Calibration_freqs.sequence)*len(self.Calibration_amps.sequence), dtype=int)), broadcast=True, archive=True)
self.set_dataset("Current_PD_UV", np.array([0.05]), broadcast=True, archive=False)
self.set_dataset("Calibration_freqs", self.Calibration_freqs.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_freqs", self.Calibration_freqs.sequence, broadcast=True, archive=True)
self.set_dataset("Experiment_amps", np.zeros(len(self.Calibration_freqs.sequence), dtype=float), broadcast=True, archive=True)
@rpc(flags={"async"})
def create_applets(self):
self.ccb.issue("create_applet", "v2_powercalibration",
"${python} -m pyLIAF.artiq.applets.plot_xy "
"Experiment_amps "
"--x Calibration_freqs")
@rpc(flags={"async"})
def Binary_Search(self, pd_value, initial_amplitude, final_amplitude, current_freq):
mid_amplitude = round(0.5*(initial_amplitude+final_amplitude), 4)
print(f'mid_amplitude: {mid_amplitude}')
if abs(initial_amplitude - mid_amplitude) < 0.00001 or abs(final_amplitude - mid_amplitude) < 0.00001:
print('toco un borde jejox')
return mid_amplitude
#else:
if mid_amplitude > self.Max_amplitude or mid_amplitude < self.Min_amplitude:
raise
self.change_frequency(current_freq, mid_amplitude)
self.measure_PD()
measured_PD = self.get_dataset("Current_PD_UV")[0]
if np.abs(measured_PD - pd_value) > 0.0005:
if measured_PD > pd_value:
return self.Binary_Search(pd_value, initial_amplitude, mid_amplitude, current_freq)
elif measured_PD < pd_value:
return self.Binary_Search(pd_value, mid_amplitude, final_amplitude, current_freq)
else:
print('no se, fijate, paso algo')
return 0
else:
return mid_amplitude
@rpc(flags={"async"})
def measure_PD(self):
value = rp.ReadVoltage()
print(np.abs(value))
self.mutate_dataset(f"Current_PD_UV", 0, np.abs(value))
@kernel
def init_kernel(self):
self.core.reset()
delay(1*ms)
self.core.break_realtime()
self.laserUV.initialize_channel()
delay(100*us)
self.laserUV.set_channel()
self.core.wait_until_mu(now_mu())
delay(1*ms)
self.laserUV.on()
@kernel
def change_frequency(self, freq, amp):
self.core.break_realtime()
delay(50*ms)
self.laserUV.set_frequency(freq, amp)
delay(10*ms)
def run(self):
self.create_datasets()
self.create_applets()
self.init_kernel()
i = 0
initial_amplitude = self.Min_amplitude
final_amplitude = self.Max_amplitude
initial_PD = self.Target_PD_Value
for freq in self.Calibration_freqs.sequence:
self.change_frequency(freq, initial_amplitude)
calibrated_amplitude = self.Binary_Search(initial_PD, initial_amplitude, final_amplitude, freq)
print(f'Done freq {freq}')
self.mutate_dataset("Experiment_amps", i, calibrated_amplitude)
#initial_amplitude = calibrated_amplitude-0.1
#final_amplitude = calibrated_amplitude+0.1
i = i + 1
...@@ -9,8 +9,8 @@ PORT = 60000 ...@@ -9,8 +9,8 @@ PORT = 60000
PASS = b'Secr3t Pa55W0rd' PASS = b'Secr3t Pa55W0rd'
from multiprocessing.connection import Client from multiprocessing.connection import Client
class IR_Scan_withcal_optimized(EnvExperiment): class IR_Scan_DCvoltages(EnvExperiment):
"""Can change dc voltages - Two IR lasers - IR frequency sweep with calibration - First N freqs, then change freq - Optimized delays""" """IR scan with DC voltages changes ability"""
def build(self): def build(self):
# Agrego kernel invariants a ver si mejoro algo de la performance # Agrego kernel invariants a ver si mejoro algo de la performance
kernel_invariants = getattr(self, 'kernel_invariants', set()) kernel_invariants = getattr(self, 'kernel_invariants', set())
......
...@@ -8,8 +8,8 @@ PORT = 60000 ...@@ -8,8 +8,8 @@ PORT = 60000
PASS = b'Secr3t Pa55W0rd' PASS = b'Secr3t Pa55W0rd'
from multiprocessing.connection import Client from multiprocessing.connection import Client
class IR_Scan_withcal_optimized(EnvExperiment): class IR_Scan_Heating(EnvExperiment):
"""Full heating - Two IR lasers - With heating stage - IR frequency sweep with calibration - First N freqs, then change freq - Optimized delays""" """IR scan with FULL heating stage (blue-detuned UV laser or turning off lasers)"""
def build(self): def build(self):
# Agrego kernel invariants a ver si mejoro algo de la performance # Agrego kernel invariants a ver si mejoro algo de la performance
kernel_invariants = getattr(self, 'kernel_invariants', set()) kernel_invariants = getattr(self, 'kernel_invariants', set())
......
...@@ -9,8 +9,8 @@ PORT = 60000 ...@@ -9,8 +9,8 @@ PORT = 60000
PASS = b'Secr3t Pa55W0rd' PASS = b'Secr3t Pa55W0rd'
from multiprocessing.connection import Client from multiprocessing.connection import Client
class IR_Scan_withcal_optimized_andor(EnvExperiment): class IR_Scan_andor(EnvExperiment):
"""Andor measurement - Two IR lasers - IR frequency sweep with calibration - First N freqs, then change freq - Optimized delays""" """IR scan with detection by Andor camera"""
def build(self): def build(self):
# Agrego kernel invariants a ver si mejoro algo de la performance # Agrego kernel invariants a ver si mejoro algo de la performance
kernel_invariants = getattr(self, 'kernel_invariants', set()) kernel_invariants = getattr(self, 'kernel_invariants', set())
......
...@@ -6,8 +6,8 @@ import numpy as np ...@@ -6,8 +6,8 @@ import numpy as np
class IR_Scan_withcal_optimized(EnvExperiment): class IR_Scan_simple(EnvExperiment):
"""Two IR lasers - IR frequency sweep with calibration - First N freqs, then change freq - Optimized delays""" """Simple IR scan"""
def build(self): def build(self):
# Agrego kernel invariants a ver si mejoro algo de la performance # Agrego kernel invariants a ver si mejoro algo de la performance
kernel_invariants = getattr(self, 'kernel_invariants', set()) kernel_invariants = getattr(self, 'kernel_invariants', set())
......
...@@ -9,7 +9,7 @@ PASS = b'Secr3t Pa55W0rd' ...@@ -9,7 +9,7 @@ PASS = b'Secr3t Pa55W0rd'
from multiprocessing.connection import Client from multiprocessing.connection import Client
class IR_Scan_withcal_optimized(EnvExperiment): class IR_Scan_withcal_optimized(EnvExperiment):
"""Two IR lasers - With heating stage - IR frequency sweep with calibration - First N freqs, then change freq - Optimized delays""" """IR scan with heating stage"""
def build(self): def build(self):
# Agrego kernel invariants a ver si mejoro algo de la performance # Agrego kernel invariants a ver si mejoro algo de la performance
kernel_invariants = getattr(self, 'kernel_invariants', set()) kernel_invariants = getattr(self, 'kernel_invariants', set())
......
...@@ -7,7 +7,7 @@ import numpy as np ...@@ -7,7 +7,7 @@ import numpy as np
class UV_Scan_withcalib_Haeffner(EnvExperiment): class UV_Scan_withcalib_Haeffner(EnvExperiment):
"""Alternating lasers - With Calib - UV frequency sweep - First N freqs, then change freq - Haeffner algorithm: measures only with UV laser on, after preparing S state""" """ UV frequency sweep - Haeffner algorithm (measures only with UV laser on, after preparing S state)"""
def build(self): def build(self):
# Agrego kernel invariants a ver si mejoro algo de la performance # Agrego kernel invariants a ver si mejoro algo de la performance
kernel_invariants = getattr(self, 'kernel_invariants', set()) kernel_invariants = getattr(self, 'kernel_invariants', set())
......
...@@ -216,7 +216,6 @@ class UV_Scan_withcalib_bothlaserson(EnvExperiment): ...@@ -216,7 +216,6 @@ class UV_Scan_withcalib_bothlaserson(EnvExperiment):
delay(self.t_cool) delay(self.t_cool)
else: else:
delay(50*us) delay(50*us)
#self.prep_S()
cuentas = self.readout(runN) # Hago la medicion y vuelvo con las cuentas cuentas = self.readout(runN) # Hago la medicion y vuelvo con las cuentas
Accumulated_counts = Accumulated_counts + cuentas Accumulated_counts = Accumulated_counts + cuentas
self.mutate_dataset("counts_spectrum", iter_index, Accumulated_counts) self.mutate_dataset("counts_spectrum", iter_index, Accumulated_counts)
...@@ -256,10 +255,7 @@ class UV_Scan_withcalib_bothlaserson(EnvExperiment): ...@@ -256,10 +255,7 @@ class UV_Scan_withcalib_bothlaserson(EnvExperiment):
self.core.break_realtime() self.core.break_realtime()
self.core.wait_until_mu(now_mu()) self.core.wait_until_mu(now_mu())
@kernel
def prep_S(self):
pass
"""Preparo el estado S prendiendo solamente el laser IR"""
@kernel @kernel
def readout(self, runN) -> TInt64: def readout(self, runN) -> TInt64:
......
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 3 15:38:39 2024
@author: liaf-ankylosaurus-admin
"""
import numpy as np
from artiq.experiment import *
from time import sleep
#from pyLIAF.GenFunc.generador import Generador
PORT = 60000
PASS = b'Secr3t Pa55W0rd'
from multiprocessing.connection import Client
class InOut(EnvExperiment):
"""
Long trapping
"""
def build(self):
self.setattr_device("core")
self.setattr_device("ccb")
self.ttl0 = self.get_device("ttl0")
self.ttl4 = self.get_device("ttl4")
self.setattr_argument(f"t_med",
NumberValue(300*ms, unit='ms', scale=ms, min=0.1*ms, max=1000*ms),
"Experiment params")
self.setattr_argument("t_exp",
NumberValue(200*s, unit='s', scale=s, min=5*s, max=3000*s),
"Experiment params")
self.setattr_argument("N_ions_objective",
NumberValue(1, min=1, max=1000, ndecimals=0, step=1),
"Experiment params")
self.setattr_argument("Measurement_type",
EnumerationValue(["finite_time", "indefinite_time"]),
"Scan params")
@rpc
def initialize_tca_com(self):
address = ('localhost', PORT)
self.conn = Client(address, authkey=PASS)
sleep(0.1)
@rpc
def blinkRF(self,cmd='turnOnOffRF'):
self.conn.send(f'{cmd} blink')
rta = self.conn.recv()
@rpc(flags={"async"})
def create_datasets(self):
self.set_dataset('time', [], broadcast=True, archive=True)
self.set_dataset('counts', [], broadcast=True, archive=True)
self.set_dataset('counts_indefinite',np.array([0.0]), broadcast=True, archive=False)
self.set_dataset("N_ions", [], broadcast=False, archive=True)
@rpc(flags={"async"})
def create_applets(self):
self.ccb.issue("create_applet", "longtrapping",
"${python} -m pyLIAF.artiq.applets.plot_xy "
"counts "#Tiene que estar el espacio!!!
"--x time") #Aca habria que definir bien el vector que se use en el eje x
@rpc
def Varianza(self,sig) -> TList(TFloat):
ruido=np.std(sig)
print(ruido)
return [ruido]
@kernel
def run(self):
self.initialize_tca_com()
#Preparamos las variables y los graficos
self.create_datasets()
self.create_applets()
#Se prenden los "canales" a usar
self.core.reset()
self.ttl4.output()
self.ttl0.input()
self.ttl4.on()
delay(20*ms) # time for the artiq init.
if self.Measurement_type=="indefinite_time":
while True:
cuentas=self.ttl0.gate_rising(self.t_med)
cuentas=self.ttl0.count(cuentas)
self.mutate_dataset("counts_indefinite",0,cuentas)
print(cuentas)
self.core.break_realtime()
else:
sig=[]
for i in range(int(3/self.t_med)):
cuentas=self.ttl0.gate_rising(self.t_med)
sig=sig+[self.ttl0.count(cuentas)]
self.append_to_dataset("counts",sig[-1])
self.append_to_dataset("time",i/int(self.t_exp/self.t_med))
self.core.break_realtime()
ruido=self.Varianza(sig)[0]
delay(20*ms)
for i in range(int(3/self.t_med),int(self.t_exp/self.t_med)):
cuentas=self.ttl0.gate_rising(self.t_med)
cuentas=self.ttl0.count(cuentas)
self.append_to_dataset("counts",cuentas)
self.append_to_dataset("time",i/int(self.t_exp/self.t_med))
print(cuentas)
self.core.break_realtime()
start_time = now_mu() # Record the start timeself.core.break_realtime()
self.core.break_realtime()
...@@ -3,21 +3,53 @@ from artiq.experiment import * ...@@ -3,21 +3,53 @@ from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh from pyLIAF.artiq.controllers import UrukulCh
class PMTCalibration(EnvExperiment): class IonVibration(EnvExperiment):
"""BOTH - Blinking script plotting for pmt calibration - Plots the abs Fluo, and the Signal to Background ratio""" """Spectroscopic measurement of possible ion vibration"""
def build(self): def build(self):
self.setattr_device("ccb") self.setattr_device("ccb")
self.setattr_device("scheduler") self.setattr_device("scheduler")
self.setattr_device("core") self.setattr_device("core")
self.pmt = self.get_device("ttl0") self.pmt = self.get_device("ttl0")
self.led = self.get_device("ttl6")
self.laserUV = UrukulCh(self, ch=2, freq=110.0, amp=0.3, name="UV") #corresponde a 0.7 Vpp self.laserUV = UrukulCh(self, ch=2, freq=110.0, amp=0.3, name="UV") #corresponde a 0.7 Vpp
self.laserIR = UrukulCh(self, ch=1, freq=208.0, amp=0.35, name="IR") #corresponde a 0.8 Vpp self.laserIR = UrukulCh(self, ch=1, freq=208.0, amp=0.35, name="IR") #corresponde a 0.8 Vpp
self.setattr_argument(f"t_readout", self.setattr_argument(f"t_readout",
NumberValue(100*ms, unit='ms', scale=ms, min=1*ms), NumberValue(300*ms, unit='ms', scale=ms, min=1*ms),
"PMT Calibration") "Trapping")
self.setattr_argument(f"blinkfrequency",
NumberValue(50*Hz, unit='Hz', scale=Hz, min=1*Hz),
"Trapping")
self.setattr_argument(f"on_time",
NumberValue(0.1, min=0, max=1),
"Trapping")
self.setattr_argument("laserblinker",
EnumerationValue(["IR", "UV"]),
"Trapping")
self.setattr_argument("Blink", BooleanValue(1==0), "Trapping")
self.setattr_argument(f"UV_freq",
NumberValue(110*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
"Lasers")
self.setattr_argument(f"UV_amp",
NumberValue(0.18, min=0.000, max=0.300, step=0.001),
"Lasers")
self.setattr_argument(f"IR_freq",
NumberValue(229*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
"Lasers")
self.setattr_argument(f"IR_amp",
NumberValue(0.29, min=0.000, max=0.300, step=0.001),
"Lasers")
@rpc @rpc
def create_datasets(self): def create_datasets(self):
...@@ -27,15 +59,25 @@ class PMTCalibration(EnvExperiment): ...@@ -27,15 +59,25 @@ class PMTCalibration(EnvExperiment):
@rpc @rpc
def create_applets(self): def create_applets(self):
self.ccb.issue("create_applet", "ON_OFF_calibration_pmt_blinking",
"${python} -m pyLIAF.artiq.applets.realtime " if self.Blink:
"200 " self.ccb.issue("create_applet", "Trapping_on_off",
"pmt_counts_on " "${python} -m pyLIAF.artiq.applets.realtime "
"--y2 pmt_counts_off") "400 "
"pmt_counts_on "
"--y2 pmt_counts_off")
else:
self.ccb.issue("create_applet", "Monitoring_fluorescence",
"${python} -m pyLIAF.artiq.applets.realtime_lines "
"400 "
"pmt_counts_on "
"--y2 pmt_counts_off")
self.ccb.issue("create_applet", "DIFF_calibration_pmt_blinking", self.ccb.issue("create_applet", "DIFF_calibration_pmt_blinking",
"${python} -m pyLIAF.artiq.applets.realtime " "${python} -m pyLIAF.artiq.applets.realtime "
"200 " "40 "
"pmt_counts_diff") "pmt_counts_diff")
@kernel @kernel
...@@ -49,11 +91,14 @@ class PMTCalibration(EnvExperiment): ...@@ -49,11 +91,14 @@ class PMTCalibration(EnvExperiment):
#self.laserIR.channel.init() #self.laserIR.channel.init()
#self.laserUV.initialize_channel() #self.laserUV.initialize_channel()
self.led.output()
self.pmt.input() self.pmt.input()
delay(1000*us) delay(1000*us)
self.laserIR.set_channel() self.laserIR.set_channel()
self.laserUV.set_channel() self.laserUV.set_channel()
...@@ -63,8 +108,14 @@ class PMTCalibration(EnvExperiment): ...@@ -63,8 +108,14 @@ class PMTCalibration(EnvExperiment):
self.laserIR.on() self.laserIR.on()
self.laserUV.on() self.laserUV.on()
delay(1000*us)
def run(self): self.laserIR.set_frequency(self.IR_freq, self.IR_amp, profile=0)
self.laserUV.set_frequency(self.UV_freq, self.UV_amp, profile=0)
delay(1000*us)
def runt(self):
self.create_datasets() self.create_datasets()
self.create_applets() self.create_applets()
self.init_kernel() self.init_kernel()
...@@ -82,6 +133,41 @@ class PMTCalibration(EnvExperiment): ...@@ -82,6 +133,41 @@ class PMTCalibration(EnvExperiment):
self.cleanup() self.cleanup()
print("STOPPED BLINKING") print("STOPPED BLINKING")
def run(self):
self.create_datasets()
self.create_applets()
self.init_kernel()
print('este')
# print(period_off)
self.core.break_realtime()
self.blinkear()
@kernel
def blinkear(self):
period = 1/self.blinkfrequency
period_on = self.on_time*period
#print(period_on)
period_off = (1-self.on_time)*period
#print(period_off)
self.core.break_realtime()
while True:
if self.Blink:
if self.laserblinker == "IR":
self.laserIR.off()
delay(period_off)
self.laserIR.on()
delay(period_on)
else:
self.laserUV.off()
delay(period_off)
self.laserUV.on()
delay(period_on)
@kernel @kernel
def readout(self): def readout(self):
"""Registro de cuentas emitidas""" """Registro de cuentas emitidas"""
...@@ -94,20 +180,29 @@ class PMTCalibration(EnvExperiment): ...@@ -94,20 +180,29 @@ class PMTCalibration(EnvExperiment):
@kernel @kernel
def measure_counts(self): def measure_counts(self):
self.core.break_realtime()
self.laserUV.on()
self.laserIR.off()
delay(10*us)
counts_off = self.readout()
self.mutate_dataset("pmt_counts_off", 0, counts_off)
at_mu(self.core.get_rtio_counter_mu() + 10000)
self.laserIR.on()
delay(10*us) period = 1/self.blinkfrequency
counts_on = self.readout()
self.mutate_dataset("pmt_counts_on", 0, counts_on) period_on = self.on_time*period
at_mu(self.core.get_rtio_counter_mu() + 10000) print(period_on)
self.mutate_dataset("pmt_counts_diff", 0, counts_on/counts_off) period_off = (1-self.on_time)*period
print(period_off)
self.core.break_realtime()
#self.laserUV.on()
if self.Blink:
if self.laserblinker == "IR":
self.laserIR.off()
delay(period_off)
self.laserIR.on()
delay(period_on)
else:
self.laserUV.off()
delay(period_off)
self.laserUV.on()
delay(period_on)
@kernel @kernel
def cleanup(self): def cleanup(self):
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment