示例#1
0
def get_template_match_results(structure, pattern_list, edc, rot_list, mask=None):
    dp_library = get_template_library(structure, pattern_list, edc)
    for key in dp_library['A']:
        pattern = (dp_library['A'][key]['Sim'].as_signal(2 * half_side_length, 0.025, 1).data)
    dp = pxm.ElectronDiffraction([[pattern, pattern], [pattern, pattern]])
    library = get_template_library(structure, rot_list, edc)
    indexer = IndexationGenerator(dp, library)
    return indexer.correlate(mask=mask)
示例#2
0
def test_masked_OM(default_structure, rot_list, pattern_list, edc):
    dp_library = get_template_library(default_structure, pattern_list, edc)
    for key in dp_library['A']:
        pattern = (dp_library['A'][key]['Sim'].as_signal(2 * half_side_length, 0.025, 1).data)
    dp = pxm.ElectronDiffraction([[pattern, pattern], [pattern, pattern]])
    library = get_template_library(default_structure, rot_list, edc)
    indexer = IndexationGenerator(dp, library)
    mask = hs.signals.Signal1D(([[[1], [1]], [[0], [1]]]))
    M = indexer.correlate(mask=mask)
    assert np.all(np.isnan(M.inav[0, 1].data))
示例#3
0
def test_orientation_mapping_physical(structure, rot_list, pattern_list, edc):
    dp_library = get_template_library(structure, pattern_list, edc)
    for key in dp_library['A']:
        pattern = (dp_library['A'][key]['Sim'].as_signal(2 * half_side_length, 0.025, 1).data)
    dp = pxm.ElectronDiffraction([[pattern, pattern], [pattern, pattern]])
    library = get_template_library(structure, rot_list, edc)
    indexer = IndexationGenerator(dp, library)
    M = indexer.correlate()
    assert np.all(M.inav[0, 0] == M.inav[1, 0])
    assert np.allclose(M.inav[0, 0].isig[:4, 0].data, [0, 2, 0, 0], atol=1e-3)
示例#4
0
def create_spot():
    z = np.zeros((128, 128))

    for r in [4, 3, 2]:
        rr, cc = draw.circle(30, 90, radius=r, shape=z.shape)
        z[rr, cc] = 1 / r

    dp = pxm.ElectronDiffraction(np.asarray([[z, z],
                                             [z,
                                              z]]))  # this needs to be in 2x2
    return dp
示例#5
0
def plot_lib_2d(library, size, scale, sigma, max_r, phase_name, rotation_list):
    patterns = np.empty(
        (rotation_list.shape[0], rotation_list.shape[1], size, size))

    for i in range(rotation_list.shape[0]):
        for j in range(rotation_list.shape[1]):
            patterns[i, j] = library[phase_name][tuple(
                np.rad2deg(mat2euler(rotation_list[i, j],
                                     'rzxz')))]['Sim'].as_signal(
                                         size, sigma, max_r)

    pxm.ElectronDiffraction(patterns).plot(cmap='viridis_r')
示例#6
0
def get_template_match_results(structure,
                               pattern_list,
                               edc,
                               rot_list,
                               mask=None,
                               inplane_rotations=[0]):
    dp_library = get_template_library(structure, pattern_list, edc)
    for sim in dp_library['A']['simulations']:
        pattern = (sim.as_signal(2 * half_side_length, 0.025, 1).data)
    dp = pxm.ElectronDiffraction([[pattern, pattern], [pattern, pattern]])
    library = get_template_library(structure, rot_list, edc)
    indexer = IndexationGenerator(dp, library)
    return indexer.correlate(mask=mask, inplane_rotations=inplane_rotations)
示例#7
0
def test_marker_placement_correct_beta():
    dps = []
    dp_cord_list = np.divide(generate_dp_cord_list(), 80)
    max_r = np.max(dp_cord_list) + 0.1
    for coords in dp_cord_list:
        dp_sim = DiffractionSimulation(coordinates=coords,
                                       intensities=np.ones_like(coords[:, 0]))
        dps.append(dp_sim.as_signal(144, 0.025, max_r).data)  # stores a numpy array of pattern
    dp = pxm.ElectronDiffraction(np.array([dps[0:2], dps[2:]]))  # now from a 2x2 array of patterns
    dp.set_diffraction_calibration(2 * max_r / (144))
    local_plotter(dp, dp_cord_list)

    # This is human assessed, if you see this comment, you should check it
    assert True
示例#8
0
def test_marker_placement_correct_alpha():
    dps = []
    dp_cord_list = generate_dp_cord_list()
    for coords in dp_cord_list:
        back = np.zeros((144, 144))
        x = coords.astype(int)[0, 0]
        y = coords.astype(int)[0, 1]
        back[x, y] = 1
        dps.append(back.T)  # stores a numpy array of pattern, This is dangerous (T everywhere)

    dp = pxm.ElectronDiffraction(np.array([dps[0:2], dps[2:]]))
    local_plotter(dp, dp_cord_list)

    # This is human assessed, if you see this comment, you should check it
    assert True
