Icon representing a recipe

Recipe: Fibonacci Wiggle V3.1

created by TurtleByte

Profile


Name
Fibonacci Wiggle V3.1
ID
104732
Shared with
Public
Parent
Fibonacci Wiggle V3
Children
None
Created on
April 11, 2021 at 04:55 AM UTC
Updated on
April 11, 2021 at 04:55 AM UTC
Description

Local wiggle sections of either increasing or decreasing size.
Originally by Crashguard303. Translated to LuaV2 by joshmiller using LociOiling's MacroScanner.

Best for


Code


-------------------------------------------------------------------------------- -- Fibonacci Wiggle -- -- Local wiggles segemnts of either increasing or decreasing size using -- fibonacci numbers -- -- V0 Originally by Crashguard303. -- V1 Translated to LuaV2 by joshmiller using LociOiling's MacroScanner. -- V2 Modification and simplification by PieThrower. -- V3 Generated fib numbers based on size of protein, added versioning - TurtleByte -- V3.1 -- Fixed bug where 1 was not in list of fib numbers -- Fixed bug that allowed fib number generation to go past protein length -- Added loop to repeat until gain < minGain, minGain set by user -- Freeze segments re-enabled, controlled via dialog option -- Localized and renamed Foldit functions -- TurtleByte 4/10/2021 -------------------------------------------------------------------------------- --[[ TODO - figure out what freezing was supposed to do - add more verbose cleanup - add more/better logging ]]-- -------------------------------------------------------------------------------- local shakeAll = structure.ShakeSidechainsAll local wiggleSelected = structure.LocalWiggleSelected local deselectAll = selection.DeselectAll local selRange = selection.SelectRange local freezeSelected = freeze.FreezeSelected local unfreezeAll = freeze.UnfreezeAll local score = current.GetEnergyScore local isInc = false local doFreeze = true local shakeIters = 1 local wiggleIters = 25 local protLen = structure.GetCount() local fiboNums = {1} local fiboNumsStr = "1 " local initialScore = score() local bestScore = score() local minGain = 0.001 -- Generate list of fib numbers up to the protein size function fib() if protLen == 0 then fiboNums = {0} fiboNumsStr = "0" elseif protLen == 1 or protLen == 2 then fiboNums = {1} fiboNumsStr = "1" else local fib, fib1, fib2 = 0, 1, 1 while fib < protLen do fib = fib1 + fib2 fib1 = fib2 fib2 = fib if fib <= protLen then table.insert(fiboNums, fib) fiboNumsStr = fiboNumsStr..fib.." " end end end end function getParameters() dlg = dialog.CreateDialog("Fibonacci Wiggle") dlg.isInc = dialog.AddCheckbox("Small to Large", false) dlg.doFreeze = dialog.AddCheckbox("Do Freezes", true) dlg.wiggleIters = dialog.AddSlider("Wiggle Iterations", 10, 1, 25, 0) dlg.shakeIters = dialog.AddSlider("Shake Iterations", 1, 0, 10, 0) dlg.minGain = dialog.AddSlider("Min Gain", 0.001, 0.001, 1, 3) dlg.ok = dialog.AddButton("OK", 1) dlg.cancel = dialog.AddButton("Cancel", 0) if dialog.Show(dlg) > 0 then isInc = dlg.isInc.value doFreeze = dlg.doFreeze.value wiggleIters = dlg.wiggleIters.value shakeIters = dlg.shakeIters.value minGain = dlg.minGain.value return true else print("Program Cancelled") end return false end function freeze(len) if len / 2 > 2 then for seg = math.floor (len / 2), protLen, len do deselectAll () selRange ( seg, math.min (seg + len / 2 - 1, protLen) ) freezeSelected ( true, true ) end end end function wiggleLength (len) print("running with length", len) local currentScore, bestWiggleScore = score(), score() while true do if doFreeze then freeze(len) end for seg = 1, protLen, len do deselectAll () selRange ( seg, math.min (seg + len - 1, protLen) ) wiggleSelected ( wiggleIters ) end if doFreeze then unfreezeAll () end if shakeIters > 0 then structure.ShakeSidechainsAll ( shakeIters ) end currentScore = score() if currentScore > bestWiggleScore then local gain = currentScore - bestWiggleScore bestWiggleScore = currentScore if gain < minGain then break end end end end function cleanup () print("Script complete. Score changed by", score() - initialScore) print("Ending score:", score()) end function main () if not getParameters() then return false end fib() print("Protein length : "..protLen) print("Fib numbers : " .. fiboNumsStr) print("Starting score :", initialScore) print() local currentScore = score() while true do deselectAll() unfreezeAll() if isInc then for i = 1, #fiboNums do wiggleLength(fiboNums[i]) end else for i = #fiboNums, 1, - 1 do wiggleLength(fiboNums[i]) end end currentScore = score() if currentScore > bestScore then local gain = currentScore - bestScore bestScore = currentScore if gain < minGain then break end end end end xpcall(main, cleanup)

Comments


TurtleByte Lv 1

V3.1
Fixed bug where 1 was not in list of fib numbers
Fixed bug that allowed fib number generation to go past protein length
Added loop to repeat until gain < minGain, minGain set by user
Freeze segments re-enabled, controlled via dialog option
Localized and renamed Foldit functions