Beispiel #1
0
def test_datasaver_2d(experiment, DAC, DMM, caplog, n_points_1, n_points_2):
    meas = Measurement()
    meas.register_parameter(DAC.ch1)
    meas.register_parameter(DAC.ch2)
    meas.register_parameter(DMM.v1, setpoints=(DAC.ch1, DAC.ch2))

    n_points_expected_1 = 5
    n_points_expected_2 = 10

    meas.set_shapes(
        {DMM.v1.full_name: (
            n_points_expected_1,
            n_points_expected_2,
        )})

    with meas.run() as datasaver:

        for set_v_1 in np.linspace(0, 1, n_points_1):
            for set_v_2 in np.linspace(0, 1, n_points_2):
                datasaver.add_result((DAC.ch1, set_v_1), (DAC.ch2, set_v_2),
                                     (DMM.v1, DMM.v1()))

    ds = datasaver.dataset
    caplog.clear()
    data = ds.get_parameter_data()

    if n_points_1 * n_points_2 == n_points_expected_1 * n_points_expected_2:
        assert len(caplog.record_tuples) == 0
        for dataarray in data[DMM.v1.full_name].values():
            assert dataarray.shape == (n_points_expected_1,
                                       n_points_expected_2)
    elif n_points_1 * n_points_2 > n_points_expected_1 * n_points_expected_2:
        assert len(caplog.record_tuples) == 3
        exp_module = "qcodes.dataset.sqlite.queries"
        exp_level = logging.WARNING
        exp_msg = ("Tried to set data shape for {} in "
                   "dataset {} "
                   "from metadata when loading "
                   "but found inconsistent lengths {} and {}")
        assert caplog.record_tuples[0] == (exp_module, exp_level,
                                           exp_msg.format(
                                               DMM.v1.full_name,
                                               DMM.v1.full_name,
                                               n_points_1 * n_points_2,
                                               n_points_expected_1 *
                                               n_points_expected_2))
        assert caplog.record_tuples[1] == (exp_module, exp_level,
                                           exp_msg.format(
                                               DAC.ch1.full_name,
                                               DMM.v1.full_name,
                                               n_points_1 * n_points_2,
                                               n_points_expected_1 *
                                               n_points_expected_2))
        assert caplog.record_tuples[2] == (exp_module, exp_level,
                                           exp_msg.format(
                                               DAC.ch2.full_name,
                                               DMM.v1.full_name,
                                               n_points_1 * n_points_2,
                                               n_points_expected_1 *
                                               n_points_expected_2))
Beispiel #2
0
def _register_parameters(meas: Measurement,
                         param_meas: Sequence[ParamMeasT],
                         setpoints: Optional[Sequence[_BaseParameter]] = None,
                         shapes: Shapes = None) -> None:
    for parameter in param_meas:
        if isinstance(parameter, _BaseParameter):
            meas.register_parameter(parameter, setpoints=setpoints)
    meas.set_shapes(shapes=shapes)
