def __init__(self, path='', prefix='Histogram_Hetero', config_file='..\\config.json', use_cal=False, **kwargs):

        Experiment.__init__(self, path=path, prefix=prefix, config_file=config_file, **kwargs)

        self.extra_args={}

        for key, value in kwargs.items():
            self.extra_args[key] = value
            #print str(key) + ": " + str(value)

        if 'liveplot_enabled' in self.extra_args:
            self.liveplot_enabled = self.extra_args['liveplot_enabled']
        else:
            self.liveplot_enabled = False

        if 'data_prefix' in self.extra_args:
            data_prefix = self.extra_args['data_prefix']
        else:
            data_prefix = prefix

        if 'prep_tek2' in self.extra_args:
            self.prep_tek2 = self.extra_args['prep_tek2']
        else:
            self.prep_tek2 = False

        if 'adc' in self.extra_args:
            self.adc = self.extra_args['adc']
        else:
            self.adc = None

        if 'data_file' in self.extra_args:
            self.data_file = self.extra_args['data_file']
        else:
            self.data_file = None

        if 'flux_freq' in self.extra_args:
            self.flux_freq = self.extra_args['flux_freq']
        else:
            self.flux_freq = None

        self.prefix = prefix
        self.expt_cfg_name = prefix.lower()

        #self.pre_run = pre_run
        #self.post_run = post_run

        self.pulse_type = self.cfg[self.expt_cfg_name]['pulse_type']

        self.pulse_sequence = HistogramSequence(self.cfg['awgs'], self.cfg[self.expt_cfg_name], self.cfg['readout'],self.cfg['pulse_info'][self.pulse_type],self.cfg['buffer'], self.cfg)
        self.pulse_sequence.build_sequence()
        self.pulse_sequence.write_sequence(os.path.join(self.path, '../sequences/'), prefix, upload=True)

        self.expt_pts = self.pulse_sequence.histo_pts

        self.cfg['alazar']['samplesPerRecord'] = 2 ** (self.cfg['readout']['width'] - 1).bit_length()
        self.cfg['alazar']['recordsPerBuffer'] = self.pulse_sequence.sequence_length*self.cfg[self.expt_cfg_name]['hw_repeats']
        # self.cfg['alazar']['recordsPerAcquisition'] = int(
        #     self.pulse_sequence.sequence_length * self.cfg[self.expt_cfg_name]['repeats']* max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.cfg['alazar']['recordsPerAcquisition'] = int(self.pulse_sequence.sequence_length * self.cfg[self.expt_cfg_name]['hw_repeats']* max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.ready_to_go = True
        return
