Пример #1
0
class DockingParameterFileMaker:
    """Accept a <ligand>.pdbq and <receptor>.pdbqs and create
    <ligand>_<receptor>.dpf
    """

    def __init__(self, verbose = None):
        self.verbose = verbose
        self.dpo = DockingParameters()


    def set_ligand(self, ligand_filename): 
        self.ligand_filename = os.path.basename(ligand_filename)
        if verbose:
            print "set ligand_filename to", self.ligand_filename
        self.dpo.set_ligand(ligand_filename)
        #expect a filename like ind.out.pdbq: get 'ind' from it
        self.ligand_stem = string.split(self.ligand_filename,'.')[0]
        if verbose: print "set ligand_stem to", self.ligand_stem
        self.ligand = Read(ligand_filename)[0]
        if self.ligand==None:
            print 'ERROR reading: ', ligand_filename
            return 
        if verbose: 
            print "read ", self.ligand.name
        #set dpo:
        #move
        self.dpo['move']['value'] = self.ligand_filename
        if verbose: print "set move to ", self.dpo['move']['value']
        #ndihe
        #assumes ligand has torTree
        self.dpo['ndihe']['value'] = self.ligand.parser.keys.count("BRANCH")
        #self.dpo['ndihe']['value'] = len(self.ligand.torTree.torsionMap)
        if verbose: print "set ndihe to ", self.dpo['ndihe']['value']
        #torsdof
        #caution dpo['torsdof']['value'] is a list [ndihe, 0.3113]
        self.dpo['torsdof']['value'][0] = self.ligand.TORSDOF
        if verbose: print "set torsdof to ", self.dpo['torsdof']['value']
        #types
        d = {}
        for a in self.ligand.allAtoms:
            d[a.autodock_element] = 1
        sortKeyList =  ['C','A','N','O','S','H','P','n','f','F','c','b','I','M']
        lig_types = ""
        for t in sortKeyList:
            if t in d.keys():
                lig_types = lig_types + t
        self.ligand.types = lig_types
        self.dpo['types']['value'] = self.ligand.types
        if verbose: print "set types to ", self.dpo['types']['value']
        #about
        self.ligand.getCenter()
        cen = self.ligand.center
        self.dpo['about']['value'] =  [round(cen[0],4), round(cen[1],4),\
                                        round(cen[2],4)]
        if verbose: print "set about to ", self.dpo['about']['value']
        

    def set_receptor(self, receptor_filename):
        self.receptor_filename = os.path.basename(receptor_filename)
        self.receptor_stem = string.split(self.receptor_filename, '.')[0]
        self.dpo.set_receptor(receptor_filename)


    #def set_docking_parameters(self, newdict={}):
    def set_docking_parameters(self, **kw):
        """Any docking paramters should be set here
        """
        # like this: 
        # newdict = {'ga_num_evals':1750000, 'ga_pop_size':150,
        #            'ga_run':20, 'rmstol':2.0}
        # self.dpo['<parameter>']['value'] = <new value>
        # eg self.dpo['rmstol']['value'] = 2.0
        for parm, newvalue in kw.items():
            #print "parm=", parm, ' newvalue=', newvalue
            self.dpo[parm]['value'] = newvalue
            if parm=='set_sw1':
                self.dpo['set_psw1']['value'] = not newvalue
            if parm=='set_psw1':
                self.dpo['set_sw1']['value'] = not newvalue


    def write_dpf(self, dpf_filename,
              parm_list = genetic_algorithm_local_search_list):
        if not dpf_filename:
            dpf_filename = "%s%s%s%s" % \
                           (self.ligand_stem, "_",
                            self.receptor_stem, ".dpf")
        # now that we have a filename...
        if self.verbose:
            print "writing ", dpf_filename
        self.dpo.write(dpf_filename, parm_list)
