Calculate species numbers in a large configuration (**Python**) =========== This python script calculate number of speces from dump.trajlammps file :: #lipai@mail.ustc.edu.cn import numpy as np class atom(): """ Class for representing an atom Parameters: index: index of this atom pos: position of this atom sp_index: index of its species atomnum: number of carbon atoms in its species atoms_list: index of all species if index!=sp_index, the info of atomnum and atoms_list is useless Method: join(index_j): add j atom into this species """ def __init__(self,index,pos): self.index=index self.pos=pos self.sp_index=index self.atomnum=1 self.atoms_list=[] self.atoms_list.append(index) def extend_sp(self,index_j): global atoms if self.index != self.sp_index: print("error") raise RunError at=atoms[index_j] self.atomnum=self.atomnum+at.atomnum self.atoms_list.extend(at.atoms_list) at.update(self.sp_index) def update(self,index_j): global atoms for i in self.atoms_list: atoms[i].sp_index=index_j; def dist(i,j): return np.linalg.norm(i.pos-j.pos) def sp_join(i,j): global atoms if i.sp_index==j.sp_index: return if i.sp_index < j.sp_index: atoms[i.sp_index].extend_sp(j.sp_index) else: atoms[j.sp_index].extend_sp(i.sp_index) def calculate(pos): global atoms atoms=[] for i in range(0,pos.shape[0]): atoms.append(atom(i,pos[i])) for i in range(0,len(atoms)): for j in range(i,len(atoms)): if dist(atoms[i],atoms[j])<1.7: sp_join(atoms[i],atoms[j]) num=[0,0,0,0,0] for i in atoms: if i.index==i.sp_index: if i.atomnum<5: num[i.atomnum-1]+=1 return num def skip(traj): if len(traj.readline())==0: return 0 for i in range(8): traj.readline() return 1 def get_atom_num(traj): for i in range(3): traj.readline() num_atom=int(traj.readline().rstrip('\n')) return num_atom def write_info(sp): for filename in filenames: if len(filename)>0: sp.write(str(num[0])+'\t'+str(num[1])+'\t'+str(num[2])+'\t'+str(num[3])+'\t'+str(num[4])+'\n') atoms=[] fin=open('dump.lammpstrj','r') fout=open('species','w') atom_num=get_atom_num(fin) fin.seek(0) while skip(fin): pos=[] for i in range(atom_num): cont=fin.readline().rstrip('\n').split() if len(cont) !=8: print("len(cout): "+str(len(cont))) print("cout.{}".format(cont)) print(str(len(pos))) exit() else: if cont[1]=="2": pos.append(cont) pos=np.array(pos) pos=pos[:,2:5] pos=pos.astype(np.float64) num=calculate(pos) fout.write(str(num[0])+'\t'+str(num[1])+'\t'+str(num[2])+'\t'+str(num[3])+'\t'+str(num[4])+'\n') fin.close() fout.close()