示例#1
0
def main():
  dlgs = glob('*.dlg')

  if len(dlgs) == 0:
    sys.exit(1)

  if os.path.exists('target') is False:
    os.mkdir('target')

  ligands = []
  receptors = []

  for filename in dlgs:
    dlg=filename[:-4]
    (lig, rec) = dlg.split('--____--')
    if not lig in ligands:
      ligands.append(lig)
    if not rec in receptors:
      receptors.append(rec)
  
  res = [[] for i in ligands]
  for i in range(len(res)):
    res[i] = ['' for j in receptors]

  for filename in dlgs:
    dlg=filename[:-4]
    (lig, rec) = dlg.split('--____--')

    d = Docking()
    d.readDlg(filename)

    lines = d.ligMol.parser.allLines
    for i in range(len(lines)):
      line = lines[i]
      if line.find("\n") == -1:
        d.ligMol.parser.allLines[i] = line + "\n"

    if not hasattr(d, 'clusterer'):
      d.clusterer = Clusterer(d.ch.conformations, sort="binding_energy")

    clist = [d.clusterer.data[int(i)] for i in d.clusterer.argsort]

    energy = clist[0].binding_energy

    res[ligands.index(lig)][receptors.index(rec)] = "%.2f" % energy

    d.ligMol.parser.allLines = d.ligMol.parser.write_with_new_coords(clist[0].getCoords())

    write_pdb(d.ligMol.parser.parse(), 'target/%s.pdb' % dlg)

  res_file = open('target/result.txt', 'w')
  print>>res_file, ",%s" % ",".join(receptors)
  for i in range(len(res)):
    print>>res_file, "%s,%s" % (ligands[i], ",".join(res[i]))
  res_file.close()
def parse_dlg(dlgfilename, num, result):
    global VERBOSE

    d = Docking()
    d.readDlg(dlgfilename)

    if num > 1:
        workdir = outdir + '/' + d.ligMol.name
        if os.path.exists(workdir) is False:
            os.mkdir(workdir)
    if num == 1:
        workdir = outdir

    if num > 1:
        log = {'name': d.ligMol.name, 'num': num, 'target': workdir}
        if VERBOSE:
            print log
        #print>>result, log

    lines = d.ligMol.parser.allLines
    for i in range(len(lines)):
        line = lines[i]
        if line.find("\n") == -1:
            d.ligMol.parser.allLines[i] = line + "\n"

    if not hasattr(d, 'clusterer'):
        d.clusterer = Clusterer(d.ch.conformations, sort='binding_energy')

    clist = []

    for i in d.clusterer.argsort:
        clist.append(d.clusterer.data[int(i)])

    energy_list = []
    for i in range(0, num):
        conf = clist[i]
        outfile = workdir + '/' + d.ligMol.name + '_' + str(i + 1) + '.pdb'
        energy = conf.binding_energy
        energy_list.append("%.2f" % energy)

        mylog = {'name': outfile, 'energy': energy}
        if VERBOSE:
            print mylog

        d.ligMol.parser.allLines = d.ligMol.parser.write_with_new_coords(
            conf.getCoords())

        write_pdb(d.ligMol.parser.parse(), outfile)

    print >> result, "%s,%s" % (d.ligMol.name, ','.join(energy_list))
            verbose = True
            if verbose: print 'set verbose to ', True
        if o in ('-h', '--'):
            usage()
            sys.exit()

    #read all the docking logs in current directory, one by one
    dlg_list = glob.glob('./*.dlg')
    dockings = []
    #build a list of all atom types in all dlgs
    #it is assumed that all the dockings used the same grids
    ctr = 0
    at_types = {}
    for dlg in dlg_list:
        d = Docking()
        d.readDlg(dlg)
        ctr += 1
        print ctr, ": read ", dlg
        dockings.append(d)
        for a in d.ligMol.allAtoms:
            at_types[a.autodock_element] = 0
    if debug: print 'at_types=', at_types.keys()
    d = dockings[0]  #get grid info from the first docking
    xcen, ycen, zcen = d.dlo_list[0].parser.center_pt
    #for the output maps...
    # nxgrid=nygrid=nzgrid=npts  ??is this required??
    nxpts = nypts = nzpts = int(num_pts) / 2 * 2 + 1  #ensure an odd integer
    npts = (nxpts, nypts, nzpts)
    macroStem = d.dlo_list[0].macroStem
    # build list of all atom types
    all_types = at_types.keys()
            dlg_file = a
            if verbose: print 'set dlg_file to ', a
        if o in ('-t', '--t'):
            rms_tolerance = float(a)
            if verbose: print 'set rms_tolerance to ', a
        if o in ('-v', '--v'):
            verbose = True
            if verbose: print 'set verbose to ', True
        if o in ('-h', '--'):
            usage()
            sys.exit()

    dlg_list = glob.glob(dlg_file)
    d = Docking()
    for dlg in dlg_list:
        d.readDlg(dlg)
    d.clusterer.rmsTool = RMSDCalculator(d.ligMol.allAtoms.coords[:])
    d.clusterer.make_clustering(rms_tolerance)
    clustering = d.clusterer.clustering_dict[rms_tolerance]
    largest = clustering[0]
    for clust in clustering:
        if len(clust)>len(largest):
            largest = clust
    #update the coordinates with those of conf with lowest energy in this largest cluster
    d.ch.set_conformation(largest[0])
    parser = d.ligMol.parser
    lines = []
    #have to add newline character to lines read from dlg
    for l in parser.allLines:
        l+= '\n'
        lines.append(l)
 #sample line to use:
 #ZINC00057384_x1hpv/ZINC00057384_x1hpv,  20,  4, 10, -9.0900....
 #skip the header line
 if line.find('lowestEnergy') > -1:
     #lowestEnergy dlgfn     #runs #cl #LEC    LE      rmsd     largestCl_dlgfn ...
     continue
 #write line from summary_filename
 ostr = "REMARK %s" % line
 optr.write(ostr)
 #find the docking log filename
 ll = line.split()
 fn = ll[0].strip()[:-1]
 dlgFN = path_to_dockings + "/" + fn + ".dlg"
 #create a docking
 d = Docking()
 d.readDlg(dlgFN)
 #set ligand to lowest energy conformation LE
 cluD = d.clusterer.clustering_dict
 rms_tol = list(cluD.keys())[0]
 LE = cluD[rms_tol][0][0]
 d.ch.set_conformation(LE)
 #get coordinates of LE conformation
 crds = d.ligMol.allAtoms.coords[:]
 #use the parser to get newlines to output
 lines_to_print = d.ligMol.parser.write_with_new_coords(crds)
 #edit these lines, adding new line + changing the RES field to current count
 for nl in lines_to_print:
     if nl[-1] != "\n":
         nl += "\n"
     if atom_records_only:
         if nl.find("ATOM") != 0 and nl.find("HETA") != 0:
