Esempio n. 1
0
    def find_amp90_scaling(self,
                           scales=0.5,
                           N_steps=[5, 9],
                           max_n=100,
                           close_fig=True,
                           verbose=False,
                           MC=None,
                           update=True,
                           take_fit_I=False):
        '''
        Finds the scaling factor of pi/2 pulses w.r.t pi pulses using a rabi
        type with each pi pulse replaced by 2 pi/2 pulses.

        If scales is an array it starts by fitting a cos to a Rabi experiment
        to get an initial guess for the amplitude.

        This experiment is only useful after carefully calibrating the pi pulse
        using flipping sequences.
        '''
        if MC is None:
            MC = self.MC
        if np.size(scales) != 1:
            self.measure_rabi_amp90(scales=scales, n=1, MC=MC, analyze=False)
            a = ma.Rabi_Analysis(close_fig=close_fig)
            if take_fit_I:
                scale = abs(a.fit_res[0].params['period'].value) / 2
            else:
                if (a.fit_res[0].params['period'].stderr <=
                        a.fit_res[1].params['period'].stderr):
                    scale = abs(a.fit_res[0].params['period'].value) / 2
                else:
                    scale = abs(a.fit_res[1].params['period'].value) / 2
        else:
            scale = scales
        if verbose:
            print('Initial scaling factor:', scale, '\n')

        for n in N_steps:
            if n > max_n:
                break
            else:
                scale_span = 0.3 * scale / n
                scales = np.linspace(scale - scale_span, scale + scale_span,
                                     15)
                self.measure_rabi_amp90(scales, n=n, MC=MC, analyze=False)
                a = ma.Rabi_parabola_analysis(close_fig=close_fig)
                if take_fit_I:
                    scale = a.fit_res[0].params['x0'].value
                else:
                    if (a.fit_res[0].params['x0'].stderr <=
                            a.fit_res[1].params['x0'].stderr):
                        scale = a.fit_res[0].params['x0'].value
                    else:
                        scale = a.fit_res[1].params['x0'].value
                if verbose:
                    print('Founcaleitude', scale, '\n')
        if update:
            self.amp90_scale(scale)
            print("should be updated")
            print(scale)
Esempio n. 2
0
    def find_pulse_amplitude(self,
                             amps=np.linspace(-.5, .5, 31),
                             N_steps=[3, 7, 13, 17],
                             max_n=18,
                             close_fig=True,
                             verbose=False,
                             MC=None,
                             update=True,
                             take_fit_I=False):
        '''
        Finds the pulse-amplitude using a Rabi experiment.
        Fine tunes by doing a Rabi around the optimum with an odd
        multiple of pulses.

        Args:
            amps: (array or float) amplitudes of the first Rabi if an array,
                if a float is specified it will be treated as an estimate
                for the amplitude to be found.
            N_steps: (list of int) number of pulses used in the fine tuning
            max_n: (int) break of if N> max_n
        '''
        if MC is None:
            MC = self.MC.get_instr()
        if np.size(amps) != 1:
            ampl = self.calibrate_pulse_amplitude_coarse(amps=amps,
                                                         close_fig=close_fig,
                                                         verbose=verbose,
                                                         MC=MC,
                                                         update=update,
                                                         take_fit_I=take_fit_I)
        else:
            ampl = amps
        if verbose:
            print('Initial Amplitude:', ampl, '\n')

        for n in N_steps:
            if n > max_n:
                break
            else:
                old_amp = ampl
                ampl_span = 0.5 * ampl / n
                amps = np.linspace(ampl - ampl_span, ampl + ampl_span, 15)
                self.measure_rabi(amps, n=n, MC=MC, analyze=False)
                a = ma.Rabi_parabola_analysis(close_fig=close_fig)
                # Decide which quadrature to take by comparing the contrast
                if take_fit_I:
                    ampl = a.fit_res[0].params['x0'].value
                elif (np.abs(
                        max(a.measured_values[0]) -
                        min(a.measured_values[0]))) > (np.abs(
                            max(a.measured_values[1]) -
                            min(a.measured_values[1]))):
                    ampl = a.fit_res[0].params['x0'].value
                else:
                    ampl = a.fit_res[1].params['x0'].value
                if not min(amps) < ampl < max(amps):
                    ampl_span *= 2
                    amps = np.linspace(old_amp - ampl_span,
                                       old_amp + ampl_span, 15)
                    self.measure_rabi(amps, n=n, MC=MC, analyze=False)
                    a = ma.Rabi_parabola_analysis(close_fig=close_fig)
                    # Decide which quadrature to take by comparing the contrast
                    if take_fit_I:
                        ampl = a.fit_res[0].params['x0'].value
                    elif (np.abs(
                            max(a.measured_values[0]) -
                            min(a.measured_values[0]))) > (np.abs(
                                max(a.measured_values[1]) -
                                min(a.measured_values[1]))):
                        ampl = a.fit_res[0].params['x0'].value
                    else:
                        ampl = a.fit_res[1].params['x0'].value
                if verbose:
                    print('Found amplitude', ampl, '\n')
        if update:
            self.Q_amp180.set(ampl)
        return ampl