Beispiel #3
0
def test_cache_2d_shape(experiment,
                        DAC,
                        DMM,
                        n_points_outer,
                        n_points_inner,
                        pws_n_points,
                        bg_writing,
                        channel_array_instrument,
                        cache_size):
    meas = Measurement()

    meas.register_parameter(DAC.ch1)
    meas.register_parameter(DAC.ch2)

    meas_parameters = (DMM.v1,
                       channel_array_instrument.A.dummy_multi_parameter,
                       channel_array_instrument.A.dummy_scalar_multi_parameter,
                       channel_array_instrument.A.dummy_2d_multi_parameter,
                       channel_array_instrument.A.dummy_2d_multi_parameter_2,
                       channel_array_instrument.A.dummy_array_parameter,
                       channel_array_instrument.A.dummy_complex_array_parameter,
                       channel_array_instrument.A.dummy_complex,
                       channel_array_instrument.A.dummy_parameter_with_setpoints,
                       channel_array_instrument.A.dummy_parameter_with_setpoints_complex,
                       )

    channel_array_instrument.A.dummy_start(0)
    channel_array_instrument.A.dummy_stop(10)
    channel_array_instrument.A.dummy_n_points(pws_n_points)
    for param in meas_parameters:
        meas.register_parameter(param, setpoints=(DAC.ch1, DAC.ch2))

    if cache_size == "too_small":
        meas.set_shapes(detect_shape_of_measurement(
            meas_parameters,
            (int(ceil(n_points_outer/2)), n_points_inner))
        )
    elif cache_size == "too_large":
        meas.set_shapes(detect_shape_of_measurement(
            meas_parameters,
            (n_points_outer*2, n_points_inner))
        )
    else:
        meas.set_shapes(detect_shape_of_measurement(
            meas_parameters,
            (n_points_outer, n_points_inner))
        )

    expected_shapes = {
        'dummy_dmm_v1': (n_points_outer, n_points_inner),
        'dummy_channel_inst_ChanA_multi_setpoint_param_this': (n_points_outer, n_points_inner, 5),
        'dummy_channel_inst_ChanA_multi_setpoint_param_that': (n_points_outer, n_points_inner, 5),
        'dummy_channel_inst_ChanA_thisparam': (n_points_outer, n_points_inner),
        'dummy_channel_inst_ChanA_thatparam': (n_points_outer, n_points_inner),
        'dummy_channel_inst_ChanA_this': (n_points_outer, n_points_inner, 5, 3),
        'dummy_channel_inst_ChanA_that': (n_points_outer, n_points_inner, 5, 3),
        'dummy_channel_inst_ChanA_this_5_3': (n_points_outer, n_points_inner, 5, 3),
        'dummy_channel_inst_ChanA_this_2_7': (n_points_outer, n_points_inner, 2, 7),
        'dummy_channel_inst_ChanA_dummy_array_parameter': (n_points_outer, n_points_inner, 5),
        'dummy_channel_inst_ChanA_dummy_complex_array_parameter': (n_points_outer, n_points_inner, 5),
        'dummy_channel_inst_ChanA_dummy_complex': (n_points_outer, n_points_inner),
        'dummy_channel_inst_ChanA_dummy_parameter_with_setpoints': (n_points_outer, n_points_inner, pws_n_points),
        'dummy_channel_inst_ChanA_dummy_parameter_with_setpoints_complex': (n_points_outer, n_points_inner, pws_n_points)
    }

    if cache_size == "correct":
        assert meas._shapes == expected_shapes

    with meas.run(write_in_background=bg_writing) as datasaver:
        dataset = datasaver.dataset
        # Check that parameter data and cache data are indential for empty datasets
        _assert_parameter_data_is_identical(dataset.get_parameter_data(), dataset.cache.data())
        n_points_measured = 0
        for v1 in np.linspace(-1, 1, n_points_outer):
            for v2 in np.linspace(-1, 1, n_points_inner):
                n_points_measured += 1
                DAC.ch1.set(v1)
                DAC.ch2.set(v2)
                meas_vals = [(param, param.get()) for param in meas_parameters]

                datasaver.add_result((DAC.ch1, v1),
                                     (DAC.ch2, v2),
                                     *meas_vals)
                datasaver.flush_data_to_database(block=True)
                param_data_trees = dataset.get_parameter_data()
                cache_data_trees = dataset.cache.data()

                _assert_partial_cache_is_as_expected(
                    cache_data_trees,
                    expected_shapes,
                    n_points_measured,
                    param_data_trees,
                    cache_size == "correct"
                )
    cache_data_trees = dataset.cache.data()
    param_data_trees = dataset.get_parameter_data()
    _assert_completed_cache_is_as_expected(cache_data_trees,
                                           param_data_trees,
                                           flatten=cache_size == "too_small",
                                           clip=cache_size == "too_large")
