"""Dictionaries storing the generic beat-coefficients for simulating segmented
photoiodes.
Builtin pdtypes:
* SINGLE - single element photodiode
* XSPLIT - measuring horizontal/yaw motions
* YSPLIT - measuring vertical/pitch motions
Use the function `construct_segment_beat_matrix` to convert these dictionary definitions
into a dense or sparse CSR matrix for using in calculations.
"""
import numpy as np
import numbers
from finesse.cymath.sparsemath import CSRMatrix
[docs]def get_pdtype(pdtype: str) -> dict:
    """Returns a pdtype dictionary definition in this module for a given string name."""
    return globals()[pdtype.upper()] if isinstance(pdtype, str) else pdtype 
[docs]def construct_segment_beat_matrix(
    mode_index_map, beats_dict, sparse_output=False, assert_hermitian=True
):
    """Takes a pdtype definition dict and converts it into a matrix suitable to use with
    a KnmMatrix.
    Parameters
    ----------
    mode_index_map : dict[(n,m), index]
        Dictionary of mode indices and index
    beats_dict : str, pdtype style dict
        A dictionary in the pdtype style describing a particular segmentation
        type for a sensor. If a string is given it will try and get a builtin
        pdtype dict
    sparse_output : bool, optional
        Return a sparse CSR matrix object rather than a dense one
    assert_hermitian : bool, optional
        If true then the generated matrix from the pdtype definition must be Hermitian
    Returns
    -------
    2D Complex matrix of size (N, N) with N=len(mode_index_map) or a
    CSRMatrix if requested.
    Examples
    --------
    >>> pdtypes.construct_segment_beat_matrix(model.mode_index_map, pdtype.YSPLIT)
    array([[0.        +0.j, 0.79788456+0.j, 0.        +0.j],
           [0.79788456+0.j, 0.        +0.j, 0.        +0.j],
           [0.        +0.j, 0.        +0.j, 0.        +0.j]])
    Another example showing how to manually compute the segmented photodiode
    beat signal using this matrix output whilst misaligning some optic.
    >>> import finesse
    >>> import matplotlib.pyplot as plt
    >>> finesse.init_plotting()
    >>> # Simple laser reflecting from a steering mirror
    >>> model = finesse.script.parse('''
    ... l l1 P=1
    ... bs bs1 R=1 T=0
    ... nothing n1
    ... link(l1, bs1, 10, n1)
    ... fd E n1.p1.i f=0
    ... xaxis(bs1.xbeta, lin, 0, 1e-6, 4)
    ... gauss g1 l1.p1.o w=1m Rc=inf
    ... modes(maxtem=3)
    ... ''')
    >>> # Run the model and extract the matrix of mode amplitudes
    >>> sol = model.run()
    >>> E = sol['E']
    >>> # Get the beat matrix for a quadrant photodiode
    >>> M = finesse.detectors.pdtypes.construct_segment_beat_matrix(
    ...     model.mode_index_map,
    ...     finesse.detectors.pdtypes.XSPLIT
    ... )
    >>> # Compute E^* . M . E over the array
    >>> S = (E.conj() * (M @ E.T).T).sum(1)
    >>> plt.plot(sol.x1, abs(S))
    >>> plt.xlabel("Misalignment [rad]")
    >>> plt.ylabel("Signal [W]")
    >>> plt.title("QPD alignment signal")
    """
    # TODO ddb - don't need to generate the dense matrix first to then
    # convert it into a sparse representation, would be more efficient
    # to go straight to sparse.
    if isinstance(beats_dict, str):
        beats_dict = get_pdtype(beats_dict)
    N = len(mode_index_map)
    _beats = np.zeros((N, N), dtype=complex)
    maxtem = max(max(mode_index_map, key=lambda x: max(x)))
    for (n1, m1, n2, m2), factor in beats_dict.items():
        if all(isinstance(k, numbers.Number) for k in (n1, m1, n2, m2)):
            idx = mode_index_map.get((n1, m1), -1)
            jdx = mode_index_map.get((n2, m2), -1)
            if idx >= 0 and jdx >= 0:
                _beats[idx, jdx] = factor
                _beats[jdx, idx] = factor
        elif all(k in ("x", "y") for k in (m1, m2)) and all(
            isinstance(k, numbers.Number) for k in (n1, n2)
        ):
            for m in range(maxtem + 1):
                idx = mode_index_map.get((n1, m), -1)
                jdx = mode_index_map.get((n2, m), -1)
                if idx >= 0 and jdx >= 0:
                    _beats[idx, jdx] = factor
                    _beats[jdx, idx] = factor
        elif all(k in ("x", "y") for k in (n1, n2)) and all(
            isinstance(k, numbers.Number) for k in (m1, m2)
        ):
            for n in range(maxtem + 1):
                idx = mode_index_map.get((n, m1), -1)
                jdx = mode_index_map.get((n, m2), -1)
                if idx >= 0 and jdx >= 0:
                    _beats[idx, jdx] = factor
                    _beats[jdx, idx] = factor
        elif n1 == n2 and m1 == m2:
            for n in range(maxtem + 1):
                for m in range(maxtem + 1):
                    idx = mode_index_map.get((n, m), -1)
                    jdx = mode_index_map.get((n, m), -1)
                    if idx >= 0 and jdx >= 0:
                        _beats[idx, jdx] = factor
                        _beats[jdx, idx] = factor
        elif n1 == m2 and m1 == n2:
            for n in range(maxtem + 1):
                for m in range(maxtem + 1):
                    idx = mode_index_map.get((n, m), -1)
                    jdx = mode_index_map.get((m, n), -1)
                    if idx >= 0 and jdx >= 0:
                        _beats[idx, jdx] = factor
                        _beats[jdx, idx] = factor
        else:
            raise NotImplementedError()
    if assert_hermitian:
        if np.all(_beats - _beats.T.conj() != 0):
            raise Exception(f"Matrix generated by pdtype was not Hermitian:\n{_beats}")
    if sparse_output:
        return CSRMatrix(_beats)
    else:
        return _beats 
