lammps统计六元环(非苯环)个数--Python实现

需要的文件:每个原子的坐标文件

思路

1、六元碳环中,两原子最远距离为3X1.7=5.1(标准的正六边形苯环对角距离为3A左右,所以不需要考虑太远原子的成键 )

2、六个碳原子的集合中,每个碳原子彼此之间都只成两个C-C键的情况。只有一种可能————碳原子之间首尾相连连成六元环

步骤

1、找出距离目标原子距离<=5.1的所有原子,建立一个包含n个原子列表(这个列表内的原子有可能成六元环)

2、在列表中随机取六个原子,建立一个小的合集,穷尽这种合集(排列组合C6/n) 

3、哪一个合集中的六个原子满足彼此之间都恰好成两个键,则这一个合集能够组成一个苯环

碳烟颗粒的文件可以参考上一篇统计碳氢原子比的文章的前一半代码,找一个碳烟颗粒内的基准原子,通过距离找到所有能够与他成键的原子,并不断迭代下去。直到找到所有碳烟颗粒原子。

#统计碳烟内部六元环的个数

#import matplotlib.pyplot as plt
import numpy as np
import linecache
import itertools as it         #用于调用排列组合
from collections import Counter #用于调用列表中元素计数

#距离计算公式
def distant(l1,l2):
    a=np.sqrt((float(l1[5])-float(l2[5]))**2+(float(l1[3])-float(l2[3]))**2+(float(l1[4])-float(l2[4]))**2)
    return a 
#统计列表内某一元素数量
def count_occurrences(lst, element):
    return Counter(lst)[element]


#打开碳烟颗粒的文件
with open("bi2.txt") as file_project:
    
    soot=[]
    lines =file_project.readlines()
    #print(lines)
    for line in lines:
        row = line.split()
        #print(row)
        if row[1] =='1':                   #判别是否为碳原子
            soot.append(row)               #读取碳烟颗粒中每个碳原子信息


#六个原子为一组进行排列组合
C6=0
combination=[]
x=0
for atom1 in soot:
    circle=[]
    for atom2 in soot:
        if distant(atom1,atom2) <= 3.4:  #正六边形六元环 对角距离为3A左右,设置越小计算量越少
            circle.append(atom2)
    #print(circle)
    combin=list(it.combinations(circle,6))
    #print(len(combin))                                  #number of combination
    for i in combin:                                     #i---one combin
        list1=[]
        for a in i:                                      #a---one atom of this combin
            a=[float(item) for item in a]
            list1.append(a)                              #list1---one combin
        list1.sort(key=lambda x: x[0])                   #sort for this combin
        #print(list1)
        combination.append(list1)                        #把每个组合中的原子按照序号排列,并转化为浮点数
#print(len(combination))



#删除排列组合中重复的部分
combination_atom=[]
for i in combination:
    p1=[]
    for n in i:
        n = tuple(n)                                    #每个原子信息转为元组
        p1.append(n)
    combination_atom.append(p1)       

combination1 = list(set(tuple(sub) for sub in combination_atom)) #每个排列组合信息转为元组并删除重复部分(集合方法)
new=[]
#print(len(combination1))



#统计满足六元环的排列组合
for num in combination1:                       #num --- one combin
    ever = []
    for atom1 in num:                         #atom1 of this combin
        number=0
        for atom2 in num:
            if distant(atom1,atom2) <= 1.7:
                number = number + 1
        ever.append(number)
    
    #print(ever)                 
    a = count_occurrences(ever,3)
    #print(a)
    if int(a) == 6 :
        C6 =C6 + 1
        

print(C6)



'''''''''
combination1=[]
for i in combination:
    p1=[]
    for n in i:
        n = tuple(n)
        p1.append(n)
    combination1.append(p1)
    
print(combination1)
combination1 = remove_duplicates(combination1)

''''''''''''
x=0
for num in combination:
        #x=x+1
        #print(x)
        if combination.count(num) > 1:
            combination.remove(num)
'''''''''''

''''''


















评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值