Exemple #1
0
class SwitchingAWG(Procedure):
    """Simple square pulse switching, to and fro, using only AWG pulses."""

    # Parameters
    attempt_number = IntParameter("Switching attempts", default=1024, abstract=True)
    field_setpoint = FloatParameter("Field Setpoint", unit="G")
    pulse_voltage  = FloatParameter("Pulse Amplitude", unit="V")
    pulse_duration = FloatParameter("Pulse Duration", unit="s")

    # Instrument resources
    bop  = BOP2020M("GPIB0::1::INSTR")
    lock = SR865("USB0::0xB506::0x2000::002638::INSTR")
    hp   = HallProbe("calibration/HallProbe.cal", lock.set_ao1, lock.get_ai1)
    mag  = Electromagnet('calibration/GMW.cal', hp.get_field, bop.set_current, bop.get_current)
    pspl = Picosecond10070A("GPIB0::24::INSTR")

    # Quantities
    field = Quantity("Field", unit="G")

    # Traces
    raw_trace = Trace("P")

    # Filters
    clusterer   = Clusterer(input=raw_trace)
    probability = CollapseProbability(input=clusterer)



    def init_instruments(self):

        # AWG Initialization
        arb.set_output(True, channel=1)
        arb.set_output(False, channel=2)
        arb.sample_freq = 12.0e9
        arb.waveform_output_mode = "WSPEED"

        arb.abort()
        arb.delete_all_waveforms()
        arb.reset_sequence_table()

        arb.set_output_route("DC", channel=1)
        arb.voltage_amplitude = 1.0

        arb.set_marker_level_low(0.0, channel=1, marker_type="sync")
        arb.set_marker_level_high(1.5, channel=1, marker_type="sync")

        arb.continuous_mode = False
        arb.gate_mode = False
        arb.sequence_mode = "SCENARIO"
        arb.scenario_advance_mode = "SINGLE"
Exemple #2
0
class MeasureLockinVoltage(Procedure):
    set_field = FloatParameter(name="Set Field", unit="G")
    field = Quantity(name="Field", unit="G")
    voltage = Quantity(name="Magnitude", unit="V")

    bop = BOP2020M("GPIB0::1::INSTR")
    lock = SR830("GPIB0::9::INSTR")
    hp = HallProbe("calibration/HallProbe.cal", lock.set_ao1, lock.get_ai1)
    mag = Electromagnet('calibration/GMW.cal', hp.get_field, bop.set_current,
                        bop.get_current)

    def init_instruments(self):
        self.tc_delay = self.lock.measure_delay()
        self.averages = 10

        def lockin_measure():
            time.sleep(self.tc_delay)
            vals = []
            for i in range(self.averages):
                vals.append(self.lock.r)
            return np.mean(vals)

        self.set_field.assign_method(self.mag.set_field)
        self.field.assign_method(self.mag.get_field)
        self.voltage.assign_method(lockin_measure)

        for param in self._parameters:
            self._parameters[param].push()

    def run(self):
        """This is run for each step in a sweep."""
        for param in self._parameters:
            self._parameters[param].push()
        for quant in self._quantities:
            self._quantities[quant].measure()
        logging.info("Field, Lockin Magnitude: {:f}, {:g}".format(
            self.field.value, self.voltage.value))

    def shutdown_instruments(self):
        self.bop.current = 0.0
Exemple #3
0
    pulse_points = int(duration*sample_rate)

    if pulse_points < 320:
        wf = np.zeros(320)
    else:
        wf = np.zeros(64*np.ceil(pulse_points/64.0))
    wf[:pulse_points] = amplitude
    return wf

if __name__ == '__main__':
    arb  = KeysightM8190A("192.168.5.108")
    # lock = SR830("GPIB0::9::INSTR")
    lock = SR865("USB0::0xB506::0x2000::002638::INSTR")
    bop  = BOP2020M("GPIB0::1::INSTR")
    hp   = HallProbe("calibration/HallProbe.cal", lock.set_ao1, lock.get_ai1)
    mag  = Electromagnet('calibration/GMW.cal', hp.get_field, bop.set_current, bop.get_current)

    print(arb.interface.query("*IDN?"))
    # arb.interface.write("*RST")
    # time.sleep(2)
    # arb.interface.query("*OPC?")

    arb.set_output(True, channel=1)
    arb.set_output(False, channel=2)
    arb.sample_freq = 12.0e9
    arb.waveform_output_mode = "WSPEED"

    arb.abort()
    arb.delete_all_waveforms()
    arb.reset_sequence_table()