Beispiel #4
0
def test_cache_1d_shape(experiment, DAC, DMM, n_points, bg_writing,
                  channel_array_instrument, setpoints_type,
                  in_memory_cache):

    setpoints_param, setpoints_values = _prepare_setpoints_1d(
        DAC, channel_array_instrument,
        n_points, setpoints_type
    )

    meas = Measurement()

    meas.register_parameter(setpoints_param)

    meas_parameters = (DMM.v1,
                       channel_array_instrument.A.dummy_multi_parameter,
                       channel_array_instrument.A.dummy_scalar_multi_parameter,
                       channel_array_instrument.A.dummy_2d_multi_parameter,
                       channel_array_instrument.A.dummy_2d_multi_parameter_2,
                       channel_array_instrument.A.dummy_array_parameter,
                       channel_array_instrument.A.dummy_complex_array_parameter,
                       channel_array_instrument.A.dummy_complex,
                       channel_array_instrument.A.dummy_parameter_with_setpoints,
                       channel_array_instrument.A.dummy_parameter_with_setpoints_complex,
                       )
    pws_n_points = 10
    channel_array_instrument.A.dummy_start(0)
    channel_array_instrument.A.dummy_stop(10)
    channel_array_instrument.A.dummy_n_points(pws_n_points)

    expected_shapes = {
        'dummy_dmm_v1': (n_points, ),
        'dummy_channel_inst_ChanA_multi_setpoint_param_this': (n_points, 5),
        'dummy_channel_inst_ChanA_multi_setpoint_param_that': (n_points, 5),
        'dummy_channel_inst_ChanA_thisparam': (n_points, ),
        'dummy_channel_inst_ChanA_thatparam': (n_points, ),
        'dummy_channel_inst_ChanA_this': (n_points, 5, 3),
        'dummy_channel_inst_ChanA_that': (n_points, 5, 3),
        'dummy_channel_inst_ChanA_this_5_3': (n_points, 5, 3),
        'dummy_channel_inst_ChanA_this_2_7': (n_points, 2, 7),
        'dummy_channel_inst_ChanA_dummy_array_parameter': (n_points, 5),
        'dummy_channel_inst_ChanA_dummy_complex_array_parameter': (n_points, 5),
        'dummy_channel_inst_ChanA_dummy_complex': (n_points, ),
        'dummy_channel_inst_ChanA_dummy_parameter_with_setpoints': (n_points, pws_n_points),
        'dummy_channel_inst_ChanA_dummy_parameter_with_setpoints_complex': (n_points, pws_n_points)
    }

    for param in meas_parameters:
        meas.register_parameter(param, setpoints=(setpoints_param,))
    meas.set_shapes(detect_shape_of_measurement(
        meas_parameters,
        (n_points,))
    )
    n_points_measured = 0
    with meas.run(write_in_background=bg_writing,
                  in_memory_cache=in_memory_cache) as datasaver:
        dataset = datasaver.dataset
        _assert_parameter_data_is_identical(dataset.get_parameter_data(), dataset.cache.data())
        for i, v in enumerate(setpoints_values):
            n_points_measured += 1
            setpoints_param.set(v)

            meas_vals = [(param, param.get()) for param in meas_parameters[:-2]]
            meas_vals += expand_setpoints_helper(meas_parameters[-2])
            meas_vals += expand_setpoints_helper(meas_parameters[-1])

            datasaver.add_result((setpoints_param, v),
                                 *meas_vals)
            datasaver.flush_data_to_database(block=True)
            cache_data_trees = dataset.cache.data()
            param_data_trees = dataset.get_parameter_data()
            _assert_partial_cache_is_as_expected(
                cache_data_trees,
                expected_shapes,
                n_points_measured,
                param_data_trees,
                cache_correct=True
            )
    cache_data_trees = dataset.cache.data()
    param_data_trees = dataset.get_parameter_data()

    _assert_completed_cache_is_as_expected(cache_data_trees,
                                           param_data_trees,
                                           flatten=False)