示例#9
0
def create_sample(edc, structure, angle_start, angle_change):
    dps = []
    for orientation in create_pair(angle_start, angle_change):
        axis, angle = euler2axangle(orientation[0], orientation[1],
                                    orientation[2], 'rzxz')
        rotation = RotationTransformation(axis, angle, angle_in_radians=True)
        rotated_structure = rotation.apply_transformation(structure)
        data = edc.calculate_ed_data(
            rotated_structure,
            reciprocal_radius=0.9,  #avoiding a reflection issue
            with_direct_beam=False)
        dps.append(data.as_signal(2 * half_side_length, 0.025, 1).data)
    dp = pxm.ElectronDiffraction([dps[0:2], dps[2:]])
    dp.set_diffraction_calibration(1 / half_side_length)
    return dp
def update_correlation_list(_=None):
    reciprocal_angstrom_per_pixel = slider_scale.val
    beam_energy = slider_energy.val
    specimen_thickness = slider_thick.val

    structure_info = structures[current_structure]

    rotation_list_resolution = np.deg2rad(1)
    phase_descriptions = [(structure_info['name'], structure_info['structure'],
                           structure_info['system'])]
    inplane_rotations = [[np.deg2rad(103)]]

    diffraction_library, structure_library = create_diffraction_library(
        specimen_thickness, beam_energy, reciprocal_angstrom_per_pixel,
        rotation_list_resolution, phase_descriptions, inplane_rotations,
        target_pattern_dimension_pixels)

    # Set up the indexer and get the indexation results
    data_dir = r'D:\Dokumenter/MTNANO/Prosjektoppgave/Data/'
    experimental_pattern_filename = data_dir + 'SPED_data_GaAs_NW/gen/Julie_180510_SCN45_FIB_a_three_phase_single_area.hdf5'
    dp = pxm.load(experimental_pattern_filename, lazy=True).inav[0:1, 0:1]
    dp = pxm.ElectronDiffraction(dp)
    pattern_indexer = IndexationGenerator(dp, diffraction_library)
    template_matching_results = pattern_indexer.correlate(
        n_largest=structure_library.orientations[0].shape[0],
        keys=[structure_info['name']],
        parallel=False)  # This is slower in parallel

    global current_rotation_list
    print(template_matching_results.data[0, 0].shape)
    current_rotation_list = template_matching_results.isig[1:4, :].data[0, 0]
    correlations = template_matching_results.isig[4, :].data[0, 0]
    global current_rotation_list_signals
    current_rotation_list_signals = []

    print(correlations.argmax(), current_rotation_list[correlations.argmax()])
    update_rotation(current_rotation_list, correlations)
    fig.canvas.draw_idle()
示例#11
0
def create_library():
    dps = []
    half_side_length = 72
    half_shape = (half_side_length, half_side_length)
    num_orientations = 11
    simulations = np.empty(num_orientations, dtype='object')
    orientations = np.empty(num_orientations, dtype='object')
    pixel_coords = np.empty(num_orientations, dtype='object')
    intensities = np.empty(num_orientations, dtype='object')

    # Creating the matchresults.
    for alpha in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
        coords = (np.random.rand(5, 2) -
                  0.5) * 2  # zero mean, range from -1 to +1
        dp_sim = DiffractionSimulation(coordinates=coords,
                                       intensities=np.ones_like(coords[:, 0]),
                                       calibration=1 / half_side_length)
        simulations[alpha] = dp_sim
        orientations[alpha] = (alpha, alpha, alpha)
        pixel_coords[alpha] = (dp_sim.calibrated_coordinates[:, :2] +
                               half_shape).astype(int)
        intensities[alpha] = dp_sim.intensities
        if alpha < 4:
            dps.append(
                dp_sim.as_signal(2 * half_side_length, 0.075,
                                 1).data)  # stores a numpy array of pattern

    library = DiffractionLibrary()
    library["Phase"] = {
        'simulations': simulations,
        'orientations': orientations,
        'pixel_coords': pixel_coords,
        'intensities': intensities,
    }
    dp = pxm.ElectronDiffraction([dps[0:2],
                                  dps[2:]])  # now from a 2x2 array of patterns
    return dp, library
示例#12
0
library = dict()
half_shape = (half_side_length, half_side_length)
library["Phase"] = {}

# Creating the matchresults.

for alpha in [0, 1, 2, 3]:
    coords = (np.random.rand(5, 2) - 0.5) * 2  #zero mean, range from -1 to +1
    dp_sim = DiffractionSimulation(coordinates=coords,
                                   intensities=np.ones_like(coords[:, 0]),
                                   calibration=1 / half_side_length)
    dp_sim_list.append(dp_sim)  #stores the simulations
    dps.append(dp_sim.as_signal(2 * half_side_length, 0.075,
                                1).data)  #stores a numpy array of pattern

dp = pxm.ElectronDiffraction([dps[0:2],
                              dps[2:]])  #now from a 2x2 array of patterns

for alpha in np.arange(0, 10, 1):
    rotation = (alpha, 0, 0)
    if rotation[0] < 4:
        library = create_library_entry(library, rotation,
                                       dp_sim_list[rotation[0]])
    else:
        local_cords = np.random.rand(5, 2)
        pat = DiffractionSimulation(coordinates=local_cords,
                                    intensities=np.ones_like(local_cords[:,
                                                                         0]))
        library = create_library_entry(library, rotation, pat)

indexer = IndexationGenerator(dp, library)
match_results = indexer.correlate()