def get_model_refiner_one_sublattice_12_vacancies( image_noise=True, test_element='Ti_2'): # make one with more vacancies maybe sublattice = get_simple_cubic_sublattice( image_noise=image_noise, with_vacancies=False) sub1_atom_positions = np.array(sublattice.atom_positions).T sub1_image = get_simple_cubic_signal( image_noise=image_noise, with_vacancies=True) sub1 = am.Sublattice(sub1_atom_positions, sub1_image) for i in range(0, len(sub1.atom_list)): sub1.atom_list[i].elements = test_element test_element_info = split_and_sort_element(test_element) sub1_element_list = auto_generate_sublattice_element_list( material_type='single_element_column', elements=test_element_info[0][1], max_number_atoms_z=test_element_info[0][2] + 3) refiner_dict = {sub1: sub1_element_list} comparison_image = sublattice.signal refiner = Model_Refiner(refiner_dict, comparison_image) return refiner
def _auto_mask_radii_init(self): ''' Automatically set the mask_radius for each sublattice. Use mask_radius='auto' when calling a Model Refiner method. Ideally you could have the mask_radius/percent_to_nn change depending on the atom, but for now depending on the sublattice is okay. ''' mask_radii = [] for sublattice in self.sublattice_list: element_config = get_most_common_sublattice_element( sublattice, info='element') chemical = split_and_sort_element(element_config)[0][1] radius = atomic_radii_in_pixels(self.sampling, chemical) mask_radii.append(radius) self.auto_mask_radius = mask_radii
def get_model_refiner_one_sublattice_varying_amp( image_noise=False, amplitude=[0, 5], test_element='Ti_2'): sub1 = get_simple_cubic_sublattice(image_noise=image_noise, amplitude=amplitude) for i in range(0, len(sub1.atom_list)): sub1.atom_list[i].elements = test_element test_element_info = split_and_sort_element(test_element) sub1_element_list = auto_generate_sublattice_element_list( material_type='single_element_column', elements=test_element_info[0][1], max_number_atoms_z=np.max(amplitude)) refiner_dict = {sub1: sub1_element_list} comparison_image = get_simple_cubic_signal( image_noise=image_noise, amplitude=test_element_info[0][2]) refiner = Model_Refiner(refiner_dict, comparison_image) return refiner
def get_model_refiner_one_sublattice_3_vacancies( image_noise=True, test_element='Ti_2'): # make one with more vacancies maybe sub1 = am_dev.dummy_data.get_simple_cubic_with_vacancies_sublattice( image_noise=image_noise) for i in range(0, len(sub1.atom_list)): sub1.atom_list[i].elements = test_element test_element_info = split_and_sort_element(test_element) sub1_element_list = auto_generate_sublattice_element_list( material_type='single_element_column', elements=test_element_info[0][1], max_number_atoms_z=test_element_info[0][2] + 3) refiner_dict = {sub1: sub1_element_list} comparison_image = am_dev.dummy_data.get_simple_cubic_signal( image_noise=image_noise) refiner = Model_Refiner(refiner_dict, comparison_image) refiner.auto_mask_radius = [4] return refiner
def create_dataframe_for_xyz(sublattice_list, element_list, x_size, y_size, z_size, filename, header_comment='top_level_comment'): """ Creates a Pandas Dataframe and a .xyz file (usable with Prismatic) from the inputted sublattice(s). Parameters ---------- sublattice_list : list of Atomap Sublattice objects element_list : list of strings Each string must be an element symbol from the periodic table. x_size, y_size, z_size : floats Dimensions of the x,y,z axes in Angstrom. filename : string Name with which the .xyz file will be saved. header_comment : string, default 'top_level_comment' Example ------- >>> import temul.external.atomap_devel_012.dummy_data as dummy_data >>> sublattice = dummy_data.get_simple_cubic_sublattice() >>> for i in range(0, len(sublattice.atom_list)): ... sublattice.atom_list[i].elements = 'Mo_1' ... sublattice.atom_list[i].z_height = '0.5' >>> element_list = ['Mo_0', 'Mo_1', 'Mo_2'] >>> x_size, y_size = 50, 50 >>> z_size = 5 >>> dataframe = create_dataframe_for_xyz([sublattice], element_list, ... x_size, y_size, z_size, ... filename='dataframe', ... header_comment='Here is an Example') """ df_xyz = pd.DataFrame(columns=[ '_atom_site_Z_number', '_atom_site_fract_x', '_atom_site_fract_y', '_atom_site_fract_z', '_atom_site_occupancy', '_atom_site_RMS_thermal_vib' ]) # add header sentence df_xyz = df_xyz.append( { '_atom_site_Z_number': header_comment, '_atom_site_fract_x': '', '_atom_site_fract_y': '', '_atom_site_fract_z': '', '_atom_site_occupancy': '', '_atom_site_RMS_thermal_vib': '' }, ignore_index=True) # add unit cell dimensions df_xyz = df_xyz.append( { '_atom_site_Z_number': '', '_atom_site_fract_x': format(x_size, '.6f'), '_atom_site_fract_y': format(y_size, '.6f'), '_atom_site_fract_z': format(z_size, '.6f'), '_atom_site_occupancy': '', '_atom_site_RMS_thermal_vib': '' }, ignore_index=True) for sublattice in sublattice_list: # denomiator could also be: sublattice.signal.axes_manager[0].size for i in range(0, len(sublattice.atom_list)): if sublattice.atom_list[i].elements in element_list: # value = 0 # this loop cycles through the length of the split element eg, # 2 for 'Se_1.S_1' and # outputs an atom label for each for k in range( 0, len( split_and_sort_element( sublattice.atom_list[i].elements))): if split_and_sort_element( sublattice.atom_list[i].elements)[k][2] >= 1: atomic_number = split_and_sort_element( sublattice.atom_list[i].elements)[k][3] if "," in sublattice.atom_list[i].z_height: atom_z_height = float( sublattice.atom_list[i].z_height.split(",")[k]) else: atom_z_height = float( sublattice.atom_list[i].z_height) # this loop controls the z_height # len(sublattice.atom_list[i].z_height)): for p in range( 0, split_and_sort_element( sublattice.atom_list[i].elements)[k][2]): # could use ' ' + value to get an extra space # between columns! # nans could be better than '' # (len(sublattice.image)- if "," in sublattice.atom_list[ i].z_height and split_and_sort_element( sublattice.atom_list[i].elements )[k][2] > 1: atom_z_height = float( sublattice.atom_list[i].z_height.split( ",")[p]) else: pass df_xyz = df_xyz.append( { '_atom_site_Z_number': atomic_number, '_atom_site_fract_x': format( sublattice.atom_list[i].pixel_x * (x_size / len(sublattice.image[0, :])), '.6f'), '_atom_site_fract_y': format( sublattice.atom_list[i].pixel_y * (y_size / len(sublattice.image[:, 0])), '.6f'), # this is a fraction already, which is why we # don't divide as in x and y '_atom_site_fract_z': format(atom_z_height * z_size, '.6f'), '_atom_site_occupancy': 1.0, '_atom_site_RMS_thermal_vib': 0.1 }, ignore_index=True) # insert row df_xyz = df_xyz.append( { '_atom_site_Z_number': int(-1), '_atom_site_fract_x': '', '_atom_site_fract_y': '', '_atom_site_fract_z': '', '_atom_site_occupancy': '', '_atom_site_RMS_thermal_vib': '' }, ignore_index=True) if filename is not None: df_xyz.to_csv(filename + '.xyz', sep=' ', header=False, index=False) return (df_xyz)
def create_dataframe_for_xyz(sublattice_list, element_list, x_size, y_size, z_size, filename, header_comment='top_level_comment'): """ Parameters ---------- Example ------- >>> import atomap.api as am >>> sublattice = am.dummy_data.get_simple_cubic_sublattice() >>> for i in range(0, len(sublattice.atom_list)): ... sublattice.atom_list[i].elements = 'Mo_1' ... sublattice.atom_list[i].z_height = '0.5' >>> element_list = ['Mo_0', 'Mo_1', 'Mo_2'] >>> x_size, y_size = 50, 50 >>> z_size = 5 >>> dataframe = create_dataframe_for_xyz([sublattice], element_list, ... x_size, y_size, z_size, ... filename='dataframe', ... header_comment='Here is an Example') """ df_xyz = pd.DataFrame(columns=[ '_atom_site_Z_number', '_atom_site_fract_x', '_atom_site_fract_y', '_atom_site_fract_z', '_atom_site_occupancy', '_atom_site_RMS_thermal_vib' ]) # add header sentence df_xyz = df_xyz.append( { '_atom_site_Z_number': header_comment, '_atom_site_fract_x': '', '_atom_site_fract_y': '', '_atom_site_fract_z': '', '_atom_site_occupancy': '', '_atom_site_RMS_thermal_vib': '' }, ignore_index=True) # add unit cell dimensions df_xyz = df_xyz.append( { '_atom_site_Z_number': '', '_atom_site_fract_x': format(x_size, '.6f'), '_atom_site_fract_y': format(y_size, '.6f'), '_atom_site_fract_z': format(z_size, '.6f'), '_atom_site_occupancy': '', '_atom_site_RMS_thermal_vib': '' }, ignore_index=True) for sublattice in sublattice_list: # denomiator could also be: sublattice.signal.axes_manager[0].size for i in range(0, len(sublattice.atom_list)): if sublattice.atom_list[i].elements in element_list: # value = 0 # this loop cycles through the length of the split element eg, # 2 for 'Se_1.S_1' and # outputs an atom label for each for k in range( 0, len( split_and_sort_element( sublattice.atom_list[i].elements))): if split_and_sort_element( sublattice.atom_list[i].elements)[k][2] >= 1: atomic_number = split_and_sort_element( sublattice.atom_list[i].elements)[k][3] if "," in sublattice.atom_list[i].z_height: atom_z_height = float( sublattice.atom_list[i].z_height.split(",")[k]) else: atom_z_height = float( sublattice.atom_list[i].z_height) # this loop controls the z_height # len(sublattice.atom_list[i].z_height)): for p in range( 0, split_and_sort_element( sublattice.atom_list[i].elements)[k][2]): # could use ' ' + value to get an extra space # between columns! # nans could be better than '' # (len(sublattice.image)- if "," in sublattice.atom_list[ i].z_height and split_and_sort_element( sublattice.atom_list[i].elements )[k][2] > 1: atom_z_height = float( sublattice.atom_list[i].z_height.split( ",")[p]) else: pass df_xyz = df_xyz.append( { '_atom_site_Z_number': atomic_number, '_atom_site_fract_x': format( sublattice.atom_list[i].pixel_x * (x_size / len(sublattice.image[0, :])), '.6f'), '_atom_site_fract_y': format( sublattice.atom_list[i].pixel_y * (y_size / len(sublattice.image[:, 0])), '.6f'), # this is a fraction already, which is why we don't divide as in x and y '_atom_site_fract_z': format(atom_z_height * z_size, '.6f'), '_atom_site_occupancy': 1.0, # might need to loop through the vancancies here? '_atom_site_RMS_thermal_vib': 0.1 }, ignore_index=True) # insert row df_xyz = df_xyz.append( { '_atom_site_Z_number': int(-1), '_atom_site_fract_x': '', '_atom_site_fract_y': '', '_atom_site_fract_z': '', '_atom_site_occupancy': '', '_atom_site_RMS_thermal_vib': '' }, ignore_index=True) if filename is not None: df_xyz.to_csv(filename + '.xyz', sep=' ', header=False, index=False) return (df_xyz)