示例#6
0
    if outputfilename == 'summary_of_results':
        outputfilename = outputfilename + '_' + str(rms_tolerance)
    if build_hydrogen_bonds is True and receptor_filename is None:
        print 'to build hydrogen bonds, receptor filename must be specified'
        sys.exit()
    if report_energy_breakdown is True and receptor_filename is None:
        print 'to report energy breakdown, receptor filename must be specified'
        sys.exit()
    if not docking_logfile:
        print 'summarize_docking: docking_logfile must be specified.'
        usage()
        sys.exit()

    #read the docking log
    d = Docking()
    d.readDlg(docking_logfile)
    if receptor_filename is not None:
        receptor_filename = receptor_filename
    #setup rmsd tool
    coords = d.ligMol.allAtoms.coords[:]
    refCoords = None
    if rms_reference is not None:
        file = rms_reference
        ref = Read(file)
        if not len(ref):
            print "unable to read ", rms_reference
        else:
            ref = ref[0]
            coords = ref.allAtoms.coords
            refCoords = coords[:]
    d.clusterer.rmsTool = RMSDCalculator(coords)
                      include_best_docking_info)
        if o in ('-h', '--'):
            usage()
            sys.exit()

    if not dlgfilename:
        print('write_lowest_energy_ligand: dlgfilename must be specified.')
        usage()
        sys.exit()

    #what about nucleic acids???

    rms_tolerance = 5.0
    d = Docking()
    if not multiple:
        d.readDlg(dlgfilename)
    else:
        fl = glob.glob("*.dlg")
        for n in fl:
            d.readDlg(n)
    if verbose: print('read ', dlgfilename)
    if multiple:
        coords = d.ligMol.allAtoms.coords[:]
        d.clusterer.rmsTool = RMSDCalculator(coords)
        d.clusterer.make_clustering(rms_tolerance)
    key0 = list(d.clusterer.clustering_dict.keys())[0]
    conf0 = d.clusterer.clustering_dict[key0][0][0]
    #figure out its dlg filename
    for dlo in d.dlo_list:
        if conf0 in dlo.conformations:
            conf0_filename = dlo.parser.filename
