欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 |
---|
文章目录
前言
Mol2格式文件是常用的分子结构存储文件,可以在一个.Mol2文件中记录单个或多个分子的立体结构信息、电荷信息以及其他信息。
本文介绍Mol2分子处理的常见操作,包括文件合并与拆分,分子名称修改,分子计数与变量传递等。
Mol2文件格式的介绍:化学分子Mol2文件格式与使用注意事项
Tripos Mol2 Format File,分子结构 mol2格式文件的详细介绍:mol2格式文件的详细介绍PDF
一、Mol2文件合并
6个文件,每个包含0个,1个或者过个分子:M1.mo2, M2.mol2,M3.mol2,M4.mo2,M5.mol2,M6.mol2
合并前三个文件到新文件merge-3.mol2,利用Linux命令cat:
#用cat命令,定向输出
cat *.mol2 > Merge1-3.mol2
将M4.mo2,M5.mol2,M6.mol2三个文件中分子,添加进Merge1-3.mol2,命名Merge1-6.mol2;
# cat 追加,然后改名
cat M4.mo2 M5.mol2 M6.mol2 >> Merge1-3.mol2
mv Merge1-3.mol2 Merge1-6.mol2
具体用法:
obabel *.mol2 -omol2 -O mergemol2.mol2
obabel *.mol2 -omol2 -O mergemol2.mol2
obabel *.mol2 -osdf -O mergemol2.sdf
二、Mol2文件拆分为含有单个分子的文件
来自数据库或者供应商的文件列表往往是包含多个分子的文件,多分子的Mol2文件可以用以下Python脚本拆分,支持Python2或者Python3,来自AspirinCode博主。
用法:
python split_multimol2.py multi-mol2.mol2 out_dir
将需要拆分的文件命名为multi-mol2.mol2,在同一目录建立文件夹out_dir,运行以上脚本。
split_multimol2.py脚本内容:
#Python2 or Python3
#AspirinCode 2018
#Script that splits a multi-mol2 file into individual mol2 files.
#python split_multimol2.py multi-mol2.mol2 out_dir
import sys
import os
def split_multimol2(multimol2):
"""
Splits a multi-mol2 file.
Parameters
----------
multimol2 : str
Path to the multi-mol2 file.
Returns
----------
A generator object for lists for every extracted mol2-file. Lists contain
the molecule ID and the mol2 file contents.
e.g., ['ID1234', '@<TRIPOS>MOLECULE...'
"""
with open(multimol2, 'r') as mol2file:
line = mol2file.readline()
while not mol2file.tell() == os.fstat(mol2file.fileno()).st_size:
if line.startswith("@<TRIPOS>MOLECULE"):
mol2cont = []
mol2cont.append(line)
line = mol2file.readline()
molecule_id = line.strip()
while not line.startswith("@<TRIPOS>MOLECULE"):
mol2cont.append(line)
line = mol2file.readline()
if mol2file.tell() == os.fstat(mol2file.fileno()).st_size:
mol2cont.append(line)
break
mol2cont[-1] = mol2cont[-1].rstrip() # removes blank line at file end
yield [molecule_id, "".join(mol2cont)]
def write_multimol2(multimol2, out_dir):
"""
Splits a multi-mol2 file into smaller multi-mol2 files.
Parameters
-----------
multimol2 : str
Path to the multi-mol2 file.
out_dir : str:
Output directory. New files will be named
<molecule_name_1>.mol2, ... <molecule_name_n>.mol2
Returns
-----------
chunks : int
Number of files written.
"""
if not out_dir:
os.mkdir(out_dir)
single_mol2s = split_multimol2(args.MOL2_FILE)
for mol2 in single_mol2s:
out_mol2 = os.path.join(args.OUT_DIR, mol2[0]) + '.mol2'
with open(out_mol2, 'w') as out_file:
for line in mol2[1]:
out_file.write(line)
out_file.write('\n')
def write_multimol2_chunks(multimol2, chunk_size, out_dir):
"""
Splits a multi-mol2 file into smaller multi-mol2 files.
Parameters
-----------
multimol2 : str
Path to the multi-mol2 file.
chunksize : int
Number of mol2 files per chunk.
out_dir : str:
Output directory. New files will be named
<multimol2>_1.mol2, ... <multimol2>_n.mol2
Returns
-----------
chunks : int
Number of files written.
"""
if not os.path.exists(out_dir):
os.mkdir(out_dir)
out_path_stem = os.path.dirname(multimol2)
out_file_stem = os.path.basename(multimol2).split('.mol2')[0]
cnt = 0
chunks = 1
out_file = open(os.path.join(out_dir, out_file_stem)+'_%d.mol2' % chunks, 'w')
for mol2 in split_multimol2(multimol2):
cnt += 1
if cnt == chunk_size:
cnt = 0
chunks += 1
out_file.close()
out_file = open(os.path.join(out_dir, out_file_stem)+'_%d.mol2' % chunks, 'w')
out_file.write(mol2[1] + '\n')
out_file.close()
return chunks
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(
description='Splits a multi-mol2 file into individual mol2 files',
formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('MOL2_FILE')
parser.add_argument('OUT_DIR')
parser.add_argument('-c', '--chunksize', help='Number of MOL2 structures per file (1 by default)', type=int)
parser.add_argument('-v', '--version', action='version', version='split_multimol2 v. 1.1')
args = parser.parse_args()
if args.chunksize:
write_multimol2_chunks(multimol2=args.MOL2_FILE, chunk_size=args.chunksize, out_dir=args.OUT_DIR)
else:
write_multimol2(multimol2=args.MOL2_FILE, out_dir=args.OUT_DIR)
拆分后单一分子的文件名是mol2分子的名称,即@MOLECULE字段的第一行。
三、Mol2文件分子名称修改与提取
3.1 分子名称修改去除空格
由于包含单一分子的mol2文件中,分子名称(文件第二行)的命名相对自由,其中可以包含空格等字符,以此命名mol2文件名会在后续文件名操作中带入空格,Tab等,出现变量传递错位等问题。
这里展示从拆分后多个mol2文件中删除分子名称中的空格(\s)和Tab(\t):
cd out_dir
filelists=$(ls)
for file in ${filelists}; do
if [ ${file##*.} = "mol2" ]; then
newmol2name=${file%.*}; sed -i '2s/\s//g; 2s/\t//g' ${file}
fi
done
cd ..
3.2 文件名称提取
有时需要mol2文件名字列表:
cd out_dir
ls *mol2 > ./mol2_name_list.csv
cd ..
四、Mol2文件包含分子计数
4.1 Mol2文件中分子计数
Mol2文件格式可以看出,每个分子之间都是以关键字@<TRIPOS>MOLECULE
分割,文件中分子计数就是输出其数量;
grep命令简单提取该关键字,然后计数,缺点就是分子数量多的时候,屏幕会滚动输出该关键字。
grep '@<TRIPOS>MOLECULE' ./multi-mol2.mol2 | wc -l
4.2 分子计数传递变量
将数出的分子数量传递给变量mol2_num:
mol2_num=$(grep '@<TRIPOS>MOLECULE' ./multi-mol2.mol2 | wc -l)
echo "the number in multi-mol2.mol2 is: ${mol2_num} "
五、Mol2文件与其他格式文件的转换
可使用Openbabel 批量转换为sdf格式和smile:
obabel *.mol2 -osdf -O .sdf -m
obabel *.mol2 -osmi -O .smi -m
建议使用MOE等软件避免转换中原子类型等不一致。
总结
Mol2格式文件是常用的分子结构存储文件,可以在一个.Mol2文件中记录单个或多个分子的立体结构信息、电荷信息以及其他信息。
本文介绍Mol2分子处理的常见操作,包括文件合并与拆分,分子名称修改,分子计数与变量传递等。
参考资料
- https://bbdrug.blog.csdn.net/article/details/136274381
- https://download.csdn.net/download/weixin_40192882/88872977
欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 |
---|