class HistogramHeteroExperiment(Experiment):
    def __init__(self, path='', prefix='Histogram_Hetero', config_file='..\\config.json', use_cal=False, **kwargs):

        Experiment.__init__(self, path=path, prefix=prefix, config_file=config_file, **kwargs)

        self.extra_args={}

        for key, value in kwargs.items():
            self.extra_args[key] = value
            #print str(key) + ": " + str(value)

        if 'liveplot_enabled' in self.extra_args:
            self.liveplot_enabled = self.extra_args['liveplot_enabled']
        else:
            self.liveplot_enabled = False

        if 'data_prefix' in self.extra_args:
            data_prefix = self.extra_args['data_prefix']
        else:
            data_prefix = prefix

        if 'prep_tek2' in self.extra_args:
            self.prep_tek2 = self.extra_args['prep_tek2']
        else:
            self.prep_tek2 = False

        if 'adc' in self.extra_args:
            self.adc = self.extra_args['adc']
        else:
            self.adc = None

        if 'data_file' in self.extra_args:
            self.data_file = self.extra_args['data_file']
        else:
            self.data_file = None

        if 'flux_freq' in self.extra_args:
            self.flux_freq = self.extra_args['flux_freq']
        else:
            self.flux_freq = None

        self.prefix = prefix
        self.expt_cfg_name = prefix.lower()

        #self.pre_run = pre_run
        #self.post_run = post_run

        self.pulse_type = self.cfg[self.expt_cfg_name]['pulse_type']

        self.pulse_sequence = HistogramSequence(self.cfg['awgs'], self.cfg[self.expt_cfg_name], self.cfg['readout'],self.cfg['pulse_info'][self.pulse_type],self.cfg['buffer'], self.cfg)
        self.pulse_sequence.build_sequence()
        self.pulse_sequence.write_sequence(os.path.join(self.path, '../sequences/'), prefix, upload=True)

        self.expt_pts = self.pulse_sequence.histo_pts

        self.cfg['alazar']['samplesPerRecord'] = 2 ** (self.cfg['readout']['width'] - 1).bit_length()
        self.cfg['alazar']['recordsPerBuffer'] = self.pulse_sequence.sequence_length*self.cfg[self.expt_cfg_name]['hw_repeats']
        # self.cfg['alazar']['recordsPerAcquisition'] = int(
        #     self.pulse_sequence.sequence_length * self.cfg[self.expt_cfg_name]['repeats']* max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.cfg['alazar']['recordsPerAcquisition'] = int(self.pulse_sequence.sequence_length * self.cfg[self.expt_cfg_name]['hw_repeats']* max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.ready_to_go = True
        return


    def go(self):
        if self.liveplot_enabled:
            self.plotter.clear()

        print("Prep Instruments")
        self.readout.set_frequency(self.cfg['readout']['frequency'])
        self.readout.set_power(self.cfg['readout']['power'])
        self.readout.set_ext_pulse(mod=self.cfg['readout']['mod'])

        self.drive.set_frequency(self.cfg['qubit']['frequency'] - self.cfg['pulse_info'][self.pulse_type]['iq_freq'])
        self.drive.set_power(self.cfg[self.expt_cfg_name]['power'])
        self.drive.set_ext_pulse(mod=self.cfg['drive']['mod'])
        self.drive.set_output(True)

        try:
            self.awg.set_amps_offsets(self.cfg['cal']['iq_amps'], self.cfg['cal']['iq_offsets'])
        except:
            print("self.awg not loaded.")

        print("Prep Card")
        adc = Alazar(self.cfg['alazar'])

        heterodyne_carrier_freq = self.cfg['readout']['heterodyne_carrier_freq']
        heterodyne_read_freqs = self.cfg['readout']['heterodyne_read_freq']

        attenpts = arange(self.cfg[self.expt_cfg_name]['atten_start'], self.cfg[self.expt_cfg_name]['atten_stop'], self.cfg[self.expt_cfg_name]['atten_step'])
        freqpts = arange(self.cfg[self.expt_cfg_name]['freq_start'], self.cfg[self.expt_cfg_name]['freq_stop'], self.cfg[self.expt_cfg_name]['freq_step'])
        num_bins = self.cfg[self.expt_cfg_name]['num_bins']

        ss_cos_data_all = zeros((2, len(attenpts), len(freqpts), len(self.expt_pts),
                             self.cfg['alazar']['recordsPerAcquisition'] / len(self.expt_pts))
                            )  # (channel, atten, freq, g/e/(f), average)
        ss_sin_data_all = zeros((2, len(attenpts), len(freqpts), len(self.expt_pts),
                                 self.cfg['alazar']['recordsPerAcquisition'] / len(self.expt_pts))
                                )  # (channel, atten, freq, g/e/(f), average)

        for xx, atten in enumerate(attenpts):
            #self.im.atten.set_attenuator(atten)
            try:
                self.readout_atten.set_attenuator(atten)
            except:
                print("Digital attenuator not loaded.")

            max_contrast_data = zeros((2,len(freqpts)))

            if self.liveplot_enabled:
                self.plotter.clear('max contrast')

            for yy, freq in enumerate(freqpts):
                self.readout.set_frequency(freq-self.cfg['readout']['heterodyne_freq'])
                #self.readout_shifter.set_phase(self.cfg['readout']['start_phase'] , freq)
                self.readout_shifter.set_phase((self.cfg['readout']['start_phase'] + self.cfg['readout']['phase_slope'] * (freq - self.cfg['readout']['frequency']))%360, freq)

                ss_data = zeros((len(self.expt_pts), num_bins))
                sss_data = zeros((len(self.expt_pts), num_bins))

                print("runnning atten no.", xx, ", freq no.", yy)

                single_data1, single_data2, single_record1, single_record2 = \
                    adc.acquire_singleshot_heterodyne_data(self.cfg['readout']['heterodyne_freq'],\
                                                       prep_function=self.awg_prep, start_function=self.awg_run, excise=self.cfg['readout']['window'])

                ss_cos_data_all[0, xx, yy, :, :] = reshape(single_data1[0], (self.cfg['alazar']['recordsPerAcquisition'] / len(self.expt_pts), len(self.expt_pts))).T
                ss_cos_data_all[1, xx, yy, :, :] = reshape(single_data2[0], (self.cfg['alazar']['recordsPerAcquisition'] / len(self.expt_pts), len(self.expt_pts))).T
                ss_sin_data_all[0, xx, yy, :, :] = reshape(single_data1[1], (self.cfg['alazar']['recordsPerAcquisition'] / len(self.expt_pts), len(self.expt_pts))).T
                ss_sin_data_all[1, xx, yy, :, :] = reshape(single_data2[1], (self.cfg['alazar']['recordsPerAcquisition'] / len(self.expt_pts), len(self.expt_pts))).T

                with self.datafile() as f:
                    f.add('ss_cos_data_ch1', ss_cos_data_all[0])
                    f.add('ss_cos_data_ch2', ss_cos_data_all[1])
                    f.add('ss_sin_data_ch1', ss_sin_data_all[0])
                    f.add('ss_sin_data_ch2', ss_sin_data_all[1])
                    f.append_line('single_record1', single_record1)
                    f.append_line('single_record2', single_record2)
                    f.close()

                if self.cfg['readout']['heterodyne_freq']==0:
                    # ch1 cos, ch2 cos
                    ss1 = single_data1[0]
                    ss2 = single_data2[0]
                else:
                    # ch1 cos, ch1 sin
                    ss1 = single_data1[0]
                    ss2 = single_data1[1]

                for kk, ssthis in enumerate([ss1, ss2]):

                    ssthis = reshape(ssthis, (self.cfg['alazar']['recordsPerAcquisition'] / len(self.expt_pts), len(self.expt_pts))).T

                    print('ss i/q ch', str(kk+1), 'max/min =', ssthis.max(), ssthis.min())
                    dist = ssthis.max() - ssthis.min()
                    histo_range = (ssthis.min() - 0.01*dist, ssthis.max() + 0.01*dist)

                    for jj, ss in enumerate(ssthis):
                        sshisto, ssbins = np.histogram(ss, bins=num_bins, range=histo_range)
                        ss_data[jj] += sshisto
                        sss_data[jj] = cumsum(ss_data[[jj]])
                        if self.liveplot_enabled:
                            self.plotter.plot_xy('histogram %d' % jj, ssbins[:-1], ss_data[jj])
                            self.plotter.plot_xy('cum histo %d' % jj, ssbins[:-1], sss_data[jj])

                    max_contrast_data[kk, yy] = abs(((sss_data[0] - sss_data[1]) / ss_data[0].sum())).max()

                    if self.liveplot_enabled:
                        self.plotter.plot_xy('contrast_ch' + str(kk+1), ssbins[:-1], abs(sss_data[0] - sss_data[1]) / ss_data[0].sum())
                        self.plotter.append_xy('max contrast_ch' + str(kk+1), freq, max_contrast_data[kk,yy])

            with self.datafile() as f:
                f.append_pt('atten', atten)
                f.add('attenpts', attenpts)
                f.append_line('freq', freqpts)
                f.append_line('max_contrast_data_ch1', max_contrast_data[0, :])
                f.append_line('max_contrast_data_ch2', max_contrast_data[1, :])
                #f.add('single_record1', single_record1)
                f.close()


    def awg_prep(self):
        stop_pulseblaster()
        LocalInstruments().inst_dict['pxdac4800_1'].stop()
        LocalInstruments().inst_dict['pxdac4800_2'].stop()
        LocalInstruments().inst_dict['pxdac4800_3'].stop()

    def awg_run(self):
        LocalInstruments().inst_dict['pxdac4800_1'].run_experiment()
        LocalInstruments().inst_dict['pxdac4800_2'].run_experiment()
        LocalInstruments().inst_dict['pxdac4800_3'].run_experiment()
        time.sleep(0.5)
        run_pulseblaster()