Beispiel #5
0
def test_cache_1d(experiment, DAC, DMM, n_points, bg_writing,
                  channel_array_instrument, setpoints_type,
                  set_shape, in_memory_cache):

    setpoints_param, setpoints_values = _prepare_setpoints_1d(
        DAC, channel_array_instrument,
        n_points, setpoints_type
    )

    meas1 = Measurement()

    meas1.register_parameter(setpoints_param)

    meas_parameters1 = (
        DMM.v1,
        channel_array_instrument.A.dummy_multi_parameter,
        channel_array_instrument.A.dummy_scalar_multi_parameter,
        channel_array_instrument.A.dummy_2d_multi_parameter,
        channel_array_instrument.A.dummy_2d_multi_parameter_2,
        channel_array_instrument.A.dummy_array_parameter,
        channel_array_instrument.A.dummy_complex_array_parameter,
        channel_array_instrument.A.dummy_complex,
        channel_array_instrument.A.dummy_parameter_with_setpoints,
        channel_array_instrument.A.dummy_parameter_with_setpoints_complex,
    )
    pws_shape_1 = 10
    pws_shape_2 = 3
    channel_array_instrument.A.dummy_start(0)
    channel_array_instrument.A.dummy_stop(10)
    channel_array_instrument.A.dummy_n_points(pws_shape_1)
    channel_array_instrument.A.dummy_start_2(2)
    channel_array_instrument.A.dummy_stop_2(7)
    channel_array_instrument.A.dummy_n_points_2(pws_shape_2)

    if set_shape:
        meas1.set_shapes(
            {
                DMM.v1.full_name: (n_points,),
                channel_array_instrument.A.dummy_multi_parameter.full_names[0]: (n_points, 5),
                channel_array_instrument.A.dummy_multi_parameter.full_names[1]: (n_points, 5),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[0]: (n_points,),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[1]: (n_points,),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[0]: (n_points,),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[1]: (n_points,),
                channel_array_instrument.A.dummy_2d_multi_parameter.full_names[0]: (n_points, 5, 3),
                channel_array_instrument.A.dummy_2d_multi_parameter.full_names[1]: (n_points, 5, 3),
                channel_array_instrument.A.dummy_2d_multi_parameter_2.full_names[0]: (n_points, 5, 3),
                channel_array_instrument.A.dummy_2d_multi_parameter_2.full_names[1]: (n_points, 2, 7),
                channel_array_instrument.A.dummy_array_parameter.full_name: (n_points, 5),
                channel_array_instrument.A.dummy_complex_array_parameter.full_name: (n_points, 5),
                channel_array_instrument.A.dummy_complex.full_name: (n_points,),
                channel_array_instrument.A.dummy_parameter_with_setpoints.full_name: (n_points, pws_shape_1),
                channel_array_instrument.A.dummy_parameter_with_setpoints_complex.full_name: (n_points, pws_shape_1)
             }
        )

    for param in meas_parameters1:
        meas1.register_parameter(param, setpoints=(setpoints_param,))

    meas2 = Measurement()

    meas2.register_parameter(setpoints_param)

    meas_parameters2 = (channel_array_instrument.A.dummy_parameter_with_setpoints_2d,)

    if set_shape:
        meas2.set_shapes(
            {meas_parameters2[0].full_name: (n_points, pws_shape_1, pws_shape_2)})

    for param in meas_parameters2:
        meas2.register_parameter(param, setpoints=(setpoints_param,))

    with meas1.run(
            write_in_background=bg_writing,
            in_memory_cache=in_memory_cache
    ) as datasaver1:
        with meas2.run(
                write_in_background=bg_writing,
                in_memory_cache=in_memory_cache
        ) as datasaver2:

            dataset1 = datasaver1.dataset
            dataset2 = datasaver2.dataset
            _assert_parameter_data_is_identical(dataset1.get_parameter_data(), dataset1.cache.data())
            _assert_parameter_data_is_identical(dataset2.get_parameter_data(), dataset2.cache.data())
            for i, v in enumerate(setpoints_values):
                setpoints_param.set(v)

                meas_vals1 = [(param, param.get()) for param in meas_parameters1]#[:-2]]
                meas_vals1 += expand_setpoints_helper(meas_parameters1[-2])
                meas_vals1 += expand_setpoints_helper(meas_parameters1[-1])

                datasaver1.add_result((setpoints_param, v),
                                      *meas_vals1)
                datasaver1.flush_data_to_database(block=True)

                meas_vals2 = [(param, param.get()) for param in meas_parameters2]

                datasaver2.add_result((setpoints_param, v),
                                      *meas_vals2)
                datasaver2.flush_data_to_database(block=True)

                _assert_parameter_data_is_identical(dataset1.get_parameter_data(),
                                                    dataset1.cache.data(),
                                                    shaped_partial=set_shape)
                _assert_parameter_data_is_identical(dataset2.get_parameter_data(),
                                                    dataset2.cache.data(),
                                                    shaped_partial=set_shape)
    _assert_parameter_data_is_identical(dataset1.get_parameter_data(),
                                        dataset1.cache.data())
    if in_memory_cache is False:
        assert dataset1.cache._loaded_from_completed_ds is True
    assert dataset1.completed is True
    assert dataset1.cache.live is in_memory_cache
    _assert_parameter_data_is_identical(dataset2.get_parameter_data(),
                                        dataset2.cache.data())
    if in_memory_cache is False:
        assert dataset2.cache._loaded_from_completed_ds is True
    assert dataset2.completed is True
    assert dataset1.cache.live is in_memory_cache
