Exemplo n.º 1
0
    def sequence_gates(self, gate_comb, do_upload=True):
        if do_upload:
            [awg.delete_waveforms() for awg in self.awgs]
        for number in self.__awg_range:
            sequence_channels = list()
            sequence_names = list()
            sequence_items = list()
            vpp_amplitude = self.awgs[number].retrieve_gain()
            sampling_rate = self.awgs[number].retrieve_sampling_rate()
            for gate_name, sequence in gate_comb.items():
                (awg_number, channel_number,
                 *marker_number) = self._gate_map[gate_name]
                if awg_number != number:
                    continue
                awg_to_plunger = self.__hardware.parameters['awg_to_{}'.format(
                    gate_name)].get()
                scaling_ratio = 2 * VirtualAwg.__volt_to_millivolt / awg_to_plunger / vpp_amplitude

                sample_data = Sequencer.get_data(sequence, sampling_rate)
                sequence_data = sample_data if marker_number else sample_data * scaling_ratio

                sequence_names.append('{}_{}'.format(gate_name,
                                                     sequence['name']))
                sequence_channels.append((channel_number, *marker_number))
                sequence_items.append(sequence_data)
            if do_upload:
                self.awgs[number].upload_waveforms(sequence_names,
                                                   sequence_channels,
                                                   sequence_items)
        return {'gate_comb': gate_comb}
Exemplo n.º 2
0
    def sequence_gates(self, sequences, do_upload=True):
        """ The base function for uploading sequences to the AWG's. The sequences must be
            constructed using the qtt.instrument_drivers.virtualAwg.sequencer.Sequencer class.

        Arguments:
            sequences (dict): A dictionary with names as keys and sequences as values.
            do_upload (bool, Optional): Does not upload the waves to the AWG's when set to False.

        Example:
            >> from qtt.instrument_drivers.virtualAwg.sequencer import Sequencer.
            >> amplitude = 1.5
            >> period_in_seconds = 1e-6
            >> sawtooth_signal = Sequencer.make_sawtooth_wave(amplitude, period_in_seconds)
            >> virtual_awg.sequence_gates(sawtooth_signal)
        """
        upload_data = []
        settings_data = {}

        if do_upload:
            _ = [awg.delete_waveforms() for awg in self.awgs]

        for number in self.__awg_range:
            sequence_channels = []
            sequence_names = []
            sequence_items = []

            gain_factor = self.awgs[number].retrieve_gain()
            vpp_amplitude = 2 * gain_factor
            sampling_rate = self.awgs[number].retrieve_sampling_rate()
            settings_data[number] = {'vpp_amplitude': vpp_amplitude, 'sampling_rate': sampling_rate}

            for gate_name, sequence in sequences.items():
                (awg_number, channel_number, *marker_number) = self._settings.awg_map[gate_name]
                if awg_number != number:
                    continue

                waveforms = [Sequencer.get_data(waveform, sampling_rate) for waveform in sequence]
                sequence_data = np.sum(waveforms, 0)
                sequence_data = sequence_data[:-1]
                if not marker_number:
                    awg_to_gate = self._settings.parameters[f'awg_to_{gate_name}'].get()
                    scaling_ratio = 1 / (awg_to_gate * gain_factor)
                    settings_data[number][gate_name] = {'scaling_ratio': scaling_ratio}
                    sequence_data *= scaling_ratio

                sequence_name = sequence[0]['name']
                sequence_names.append(f'{gate_name}_{sequence_name}')
                sequence_channels.append((channel_number, *marker_number))
                sequence_items.append(sequence_data)

            upload_data.append((sequence_names, sequence_channels, sequence_items))
            if do_upload and sequence_items:
                self.awgs[number].upload_waveforms(sequence_names, sequence_channels, sequence_items)

        sequence_data = {'gate_comb': sequences, 'upload_data': upload_data, 'settings': settings_data}
        if self.enable_debug:
            self._latest_sequence_data = sequence_data
        return sequence_data
 def test_make_pulse_table(self):
     with warnings.catch_warnings():
         warnings.filterwarnings("ignore", category=UserWarning, message="qupulse")
         amplitudes = [1, 2, 3]
         waiting_times = [1e-4, 2e-5, 3e-3]
         sampling_rate = 1e9
         pulse_data = Sequencer.make_pulse_table(amplitudes, waiting_times)
         raw_data = Sequencer.get_data(pulse_data, sampling_rate)
         self.assertTrue(raw_data[0] == amplitudes[0])
         self.assertTrue(raw_data[-1] == amplitudes[-1])
 def test_raw_wave_HasCorrectProperties(self):
     with warnings.catch_warnings():
         warnings.filterwarnings("ignore", category=UserWarning, message="qupulse")
         period = 1e-3
         sampling_rate = 1e9
         name = 'test_raw_data'
         sequence = {'name': name, 'wave': [0] * int(period * sampling_rate + 1),
                     'type': DataTypes.RAW_DATA}
         raw_data = Sequencer.get_data(sequence, sampling_rate)
         self.assertTrue(len(raw_data) == sampling_rate * period + 1)
         self.assertTrue(np.min(raw_data) == 0)
 def test_qupulse_sawtooth_HasCorrectProperties(self):
     with warnings.catch_warnings():
         warnings.filterwarnings("ignore", category=UserWarning, message="qupulse")
         epsilon = 1e-14
         period = 1e-3
         amplitude = 1.5
         sampling_rate = 1e9
         sequence = Sequencer.make_sawtooth_wave(amplitude, period)
         raw_data = Sequencer.get_data(sequence, sampling_rate)
         self.assertTrue(len(raw_data) == sampling_rate * period + 1)
         self.assertTrue(np.abs(np.min(raw_data) + amplitude / 2) <= epsilon)
         self.assertTrue(np.abs(np.max(raw_data) - amplitude / 2) <= epsilon)