Icon representing a recipe

Recipe: Electron Density kick-off v0.3 + SetDensityImportance rev 3

created by Artoria2e5

Profile


Name
Electron Density kick-off v0.3 + SetDensityImportance rev 3
ID
108383
Shared with
Public
Parent
Electron Density kick-off v0.3 + SetDensityImportance rev 2
Children
None
Created on
August 25, 2023 at 03:26 AM UTC
Updated on
November 12, 2023 at 02:24 AM UTC
Description

What if we also played with SetDensityImportance? NOTE: Must enable recipe scoring!

Changes:
* SDI is now adjustable
* Wiggle power full control
* Fix shakeOrWiggle toggle
* Shake Iters default reduced to 1 -- we have breakout checks already. 1 Iter is usually enough anyways.

Best for


Code


-- Automating tedious start to electron density puzzles recipename= "Electron Density kick-off v0.3 + SetDensityImportance rev 2" -- Adjust default values based on puzzle segment count segmentCount = structure.GetCount() defWiggle = segmentCount / 100 defShake = segmentCount / 1000 defCycle = segmentCount / 200 local ask = dialog.CreateDialog("Electron Density - start of puzzle") ask.revertWiggleStrength = dialog.AddCheckbox("Wiggle strenth Auto when finished?", false) ask.firstShakeOrWiggle = dialog.AddCheckbox("Shake first?", true) ask.instructionsIterations = dialog.AddLabel("Iters before checking for improvement") ask.wiggleIterations = dialog.AddSlider("Wiggle Iters", 7, 1, 20, 0) ask.shakeIterations = dialog.AddSlider("Shake Iters", 1, 1, 10, 0) ask.instructionsMinimums = dialog.AddLabel("Minimum improvements before break out") ask.wiggleImprovement = dialog.AddSlider("Wiggle Min", defWiggle, 0.1, 100, 2) ask.shakeImprovement = dialog.AddSlider("Shake Min", defShake, 0.01, 10, 2) ask.cycleImprovement = dialog.AddSlider("Cycle Min", defCycle, 0.1, 100, 2) ask._additional = dialog.AddLabel("Experimental settings") ask.wigglePower = dialog.AddSlider("wigpow: l/m/a/h", 1, 1, 4, 0) ask.densityImportance = dialog.AddSlider("CF DensImp?", 2, 0, 3, 1) ask.OK = dialog.AddButton("OK", 1) ask.Cancel = dialog.AddButton("Cancel", 0) local wigp = {"l","m","a","h"} if (dialog.Show(ask) > 0) then wiggleIterations = ask.wiggleIterations.value shakeIterations = ask.shakeIterations.value revertWiggleStrength = ask.revertWiggleStrength.value wiggleImprovement = ask.wiggleImprovement.value shakeImprovement = ask.shakeImprovement.value cycleImprovement = ask.cycleImprovement.value shakeOrWiggle = ask.firstShakeOrWiggle.value densityImportance = ask.densityImportance.value wigglePower = wigp[ask.wigglePower.value] end print ("Puzzle size = "..segmentCount) print ("wiggleIterations = "..wiggleIterations) print ("shakeIterations = "..shakeIterations) print ("wiggleImprovement breakout = "..wiggleImprovement) print ("shakeImprovement breakout = "..shakeImprovement) print ("cycleImprovement breakout = "..cycleImprovement) print ("densityImportance ="..densityImportance) print ("wigglePower ="..wigglePower) -- Set behavior to 'best fit' the cloud behavior.SetClashImportance(1) behavior.SetBackboneHBondImportance(0) behavior.SetSidechainHBondImportance(0) behavior.SetWigglePower(wigglePower) behavior.SetDensityImportance(densityImportance) function DoWiggle() -- Keeps looping while improvement better than dialogue spec local recentBest = recentbest.GetEnergyScore() local startingScore = current.GetEnergyScore() for i=1, 200 do -- 200 to stop infinite loop to an asymptote -- Measure the improvement from one wiggle set local loopStartScore = current.GetEnergyScore() structure.WiggleAll(wiggleIterations) local loopEndScore = current.GetEnergyScore() -- Break if improvement less than dialogue spec for wiggles if (loopEndScore - loopStartScore < wiggleImprovement) then break end -- Let everyone know what's happening print ("DoWiggle "..i.." done, now:"..loopEndScore) end return current.GetEnergyScore() > recentBest end function DoShake() -- Keeps looping while improvement better than dialogue spec local recentBest = recentbest.GetEnergyScore() local startingScore = current.GetEnergyScore() for i=1, 200 do -- 200 to stop infinite loop to an asymptote -- Measure the improvement from one shake set local loopStartScore = current.GetEnergyScore() structure.ShakeSidechainsAll(shakeIterations) local loopEndScore = current.GetEnergyScore() -- Break if improvement less than dialogue spec for shakes if (loopEndScore - loopStartScore < shakeImprovement) then break end -- Let everyone know what's happening print ("DoShake "..i.." done, now: "..loopEndScore) end return current.GetEnergyScore() > recentBest end function DoCycle() -- Switches back and forth between wiggle and shake while improvement better than dialogue spec local recentBest = recentbest.GetScore() local startingScore = current.GetEnergyScore() for i=1, 200 do -- 200 to stop infinite loop to an asymptote -- Measure improvement from one cycle local loopStartScore = current.GetEnergyScore() if shakeOrWiggle then DoShake() DoWiggle() else DoWiggle() DoShake() end local loopEndScore = current.GetEnergyScore() -- Break if improvement less than dialogue spec for cycles if (loopEndScore - loopStartScore < cycleImprovement) then break end -- Let everyone know what's happening print ("DoCycle "..i.." end: "..loopEndScore) end return current.GetEnergyScore() > recentBest end -- Loose munge to the cloud shape print ("Starting the cloud-fit bit, not worrying about score") DoCycle() -- Restore normal behavior behavior.SetBackboneHBondImportance(1) behavior.SetSidechainHBondImportance(1) behavior.SetDensityImportance(1) -- Get some points print ("Time to get some points!") DoCycle() if revertWiggleStrength then behavior.SetWigglePower("a") print ("Wiggle strength reset to Auto") else print ("Wiggle strength left on High") end print ("Electron density kick-off wiggles and shakes complete.") print ("Do not re-run once you've improved from here - it will make it worse.") print ("Over to you.")

Comments