Beispiel #6
0
def test_cache_standalone(
    experiment,
    DMM,
    n_points,
    bg_writing,
    channel_array_instrument,
    set_shape,
    in_memory_cache,
):

    meas1 = Measurement()
    meas1.register_parameter(DMM.v1)

    meas_parameters1 = (
        DMM.v1,
        channel_array_instrument.A.dummy_multi_parameter,
        channel_array_instrument.A.dummy_scalar_multi_parameter,
        channel_array_instrument.A.dummy_2d_multi_parameter,
        channel_array_instrument.A.dummy_2d_multi_parameter_2,
        channel_array_instrument.A.dummy_array_parameter,
        channel_array_instrument.A.dummy_complex_array_parameter,
        channel_array_instrument.A.dummy_complex,
        channel_array_instrument.A.dummy_parameter_with_setpoints,
        channel_array_instrument.A.dummy_parameter_with_setpoints_complex,
    )
    pws_shape_1 = 10
    pws_shape_2 = 3
    channel_array_instrument.A.dummy_start(0)
    channel_array_instrument.A.dummy_stop(10)
    channel_array_instrument.A.dummy_n_points(pws_shape_1)
    channel_array_instrument.A.dummy_start_2(2)
    channel_array_instrument.A.dummy_stop_2(7)
    channel_array_instrument.A.dummy_n_points_2(pws_shape_2)

    if set_shape:
        meas1.set_shapes(
            {
                DMM.v1.full_name: (n_points,),
                channel_array_instrument.A.dummy_multi_parameter.full_names[0]: (
                    n_points,
                    5,
                ),
                channel_array_instrument.A.dummy_multi_parameter.full_names[1]: (
                    n_points,
                    5,
                ),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[0]: (
                    n_points,
                ),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[1]: (
                    n_points,
                ),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[0]: (
                    n_points,
                ),
                channel_array_instrument.A.dummy_scalar_multi_parameter.full_names[1]: (
                    n_points,
                ),
                channel_array_instrument.A.dummy_2d_multi_parameter.full_names[0]: (
                    n_points,
                    5,
                    3,
                ),
                channel_array_instrument.A.dummy_2d_multi_parameter.full_names[1]: (
                    n_points,
                    5,
                    3,
                ),
                channel_array_instrument.A.dummy_2d_multi_parameter_2.full_names[0]: (
                    n_points,
                    5,
                    3,
                ),
                channel_array_instrument.A.dummy_2d_multi_parameter_2.full_names[1]: (
                    n_points,
                    2,
                    7,
                ),
                channel_array_instrument.A.dummy_array_parameter.full_name: (
                    n_points,
                    5,
                ),
                channel_array_instrument.A.dummy_complex_array_parameter.full_name: (
                    n_points,
                    5,
                ),
                channel_array_instrument.A.dummy_complex.full_name: (n_points,),
                channel_array_instrument.A.dummy_parameter_with_setpoints.full_name: (
                    n_points,
                    pws_shape_1,
                ),
                channel_array_instrument.A.dummy_parameter_with_setpoints_complex.full_name: (
                    n_points,
                    pws_shape_1,
                ),
            }
        )

    for param in meas_parameters1:
        meas1.register_parameter(param)

    meas2 = Measurement()

    meas_parameters2 = (channel_array_instrument.A.dummy_parameter_with_setpoints_2d,)

    if set_shape:
        meas2.set_shapes(
            {meas_parameters2[0].full_name: (n_points, pws_shape_1, pws_shape_2)}
        )

    for param in meas_parameters2:
        meas2.register_parameter(param)

    with meas1.run(
        write_in_background=bg_writing, in_memory_cache=in_memory_cache
    ) as datasaver1:
        with meas2.run(
            write_in_background=bg_writing, in_memory_cache=in_memory_cache
        ) as datasaver2:

            dataset1 = datasaver1.dataset
            dataset2 = datasaver2.dataset
            _assert_parameter_data_is_identical(
                dataset1.get_parameter_data(), dataset1.cache.data()
            )
            _assert_parameter_data_is_identical(
                dataset2.get_parameter_data(), dataset2.cache.data()
            )
            for _ in range(n_points):

                meas_vals1 = [(param, param.get()) for param in meas_parameters1]

                datasaver1.add_result(*meas_vals1)
                datasaver1.flush_data_to_database(block=True)

                meas_vals2 = [(param, param.get()) for param in meas_parameters2]

                datasaver2.add_result(*meas_vals2)
                datasaver2.flush_data_to_database(block=True)

                _assert_parameter_data_is_identical(
                    dataset1.get_parameter_data(),
                    dataset1.cache.data(),
                    shaped_partial=set_shape,
                )
                _assert_parameter_data_is_identical(
                    dataset2.get_parameter_data(),
                    dataset2.cache.data(),
                    shaped_partial=set_shape,
                )
    _assert_parameter_data_is_identical(
        dataset1.get_parameter_data(), dataset1.cache.data()
    )
    if in_memory_cache is False:
        assert dataset1.cache._loaded_from_completed_ds is True
    assert dataset1.completed is True
    assert dataset1.cache.live is in_memory_cache
    _assert_parameter_data_is_identical(
        dataset2.get_parameter_data(), dataset2.cache.data()
    )
    if in_memory_cache is False:
        assert dataset2.cache._loaded_from_completed_ds is True
    assert dataset2.completed is True
    assert dataset1.cache.live is in_memory_cache
