Пример #1
0
def main():
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], 'f:d:')
    except getopt.GetoptError as err:
        sys.stderr.write(str(err) + '\n')

    if len(args) < 1:
        usage()
        print('Missing:')
        print('  gaussian_input.com')
        sys.exit(2)
    elif len(args) > 1:
        usage()
        print('Hey! Too many args:')
        print('  %s' % (', '.join(args)))

    gaussian_com_filename = args[0]
    new_folder_name = 'residel'
    freeze_angs = 15

    for o, a in opts:
        if o == '-f':   freeze_angs = float(a)
        if o == '-d':   new_folder_name = a

    if not os.path.exists("./{}".format(new_folder_name)):
        os.makedirs(new_folder_name)

    # input
    gaussian_file = GaussianCom(gaussian_com_filename)
    resID_dict = build_resID_dict(gaussian_file.atoms_list)

    # get xyz tuples
    highlayer_xyz = []
    all_xyz = []
    non_wat_xyz = []
    for i,atom in enumerate(gaussian_file.atoms_list):
        if atom.oniom.layer == 'H':
            highlayer_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))
        if not atom.resinfo.resname == 'WAT' or atom.oniom.layer == 'H':
            non_wat_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))
        all_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))

    if not len(highlayer_xyz):
        print('WELL WELL...')
        print('     no highlayer defined, freezing nothing')
    else:
    # indexes to freeze
        CUTOFF = freeze_angs + 1.0
        freeze_idx = [False for _ in all_xyz]
        for (i,xyz) in enumerate(all_xyz):
            atom = gaussian_file.atoms_list[i]
            tofreeze = min_dist( [xyz] , highlayer_xyz, CUTOFF) <= freeze_angs
            freeze_idx[i] = tofreeze
            if atom.resinfo.resname == 'WAT' or atom.oniom.layer == 'H':
                freeze_idx[i] = False

        # byres
        freeze_idx = byres(resID_dict, freeze_idx)

    # residue selection
    res_2_go = list(set(get_resID(gaussian_file.atoms_list[i]) for i in np.where(freeze_idx)[0])) 

    atoms_list = gaussian_file.atoms_list
    residues_list = Molecule("protein", atoms_list).make_residues_list()
    
    input_list = []
    for no, residue in enumerate(residues_list):
        if get_resID(residue[0]) not in res_2_go:
            continue

        residue_number_name = "{0.resinfo.resnum}_{0.resinfo.resname}".format(residue[0])
        
        print(residue_number_name)
        incomplete_residues_list = Molecule("protein", atoms_list).make_residues_list()
        incomplete_residues_list.remove(residue)
        new_atoms_list = []
        for res in incomplete_residues_list:
            new_atoms_list.extend(res)
        gaussian_file.atoms_list = new_atoms_list
        gaussian_file.redo_connectivity_list()
        no_electrons = 0
        # correct link atom number and count total number of electrons
        for i, atom in enumerate(new_atoms_list):
            no_electrons += atom.GetAtomicNum()
            if atom.oniom.link_bound_to:
                if int(atom.oniom.link_bound_to) > atoms_list.index(residue[0]):
                    atom.oniom.link_bound_to = str(int(atom.oniom.link_bound_to) - len(residue))
        #correct charge and multiplicity
        new_protein = Molecule("new_protein", new_atoms_list)
        charge = sum([res.get_charge() for res in incomplete_residues_list])
        no_electrons -= round(charge)
        multiplicity = int(gaussian_file.multiplicity_line.split()[1])
        if (no_electrons%2==0 and multiplicity-1%2!=0) or (no_electrons%2==1 and multiplicity-1%2!=1):
            print("Number of electrons and multiplicity are not compatible. Charge increased arbitrarily by one")
            charge += 1
        gaussian_file.multiplicity_line = "{0} {1}\n".format(int(round(charge))," ".join(gaussian_file.multiplicity_line.split()[1:]))
        gaussian_name  = "{0}_{1}.com".format(gaussian_com_filename[:-4],residue_number_name)
        
        gaussian_file.write_to_file("{0}/{1}".format(new_folder_name, gaussian_name))
        input_list.append(gaussian_name)
    
    script_file_name = "{0}/{1}".format(new_folder_name,"run.sh")
    with open(script_file_name, 'w') as run_script:
        for job in input_list:
            out_name = job[:-4]+".log"
            run_script.write("g09 {0} {1}\n".format(job,out_name))
Пример #2
0
def main():

    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], 'f:o:m:wd:', ['keep='])
    except getopt.GetoptError as err:
        sys.stderr.write(err + '\n')
        usage()
        sys.exit(2)

    if len(args) < 1:
        usage()
        print('missing:')
        print('  gaussian_input.com')
        sys.exit(2)
    elif len(args) > 1:
        usage()
        print('too many args:')
        print('  %s' % (','.join(args)))

    filein = args[0]
    basename, input_extension = splitext(filein)
    if input_extension != '.com':
        print('WARNING:')
        print('  inputname suffix is: %s' % input_extension)

    # defaults
    outputname = basename + '.frost.com'
    freeze_angs = False
    freeze_mm_wat = False
    del_wat_angs = False
    keep_N_wat = False
    MASK = -1

    # provided input
    for o, a in opts:
        if o == '-f': freeze_angs = float(a)
        elif o == '-o': outputname = a
        elif o == '-w': freeze_mm_wat = True
        elif o == '-m': MASK = int(a)
        elif o == '-d': del_wat_angs = float(a)
        elif o == '--keep': keep_N_wat = int(a)

    # input
    gaucom = GAUCOM(filein)
    resID_dict = build_resID_dict(gaucom.atoms_list)

    # get xyz tuples
    highlayer_xyz = []
    all_xyz = []
    non_wat_xyz = []
    for i, atom in enumerate(gaucom.atoms_list):
        if atom.oniom.layer == 'H':
            highlayer_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))
        if not atom.resinfo.resname == 'WAT' or atom.oniom.layer == 'H':
            non_wat_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))
        all_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))

    if not len(highlayer_xyz) and freeze_angs:
        print('WELL WELL...')
        print('     no highlayer defined, freezing nothing')
        sys.exit()
    elif freeze_angs == False:
        freeze_idx = [False for _ in all_xyz]
        if freeze_mm_wat:
            for (i, xyz) in enumerate(all_xyz):
                atom = gaucom.atoms_list[i]
                freeze_idx[i] = (atom.oniom.layer == 'L'
                                 and atom.resinfo.resname == 'WAT')
    else:
        # indexes to freeze
        CUTOFF = freeze_angs + 1.0
        freeze_idx = [False for _ in all_xyz]
        for (i, xyz) in enumerate(all_xyz):
            atom = gaucom.atoms_list[i]
            tofreeze = min_dist([xyz], highlayer_xyz, CUTOFF) >= freeze_angs
            tofreeze = tofreeze or (freeze_mm_wat and atom.oniom.layer == 'L'
                                    and atom.resinfo.resname == 'WAT')
            freeze_idx[i] = tofreeze

    # byres
    freeze_idx = byres(resID_dict, freeze_idx)

    # freeze now
    for (i, at) in enumerate(gaucom.atoms_list):
        if freeze_idx[i]:
            at.oniom.mask = MASK

    # delete waters?
    del_idx = [False for _ in all_xyz]
    if del_wat_angs:
        CUTOFF = del_wat_angs + 1.0
        for (i, xyz) in enumerate(all_xyz):
            atom = gaucom.atoms_list[i]
            del_idx[i] = (
                (min_dist([xyz], highlayer_xyz, CUTOFF) <= del_wat_angs)
                and (atom.resinfo.resname == 'WAT')
                and (atom.oniom.layer == 'L'))
        del_idx = byresTrue(resID_dict, del_idx)

    if keep_N_wat:
        dists = []
        for resID in resID_dict:
            if resID[0] == 'WAT':
                waters = [gaucom.atoms_list[i] for i in resID_dict[resID]]
                if 'H' not in [a.oniom.layer for a in waters]:
                    xyz = [(atom.GetX(), atom.GetY(), atom.GetZ())
                           for a in waters]
                    dists.append((resID, min_dist(xyz, non_wat_xyz)))
            if (i + 1) % 1001 == 0:
                print(i)
        dists.sort(key=lambda x: x[1])

        # update del_idx
        for (resID, dist) in dists[keep_N_wat:]:
            for i in resID_dict[resID]:
                del_idx[i] = True

    if keep_N_wat or del_wat_angs:

        del_idx = byres(resID_dict, del_idx)
        print('Deleted atoms: %d' % (del_idx.count(True)))

        # delete atoms
        new_atoms_list = []
        deleted = []
        for (i, atom) in enumerate(gaucom.atoms_list):
            if not del_idx[i]:
                new_atoms_list.append(atom)
            else:
                atom.set_pdbinfo(atoms.PDBinfo('ATOM', i))
                atom.pdbinfo.altloc = atom.oniom.layer
                deleted.append(atom)

        # write pdb with deleted atoms
        write_pdb('%s.delwat.pdb' % (outputname), deleted)

        # update atoms list
        gaucom.atoms_list = new_atoms_list
        gaucom.redo_connectivity_list()  # works for TS structures?

    # print pdb copy of model by mask
    topdb_dict = {}
    for (i, atom) in enumerate(gaucom.atoms_list):
        mask = atom.oniom.mask
        atom.set_pdbinfo(atoms.PDBinfo('ATOM', i))
        atom.pdbinfo.altloc = atom.oniom.layer
        if mask not in topdb_dict:
            topdb_dict[mask] = []
        topdb_dict[mask].append(atom)

    for mask in topdb_dict:
        write_pdb('%s.%d.pdb' % (outputname, mask), topdb_dict[mask])

    # write output
    gaucom.write_to_file(outputname)

    return 0
def main():
    
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], 'f:o:m:wd:', ['keep='])
    except getopt.GetoptError as err:
        sys.stderr.write(err + '\n')
        usage()
        sys.exit(2)
    
    if len(args) < 1:
        usage()
        print('missing:')
        print('  gaussian_input.com')
        sys.exit(2)
    elif len(args) > 1:
        usage()
        print('too many args:')
        print('  %s' % (','.join(args)))
    
    filein = args[0]
    basename, input_extension = splitext(filein)
    if input_extension != '.com':
        print('WARNING:')
        print('  inputname suffix is: %s' % input_extension)
    
    # defaults
    outputname = basename + '.frost.com'
    freeze_angs = False
    freeze_mm_wat = False
    del_wat_angs = False
    keep_N_wat = False
    MASK = -1
    
    # provided input
    for o, a in opts:
        if o == '-f':   freeze_angs = float(a)
        elif o == '-o': outputname = a 
        elif o == '-w': freeze_mm_wat = True
        elif o == '-m': MASK = int(a)
        elif o == '-d': del_wat_angs = float(a)
        elif o == '--keep': keep_N_wat = int(a)
    
    # input
    gaucom = GAUCOM(filein)
    resID_dict = build_resID_dict(gaucom.atoms_list)


    # get xyz tuples
    highlayer_xyz = []
    all_xyz = []
    non_wat_xyz = []
    for i,atom in enumerate(gaucom.atoms_list):
        if atom.oniom.layer == 'H':
            highlayer_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))
        if not atom.resinfo.resname == 'WAT' or atom.oniom.layer == 'H':
            non_wat_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))
        all_xyz.append((atom.GetX(), atom.GetY(), atom.GetZ()))

    if not len(highlayer_xyz) and freeze_angs:
        print('WELL WELL...')
        print('     no highlayer defined, freezing nothing')
        sys.exit()
    elif freeze_angs == False:
        freeze_idx = [False for _ in all_xyz]        
        if freeze_mm_wat:
            for (i,xyz) in enumerate(all_xyz):
                atom = gaucom.atoms_list[i]
                freeze_idx[i] = (atom.oniom.layer=='L' and
                    atom.resinfo.resname=='WAT')
    else:
        # indexes to freeze
        CUTOFF = freeze_angs + 1.0
        freeze_idx = [False for _ in all_xyz]
        for (i,xyz) in enumerate(all_xyz):
            atom = gaucom.atoms_list[i]
            tofreeze = min_dist( [xyz] , highlayer_xyz, CUTOFF) >= freeze_angs
            tofreeze = tofreeze or (freeze_mm_wat and 
                atom.oniom.layer=='L' and atom.resinfo.resname=='WAT')
            freeze_idx[i] = tofreeze


    # byres
    freeze_idx = byres(resID_dict, freeze_idx)

    # freeze now
    for (i, at) in enumerate(gaucom.atoms_list):
        if freeze_idx[i]:
            at.oniom.mask = MASK


    # delete waters?
    del_idx = [False for _ in all_xyz]
    if del_wat_angs:
        CUTOFF = del_wat_angs + 1.0
        for (i,xyz) in enumerate(all_xyz):
            atom = gaucom.atoms_list[i]
            del_idx[i] = (
                (min_dist([xyz], highlayer_xyz, CUTOFF) <= del_wat_angs) and
                (atom.resinfo.resname == 'WAT') and
                (atom.oniom.layer == 'L')
                         )
        del_idx = byresTrue(resID_dict, del_idx)

    if keep_N_wat:
        dists = []
        for resID in resID_dict:
            if resID[0] == 'WAT':
                waters = [gaucom.atoms_list[i] for i in resID_dict[resID]]
                if 'H' not in [a.oniom.layer for a in waters]:
                    xyz = [(atom.GetX(), atom.GetY(), atom.GetZ()) for a in waters]
                    dists.append((resID, min_dist(xyz, non_wat_xyz)))
            if (i+1)%1001 == 0:
                print(i)
        dists.sort(key=lambda x: x[1])

        # update del_idx
        for (resID, dist) in dists[keep_N_wat:]:
            for i in resID_dict[resID]:
                del_idx[i] = True
        

    if keep_N_wat or del_wat_angs:

        del_idx = byres(resID_dict, del_idx)
        print('Deleted atoms: %d' % (del_idx.count(True)))

        # delete atoms
        new_atoms_list = []
        deleted = []
        for (i,atom) in enumerate(gaucom.atoms_list):
            if not del_idx[i]:
                new_atoms_list.append(atom)
            else:
                atom.set_pdbinfo(atoms.PDBinfo('ATOM', i))
                atom.pdbinfo.altloc = atom.oniom.layer
                deleted.append(atom)

        # write pdb with deleted atoms
        write_pdb('%s.delwat.pdb' % (outputname), deleted)
        

        # update atoms list
        gaucom.atoms_list = new_atoms_list
        gaucom.redo_connectivity_list() # works for TS structures?
        
    # print pdb copy of model by mask
    topdb_dict = {}
    for (i,atom) in enumerate(gaucom.atoms_list):
        mask = atom.oniom.mask
        atom.set_pdbinfo(atoms.PDBinfo('ATOM', i))
        atom.pdbinfo.altloc = atom.oniom.layer
        if mask not in topdb_dict:
            topdb_dict[mask] = []
        topdb_dict[mask].append(atom)

    for mask in topdb_dict:
        write_pdb('%s.%d.pdb' % (outputname, mask), topdb_dict[mask])

    # write output
    gaucom.write_to_file(outputname)

    return 0