def test_pulse_from_func(): """Test instantiating pulse from a simple function""" tgrid = pulse_tgrid(10, 100) ampl = lambda t: 100 * blackman(t, 0, 10) pulse1 = Pulse.from_func(tgrid, ampl, ampl_unit='MHz', time_unit='ns') pulse2 = Pulse(tgrid, ampl(tgrid), ampl_unit='MHz', time_unit='ns') assert pulse1 == pulse2
def test_write_oct_spectral_filter(tmpdir, request): tgrid = pulse_tgrid(10, 100) ampl = gaussian(tgrid, 5, 1) pulse = Pulse(tgrid=tgrid, amplitude=ampl, ampl_unit='MHz', time_unit='ns') filename = str(tmpdir.join("spectral_filter.dat")) pulse.write_oct_spectral_filter(filename, filter_func=lambda f: abs(f) < 2) datadir = os.path.splitext(request.module.__file__)[0] assert filecmp.cmp(filename, os.path.join(datadir, 'spectral_filter.dat'))
def test_pulse_derivative(): tgrid = pulse_tgrid(10, 100) ampl = gaussian(tgrid, 5, 1) pulse = Pulse(tgrid=tgrid, amplitude=ampl, ampl_unit='MHz', time_unit='ns') deriv = pulse.derivative() assert deriv.dt == pulse.dt assert deriv.ampl_unit == 'unitless' assert deriv.time_unit == 'ns' assert "%.3f" % abs(np.max(deriv.amplitude)) == '0.613' assert "%.3f" % abs(np.min(deriv.amplitude)) == '0.613'
def test_analytical_pulse_with_tgrid(): p0 = AnalyticalPulse.from_func( ampl_1freq, parameters={ 'E0': 100, 'T': 200, 'w_L': 6.5 }, time_unit='ns', ampl_unit='MHz', ) assert p0.t0 == 0.0 assert p0.T is None assert p0.nt is None assert p0.dt is None assert p0.tgrid is None assert p0.tgrid is None assert p0.w_max is None assert p0.dw is None assert p0.to_num_pulse() is None p1 = AnalyticalPulse.from_func( ampl_1freq, parameters={ 'E0': 100, 'T': 200, 'w_L': 6.5 }, time_unit='ns', ampl_unit='MHz', t0=0, T='T', nt=lambda _p: int(float(_p.T * 10)) + 1, ) assert p0 != p1 assert p1.time_unit == 'ns' assert p1.ampl_unit == 'MHz' assert p1.freq_unit == 'GHz' assert p1.copy() == p1 assert p1.t0 == 0.0 assert p1.T == UnitFloat(200, 'ns') assert p1.nt == 2001 assert p1.dt == UnitFloat(0.1, 'ns') assert (np.max(np.abs(p1.tgrid - np.linspace(0.05, 200 - 0.05, 2000))) < 1e-14) assert p1.w_max == 5.0 assert p1.dw == 0.005 p1_num = p1.to_num_pulse() assert p1_num == p0.to_num_pulse(pulse_tgrid(200, 2001)) assert np.max(np.abs(p1_num.tgrid - p1.tgrid)) < 1e-14 assert np.max(np.abs(p1_num.states_tgrid - p1.states_tgrid)) < 1e-14 assert p1_num.dt == p1.dt assert p1_num.w_max == p1.w_max assert p1_num.dw == p1.dw
def test_pulse_as_func(): """Test converting pulse as a function""" tgrid = pulse_tgrid(t0=1.0, T=11.0, nt=6) pulse = Pulse( tgrid=tgrid, amplitude=np.array([0, 1.0, 2.0, 0, 1.0]), ampl_unit='MHz', time_unit='ns', ) f = pulse.as_func(interpolation='linear') with pytest.raises(ValueError): f(0.5) f(11.1) assert abs(f(1.0) - 0.0) < 1e-12 assert abs(f(1.9) - 0.0) < 1e-12 assert abs(f(2.0) - 0.0) < 1e-12 assert abs(f(3.0) - 0.5) < 1e-12 assert abs(f(3.5) - 0.75) < 1e-12 assert abs(f(4.0) - 1.0) < 1e-12 assert abs(f(5.0) - 1.5) < 1e-12 assert abs(f(6.0) - 2.0) < 1e-12 assert abs(f(7.0) - 1.0) < 1e-12 assert abs(f(8.0) - 0.0) < 1e-12 assert abs(f(9.0) - 0.5) < 1e-12 assert abs(f(10.0) - 1.0) < 1e-12 assert abs(f(11.0) - 1.0) < 1e-12 f = pulse.as_func(interpolation='piecewise') with pytest.raises(ValueError): f(0.5) f(11.1) assert abs(f(1.00) - 0.0) < 1e-12 assert abs(f(1.90) - 0.0) < 1e-12 assert abs(f(2.00) - 0.0) < 1e-12 assert abs(f(2.99) - 0.0) < 1e-12 assert abs(f(3.01) - 1.0) < 1e-12 assert abs(f(4.00) - 1.0) < 1e-12 assert abs(f(4.50) - 1.0) < 1e-12 assert abs(f(4.99) - 1.0) < 1e-12 assert abs(f(5.01) - 2.0) < 1e-12 assert abs(f(6.00) - 2.0) < 1e-12 assert abs(f(6.99) - 2.0) < 1e-12 assert abs(f(7.01) - 0.0) < 1e-12 assert abs(f(9.01) - 1.0) < 1e-12 assert abs(f(10.0) - 1.0) < 1e-12 assert abs(f(11.0) - 1.0) < 1e-12 assert abs(f(UnitFloat(6.0, 'ns')) - 2.0) < 1e-12 with pytest.raises(ValueError): f = pulse.as_func(interpolation='invalid')
def test_analytical_pulse(tmpdir): AnalyticalPulse.register_formula('field_free', ampl_field_free) AnalyticalPulse.register_formula('1freq', ampl_1freq) AnalyticalPulse.register_formula('2freq', ampl_2freq) AnalyticalPulse.register_formula('5freq', ampl_5freq) AnalyticalPulse.register_formula('1freq_rwa', ampl_1freq_rwa) AnalyticalPulse.register_formula('2freq_rwa', ampl_2freq_rwa) AnalyticalPulse.register_formula('2freq_rwa_box', ampl_2freq_rwa_box) AnalyticalPulse.register_formula('5freq_rwa', ampl_5freq_rwa) AnalyticalPulse.register_formula('CRAB_rwa', ampl_CRAB_rwa) tmp = lambda filename: str(tmpdir.join(filename)) with pytest.raises(TypeError) as exc_info: AnalyticalPulse.register_formula('1freq_0', 'bla') assert 'is not a Python function' in str( exc_info) or 'unsupported callable' in str( # <= 3.3 exc_info) # >= 3.4 AnalyticalPulse.register_formula('1freq_0', ampl_1freq_0) with pytest.raises(ValueError) as exc_info: AnalyticalPulse('1freq_0', parameters={'E0': 100}, time_unit='ns', ampl_unit='MHz') assert 'Required parameter "T" for formula' in str(exc_info) with pytest.raises(ValueError) as exc_info: AnalyticalPulse( '1freq_0', parameters={ 'E0': 100, 'T': 200, 'extra': 0 }, time_unit='ns', ampl_unit='MHz', ) assert 'Parameter "extra" does not exist in formula' in str(exc_info) p1 = AnalyticalPulse('field_free', time_unit='ns', ampl_unit='MHz') assert p1.header == '# Formula "field_free"' p1.write(tmp('p1.json'), pretty=True) p1.to_num_pulse(tgrid=pulse_tgrid(200, 500)).write(tmp('p1.dat')) p1_copy = AnalyticalPulse.read(tmp('p1.json')) p1_copy.write(tmp('p1_copy.json'), pretty=True) assert filecmp.cmp(tmp("p1.json"), tmp("p1_copy.json")) p2 = AnalyticalPulse( '1freq', parameters={ 'E0': 100, 'T': 200, 'w_L': 6.5 }, time_unit='ns', ampl_unit='MHz', ) assert p2.header == '# Formula "1freq" with E0 = 100, T = 200, w_L = 6.5' p2.write(tmp('p2.json'), pretty=True) p2.to_num_pulse(tgrid=pulse_tgrid(200, 10000)).write(tmp('p2.dat')) p2_copy = AnalyticalPulse.read(tmp('p2.json')) p2_copy.write(tmp('p2_copy.json'), pretty=True) assert filecmp.cmp(tmp("p2.json"), tmp("p2_copy.json")) parameters = { 'E0': 100, 'T': 200, 'freq_1': 6.0, 'freq_2': 6.5, 'a_1': 0.5, 'a_2': 1.0, 'phi': 0.0, } p3 = AnalyticalPulse('2freq', parameters=parameters, time_unit='ns', ampl_unit='MHz') assert ( p3.header == '# Formula "2freq" with E0 = 100, T = 200, a_1 = 0.5, a_2 = 1.0, freq_1 = 6.0, freq_2 = 6.5, phi = 0.0' ) p3.write(tmp('p3.json'), pretty=True) p3.to_num_pulse(tgrid=pulse_tgrid(200, 10000)).write(tmp('p3.dat')) p3_copy = AnalyticalPulse.read(tmp('p3.json')) p3_copy.write(tmp('p3_copy.json'), pretty=True) assert filecmp.cmp(tmp("p3.json"), tmp("p3_copy.json")) freq_low = np.array([0.01, 0.0243]) freq_high = np.array([8.32, 10.1, 5.3]) a_low = np.array([1.0, 0.21]) a_high = np.array([0.58, 0.89, 0.1]) b_low = np.array([1.0, 0.51]) b_high = np.array([0.09, 0.12, 0.71]) p4 = AnalyticalPulse( '5freq', parameters={ 'E0': 100, 'T': 200, 'freq_low': freq_low, 'freq_high': freq_high, 'a_low': a_low, 'a_high': a_high, 'b_low': b_low, 'b_high': b_high, }, time_unit='ns', ampl_unit='MHz', ) assert ( p4.header == '# Formula "5freq" with E0 = 100, T = 200, a_high = [0.58, 0.89, 0.1], a_low = [1.0, 0.21], b_high = [0.09, 0.12, 0.71], b_low = [1.0, 0.51], freq_high = [8.32, 10.1, 5.3], freq_low = [0.01, 0.0243]' ) p4.write(tmp('p4.json'), pretty=True) p4.to_num_pulse(tgrid=pulse_tgrid(200, 10000)).write(tmp('p4.dat')) p4_copy = AnalyticalPulse.read(tmp('p4.json')) assert isinstance( p4_copy.parameters['a_low'], np.ndarray), "Coefficients 'a_low' should be a numpy array" p4_copy.write(tmp('p4_copy.json'), pretty=True) assert filecmp.cmp(tmp("p4.json"), tmp("p4_copy.json"))