Beispiel #7
0
def test_plot_dataset_2d_shaped(experiment, request, nan_setpoints, shifted):
    """
    Test plotting of preshaped data on a grid that may or may not be shifted
    with and without nans in the set points.
    """
    inst = DummyInstrument("dummy", gates=["s1", "m1", "s2"])
    request.addfinalizer(inst.close)

    inst.m1.get = np.random.randn

    meas = Measurement()
    meas.register_parameter(inst.s1)
    meas.register_parameter(inst.s2)
    meas.register_parameter(inst.m1, setpoints=(inst.s1, inst.s2))

    outer_shape = 10
    inner_shape = 20

    meas.set_shapes(
        detect_shape_of_measurement((inst.m1, ), (outer_shape, inner_shape)))

    shift = 0

    with meas.run() as datasaver:
        try:
            for outer in np.linspace(0, 9, outer_shape):
                for inner in np.linspace(0 + shift, 10 + shift, inner_shape):
                    datasaver.add_result((inst.s1, outer), (inst.s2, inner),
                                         (inst.m1, inst.m1()))
                    if inner > 7 and outer > 6 and nan_setpoints:
                        raise TerminateLoopException
                if shifted:
                    shift += 1
        except TerminateLoopException:
            pass

    axes, cbs = plot_dataset(datasaver.dataset)
    xlims = axes[0].get_xlim()
    ylims = axes[0].get_ylim()

    # check that this generates a QuadMesh which is the expected output of pcolormesh
    assert any(
        isinstance(mplobj, QuadMesh) for mplobj in axes[0].get_children())

    if nan_setpoints and shifted:
        assert xlims[0] == -0.5
        assert xlims[1] == 7.5
        assert ylims[0] < 0
        assert ylims[0] > -1.0
        assert ylims[1] > 16
        assert ylims[1] < 17
    elif not nan_setpoints and shifted:
        assert xlims[0] == -0.5
        assert xlims[1] == 9.5
        assert ylims[0] < 0
        assert ylims[0] > -1.0
        assert ylims[1] > 19
        assert ylims[1] < 20
    elif nan_setpoints and not shifted:
        assert xlims[0] == -0.5
        assert xlims[1] == 7.5
        assert ylims[0] < 0
        assert ylims[0] > -1.0
        assert ylims[1] > 10
        assert ylims[1] < 11
    else:
        assert xlims[0] == -0.5
        assert xlims[1] == 9.5
        assert ylims[0] < 0
        assert ylims[0] > -1.0
        assert ylims[1] > 10
        assert ylims[1] < 11