Icon representing a recipe

Recipe: QuakeR v5.5 with mutate for binders

created by ZeroLeak7

Profile


Name
QuakeR v5.5 with mutate for binders
ID
104206
Shared with
Public
Parent
None
Children
None
Created on
December 11, 2020 at 17:13 PM UTC
Updated on
December 11, 2020 at 17:13 PM UTC
Description

Quaker v5.0 now with mutate + better shake and wiggle ci in Fuze + GUI

Best for


Code


--QuakeR - a randomized Quake recipeTitle='QuakeR v5.5wmfb ' --[[ Based on "Quake" by Grom v2.51 -- update 2011-01-15 rav3n_pl v3.0 -- update 2011-04-18 rav3n_pl v4.0 -- updated 27 Dec 2014 GaryForbis v4.5 -- updated 2019-12-30 ZeroLeak7 v5.0 -- updated 2019-12-31 -converted to script v2 -band hydrophobes to beta carbon -clean up on early exit -better shake and wiggle ci in Fuze and with mutate now -updated with a gui ]] -- Globals loop_starts = {} loop_ends = {} n_loops = 0 n_residues = 0 function Lockedresidues () selection.SelectAll() structure.SetSecondaryStructureSelected("H") for i=1, structure.GetCount() do if structure.GetAminoAcid(i) == "unk" then structure.SetSecondaryStructure(i, "H") end if structure.IsLocked(i) == false then structure.SetSecondaryStructure(i, "L") end end end function GetLoops () within_loop = false for i = 1, n_residues do if ( structure.GetSecondaryStructure ( i ) == "L" and structure.IsLocked(i) == false ) then if ( within_loop == false ) then -- start of a new loop within_loop = true n_loops = n_loops + 1 loop_starts [ n_loops ] = i end elseif ( within_loop == true ) then -- end of a loop within_loop = false loop_ends [ n_loops ] = i -1 end end -- for i if ( within_loop == true ) then loop_ends [ n_loops ] = n_residues end end function floor3(x)--cut at 3rd decimal place return tostring(x-x%0.001) end function Score() local s=0 if normal==true then s=current.GetEnergyScore() else for i=1,segCnt do s=s+current.GetSegmentEnergyScore(i) end end return s end function ScoreRB() local s=0 if normal==true then s=recentbest.GetEnergyScore() else for i=1,segCnt do s=s+recentbest.GetSegmentEnergyScore(i) end end return s end function SaveBest() local g=Score()-bestScore if g>0 then print("Gained another "..floor3(g).." points.") bestScore=Score() save.Quicksave(4) -- under normal conditions retain pose even as recording improvement recentbest.Restore() save.Quicksave(3) save.Quickload(4) end return Score()-bestScore end function Wiggle(how, iters, minppi) --score conditioned recursive wiggle/shake if how==nil then how="wa" end if iters==nil then iters=6 end if minppi==nil then minppi=0.1 end if iters>0 then iters=iters-1 local sp=Score() if how == "s" then structure.ShakeSidechainsAll(1) elseif how == "wb" then structure.WiggleAll(2,true,false) elseif how == "ws" then structure.WiggleAll(2,false,true) elseif how == "wa" then structure.WiggleAll(2,true,true) end if Score()-sp > minppi then return Wiggle(how, iters, minppi) end end end function qStab() behavior.SetClashImportance(0.21) structure.MutateSidechainsSelected(1) Wiggle("s",1) if fastQstab==false then behavior.SetClashImportance(0.4) Wiggle("wa",1) behavior.SetClashImportance(1) Wiggle("s",1) end behavior.SetClashImportance(1) Wiggle() return SaveBest() end function Fuze1(ci1,ci2) behavior.SetClashImportance(ci1) Wiggle("s",1) behavior.SetClashImportance(ci2) Wiggle("wa",1) end function Fuze2(ci1,ci2) behavior.SetClashImportance(ci1) Wiggle("wa",1) behavior.SetClashImportance(1) Wiggle("wa",1) behavior.SetClashImportance(ci2) Wiggle("wa",1) end function FuzeEnd() behavior.SetClashImportance(1) Wiggle("wa",1) Wiggle("s",1) behavior.SetClashImportance(0.9) structure.MutateSidechainsSelected(1) Wiggle() behavior.SetClashImportance(1) Wiggle("wa",1) SaveBest() end function reFuze(scr) local s=ScoreRB() if s<scr then recentbest.Restore() else scr=s end return scr end function Fuze() local scr=Score() Fuze1(1,0.6) FuzeEnd() scr=reFuze(scr) Fuze2(1,1) SaveBest() scr=reFuze(scr) Fuze1(1,0.9) SaveBest() scr=reFuze(scr) Fuze2(1,1) FuzeEnd() scr=reFuze(scr) Fuze1(1,1) SaveBest() reFuze(scr) end function bandstr(str) --set all band strength for i=1, band.GetCount() do band.SetStrength(i, str) end end function calcBandAtom() bandAtom={} for x = 1,segCnt do if (structure.GetAminoAcid(x) == 'g') or not structure.IsHydrophobic(x) then bandAtom[x] = 2 -- center for Glycine and Hydophiles elseif x == segCnt then bandAtom[x] = 6 -- beta carbon for terminal segment else bandAtom[x] = 5 -- beta carbon end end end function QuakeR(ix,iy,ql,rev) math.randomseed(os.time()) math.random() math.random() math.random() calcBandAtom() --freeze.UnfreezeAll() selection.SelectAll() StartingScore=Score() bestScore=StartingScore recentbest.Save() save.Quicksave(3) print("Starting "..recipeTitle..tostring(ql).." passes.") print("Start score: "..floor3(StartingScore)) for x=1, ql do print("Pass "..tostring(x).." of "..tostring(ql)) local step=math.floor(math.random((iy-ix)/10,((iy-ix)/10)+10)) band.DeleteAll() print("Bands from segment "..tostring(ix).." of length "..tostring(step) .." every "..tostring(step).." segments.") print("Pulling..") if(rev==true) then for x=ix,iy, step do for y=ix, iy, step do band.AddBetweenSegments(x,y) end end else for x=ix,iy, step do for y=ix+step, iy, step do band.AddBetweenSegments(x,y) end end end behavior.SetClashImportance(pullingCI) recentbest.Save() local gain for str=minBS,maxBS,0.07 do--search enough band strength to move bandstr(str) repeat structure.WiggleAll(1,true,false) gain=SaveBest() if gain > 0 then recentbest.Restore() end until gain<=0 break end band.DeleteAll() behavior.SetClashImportance(1) recentbest.Save() --after pulling print("Stabilizing...") if qStab() > doFuze then print("Fuzing....") Fuze() end SaveBest() save.Quickload(3) --load best state print("Current score: "..floor3(Score()).." Total gain: "..floor3(Score()-StartingScore)) end print("Total QuakeR gain: "..floor3(Score()-StartingScore)) return true end function GetParameters () local dlog = dialog.CreateDialog ( "QuakeR v5 with mutate for binders" ) dlog.iterations = dialog.AddSlider ( "normal iter: " , qLoops , 1 , 1000 , 0 ) dlog.iterationsr = dialog.AddSlider ( "reverse iter: " , qLoops2 , 1 , 1000 , 0 ) dlog.ok = dialog.AddButton ( "OK" , 1 ) dlog.cancel = dialog.AddButton ( "Cancel" , 0 ) if ( dialog.Show ( dlog ) > 0 ) then qLoops = dlog.iterations.value qLoops2 = dlog.iterationsr.value return true else return false end end function main () if ( GetParameters () == false ) then return -- graceful exit end n_residues = structure.GetCount () behavior.SetClashImportance ( 1 ) print("wait! initializing...") Lockedresidues () GetLoops () n_loops = #loop_starts print ( n_loops .. " loops" ) n_loops = #loop_starts for i = 1 , n_loops do print ( "Loop " .. i .. " : (" .. loop_starts [ i ] .. "-" .. loop_ends [ i ] .. ")" ) end local idx_starts = loop_starts[ 1 ] local idx_ends = loop_ends[ 1 ] QuakeR(idx_starts, idx_ends, qLoops,false) print("reverse QuakeR starts:") QuakeR(idx_ends, idx_starts, qLoops2,true) cleanUp() end function CleanUp(err) if err:find('Cancelled')~=nil then print "QuakeR Cancelled" else print(err) end behavior.SetClashImportance(1) -- band.DeleteAll() SaveBest() save.Quickload(3) print("Total QuakeR gain: "..floor3(bestScore-StartingScore)) end segCnt=structure.GetCount() while structure.GetSecondaryStructure(segCnt)=="M" do segCnt=segCnt-1 end --- VVVVVVVVVV OPTIONS normal=(current.GetExplorationMultiplier()==0) qLoops=5 qLoops2=5 -- <<<OVER THERE! do more! much more! minBS=0.3 --starting minimum bands strength maxBS=1.0 --maximum band strength pullingCI=1.0 --clash importance while pulling fastQstab=false --true for 1s1w as stabilize (faster) doFuze=-10 --run fuze when score after qstabilize is close to best. xpcall(main,CleanUp)

Comments