Skip to content
HeatingRateMeasurement.py 13 KiB
Newer Older
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
#from artiq.coredevice.ad9910 import PHASE_MODE_ABSOLUTE
import time
import numpy as np



class HeatingRate(EnvExperiment):
    """Heating Rate _ Two IR lasers"""
    def build(self):
        # Agrego kernel invariants a ver si mejoro algo de la performance
        kernel_invariants = getattr(self, 'kernel_invariants', set())
        self.kernel_invariants = kernel_invariants | {"no_measures", "t_cool", "t_trans", "t_readout"}

        self.setattr_device("core")
        self.setattr_device("ccb")

        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.laserIR1 = UrukulCh(self, ch=1, freq=208.0, amp=0.35, name="IR1") #corresponde a 0.8 Vpp
        self.laserIR2 = UrukulCh(self, ch=3, freq=80.0, amp=0.2, name="IR2") #corresponde a 0.8 Vpp
        self.laserIR2shift = UrukulCh(self, ch=0, freq=270.0, amp=0.7, name="IR2shift") #corresponde a 0.8 Vpp

        self.setattr_argument("Fine_scan", BooleanValue(1==0), "Experiment params")

        self.setattr_argument("no_measures",
                              NumberValue(2000, min=1, ndecimals=0, step=1),
                              "Experiment params")

        self.setattr_argument(f"IR1_cooling_freq",
                              NumberValue(229*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "Cooling params")

        self.setattr_argument(f"IR1_cooling_amp",
                              NumberValue(0.25, min=0.0, max=0.35),
                             "Cooling params")

        self.setattr_argument(f"UV_cooling_freq",
                              NumberValue(112*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "Cooling params")

        self.setattr_argument(f"UV_cooling_amp",
                              NumberValue(0.1, min=0.0, max=0.3),
                             "Cooling params")

        self.setattr_argument(f"IR2_cooling_freq",
                              NumberValue(80*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "Cooling params")

        self.setattr_argument(f"IR2_cooling_amp",
                              NumberValue(0.3, min=0.0, max=0.8),
                             "Cooling params")

        self.setattr_argument(f"UV_CPT_freq",
                              NumberValue(118*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "CPT params")

        self.setattr_argument(f"UV_CPT_amp",
                              NumberValue(0.1, min=0.000, max=0.300, step=0.001),
        self.setattr_argument(f"IR1_CPT_freq",
                              NumberValue(217.9*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "CPT params")

        self.setattr_argument(f"IR1_CPT_amp",
                              NumberValue(0.24, min=0., max=0.8),
                             "CPT params")

        self.setattr_argument(f"IR2_CPT_freq",
                              NumberValue(85*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
        self.setattr_argument(f"IR2_CPT_amp",
                              NumberValue(0.3, min=0., max=0.8),
        self.setattr_argument(f"IR1_final_freq",
                              NumberValue(229*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
        self.setattr_argument(f"IR1_final_amp",
                              NumberValue(0.23, min=0.0, max=0.35),
                             "Final params")

        self.setattr_argument(f"UV_final_freq",
                              NumberValue(115*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "Final params")

        self.setattr_argument(f"UV_final_amp",
                              NumberValue(0.11, min=0.0, max=0.3),
        self.setattr_argument(f"IR2_final_freq",
                              NumberValue(80*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "Final params")

        self.setattr_argument(f"IR2_final_amp",
                              NumberValue(0.3, min=0.0, max=0.8),
                             "Final params")

        self.setattr_argument(f"t_cool",
                              NumberValue(1000*us, unit='us', scale=us, min=1*us),
                             "Experiment params")

        self.setattr_argument(f"t_trans",
                              NumberValue(10*us, unit='us', scale=us, min=1*us),
                             "Experiment params")

        self.setattr_argument(f"t_readout",
                              NumberValue(50*us, unit='us', scale=us, min=1*us),
                             "Experiment params")

        self.setattr_argument("Heating_times", Scannable(
                                        default=CenterScan(1*ms, 10*ms, 0.1*ms),
                                        unit="ms",
                                        scale=ms,
                                        global_min = 0*ms,
                                        global_max = 1000*ms
                                       )
                             )
        self.setattr_argument("Comments", StringValue(" "), "General comments")
        #self.setattr_argument("UV_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("measurements", np.zeros(len(self.UV_Freqs.sequence)*self.no_measures, dtype=int), broadcast=True, archive=True)
        #self.set_dataset("counts_spectrum", np.zeros(len(self.UV_Freqs.sequence), dtype=int), broadcast=True, archive=True)
        #self.set_dataset("UV_frequencies", self.UV_Freqs.sequence, broadcast=True, archive=True)
        #self.set_dataset("UV_amplitudes", self.Test_Experiment_amps, broadcast=True, archive=True)
        #freqs = self.get_dataset("UV_Frequencies")

        self.set_dataset("no_measures", self.no_measures, broadcast=True, archive=True)
        #self.set_dataset("no_frequencies", len(self.UV_Freqs.sequence), broadcast=True, archive=True)

        self.set_dataset("IR1_cooling_freq", self.IR1_cooling_freq, broadcast=False, archive=True)
        self.set_dataset("IR1_cooling_amp", self.IR1_cooling_amp, broadcast=False, archive=True)

        self.set_dataset("UV_cooling_freq", self.UV_cooling_freq, broadcast=False, archive=True)
        self.set_dataset("UV_cooling_amp", self.UV_cooling_amp, broadcast=False, archive=True)

        self.set_dataset("IR2_cooling_freq", self.IR2_cooling_freq, broadcast=False, archive=True)
        self.set_dataset("IR2_cooling_amp", self.IR2_cooling_amp, broadcast=False, archive=True)

        self.set_dataset("UV_CPT_freq", self.UV_CPT_freq, broadcast=False, archive=True)
        self.set_dataset("UV_CPT_amp", self.UV_CPT_amp, broadcast=False, archive=True)

        self.set_dataset("IR1_CPT_freq", self.IR1_CPT_freq, broadcast=False, archive=True)
        self.set_dataset("IR1_CPT_amp", self.IR1_CPT_amp, broadcast=False, archive=True)

        self.set_dataset("IR2_CPT_freq", self.IR2_CPT_freq, broadcast=False, archive=True)
        self.set_dataset("IR2_CPT_amp", self.IR2_CPT_amp, broadcast=False, archive=True)

        self.set_dataset("t_cool", self.t_cool, broadcast=False, archive=True)
        self.set_dataset("t_trans", self.t_trans, broadcast=False, archive=True)
        self.set_dataset("t_readout", self.t_readout, broadcast=False, archive=True)

        self.set_dataset("heating_times", self.Heating_times.sequence, broadcast=True, archive=True)
        self.set_dataset("counts_spectrum", np.zeros(len(self.Heating_times.sequence), dtype=int), broadcast=True, archive=True)

        self.set_dataset("Comments", self.Comments, broadcast=False, archive=True)

        #self.set_dataset("calibration", self.get_dataset())


        #self.laserIR1.generate_dataset()
        #self.laserUV.generate_dataset()

    @rpc(flags={"async"})
    def create_applets(self):
        self.ccb.issue("create_applet", "HeatingRate_plot",
                        "${python} -m pyLIAF.artiq.applets.plot_xy "
                        "counts_spectrum "
                        "--x heating_times")


    @kernel
    def run(self):

        t_cool_mu = self.core.seconds_to_mu(self.t_cool) # Precomputo esto para despues
        cuentas = 0
        self.create_datasets()
        self.create_applets()
        self.init_kernel()
        delay(1*ms)

        times=self.Heating_times.sequence

        self.laserIR1.on()
        self.laserIR2.on()
        self.laserIR2shift.on()
        self.laserUV.on()
        self.enfriar_ion()

        iter_index = 0

        while iter_index < len(times):
            #print(Freqs[iter_index])
            #print(Amps[iter_index])
            Accumulated_counts = 0
            delay(10000*us)
            for runN in range(self.no_measures):
                if runN % 20 == 0:
                    delay(self.t_cool)
                else:
                    delay(100*us)
                self.laserUV.off()
                delay(times[iter_index])
                self.laserUV.on()
                cuentas = self.readout() # Hago la medicion y vuelvo con las cuentas
                Accumulated_counts = Accumulated_counts + cuentas
            self.mutate_dataset("counts_spectrum", iter_index, Accumulated_counts)
            delay(5000*us)
            iter_index = iter_index + 1

        delay(500*us)

        self.laserUV.select_profile(1)
        self.laserIR1.select_profile(1)
        self.laserIR2.select_profile(1)

        self.laserUV.set_frequency(self.UV_final_freq, self.UV_final_amp, profile=1)
        self.laserIR2shift.set_frequency(270*MHz, 0.7, profile=1)
        self.laserIR1.set_frequency(self.IR1_final_freq, self.IR1_final_amp, profile=1)
        self.laserIR2.set_frequency(self.IR2_final_freq, self.IR2_final_amp, profile=1)

        print("jose maria listorti")

    @kernel
    def init_kernel(self):
        self.core.reset()
        self.pmt.input()
        #self.laserUV.initialize_channel()
        #self.laserIR.initialize_channel()
        delay(1*ms)
        # Seteo los perfiles 0 y 1 con los mismos valores
        # el 0 va a ser el de ENFRIADO, el 1 va a ser el de MEDICION
        self.laserIR1.set_channel()
        self.laserUV.set_channel()
        self.laserIR2.set_channel()
        self.laserIR2shift.set_channel()
        self.laserIR1.set_frequency(self.IR1_cooling_freq, self.IR1_cooling_amp, profile=0)
        self.laserIR2shift.set_frequency(270*MHz, 0.7, profile=0)
        self.laserUV.set_frequency(self.UV_cooling_freq, self.UV_cooling_amp, profile=0)
        self.laserIR2.set_frequency(self.IR2_cooling_freq, self.IR2_cooling_amp, profile=0)
        self.laserIR1.set_channel(profile=1)
        self.core.break_realtime()
        self.laserUV.set_channel(profile=1)
        self.core.break_realtime()
        self.laserIR2shift.set_channel(profile=1)
        self.core.break_realtime()
        self.laserIR2.set_channel(profile=1)
        self.core.break_realtime()
        self.laserUV.set_frequency(self.UV_CPT_freq, self.UV_CPT_amp, profile=1)
        self.core.break_realtime()
        self.laserIR1.set_frequency(self.IR1_CPT_freq, self.IR1_CPT_amp, profile=1)
        self.core.break_realtime()
        self.laserIR2.set_frequency(self.IR2_CPT_freq, self.IR2_CPT_amp, profile=1)
        self.core.break_realtime()
        self.laserIR2shift.set_frequency(270*MHz, 0.7, profile=1)
        # Me aseguro que todo termine antes de seguir
        self.core.break_realtime()
        self.core.wait_until_mu(now_mu())


    @kernel
    def enfriar_ion(self):
        """Enfrio llevando el laser IR a una cierta frecuencia"""
        self.laserIR1.select_profile(0) # Pongo el laser en el perfil referencia
        self.laserUV.select_profile(0) # Pongo el laser en el perfil referencia
        self.laserIR2.select_profile(0)
        self.laserIR2shift.select_profile(0)
    @kernel
    def calentar_ion(self):
        """Caliento el ion por un tiempo determinado apagando el laser UV"""
        self.laserUV.off()

    @kernel
    def readout(self) -> TInt64:
        """Registro de cuentas emitidas"""
        self.laserUV.select_profile(1) # Paso al perfil que cambia
        self.laserIR1.select_profile(1) # Paso al perfil que cambia
        self.laserIR2.select_profile(1) # Paso al perfil que cambia
        self.laserIR2shift.select_profile(1)
        delay(self.t_trans)

        here = self.pmt.gate_rising(self.t_readout) # Que mida durante t_readout
        self.enfriar_ion() # ya pongo a enfriar, asi todos los retardos estan enfriando

        return self.pmt.count(here) # recupero las cuentas medidas