欢迎浏览我的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_dirimport sys
import osdef split_multimol2(multimol2):"""Splits a multi-mol2 file.Parameters----------multimol2 : strPath to the multi-mol2 file.Returns----------A generator object for lists for every extracted mol2-file. Lists containthe 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)breakmol2cont[-1] = mol2cont[-1].rstrip() # removes blank line at file endyield [molecule_id, "".join(mol2cont)]def write_multimol2(multimol2, out_dir):"""Splits a multi-mol2 file into smaller multi-mol2 files.Parameters-----------multimol2 : strPath to the multi-mol2 file.out_dir : str:Output directory. New files will be named<molecule_name_1>.mol2, ... <molecule_name_n>.mol2Returns-----------chunks : intNumber 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 : strPath to the multi-mol2 file.chunksize : intNumber of mol2 files per chunk.out_dir : str:Output directory. New files will be named<multimol2>_1.mol2, ... <multimol2>_n.mol2Returns-----------chunks : intNumber 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 = 0chunks = 1out_file = open(os.path.join(out_dir, out_file_stem)+'_%d.mol2' % chunks, 'w')for mol2 in split_multimol2(multimol2):cnt += 1if cnt == chunk_size:cnt = 0chunks += 1out_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 chunksif __name__ == '__main__':import argparseparser = 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 …点击进入 |
---|