SINGLE = {
    ("x", "y", "x", "y"): 1,
}
# split detector in x-direction, for up to TEM-order 40
XSPLIT = {
    (0, "x", 1, "x"): 0.797884560802865,
    (0, "x", 3, "x"): -0.32573500793528,
    (0, "x", 5, "x"): 0.218509686118416,
    (0, "x", 7, "x"): -0.168583882836184,
    (0, "x", 9, "x"): 0.139074607877595,
    (0, "x", 11, "x"): -0.119342192152758,
    (0, "x", 13, "x"): 0.105105246952602,
    (0, "x", 15, "x"): -0.0942883643366128,
    (0, "x", 17, "x"): 0.085756077667627,
    (0, "x", 19, "x"): -0.0788316791424408,
    (0, "x", 21, "x"): 0.0730852493544752,
    (0, "x", 23, "x"): -0.0682297483293215,
    (0, "x", 25, "x"): 0.0640657596627177,
    (0, "x", 27, "x"): -0.0604501569509354,
    (0, "x", 29, "x"): 0.0572773850389327,
    (0, "x", 31, "x"): -0.0544677839262821,
    (0, "x", 33, "x"): 0.051960035687153,
    (0, "x", 35, "x"): -0.0497061241097501,
    (0, "x", 37, "x"): 0.0476678793880178,
    (0, "x", 39, "x"): -0.0458145530435871,
    (2, "x", 1, "x"): 0.564189583547756,
    (2, "x", 3, "x"): 0.690988298942671,
    (2, "x", 5, "x"): -0.257516134682126,
    (2, "x", 7, "x"): 0.166889529453114,
    (2, "x", 9, "x"): -0.126437912127138,
    (2, "x", 11, "x"): 0.103140489653524,
    (2, "x", 13, "x"): -0.0878334751963756,
    (2, "x", 15, "x"): 0.0769291636262386,
    (2, "x", 17, "x"): -0.0687238645863045,
    (2, "x", 19, "x"): 0.0623003460579352,
    (2, "x", 21, "x"): -0.0571189780993917,
    (2, "x", 23, "x"): 0.0528405479815828,
    (2, "x", 25, "x"): -0.0492405794558427,
    (2, "x", 27, "x"): 0.0461642931761014,
    (2, "x", 29, "x"): -0.0435013182859334,
    (2, "x", 31, "x"): 0.0411707144994762,
    (2, "x", 33, "x"): -0.0391116996228281,
    (2, "x", 35, "x"): 0.0372776912078078,
    (2, "x", 37, "x"): -0.0356323539463384,
    (2, "x", 39, "x"): 0.0341469044387,
    (4, "x", 1, "x"): -0.16286750396764,
    (4, "x", 3, "x"): 0.598413420602149,
    (4, "x", 5, "x"): 0.669046543557289,
    (4, "x", 7, "x"): -0.240884286886713,
    (4, "x", 9, "x"): 0.153297821464992,
    (4, "x", 11, "x"): -0.114842936826923,
    (4, "x", 13, "x"): 0.092969581005561,
    (4, "x", 15, "x"): -0.0787358118089783,
    (4, "x", 17, "x"): 0.0686730145130556,
    (4, "x", 19, "x"): -0.0611475066641648,
    (4, "x", 21, "x"): 0.0552860726690191,
    (4, "x", 23, "x"): -0.0505782313126719,
    (4, "x", 25, "x"): 0.0467048872492379,
    (4, "x", 27, "x"): -0.0434559246068004,
    (4, "x", 29, "x"): 0.0406871064724294,
    (4, "x", 31, "x"): -0.0382959872150584,
    (4, "x", 33, "x"): 0.0362077065246626,
    (4, "x", 35, "x"): -0.0343662293597736,
    (4, "x", 37, "x"): 0.0327287372726021,
    (4, "x", 39, "x"): -0.031261920230486,
    (6, "x", 1, "x"): 0.0892062058076385,
    (6, "x", 3, "x"): -0.18209140509868,
    (6, "x", 5, "x"): 0.61075313987865,
    (6, "x", 7, "x"): 0.659688788381993,
    (6, "x", 9, "x"): -0.233235207868822,
    (6, "x", 11, "x"): 0.146771489830575,
    (6, "x", 13, "x"): -0.109117578596892,
    (6, "x", 15, "x"): 0.0878479967266388,
    (6, "x", 17, "x"): -0.0740877073983095,
    (6, "x", 19, "x"): 0.0644074398753087,
    (6, "x", 21, "x"): -0.0571982549981952,
    (6, "x", 23, "x"): 0.0516033260749633,
    (6, "x", 25, "x"): -0.0471234847486845,
    (6, "x", 27, "x"): 0.043447712204836,
    (6, "x", 29, "x"): -0.0403718224901522,
    (6, "x", 31, "x"): 0.0377560369073105,
    (6, "x", 33, "x"): -0.0355013303057689,
    (6, "x", 35, "x"): 0.0335355132263835,
    (6, "x", 37, "x"): -0.031804668469598,
    (6, "x", 39, "x"): 0.0302676798757954,
    (8, "x", 1, "x"): -0.059603403376112,
    (8, "x", 3, "x"): 0.102198547643328,
    (8, "x", 5, "x"): -0.190435749776861,
    (8, "x", 7, "x"): 0.617082357005358,
    (8, "x", 9, "x"): 0.6545146787836,
    (8, "x", 11, "x"): -0.228820262121828,
    (8, "x", 13, "x"): 0.142898207894381,
    (8, "x", 15, "x"): -0.10565264117106,
    (8, "x", 17, "x"): 0.0847033053948983,
    (8, "x", 19, "x"): -0.0712017602555549,
    (8, "x", 21, "x"): 0.0617354634590125,
    (8, "x", 23, "x"): -0.0547065570873058,
    (8, "x", 25, "x"): 0.0492658641354183,
    (8, "x", 27, "x"): -0.0449196778881935,
    (8, "x", 29, "x"): 0.0413609897651131,
    (8, "x", 31, "x"): -0.0383886289102033,
    (8, "x", 33, "x"): 0.0358651299902981,
    (8, "x", 35, "x"): -0.0336932742842578,
    (8, "x", 37, "x"): 0.0318023047767947,
    (8, "x", 39, "x"): -0.030139455674167,
    (10, "x", 1, "x"): 0.0439792525587995,
    (10, "x", 3, "x"): -0.0692528965958894,
    (10, "x", 5, "x"): 0.108397929099021,
    (10, "x", 7, "x"): -0.195138575204209,
    (10, "x", 9, "x"): 0.620927144090899,
    (10, "x", 11, "x"): 0.651233882791557,
    (10, "x", 13, "x"): -0.225941905251249,
    (10, "x", 15, "x"): 0.140323254503473,
    (10, "x", 17, "x"): -0.103315642865758,
    (10, "x", 19, "x"): 0.0825585698009622,
    (10, "x", 21, "x"): -0.0692160218229681,
    (10, "x", 23, "x"): 0.0598836888491238,
    (10, "x", 25, "x"): -0.0529693961318701,
    (10, "x", 27, "x"): 0.0476280244212015,
    (10, "x", 29, "x"): -0.0433688465158433,
    (10, "x", 31, "x"): 0.0398870940423755,
    (10, "x", 33, "x"): -0.0369833150045722,
    (10, "x", 35, "x"): 0.0345213862957191,
    (10, "x", 37, "x"): -0.0324051535576467,
    (10, "x", 39, "x"): 0.0305647153283757,
    (12, "x", 1, "x"): -0.0344511233825375,
    (12, "x", 3, "x"): 0.051570244826762,
    (12, "x", 5, "x"): -0.0741307969600372,
    (12, "x", 7, "x"): 0.112098577001675,
    (12, "x", 9, "x"): -0.198164159898117,
    (12, "x", 11, "x"): 0.623508972874051,
    (12, "x", 13, "x"): 0.648968714596981,
    (12, "x", 15, "x"): -0.223915479517027,
    (12, "x", 17, "x"): 0.13848407598893,
    (12, "x", 19, "x"): -0.101627759192188,
    (12, "x", 21, "x"): 0.0809958057142225,
    (12, "x", 23, "x"): -0.0677586792014329,
    (12, "x", 25, "x"): 0.058516541236311,
    (12, "x", 27, "x"): -0.0516804098923711,
    (12, "x", 29, "x"): 0.0464075103789091,
    (12, "x", 31, "x"): -0.0422088782527226,
    (12, "x", 33, "x"): 0.0387810976838852,
    (12, "x", 35, "x"): -0.0359257728661409,
    (12, "x", 37, "x"): 0.0335076182428655,
    (12, "x", 39, "x"): -0.031431152699668,
    (14, "x", 1, "x"): 0.0280905588320645,
    (14, "x", 3, "x"): -0.0406589983848392,
    (14, "x", 5, "x"): 0.0555599515078389,
    (14, "x", 7, "x"): -0.0771577797725184,
    (14, "x", 9, "x"): 0.114573457526737,
    (14, "x", 11, "x"): -0.200276093365814,
    (14, "x", 13, "x"): 0.625361901098279,
    (14, "x", 15, "x"): 0.647311065109173,
    (14, "x", 17, "x"): -0.222410991173016,
    (14, "x", 19, "x"): 0.137103342840115,
    (14, "x", 21, "x"): -0.100349371709367,
    (14, "x", 23, "x"): 0.0798036519532965,
    (14, "x", 25, "x"): -0.0666403046237177,
    (14, "x", 27, "x"): 0.0574621027762285,
    (14, "x", 29, "x"): -0.0506819820916291,
    (14, "x", 31, "x"): 0.0454586096116469,
    (14, "x", 33, "x"): -0.041304127205318,
    (14, "x", 35, "x"): 0.0379159829603672,
    (14, "x", 37, "x"): -0.0350964661555485,
    (14, "x", 39, "x"): 0.0327108419265415,
    (16, "x", 1, "x"): -0.0235720910841532,
    (16, "x", 3, "x"): 0.0333113049961062,
    (16, "x", 5, "x"): -0.0440146568671265,
    (16, "x", 7, "x"): 0.0581059881284756,
    (16, "x", 9, "x"): -0.0792394808782953,
    (16, "x", 11, "x"): 0.116349896137392,
    (16, "x", 13, "x"): -0.201834685692187,
    (16, "x", 15, "x"): 0.626756243745903,
    (16, "x", 17, "x"): 0.646045548619932,
    (16, "x", 19, "x"): -0.221249568137138,
    (16, "x", 21, "x"): 0.136028005901464,
    (16, "x", 23, "x"): -0.0993465691012448,
    (16, "x", 25, "x"): 0.0788629080536757,
    (16, "x", 27, "x"): -0.0657533402767068,
    (16, "x", 29, "x"): 0.0566222517097102,
    (16, "x", 31, "x"): -0.0498837907575016,
    (16, "x", 33, "x"): 0.04469755498707,
    (16, "x", 35, "x"): -0.0405764129180567,
    (16, "x", 37, "x"): 0.0372183888740113,
    (16, "x", 39, "x"): -0.034426235332043,
    (18, "x", 1, "x"): 0.0202129013489131,
    (18, "x", 3, "x"): -0.0280564002314289,
    (18, "x", 5, "x"): 0.0361938566085091,
    (18, "x", 7, "x"): -0.0462018029426718,
    (18, "x", 9, "x"): 0.0598942816336477,
    (18, "x", 11, "x"): -0.0807655532556404,
    (18, "x", 13, "x"): 0.117688834298236,
    (18, "x", 15, "x"): -0.203032528170905,
    (18, "x", 17, "x"): 0.627843419313627,
    (18, "x", 19, "x"): 0.645047794281474,
    (18, "x", 21, "x"): -0.220325766323103,
    (18, "x", 23, "x"): 0.135166515247699,
    (18, "x", 25, "x"): -0.0985383906746981,
    (18, "x", 27, "x"): 0.07810092971977,
    (18, "x", 29, "x"): -0.0650318354039826,
    (18, "x", 31, "x"): 0.055936535430677,
    (18, "x", 33, "x"): -0.0492299775566192,
    (18, "x", 35, "x"): 0.0440723835688313,
    (18, "x", 37, "x"): -0.0399771169972641,
    (18, "x", 39, "x"): 0.0366426000734971,
    (20, "x", 1, "x"): -0.017627299334295,
    (20, "x", 3, "x"): 0.0241288202745342,
    (20, "x", 5, "x"): -0.0305737533320824,
    (20, "x", 7, "x"): 0.0381039552927518,
    (20, "x", 9, "x"): -0.047763592814719,
    (20, "x", 11, "x"): 0.0612270740454677,
    (20, "x", 13, "x"): -0.0819349188989436,
    (20, "x", 15, "x"): 0.118734977843307,
    (20, "x", 17, "x"): -0.203982022959719,
    (20, "x", 19, "x"): 0.628714819343417,
    (20, "x", 21, "x"): 0.644240979964118,
    (20, "x", 23, "x"): -0.219573371070635,
    (20, "x", 25, "x"): 0.134460680056461,
    (20, "x", 27, "x"): -0.0978729043007541,
    (20, "x", 29, "x"): 0.0774707909003214,
    (20, "x", 31, "x"): -0.0644329526695553,
    (20, "x", 33, "x"): 0.0553655154050687,
    (20, "x", 35, "x"): -0.0486839720121728,
    (20, "x", 37, "x"): 0.0435489765855488,
    (20, "x", 39, "x"): -0.039474240161498,
    (22, "x", 1, "x"): 0.0155818275174025,
    (22, "x", 3, "x"): -0.0210925805324099,
    (22, "x", 5, "x"): 0.0263566009981115,
    (22, "x", 7, "x"): -0.0322641671658076,
    (22, "x", 9, "x"): 0.0394861351020212,
    (22, "x", 11, "x"): -0.0489431183977767,
    (22, "x", 13, "x"): 0.0622619711245261,
    (22, "x", 15, "x"): -0.082860766578907,
    (22, "x", 17, "x"): 0.119575292488569,
    (22, "x", 19, "x"): -0.204753224284902,
    (22, "x", 21, "x"): 0.629428862525661,
    (22, "x", 23, "x"): 0.643575097636349,
    (22, "x", 25, "x"): -0.218948694495961,
    (22, "x", 27, "x"): 0.133871712354208,
    (22, "x", 29, "x"): -0.0973152193947713,
    (22, "x", 31, "x"): 0.0769407678634122,
    (22, "x", 33, "x"): -0.0639275883754644,
    (22, "x", 35, "x"): 0.0548822891765173,
    (22, "x", 37, "x"): -0.0482207457593204,
    (22, "x", 39, "x"): 0.0431039197585667,
    (24, "x", 1, "x"): -0.0139273390571125,
    (24, "x", 3, "x"): 0.0186819548996952,
    (24, "x", 5, "x"): -0.0230856985072204,
    (24, "x", 7, "x"): 0.0278689812889355,
    (24, "x", 9, "x"): -0.0335007876120844,
    (24, "x", 11, "x"): 0.040541449001796,
    (24, "x", 13, "x"): -0.0498690376104398,
    (24, "x", 15, "x"): 0.0630903264429405,
    (24, "x", 17, "x"): -0.0836125971039459,
    (24, "x", 19, "x"): 0.120265288362839,
    (24, "x", 21, "x"): -0.205392081451324,
    (24, "x", 23, "x"): 0.630024630631138,
    (24, "x", 25, "x"): 0.643016196013222,
    (24, "x", 27, "x"): -0.218421741398637,
    (24, "x", 29, "x"): 0.133372747843751,
    (24, "x", 31, "x"): -0.0968410038781554,
    (24, "x", 33, "x"): 0.0764886144798256,
    (24, "x", 35, "x"): -0.0634952419012075,
    (24, "x", 37, "x"): 0.054467836681766,
    (24, "x", 39, "x"): -0.0478225494651678,
    (26, "x", 1, "x"): 0.012564329179744,
    (26, "x", 3, "x"): -0.0167261931797469,
    (26, "x", 5, "x"): 0.0204814479513874,
    (26, "x", 7, "x"): -0.0244511756080565,
    (26, "x", 9, "x"): 0.0289854926054433,
    (26, "x", 11, "x"): -0.0344536065949141,
    (26, "x", 13, "x"): 0.0413774431197777,
    (26, "x", 15, "x"): -0.0506169449451649,
    (26, "x", 17, "x"): 0.0637691420834689,
    (26, "x", 19, "x"): -0.0842355840892829,
    (26, "x", 21, "x"): 0.120842103606662,
    (26, "x", 23, "x"): -0.205929992668735,
    (26, "x", 25, "x"): 0.63052925596685,
    (26, "x", 27, "x"): 0.64254041629879,
    (26, "x", 29, "x"): -0.217971231998968,
    (26, "x", 31, "x"): 0.1329445838244,
    (26, "x", 33, "x"): -0.0964327593462296,
    (26, "x", 35, "x"): 0.0760982532525654,
    (26, "x", 37, "x"): -0.0631210368417068,
    (26, "x", 39, "x"): 0.0541083090782501,
    (28, "x", 1, "x"): -0.0114240058576427,
    (28, "x", 3, "x"): 0.015110811991687,
    (28, "x", 5, "x"): -0.0183634797872995,
    (28, "x", 7, "x"): 0.021723856102418,
    (28, "x", 9, "x"): -0.025467063571133,
    (28, "x", 11, "x"): 0.0298524441527061,
    (28, "x", 13, "x"): -0.0352142635297349,
    (28, "x", 15, "x"): 0.0420579527183231,
    (28, "x", 17, "x"): -0.0512345899753054,
    (28, "x", 19, "x"): 0.0643359900496595,
    (28, "x", 21, "x"): -0.0847604214666164,
    (28, "x", 23, "x"): 0.121331543048508,
    (28, "x", 25, "x"): -0.206389145953734,
    (28, "x", 27, "x"): 0.630962163162352,
    (28, "x", 29, "x"): 0.642130502115889,
    (28, "x", 31, "x"): -0.21758164950347,
    (28, "x", 33, "x"): 0.132573125753267,
    (28, "x", 35, "x"): -0.0960775730220675,
    (28, "x", 37, "x"): 0.0757577671900808,
    (28, "x", 39, "x"): -0.0627939055909658,
    (30, "x", 1, "x"): 0.0104573719402441,
    (30, "x", 3, "x"): -0.0137563247003482,
    (30, "x", 5, "x"): 0.0166104416612905,
    (30, "x", 7, "x"): -0.019501442987836,
    (30, "x", 9, "x"): 0.0226543470950928,
    (30, "x", 11, "x"): -0.0262611407020985,
    (30, "x", 13, "x"): 0.0305491632478923,
    (30, "x", 15, "x"): -0.0358375732209661,
    (30, "x", 17, "x"): 0.0426236826218798,
    (30, "x", 19, "x"): -0.0517537930024467,
    (30, "x", 21, "x"): 0.0648167139702787,
    (30, "x", 23, "x"): -0.0852087230070191,
    (30, "x", 25, "x"): 0.121752104250785,
    (30, "x", 27, "x"): -0.206785667252914,
    (30, "x", 29, "x"): 0.63133762416741,
    (30, "x", 31, "x"): 0.641773663798743,
    (30, "x", 33, "x"): -0.217241412157705,
    (30, "x", 35, "x"): 0.132247792438937,
    (30, "x", 37, "x"): -0.0957657043526452,
    (30, "x", 39, "x"): 0.0754581308127959,
    (32, "x", 1, "x"): -0.00962863484261943,
    (32, "x", 3, "x"): 0.0126059053586902,
    (32, "x", 5, "x"): -0.0151378181055341,
    (32, "x", 7, "x"): 0.0176587692986935,
    (32, "x", 9, "x"): -0.020358644867144,
    (32, "x", 11, "x"): 0.0233858818137396,
    (32, "x", 13, "x"): -0.0269029867321868,
    (32, "x", 15, "x"): 0.0311233823964002,
    (32, "x", 17, "x"): -0.0363587480299401,
    (32, "x", 19, "x"): 0.0431019952858045,
    (32, "x", 21, "x"): -0.0521966573355218,
    (32, "x", 23, "x"): 0.0652297096005878,
    (32, "x", 25, "x"): -0.0855961631739456,
    (32, "x", 27, "x"): 0.122117397913667,
    (32, "x", 29, "x"): -0.207131559327254,
    (32, "x", 31, "x"): 0.631666360260589,
    (32, "x", 33, "x"): 0.641460221209205,
    (32, "x", 35, "x"): -0.216941699788514,
    (32, "x", 37, "x"): 0.131960484273278,
    (32, "x", 39, "x"): -0.0954896651000627,
    (34, "x", 1, "x"): 0.00891107260430101,
    (34, "x", 3, "x"): -0.0116179059849555,
    (34, "x", 5, "x"): 0.0138850216154384,
    (34, "x", 7, "x"): -0.0161084661466783,
    (34, "x", 9, "x"): 0.0184524571478648,
    (34, "x", 11, "x"): -0.0210359786164796,
    (34, "x", 13, "x"): 0.0239801731757788,
    (34, "x", 15, "x"): -0.0274346624154534,
    (34, "x", 17, "x"): 0.0316059442338158,
    (34, "x", 19, "x"): -0.0368016236511537,
    (34, "x", 21, "x"): 0.0435120491147015,
    (34, "x", 23, "x"): -0.0525790555417618,
    (34, "x", 25, "x"): 0.0655884458140045,
    (34, "x", 27, "x"): -0.0859343937562171,
    (34, "x", 29, "x"): 0.122437664390516,
    (34, "x", 31, "x"): -0.207435940915892,
    (34, "x", 33, "x"): 0.631956581438438,
    (34, "x", 35, "x"): 0.641182712988902,
    (34, "x", 37, "x"): -0.216675676757992,
    (34, "x", 39, "x"): 0.131704895258842,
    (36, "x", 1, "x"): -0.00828435401829169,
    (36, "x", 3, "x"): 0.0107611425267978,
    (36, "x", 5, "x"): -0.0128075374964671,
    (36, "x", 7, "x"): 0.0147877713476547,
    (36, "x", 9, "x"): -0.0168466371421289,
    (36, "x", 11, "x"): 0.0190824142643028,
    (36, "x", 13, "x"): -0.0215887026965906,
    (36, "x", 15, "x"): 0.0244746617600977,
    (36, "x", 17, "x"): -0.0278834727283041,
    (36, "x", 19, "x"): 0.0320178443629164,
    (36, "x", 21, "x"): -0.0371829978128156,
    (36, "x", 23, "x"): 0.043867702084051,
    (36, "x", 25, "x"): -0.0529127015843396,
    (36, "x", 27, "x"): 0.0659030205003435,
    (36, "x", 29, "x"): -0.0862322608322223,
    (36, "x", 31, "x"): 0.122720757634075,
    (36, "x", 33, "x"): -0.20770586418026,
    (36, "x", 35, "x"): 0.632214680931101,
    (36, "x", 37, "x"): 0.640935295378691,
    (36, "x", 39, "x"): -0.216437963382246,
    (38, "x", 1, "x"): 0.00773275113661403,
    (38, "x", 3, "x"): -0.0100118271418192,
    (38, "x", 5, "x"): 0.0118719607936816,
    (38, "x", 7, "x"): -0.0136504853925913,
    (38, "x", 9, "x"): 0.0154770452283758,
    (38, "x", 11, "x"): -0.017434866570091,
    (38, "x", 13, "x"): 0.019598527229861,
    (38, "x", 15, "x"): -0.022050438024718,
    (38, "x", 17, "x"): 0.0248937447207395,
    (38, "x", 19, "x"): -0.0282680905210534,
    (38, "x", 21, "x"): 0.0323739582618915,
    (38, "x", 23, "x"): -0.0375150942942534,
    (38, "x", 25, "x"): 0.0441792493621718,
    (38, "x", 27, "x"): -0.0532064407664412,
    (38, "x", 29, "x"): 0.0661811587512815,
    (38, "x", 31, "x"): -0.0864966038327677,
    (38, "x", 33, "x"): 0.122972802996398,
    (38, "x", 35, "x"): -0.207946868938393,
    (38, "x", 37, "x"): 0.632445711335645,
    (38, "x", 39, "x"): 0.64071332643857,
    (40, "x", 1, "x"): -0.00724391688001674,
    (40, "x", 3, "x"): 0.00935151491502463,
    (40, "x", 5, "x"): -0.0110527578939448,
    (40, "x", 7, "x"): 0.012661878924004,
    (40, "x", 9, "x"): -0.014296399105208,
    (40, "x", 11, "x"): 0.0160282719391012,
    (40, "x", 13, "x"): -0.0179185139453499,
    (40, "x", 15, "x"): 0.0200312179442163,
    (40, "x", 17, "x"): -0.0224431596178727,
    (40, "x", 19, "x"): 0.0252541692908214,
    (40, "x", 21, "x"): -0.0286018042974914,
    (40, "x", 23, "x"): 0.0326851654679604,
    (40, "x", 25, "x"): -0.0378070449564994,
    (40, "x", 27, "x"): 0.0444545121459287,
    (40, "x", 29, "x"): -0.0534670839867032,
    (40, "x", 31, "x"): 0.0664288744972003,
    (40, "x", 33, "x"): -0.0867327955058567,
    (40, "x", 35, "x"): 0.123198648554883,
    (40, "x", 37, "x"): -0.208163367559173,
    (40, "x", 39, "x"): 0.632653718481981,
}
# split detector in y-direction, for up to TEM-order 40
YSPLIT = {
    ("x", 0, "x", 1): 0.797884560802865,
    ("x", 0, "x", 3): -0.32573500793528,
    ("x", 0, "x", 5): 0.218509686118416,
    ("x", 0, "x", 7): -0.168583882836184,
    ("x", 0, "x", 9): 0.139074607877595,
    ("x", 0, "x", 11): -0.119342192152758,
    ("x", 0, "x", 13): 0.105105246952602,
    ("x", 0, "x", 15): -0.0942883643366128,
    ("x", 0, "x", 17): 0.085756077667627,
    ("x", 0, "x", 19): -0.0788316791424408,
    ("x", 0, "x", 21): 0.0730852493544752,
    ("x", 0, "x", 23): -0.0682297483293215,
    ("x", 0, "x", 25): 0.0640657596627177,
    ("x", 0, "x", 27): -0.0604501569509354,
    ("x", 0, "x", 29): 0.0572773850389327,
    ("x", 0, "x", 31): -0.0544677839262821,
    ("x", 0, "x", 33): 0.051960035687153,
    ("x", 0, "x", 35): -0.0497061241097501,
    ("x", 0, "x", 37): 0.0476678793880178,
    ("x", 0, "x", 39): -0.0458145530435871,
    ("x", 2, "x", 1): 0.564189583547756,
    ("x", 2, "x", 3): 0.690988298942671,
    ("x", 2, "x", 5): -0.257516134682126,
    ("x", 2, "x", 7): 0.166889529453114,
    ("x", 2, "x", 9): -0.126437912127138,
    ("x", 2, "x", 11): 0.103140489653524,
    ("x", 2, "x", 13): -0.0878334751963756,
    ("x", 2, "x", 15): 0.0769291636262386,
    ("x", 2, "x", 17): -0.0687238645863045,
    ("x", 2, "x", 19): 0.0623003460579352,
    ("x", 2, "x", 21): -0.0571189780993917,
    ("x", 2, "x", 23): 0.0528405479815828,
    ("x", 2, "x", 25): -0.0492405794558427,
    ("x", 2, "x", 27): 0.0461642931761014,
    ("x", 2, "x", 29): -0.0435013182859334,
    ("x", 2, "x", 31): 0.0411707144994762,
    ("x", 2, "x", 33): -0.0391116996228281,
    ("x", 2, "x", 35): 0.0372776912078078,
    ("x", 2, "x", 37): -0.0356323539463384,
    ("x", 2, "x", 39): 0.0341469044387,
    ("x", 4, "x", 1): -0.16286750396764,
    ("x", 4, "x", 3): 0.598413420602149,
    ("x", 4, "x", 5): 0.669046543557289,
    ("x", 4, "x", 7): -0.240884286886713,
    ("x", 4, "x", 9): 0.153297821464992,
    ("x", 4, "x", 11): -0.114842936826923,
    ("x", 4, "x", 13): 0.092969581005561,
    ("x", 4, "x", 15): -0.0787358118089783,
    ("x", 4, "x", 17): 0.0686730145130556,
    ("x", 4, "x", 19): -0.0611475066641648,
    ("x", 4, "x", 21): 0.0552860726690191,
    ("x", 4, "x", 23): -0.0505782313126719,
    ("x", 4, "x", 25): 0.0467048872492379,
    ("x", 4, "x", 27): -0.0434559246068004,
    ("x", 4, "x", 29): 0.0406871064724294,
    ("x", 4, "x", 31): -0.0382959872150584,
    ("x", 4, "x", 33): 0.0362077065246626,
    ("x", 4, "x", 35): -0.0343662293597736,
    ("x", 4, "x", 37): 0.0327287372726021,
    ("x", 4, "x", 39): -0.031261920230486,
    ("x", 6, "x", 1): 0.0892062058076385,
    ("x", 6, "x", 3): -0.18209140509868,
    ("x", 6, "x", 5): 0.61075313987865,
    ("x", 6, "x", 7): 0.659688788381993,
    ("x", 6, "x", 9): -0.233235207868822,
    ("x", 6, "x", 11): 0.146771489830575,
    ("x", 6, "x", 13): -0.109117578596892,
    ("x", 6, "x", 15): 0.0878479967266388,
    ("x", 6, "x", 17): -0.0740877073983095,
    ("x", 6, "x", 19): 0.0644074398753087,
    ("x", 6, "x", 21): -0.0571982549981952,
    ("x", 6, "x", 23): 0.0516033260749633,
    ("x", 6, "x", 25): -0.0471234847486845,
    ("x", 6, "x", 27): 0.043447712204836,
    ("x", 6, "x", 29): -0.0403718224901522,
    ("x", 6, "x", 31): 0.0377560369073105,
    ("x", 6, "x", 33): -0.0355013303057689,
    ("x", 6, "x", 35): 0.0335355132263835,
    ("x", 6, "x", 37): -0.031804668469598,
    ("x", 6, "x", 39): 0.0302676798757954,
    ("x", 8, "x", 1): -0.059603403376112,
    ("x", 8, "x", 3): 0.102198547643328,
    ("x", 8, "x", 5): -0.190435749776861,
    ("x", 8, "x", 7): 0.617082357005358,
    ("x", 8, "x", 9): 0.6545146787836,
    ("x", 8, "x", 11): -0.228820262121828,
    ("x", 8, "x", 13): 0.142898207894381,
    ("x", 8, "x", 15): -0.10565264117106,
    ("x", 8, "x", 17): 0.0847033053948983,
    ("x", 8, "x", 19): -0.0712017602555549,
    ("x", 8, "x", 21): 0.0617354634590125,
    ("x", 8, "x", 23): -0.0547065570873058,
    ("x", 8, "x", 25): 0.0492658641354183,
    ("x", 8, "x", 27): -0.0449196778881935,
    ("x", 8, "x", 29): 0.0413609897651131,
    ("x", 8, "x", 31): -0.0383886289102033,
    ("x", 8, "x", 33): 0.0358651299902981,
    ("x", 8, "x", 35): -0.0336932742842578,
    ("x", 8, "x", 37): 0.0318023047767947,
    ("x", 8, "x", 39): -0.030139455674167,
    ("x", 10, "x", 1): 0.0439792525587995,
    ("x", 10, "x", 3): -0.0692528965958894,
    ("x", 10, "x", 5): 0.108397929099021,
    ("x", 10, "x", 7): -0.195138575204209,
    ("x", 10, "x", 9): 0.620927144090899,
    ("x", 10, "x", 11): 0.651233882791557,
    ("x", 10, "x", 13): -0.225941905251249,
    ("x", 10, "x", 15): 0.140323254503473,
    ("x", 10, "x", 17): -0.103315642865758,
    ("x", 10, "x", 19): 0.0825585698009622,
    ("x", 10, "x", 21): -0.0692160218229681,
    ("x", 10, "x", 23): 0.0598836888491238,
    ("x", 10, "x", 25): -0.0529693961318701,
    ("x", 10, "x", 27): 0.0476280244212015,
    ("x", 10, "x", 29): -0.0433688465158433,
    ("x", 10, "x", 31): 0.0398870940423755,
    ("x", 10, "x", 33): -0.0369833150045722,
    ("x", 10, "x", 35): 0.0345213862957191,
    ("x", 10, "x", 37): -0.0324051535576467,
    ("x", 10, "x", 39): 0.0305647153283757,
    ("x", 12, "x", 1): -0.0344511233825375,
    ("x", 12, "x", 3): 0.051570244826762,
    ("x", 12, "x", 5): -0.0741307969600372,
    ("x", 12, "x", 7): 0.112098577001675,
    ("x", 12, "x", 9): -0.198164159898117,
    ("x", 12, "x", 11): 0.623508972874051,
    ("x", 12, "x", 13): 0.648968714596981,
    ("x", 12, "x", 15): -0.223915479517027,
    ("x", 12, "x", 17): 0.13848407598893,
    ("x", 12, "x", 19): -0.101627759192188,
    ("x", 12, "x", 21): 0.0809958057142225,
    ("x", 12, "x", 23): -0.0677586792014329,
    ("x", 12, "x", 25): 0.058516541236311,
    ("x", 12, "x", 27): -0.0516804098923711,
    ("x", 12, "x", 29): 0.0464075103789091,
    ("x", 12, "x", 31): -0.0422088782527226,
    ("x", 12, "x", 33): 0.0387810976838852,
    ("x", 12, "x", 35): -0.0359257728661409,
    ("x", 12, "x", 37): 0.0335076182428655,
    ("x", 12, "x", 39): -0.031431152699668,
    ("x", 14, "x", 1): 0.0280905588320645,
    ("x", 14, "x", 3): -0.0406589983848392,
    ("x", 14, "x", 5): 0.0555599515078389,
    ("x", 14, "x", 7): -0.0771577797725184,
    ("x", 14, "x", 9): 0.114573457526737,
    ("x", 14, "x", 11): -0.200276093365814,
    ("x", 14, "x", 13): 0.625361901098279,
    ("x", 14, "x", 15): 0.647311065109173,
    ("x", 14, "x", 17): -0.222410991173016,
    ("x", 14, "x", 19): 0.137103342840115,
    ("x", 14, "x", 21): -0.100349371709367,
    ("x", 14, "x", 23): 0.0798036519532965,
    ("x", 14, "x", 25): -0.0666403046237177,
    ("x", 14, "x", 27): 0.0574621027762285,
    ("x", 14, "x", 29): -0.0506819820916291,
    ("x", 14, "x", 31): 0.0454586096116469,
    ("x", 14, "x", 33): -0.041304127205318,
    ("x", 14, "x", 35): 0.0379159829603672,
    ("x", 14, "x", 37): -0.0350964661555485,
    ("x", 14, "x", 39): 0.0327108419265415,
    ("x", 16, "x", 1): -0.0235720910841532,
    ("x", 16, "x", 3): 0.0333113049961062,
    ("x", 16, "x", 5): -0.0440146568671265,
    ("x", 16, "x", 7): 0.0581059881284756,
    ("x", 16, "x", 9): -0.0792394808782953,
    ("x", 16, "x", 11): 0.116349896137392,
    ("x", 16, "x", 13): -0.201834685692187,
    ("x", 16, "x", 15): 0.626756243745903,
    ("x", 16, "x", 17): 0.646045548619932,
    ("x", 16, "x", 19): -0.221249568137138,
    ("x", 16, "x", 21): 0.136028005901464,
    ("x", 16, "x", 23): -0.0993465691012448,
    ("x", 16, "x", 25): 0.0788629080536757,
    ("x", 16, "x", 27): -0.0657533402767068,
    ("x", 16, "x", 29): 0.0566222517097102,
    ("x", 16, "x", 31): -0.0498837907575016,
    ("x", 16, "x", 33): 0.04469755498707,
    ("x", 16, "x", 35): -0.0405764129180567,
    ("x", 16, "x", 37): 0.0372183888740113,
    ("x", 16, "x", 39): -0.034426235332043,
    ("x", 18, "x", 1): 0.0202129013489131,
    ("x", 18, "x", 3): -0.0280564002314289,
    ("x", 18, "x", 5): 0.0361938566085091,
    ("x", 18, "x", 7): -0.0462018029426718,
    ("x", 18, "x", 9): 0.0598942816336477,
    ("x", 18, "x", 11): -0.0807655532556404,
    ("x", 18, "x", 13): 0.117688834298236,
    ("x", 18, "x", 15): -0.203032528170905,
    ("x", 18, "x", 17): 0.627843419313627,
    ("x", 18, "x", 19): 0.645047794281474,
    ("x", 18, "x", 21): -0.220325766323103,
    ("x", 18, "x", 23): 0.135166515247699,
    ("x", 18, "x", 25): -0.0985383906746981,
    ("x", 18, "x", 27): 0.07810092971977,
    ("x", 18, "x", 29): -0.0650318354039826,
    ("x", 18, "x", 31): 0.055936535430677,
    ("x", 18, "x", 33): -0.0492299775566192,
    ("x", 18, "x", 35): 0.0440723835688313,
    ("x", 18, "x", 37): -0.0399771169972641,
    ("x", 18, "x", 39): 0.0366426000734971,
    ("x", 20, "x", 1): -0.017627299334295,
    ("x", 20, "x", 3): 0.0241288202745342,
    ("x", 20, "x", 5): -0.0305737533320824,
    ("x", 20, "x", 7): 0.0381039552927518,
    ("x", 20, "x", 9): -0.047763592814719,
    ("x", 20, "x", 11): 0.0612270740454677,
    ("x", 20, "x", 13): -0.0819349188989436,
    ("x", 20, "x", 15): 0.118734977843307,
    ("x", 20, "x", 17): -0.203982022959719,
    ("x", 20, "x", 19): 0.628714819343417,
    ("x", 20, "x", 21): 0.644240979964118,
    ("x", 20, "x", 23): -0.219573371070635,
    ("x", 20, "x", 25): 0.134460680056461,
    ("x", 20, "x", 27): -0.0978729043007541,
    ("x", 20, "x", 29): 0.0774707909003214,
    ("x", 20, "x", 31): -0.0644329526695553,
    ("x", 20, "x", 33): 0.0553655154050687,
    ("x", 20, "x", 35): -0.0486839720121728,
    ("x", 20, "x", 37): 0.0435489765855488,
    ("x", 20, "x", 39): -0.039474240161498,
    ("x", 22, "x", 1): 0.0155818275174025,
    ("x", 22, "x", 3): -0.0210925805324099,
    ("x", 22, "x", 5): 0.0263566009981115,
    ("x", 22, "x", 7): -0.0322641671658076,
    ("x", 22, "x", 9): 0.0394861351020212,
    ("x", 22, "x", 11): -0.0489431183977767,
    ("x", 22, "x", 13): 0.0622619711245261,
    ("x", 22, "x", 15): -0.082860766578907,
    ("x", 22, "x", 17): 0.119575292488569,
    ("x", 22, "x", 19): -0.204753224284902,
    ("x", 22, "x", 21): 0.629428862525661,
    ("x", 22, "x", 23): 0.643575097636349,
    ("x", 22, "x", 25): -0.218948694495961,
    ("x", 22, "x", 27): 0.133871712354208,
    ("x", 22, "x", 29): -0.0973152193947713,
    ("x", 22, "x", 31): 0.0769407678634122,
    ("x", 22, "x", 33): -0.0639275883754644,
    ("x", 22, "x", 35): 0.0548822891765173,
    ("x", 22, "x", 37): -0.0482207457593204,
    ("x", 22, "x", 39): 0.0431039197585667,
    ("x", 24, "x", 1): -0.0139273390571125,
    ("x", 24, "x", 3): 0.0186819548996952,
    ("x", 24, "x", 5): -0.0230856985072204,
    ("x", 24, "x", 7): 0.0278689812889355,
    ("x", 24, "x", 9): -0.0335007876120844,
    ("x", 24, "x", 11): 0.040541449001796,
    ("x", 24, "x", 13): -0.0498690376104398,
    ("x", 24, "x", 15): 0.0630903264429405,
    ("x", 24, "x", 17): -0.0836125971039459,
    ("x", 24, "x", 19): 0.120265288362839,
    ("x", 24, "x", 21): -0.205392081451324,
    ("x", 24, "x", 23): 0.630024630631138,
    ("x", 24, "x", 25): 0.643016196013222,
    ("x", 24, "x", 27): -0.218421741398637,
    ("x", 24, "x", 29): 0.133372747843751,
    ("x", 24, "x", 31): -0.0968410038781554,
    ("x", 24, "x", 33): 0.0764886144798256,
    ("x", 24, "x", 35): -0.0634952419012075,
    ("x", 24, "x", 37): 0.054467836681766,
    ("x", 24, "x", 39): -0.0478225494651678,
    ("x", 26, "x", 1): 0.012564329179744,
    ("x", 26, "x", 3): -0.0167261931797469,
    ("x", 26, "x", 5): 0.0204814479513874,
    ("x", 26, "x", 7): -0.0244511756080565,
    ("x", 26, "x", 9): 0.0289854926054433,
    ("x", 26, "x", 11): -0.0344536065949141,
    ("x", 26, "x", 13): 0.0413774431197777,
    ("x", 26, "x", 15): -0.0506169449451649,
    ("x", 26, "x", 17): 0.0637691420834689,
    ("x", 26, "x", 19): -0.0842355840892829,
    ("x", 26, "x", 21): 0.120842103606662,
    ("x", 26, "x", 23): -0.205929992668735,
    ("x", 26, "x", 25): 0.63052925596685,
    ("x", 26, "x", 27): 0.64254041629879,
    ("x", 26, "x", 29): -0.217971231998968,
    ("x", 26, "x", 31): 0.1329445838244,
    ("x", 26, "x", 33): -0.0964327593462296,
    ("x", 26, "x", 35): 0.0760982532525654,
    ("x", 26, "x", 37): -0.0631210368417068,
    ("x", 26, "x", 39): 0.0541083090782501,
    ("x", 28, "x", 1): -0.0114240058576427,
    ("x", 28, "x", 3): 0.015110811991687,
    ("x", 28, "x", 5): -0.0183634797872995,
    ("x", 28, "x", 7): 0.021723856102418,
    ("x", 28, "x", 9): -0.025467063571133,
    ("x", 28, "x", 11): 0.0298524441527061,
    ("x", 28, "x", 13): -0.0352142635297349,
    ("x", 28, "x", 15): 0.0420579527183231,
    ("x", 28, "x", 17): -0.0512345899753054,
    ("x", 28, "x", 19): 0.0643359900496595,
    ("x", 28, "x", 21): -0.0847604214666164,
    ("x", 28, "x", 23): 0.121331543048508,
    ("x", 28, "x", 25): -0.206389145953734,
    ("x", 28, "x", 27): 0.630962163162352,
    ("x", 28, "x", 29): 0.642130502115889,
    ("x", 28, "x", 31): -0.21758164950347,
    ("x", 28, "x", 33): 0.132573125753267,
    ("x", 28, "x", 35): -0.0960775730220675,
    ("x", 28, "x", 37): 0.0757577671900808,
    ("x", 28, "x", 39): -0.0627939055909658,
    ("x", 30, "x", 1): 0.0104573719402441,
    ("x", 30, "x", 3): -0.0137563247003482,
    ("x", 30, "x", 5): 0.0166104416612905,
    ("x", 30, "x", 7): -0.019501442987836,
    ("x", 30, "x", 9): 0.0226543470950928,
    ("x", 30, "x", 11): -0.0262611407020985,
    ("x", 30, "x", 13): 0.0305491632478923,
    ("x", 30, "x", 15): -0.0358375732209661,
    ("x", 30, "x", 17): 0.0426236826218798,
    ("x", 30, "x", 19): -0.0517537930024467,
    ("x", 30, "x", 21): 0.0648167139702787,
    ("x", 30, "x", 23): -0.0852087230070191,
    ("x", 30, "x", 25): 0.121752104250785,
    ("x", 30, "x", 27): -0.206785667252914,
    ("x", 30, "x", 29): 0.63133762416741,
    ("x", 30, "x", 31): 0.641773663798743,
    ("x", 30, "x", 33): -0.217241412157705,
    ("x", 30, "x", 35): 0.132247792438937,
    ("x", 30, "x", 37): -0.0957657043526452,
    ("x", 30, "x", 39): 0.0754581308127959,
    ("x", 32, "x", 1): -0.00962863484261943,
    ("x", 32, "x", 3): 0.0126059053586902,
    ("x", 32, "x", 5): -0.0151378181055341,
    ("x", 32, "x", 7): 0.0176587692986935,
    ("x", 32, "x", 9): -0.020358644867144,
    ("x", 32, "x", 11): 0.0233858818137396,
    ("x", 32, "x", 13): -0.0269029867321868,
    ("x", 32, "x", 15): 0.0311233823964002,
    ("x", 32, "x", 17): -0.0363587480299401,
    ("x", 32, "x", 19): 0.0431019952858045,
    ("x", 32, "x", 21): -0.0521966573355218,
    ("x", 32, "x", 23): 0.0652297096005878,
    ("x", 32, "x", 25): -0.0855961631739456,
    ("x", 32, "x", 27): 0.122117397913667,
    ("x", 32, "x", 29): -0.207131559327254,
    ("x", 32, "x", 31): 0.631666360260589,
    ("x", 32, "x", 33): 0.641460221209205,
    ("x", 32, "x", 35): -0.216941699788514,
    ("x", 32, "x", 37): 0.131960484273278,
    ("x", 32, "x", 39): -0.0954896651000627,
    ("x", 34, "x", 1): 0.00891107260430101,
    ("x", 34, "x", 3): -0.0116179059849555,
    ("x", 34, "x", 5): 0.0138850216154384,
    ("x", 34, "x", 7): -0.0161084661466783,
    ("x", 34, "x", 9): 0.0184524571478648,
    ("x", 34, "x", 11): -0.0210359786164796,
    ("x", 34, "x", 13): 0.0239801731757788,
    ("x", 34, "x", 15): -0.0274346624154534,
    ("x", 34, "x", 17): 0.0316059442338158,
    ("x", 34, "x", 19): -0.0368016236511537,
    ("x", 34, "x", 21): 0.0435120491147015,
    ("x", 34, "x", 23): -0.0525790555417618,
    ("x", 34, "x", 25): 0.0655884458140045,
    ("x", 34, "x", 27): -0.0859343937562171,
    ("x", 34, "x", 29): 0.122437664390516,
    ("x", 34, "x", 31): -0.207435940915892,
    ("x", 34, "x", 33): 0.631956581438438,
    ("x", 34, "x", 35): 0.641182712988902,
    ("x", 34, "x", 37): -0.216675676757992,
    ("x", 34, "x", 39): 0.131704895258842,
    ("x", 36, "x", 1): -0.00828435401829169,
    ("x", 36, "x", 3): 0.0107611425267978,
    ("x", 36, "x", 5): -0.0128075374964671,
    ("x", 36, "x", 7): 0.0147877713476547,
    ("x", 36, "x", 9): -0.0168466371421289,
    ("x", 36, "x", 11): 0.0190824142643028,
    ("x", 36, "x", 13): -0.0215887026965906,
    ("x", 36, "x", 15): 0.0244746617600977,
    ("x", 36, "x", 17): -0.0278834727283041,
    ("x", 36, "x", 19): 0.0320178443629164,
    ("x", 36, "x", 21): -0.0371829978128156,
    ("x", 36, "x", 23): 0.043867702084051,
    ("x", 36, "x", 25): -0.0529127015843396,
    ("x", 36, "x", 27): 0.0659030205003435,
    ("x", 36, "x", 29): -0.0862322608322223,
    ("x", 36, "x", 31): 0.122720757634075,
    ("x", 36, "x", 33): -0.20770586418026,
    ("x", 36, "x", 35): 0.632214680931101,
    ("x", 36, "x", 37): 0.640935295378691,
    ("x", 36, "x", 39): -0.216437963382246,
    ("x", 38, "x", 1): 0.00773275113661403,
    ("x", 38, "x", 3): -0.0100118271418192,
    ("x", 38, "x", 5): 0.0118719607936816,
    ("x", 38, "x", 7): -0.0136504853925913,
    ("x", 38, "x", 9): 0.0154770452283758,
    ("x", 38, "x", 11): -0.017434866570091,
    ("x", 38, "x", 13): 0.019598527229861,
    ("x", 38, "x", 15): -0.022050438024718,
    ("x", 38, "x", 17): 0.0248937447207395,
    ("x", 38, "x", 19): -0.0282680905210534,
    ("x", 38, "x", 21): 0.0323739582618915,
    ("x", 38, "x", 23): -0.0375150942942534,
    ("x", 38, "x", 25): 0.0441792493621718,
    ("x", 38, "x", 27): -0.0532064407664412,
    ("x", 38, "x", 29): 0.0661811587512815,
    ("x", 38, "x", 31): -0.0864966038327677,
    ("x", 38, "x", 33): 0.122972802996398,
    ("x", 38, "x", 35): -0.207946868938393,
    ("x", 38, "x", 37): 0.632445711335645,
    ("x", 38, "x", 39): 0.64071332643857,
    ("x", 40, "x", 1): -0.00724391688001674,
    ("x", 40, "x", 3): 0.00935151491502463,
    ("x", 40, "x", 5): -0.0110527578939448,
    ("x", 40, "x", 7): 0.012661878924004,
    ("x", 40, "x", 9): -0.014296399105208,
    ("x", 40, "x", 11): 0.0160282719391012,
    ("x", 40, "x", 13): -0.0179185139453499,
    ("x", 40, "x", 15): 0.0200312179442163,
    ("x", 40, "x", 17): -0.0224431596178727,
    ("x", 40, "x", 19): 0.0252541692908214,
    ("x", 40, "x", 21): -0.0286018042974914,
    ("x", 40, "x", 23): 0.0326851654679604,
    ("x", 40, "x", 25): -0.0378070449564994,
    ("x", 40, "x", 27): 0.0444545121459287,
    ("x", 40, "x", 29): -0.0534670839867032,
    ("x", 40, "x", 31): 0.0664288744972003,
    ("x", 40, "x", 33): -0.0867327955058567,
    ("x", 40, "x", 35): 0.123198648554883,
    ("x", 40, "x", 37): -0.208163367559173,
    ("x", 40, "x", 39): 0.632653718481981,
}