예제 #1
0
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))
예제 #2
0
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))
예제 #3
0
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)
예제 #4
0
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)