def pdb2pka_sugelm(self):
     """Explore all possible mutations and calculate a phimap for each using pdb2pka (APBS)"""
     import Protool
     P=Protool.structureIO()
     P.readpdb(self.pdbfile)
     P.RemoveALT()
     #import Protool.mutate
     #MUT=Protool.mutate.Mutate(P)
     #
     # Construct arrays
     #
     import pKD_dict
     self.data=pKD_dict.pKD_dict()
     self.atom_data=pKD_dict.pKD_dict()
     #
     # Create dir for mutant PDB files
     #
     import os
     mutdir=os.path.join(self.topdir,self.pdbfile+'.pdbs')
     if not os.path.isdir(mutdir):
         os.mkdir(mutdir)
     #
     # Loop over all residues
     #
     residues=P.residues.keys()
     residues.sort()
     for residue in residues:
         orgres=P.resname(residue)
         print 'Calculating for %s %s' %(residue,P.resname(residue))
         #
         # If neutral mutate to Asp, Glu, Lys, Arg, His
         #
         targets=[]
         for res in ['ARG','LYS','HIS','ASP','GLU']:
             if P.resname(residue)!=res:
                 targets.append(res)
         #if orgres=='GLU':
         #    targets.append('GLN')
         #elif orgres=='ASP':
         #    targets.append('ASN')
         #elif orgres=='HIS':
         #    targets.append('PHE')
         #elif orgres=='ARG' or P.resname(residue)=='LYS':
         #    targets.append('MET')
         #
         # Target identified. Now model each
         #
         for target in targets:
             import pKD_tools
             resid=pKD_tools.get_resid_from_res(residue)
             orgres=P.resname(residue)
             filename=os.path.join(mutdir,'%s:%s:%s.pdb' %(residue,orgres,target))
             mutation='%s:%s:%s' %(residue,orgres,target)
             if not os.path.isfile(filename):
                 import Design_pKa_help
                 Design_pKa_help.make_mutation(self.pdbfile,mutation)
             NP=Protool.structureIO()
             NP.readpdb(filename)
             NP.writepdb(filename,TER=None)
             #
             # Calculate the interaction energies
             #
             protein,routines,forcefield,apbs_setup,lig_titgrps = pdb2pka.pre_init(pdbfilename=filename,
                                                                                   ff='parse',
                                                                                   ligand=None,
                                                                                   verbose=1)
             mypkaRoutines = pdb2pka.pKaRoutines(protein, routines, forcefield,apbs_setup)
             #
             # Find our group
             #
             sp=residue.split(':')
             chainid=sp[0]
             resnum=int(sp[1])
             mypkaRoutines.findTitratableGroups()
             this_pKa=None
             for pKa in mypkaRoutines.pKas:
                 print pKa.residue.resSeq,resnum
                 print pKa.residue.chainID,chainid
                 print pKa.residue.name,target
                 print pKa.pKaGroup.name,target
                 print '--------------'
                 print 'ChainID',pKa.residue.chainID
                 if pKa.residue.resSeq==resnum and pKa.residue.chainID==chainid and pKa.residue.name==target and pKa.pKaGroup.name==target:
                     #print 'Found group',pKa.residue.resSeq,pKa.pKaGroup.name
                     this_pKa=pKa
                     break
             if not this_pKa:
                 raise Exception,'Could not find inserted titratable group'
             mypkaRoutines.get_interaction_energies_setup(this_pKa,mode='pKD')
             matrix=mypkaRoutines.matrix
             #
             # Dig the interaction energies out of the pdb2pka array
             #
             for titration1 in matrix[this_pKa].keys():
                 for state1 in matrix[this_pKa][titration1].keys():
                     grp_sub=matrix[this_pKa][titration1][state1]
                     if mypkaRoutines.is_charged(this_pKa,titration1,state1):
                         for pKa2 in grp_sub.keys(): 
                             import string
                             chainID2=pKa.residue.chainID
                             resid2='%s:%s' %(chainID2,string.zfill(pKa2.residue.resSeq,4))
                             for titration2 in grp_sub[pKa2].keys():
                                 for state2 in grp_sub[pKa2][titration2].keys():
                                     if mypkaRoutines.is_charged(pKa2,titration2,state2):
                                         #
                                         # Both states are charged, so now we can pull the
                                         # interaction energies out
                                         #
                                         if not self.data.has_key(mutation):
                                             self.data[mutation]={}
                                         self.data[mutation][resid2]=grp_sub[pKa2][titration2][state2]
                                         #
                                         # Get the potentials at all atoms too
                                         #
                                         all_pots=mypkaRoutines.all_potentials[this_pKa][titration1][state1]
                                         sub_all_pots=all_pots[pKa2][titration2][state2]
                                         for atom in sub_all_pots.keys():
                                             resid=mutation
                                             import pKD_tools
                                             resid2=pKD_tools.get_resid_from_res(atom)
                                             atomname=atom.split(':')[-1] #atom.name
                                             if atomname[0]=='H' or atomname in ['N','C','O']:
                                                 continue # Skip all H atoms and all non-CA backbone atoms to save memory
                                             if not self.atom_data.has_key(resid):
                                                 self.atom_data[resid]={}
                                             if not self.atom_data[resid].has_key(resid2):
                                                 self.atom_data[resid][resid2]={}
                                             self.atom_data[resid][resid2][atomname]=abs(sub_all_pots[atom])
     return self.data,self.atom_data
 def pdb2pka_sugelm(self):
     """Explore all possible mutations and calculate a phimap for each using pdb2pka (APBS)"""
     import Protool
     P = Protool.structureIO()
     P.readpdb(self.pdbfile)
     P.RemoveALT()
     #import Protool.mutate
     #MUT=Protool.mutate.Mutate(P)
     #
     # Construct arrays
     #
     import pKD_dict
     self.data = pKD_dict.pKD_dict()
     self.atom_data = pKD_dict.pKD_dict()
     #
     # Create dir for mutant PDB files
     #
     import os
     mutdir = os.path.join(self.topdir, self.pdbfile + '.pdbs')
     if not os.path.isdir(mutdir):
         os.mkdir(mutdir)
     #
     # Loop over all residues
     #
     residues = P.residues.keys()
     residues.sort()
     for residue in residues:
         orgres = P.resname(residue)
         print 'Calculating for %s %s' % (residue, P.resname(residue))
         #
         # If neutral mutate to Asp, Glu, Lys, Arg, His
         #
         targets = []
         for res in ['ARG', 'LYS', 'HIS', 'ASP', 'GLU']:
             if P.resname(residue) != res:
                 targets.append(res)
         #if orgres=='GLU':
         #    targets.append('GLN')
         #elif orgres=='ASP':
         #    targets.append('ASN')
         #elif orgres=='HIS':
         #    targets.append('PHE')
         #elif orgres=='ARG' or P.resname(residue)=='LYS':
         #    targets.append('MET')
         #
         # Target identified. Now model each
         #
         for target in targets:
             import pKD_tools
             resid = pKD_tools.get_resid_from_res(residue)
             orgres = P.resname(residue)
             filename = os.path.join(
                 mutdir, '%s:%s:%s.pdb' % (residue, orgres, target))
             mutation = '%s:%s:%s' % (residue, orgres, target)
             if not os.path.isfile(filename):
                 import Design_pKa_help
                 Design_pKa_help.make_mutation(self.pdbfile, mutation)
             NP = Protool.structureIO()
             NP.readpdb(filename)
             NP.writepdb(filename, TER=None)
             #
             # Calculate the interaction energies
             #
             protein, routines, forcefield, apbs_setup, lig_titgrps = pdb2pka.pre_init(
                 pdbfilename=filename, ff='parse', ligand=None, verbose=1)
             mypkaRoutines = pdb2pka.pKaRoutines(protein, routines,
                                                 forcefield, apbs_setup)
             #
             # Find our group
             #
             sp = residue.split(':')
             chainid = sp[0]
             resnum = int(sp[1])
             mypkaRoutines.findTitratableGroups()
             this_pKa = None
             for pKa in mypkaRoutines.pKas:
                 print pKa.residue.resSeq, resnum
                 print pKa.residue.chainID, chainid
                 print pKa.residue.name, target
                 print pKa.pKaGroup.name, target
                 print '--------------'
                 print 'ChainID', pKa.residue.chainID
                 if pKa.residue.resSeq == resnum and pKa.residue.chainID == chainid and pKa.residue.name == target and pKa.pKaGroup.name == target:
                     #print 'Found group',pKa.residue.resSeq,pKa.pKaGroup.name
                     this_pKa = pKa
                     break
             if not this_pKa:
                 raise Exception, 'Could not find inserted titratable group'
             mypkaRoutines.get_interaction_energies_setup(this_pKa,
                                                          mode='pKD')
             matrix = mypkaRoutines.matrix
             #
             # Dig the interaction energies out of the pdb2pka array
             #
             for titration1 in matrix[this_pKa].keys():
                 for state1 in matrix[this_pKa][titration1].keys():
                     grp_sub = matrix[this_pKa][titration1][state1]
                     if mypkaRoutines.is_charged(this_pKa, titration1,
                                                 state1):
                         for pKa2 in grp_sub.keys():
                             import string
                             chainID2 = pKa.residue.chainID
                             resid2 = '%s:%s' % (
                                 chainID2,
                                 string.zfill(pKa2.residue.resSeq, 4))
                             for titration2 in grp_sub[pKa2].keys():
                                 for state2 in grp_sub[pKa2][
                                         titration2].keys():
                                     if mypkaRoutines.is_charged(
                                             pKa2, titration2, state2):
                                         #
                                         # Both states are charged, so now we can pull the
                                         # interaction energies out
                                         #
                                         if not self.data.has_key(mutation):
                                             self.data[mutation] = {}
                                         self.data[mutation][
                                             resid2] = grp_sub[pKa2][
                                                 titration2][state2]
                                         #
                                         # Get the potentials at all atoms too
                                         #
                                         all_pots = mypkaRoutines.all_potentials[
                                             this_pKa][titration1][state1]
                                         sub_all_pots = all_pots[pKa2][
                                             titration2][state2]
                                         for atom in sub_all_pots.keys():
                                             resid = mutation
                                             import pKD_tools
                                             resid2 = pKD_tools.get_resid_from_res(
                                                 atom)
                                             atomname = atom.split(':')[
                                                 -1]  #atom.name
                                             if atomname[
                                                     0] == 'H' or atomname in [
                                                         'N', 'C', 'O'
                                                     ]:
                                                 continue  # Skip all H atoms and all non-CA backbone atoms to save memory
                                             if not self.atom_data.has_key(
                                                     resid):
                                                 self.atom_data[resid] = {}
                                             if not self.atom_data[
                                                     resid].has_key(resid2):
                                                 self.atom_data[resid][
                                                     resid2] = {}
                                             self.atom_data[resid][resid2][
                                                 atomname] = abs(
                                                     sub_all_pots[atom])
     return self.data, self.atom_data
 def pdb2pka_desolv_backgr(self,residue):
     """Calculate the desolvation and background interaction energy for a residue"""
     protein,routines,forcefield,apbs_setup,lig_titgrps = pdb2pka.pre_init(pdbfilename=self.pdbfile,
                                                                           ff='parse',
                                                                           ligand=None,
                                                                           verbose=1)
     mypkaRoutines = pdb2pka.pKaRoutines(protein, routines, forcefield,apbs_setup)
     #
     # Find our group
     #
     sp=residue.split(':')
     chainid=sp[0]
     #if chainid!='':
     #    raise Exception,'pKD cannot handle PDB files with ChainIDs!'
     resnum=int(sp[1])
     target=sp[2]
     mypkaRoutines.findTitratableGroups()
     this_pKa=None
     for pKa in mypkaRoutines.pKas:
         print pKa.residue
         print pKa.uniqueid
         print pKa.residue.resSeq,resnum, pKa.residue.chainID,'CID',chainid,pKa.residue.name,target,pKa.pKaGroup.name,target
         #if pKa.residue.resSeq==resnum and pKa.residue.chainID==chainid and pKa.residue.name==target and pKa.pKaGroup.name==target:
         if pKa.residue.resSeq==resnum and pKa.residue.chainID==chainid and pKa.residue.name==target and pKa.pKaGroup.name==target:
             this_pKa=pKa
             break
     if not this_pKa:
         raise Exception,'Could not find inserted titratable group'
     mypkaRoutines.calculateBackground(onlypKa=pKa)
     mypkaRoutines.calculateDesolvation(onlypKa=pKa)
     #
     # Get the intrinsic pKa
     #
     pKaGroup=pKa.pKaGroup
     Gtype=pKa.pKaGroup.type
     #
     # We measure intrinsic pKa values against a single reference state
     #
     desolv=[]
     backgr=[]
     import math
     ln10=math.log(10)
     for titration in pKaGroup.DefTitrations:
         #
         # Find an uncharged reference state
         #
         ref_state=mypkaRoutines.neutral_ref_state[pKa][titration]
         all_states=titration.allstates
         all_states.sort()
         for state in all_states:
             if mypkaRoutines.is_charged(pKa,titration,state)==1:
                 dpKa_desolv=(pKa.desolvation[state]-pKa.desolvation[ref_state])/ln10
                 dpKa_backgr=(pKa.background[state]-pKa.background[ref_state])/ln10
                 #
                 # Make acid and base modifications
                 #
                 if Gtype=='base':
                     dpKa_desolv=-dpKa_desolv
                     dpKa_backgr=-dpKa_backgr
                 #
                 # Now calculate intrinsic pKa
                 #
                 backgr.append(dpKa_backgr)
                 desolv.append(dpKa_desolv)
                 intpKa=titration.modelpKa+dpKa_desolv+dpKa_backgr
                 #print 'Energy difference for %s -> %s [reference state] is %5.2f pKa units' %(state,ref_state,intpKa)
                 pKa.intrinsic_pKa[state]=intpKa
             else:
                 #
                 # Neutral states - why do we treat them differently?
                 #
                 dpKa_desolv=(pKa.desolvation[state]-pKa.desolvation[ref_state])/ln10
                 dpKa_backgr=(pKa.background[state]-pKa.background[ref_state])/ln10
                 #
                 # Make acid and base modifications
                 #
                 if Gtype=='base':
                     dpKa_desolv=-dpKa_desolv
                     dpKa_backgr=-dpKa_backgr
                 backgr.append(dpKa_backgr)
                 desolv.append(dpKa_desolv)
                 dpKa=dpKa_desolv+dpKa_backgr
                 #print 'Energy difference for %s -> %s [reference state] is %5.2f kT' %(state,ref_state,dpKa)
                 pKa.intrinsic_pKa[state]=dpKa
     #print '-----------------'
     #
     # One value is zero, so just get the avg of the rest
     #
     des_sum=0.0
     for val in desolv:
         des_sum=des_sum+val
     des_sum=des_sum/float(len(desolv)-1)
     #
     bac_sum=0.0
     for val in backgr:
         bac_sum=bac_sum+val
     bac_sum=bac_sum/float(len(backgr)-1)
     return  {residue:des_sum},{residue:bac_sum}
 def pdb2pka_desolv_backgr(self, residue):
     """Calculate the desolvation and background interaction energy for a residue"""
     protein, routines, forcefield, apbs_setup, lig_titgrps = pdb2pka.pre_init(
         pdbfilename=self.pdbfile, ff='parse', ligand=None, verbose=1)
     mypkaRoutines = pdb2pka.pKaRoutines(protein, routines, forcefield,
                                         apbs_setup)
     #
     # Find our group
     #
     sp = residue.split(':')
     chainid = sp[0]
     #if chainid!='':
     #    raise Exception,'pKD cannot handle PDB files with ChainIDs!'
     resnum = int(sp[1])
     target = sp[2]
     mypkaRoutines.findTitratableGroups()
     this_pKa = None
     for pKa in mypkaRoutines.pKas:
         print pKa.residue
         print pKa.uniqueid
         print pKa.residue.resSeq, resnum, pKa.residue.chainID, 'CID', chainid, pKa.residue.name, target, pKa.pKaGroup.name, target
         #if pKa.residue.resSeq==resnum and pKa.residue.chainID==chainid and pKa.residue.name==target and pKa.pKaGroup.name==target:
         if pKa.residue.resSeq == resnum and pKa.residue.chainID == chainid and pKa.residue.name == target and pKa.pKaGroup.name == target:
             this_pKa = pKa
             break
     if not this_pKa:
         raise Exception, 'Could not find inserted titratable group'
     mypkaRoutines.calculateBackground(onlypKa=pKa)
     mypkaRoutines.calculateDesolvation(onlypKa=pKa)
     #
     # Get the intrinsic pKa
     #
     pKaGroup = pKa.pKaGroup
     Gtype = pKa.pKaGroup.type
     #
     # We measure intrinsic pKa values against a single reference state
     #
     desolv = []
     backgr = []
     import math
     ln10 = math.log(10)
     for titration in pKaGroup.DefTitrations:
         #
         # Find an uncharged reference state
         #
         ref_state = mypkaRoutines.neutral_ref_state[pKa][titration]
         all_states = titration.allstates
         all_states.sort()
         for state in all_states:
             if mypkaRoutines.is_charged(pKa, titration, state) == 1:
                 dpKa_desolv = (pKa.desolvation[state] -
                                pKa.desolvation[ref_state]) / ln10
                 dpKa_backgr = (pKa.background[state] -
                                pKa.background[ref_state]) / ln10
                 #
                 # Make acid and base modifications
                 #
                 if Gtype == 'base':
                     dpKa_desolv = -dpKa_desolv
                     dpKa_backgr = -dpKa_backgr
                 #
                 # Now calculate intrinsic pKa
                 #
                 backgr.append(dpKa_backgr)
                 desolv.append(dpKa_desolv)
                 intpKa = titration.modelpKa + dpKa_desolv + dpKa_backgr
                 #print 'Energy difference for %s -> %s [reference state] is %5.2f pKa units' %(state,ref_state,intpKa)
                 pKa.intrinsic_pKa[state] = intpKa
             else:
                 #
                 # Neutral states - why do we treat them differently?
                 #
                 dpKa_desolv = (pKa.desolvation[state] -
                                pKa.desolvation[ref_state]) / ln10
                 dpKa_backgr = (pKa.background[state] -
                                pKa.background[ref_state]) / ln10
                 #
                 # Make acid and base modifications
                 #
                 if Gtype == 'base':
                     dpKa_desolv = -dpKa_desolv
                     dpKa_backgr = -dpKa_backgr
                 backgr.append(dpKa_backgr)
                 desolv.append(dpKa_desolv)
                 dpKa = dpKa_desolv + dpKa_backgr
                 #print 'Energy difference for %s -> %s [reference state] is %5.2f kT' %(state,ref_state,dpKa)
                 pKa.intrinsic_pKa[state] = dpKa
     #print '-----------------'
     #
     # One value is zero, so just get the avg of the rest
     #
     des_sum = 0.0
     for val in desolv:
         des_sum = des_sum + val
     des_sum = des_sum / float(len(desolv) - 1)
     #
     bac_sum = 0.0
     for val in backgr:
         bac_sum = bac_sum + val
     bac_sum = bac_sum / float(len(backgr) - 1)
     return {residue: des_sum}, {residue: bac_sum}