Пример #2
0
class LibraryDpfWriter:


    def __init__(self, dpffile, extension='pdbq', \
                    err_file="write_lib_dpf_errors",
                    prefix='', verbose=0):
        self.verbose = verbose
        if verbose: print("self.verbose = ", verbose)
        self.prefix = prefix
        self.setup(dpffile)
        self.parm_list_dict = {}
        self.parm_list_dict['GALS'] = genetic_algorithm_local_search_list
        self.parm_list_dict['GA'] = genetic_algorithm_list
        self.parm_list_dict['LS'] = local_search_list
        self.parm_list_dict['SA'] = simulated_annealing_list
        self.ligandfilenames = []
        self.extension = extension
        self.error_file = open(err_file, 'w')


    def setup(self, dpffile):
        self.dpffile = dpffile
        self.dpo = DockingParameters()
        self.dpo.read(dpffile)


    def getligands(self, extension, name=''):
        typeDict = {}
        key = name + '*.' + extension
        self.ligandfilenames = glob.glob(key)
        return self.ligandfilenames


    def write(self, dpo, style='GALS'):
        #one file per ligand
        dpffiles = []
        receptor_stem = self.dpo.receptor_stem
        parm_list = self.parm_list_dict[style]
        if not len(self.ligandfilenames):
            self.getligands(self.extension)
        #print "len(self.ligandfilenames)=", len(self.ligandfilenames)
        for ligand_file in self.ligandfilenames:
            #get the types
            typeDict = {}
            m = Read(ligand_file)[0]
            for a in m.allAtoms:
                typeDict[a.autodock_element] = 1
            type_list = list(typeDict.keys())
            #check that there is a map for each type
            ok = 1
            for t in type_list:
                mapfile = receptor_stem + '.' + t + '.map'
                try:
                    assert os.path.exists(mapfile)
                except:
                    ok = 0
                    ostr = ligand_file + " missing map " + t + "\n"
                    self.error_file.write(ostr)
                    break  #try to continue 'for' statement with next filename
            #update dpo with ligand specific values
            if not ok:
                if self.verbose:
                    print("problem with ", ligand_file)
                continue
            types = string.join(type_list,'')
            self.dpo['move']['value'] = ligand_file
            if self.verbose: print("set types to ", types)
            self.dpo['types']['value'] = types
            #CAUTION: dpo['torsdof']['value'] is [0,0.3113]
            self.dpo['torsdof']['value'][0] = m.TORSDOF
            if hasattr(m, 'ndihe'):
                ndihe = m.ndihe
            elif hasattr(m, 'torscount'):
                ndihe = m.torscount
            elif hasattr(m, 'torTree'):
                ndihe = len(m.torTree.torsionMap)
            else:
                msg = ligand_file + " is not properly formatted: no torsions!"
                raise AttributeError(msg)
            self.dpo['ndihe']['value'] = ndihe
            outputfilename = self.prefix + m.name + "_" + style + ".dpf"
            if self.verbose: print("writing ", outputfilename)
            self.dpo.write(outputfilename, parm_list)
            dpffiles.append(outputfilename)
        return dpffiles
Пример #3
0
class DockingParameterFileMaker:
    """Accept a <ligand>.pdbq and <receptor>.pdbqs and create
    <ligand>_<receptor>.dpf
    """
    def __init__(self, verbose=None):
        self.verbose = verbose
        self.dpo = DockingParameters()

    def set_ligand(self, ligand_filename):
        self.ligand_filename = os.path.basename(ligand_filename)
        if verbose:
            print "set ligand_filename to", self.ligand_filename
        self.dpo.set_ligand(ligand_filename)
        #expect a filename like ind.out.pdbq: get 'ind' from it
        self.ligand_stem = string.split(self.ligand_filename, '.')[0]
        if verbose: print "set ligand_stem to", self.ligand_stem
        self.ligand = Read(ligand_filename)[0]
        if self.ligand == None:
            print 'ERROR reading: ', ligand_filename
            return
        if verbose:
            print "read ", self.ligand.name
        #set dpo:
        #move
        self.dpo['move']['value'] = self.ligand_filename
        if verbose: print "set move to ", self.dpo['move']['value']
        #ndihe
        #assumes ligand has torTree
        self.dpo['ndihe']['value'] = self.ligand.parser.keys.count("BRANCH")
        #self.dpo['ndihe']['value'] = len(self.ligand.torTree.torsionMap)
        if verbose: print "set ndihe to ", self.dpo['ndihe']['value']
        #torsdof
        #caution dpo['torsdof']['value'] is a list [ndihe, 0.3113]
        self.dpo['torsdof']['value'][0] = self.ligand.TORSDOF
        if verbose: print "set torsdof to ", self.dpo['torsdof']['value']
        #types
        d = {}
        for a in self.ligand.allAtoms:
            d[a.autodock_element] = 1
        sortKeyList = [
            'C', 'A', 'N', 'O', 'S', 'H', 'P', 'n', 'f', 'F', 'c', 'b', 'I',
            'M'
        ]
        lig_types = ""
        for t in sortKeyList:
            if t in d.keys():
                lig_types = lig_types + t
        self.ligand.types = lig_types
        self.dpo['types']['value'] = self.ligand.types
        if verbose: print "set types to ", self.dpo['types']['value']
        #about
        self.ligand.getCenter()
        cen = self.ligand.center
        self.dpo['about']['value'] =  [round(cen[0],4), round(cen[1],4),\
                                        round(cen[2],4)]
        if verbose: print "set about to ", self.dpo['about']['value']

    def set_receptor(self, receptor_filename):
        self.receptor_filename = os.path.basename(receptor_filename)
        self.receptor_stem = string.split(self.receptor_filename, '.')[0]
        self.dpo.set_receptor(receptor_filename)

    #def set_docking_parameters(self, newdict={}):
    def set_docking_parameters(self, **kw):
        """Any docking paramters should be set here
        """
        # like this:
        # newdict = {'ga_num_evals':1750000, 'ga_pop_size':150,
        #            'ga_run':20, 'rmstol':2.0}
        # self.dpo['<parameter>']['value'] = <new value>
        # eg self.dpo['rmstol']['value'] = 2.0
        for parm, newvalue in kw.items():
            #print "parm=", parm, ' newvalue=', newvalue
            self.dpo[parm]['value'] = newvalue
            if parm == 'set_sw1':
                self.dpo['set_psw1']['value'] = not newvalue
            if parm == 'set_psw1':
                self.dpo['set_sw1']['value'] = not newvalue

    def write_dpf(self,
                  dpf_filename,
                  parm_list=genetic_algorithm_local_search_list):
        if not dpf_filename:
            dpf_filename = "%s%s%s%s" % \
                           (self.ligand_stem, "_",
                            self.receptor_stem, ".dpf")
        # now that we have a filename...
        if self.verbose:
            print "writing ", dpf_filename
        self.dpo.write(dpf_filename, parm_list)