Exemple #4
0
class SwitchingPSPL(Procedure):

    # instrument_settings = {"lock":{"amp":0.1, "freq":167}}

    # These don't correspond to actual instrument parameters, and are thus "abstract"
    attempt_number             = IntParameter("Switching Attempt Index", abstract=True)
    middle_voltage             = FloatParameter("Middle Voltage Value", unit="V", abstract = True)
    high_probability_duration  = FloatParameter("High Probability Duration", unit="s", abstract=True)
    initialization_probability = FloatParameter("Initialization Probability", default=1.0, abstract=True)
    resistance_averages        = IntParameter("Resistance Averages", default=2, abstract=True)

    # These do correspond to instrument parameters
    field_setpoint             = FloatParameter("Field Setpoint", unit="G")
    pulse_voltage              = FloatParameter("Pulse Amplitude", unit="V")
    pulse_duration             = FloatParameter("Pulse Duration", unit="s")

    # Quantities to be measured
    field         = Quantity("Field", unit="G")
    initial_state = Quantity("Initial Voltage", unit="V")
    final_state   = Quantity("Final Voltage", unit="V")

    # Instrument resources
    bop  = BOP2020M("Kepco Power Supply", "GPIB1::1::INSTR")
    lock = SR830("Lockin Amplifier", "GPIB1::9::INSTR")
    hp   = HallProbe("calibration/HallProbe.cal", lock.set_ao1, lock.get_ai1)
    mag  = Electromagnet('calibration/GMW.cal', hp.get_field, bop.set_current, bop.get_current)
    pspl = Picosecond10070A("Pulse Generator", "GPIB1::24::INSTR")

    def init_instruments(self):
        self.tc_delay = self.lock.measure_delay()
        self.pspl.output = True

        def lockin_measure_initial():
            if np.random.random() <= self.initialization_probability.value:
                self.pspl.duration = self.high_probability_duration.value
                time.sleep(0.09) # Required to let the duration settle
                self.pspl.trigger()
                self.pspl.duration = self.pulse_duration.value
                time.sleep(0.09) # Required to let the duration settle
            time.sleep(self.tc_delay)
            return np.mean( [self.lock.r for i in range(self.resistance_averages.value)] )

        def lockin_measure_final():
            self.pspl.trigger()
            time.sleep(self.tc_delay)
            return np.mean( [self.lock.r for i in range(self.resistance_averages.value)] )

        # Associate quantities and parameters with their respective methods
        self.field_setpoint.assign_method(lambda x: setattr(self.mag, 'field', x))
        self.field.assign_method(lambda : getattr(self.mag, 'field'))
        self.initial_state.assign_method(lockin_measure_initial)
        self.final_state.assign_method(lockin_measure_final)
        self.pulse_voltage.assign_method(self.pspl.set_amplitude)
        self.pulse_duration.assign_method(self.pspl.set_duration)

        def find_reset_duration():
            # Search over pulse durations for highest probability reversal
            logging.warning("Finding optimal duration for this pulse amplitude...")

            num_pulses = 40
            durs = np.linspace(0.15e-9, 1.0e-9, 10)
            probs = []

            for dur in durs:
                self.pspl.duration = dur
                ivs = []
                fvs = []
                for i in range(num_pulses):
                    time.sleep(self.tc_delay)
                    v_initial = np.mean( [self.lock.r for i in range(self.resistance_averages.value)] )
                    ivs.append(v_initial)
                    self.pspl.trigger()
                    time.sleep(self.tc_delay)
                    v_final = np.mean( [self.lock.r for i in range(self.resistance_averages.value)] )
                    fvs.append(v_final)
                ivs = np.array(ivs)
                fvs = np.array(fvs)
                initial_states = (ivs-self.middle_voltage.value) > 0.0
                final_states = (fvs-self.middle_voltage.value) > 0.0
                switched = np.logical_xor(initial_states, final_states)
                num_attempts_APtoP = np.sum(initial_states > 0)
                num_attempts_PtoAP = np.sum(initial_states == 0)
                switched_APtoP = np.sum( np.logical_and(switched, initial_states) )
                switched_PtoAP = np.sum( np.logical_and(switched, np.logical_not(initial_states)) )
                if num_attempts_APtoP == 0:
                    prob_APtoP = 0.0
                else:
                    prob_APtoP = switched_APtoP/num_attempts_APtoP
                if num_attempts_PtoAP == 0:
                    prob_PtoAP = 0.0
                else:
                    prob_PtoAP = switched_PtoAP/num_attempts_PtoAP
                probs.append(0.5*(prob_PtoAP + prob_APtoP))
                logging.warning("Found probability {:f} for duration {:g}".format(probs[-1], dur))

            # Set the reset duration to the best available average probability
            self.high_probability_duration.value = durs[np.argmax(probs)]
            self.initialization_probability.value = 0.5/np.max(probs)
            logging.warning("Best probability {:f}".format(self.initialization_probability.value))
            logging.warning("Selected duration {:g}".format(self.high_probability_duration.value))

            # Reset the PSPL to the original duration
            self.pspl.duration = self.pulse_duration.value

        self.pulse_voltage.add_post_push_hook(find_reset_duration)

        for param in self._parameters:
            logging.warning("Pushing parameter {:s}".format(self._parameters[param].name))
            self._parameters[param].push()

    def shutdown_instruments(self):
        self.bop.current = 0.0
        self.pspl.output = False

    def run(self):
        self.initial_state.measure()
        self.final_state.measure()