示例#8
0
        if not directory:
            msg = 'Both reference directory and directory must be specified!\n'
    elif not directory:
        msg += 'directory must be specified!'

    if not refdirectory or not directory:
        print(msg)
        usage()
        sys.exit()

    #process docking in reference directory
    #read all the docking logs in reference directory as one Docking
    ref_dlg_list = glob.glob(refdirectory + '/*.dlg')
    ref_d = Docking()
    for dlg in ref_dlg_list:
        ref_d.readDlg(dlg)
    #setup rmsd tool
    coords = ref_d.ligMol.allAtoms.coords[:]
    ref_d.clusterer.rmsTool = RMSDCalculator(coords)
    ref_d.clusterer.make_clustering(rms_tolerance)
    clust0 = ref_d.clusterer.clustering_dict[rms_tolerance][0]
    c = clust0[0]  #lowest energy overall in reference docking
    ref_d.ch.set_conformation(c)
    ref_LE_coords = ref_d.ligMol.allAtoms.coords[:]
    ref_largest = clust0
    for clust in ref_d.clusterer.clustering_dict[rms_tolerance]:
        if verbose: print("current largest cluster len= ", len(clust))
        if len(clust) > len(ref_largest):
            if verbose: print("resetting largest clust: now len=", len(clust))
            ref_largest = clust
    ref_d.ch.set_conformation(ref_largest[0])
        if o in ('-h', '--'):
            usage()
            sys.exit()

    if not docking_filename:
        print 'write_all_complexes: docking_filename must be specified.'
        usage()
        sys.exit()

    if not receptor_filename:
        print 'write_all_complexes: receptor_filename must be specified.'
        usage()
        sys.exit()

    d = Docking()
    d.readDlg(docking_filename)
    receptor_stem = os.path.splitext(os.path.basename(receptor_filename))[0]
    print "receptor_stem =", receptor_stem

    rptr = open(receptor_filename)
    receptor_lines = rptr.readlines()
    rptr.close()

    if write_best_only:
        if not hasattr(d, 'clusterer'):
            print docking_filename, ' has no clustering... unable to write complex of best result'
            sys.exit()
        rms = d.clusterer.clustering_dict.keys()[0]
        confs = [d.clusterer.clustering_dict[rms][0][0]]
    else:
        confs = d.ch.conformations
            usage()
            sys.exit()

    if not docking_filename:
        print 'write_all_complexes: docking_filename must be specified.'
        usage()
        sys.exit()

    if not receptor_filename:
        print 'write_all_complexes: receptor_filename must be specified.'
        usage()
        sys.exit()


    d = Docking()
    d.readDlg(docking_filename)
    receptor_stem = os.path.splitext(os.path.basename(receptor_filename))[0]
    print "receptor_stem =", receptor_stem

    rptr = open(receptor_filename)
    receptor_lines = rptr.readlines()
    rptr.close()
    
    if write_best_only:
        if not hasattr(d, 'clusterer'):
            print docking_filename, ' has no clustering... unable to write complex of best result'
            sys.exit()
        rms = d.clusterer.clustering_dict.keys()[0]
        confs = [d.clusterer.clustering_dict[rms][0][0]]
    else:
        confs = d.ch.conformations
    if not  refdirectory:
        print 'compute_rms_between_methods: refdirectory must be specified.'
        usage()
        sys.exit()

    if not  directory:
        print 'compute_rms_between_methods: directory must be specified.'
        usage()
        sys.exit()

    #process docking in reference directory
    #read all the docking logs in reference directory as one Docking
    ref_dlg_list = glob.glob(refdirectory + '/*.dlg')
    ref_d = Docking()
    for dlg in ref_dlg_list:
        ref_d.readDlg(dlg)
    #setup rmsd tool
    coords = ref_d.ligMol.allAtoms.coords[:]
    ref_d.clusterer.rmsTool = RMSDCalculator(coords)
    ref_d.clusterer.make_clustering(rms_tolerance) 
    clust0 = ref_d.clusterer.clustering_dict[rms_tolerance][0]
    c = clust0[0] #lowest energy overall in reference docking
    ref_d.ch.set_conformation(c)
    ref_LE_coords = ref_d.ligMol.allAtoms.coords[:]
    ref_largest = clust0
    for clust in ref_d.clusterer.clustering_dict[rms_tolerance]:
        if verbose: print "current largest cluster len= ", len(clust)
        if len(clust)>len(ref_largest): 
            if verbose: print "resetting largest clust: now len=", len(clust)
            ref_largest = clust
    ref_d.ch.set_conformation(ref_largest[0])
    if outputfilename=='summary_of_results':
        outputfilename = outputfilename + '_' + str(rms_tolerance)
    if build_hydrogen_bonds is True and receptor_filename is None:
        print 'to build hydrogen bonds, receptor filename must be specified'
        sys.exit()
    if report_energy_breakdown is True and receptor_filename is None:
        print 'to report energy breakdown, receptor filename must be specified'
        sys.exit()
    if not docking_logfile:
        print 'summarize_docking: docking_logfile must be specified.'
        usage()
        sys.exit()

    #read the docking log
    d = Docking()
    d.readDlg(docking_logfile)
    if receptor_filename is not None:
        receptor_filename = receptor_filename
    #setup rmsd tool
    coords = d.ligMol.allAtoms.coords[:]
    refCoords = None
    if rms_reference is not None:
        file = rms_reference
        ref = Read(file)
        if not len(ref): 
            print "unable to read ", rms_reference
        else:
            ref = ref[0]
            coords = ref.allAtoms.coords
            refCoords = coords[:]
    d.clusterer.rmsTool = RMSDCalculator(coords)
            outputfilename = a
            if verbose: print 'set outputfilename to ', a
        if o in ('-h', '--'):
            usage()
            sys.exit()


    if not  dlgfilename:
        print 'write_lowest_energy_ligand: dlgfilename must be specified.'
        usage()
        sys.exit()

    #what about nucleic acids???

    d = Docking()
    d.readDlg(dlgfilename)

    if verbose: print 'read ', dlgfilename
    key0 = d.clusterer.clustering_dict.keys()[0]
    conf0 = d.clusterer.clustering_dict[key0][0][0]
    d.ch.set_conformation(conf0)
    parser = d.ligMol.parser
    lines = []
    #have to add newline character to lines read from dlg
    for l in parser.allLines:
        l+= '\n'
        lines.append(l)
    parser.allLines = lines
    coords = d.ligMol.allAtoms.coords
    if outputfilename is None:
        outputfilename = d.ligMol.name  + '_BE.pdbqt'