class LibraryDpfWriter:


    def __init__(self, dpffile, extension='pdbq', \
                    err_file="write_lib_dpf_errors", 
                    prefix='', verbose=0):
        self.verbose = verbose
        if verbose: print "self.verbose = ", verbose
        self.prefix = prefix
        self.setup(dpffile)
        self.parm_list_dict = {}
        self.parm_list_dict['GALS'] = genetic_algorithm_local_search_list
        self.parm_list_dict['GA'] = genetic_algorithm_list
        self.parm_list_dict['LS'] = local_search_list
        self.parm_list_dict['SA'] = simulated_annealing_list
        self.ligandfilenames = []
        self.extension = extension
        self.error_file = open(err_file, 'w')


    def setup(self, dpffile):
        self.dpffile = dpffile
        self.dpo = DockingParameters() 
        self.dpo.read(dpffile)


    def getligands(self, extension, name=''):
        typeDict = {}
        key = name + '*.' + extension
        self.ligandfilenames = glob.glob(key)
        return self.ligandfilenames


    def write(self, dpo, style='GALS'):
        #one file per ligand
        dpffiles = []
        receptor_stem = self.dpo.receptor_stem
        parm_list = self.parm_list_dict[style]
        if not len(self.ligandfilenames):
            self.getligands(self.extension)
        #print "len(self.ligandfilenames)=", len(self.ligandfilenames)
        for ligand_file in self.ligandfilenames:
            #get the types 
            typeDict = {}
            m = Read(ligand_file)[0]
            for a in m.allAtoms:
                typeDict[a.autodock_element] = 1
            type_list = typeDict.keys()
            #check that there is a map for each type
            ok = 1
            for t in type_list:
                mapfile = receptor_stem + '.' + t + '.map'
                try:
                    assert os.path.exists(mapfile)
                except:
                    ok = 0
                    ostr = ligand_file + " missing map " + t + "\n"
                    self.error_file.write(ostr)
                    break  #try to continue 'for' statement with next filename
            #update dpo with ligand specific values
            if not ok:
                if self.verbose:
                    print "problem with ", ligand_file
                continue
            types = string.join(type_list,'')
            self.dpo['move']['value'] = ligand_file
            if self.verbose: print "set types to ", types
            self.dpo['types']['value'] = types
            #CAUTION: dpo['torsdof']['value'] is [0,0.3113]
            self.dpo['torsdof']['value'][0] = m.TORSDOF
            if hasattr(m, 'ndihe'):
                ndihe = m.ndihe
            elif hasattr(m, 'torscount'):
                ndihe = m.torscount
            elif hasattr(m, 'torTree'):
                ndihe = len(m.torTree.torsionMap)
            else:
                msg = ligand_file + " is not properly formatted: no torsions!"
                raise AttributeError, msg
            self.dpo['ndihe']['value'] = ndihe
            outputfilename = self.prefix + m.name + "_" + style + ".dpf"
            if self.verbose: print "writing ", outputfilename
            self.dpo.write(outputfilename, parm_list)
            dpffiles.append(outputfilename)
        return dpffiles