#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @file :process_trajectory.py @Description: : @Date :2023/12/11 11:10:24 @Author :lyzeng @Email :pylyzeng@gmail.com @version :1.0 ''' from runner import SimulationRunner import subprocess # 新增处理轨迹的方法 def process_trajectory(temp_folder, output_folder, extract_interval): # 根据提供的脚本逻辑读取和保存索引文件 ndx_dict = SimulationRunner.read_ndx_file(f'{runner_folder}/index.ndx') # 根据索引文件内容决定如何处理轨迹 if any(key.startswith("LG") for key in ndx_dict): # 处理含有LG组的情况 new_ndx_dict = {key: value for key, value in ndx_dict.items() if key.startswith("LG") or key in ["Protein", "Protein_LIG"]} SimulationRunner.save_ndx_file(f"{temp_folder}/tarj_show.ndx", new_ndx_dict) # 构建处理轨迹的命令 command_1 = f'echo "Protein_LIG" | gmx trjconv -dt {extract_interval} -s {tpr_file} -f {xtc_file} -n {temp_folder}/tarj_show.ndx -pbc mol -o {temp_folder}/temp.xtc' command_2 = f'echo "Protein\nProtein\nProtein_LIG" | gmx trjconv -s {tpr_file} -f {temp_folder}/temp.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -o {output_folder}/traj_show.xtc' command_3 = f'echo "Protein\nProtein\nProtein_LIG" | gmx trjconv -s {tpr_file} -f {temp_folder}/temp.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -b 0 -e 0 -o {output_folder}/tarj_show.pdb' else: # 处理只含有蛋白质组的情况 new_ndx_dict = {key: value for key, value in ndx_dict.items() if key in ["Protein"]} SimulationRunner.save_ndx_file(f"{temp_folder}/tarj_show.ndx", new_ndx_dict) # 构建处理轨迹的命令 command_1 = f'echo "Protein" | gmx trjconv -dt {extract_interval} -s {tpr_file} -f {xtc_file} -n {temp_folder}/tarj_show.ndx -pbc mol -o {temp_folder}/temp.xtc' command_2 = f'echo "Protein\nProtein\nProtein" | gmx trjconv -s {tpr_file} -f {temp_folder}/temp.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -o {output_folder}/traj_show.xtc' command_3 = f'echo "Protein\nProtein\nProtein" | gmx trjconv -s {tpr_file} -f {temp_folder}/temp.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -b 0 -e 0 -o {output_folder}/tarj_show.pdb' subprocess.run(command_1, shell=True, check=True) subprocess.run(command_2, shell=True, check=True) subprocess.run(command_3, shell=True, check=True) ''' def read_ndx_file(filename): ndx_dict = {} current_section = None with open(filename, 'r') as file: for line in file: line = line.strip() if line.startswith('[') and line.endswith(']'): current_section = line[1:-1].strip() ndx_dict[current_section] = [] else: if current_section is not None: ndx_dict[current_section].extend(map(int, line.split())) return ndx_dict def save_ndx_file(filename, ndx_dict): with open(filename, 'w') as file: for section, content in ndx_dict.items(): file.write(f"[ {section} ]\n") for i, num in enumerate(content, 1): file.write(str(num)) if i % 15 == 0: file.write("\n") else: file.write("\t") file.write("\n") ndx_dict = read_ndx_file('index.ndx') new_ndx_dict = {key: value for key, value in ndx_dict.items() if key in ["Protein"]} temp_folder = 'traj_tmp' extract_interval = 100 tpr_file = 'md.tpr' xtc_file = 'md.xtc' output_folder = 'extra_traj' save_ndx_file(f"{temp_folder}/tarj_show.ndx", new_ndx_dict) !echo "Protein" | gmx_mpi trjconv -dt {extract_interval} -s {tpr_file} -f {xtc_file} -n {temp_folder}/tarj_show.ndx -pbc mol -o {temp_folder}/temp.xtc !echo "Protein\nProtein\nProtein" | gmx_mpi trjconv -s {tpr_file} -f {temp_folder}/temp.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -o {output_folder}/traj_show.xtc # - echo "Protein\nProtein\nProtein" | gmx_mpi trjconv -s {tpr_file} -f md.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -o {output_folder}/traj_show.xtc !echo "Protein\nProtein\nProtein" | gmx_mpi trjconv -s {tpr_file} -f {temp_folder}/temp.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -b 0 -e 0 -o {output_folder}/tarj_show.pdb # - !echo "Protein\nProtein\nProtein" | gmx_mpi trjconv -s {tpr_file} -f md.xtc -n {temp_folder}/tarj_show.ndx -center -fit rot+trans -b 0 -e 0 -o {output_folder}/tarj_show.pdb '''