示例#14
0
        usage()
        sys.exit()

    if not dlg_filename:
        print(
            'compute_interatomic_distance_per_pose: autodock dlg filename must be specified: eg: "ind.dlg"'
        )
        usage()
        sys.exit()

    if outputfilename is None:
        outputfilename = "rec_dockedLIG_" + dlg_filename + "_dists.txt"

    #process docking in reference directory
    d = Docking()
    d.readDlg(dlg_filename)
    lig = d.ligMol
    #determine the receptor molecule to read in
    rec_file = ratom_name.split(":")[0] + ".pdbqt"
    msg = rec_file + " not found"
    assert os.path.exists(rec_file), msg
    recs = Read(rec_file)
    rec = recs[0]
    # locate the receptor atom
    css = CompoundStringSelector()
    rec_ats = css.select(recs, ratom_name)[0]
    msg = ratom_name + " did not match exactly 1 atom in " + rec_file
    assert len(rec_ats) == 1, msg
    rec_at = rec_ats[0]
    rec_at_coords = rec_at.coords
    if verbose:
 #sample line to use:
 #ZINC00057384_x1hpv/ZINC00057384_x1hpv,  20,  4, 10, -9.0900....
 #skip the header line
 if line.find('lowestEnergy')>-1: 
     #lowestEnergy dlgfn     #runs #cl #LEC    LE      rmsd     largestCl_dlgfn ...
     continue
 #write line from summary_filename
 ostr = "REMARK %s"%line
 optr.write(ostr)
 #find the docking log filename
 ll = line.split()
 fn = ll[0].strip()[:-1]
 dlgFN = path_to_dockings + "/" + fn +".dlg"
 #create a docking
 d = Docking()
 d.readDlg(dlgFN)
 #set ligand to lowest energy conformation LE
 cluD = d.clusterer.clustering_dict
 rms_tol = cluD.keys()[0]
 LE = cluD[rms_tol][0][0]
 d.ch.set_conformation(LE)
 #get coordinates of LE conformation
 crds = d.ligMol.allAtoms.coords[:]
 #use the parser to get newlines to output
 lines_to_print = d.ligMol.parser.write_with_new_coords(crds)
 #edit these lines, adding new line + changing the RES field to current count
 for nl in lines_to_print: 
     if nl[-1]!="\n":
         nl += "\n"
     if atom_records_only:
         if nl.find("ATOM")!=0 and nl.find("HETA")!=0: