Skip to content
Beam_profile.py 8.59 KiB
Newer Older
Nicolas Nunez Barreto's avatar
tod
Nicolas Nunez Barreto committed
from artiq.experiment import *
from pyLIAF.artiq.controllers import UrukulCh
#from artiq.coredevice.ad9910 import PHASE_MODE_ABSOLUTE
import time
import numpy as np
from time import sleep

import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('10.99.34.95', 6001)
 

class FrontalBeamProfile(EnvExperiment):
    """Sweeps picomotor of frontal IR beam and measures fluorescence retrieving beam profile"""
    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(f"IR2_freq",
                              NumberValue(85*MHz, unit='MHz', scale=MHz, min=1*MHz, max=400*MHz),
                             "Measurement params")

        self.setattr_argument(f"IR2_amp",
                              NumberValue(0.3, min=0., max=0.8),
                             "Measurement params")

        self.setattr_argument(f"t_readout",
                              NumberValue(300*ms, unit='ms', scale=ms, min=1*ms),
                             "Measurement params")


        self.setattr_argument(f"IR2_final_freq",
                              NumberValue(85*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.35),
                             "Final params")


        self.setattr_argument("Channel",
                                  EnumerationValue(["1", "2"]),
                              "Motor params")

        self.setattr_argument(f"Steps",
                              NumberValue(50, min=-1000, max=1000),
                             "Motor params")

        self.setattr_argument(f"Measurements",
                              NumberValue(100, min=1, max=100000),
                             "Motor params")


        self.setattr_argument("Return", BooleanValue(1==0), "Motor params")

        self.setattr_argument("Comments", StringValue(" "), "General comments")



    @rpc
    def create_datasets(self):


        #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("IR2_freq", self.IR2_freq, broadcast=False, archive=True)
        self.set_dataset("IR2_amp", self.IR2_amp, broadcast=False, archive=True)

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

        self.set_dataset("Channel", self.Channel, broadcast=False, archive=True)
        self.set_dataset("Steps", self.Steps, broadcast=False, archive=True)
        self.set_dataset("Measurements", self.Measurements, broadcast=False, archive=True)


        self.set_dataset("array_steps", np.linspace(0,int(self.Steps*self.Measurements),int(self.Measurements)), broadcast=True, archive=True)
        self.set_dataset("counts_spectrum", np.zeros(int(self.Measurements), dtype=int), broadcast=True, archive=True)

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



    @rpc(flags={"async"})
    def create_applets(self):

        self.ccb.issue("create_applet", "Beam_profile",
                        "${python} -m pyLIAF.artiq.applets.plot_xy "
                        "counts_spectrum "
                        "--x array_steps")

    @rpc
    def initialize_motor_com(self):
        client_socket.connect(address)
        print('motor comm initialized')
        sleep(1)

    @rpc
    def change_motor_value(self):
        client_socket.sendall(f"{self.Channel} {int(self.Steps)}".encode())
             
        response = client_socket.recv(1024)
        sleep(0.2)


    @rpc
    def end_motor_com(self):
        client_socket.sendall(b'exit')
         
        response = client_socket.recv(1024)
        print(response.decode())
         
        client_socket.close()        

        print('todo concluye al fin')        

    @rpc
    def return_motor_value(self):
        client_socket.sendall(f"{self.Channel} {-1*int(self.Steps)}".encode())
             
        response = client_socket.recv(1024)
        sleep(0.2)


    @kernel
    def run(self):

        self.initialize_motor_com()

        #t_cool_mu = self.core.seconds_to_mu(self.t_cool) # Precomputo esto para despues

        self.create_datasets()
        self.create_applets()
        #self.init_kernel()
        delay(10*ms)

#        self.laserIR2.on()



        for runN in range(int(self.Measurements)):
            delay(10*ms)
            self.change_motor_value()
            cuentas = self.readout() # Hago la medicion y vuelvo con las cuentas
            self.mutate_dataset("counts_spectrum", runN, cuentas)

        if self.Return:
            for runN in range(int(self.Measurements)):
                delay(10*ms)
                self.return_motor_value()
                #cuentas = self.readout() # Hago la medicion y vuelvo con las cuentas
                #self.mutate_dataset("counts_spectrum", runN, cuentas)



        self.core.break_realtime()
        delay(50*ms)


        self.end_motor_com()

        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 y el 2 va a ser de CALENTAMIENTO
        #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.laserUV.set_frequency(self.UV_CPT_freq, 0.07, 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)
        #self.laserTISA.set_frequency(self.TISA_CPT_freq, 0.035, profile=1)
        self.core.break_realtime()
        #self.laserIR1.set_channel(profile=2)
        #self.core.break_realtime()
        #self.laserUV.set_channel(profile=2)
        #self.core.break_realtime()
        #self.laserIR2.set_channel(profile=2)
        #self.core.break_realtime()
        #self.laserIR2shift.set_channel(profile=2)
        #self.core.break_realtime()
        #self.laserIR1.set_frequency(self.IR1_cooling_freq, self.IR1_cooling_amp, profile=2)
        #self.core.break_realtime()
        #self.laserIR2shift.set_frequency(270*MHz, 0.7, profile=2)
        #self.core.break_realtime()
        #self.laserUV.set_frequency(self.UV_cooling_freq, self.UV_cooling_amp, profile=2)
        #self.core.break_realtime()
        #self.laserIR2.set_frequency(self.IR2_cooling_freq, self.IR2_cooling_amp, profile=2)

        # Me aseguro que todo termine antes de seguir
        self.core.break_realtime()
        self.core.wait_until_mu(now_mu())


    @kernel
    def readout(self) -> TInt64:
        """Registro de cuentas emitidas"""
        self.core.break_realtime()        
        delay(50*ms)
        here = self.pmt.gate_rising(self.t_readout) # Que mida durante t_readout

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