def test_fixed_assignments():
    fixed_assignments = pd.DataFrame(
        (
            (1, 0, 0, 0),
            (2, 1, 0, 0),
            (10, 2, 0, 0),
            (11, 3, 0, 0),
            (7, 4, 0, 0),
            (8, 5, 0, 0),
        ),
        columns=['electrode_number', 'x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_fixed_assignments(fixed_assignments)

    assert elecs.get_electrode_numbers_for_positions([2, 0, 0]) == 10
    assert elecs.get_electrode_numbers_for_positions([4, 0, 0]) == 7
    assert np.all(
        elecs.get_position_of_number(10).values == np.array((2, 0, 0)))

    fixed2 = fixed_assignments.set_index('electrode_number')
    elecs = electrode_manager()
    elecs.add_fixed_assignments(fixed2)

    assert elecs.get_electrode_numbers_for_positions([2, 0, 0]) == 10
    assert elecs.get_electrode_numbers_for_positions([4, 0, 0]) == 7
    assert np.all(
        elecs.get_position_of_number(10).values == np.array((2, 0, 0)))
def test_conform_to_regular_x_spacing():
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (2, 0, 0),
            (4, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    result_expected = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
            (3, 0, 0),
            (4, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    # this is important, we want a sorted output
    elecs.set_ordering_to_sort_zyx()
    elecs.add_by_position(test_3d_positions)
    elecs.conform_to_regular_x_spacing(spacing_x=1)

    assert np.all(result_expected.values == elecs.electrode_positions.values)

    # new test
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (2, 0, 0),
            (4, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    result_expected = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
            (3, 0, 0),
            (4, 0, 0),
            (5, 0, 0),
            (6, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    # this is important, we want a sorted output
    elecs.set_ordering_to_sort_zyx()
    elecs.add_by_position(test_3d_positions)
    elecs.conform_to_regular_x_spacing(spacing_x=1, nr_electrodes=7)
    assert np.all(result_expected.values == elecs.electrode_positions.values)
def test_replace_coordinates_with_fixed_regular_grid_x():
    electrode_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
            (3, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)

    elecs.replace_coordinates_with_fixed_regular_grid_x(5)

    expected_result = pd.DataFrame(
        (
            (0, 0, 0),
            (5, 0, 0),
            (10, 0, 0),
            (15, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    assert np.all(expected_result.values == elecs.electrode_positions.values
                  ), 'x position replacement did not work'
def test_simple_ordering_2d():
    # provide only positions of electrodes
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
            (3, 0, 0),
            (4, 0, 0),
            (5, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    test_2d_positions = test_3d_positions[['x', 'z']]

    elecs = electrode_manager()
    elecs.set_ordering_to_sort_zyx()

    elecs.add_by_position(test_2d_positions)

    for seed in range(50):
        rng = np.random.default_rng(seed)
        c = elecs.electrode_positions.copy()
        new_index = c.index.values
        rng.shuffle(new_index)
        c_unsorted = c.set_index(new_index).sort_index()

        c_sorted = elecs.sorter(c_unsorted)
        assert np.all(test_3d_positions.values == c_sorted.values)
def test_user_supplied_sorter():
    def reversed_sorter(data):
        coordinates_sorted = data.sort_values(['z', 'y', 'x'], ascending=False)
        coordinates_sorted.index = range(1, coordinates_sorted.shape[0] + 1)
        print('SORTED')
        print(coordinates_sorted)
        return coordinates_sorted

    # provide only positions of electrodes
    test_3d_positions = pd.DataFrame(
        (
            (2, 0, 0),
            (0, 0, 0),
            (1, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)

    # default behavior
    assert np.all(elecs.get_position_of_number(1) == [2, 0, 0])
    assert np.all(elecs.get_position_of_number(2) == [0, 0, 0])
    assert np.all(elecs.get_position_of_number(3) == [1, 0, 0])

    elecs.register_custom_ordering_scheme(reversed_sorter)

    assert np.all(elecs.get_position_of_number(1) == [2, 0, 0])
    assert np.all(elecs.get_position_of_number(2) == [1, 0, 0])
    assert np.all(elecs.get_position_of_number(3) == [0, 0, 0])
def test_get_electrode_numbers_for_positions():
    # provide only positions of electrodes
    test_3d_positions = pd.DataFrame(
        (
            (2, 0, 0),
            (0, 0, 0),
            (1, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)

    # test as is
    elecs.set_ordering_to_as_is()
    assert elecs.get_electrode_numbers_for_positions([2, 0, 0]) == 0
    assert elecs.get_electrode_numbers_for_positions([0, 0, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([1, 0, 0]) == 2

    assert elecs.get_electrode_numbers_for_positions([2, 0]) == 0, '2D, pos 1'
    assert elecs.get_electrode_numbers_for_positions([0, 0]) == 1, '2D, pos 2'
    assert elecs.get_electrode_numbers_for_positions([1, 0]) == 2, '2D, pos 3'

    assert np.all(
        elecs.get_electrode_numbers_for_positions([[2, 0], [0, 0]]) ==
        [0, 1]), 'multiple positions, nested list'
def test_number_assignment():
    # provide only positions of electrodes
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
            (3, 0, 0),
            (4, 0, 0),
            (5, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.set_ordering_to_as_is_plus_one()
    elecs.add_by_position(test_3d_positions)

    input_coords = pd.DataFrame(
        (
            (5, 0, 0),
            (0, 0, 0),
            (3, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    expected_numbers = [6, 1, 4]
    elec_numbers = elecs.get_electrode_numbers_for_positions(input_coords)
    assert expected_numbers == elec_numbers.tolist()
def test_electrode_numbers():
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)
    number_assignments = elecs.get_all_electrode_numbers()
    assert np.all(number_assignments.index.values.tolist() == [1, 2, 3])
def test_conform_to_regular_x_spacing_exception():
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (2.5, 0, 0),
            (4, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)
    with pytest.raises(Exception):
        elecs.conform_to_regular_x_spacing(spacing_x=1)
def test_callable_class():
    electrode_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
            (3, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)

    assert np.all(electrode_positions.values == elecs().values)
def test_bad_input():
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
        ),
        columns=['a', 'y', 'z'],
    )
    elecs = electrode_manager()
    # we expect this function to raise an error
    try:
        elecs.add_by_position(test_3d_positions)
    except AssertionError:
        pass
def test_duplicates():
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)
    # add a second time
    elecs.add_by_position(test_3d_positions)
    elecs.add_by_position([0, 0, 0])
    # import IPython
    # IPython.embed()

    assert elecs.electrode_positions.shape == test_3d_positions.shape
def test_get_electrode_position():
    # provide only positions of electrodes
    test_3d_positions = pd.DataFrame(
        (
            (2, 0, 0),
            (0, 0, 0),
            (1, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)

    with pytest.raises(AssertionError):
        elecs.get_position_of_number(0)

    assert np.all(elecs.get_position_of_number(1) == [2, 0, 0])
    assert np.all(elecs.get_position_of_number(2) == [0, 0, 0])
    assert np.all(elecs.get_position_of_number(3) == [1, 0, 0])

    with pytest.raises(AssertionError):
        elecs.get_position_of_number(4)

    with pytest.raises(AssertionError):
        elecs.get_position_of_number(10)

    assert elecs.get_electrode_numbers_for_positions([-10, 2, 4]) is None
    # 1D/2D/3D
    assert elecs.get_electrode_numbers_for_positions([2]) == 1
    assert elecs.get_electrode_numbers_for_positions([2, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([2, 0, 0]) == 1

    assert elecs.get_electrode_numbers_for_positions([0, 0, 0]) == 2
    assert elecs.get_electrode_numbers_for_positions([1, 0, 0]) == 3

    # multiple 1D
    assert np.all(
        elecs.get_electrode_numbers_for_positions([[
            2,
        ], [
            0,
        ]]) == [1, 2])
def test_sorters():
    # provide only positions of electrodes
    test_3d_positions = pd.DataFrame(
        (
            (2, 0, 0),
            (0, 0, 0),
            (1, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)

    # test as is
    elecs.set_ordering_to_as_is()
    assert elecs.get_electrode_numbers_for_positions([2, 0, 0]) == 0
    assert elecs.get_electrode_numbers_for_positions([0, 0, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([1, 0, 0]) == 2

    assert elecs.get_electrode_numbers_for_positions([2, 0]) == 0
    assert elecs.get_electrode_numbers_for_positions([0, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([1, 0]) == 2

    # test as is plus one
    elecs.set_ordering_to_as_is_plus_one()
    assert elecs.get_electrode_numbers_for_positions([2, 0, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([0, 0, 0]) == 2
    assert elecs.get_electrode_numbers_for_positions([1, 0, 0]) == 3

    assert elecs.get_electrode_numbers_for_positions([2, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([0, 0]) == 2
    assert elecs.get_electrode_numbers_for_positions([1, 0]) == 3

    # test sorted
    elecs.set_ordering_to_sort_zyx()
    assert elecs.get_electrode_numbers_for_positions([2, 0, 0]) == 3
    assert elecs.get_electrode_numbers_for_positions([0, 0, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([1, 0, 0]) == 2

    assert elecs.get_electrode_numbers_for_positions([2, 0]) == 3
    assert elecs.get_electrode_numbers_for_positions([0, 0]) == 1
    assert elecs.get_electrode_numbers_for_positions([1, 0]) == 2
def test_reflect_on_x():
    test_3d_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_3d_positions)
    elecs.reflect_on_position_x(10)
    result_expected = pd.DataFrame(
        (
            (10 - 0, 0, 0),
            (10 - 1, 0, 0),
            (10 - 2, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    assert np.all(result_expected.values == elecs.electrode_positions.values)
def test_replace_one_coordinate():
    electrode_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
            (3, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)

    with pytest.raises(AssertionError):
        elecs.replace_coordinate_of_electrode_number(5, [10, 0, 0])

    elecs.replace_coordinate_of_electrode_number(4, [10, 0, 0])
    assert np.all(elecs.get_position_of_number(4) == [10, 0, 0])

    elecs.replace_coordinate_of_electrode_number(1, [555, 0])
    assert np.all(elecs.get_position_of_number(1) == [555, 0, 0])
def test_merging2():
    pos1 = pd.DataFrame(np.arange(0, 2, 0.2), columns=[
        'x',
    ])
    pos1['y'] = 0
    pos1['z'] = 0
    pos1.index.name = 'electrode_number'

    pos2 = pd.DataFrame(np.arange(1, 3, 0.2), columns=[
        'x',
    ])
    pos2['y'] = 0
    pos2['z'] = 0
    pos2.index.name = 'electrode_number'

    data1 = pd.DataFrame(
        (
            (1, 2, 4, 3),
            (1, 4, 3, 2),
        ),
        columns=['a', 'b', 'm', 'n'],
    )

    elecs = electrode_manager()

    positions_aligned, data1_aligned, data2_aligned = elecs.align_assignments(
        pos1,
        pos2,
        data1,
        data1.copy(),
    )

    pos_expected = pd.DataFrame(np.arange(0, 3, 0.2), columns=[
        'x',
    ])
    pos_expected['y'] = 0
    pos_expected['z'] = 0

    assert np.all(np.isclose(pos_expected.values,
                             positions_aligned.values)), 'aligned positions'
Esempio n. 18
0
def _read_general_type(content):
    """Read a type 11 (general type) RES2DINV data block

    Parameters
    ----------
    content : :py:class:`StringIO.StringIO`
        Content of data file

    Returns
    -------

    """
    header_raw = []
    index = 0
    while index < 9:
        line = content.readline()
        # filter comments
        if line.startswith('//'):
            continue
        else:
            header_raw.append(line.strip())
            index += 1
    # parse header
    header = {
        'name': header_raw[0],
        # unit is meters?
        'unit_spacing': float(header_raw[1]),
        'array_type': int(header_raw[2]),
        'type2': int(header_raw[3]),
        'type_of_measurements': int(header_raw[5]),
        'nr_measurements': int(header_raw[6]),
        'type_of_x_location': int(header_raw[7]),
        'ip_data': int(header_raw[8]),
    }

    if header['type_of_measurements'] == 0:
        raise Exception('Reading in app. resistivity not supported yet')

    df = pd.read_csv(
        content,
        delim_whitespace=True,
        header=None,
        names=(
            'nr_elecs',
            'x1',
            'z1',
            'x2',
            'z2',
            'x3',
            'z3',
            'x4',
            'z4',
            'value',
        ),
        nrows=header['nr_measurements'],
    )

    # type of x-location
    # 0: true horizontal distance
    # 1: true horizontal distance
    # 2: surface distance

    elec_mgr = electrode_manager()

    # for now ignore the z coordinates and compute simple electrode denotations
    df['a'] = df['x1'] / header['unit_spacing'] + 1
    df['b'] = df['x2'] / header['unit_spacing'] + 1
    df['m'] = df['x3'] / header['unit_spacing'] + 1
    df['n'] = df['x4'] / header['unit_spacing'] + 1

    # for now assume value in resistances
    df['r'] = df['value']

    # ABMN are integers
    df['a'] = df['a'].astype(int)
    df['b'] = df['b'].astype(int)
    df['m'] = df['m'].astype(int)
    df['n'] = df['n'].astype(int)

    # remove any nan values
    df.dropna(axis=0, subset=['a', 'b', 'm', 'n', 'r'], inplace=True)

    # drop unused columns
    df.drop(
        [
            'nr_elecs',
            'x1', 'z1',
            'x2', 'z2',
            'x3', 'z3',
            'x4', 'z4',
            'value',
        ], axis=1, inplace=True
    )
    return header, df, elec_mgr
def test_add_positions():
    test_pandas_3d = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_pandas_3d)
    assert np.all(test_pandas_3d.values == elecs.electrode_positions.values)

    test_pandas_2d = pd.DataFrame(
        (
            (0, 0),
            (1, 0),
            (2, 0),
        ),
        columns=['x', 'z'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_pandas_2d)
    assert np.all(test_pandas_3d.values == elecs.electrode_positions.values)

    test_pandas_1d = pd.DataFrame(
        (
            (0),
            (1),
            (2),
        ),
        columns=['x'],
    )
    elecs = electrode_manager()
    elecs.add_by_position(test_pandas_1d)
    assert np.all(test_pandas_3d.values == elecs.electrode_positions.values)

    # lists
    elecs = electrode_manager()

    elecs.add_by_position([[
        1,
    ], [
        2,
    ]])
    elecs.add_by_position([4.5, 0])
    elecs.add_by_position([[5.5, 0], [7.0, 0]])
    elecs.add_by_position([8, 0, 0])
    elecs.add_by_position([[9, 0, 0], [10, 0, 0]])

    result_expected = np.array((
        (1, 0, 0),
        (2, 0, 0),
        (4.5, 0, 0),
        (5.5, 0, 0),
        (7.0, 0, 0),
        (8.0, 0, 0),
        (9.0, 0, 0),
        (10.0, 0, 0),
    ))
    assert np.all(result_expected == elecs.electrode_positions.values)

    # numpy arrays
    elecs = electrode_manager()
    # 1D
    elecs.add_by_position(np.array([
        [1.5, 1.7, 1.9, 1.95],
    ]).T)

    elecs.add_by_position(np.array([3.5, 0]))
    elecs.add_by_position(np.array([[4.5, 0], [7.0, 0]]))
    elecs.add_by_position(np.array([8, 0, 0]))
    elecs.add_by_position(np.array([[9, 0, 0], [10, 0, 0]]))

    result_expected = np.array((
        (1.5, 0, 0),
        (1.7, 0, 0),
        (1.9, 0, 0),
        (1.95, 0, 0),
        (3.5, 0, 0),
        (4.5, 0, 0),
        (7.0, 0, 0),
        (8.0, 0, 0),
        (9.0, 0, 0),
        (10.0, 0, 0),
    ))
    assert np.all(result_expected == elecs.electrode_positions.values)
def test_shift_positions_by_xyz():
    electrode_positions = pd.DataFrame(
        (
            (0, 0, 0),
            (1, 0, 0),
            (2, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )

    result_expected = pd.DataFrame(
        (
            (10, 0, 0),
            (11, 0, 0),
            (12, 0, 0),
        ),
        columns=['x', 'y', 'z'],
    )

    # list
    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)
    elecs.shift_positions_xyz([
        10,
    ])
    assert np.all(elecs().values == result_expected)

    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)
    elecs.shift_positions_xyz([10, 0])
    assert np.all(elecs().values == result_expected)

    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)
    elecs.shift_positions_xyz([10, 0, 0])
    assert np.all(elecs().values == result_expected)

    # array
    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)
    elecs.shift_positions_xyz(np.array([
        10,
    ]))
    assert np.all(elecs().values == result_expected)

    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)
    elecs.shift_positions_xyz(np.array([10, 0]))
    assert np.all(elecs().values == result_expected)

    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)
    elecs.shift_positions_xyz(np.array([10, 0, 0]))
    assert np.all(elecs().values == result_expected)

    # assertions
    elecs = electrode_manager()
    elecs.add_by_position(electrode_positions)
    with pytest.raises(Exception):
        elecs.shift_positions_xyz(np.array([10, 0, 0, 0]))
    with pytest.raises(Exception):
        elecs.shift_positions_xyz(np.array([[10, 0, 0], [2, 0, 0]]))
def test_merging():
    positions1 = pd.DataFrame(
        (
            (1, 0, 0, 0),
            (2, 1, 0, 0),
            (3, 2, 0, 0),
            # note gap here in positions!
            (4, 4, 0, 0),
        ),
        columns=['electrode_number', 'x', 'y', 'z'],
    )
    data1 = pd.DataFrame(
        (
            (1, 2, 4, 3),
            (1, 4, 3, 2),
        ),
        columns=['a', 'b', 'm', 'n'],
    )

    positions2 = pd.DataFrame(
        (
            (1, 3, 0, 0),
            (2, 4, 0, 0),
            (3, 5, 0, 0),
            (4, 6, 0, 0),
        ),
        columns=['electrode_number', 'x', 'y', 'z'],
    )
    data2 = pd.DataFrame(
        (
            (1, 2, 4, 3),
            (1, 4, 3, 2),
        ),
        columns=['a', 'b', 'm', 'n'],
    )

    elecs = electrode_manager()

    positions_aligned, data1_aligned, data2_aligned = elecs.align_assignments(
        positions1,
        positions2,
        data1,
        data2,
    )

    positions_expected = pd.DataFrame(
        (
            (1, 0, 0, 0),
            (2, 1, 0, 0),
            (3, 2, 0, 0),
            (4, 4, 0, 0),
            (5, 3, 0, 0),
            (6, 5, 0, 0),
            (7, 6, 0, 0),
        ),
        columns=['electrode_number', 'x', 'y', 'z'],
    ).astype(float).set_index('electrode_number')

    assert np.all(positions_expected == positions_aligned), 'aligned positions'

    data2_expected = pd.DataFrame(
        (
            (5, 4, 7, 6),
            (5, 7, 6, 4),
        ),
        columns=['a', 'b', 'm', 'n'],
    )

    assert np.all(data1_aligned == data1)
    assert np.all(data2_aligned == data2_expected)