class HistogramHeteroExperiment(Experiment):
    def __init__(self,
                 path='',
                 prefix='Histogram_Hetero',
                 config_file='..\\config.json',
                 use_cal=False,
                 **kwargs):

        Experiment.__init__(self,
                            path=path,
                            prefix=prefix,
                            config_file=config_file,
                            **kwargs)

        self.extra_args = {}

        for key, value in kwargs.items():
            self.extra_args[key] = value
            #print str(key) + ": " + str(value)

        if 'liveplot_enabled' in self.extra_args:
            self.liveplot_enabled = self.extra_args['liveplot_enabled']
        else:
            self.liveplot_enabled = False

        if 'data_prefix' in self.extra_args:
            data_prefix = self.extra_args['data_prefix']
        else:
            data_prefix = prefix

        if 'prep_tek2' in self.extra_args:
            self.prep_tek2 = self.extra_args['prep_tek2']
        else:
            self.prep_tek2 = False

        if 'adc' in self.extra_args:
            self.adc = self.extra_args['adc']
        else:
            self.adc = None

        if 'data_file' in self.extra_args:
            self.data_file = self.extra_args['data_file']
        else:
            self.data_file = None

        if 'flux_freq' in self.extra_args:
            self.flux_freq = self.extra_args['flux_freq']
        else:
            self.flux_freq = None

        self.prefix = prefix
        self.expt_cfg_name = prefix.lower()

        #self.pre_run = pre_run
        #self.post_run = post_run

        self.pulse_type = self.cfg[self.expt_cfg_name]['pulse_type']

        self.pulse_sequence = HistogramSequence(
            self.cfg['awgs'], self.cfg[self.expt_cfg_name],
            self.cfg['readout'], self.cfg['pulse_info'][self.pulse_type],
            self.cfg['buffer'], self.cfg)
        self.pulse_sequence.build_sequence()
        self.pulse_sequence.write_sequence(os.path.join(
            self.path, '../sequences/'),
                                           prefix,
                                           upload=True)

        self.expt_pts = self.pulse_sequence.histo_pts

        self.cfg['alazar']['samplesPerRecord'] = 2**(
            self.cfg['readout']['width'] - 1).bit_length()
        self.cfg['alazar'][
            'recordsPerBuffer'] = self.pulse_sequence.sequence_length * self.cfg[
                self.expt_cfg_name]['hw_repeats']
        # self.cfg['alazar']['recordsPerAcquisition'] = int(
        #     self.pulse_sequence.sequence_length * self.cfg[self.expt_cfg_name]['repeats']* max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.cfg['alazar']['recordsPerAcquisition'] = int(
            self.pulse_sequence.sequence_length *
            self.cfg[self.expt_cfg_name]['hw_repeats'] *
            max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.ready_to_go = True
        return

    def go(self):
        if self.liveplot_enabled:
            self.plotter.clear()

        print("Prep Instruments")
        self.readout.set_frequency(self.cfg['readout']['frequency'])
        self.readout.set_power(self.cfg['readout']['power'])
        self.readout.set_ext_pulse(mod=self.cfg['readout']['mod'])

        self.drive.set_frequency(
            self.cfg['qubit']['frequency'] -
            self.cfg['pulse_info'][self.pulse_type]['iq_freq'])
        self.drive.set_power(self.cfg[self.expt_cfg_name]['power'])
        self.drive.set_ext_pulse(mod=self.cfg['drive']['mod'])
        self.drive.set_output(True)

        try:
            self.awg.set_amps_offsets(self.cfg['cal']['iq_amps'],
                                      self.cfg['cal']['iq_offsets'])
        except:
            print("self.awg not loaded.")

        print("Prep Card")
        adc = Alazar(self.cfg['alazar'])

        heterodyne_carrier_freq = self.cfg['readout'][
            'heterodyne_carrier_freq']
        heterodyne_read_freqs = self.cfg['readout']['heterodyne_read_freq']

        attenpts = arange(self.cfg[self.expt_cfg_name]['atten_start'],
                          self.cfg[self.expt_cfg_name]['atten_stop'],
                          self.cfg[self.expt_cfg_name]['atten_step'])
        freqpts = arange(self.cfg[self.expt_cfg_name]['freq_start'],
                         self.cfg[self.expt_cfg_name]['freq_stop'],
                         self.cfg[self.expt_cfg_name]['freq_step'])
        num_bins = self.cfg[self.expt_cfg_name]['num_bins']

        ss_cos_data_all = zeros(
            (2, len(attenpts), len(freqpts), len(self.expt_pts),
             self.cfg['alazar']['recordsPerAcquisition'] /
             len(self.expt_pts)))  # (channel, atten, freq, g/e/(f), average)
        ss_sin_data_all = zeros(
            (2, len(attenpts), len(freqpts), len(self.expt_pts),
             self.cfg['alazar']['recordsPerAcquisition'] /
             len(self.expt_pts)))  # (channel, atten, freq, g/e/(f), average)

        for xx, atten in enumerate(attenpts):
            #self.im.atten.set_attenuator(atten)
            try:
                self.readout_atten.set_attenuator(atten)
            except:
                print("Digital attenuator not loaded.")

            max_contrast_data = zeros((2, len(freqpts)))

            if self.liveplot_enabled:
                self.plotter.clear('max contrast')

            for yy, freq in enumerate(freqpts):
                self.readout.set_frequency(
                    freq - self.cfg['readout']['heterodyne_freq'])
                #self.readout_shifter.set_phase(self.cfg['readout']['start_phase'] , freq)
                self.readout_shifter.set_phase(
                    (self.cfg['readout']['start_phase'] +
                     self.cfg['readout']['phase_slope'] *
                     (freq - self.cfg['readout']['frequency'])) % 360, freq)

                ss_data = zeros((len(self.expt_pts), num_bins))
                sss_data = zeros((len(self.expt_pts), num_bins))

                print("runnning atten no.", xx, ", freq no.", yy)

                single_data1, single_data2, single_record1, single_record2 = \
                    adc.acquire_singleshot_heterodyne_data(self.cfg['readout']['heterodyne_freq'],\
                                                       prep_function=self.awg_prep, start_function=self.awg_run, excise=self.cfg['readout']['window'])

                ss_cos_data_all[0, xx, yy, :, :] = reshape(
                    single_data1[0],
                    (self.cfg['alazar']['recordsPerAcquisition'] /
                     len(self.expt_pts), len(self.expt_pts))).T
                ss_cos_data_all[1, xx, yy, :, :] = reshape(
                    single_data2[0],
                    (self.cfg['alazar']['recordsPerAcquisition'] /
                     len(self.expt_pts), len(self.expt_pts))).T
                ss_sin_data_all[0, xx, yy, :, :] = reshape(
                    single_data1[1],
                    (self.cfg['alazar']['recordsPerAcquisition'] /
                     len(self.expt_pts), len(self.expt_pts))).T
                ss_sin_data_all[1, xx, yy, :, :] = reshape(
                    single_data2[1],
                    (self.cfg['alazar']['recordsPerAcquisition'] /
                     len(self.expt_pts), len(self.expt_pts))).T

                with self.datafile() as f:
                    f.add('ss_cos_data_ch1', ss_cos_data_all[0])
                    f.add('ss_cos_data_ch2', ss_cos_data_all[1])
                    f.add('ss_sin_data_ch1', ss_sin_data_all[0])
                    f.add('ss_sin_data_ch2', ss_sin_data_all[1])
                    f.append_line('single_record1', single_record1)
                    f.append_line('single_record2', single_record2)
                    f.close()

                if self.cfg['readout']['heterodyne_freq'] == 0:
                    # ch1 cos, ch2 cos
                    ss1 = single_data1[0]
                    ss2 = single_data2[0]
                else:
                    # ch1 cos, ch1 sin
                    ss1 = single_data1[0]
                    ss2 = single_data1[1]

                for kk, ssthis in enumerate([ss1, ss2]):

                    ssthis = reshape(
                        ssthis, (self.cfg['alazar']['recordsPerAcquisition'] /
                                 len(self.expt_pts), len(self.expt_pts))).T

                    print('ss i/q ch', str(kk + 1), 'max/min =', ssthis.max(),
                          ssthis.min())
                    dist = ssthis.max() - ssthis.min()
                    histo_range = (ssthis.min() - 0.01 * dist,
                                   ssthis.max() + 0.01 * dist)

                    for jj, ss in enumerate(ssthis):
                        sshisto, ssbins = np.histogram(ss,
                                                       bins=num_bins,
                                                       range=histo_range)
                        ss_data[jj] += sshisto
                        sss_data[jj] = cumsum(ss_data[[jj]])
                        if self.liveplot_enabled:
                            self.plotter.plot_xy('histogram %d' % jj,
                                                 ssbins[:-1], ss_data[jj])
                            self.plotter.plot_xy('cum histo %d' % jj,
                                                 ssbins[:-1], sss_data[jj])

                    max_contrast_data[kk, yy] = abs(
                        ((sss_data[0] - sss_data[1]) /
                         ss_data[0].sum())).max()

                    if self.liveplot_enabled:
                        self.plotter.plot_xy(
                            'contrast_ch' + str(kk + 1), ssbins[:-1],
                            abs(sss_data[0] - sss_data[1]) / ss_data[0].sum())
                        self.plotter.append_xy('max contrast_ch' + str(kk + 1),
                                               freq, max_contrast_data[kk, yy])

            with self.datafile() as f:
                f.append_pt('atten', atten)
                f.add('attenpts', attenpts)
                f.append_line('freq', freqpts)
                f.append_line('max_contrast_data_ch1', max_contrast_data[0, :])
                f.append_line('max_contrast_data_ch2', max_contrast_data[1, :])
                #f.add('single_record1', single_record1)
                f.close()

    def awg_prep(self):
        stop_pulseblaster()
        LocalInstruments().inst_dict['pxdac4800_1'].stop()
        LocalInstruments().inst_dict['pxdac4800_2'].stop()
        LocalInstruments().inst_dict['pxdac4800_3'].stop()

    def awg_run(self):
        LocalInstruments().inst_dict['pxdac4800_1'].run_experiment()
        LocalInstruments().inst_dict['pxdac4800_2'].run_experiment()
        LocalInstruments().inst_dict['pxdac4800_3'].run_experiment()
        time.sleep(0.5)
        run_pulseblaster()
    def __init__(self,
                 path='',
                 prefix='Histogram_Hetero',
                 config_file='..\\config.json',
                 use_cal=False,
                 **kwargs):

        Experiment.__init__(self,
                            path=path,
                            prefix=prefix,
                            config_file=config_file,
                            **kwargs)

        self.extra_args = {}

        for key, value in kwargs.items():
            self.extra_args[key] = value
            #print str(key) + ": " + str(value)

        if 'liveplot_enabled' in self.extra_args:
            self.liveplot_enabled = self.extra_args['liveplot_enabled']
        else:
            self.liveplot_enabled = False

        if 'data_prefix' in self.extra_args:
            data_prefix = self.extra_args['data_prefix']
        else:
            data_prefix = prefix

        if 'prep_tek2' in self.extra_args:
            self.prep_tek2 = self.extra_args['prep_tek2']
        else:
            self.prep_tek2 = False

        if 'adc' in self.extra_args:
            self.adc = self.extra_args['adc']
        else:
            self.adc = None

        if 'data_file' in self.extra_args:
            self.data_file = self.extra_args['data_file']
        else:
            self.data_file = None

        if 'flux_freq' in self.extra_args:
            self.flux_freq = self.extra_args['flux_freq']
        else:
            self.flux_freq = None

        self.prefix = prefix
        self.expt_cfg_name = prefix.lower()

        #self.pre_run = pre_run
        #self.post_run = post_run

        self.pulse_type = self.cfg[self.expt_cfg_name]['pulse_type']

        self.pulse_sequence = HistogramSequence(
            self.cfg['awgs'], self.cfg[self.expt_cfg_name],
            self.cfg['readout'], self.cfg['pulse_info'][self.pulse_type],
            self.cfg['buffer'], self.cfg)
        self.pulse_sequence.build_sequence()
        self.pulse_sequence.write_sequence(os.path.join(
            self.path, '../sequences/'),
                                           prefix,
                                           upload=True)

        self.expt_pts = self.pulse_sequence.histo_pts

        self.cfg['alazar']['samplesPerRecord'] = 2**(
            self.cfg['readout']['width'] - 1).bit_length()
        self.cfg['alazar'][
            'recordsPerBuffer'] = self.pulse_sequence.sequence_length * self.cfg[
                self.expt_cfg_name]['hw_repeats']
        # self.cfg['alazar']['recordsPerAcquisition'] = int(
        #     self.pulse_sequence.sequence_length * self.cfg[self.expt_cfg_name]['repeats']* max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.cfg['alazar']['recordsPerAcquisition'] = int(
            self.pulse_sequence.sequence_length *
            self.cfg[self.expt_cfg_name]['hw_repeats'] *
            max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.ready_to_go = True
        return
