def md_to_sp(): """ Creates gaussian sp inputs from the molecular dynamics""" oniom_gaussian_example = gaussian.GaussianCom(GAUSSIAN_AMBER_EXAMPLE) example_atoms_list = oniom_gaussian_example.atoms_list ## read single point charge inputs to know the geometries to create charge_com_files = [] for charge_com_file in os.listdir(GAUSSIAN_CHARGE_FOLDER): if charge_com_file.endswith(".com"): charge_com_files.append(charge_com_file) charge_com_files.sort() ## read geometries list and correct charges from log files geometries_list = [] for charge_com_file in charge_com_files: charge_com_file = "{}/{}".format(GAUSSIAN_CHARGE_FOLDER, charge_com_file) gaussian_charge_com = gaussian.GaussianCom(charge_com_file) charge_com_atoms_list = gaussian_charge_com.atoms_list ############ read mulliken new charges charge_log_name = charge_com_file.replace(".com", ".log") mulliken_charges_list = gaussian.read_mulliken_charges(charge_log_name) for no, charge in enumerate(mulliken_charges_list): if charge != 0: charge_com_atoms_list[no].charge = float(charge) ############# end of charges reading ######### geometries_list.append(charge_com_atoms_list) # read numbers of important atoms gaussian_amber_file = gaussian.GaussianCom(GAUSSIAN_AMBER_EXAMPLE) gaussian_sp_file = gaussian.GaussianCom(GAUSSIAN_CHARGE_EXAMPLE) amber_atoms_list = gaussian_amber_file.atoms_list gaussian_atoms_list = gaussian_sp_file.atoms_list amber_hl_no_atoms_list = [] gaussian_hl_no_atoms_list = [] for no, atom in enumerate(amber_atoms_list): if 'H' in atom.oniom.layer: amber_hl_no_atoms_list.append(no) for no, atom in enumerate(gaussian_atoms_list): if 'H' in atom.oniom.layer: gaussian_hl_no_atoms_list.append(no) for md_no in sorted(os.listdir(AMBER_FOLDER)): if int(md_no) in range(LOG_POINTS[0][1], LOG_POINTS[0][2] + 1, LOG_POINTS[0][3]): folder_name = "{}/{}".format(SP_ONIOM_FOLDER, md_no) amber_folder_name = "{}/{}".format(AMBER_FOLDER, md_no) os.makedirs(folder_name) mdcrd_name = "{}/{}".format(amber_folder_name, "mdp.mdcrd") sp_jobs_list = [] snapshots = amber.extract_many_from_mdcrd(mdcrd_name, MD_NO_ATOMS, 0,1000,1) #TODO for sp_no in range(0, 1000, 1): ####### TODO!!!!!! mdcrd_coordinates = snapshots[sp_no] gaussian_atoms_list = [] # an example file is used to read the pdb info for no, atom in enumerate(example_atoms_list): atom.SetVector(float(mdcrd_coordinates[no][0]), float(mdcrd_coordinates[no][1]), float(mdcrd_coordinates[no][2])) gaussian_atoms_list.append(atom) #### high layer geometry and charges come from the ####charge single points for position in [-1, 0, 1]: hl_geometry_no = int(md_no)+position if hl_geometry_no < 0: continue gaussian_path_file_name = "{}/{:03d}_on_{:03d}_{:03d}"\ .format(folder_name, hl_geometry_no, int(md_no), sp_no) gaussian_name = "{}.com".format(gaussian_path_file_name) try: for index, no in enumerate(gaussian_hl_no_atoms_list): gaussian_no = no amber_no = amber_hl_no_atoms_list[index] #gaussian_atoms_list[amber_no].charge =\ gaussian_atoms_list[amber_no].SetVector( geometries_list[hl_geometry_no][gaussian_no].GetVector()) #geometries_list[hl_geometry_no][gaussian_no].charge sp_jobs_list.append("{:03d}_on_{:03d}_{:03d}.com"\ .format(hl_geometry_no, int(md_no), sp_no)) oniom_gaussian_example.atoms_list = gaussian_atoms_list oniom_gaussian_example.write_to_file(gaussian_name) print("Using {} and md:{}".format(charge_com_files[int(md_no)+position],md_no )) print("Saved {}".format(gaussian_name)) except IndexError: print("Cannot save {}".format(gaussian_name)) sp_script = "{}/{}".format(folder_name, SP_ONIOM_RUN_SCRIPT) with open(sp_script, 'w') as script_file: for job in sp_jobs_list: script_file.write("g09 {}\n".format(job))
def md_to_sp(): """ Creates gaussian sp inputs from the molecular dynamics""" oniom_gaussian_example = gaussian.GaussianCom(GAUSSIAN_AMBER_EXAMPLE) example_atoms_list = oniom_gaussian_example.atoms_list ## read single point charge inputs to know the geometries to create charge_com_files = [] for charge_com_file in os.listdir(GAUSSIAN_CHARGE_FOLDER): if charge_com_file.endswith(".com"): charge_com_files.append(charge_com_file) charge_com_files.sort() ## read geometries list and correct charges from log files geometries_list = [] for charge_com_file in charge_com_files: charge_com_file = "{}/{}".format(GAUSSIAN_CHARGE_FOLDER, charge_com_file) gaussian_charge_com = gaussian.GaussianCom(charge_com_file) charge_com_atoms_list = gaussian_charge_com.atoms_list ############ read mulliken new charges charge_log_name = charge_com_file.replace(".com", ".log") mulliken_charges_list = gaussian.read_mulliken_charges(charge_log_name) for no, charge in enumerate(mulliken_charges_list): if charge != 0: charge_com_atoms_list[no].charge = float(charge) ############# end of charges reading ######### geometries_list.append(charge_com_atoms_list) # read numbers of important atoms gaussian_amber_file = gaussian.GaussianCom(GAUSSIAN_AMBER_EXAMPLE) gaussian_sp_file = gaussian.GaussianCom(GAUSSIAN_CHARGE_EXAMPLE) amber_atoms_list = gaussian_amber_file.atoms_list gaussian_atoms_list = gaussian_sp_file.atoms_list amber_hl_no_atoms_list = [] gaussian_hl_no_atoms_list = [] for no, atom in enumerate(amber_atoms_list): if 'H' in atom.oniom.layer: amber_hl_no_atoms_list.append(no) for no, atom in enumerate(gaussian_atoms_list): if 'H' in atom.oniom.layer: gaussian_hl_no_atoms_list.append(no) for md_no in sorted(os.listdir(AMBER_FOLDER)): if int(md_no) in range(LOG_POINTS[0][1], LOG_POINTS[0][2] + 1, LOG_POINTS[0][3]): folder_name = "{}/{}".format(SP_ONIOM_FOLDER, md_no) amber_folder_name = "{}/{}".format(AMBER_FOLDER, md_no) os.makedirs(folder_name) mdcrd_name = "{}/{}".format(amber_folder_name, "mdp.mdcrd") sp_jobs_list = [] snapshots = amber.extract_many_from_mdcrd(mdcrd_name, MD_NO_ATOMS, 0, 1000, 1) #TODO for sp_no in range(0, 1000, 1): ####### TODO!!!!!! mdcrd_coordinates = snapshots[sp_no] gaussian_atoms_list = [] # an example file is used to read the pdb info for no, atom in enumerate(example_atoms_list): atom.SetVector(float(mdcrd_coordinates[no][0]), float(mdcrd_coordinates[no][1]), float(mdcrd_coordinates[no][2])) gaussian_atoms_list.append(atom) #### high layer geometry and charges come from the ####charge single points for position in [-1, 0, 1]: hl_geometry_no = int(md_no) + position if hl_geometry_no < 0: continue gaussian_path_file_name = "{}/{:03d}_on_{:03d}_{:03d}"\ .format(folder_name, hl_geometry_no, int(md_no), sp_no) gaussian_name = "{}.com".format(gaussian_path_file_name) try: for index, no in enumerate(gaussian_hl_no_atoms_list): gaussian_no = no amber_no = amber_hl_no_atoms_list[index] #gaussian_atoms_list[amber_no].charge =\ gaussian_atoms_list[amber_no].SetVector( geometries_list[hl_geometry_no] [gaussian_no].GetVector()) #geometries_list[hl_geometry_no][gaussian_no].charge sp_jobs_list.append("{:03d}_on_{:03d}_{:03d}.com"\ .format(hl_geometry_no, int(md_no), sp_no)) oniom_gaussian_example.atoms_list = gaussian_atoms_list oniom_gaussian_example.write_to_file(gaussian_name) print("Using {} and md:{}".format( charge_com_files[int(md_no) + position], md_no)) print("Saved {}".format(gaussian_name)) except IndexError: print("Cannot save {}".format(gaussian_name)) sp_script = "{}/{}".format(folder_name, SP_ONIOM_RUN_SCRIPT) with open(sp_script, 'w') as script_file: for job in sp_jobs_list: script_file.write("g09 {}\n".format(job))
def sp_to_md(): """ Reads gaussian charge single points and writes the md inputs with it""" #read model files model_coordinates = amber.read_crd_file(MODEL_INPCRD) model_charges = amber.read_prmtop_charges(MODEL_PRMTOP) # read single point charge inputs to know the geometries to create charge_com_files = [] for charge_com_file in os.listdir(GAUSSIAN_CHARGE_FOLDER): if charge_com_file.endswith(".com"): charge_com_files.append(charge_com_file) charge_com_files.sort() geometries_list = [] for charge_com_file in charge_com_files: charge_com_file = "{}/{}".format(GAUSSIAN_CHARGE_FOLDER, charge_com_file) gaussian_charge_com = gaussian.GaussianCom(charge_com_file) geometries_list.append(gaussian_charge_com.atoms_list) # read numbers of important atoms gaussian_amber_file = gaussian.GaussianCom(GAUSSIAN_AMBER_EXAMPLE) gaussian_sp_file = gaussian.GaussianCom(GAUSSIAN_CHARGE_EXAMPLE) amber_atoms_list = gaussian_amber_file.atoms_list gaussian_atoms_list = gaussian_sp_file.atoms_list amber_h_no_atoms_list = [] amber_l_no_atoms_list = [] amber_hl_no_atoms_list = [] gaussian_h_no_atoms_list = [] gaussian_l_no_atoms_list = [] gaussian_hl_no_atoms_list = [] amber_hl_atoms_list = [] for no, atom in enumerate(amber_atoms_list): if atom.oniom.link_atom: amber_l_no_atoms_list.append(no) amber_hl_no_atoms_list.append(no) amber_hl_atoms_list.append(atom) if 'H' in atom.oniom.layer: amber_h_no_atoms_list.append(no) amber_hl_no_atoms_list.append(no) amber_hl_atoms_list.append(atom) for no, atom in enumerate(gaussian_atoms_list): if atom.oniom.link_atom: gaussian_l_no_atoms_list.append(no) gaussian_hl_no_atoms_list.append(no) if 'H' in atom.oniom.layer: gaussian_h_no_atoms_list.append(no) gaussian_hl_no_atoms_list.append(no) restraint_mask = amber.create_restraint_mask(amber_hl_no_atoms_list) ### write coordinates for step, atoms_list in enumerate(geometries_list): folder_name = "{}/{:03d}".format(AMBER_FOLDER, step) try: os.makedirs(folder_name) except OSError: print("\n{0} folder already exists".format(folder_name)) if OVERWRITE: print("--overwrite is on. I will write over the old files\n") else: print("Exiting without writing anything.") print("Delete the folder or use --overwrite to"\ "write over the old files\n") sys.exit(0) # write coordinate file coordinates_list = [(atom.GetX(), atom.GetY(), atom.GetZ()) for atom in atoms_list] all_coordinates_list = model_coordinates[:] for index, no in enumerate(gaussian_hl_no_atoms_list): gaussian_no = no amber_no = amber_hl_no_atoms_list[index] all_coordinates_list[amber_no] = coordinates_list[gaussian_no] crd_name = "{0}/inpcrd.inpcrd".format(folder_name) amber.write_crd_file(crd_name, all_coordinates_list, box_info=True, velocities=False) #read new charges and write them to model prmtop charge_log_name = charge_com_files[step].replace(".com", ".log") charge_log_name = "{0}/{1}".format(GAUSSIAN_CHARGE_FOLDER, charge_log_name) mulliken_charges_list = gaussian.read_mulliken_charges(charge_log_name) hl_charges_list = [] for charge in mulliken_charges_list: if charge != 0: hl_charges_list.append(charge) new_charges_list = [] for atom in amber_hl_atoms_list: if 'H' in atom.oniom.layer: new_charges_list.append(hl_charges_list.pop(0)) else: new_charges_list.append(atom.mm.charge) new_charge_amber_hl_atoms_list = amber.give_resp_charges(\ amber_hl_atoms_list, new_charges_list) all_charges_list = model_charges[:] for index, no in enumerate(amber_hl_no_atoms_list): all_charges_list[no] = new_charge_amber_hl_atoms_list[index].mm.charge # write these charges to a new prmtop new_prmtop_name = "{0}/prmtop.prmtop".format(folder_name) amber.write_prmtop_charges(MODEL_PRMTOP, new_prmtop_name, all_charges_list) # read and write amber in files for amber_in_name in AMBER_INPUT_FILES: with open(amber_in_name, 'r') as model_in_file: model_file_str = model_in_file.read() new_file_str = model_file_str.replace("XXXX", restraint_mask) new_file_name = "{}/{}".format(folder_name, amber_in_name.split("/")[-1]) with open(new_file_name, 'w') as new_in_file: new_in_file.write(new_file_str)
def sp_to_md(): """ Reads gaussian charge single points and writes the md inputs with it""" #read model files model_coordinates = amber.read_crd_file(MODEL_INPCRD) model_charges = amber.read_prmtop_charges(MODEL_PRMTOP) # read single point charge inputs to know the geometries to create charge_com_files = [] for charge_com_file in os.listdir(GAUSSIAN_CHARGE_FOLDER): if charge_com_file.endswith(".com"): charge_com_files.append(charge_com_file) charge_com_files.sort() geometries_list = [] for charge_com_file in charge_com_files: charge_com_file = "{}/{}".format(GAUSSIAN_CHARGE_FOLDER, charge_com_file) gaussian_charge_com = gaussian.GaussianCom(charge_com_file) geometries_list.append(gaussian_charge_com.atoms_list) # read numbers of important atoms gaussian_amber_file = gaussian.GaussianCom(GAUSSIAN_AMBER_EXAMPLE) gaussian_sp_file = gaussian.GaussianCom(GAUSSIAN_CHARGE_EXAMPLE) amber_atoms_list = gaussian_amber_file.atoms_list gaussian_atoms_list = gaussian_sp_file.atoms_list amber_h_no_atoms_list = [] amber_l_no_atoms_list = [] amber_hl_no_atoms_list = [] gaussian_h_no_atoms_list = [] gaussian_l_no_atoms_list = [] gaussian_hl_no_atoms_list = [] amber_hl_atoms_list = [] for no, atom in enumerate(amber_atoms_list): if atom.oniom.link_atom: amber_l_no_atoms_list.append(no) amber_hl_no_atoms_list.append(no) amber_hl_atoms_list.append(atom) if 'H' in atom.oniom.layer: amber_h_no_atoms_list.append(no) amber_hl_no_atoms_list.append(no) amber_hl_atoms_list.append(atom) for no, atom in enumerate(gaussian_atoms_list): if atom.oniom.link_atom: gaussian_l_no_atoms_list.append(no) gaussian_hl_no_atoms_list.append(no) if 'H' in atom.oniom.layer: gaussian_h_no_atoms_list.append(no) gaussian_hl_no_atoms_list.append(no) restraint_mask = amber.create_restraint_mask(amber_hl_no_atoms_list) ### write coordinates for step, atoms_list in enumerate(geometries_list): folder_name = "{}/{:03d}".format(AMBER_FOLDER, step) try: os.makedirs(folder_name) except OSError: print("\n{0} folder already exists".format(folder_name)) if OVERWRITE: print("--overwrite is on. I will write over the old files\n") else: print("Exiting without writing anything.") print("Delete the folder or use --overwrite to"\ "write over the old files\n") sys.exit(0) # write coordinate file coordinates_list = [(atom.GetX(), atom.GetY(), atom.GetZ()) for atom in atoms_list] all_coordinates_list = model_coordinates[:] for index, no in enumerate(gaussian_hl_no_atoms_list): gaussian_no = no amber_no = amber_hl_no_atoms_list[index] all_coordinates_list[amber_no] = coordinates_list[gaussian_no] crd_name = "{0}/inpcrd.inpcrd".format(folder_name) amber.write_crd_file(crd_name, all_coordinates_list, box_info=True, velocities=False) #read new charges and write them to model prmtop charge_log_name = charge_com_files[step].replace(".com", ".log") charge_log_name = "{0}/{1}".format(GAUSSIAN_CHARGE_FOLDER, charge_log_name) mulliken_charges_list = gaussian.read_mulliken_charges(charge_log_name) hl_charges_list = [] for charge in mulliken_charges_list: if charge != 0: hl_charges_list.append(charge) new_charges_list = [] for atom in amber_hl_atoms_list: if 'H' in atom.oniom.layer: new_charges_list.append(hl_charges_list.pop(0)) else: new_charges_list.append(atom.mm.charge) new_charge_amber_hl_atoms_list = amber.give_resp_charges(\ amber_hl_atoms_list, new_charges_list) all_charges_list = model_charges[:] for index, no in enumerate(amber_hl_no_atoms_list): all_charges_list[no] = new_charge_amber_hl_atoms_list[ index].mm.charge # write these charges to a new prmtop new_prmtop_name = "{0}/prmtop.prmtop".format(folder_name) amber.write_prmtop_charges(MODEL_PRMTOP, new_prmtop_name, all_charges_list) # read and write amber in files for amber_in_name in AMBER_INPUT_FILES: with open(amber_in_name, 'r') as model_in_file: model_file_str = model_in_file.read() new_file_str = model_file_str.replace("XXXX", restraint_mask) new_file_name = "{}/{}".format(folder_name, amber_in_name.split("/")[-1]) with open(new_file_name, 'w') as new_in_file: new_in_file.write(new_file_str)