Talk:Mod:Hunt Research Group/recentre xyz.py
Appearance
#!/usr/bin/python # HOWTO: ./recentre_xyz.py <INPUT FILE> <OUTPUT FILE> <X TRANS> <Y TRANS> <Z TRANS> (<UNIT CELL LENGTH>) # # <INPUT FILE> = input xyz file # <OUTPUT FILE> = output xyz file # <X TRANS> = translate all x-coordinates by this value # <Y TRANS> = translate all y-coordinates by this value # <Z TRANS> = translate all z-coordinates by this value # <UNIT CELL LENGTH> (optional) = unit cell length - note a cubic system is assumed. import sys def main(file,output,x_trans,y_trans,z_trans,unit_cell_len=None): with open(file) as in_f: with open(output,'w') as out_f: first_line = in_f.readline() out_f.write(first_line) no_atoms = int(first_line.strip()) sec_line = in_f.readline() out_f.write(sec_line) for a in range(no_atoms): atom_line = in_f.readline() #print ('atom_line ' + str(a+1) + ' ' + atom_line) atom_type,x_coord,y_coord,z_coord = atom_line.split() x_coord = float(x_coord) + x_trans y_coord = float(y_coord) + y_trans z_coord = float(z_coord) + z_trans if unit_cell_len: if x_coord > unit_cell_len/2: x_coord = x_coord - unit_cell_len elif x_coord < -unit_cell_len/2: x_coord = x_coord + unit_cell_len if y_coord > unit_cell_len/2: y_coord = y_coord - unit_cell_len elif y_coord < -unit_cell_len/2: y_coord = y_coord + unit_cell_len if z_coord > unit_cell_len/2: z_coord = z_coord - unit_cell_len elif z_coord < -unit_cell_len/2: z_coord = z_coord + unit_cell_len new_atom_line = atom_type + ' ' + str(x_coord) + ' ' + str(y_coord) + ' ' + str(z_coord) + '\n' out_f.write(new_atom_line) next_line = in_f.readline() n_atoms_check = int(next_line.strip()) #print ('n_atoms_check:' + str(n_atoms_check)) while n_atoms_check == no_atoms: #print (next_line) out_f.write(next_line) sec_line = in_f.readline() #print (sec_line) out_f.write(sec_line) for a in range(no_atoms): atom_line = in_f.readline() #print ('atom_line ' + str(a+1) + ' ' + atom_line) atom_type,x_coord,y_coord,z_coord = atom_line.split() x_coord = float(x_coord) + x_trans y_coord = float(y_coord) + y_trans z_coord = float(z_coord) + z_trans if unit_cell_len: if x_coord > unit_cell_len/2: x_coord = x_coord - unit_cell_len elif x_coord < -unit_cell_len/2: x_coord = x_coord + unit_cell_len if y_coord > unit_cell_len/2: y_coord = y_coord - unit_cell_len elif y_coord < -unit_cell_len/2: y_coord = y_coord + unit_cell_len if z_coord > unit_cell_len/2: z_coord = z_coord - unit_cell_len elif z_coord < -unit_cell_len/2: z_coord = z_coord + unit_cell_len new_atom_line = atom_type + ' ' + str(x_coord) + ' ' + str(y_coord) + ' ' + str(z_coord) + '\n' out_f.write(new_atom_line) next_line = in_f.readline() #print ('next_line: ' + str(next_line)) if len(next_line.split()) > 0: n_atoms_check = int(next_line.strip()) else: n_atoms_check = None return if __name__ == "__main__": if len(sys.argv) == 6: sys.exit(main(sys.argv[1],sys.argv[2],float(sys.argv[3]),float(sys.argv[4]),float(sys.argv[5]),None)) elif len(sys.argv) == 7: sys.exit(main(sys.argv[1],sys.argv[2],float(sys.argv[3]),float(sys.argv[4]),float(sys.argv[5]),float(sys.argv[6]))) else: print ('Wrong number of arguments. Please try again') sys.exit()