def __init__(self, path='', prefix='MM_Flux_Sideband_Two_Modes_Swap_Sweep', config_file=None, use_cal=False, **kwargs):
        Experiment.__init__(self, path=path, prefix=prefix, config_file=config_file, **kwargs)


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

        self.mm_flux_sideband_cfg = self.cfg['mm_flux_sideband_two_modes_swap_sweep']

        # if self.mm_flux_sideband_cfg['freq_step'] is not None:
        #     self.mm_flux_sideband_freq_pts = arange(self.mm_flux_sideband_cfg['start_freq'], self.mm_flux_sideband_cfg['stop_freq'], self.mm_flux_sideband_cfg['freq_step'])
        # else:
        #     self.mm_flux_sideband_freq_pts = linspace(self.mm_flux_sideband_cfg['start_freq'], self.mm_flux_sideband_cfg['stop_freq'], self.mm_flux_sideband_cfg['freq_num_pts'])

        if self.cfg['pulse_info'][self.pulse_type] is None:
            print("This pulse type is not valid.")
            self.ready_to_go = False
            return

        pulse_calibrated = self.cfg['pulse_info'][self.pulse_type]['rabi_calibrated']

        if not pulse_calibrated:
            print("This pulse type has not been calibrated.")
            self.ready_to_go = False
            return

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

        self.mm_flux_sideband_pts = self.pulse_sequence.mm_flux_sideband_pts
        #self.cfg['alazar']['samplesPerRecord'] = self.pulse_sequence.waveform_length
        self.cfg['alazar']['recordsPerBuffer'] = self.pulse_sequence.sequence_length
        self.cfg['alazar']['recordsPerAcquisition'] = int(
            self.pulse_sequence.sequence_length * min(self.cfg['mm_flux_sideband']['averages'], 100))

        self.ready_to_go = True

        ### Hard coding TEK7
        self.tek7 = InstrumentManager()["TEK2"]

        return
class MultimodeFluxSideBandTwoModesSwapSweepExperiment(Experiment):
    def __init__(self, path='', prefix='MM_Flux_Sideband_Two_Modes_Swap_Sweep', config_file=None, use_cal=False, **kwargs):
        Experiment.__init__(self, path=path, prefix=prefix, config_file=config_file, **kwargs)


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

        self.mm_flux_sideband_cfg = self.cfg['mm_flux_sideband_two_modes_swap_sweep']

        # if self.mm_flux_sideband_cfg['freq_step'] is not None:
        #     self.mm_flux_sideband_freq_pts = arange(self.mm_flux_sideband_cfg['start_freq'], self.mm_flux_sideband_cfg['stop_freq'], self.mm_flux_sideband_cfg['freq_step'])
        # else:
        #     self.mm_flux_sideband_freq_pts = linspace(self.mm_flux_sideband_cfg['start_freq'], self.mm_flux_sideband_cfg['stop_freq'], self.mm_flux_sideband_cfg['freq_num_pts'])

        if self.cfg['pulse_info'][self.pulse_type] is None:
            print("This pulse type is not valid.")
            self.ready_to_go = False
            return

        pulse_calibrated = self.cfg['pulse_info'][self.pulse_type]['rabi_calibrated']

        if not pulse_calibrated:
            print("This pulse type has not been calibrated.")
            self.ready_to_go = False
            return

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

        self.mm_flux_sideband_pts = self.pulse_sequence.mm_flux_sideband_pts
        #self.cfg['alazar']['samplesPerRecord'] = self.pulse_sequence.waveform_length
        self.cfg['alazar']['recordsPerBuffer'] = self.pulse_sequence.sequence_length
        self.cfg['alazar']['recordsPerAcquisition'] = int(
            self.pulse_sequence.sequence_length * min(self.cfg['mm_flux_sideband']['averages'], 100))

        self.ready_to_go = True

        ### Hard coding TEK7
        self.tek7 = InstrumentManager()["TEK2"]

        return

    def go(self,adc):
        self.plotter.clear('MM Flux Sideband Two Modes Swap Sweep Data')
        self.plotter.clear('MM Flux Sideband Two Modes Swap Sweep XY')

        # self.save_config()

        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.readout_shifter.set_phase(self.cfg['readout']['start_phase'] + self.cfg['readout']['phase_slope'] * (
            self.cfg['readout']['frequency'] - self.cfg['readout']['bare_frequency']), self.cfg['readout']['frequency'])

        self.drive.set_frequency(self.cfg['qubit']['frequency'] - self.cfg['mm_flux_sideband']['freq'])
        self.drive.set_power(self.cfg['mm_flux_sideband']['power'])
        self.drive.set_ext_pulse(mod=True)
        self.drive.set_output(True)
        self.readout_atten.set_attenuator(self.cfg['readout']['dig_atten'])

        self.awg.set_amps_offsets(self.cfg['cal']['iq_amps'], self.cfg['cal']['iq_offsets'])


        mm_flux_sideband_data = None

        #print "Doing Flux Sideband with frequency: " + str(self.flux_freq)
        for ii in arange(max(1, self.mm_flux_sideband_cfg['averages'] / 100)):
            ### putting TEK2 to first waveform before awg runs, not sure if this is a good way to do so
            tpts, ch1_pts, ch2_pts = adc.acquire_avg_data_by_record(prep_function=self.awgs_prep,
                                                                    start_function=self.awg.run,
                                                                    excise=self.cfg['readout']['window'])
            # tpts, ch1_pts, ch2_pts = adc.acquire_data_by_record(start_function=awg.run, excise=None)
            # if self.cfg.alazar["ch1_enabled"]: self.plotter.plot_xy('current ch1', tpts, ch1_pts)
            # if self.cfg.alazar["ch1_enabled"]: self.plotter.plot_xy('current ch2', tpts, ch2_pts)
            if mm_flux_sideband_data is None:
                mm_flux_sideband_data = ch1_pts
            else:
                mm_flux_sideband_data = (mm_flux_sideband_data * ii + ch1_pts) / (ii + 1.0)

            self.plotter.plot_z('MM Flux Sideband Two Modes Swap Sweep Data', mm_flux_sideband_data.T)
            mm_flux_sideband_avg_data = mean(mm_flux_sideband_data, 1)
            self.plotter.plot_xy('MM Flux Sideband Two Modes Swap Sweep XY', self.pulse_sequence.mm_flux_sideband_pts, mm_flux_sideband_avg_data)
            print(ii * min(self.cfg['mm_flux_sideband']['averages'], 100))

        #self.plotter.append_z('MM Flux Sideband Rabi Freq Sweep',mm_flux_sideband_avg_data)
        with self.datafile() as f:
            #f.append_pt('flux_freq',self.flux_freq)
            f.append_line('mm_flux_sideband_avg_data', mm_flux_sideband_avg_data)
            f.append_line('mm_flux_sideband_pts', self.mm_flux_sideband_pts)
            f.close()


    ## hard coding tek7 preparation, why need to stop and run, but not just preping it??
    def awgs_prep(self):
        print("Preparing TEKs")
        self.awg.stop_and_prep()
        self.tek7.stop()
        self.tek7.prep_experiment()
        self.tek7.run()