Exemple #1
0
def test_rdts_save_memory():
    np.random.seed(2047294792)
    n = 10
    df = get_df(n=n)
    df = prepare_twiss_dataframe(df_twiss=df)
    df.loc[:, "K2L"] = np.random.rand(n)
    df.loc[:, "K2SL"] = np.random.rand(n)

    df_save = calculate_rdts(df, rdts=["F1002", "F2001"], loop_phases=True)
    df_notsave = calculate_rdts(df, rdts=["F1002", "F2001"], loop_phases=False)
    assert not df_save.isna().any().any()
    assert ((df_save - df_notsave).abs() < 1e-14).all().all()
Exemple #2
0
def coupling_via_rdts(df: TfsDataFrame, complex_columns: bool = True, **kwargs) -> TfsDataFrame:
    """Returns the coupling terms.

    .. warning::
        This function changes sign of the real part of the RDTs compared to
        [FranchiAnalyticFormulas2017]_ to be consistent with the RDT
        calculations from [CalagaBetatronCoupling2005]_ .

    Args:
        df (TfsDataFrame): Twiss Dataframe.
        complex_columns (bool): Output complex values in single column of type complex.
                                If ``False``, split complex columns into
                                two real-valued columns.

    Keyword Args:
        **kwargs: Remaining arguments from :func:`~optics_functions.rdt.rdts`
                  i.e. ``qx``, ``qy``, ``feeddown``, ``loop_phases``
                  and ``hamiltionian_terms``.

    Returns:
        A new ``TfsDataFrame`` with Coupling Columns.
    """
    df_res = calculate_rdts(df, rdts=COUPLING_RDTS, **kwargs)
    for rdt in COUPLING_RDTS:
        rdt_array = df_res[rdt].to_numpy()  # might return a copy!
        rdt_array.real *= -1  # definition
        df_res.loc[:, rdt] = rdt_array

    if not complex_columns:
        df_res = split_complex_columns(df_res, COUPLING_RDTS)
    return df_res
Exemple #3
0
def test_rdts_normal_sextupole_bump():
    df = get_df(n=7)
    df = prepare_twiss_dataframe(df_twiss=df)
    df.loc["3", "K2L"] = 1
    df.loc["5", "K2L"] = -1

    df_rdts = calculate_rdts(df, rdts=["F1002", "F2001"])
    df_diff, df_jump = get_absdiff_and_jumps(df_rdts)
    assert not df_rdts.isna().any().any()
    assert not df_jump["F2001"].any()
    assert df_jump.loc[["3", "5"], "F1002"].all()
    assert not df_jump.loc[df_jump.index.difference(["3", "5"]), "F1002"].any()
Exemple #4
0
def test_rdts_skew_octupole_bump():
    df = get_df(n=8)
    df = prepare_twiss_dataframe(df_twiss=df)
    df.loc["3", "K3SL"] = 1
    df.loc["5", "K3SL"] = -1

    df_rdts = calculate_rdts(df, rdts=["F4000", "F3001"])
    df_diff, df_jump = get_absdiff_and_jumps(df_rdts)
    assert not df_rdts.isna().any().any()
    assert not df_jump["F4000"].any()
    assert df_jump.loc[["3", "5"], "F3001"].all()
    assert not df_jump.loc[df_jump.index.difference(["3", "5"]), "F3001"].any()
Exemple #5
0
def test_wrong_rdt_names():
    df = get_df(n=8)
    df = prepare_twiss_dataframe(df_twiss=df)
    with pytest.raises(ValueError):
        calculate_rdts(df, rdts=["F10003", "F1002"])

    with pytest.raises(ValueError):
        calculate_rdts(df, rdts=["F102", "F1002"])

    with pytest.raises(ValueError):
        calculate_rdts(df, rdts=["M1003"])

    with pytest.raises(ValueError):
        calculate_rdts(df, rdts=["F1000"])
Exemple #6
0
def test_rdts_normal_octupole_to_sextupole_feeddown():
    df = get_df(n=15)
    df = prepare_twiss_dataframe(df_twiss=df)
    df_comp = df.copy()

    df.loc["3", "K3L"] = 1
    df.loc["5", "K3L"] = -1

    df_comp.loc["3", ["K2L", "K2SL"]] = 1
    df_comp.loc["5", ["K2L", "K2SL"]] = -1

    df_rdts = calculate_rdts(df, rdts=["F1002", "F2001"], feeddown=1)
    df_rdts_comp = calculate_rdts(df_comp, rdts=["F1002", "F2001"])

    assert not df_rdts["F2001"].any()
    assert not df_rdts["F1002"].any()

    # Feed-down K3L -> K2L
    df["X"] = 1
    df["Y"] = 0
    df_rdts = calculate_rdts(df, rdts=["F1002", "F2001"], feeddown=1)
    assert not df_rdts["F2001"].any()
    assert df_rdts["F1002"].all()
    assert all(df_rdts["F1002"] == df_rdts_comp["F1002"])

    # Feed-down K3L -> K2SL
    df["X"] = 0
    df["Y"] = 1
    df_rdts = calculate_rdts(df, rdts=["F1002", "F2001"], feeddown=1)
    assert not df_rdts["F1002"].any()
    assert df_rdts["F2001"].all()
    assert all(df_rdts["F2001"] == df_rdts_comp["F2001"])

    # Feed-down K3L -> K2L, K2SL
    df["X"] = 1
    df["Y"] = 1
    df_rdts = calculate_rdts(df, rdts=["F1002", "F2001"], feeddown=1)
    assert all(df_rdts["F1002"] == df_rdts_comp["F1002"])
    assert all(df_rdts["F2001"] == df_rdts_comp["F2001"])