Exemple #5
0
class HistogramExperiment(Experiment):
    def __init__(self,
                 path='',
                 prefix='Histogram',
                 config_file='..\\config.json',
                 use_cal=False,
                 **kwargs):

        Experiment.__init__(self,
                            path=path,
                            prefix=prefix,
                            config_file=config_file,
                            **kwargs)

        self.extra_args = {}

        for key, value in kwargs.items():
            self.extra_args[key] = value
            #print str(key) + ": " + str(value)

        if 'liveplot_enabled' in self.extra_args:
            self.liveplot_enabled = self.extra_args['liveplot_enabled']
        else:
            self.liveplot_enabled = False

        if 'data_prefix' in self.extra_args:
            data_prefix = self.extra_args['data_prefix']
        else:
            data_prefix = prefix

        if 'prep_tek2' in self.extra_args:
            self.prep_tek2 = self.extra_args['prep_tek2']
        else:
            self.prep_tek2 = False

        if 'adc' in self.extra_args:
            self.adc = self.extra_args['adc']
        else:
            self.adc = None

        if 'data_file' in self.extra_args:
            self.data_file = self.extra_args['data_file']
        else:
            self.data_file = None

        if 'flux_freq' in self.extra_args:
            self.flux_freq = self.extra_args['flux_freq']
        else:
            self.flux_freq = None

        self.prefix = prefix
        self.expt_cfg_name = prefix.lower()

        #self.pre_run = pre_run
        #self.post_run = post_run

        self.pulse_type = self.cfg[self.expt_cfg_name]['pulse_type']

        self.pulse_sequence = HistogramSequence(
            self.cfg['awgs'], self.cfg[self.expt_cfg_name],
            self.cfg['readout'], self.cfg['pulse_info'][self.pulse_type],
            self.cfg['buffer'])
        self.pulse_sequence.build_sequence()
        self.pulse_sequence.write_sequence(os.path.join(
            self.path, '../sequences/'),
                                           prefix,
                                           upload=True)

        self.expt_pts = self.pulse_sequence.histo_pts

        self.cfg['alazar']['samplesPerRecord'] = 2**(
            self.cfg['readout']['width'] - 1).bit_length()
        self.cfg['alazar'][
            'recordsPerBuffer'] = self.pulse_sequence.sequence_length * self.cfg[
                self.expt_cfg_name]['repeats']
        self.cfg['alazar']['recordsPerAcquisition'] = int(
            self.pulse_sequence.sequence_length *
            self.cfg[self.expt_cfg_name]['repeats'] *
            max(self.cfg[self.expt_cfg_name]['averages'], 10))

        self.ready_to_go = True
        return

    def go(self):
        if self.liveplot_enabled:
            self.plotter.clear()

        print("Prep Instruments")
        self.readout.set_frequency(self.cfg['readout']['frequency'])
        self.readout.set_power(self.cfg['readout']['power'])
        self.readout.set_ext_pulse(mod=True)

        self.drive.set_frequency(
            self.cfg['qubit']['frequency'] -
            self.cfg['pulse_info'][self.pulse_type]['iq_freq'])
        self.drive.set_power(self.cfg[self.expt_cfg_name]['power'])
        self.drive.set_ext_pulse(mod=False)
        self.drive.set_output(True)

        try:
            self.awg.set_amps_offsets(self.cfg['cal']['iq_amps'],
                                      self.cfg['cal']['iq_offsets'])
        except:
            print("self.awg not loaded.")

        print("Prep Card")
        adc = Alazar(self.cfg['alazar'])

        attenpts = arange(self.cfg[self.expt_cfg_name]['atten_start'],
                          self.cfg[self.expt_cfg_name]['atten_stop'],
                          self.cfg[self.expt_cfg_name]['atten_step'])
        freqpts = arange(self.cfg[self.expt_cfg_name]['freq_start'],
                         self.cfg[self.expt_cfg_name]['freq_stop'],
                         self.cfg[self.expt_cfg_name]['freq_step'])
        num_bins = self.cfg[self.expt_cfg_name]['num_bins']

        for xx, atten in enumerate(attenpts):
            #self.im.atten.set_attenuator(atten)
            try:
                self.readout_atten.set_attenuator(atten)
            except:
                print("Digital attenuator not loaded.")

            max_contrast_data = zeros(len(freqpts))

            if self.liveplot_enabled:
                self.plotter.clear('max contrast')

            for yy, freq in enumerate(freqpts):
                self.readout.set_frequency(freq)
                #self.readout_shifter.set_phase(self.cfg['readout']['start_phase'] , freq)
                self.readout_shifter.set_phase(
                    (self.cfg['readout']['start_phase'] +
                     self.cfg['readout']['phase_slope'] *
                     (freq - self.cfg['readout']['frequency'])) % 360, freq)

                #tpts, ch1_pts, ch2_pts = adc.acquire_avg_data_by_record(prep_function=self.awg.stop_and_prep, start_function=self.awg.run,excise=None)

                tpts, ch1_pts, ch2_pts = adc.acquire_avg_data_by_record(
                    prep_function=self.awg_prep,
                    start_function=self.awg_run,
                    excise=self.cfg['readout']['window'])

                if self.liveplot_enabled:
                    self.plotter.plot_z("current", ch1_pts)

                # with self.datafile() as f:
                #     f.append('time_trace', ch1_pts)
                ss_data = zeros((len(self.expt_pts), num_bins))
                sss_data = zeros((len(self.expt_pts), num_bins))

                # ss1, ss2 = adc.acquire_singleshot_data(prep_function=None, start_function=None,
                #                                        excise=self.cfg['readout']['window'])
                ss1, ss2 = adc.acquire_singleshot_data(
                    prep_function=self.awg_prep,
                    start_function=self.awg_run,
                    excise=self.cfg['readout']['window'])

                ss1 = reshape(ss1,
                              (self.cfg['alazar']['recordsPerAcquisition'] /
                               len(self.expt_pts), len(self.expt_pts))).T
                histo_range = (ss1.min() / 1.5, ss1.max() * 1.5)
                for jj, ss in enumerate(ss1):
                    sshisto, ssbins = np.histogram(ss,
                                                   bins=num_bins,
                                                   range=histo_range)
                    ss_data[jj] += sshisto
                    sss_data[jj] = cumsum(ss_data[[jj]])
                    if self.liveplot_enabled:
                        self.plotter.plot_xy('histogram %d' % jj, ssbins[:-1],
                                             ss_data[jj])
                        self.plotter.plot_xy('cum histo %d' % jj, ssbins[:-1],
                                             sss_data[jj])

                if self.liveplot_enabled:
                    self.plotter.plot_xy(
                        'contrast', ssbins[:-1],
                        abs(sss_data[0] - sss_data[1]) / ss_data[0].sum())
                max_contrast_data[yy] = abs(
                    ((sss_data[0] - sss_data[1]) / ss_data[0].sum())).max()
                if self.liveplot_enabled:
                    self.plotter.append_xy('max contrast', freq,
                                           max_contrast_data[yy])
            if len(attenpts) > 1:
                if self.liveplot_enabled:
                    print("plotting max contrast 2")
                    self.plotter.append_z(
                        'max contrast 2',
                        max_contrast_data,
                        start_step=((attenpts[0], attenpts[1] - attenpts[0]),
                                    (freqpts[0] / 1.0e9,
                                     (freqpts[1] - freqpts[0]) / 1.0e9)))

            with self.datafile() as f:
                f.append_pt('atten', atten)
                f.append_line('freq', freqpts)
                f.append_line('max_contrast_data', max_contrast_data)
                f.close()

    def awg_prep(self):
        stop_pulseblaster()
        PXDAC4800().stop()

    def awg_run(self):
        PXDAC4800().run_experiment()
        run_pulseblaster()