Exemple #7
0
def test_coupling_bump_sextupole_rdts():
    input_dir = INPUT / "coupling_bump"
    df_twiss = tfs.read(input_dir / "twiss.lhc.b1.coupling_bump.tfs",
                        index=NAME)
    df_ptc_rdt = tfs.read(input_dir / "ptc_rdt.lhc.b1.coupling_bump.tfs",
                          index=NAME)
    df_twiss = prepare_twiss_dataframe(df_twiss=df_twiss)
    rdt_names = ["F1002", "F3000"]
    df_rdt = calculate_rdts(df_twiss, rdt_names)

    for rdt in rdt_names:
        rdt_ptc = df_ptc_rdt[f"{rdt}{REAL}"] + 1j * df_ptc_rdt[f"{rdt}{IMAG}"]
        assert arrays_are_close_almost_everywhere(df_rdt[rdt],
                                                  rdt_ptc,
                                                  rtol=1e-2,
                                                  percentile=0.9)
Exemple #8
0
def test_missing_columns():
    df = get_df(n=8)
    with pytest.raises(KeyError) as e:
        calculate_rdts(df, rdts=["F1002"])
    assert "K2L" in str(e.value)

    df["K2L"] = 1
    with pytest.raises(KeyError) as e:
        calculate_rdts(df, rdts=["F1002", "F2001"])
    assert "K2SL" in str(e.value)

    df["K2SL"] = 1
    with pytest.raises(KeyError) as e:
        calculate_rdts(df, rdts=["F2001", "F1002"], feeddown=1)
    assert "K3L" in str(e.value)

    df = df.drop(columns=[f"{PHASE_ADV}{X}"])
    with pytest.raises(KeyError) as e:
        calculate_rdts(df, rdts=["F2001", "F1002"])
    assert f"{PHASE_ADV}{X}" in str(e.value)
Exemple #9
0
def test_rdts_normal_dodecapole_to_octupole_feeddown():
    df = get_df(n=7)
    df = prepare_twiss_dataframe(df_twiss=df)
    df_comp = df.copy()

    df.loc["3", "K5L"] = 1
    df.loc["5", "K5L"] = -1

    df_comp.loc["3", ["K3L", "K3SL"]] = 1
    df_comp.loc["5", ["K3L", "K3SL"]] = -1

    df_rdts = calculate_rdts(df, rdts=["F1003", "F0004"], feeddown=2)
    df_rdts_comp = calculate_rdts(df_comp, rdts=["F1003", "F0004"])

    assert not df_rdts["F1003"].any()
    assert not df_rdts["F0004"].any()

    # Feed-down K5L -> (x**2-y**2)/2 K3L , xy K3SL
    # Feed-down K5L -> K3L
    df["X"] = 1
    df["Y"] = 0
    df_rdts = calculate_rdts(df, rdts=["F1003", "F0004"], feeddown=2)
    assert not df_rdts["F1003"].any()
    assert df_rdts["F0004"].all()
    assert all(df_rdts["F0004"] == 0.5 * df_rdts_comp["F0004"])

    # Feed-down K5L -> K3L
    df["X"] = 0
    df["Y"] = 1
    df_rdts = calculate_rdts(df, rdts=["F1003", "F0004"], feeddown=2)
    assert not df_rdts["F1003"].any()
    assert df_rdts["F0004"].all()
    assert all(df_rdts["F0004"] == -0.5 * df_rdts_comp["F0004"])

    # Feed-down K5L -> K3SL
    df["X"] = 1
    df["Y"] = 1
    df_rdts = calculate_rdts(df, rdts=["F1003", "F0004"], feeddown=2)
    assert not df_rdts["F0004"].any()
    assert df_rdts["F1003"].all()
    assert all(df_rdts["F1003"] == df_rdts_comp["F1003"])

    # Feed-down K5L -> (x**2-y**2)/2 K3L , xy K3SL
    df["X"] = 1
    df["Y"] = 0.5
    df_rdts = calculate_rdts(df, rdts=["F1003", "F0004"], feeddown=2)
    assert all(
        (df_rdts["F0004"] - 0.375 * df_rdts_comp["F0004"]).abs() <= 1e-15)
    assert all(df_rdts["F1003"] == 0.5 * df_rdts_comp["F1003"])
Exemple #10
0
def test_real_terms_and_hamiltonians():
    np.random.seed(2047294792)
    n = 12
    df = get_df(n=n)
    df = prepare_twiss_dataframe(df_twiss=df)
    df.loc[:, "K2L"] = np.random.rand(n)
    df.loc[:, "K2SL"] = np.random.rand(n)
    rdts = ["F1002", "F2001"]
    df_rdts = calculate_rdts(df,
                             rdts=rdts,
                             complex_columns=False,
                             hamiltionian_terms=True)

    n_rdts = len(rdts)
    assert all(np.real(df_rdts) == df_rdts)
    assert len(df_rdts.columns) == 4 * n_rdts
    assert df_rdts.columns.str.match(f".+{REAL}$").sum() == 2 * n_rdts
    assert df_rdts.columns.str.match(f".+{IMAG}$").sum() == 2 * n_rdts
    assert df_rdts.columns.str.match("F").sum() == 2 * n_rdts
    assert df_rdts.columns.str.match("H").sum() == 2 * n_rdts