Icon representing a recipe

Recipe: Ebola Rebuild 1.12.2

created by Bruno Kestemont

Profile


Name
Ebola Rebuild 1.12.2
ID
45692
Shared with
Public
Parent
Ebola Rebuild 1.12.1
Children
Created on
June 24, 2013 at 14:28 PM UTC
Updated on
June 24, 2013 at 14:28 PM UTC
Description

By Jan-Bob ------------ DRW+GAB, =Ebola Rebuild 1.12.1 translated to english

Best for


Code


--[[ Ebola Rebuild Scripted by Jean-Bob Brainstormed by LAlliance Francophone Based mainly on Rav3n_pl recipes (DRW+GAB) Dialog taken from Timo van der Laan's DRW ------------------------------ GAB - Genetic Algorythm on Bands by Rav3n_pl based on CartoonVillan and Crashguard303 scripts 21/3/2013: corrected bug unwanted negative scores + clarifying user interface BK 10/4/13: multilingual options BK 28/4/2013: bug 'nil value' fixed 10/6/13 Filter optimization+mute desactivation on all prot 24/6/201 set recent best in the beginning ]]-- -- User variables uo={ --user options. Very long table but useful to restore script lang="en", -- New BK 10/4/13 recipeName="EbolaRebuild", numSegs=10, -- Number of segments per zone contSegsMax=6, -- Max number of contiguous segments to analyse contSegsMin=3, -- Min number of contiguous segments to analyse maxContSegs=10, -- Number of contiguous segments to not exceed (loop mode) wholeProt=false, -- whole protein rebuild zoneWalk=false, -- walk into forceZone in the order of segments instead of scores autoGab=false, -- Run Gab automatically if the fuse gained some points gabThresh=30, -- Threshold for Gab launching rebuildBest=false, -- Best segments rebuild rebuildNum=30, -- Number of rebuilds to do -- reduce this to save time solsPerScore=3, -- Number of best solutions to test after rebuild rebuildCI=0, -- clash importance during rebuild rebuildLoops=true, -- Transfor protein to loop scoreFilter=20, -- Minimum score for launching GAB passGAB=false, -- Do not launch GAB allowLoss=false, -- Allow loss in a complete cycle lossThresh=1, -- Amount of allowed loss -- Etait 100, passe a 1 BK 19/3 fastMode=false, -- Enable fuse minRebuild=1500, -- Minimal score below the maximal score to accept the rebuild maxRebuild=.001, -- Minimal score above the maximal score to accept the rebuild fastFuse=true, -- Use 1 fuse instead of 5 verbose=false, -- More information in the output window if true PROBABLEFILTER=false, -- new BK 8/5/2013 OriginalFilterSetting=behavior.GetSlowFiltersDisabled(), -- new BK 8/5/2013 -- Automatic options used for the script saving resumeScript=false, curSeg=0, segs=0, curArray='', stIndex=2, scoringMode="Backbone", subscores={}, forceZoneStr='', forceZone={}, maxVal=-10, -- Mean maximum score for taking the segments into account -- GAB options: energy = false, -- True to find energy in exploratory puzzles. False works on every puzzles pullCI = 0.55, -- Clash Importance during pull mode maxCI = 1, -- maximum during the script fastQstab = true, -- Only 1 shake and 1 wiggle in pull mode if true -- BK 11/6: default, no option fuzeThresh = 10, -- Launch fuse if next to the highscore qstabThresh = 1, -- Launch qstab if score is lower than otherwise, only wiggle useLigand = false, --Use ligand if true onlyMutable = false, -- If true use ONLY every mutable mutateOnce = false, -- If true use mutate(1) instead of shake in qstab mutateOnceCI = 0.21, -- Mutate with this CI mutateAlways = false, -- If true use mutate(1) instead of each shake -- BK not used 11/6/2013 preciseBands=true, -- If false only use random bands herd= -- options herd { breedBest = 3, --Number of best critters to breed keepBest = 5, -- Number of best critters to keep breedBastards = 2, -- Number of best critters to produce bastards firstGen = 10, -- Number of critters in first generation newRandom = 4, -- Number of random critters added for each generation maxGen= 1, -- Maximum of generations shuffle = true, -- Launch critters in random order --After x generations that dont increase the score : renew=2, -- create a completely random generation maxBadGen=4, -- Stop the script after X generations that dont increase the score }, critter= --critter options { minBands=2, --minimum bands maxBands=5, --maximum bands keepScore = -50 , -- Critters with lower score dont go to the next generation breedScore= -20, -- Minimal score to do some kids. Bastards always breed maxLoss=0, -- Maximum loss per critter totalLoss=0, -- Maximum loss per generation giveUp=200, -- Next critter if under this threshold keepConditions=true, -- Next critter if a condition is lost }, bands= --bands options { minStr=0.3, --minimum band str maxStr=1.1, --maximum band str minChng = 3, -- minimum change of band len according to current distance maxUp = 6.1, -- maximum change up (push) maxDn = 6.9, -- maximum change down (pull) minSkip = 5, --minimum segment distance minDist = 4, --minimum spatial distance minLen = 2, --minimum length of created band } }-- end of userOptions function setlanguage()-- New BK 10/4/13 local player=user.GetPlayerName() local group=user.GetGroupName() if group=="L'Alliance Francophone" or player==("marie_s" or "roukess" or "bruno.kestemont") then uo.lang="fr" else uo.lang="en" end return uo.lang end function multilingual(lang)-- New BK 10/4/13 if lang=="fr" then -- translation table. do NOT replace %-letter combos i18n={ ask={ ok="OK", cancel="Annuler", options={ mainTitle="Ebola Rebuild options", l1="Segments", contSegsMin="Segments min", contSegsMax="Segments max", numSegs="Segments/zone", wholeProt="Toute la protine", l2="Reconstructions", rebuildNum="Recons./zone", solsPerScore="Solutions/zone", l3="Dclenchement de GAB", scoreFilter="Filtre GAB", passGAB ="Ne pas lancer GAB", l4="Score", allowLoss="Autoriser la perte", lossThresh="Seuil perte", l5="Autres", rebuildLoops ="Transformer la protine en loops", fastMode ="Pas de Fuze (beaucoup plus rapide)", -- BK 11/6/13 fastFuse="Fuze rapide (plus rapide, moins de points)", mutateOnce="Muter au lieu de secouer", -- BK 11/6/13 was mutate once but we do not use mutate always in this version resumeScript="Reprendre avec options du dernier arrt", -- BK 11/6/13 advanced="Plus", GABOptions="GAB" }, gab={ mainTitle="Options GAB", l1="Gnrations", totalLoss="Perte max GAB", maxGen="Max gnrations", l2="Max gnrations sans gain pour :", renew="Recommencer", maxBadGen="Stopper", l3="Critters", firstGen="Crits 1r gn.", maxLoss="Perte max/crit", giveUp="Seuil abandon", keepConditions="Conserver les conditions", fuzeThresh="Seuil lancer Fuze", l4="Autre", l5="Utiliser Ligand options : 0-jamais, 1-hasard, 2-toujours", useLigand="Utiliser Ligand" }, advanced={ mainTitle="Options avances", l1="Filtres de reconstruction", minRebuild="Filtre infrieur", maxRebuild="Filtre suprieur", l2="Gestion des sous-scores", l3="Scores : 1-all, 2-backbone 3-sidechain, 4-other", stIndex="Type de score", l4="Forcer zone", l5="Format: Dbut1,Fin1-Dbut2,Fin2...", forceZoneStr="Zone force :", zoneWalk ="Parcourir la zone force dans l'ordre", l6="Lancement automatique de GAB", autoGab="Autoriser GAB se lancer automatiquement", gabThresh ="Seuil lancement", l7="Autres", rebuildCI="Clash recons.", preciseBands="Bandes cibles", rebuildBest="Reconstruire les meilleurs segments", verbose="Afficher plus d'informations" } }, recipe={ sb=">>> Encore %.3f points gagner. Score : %.3f.", gb1="Sauvegarde des bandes impossible. Dsactivation.", gb2="Bandes sauvegardes. Suppression.", tsc=">> Gain : %.3f points. Score : %.3f.", tso1="Solution %i. Score : %.3f.", tso2a="Lancement automatique de GAB.", tso2b="Gain GAB auto : %.3f. Score : %.3f.", tso3="chec de la solution. Poursuite du script.", tso4="Meilleure solution. Score : %.3f.", tso5="chec de la reconstruction, passage la zone suivante.", dlr="* Reconstruction #%i.", dlr2=">>> Microgain sauvegard.", is1="Aucun segment ne correspond aux critres demands.", is2="Reconstruction de toute la molcule.", is3="tat du script restaur.", e1="Zones de %i segments contigus.", e2="Reconstruction des segments %i-%i.", e3="* Score de la zone : %.3f.", e4="* Donnes :", e5="ATTENTION Perte autorise. Score : %.3f. Total : -%.3f.", -- BK 19/3/2013 e6="Gain total Ebola: %.3f. Score : %.3f.", --- ajoute Ebola BK 19/3/13 e7="Segment gel dtect. Passage la zone suivante.", m1="Reprise du script.", m2="Dbut Ebola Rebuild. Mode : %q. Score : %.3f.", m3a="Traitement des paramtres initiaux termin.", m3b="Parcours systmatique de la protine.", fh="Cration de %i cratures alatoires...", critter="%s : %i bandes.", ab="* Impossible de crer de bandes. Arrt de GAB.", sh1="Lancement de %i cratures...", sh2a="Crature %s : %.3f.", sh2b="Critres non respects. Abandon.", bh="Appariement...", g1="Lancement de GAB.", g2="* Gnration : %i. Score : %.3f. Gain : %.3f", g3="Cration d'une gnration entirement alatoire...", g4="* Score final GAB : %.3f. Gain GAB: %.3f.", -- BK 20/3/13 lw1="Rtablissement du meilleur score.", lw2="Rtablissement de la structure secondaire.", lw3="Rtablissement des bandes.", lw4="Sauvegarde de l'tat du script.", de1="Arrt utilisateur.", de2="Erreur inattendue dtecte.", de3="Ligne d'erreur : %i.", de4="Message d'erreur : %s." } } else i18n={ ask={ ok="OK", cancel="Cancel", options={ mainTitle="Ebola Rebuild options", l1="Segments", contSegsMin="Segments min", contSegsMax="Segments max", numSegs="Segments/zone", wholeProt="Whole protein", l2="Rebuild", rebuildNum="Rebuild/zone", solsPerScore="Solutions/zone", l3="Threshold for GAB", scoreFilter="GAB Filter", passGAB ="Do not launch GAB", l4="Score", allowLoss="Allow loss", lossThresh="loss threshold", l5="Others", rebuildLoops ="Transform protein to loop", fastMode ="Skip Fuse (much faster)", -- BK 11/6/13 fastFuse="Fast Fuse (faster, less points)", mutateOnce="Mutate instead of shake", -- BK 11/6/13 was mutate once but we do not use mutate always in this version resumeScript="Continue with former options", advanced="More", GABOptions="GAB" }, gab={ mainTitle="GAB Options", l1="Generations", totalLoss="GAB max loss", maxGen="Max generations", l2="Max generations without gain for :", renew="Start again", maxBadGen="Stop", l3="Critters", firstGen="Crits 1r gn.", maxLoss="Loss max/crit", giveUp="Give up threshold", keepConditions="Keep conditions", fuzeThresh="Launch fuse threshold", l4="Other", l5="Use Ligand options : 0-Never, 1-Random, 2-Allways", useLigand="Use Ligand" }, advanced={ mainTitle="Advanced options", l1="Rebuild filter", minRebuild="Min filter", maxRebuild="Max filter", l2="Subscore management", l3="Scores : 1-all, 2-backbone 3-sidechain, 4-other", stIndex="Score type", l4="Force zone", l5="Format: Start1,End1-Start2,End2...", forceZoneStr="Forced zone :", zoneWalk ="Walk in the forced zone", l6="Launch automatically GAB", autoGab="Allow GAB to be automatically launched", gabThresh ="Launch threshold", l7="Others", rebuildCI="Clash rebuild", preciseBands="Precise bands", rebuildBest="Rebuild best segments", verbose="Display more informations" } }, recipe={ sb=">>> Still %.3f points to gain. Score : %.3f.", gb1="Impossible to save bands. Disabling.", gb2="Bands saved. Deleting.", tsc=">> Gain : %.3f points. Score : %.3f.", tso1="Solution %i. Score : %.3f.", tso2a="Launching GAB.", tso2b="Gain GAB auto : %.3f. Score : %.3f.", tso3="Fail of the solution.", tso4="Best solution. Score : %.3f.", tso5="Fail of the rebuild, next zone.", dlr="* Rebuild #%i.", dlr2=">>> Microgain saved.", is1="No segment fit to the requested critter.", is2="Whole protein rebuild.", is3="Script state loaded.", e1=" %i contiguous segments zone.", e2="Rebuild of segments %i-%i.", e3="* Zone score : %.3f.", e4="* Data :", e5="WARNING: Loss allowed. Score : %.3f. Total : -%.3f.", -- BK 19/3/2013 e6="Total Ebola gain: %.3f. Score : %.3f.", --- ajoute Ebola BK 19/3/13 e7="Frozen segment detected. Next zone.", m1="Script recovered.", m2="Start of Ebola Rebuild. Mode : %q. Score : %.3f.", m3a="Initial parameters treatment completed.", m3b="Whole protein walking.", fh="Creating %i random critters...", critter="%s : %i bands.", ab="* Impossible to create bands. GAB stopped.", sh1="Launching %i critters...", sh2a="Critter %s : %.3f.", sh2b="Unrespected critter. Give up.", bh="Breeding...", g1="Launching GAB.", g2="* Generation : %i. Score : %.3f. Gain : %.3f", g3="Create a completely random generation", g4="* GAB final score : %.3f. Total Gain: %.3f.", -- idem BK lw1="Loading Highscore....", lw2="Loading secondary structure...", lw3="Loading bands...", lw4="Saving script state", -- added BK 21/3/13 de1="User stop.", de2="unexpected error detected.", de3="Error line: %i.", de4="Error : %s." } } end return end -- Zones d'action de GAB DoNotUse={} -- zones qui ne doivent pas recevoir de bandes. utiliser des zones du type {segDebut,segFin} AlwaysUse={} -- zones toujours utilises. utiliser des zones du type {segDebut,segFin} UseSegments={} -- utiliser seulement ces segments. sparer les numros des segments par des virgules -- bands by secondary structure use={ Sheet=true, --set false to not band sheets Helix=true, --set false to not band helices Loop=true, --set false to not band loops } checkBoth=false --check both ends to above, if false only one end need to be true -- variables recette segments=structure.GetCount() --print("DEBUG: segments= "..segments) subscores={ --select given score parts for calculating worst/best areas {"clashing", "packing", "hiding", "bonding", "backbone", "sidechain", "disulfides", "other"}, -- 1:All {"clashing", "packing", "backbone"}, -- 2:Backbone {"hiding", "bonding", "sidechain"}, -- 3:Sidechain {"other"}, -- 4:Other mode={"All", "Backbone", "Sidechain", "Other"} } uo.subscores=subscores gabSlot=uo.solsPerScore+2 rbSlot=uo.solsPerScore+4 fuseSlot=uo.solsPerScore+5 score={ --global scores best=current.GetEnergyScore(), start=current.GetEnergyScore(), cycle=0, fuse=0, recentbest=0 } flag={ --global flags mutable=false, ligand=false, gab=false, selected=false, mutate=false, points=false, save=false, recentbest=false, bands=false, locked=false } index={ --global tables mutable={}, ligand={}, frozens={}, bands={}, bndCnt=0, --if bands can't be saved, disable them and store their count score={}, subscore={}, scoreTypes={}, bounds={1, segments} } -- core helpers function GenerateSeed()--calculate REALLY good seed from current score --local seed=recipe.GetRandomSeed() --NOT WORKING on windowz!!! seed=os.time() seed=1/seed while seed<10^9 do seed=seed*10 end seed=math.floor(seed) math.randomseed(seed) s1=structure.GetDistance(math.random(segments),math.random(segments)) s2=structure.GetDistance(math.random(segments),math.random(segments)) s3=structure.GetDistance(math.random(segments),math.random(segments)) seed=s1*seed^(1/s2)/s3 while seed<10^9 do seed=seed*10 end seed=math.floor(seed) --~ p("Seed is: "..seed) math.randomseed(seed) end function round(x)--cut all afer 3-rd place return x-x%0.001 end function tlist(t) --table walk & unpack local i, n=0, #t return function () i=i+1 if i<=n then return unpack(t[i]) end end end function tslice(array, len) local tempArray={} for i=1, len do tempArray[i]=array[i] end return tempArray end function randf(n1,n2) -- returns random float between n1,n2 return math.random()*(n2-n1)+n1 --float between end function trand(arr) return arr[math.random(#arr)] end function tobool(val) local res if type(val)=='number' then if val==0 then res=false elseif val==1 then res=true else res=nil end elseif type(val)=='string' then if val=='false' then res=false elseif val=='true' then res=true else res=nil end else res=nil end return res end function SortL(a, b) return a[2]<b[2] end -- sort lower first function SortH(a, b) return a[2]>b[2] end -- sort higher first function SortC(a, b) if #critters==0 then return false else local ac=critters[a] -- added BK 26/3/13 local bc=critters[b]-- added BK 26/3/13 if ac==nil or bc==nil then return false --added BK 27/4/13 against nil bug else return ac.score<bc.score-- changed BK 26/3/13 -- SILL nil BUG here !! end end end -- sort critters BUG nil BK 26/3/13 function puzzleprop() -- simplified version to identify filtered puzzles-- new BK 8/5/2013 local descrTxt=puzzle.GetDescription() local puzzletitle=puzzle.GetName() if #descrTxt>0 and (descrTxt:find("filter") or descrTxt:find("filters")) then PROBABLEFILTER=true end return end puzzleprop() -- new BK 8/5/2013 -- game helpers segCnt=structure.GetCount() function p(printAlways, fmt, ...) --Lua = thebest, thebest, thebest if not uo.verbose and not printAlways then return end -- more or less details if #arg==0 then print(fmt or '') elseif arg==nil then return--print(fmt or '')-- added BK 23/3/13 -- supressed empty lines 11/6/2013 elseif fmt==nil then return--print('')-- added BK 23/3/13 -- supressed empty lines 11/6/2013 else print(string.format(fmt, unpack(arg))) end end function Score()--return score, exploration too return uo.energy and current.GetEnergyScore() or current.GetScore() end function CI(c) if c>uo.maxCI then c=uo.maxCI end behavior.SetClashImportance(c) end function Wiggle(how, iters, iter) how=how or "wa" iters=iters or 1 iter=iter or 1 local step=.025 local ws=0 if flag.selected then ws=ws+1 end if uo.mutateAlways or flag.mutate then ws=ws+10 end function wShake() if ws==0 then structure.ShakeSidechainsAll(1) elseif ws==1 then structure.ShakeSidechainsSelected(1) elseif ws==10 then structure.MutateSidechainsAll(1) elseif ws==11 then structure.MutateSidechainsSelected(1) end end function wWiggle() if PROBABLEFILTER then behavior.SetSlowFiltersDisabled(true) end-- new BK 8/5/2013, always disable filter here local b, s= true, true if how=='wb' then s=false end if ws==1 then structure.WiggleSelected(iters, b, s) else structure.WiggleAll(iters, b, s) end if PROBABLEFILTER then behavior.SetSlowFiltersDisabled(OriginalFilterSetting) end -- new BK 8/5/2013, always back to user settings end if how=='s' then wShake() else local sp=Score() wWiggle() if (Score()-sp)>(step*(1+iter)) then Wiggle(how, iters+1, iter+1) end end end function FuzeEnd() CI(1) Wiggle("s") Wiggle("wa",2) recentbest.Restore() srb() end function Fuze1(ci1,ci2) save.Quickload(fuseSlot) recentbest.Save() CI(ci1) Wiggle("s") CI(ci2) Wiggle() FuzeEnd() end function Fuze2(ci1,ci2) save.Quickload(fuseSlot) recentbest.Save() CI(ci1) Wiggle() CI(1) Wiggle() recentbest.Restore() CI(ci2) Wiggle() CI(1) Wiggle() recentbest.Restore() FuzeEnd() end function Fuze() --~ p("*** GAB Fuzing...") score.fuse=Score() --~ selection.SelectAll() save.Quicksave(fuseSlot) if uo.fastFuse then Fuze2(0.25,.55) else Fuze1(0.3,0.6) Fuze1(0.02,1) Fuze2(0.25,.55) Fuze2(0.7,0.5) Fuze2(0.5,0.7) end end function srb() local s=Score() if s<=score.fuse then save.Quickload(fuseSlot) else score.fuse=s save.Quicksave(fuseSlot) if flag.gab then SaveBest() else TestScore(true) end end end function SaveBest() local s=Score() local g=s-bestScore if g>0 then if g>0.01 then if s<=score.best then p(true, i18n.recipe.sb, score.best-s, s) else TestScore(true) end end bestScore=s save.Quicksave(gabSlot) end end function SaveRB() local rb=recentbest.GetScore() if rb>bestScore then save.Quicksave(rbSlot) recentbest.Restore() ManageBands() SaveBest() save.Quickload(rbSlot) recentbest.Save() end end function Qstab() selection.SelectAll() if uo.mutateOnce then CI(uo.mutateOnceCI) structure.MutateSidechainsSelected(1) else CI(0.02) Wiggle("s") end if not uo.fastQstab then CI(0.25) Wiggle() CI(1) Wiggle("s") end CI(1) Wiggle() end function IsFrozen(seg) a, b=freeze.IsFrozen(seg) return a or b end function SetToLoop() save.SaveSecondaryStructure() selection.SelectAll() structure.SetSecondaryStructureSelected("l") selection.DeselectAll() end function DetectLigand() local lastSeg1=structure.GetCount() local lastSeg2=lastSeg1 while structure.GetSecondaryStructure(lastSeg1)=="M" do flag.ligand=true lastSeg1=lastSeg1-1 end if lastSeg1+1==lastSeg2 then index.ligand={lastSeg2} else index.ligand={lastSeg1, lastSeg2} end end function puzzleproblems() local descrTxt=puzzle.GetDescription() --p(descrTxt) local puzzletitle=puzzle.GetName() --p(puzzletitle) if #puzzletitle>0 and puzzletitle:find("713") then PROBLEMATIC=true end end function DetectLock() puzzleproblems() if not PROBLEMATIC then local start, stop=unpack(index.bounds) while structure.IsLocked(start) do start=start+1 flag.locked=true end while structure.IsLocked(stop) do stop=stop-1 flag.locked=true end index.bounds={start, stop} else flag.locked=true EmergencyAsk() end end function EmergencyAsk() local ask=dialog.CreateDialog("Ebola emergency options") repeat ask.l100=dialog.AddLabel("Unable to deal with this strange puzzle") ask.l101=dialog.AddLabel("You should cancel Ebola") ask.l1=dialog.AddLabel("Forcer zone (format: Dbut1,Fin1)") ask.forceZoneStr=dialog.AddTextbox("Zone force :",uo.forceZoneStr) ask.OK = dialog.AddButton("OK",1) ask.Cancel = dialog.AddButton("Cancel",0) askresult=dialog.Show(ask) if askresult > 0 then if ask.forceZoneStr.value~='' then for a,b in ask.forceZoneStr.value:gmatch('(%d+),(%d+)') do table.insert(uo.forceZone,{a,b}) end else uo.forceZone={} end SetAndFlag(ask, 'forceZoneStr') end until askresult<2 return askresult > 0 end function DetectMutables() local muts={} for i=1,segments do if structure.IsMutable(i) then flag.mutable=true table.insert(muts, i) end end index.mutable={muts[1], muts[#muts]} end function DetectFrozens() for i=1, segments do if IsFrozen(i) then table.insert(index.frozens, i) end end end function GetSegFromDist(seg, dist) local hasPassed, len, targetSeg=false, 0, 0 for i=1, segments do hasPassed, len=pcall(structure.GetDistance,i,seg) if not hasPassed then return false else if len==dist then return i end end end end function GetBands() if band.GetCount()==0 then return end local isOK=true for i=1, band.GetCount() do rope=band.AddToBandEndpoint(1,i) len1=band.GetLength(i) len2=band.GetLength(rope) band.Delete(rope) bandEnd1=GetSegFromDist(1, len2) if not bandEnd1 then isOK=false break end bandEnd2=GetSegFromDist(bandEnd1, len1) if not bandEnd2 then isOK=false break end table.insert(index.bands,{bandEnd1, bandEnd2}) end if not isOK then p(true, i18n.recipe.gb1) index.bands={} index.bndCnt=band.GetCount() band.DisableAll() else p(true, i18n.recipe.gb2) band.DeleteAll() end end function RestoreBands() if #index.bands==0 then return end for end1, end2 in tlist(index.bands) do band.AddBetweenSegments(end1, end2) end end function RestoreFrozens() if #index.frozens==0 then return end for i=1, #index.frozens do selection.Select(index.frozens[i]) end freeze.FreezeSelected(true, true) selection.DeselectAll() end function SelectSphere(start, stop, size) size=size or 12 for j=start, stop do for i=1, segments do if structure.GetDistance(j, i)<size then selection.Select(i) end end end end function SetCleanType(val) if tonumber(val)~=nil then return tonumber(val) elseif tobool(val)~=nil then return tobool(val) else return val end end function ConcatArray(array, depth) local s='' local depth=depth or 1 local sep={' ',',','|'} for key, val in pairs(array) do if type(val)=='table' then s=s..key..sep[depth+1]..ConcatArray(val, depth+1)..sep[depth] else s=s..key..':'..tostring(val)..sep[depth] end end return s:sub(1,#s-1) end function RebuildArray(str, depth) local arr={} local depth=depth or 1 local sep={' ',',','|','%^'} local subpat='' for i=1, depth do subpat=subpat..sep[i] end pattern="([^"..subpat.."]+)" for entity in string.gmatch(str, pattern) do if entity:find(sep[depth+1]) then key=string.match(entity,"([^"..sep[depth+1].."]+)") local len=#key key=SetCleanType(key) arr[key]=RebuildArray(entity:sub(len+2,#entity), depth+1) else key, val=string.match(entity,"([%w]+):([^"..subpat.."]+)") if not key then key=string.match(entity,"([%w]+):") val='' end arr[SetCleanType(key)]=SetCleanType(val) end end return arr end -- fin helpers -- dbut Ebola function SubScore(seg, scoreType) scoreType=scoreType or "other" if scoreType=='all' then return current.GetSegmentEnergyScore(seg) else return current.GetSegmentEnergySubscore(seg,scoreType) end end function GenerateScoreTable() index.score={} -- redondant BK index.subscore={} -- redondant BK local slot=1 local limit=0 if uo.solsPerScore%2==1 then limit=(uo.solsPerScore-1)/2 else limit=uo.solsPerScore/2-1 end for i=1, uo.solsPerScore-limit do slot=slot+1 table.insert(index.score,{slot, -math.huge}) end for i=uo.solsPerScore-limit+2, uo.solsPerScore+1 do slot=slot+1 table.insert(index.subscore,{slot, -math.huge}) end for i=2, fuseSlot do save.Quicksave(i) end end function ReplaceLowest(arr, val) if #arr==0 then return end local flag=false if val>arr[#arr][2] then save.Quicksave(arr[#arr][1]) arr[#arr][2]=val table.sort(arr, SortH) flag=true end return arr, flag end function ScoreArea(seg, scoreType) scoreType=scoreType or "other" local tempScore=0 for i=seg, seg+uo.segs-1 do tempScore=tempScore+SubScore(i, scoreType) end return tempScore end function StoreScore(seg) local yetFlag=false -- don't keep same value twice index.score, yetFlag=ReplaceLowest(index.score, Score()) if not yetFlag and #index.subscore>0 then local mode = uo.stIndex~=4 and "clashing" or "other" index.subscore, yetFlag=ReplaceLowest( index.subscore, ScoreArea(seg, mode) ) end end function TestScore(saveFlag) local s=Score() if s>score.best then p(true, i18n.recipe.tsc, s-score.best, s) score.best=s if saveFlag then save.Quicksave(1) end end end function FilterSegments(start, stop) local isEmpty=true local tempArray={} for seg=start, stop-uo.segs do local segscore=0 local data='' for j, mode in ipairs(index.scoreTypes) do local subscore=ScoreArea(seg, mode) if subscore~=0 then local areaIsGood=false if uo.rebuildBest then areaIsGood=(subscore/uo.segs)>uo.maxVal else areaIsGood=(subscore/uo.segs)<=uo.maxVal end if areaIsGood then segscore=segscore+subscore data=data..'* '..mode..':'..subscore..'\n' end end end if segscore~=0 then table.insert(tempArray,{seg, segscore, data}) isEmpty=false end end local func=uo.rebuildBest and SortH or SortL table.sort(tempArray,func) if #tempArray<uo.numSegs then uo.maxVal=uo.rebuildBest and uo.maxVal-5 or uo.maxVal+5 tempArray=FilterSegments(start, stop) elseif #tempArray>uo.numSegs then tempArray=tslice(tempArray, uo.numSegs) end return isEmpty and false or tempArray end function LaunchGab(seg) if uo.preciseBands then AlwaysUse={} table.insert(AlwaysUse, {seg, seg+uo.segs-1}) end if flag.ligand then if uo.useLigand==0 then segCnt=lastSeg1 -- was lastSeg but gave a nil bug line 1066-- BK 25/3/13 elseif uo.useLigand==2 then table.insert(AlwaysUse, index.ligand) end end GAB() end function TestSolutions(seg) for i=2, uo.solsPerScore+1 do save.Quickload(i) if Score()~=score.cycle then p(true, i18n.recipe.tso1, i-1, Score()) SelectSphere(seg,seg+uo.segs-1) flag.selected=true Wiggle('s') structure.WiggleAll(3) local s=Score() Fuze() flag.selected=false if uo.autoGab and Score()-s>uo.gabThresh then p(true, i18n.recipe.tso2a) s=Score() LaunchGab(seg) p(true, i18n.recipe.tso2b, Score()-s, s) end save.Quicksave(i) TestScore(true) else p(true, i18n.recipe.tso3) end end save.Quickload(2) recentbest.Save() for i=2, uo.solsPerScore+1 do save.Quickload(i) end if flag.recentbest then save.Quickload(rbSlot) flag.recentbest=false end recentbest.Restore() local s=Score() p(true, i18n.recipe.tso4, s) if s>(score.best-uo.scoreFilter) and not uo.passGAB then LaunchGab(seg) else p(true, i18n.recipe.tso5) end end function DoLocalRebuild(seg) for j=1, uo.rebuildNum do p(false, i18n.recipe.dlr1, j) save.Quickload(1) selection.DeselectAll() selection.SelectRange(seg,seg+uo.segs-1) CI(uo.rebuildCI) structure.RebuildSelected(1) CI(1) SelectSphere(seg,seg+uo.segs-1) if uo.mutateOnce then flag.mutate=true end flag.selected=true Wiggle('s') flag.mutate=false if not uo.fastMode then local s=Score() if (score.best-s)<uo.minRebuild or s>score.best then Wiggle('wa',2) if uo.mutateOnce then flag.mutate=true Wiggle('s') Wiggle('wa',2) flag.mutate=false end flag.selected=false recentbest.Restore() -- added experimentaly by BK 20/3/13 to fix negative score bug s=Score() if math.abs(s-score.best)<uo.maxRebuild then --not an interesting solution, but a cent is a cent if s>score.best and s>score.recentbest then flag.recentbest=true save.Quicksave(rbSlot) p(false, i18n.recipe.dlr2) score.recentbest=s end else StoreScore(seg) TestScore(true) -- Change to true BK 20/3/13 end end else TestScore(true) end end end function InitScript() local start=1 local stop=segments local array={} if flag.mutable then start, stop=unpack(index.mutable) elseif flag.ligand then stop=index.ligand[1] elseif flag.locked then start, stop=unpack(index.bounds) end local rebuildMode=0 -- normal mode if #uo.forceZone>0 then rebuildMode=1 elseif uo.wholeProt then rebuildMode=2 elseif uo.resumeScript then rebuildMode=3 end if rebuildMode==0 or rebuildMode==1 then if rebuildMode==0 then array=FilterSegments(start, stop, true) elseif rebuildMode==1 then for zs, ze in tlist(uo.forceZone) do --zone start, zone end if ze-zs+2-uo.segs>0 then for seg=zs, ze-uo.segs+1 do local subscore=0 for j, mode in ipairs(index.scoreTypes) do subscore=subscore+ScoreArea(seg, mode) end table.insert(array, {seg, subscore, ''}) end end end if not uo.zoneWalk then local func=uo.rebuildBest and SortH or SortL table.sort(array,func) end end if not array or #array<1 then p(true, i18n.recipe.is1) return false end stop=#array elseif rebuildMode==2 then stop=stop-uo.segs+1 for seg=start, stop do table.insert(array, {seg, ScoreArea(seg)}) end p(true, i18n.recipe.is2) elseif rebuildMode==3 then array=uo.curArray start=uo.curSeg if #array~=0 then stop=#array elseif #uo.forceZone~=0 then stop=stop-uo.segs+1 end uo.resumeScript=false p(true, i18n.recipe.is3) end return start, stop, array end function Ebola() p(true, '\n######################') p(true, i18n.recipe.e1, uo.segs) local startSeg, endSeg, lowSeg, areaScore, data startSeg, endSeg, uo.curArray=InitScript() if #uo.curArray<1 then return end flag.points=true for i=startSeg, endSeg do uo.curSeg=i if not uo.wholeProt then lowSeg, areaScore, data=unpack(uo.curArray[i]) else lowSeg=i end local hasLock=false for j=lowSeg, lowSeg+uo.segs-1 do if IsFrozen(j) or structure.IsLocked(j) then hasLock=true end end p(true, '--------') p(true, i18n.recipe.e2, lowSeg, lowSeg+uo.segs-1) if not uo.wholeProt then score.cycle=Score() p(false, i18n.recipe.e3, areaScore) if #data>0 then p(false, i18n.recipe.e4) p(false, data) end p(false, '---') end if not hasLock then GenerateScoreTable() DoLocalRebuild(lowSeg) selection.DeselectAll() if not uo.fastMode then TestSolutions(lowSeg) end TestScore(true) local s=Score() if uo.allowLoss and score.best-s<uo.lossThresh then save.Quicksave(1) p(true, i18n.recipe.e5, s, score.best-s) else save.Quickload(1) p(true, i18n.recipe.e6, s-score.start, s) end else p(true, i18n.recipe.e7) end end end function main() setlanguage()-- New BK 10/4/13 multilingual(uo.lang)-- New BK 10/4/13 CI(1) save.SaveSecondaryStructure() recentbest.Save() -- New BK 24/6/2013 index.scoreTypes=subscores[uo.stIndex] uo.scoringMode=subscores.mode[uo.stIndex] GenerateSeed() DetectLock() DetectFrozens() DetectMutables() DetectLigand() GetBands() local saveTxt=structure.GetNote(1) if #saveTxt>0 and saveTxt:find(uo.recipeName) then flag.save=true structure.SetNote(1,'') end if not AskOptions() then return end if uo.resumeScript then uo=RebuildArray(saveTxt) uo.resumeScript=true p(true, i18n.recipe.m1) end if uo.rebuildLoops then SetToLoop() end save.Quicksave(1) repeat repeat flag.points=false p(true, i18n.recipe.m2, uo.scoringMode, score.best) if not uo.resumeScript then loopStart=uo.contSegsMin else loopStart=uo.segs end for i=loopStart, uo.contSegsMax do uo.segs=i Ebola() end until flag.points==false if not uo.wholeProt then p(true, i18n.recipe.m3a) p(true, i18n.recipe.m3b) uo.wholeProt=true flag.points=true end until flag.points==false LastWish() end -- fin Ebola -- debut GAB function ManageBands() --if bands can't be saved, prevent gab from deleting them if index.bndCnt==0 then band.DeleteAll() else local bands=band.GetCount() if bands>index.bndCnt then for i=bands, index.bndCnt+1, -1 do band.Delete(i) end end end band.DisableAll() end function ShuffleHerd() if uo.herd.shuffle then for i=1,#critters do local r=math.random(#critters) if r~=i then critters[i],critters[r]=critters[r],critters[i] end end end end function FillHerd() --fill up herd local n=#critters if n>0 then --fill up n=uo.herd.newRandom else --fresh herd if uo.herd.maxGen~=1 and uo.herd.firstGen<uo.herd.keepBest then n=uo.herd.breedBest + uo.herd.keepBest + uo.herd.breedBastards else n=uo.herd.firstGen end end p(false, i18n.recipe.fs) for i=1,n do AddCritter() end end function AddCritter() --create new random critter local c={} critterID=critterID+1 c.no=critterID c.name=c.no..'-rnd' c.bands={} local r=math.random(uo.critter.minBands, uo.critter.maxBands) for i=1,r do table.insert(c.bands,AddBand()) end table.insert(critters, c) p(false, i18n.recipe.critter, c.name, #c.bands) end function AddBand() --create one random band local cnt=0 local b={} while true do --try till die cnt=cnt+1 local s1=math.random(segCnt) if uo.onlyMutable or #UseSegments>0 then s1=trand(UseSegments) end local s2=math.random(segCnt) if s1>s2 then s1,s2=s2,s1 end --swap local bands=uo.bands if CanBeUsed(s1,s2) then local str=randf(bands.minStr,bands.maxStr) local len=0 while true do --randomize correct distance len=randf(-bands.maxDn,bands.maxUp) if len<-bands.minChng or len>bands.minChng then break end end b={s1,s2,str,len} break end if cnt>100 then p(true, i18n.recipe.ab) BreakScript() --there is no such function, so it crashes script end end return b end function CanBeUsed(sg1,sg2) --checking end of bands function ssCheck(ss) local good=false if use.Sheet and ss=="E" then good=true end if use.Helix and ss=="H" then good=true end if use.Loop and ss=="L" then good=true end if uo.useLigand~=0 and ss=="M" then good=true end return good end function AreGood(s1,s2) --check that s1 and s2 can be used local ok=true if s2-s1<uo.bands.minSkip then ok=false end if ok and structure.GetDistance(s1,s2)<uo.bands.minDist then ok=false end return ok end local ok=AreGood(sg1,sg2) if ok and #DoNotUse>0 then --none of 2 can be in that area for start, stop in tlist(DoNotUse) do for x=start, stop do if x==sg1 or x==sg2 then ok=false break end end if not ok then break end end end if not ok then return false --if false can`t be used else ok=false if #UseSegments>0 then --at least one have to be there for i=1, #UseSegments do local r=UseSegments[i] if r==sg1 or r==sg2 then ok=true break end end else ok=true end end if ok then --check structure ok=false local ss1=structure.GetSecondaryStructure(sg1) local ss2=structure.GetSecondaryStructure(sg2) if checkBoth then if ssCheck(ss1) and ssCheck(ss2) then ok=true end else if ssCheck(ss1) or ssCheck(ss2) then ok=true end end end return ok end function ScoreHerd() --score all critters from herd save.Quickload(gabSlot) p(false, i18n.recipe.sh1, #critters) save.Quicksave(gabSlot+1) local herdScore=Score() for i, crt in ipairs(critters) do ManageBands() local s=Score() --start score for seg1, seg2, str, len in tlist(crt.bands) do local a1=5 local a2=5 if seg1==segments then a1=6 end if seg2==segments then a2=6 end local ss1=structure.GetSecondaryStructure(seg1) local ss2=structure.GetSecondaryStructure(seg2) if ss1=='M' then a1=math.random(structure.GetAtomCount(seg1)) elseif ss2=='M' then a2=math.random(structure.GetAtomCount(seg2)) else if structure.GetAminoAcid(seg1)=='g' then a1=0 end if structure.GetAminoAcid(seg2)=='g' then a2=0 end end local bc=band.AddBetweenSegments(seg1,seg2,a1,a2) band.SetStrength(bc,str) local goalLen=structure.GetDistance(seg1,seg2)+len if goalLen<uo.bands.minLen then goalLen=uo.bands.minLen end band.SetGoalLength(bc,goalLen) end local conditions=current.AreConditionsMet() selection.SelectAll() CI(uo.pullCI) recentbest.Save() Wiggle('wb', 1) ManageBands() SaveRB() CI(1) local test=true if uo.critter.keepConditions then if conditions then test=current.AreConditionsMet() end end local delta=s-Score() test=uo.critter.giveUp>delta and test if test then if math.abs(delta) > uo.qstabThresh then Qstab() else Wiggle() end SaveRB() if (bestScore-Score())<uo.fuzeThresh then Fuze() end end local s2=Score() p(false, i18n.recipe.sh2a, crt.name, s2-s) if not test then p(false, i18n.recipe.sh2b) end if uo.critter.maxLoss>0 then if s2>herdScore-uo.critter.maxLoss then if s2<bestScore-uo.critter.totalLoss then save.Quickload(gabSlot) else save.Quicksave(gabSlot+1) herdScore=s2 end else save.Quickload(gabSlot+1) end else save.Quickload(gabSlot) end end save.Quickload(gabSlot) end function BreedCritters(mom,dad,t) --breed 2 critters. bands are taken randomly local kid={} critterID=critterID+1 kid.no=critterID kid.name=kid.no.."-"..t..mom.no..'/'..dad.no kid.bands={} local mb=#mom.bands local db=#dad.bands if mb>db then mb,db=db,mb end --kid have bands count between mom and dad bands local bn=math.random(mb,db) for i=1,bn,2 do table.insert(kid.bands, trand(mom.bands)) table.insert(kid.bands, trand(dad.bands)) end p(false, i18n.recipe.critter, kid.name, #kid.bands) return kid end function KeepGood() --copy best scoring critters form last gen if score above local newHerd={} for i=1,uo.herd.keepBest do if critters[i].score==nil then critters[i].score=0 end -- bug nil BK 27/4/2013 if critters[i].score>uo.critter.keepScore and (math.abs(critters[i].score)>0.1 or critters[i].score>0) then table.insert(newHerd, critters[i]) end end return newHerd end function BreedHerd() p(false, i18n.recipe.bh) table.sort(critters, SortC) newHerd=KeepGood() for i=1, uo.herd.breedBest do local mom=critters[i] if mom.score>uo.critter.breedScore or i<2 then --breed only good ones, 1st is always bred anyway for j=i+1, uo.herd.breedBest do local dad=critters[j] table.insert(newHerd, BreedCritters(mom,dad,"kid-")) table.insert(newHerd, BreedCritters(dad,mom,"kid-")) end end end for i=1, uo.herd.breedBastards do --they will always appear ;] local mom=critters[i] local j=math.random(uo.herd.breedBastards+1,#critters) local dad=critters[j] table.insert(newHerd, BreedCritters(mom,dad,"bas-")) table.insert(newHerd, BreedCritters(dad,mom,"bas-")) end critters=newHerd FillHerd() end function GAB() flag.gab=true if uo.onlyMutable then for i=1,segCnt do if structure.IsMutable(i) then table.insert(UseSegments, i) end end end if #AlwaysUse>0 then for ss, se in tlist(AlwaysUse) do --~ if ss>se then ss,se=se,ss end --automated, no check needed if se==nil then table.insert(UseSegments, ss) else for j=ss,se do table.insert(UseSegments, j) end end end AlwaysUse={} --added to list, no need to check later end bestScore=Score() critterID=0 gen=0 ss=Score() save.Quicksave(gabSlot) recentbest.Save() p(true, i18n.recipe.g1) critters={} FillHerd() badGen=0 while true do --this is (almost) endless script ;] genScore=Score() gen=gen+1 ShuffleHerd() -- changed BK 18/3/2013 -- if was redondant: if uo.herd.shuffle then ShuffleHerd() end ScoreHerd() save.Quickload(gabSlot) if gen==uo.herd.maxGen then break end --end of script local genScore2=Score() if genScore>=genScore2 then badGen=badGen+1 if badGen==uo.herd.maxBadGen then break end else badGen=0 end p(true, i18n.recipe.g2, gen, genScore2, genScore2-genScore) if badGen>=uo.herd.renew then p(false, i18n.recipe.g3) critters={} FillHerd() badGen=0 else BreedHerd() end end p(true, i18n.recipe.g4, Score(), Score()-ss) flag.gab=false end -- fin GAB -- dialogues, debug, lancement function MakeFancyHeader(s) return '----- '..s..' '..string.rep('-', 54-#s-7) end function SetAndFlag(dial, var, sub) -- fonction de sauvegarde local val=dial[var].value if not sub then uo[var]=val else uo[sub][var]=val end end function AskOptions() local ask=dialog.CreateDialog(i18n.ask.options.mainTitle) repeat ask.l1=dialog.AddLabel(MakeFancyHeader(i18n.ask.options.l1)) ask.contSegsMin=dialog.AddSlider(i18n.ask.options.contSegsMin, uo.contSegsMin, 1, 20, 0) ask.contSegsMax=dialog.AddSlider(i18n.ask.options.contSegsMax, uo.contSegsMax, 1, 20, 0) ask.numSegs=dialog.AddSlider(i18n.ask.options.numSegs,uo.numSegs, 1, 50, 0) ask.wholeProt=dialog.AddCheckbox(i18n.ask.options.wholeProt, uo.wholeProt) ask.l2=dialog.AddLabel(MakeFancyHeader(i18n.ask.options.l2)) ask.rebuildNum=dialog.AddSlider(i18n.ask.options.rebuildNum, uo.rebuildNum, 1, 200, 0) ask.solsPerScore=dialog.AddSlider(i18n.ask.options.solsPerScore, uo.solsPerScore, 1, 20, 0) ask.l3=dialog.AddLabel(MakeFancyHeader(i18n.ask.options.l3)) ask.scoreFilter=dialog.AddSlider(i18n.ask.options.scoreFilter, uo.scoreFilter, 0, 50, 0) ask.passGAB = dialog.AddCheckbox(i18n.ask.options.passGAB, uo.passGAB) ask.l4=dialog.AddLabel(MakeFancyHeader(i18n.ask.options.l4)) ask.allowLoss=dialog.AddCheckbox(i18n.ask.options.allowLoss, uo.allowLoss) ask.lossThresh=dialog.AddSlider(i18n.ask.options.lossThresh, uo.lossThresh, 1, 200, 0) ask.l5=dialog.AddLabel(MakeFancyHeader(i18n.ask.options.l5)) ask.rebuildLoops = dialog.AddCheckbox(i18n.ask.options.rebuildLoops, uo.rebuildLoops) ask.fastMode = dialog.AddCheckbox(i18n.ask.options.fastMode, uo.fastMode) ask.fastFuse=dialog.AddCheckbox(i18n.ask.options.fastFuse, uo.fastFuse) if flag.mutable then ask.mutateOnce=dialog.AddCheckbox(i18n.ask.options.mutateOnce,uo.mutateOnce) end if flag.save then ask.resumeScript=dialog.AddCheckbox(i18n.ask.options.resumeScript,uo.resumeScript) end ask.ok = dialog.AddButton(i18n.ask.ok, 1) ask.cancel = dialog.AddButton(i18n.ask.cancel, 0) ask.advanced=dialog.AddButton(i18n.ask.options.advanced, 2) ask.GABOptions=dialog.AddButton(i18n.ask.options.GABOptions, 3) askresult=dialog.Show(ask) if askresult > 0 then SetAndFlag(ask, 'contSegsMin') SetAndFlag(ask, 'contSegsMax') SetAndFlag(ask, 'numSegs') SetAndFlag(ask, 'wholeProt') SetAndFlag(ask, 'rebuildNum') SetAndFlag(ask, 'solsPerScore') SetAndFlag(ask, 'scoreFilter') SetAndFlag(ask, 'passGAB') SetAndFlag(ask, 'allowLoss') SetAndFlag(ask, 'lossThresh') SetAndFlag(ask, 'rebuildLoops') SetAndFlag(ask, 'fastMode') SetAndFlag(ask, 'fastFuse') if flag.mutable then SetAndFlag(ask, 'mutateOnce') end if flag.save then SetAndFlag(ask, 'resumeScript') end if askresult==2 then AskAdvanced() elseif askresult==3 then AskGABOptions() end end until askresult<2 return askresult > 0 end function AskGABOptions() local ask=dialog.CreateDialog(i18n.ask.gab.mainTitle) ask.l1=dialog.AddLabel(MakeFancyHeader(i18n.ask.gab.l1)) ask.totalLoss=dialog.AddSlider(i18n.ask.gab.totalLoss,uo.critter.totalLoss,0,100,0) ask.maxGen=dialog.AddSlider(i18n.ask.gab.maxGen,uo.herd.maxGen,1,50,0) ask.l2=dialog.AddLabel(i18n.ask.gab.l2) ask.renew=dialog.AddSlider(i18n.ask.gab.renew,uo.herd.renew,1,50,0) ask.maxBadGen=dialog.AddSlider(i18n.ask.gab.maxBadGen,uo.herd.maxBadGen,1,50,0) ask.l3=dialog.AddLabel(MakeFancyHeader(i18n.ask.gab.l3)) ask.firstGen=dialog.AddSlider(i18n.ask.gab.firstGen,uo.herd.firstGen,1,50,0) ask.maxLoss=dialog.AddSlider(i18n.ask.gab.maxLoss,uo.critter.maxLoss,0,100,0) ask.giveUp=dialog.AddSlider(i18n.ask.gab.giveUp,uo.critter.giveUp,0,500,0) ask.keepConditions=dialog.AddCheckbox(i18n.ask.gab.keepConditions,uo.critter.keepConditions) ask.fuzeThresh=dialog.AddSlider(i18n.ask.gab.fuzeThresh,uo.fuzeThresh,-.001,50,0) if flag.ligand then ask.l4=dialog.AddLabel(MakeFancyHeader(i18n.ask.gab.l4)) ask.l5=dialog.AddLabel(i18n.ask.gab.l5) ask.useLigand=dialog.AddSlider(i18n.ask.gab.useLigand,uo.useLigand,0,2,0) end ask.ok = dialog.AddButton(i18n.ask.ok,1) dialog.Show(ask) SetAndFlag(ask, 'maxGen', 'herd') SetAndFlag(ask, 'firstGen', 'herd') SetAndFlag(ask, 'renew', 'herd') SetAndFlag(ask, 'maxBadGen', 'herd') SetAndFlag(ask, 'maxLoss', 'critter') SetAndFlag(ask, 'totalLoss', 'critter') SetAndFlag(ask, 'giveUp', 'critter') SetAndFlag(ask, 'keepConditions', 'critter') SetAndFlag(ask, 'fuzeThresh') if flag.ligand then SetAndFlag(ask, 'useLigand') end end function AskAdvanced() local ask=dialog.CreateDialog(i18n.ask.advanced.mainTitle) ask.l1=dialog.AddLabel(MakeFancyHeader(i18n.ask.advanced.l1)) ask.minRebuild=dialog.AddSlider(i18n.ask.advanced.minRebuild,uo.minRebuild,0,5000,0) ask.maxRebuild=dialog.AddSlider(i18n.ask.advanced.maxRebuild,uo.maxRebuild,0,1,3) ask.l2=dialog.AddLabel(MakeFancyHeader(i18n.ask.advanced.l2)) ask.l3=dialog.AddLabel(i18n.ask.advanced.l3) ask.stIndex=dialog.AddSlider(i18n.ask.advanced.stIndex,uo.stIndex,1,4,0) ask.l4=dialog.AddLabel(MakeFancyHeader(i18n.ask.advanced.l4)) ask.l5=dialog.AddLabel(i18n.ask.advanced.l5) ask.forceZoneStr=dialog.AddTextbox(i18n.ask.advanced.forceZoneStr, uo.forceZoneStr) ask.zoneWalk = dialog.AddCheckbox(i18n.ask.advanced.zoneWalk, uo.zoneWalk) ask.l6=dialog.AddLabel(MakeFancyHeader(i18n.ask.advanced.l6)) ask.autoGab=dialog.AddCheckbox(i18n.ask.advanced.autoGab,uo.autoGab) ask.gabThresh=dialog.AddSlider(i18n.ask.advanced.gabThresh,uo.gabThresh,0,50,0) ask.l7=dialog.AddLabel(MakeFancyHeader(i18n.ask.advanced.l7)) ask.rebuildCI=dialog.AddSlider(i18n.ask.advanced.rebuildCI,uo.rebuildCI,0,1,2) ask.preciseBands=dialog.AddCheckbox(i18n.ask.advanced.preciseBands,uo.preciseBands) ask.rebuildBest=dialog.AddCheckbox(i18n.ask.advanced.rebuildBest,uo.rebuildBest) ask.verbose=dialog.AddCheckbox(i18n.ask.advanced.verbose,uo.verbose) -- desactive (bug) BK 22/3/13 ask.ok = dialog.AddButton(i18n.ask.ok,1) dialog.Show(ask) SetAndFlag(ask, 'minRebuild') SetAndFlag(ask, 'maxRebuild') SetAndFlag(ask, 'stIndex') index.scoreTypes=subscores[ask.stIndex.value] uo.scoringMode=subscores.mode[uo.stIndex] if ask.forceZoneStr.value~='' then for a,b in ask.forceZoneStr.value:gmatch('(%d+),(%d+)') do table.insert(uo.forceZone,{a,b}) end else uo.forceZone={} end SetAndFlag(ask, 'forceZoneStr') SetAndFlag(ask, 'zoneWalk') SetAndFlag(ask, 'autoGab') SetAndFlag(ask, 'gabThresh') SetAndFlag(ask, 'rebuildCI') SetAndFlag(ask, 'preciseBands') SetAndFlag(ask, 'rebuildBest') SetAndFlag(ask, 'verbose') -- desactive (bug) BK 22/3/13 end function DumpErr(err) start,stop,line,msg=err:find(":(%d+):%s()") err=err:sub(msg,#err) p(true, '---') if err:find('Cancelled')~=nil then p(true, i18n.recipe.de1) else p(true, i18n.recipe.de2) p(true, i18n.recipe.de3, line) p(true, i18n.recipe.de4, err) end LastWish() end function LastWish() p(true, i18n.recipe.lw1) recentbest.Save() for i=1, fuseSlot do save.Quickload(i) end save.Quickload(1) if uo.rebuildLoops then p(true, i18n.recipe.lw2) save.LoadSecondaryStructure() end if #index.bands>0 then p(true, i18n.recipe.lw3) RestoreBands() end p(true, i18n.recipe.lw4) structure.SetNote(1,ConcatArray(uo)) CI(1) end xpcall(main, DumpErr) --~ main()

Comments


Bruno Kestemont Lv 1

DRW+GAB

Find worst segments, tries several Deep Rebuilds, Fuzes the best solution then GAB (bands) the best fuzed solution,
Go to next worst segments etc.

A lot of options are available (after automatic check of pertinent options like mutable or not etc): segment min en max lengths, filters to start or not Fuze and GAB, all to loop or not, etc.

On cancel, restores the best structures and keeps track of the latest options in a note in segment 1. This allows to restart from previous activity.

Bruno Kestemont Lv 1

The original author is Jean-Bob

He agreed to share this recipe once translated to English. Now he takes some long holliday.

All other versions are in Fench.

NEW to ver 1.11.6 = English version

L'Aliance Francophone hopes you will enjoy.

Please report bugs by copy-paste of what is written in Note of segment 1 and send it to this page.

Bruno

Bruno Kestemont Lv 1

The original author is Jean-Bob

He agreed to share this recipe once translated to English. Now he takes some long holliday.

All other versions are in French.

NEW to ver 1.11.6 = English version

L'Aliance Francophone hopes you will enjoy.

Please report bugs by copy-paste of what is written in Note of segment 1 and send it to this page.

Bruno

Roukess Lv 1

This recipe combines the power of the rebuilds from DRW with the ability of GAB to increase the score by banding some segments.
Moreover, we made some improvements :
Whole prot : The possibility to rebuild and GAB one by one each segments of the protein, from segment 1 to segment max.
ScoreFilter : Select the minimum score required to launch GAB. Tick "Do not launch GAB" if you only want to rebuild and fuse.
Allow loss : Ebola will not restore the highscore if the score is included in this Loss threshold
FastFuse : Use 1 fuse instead of 5
Saving module : If you tick the "Start again since the last stop" box, Ebola will restart at the same segment as before stopping the last Ebola run. The data from the last run is stored in a note on segment 1
Language : The structure of the script permits to translate very easily the dialogs in many languages.

"More" options :
Rebuild Filter : Skip wiggle after the rebuild if the score is not included between these 2 values compared to the highscore (highscore-Minfilter<score<highscore-Maxfilter)
Subscore management : Consider only one of these subscores to define the worse segments
ForceZone : Rebuild only a selected part of the protein. It is possible to enter many zones. Tick "Walk in the Forcezone" to rebuild from the first to the last segment each zones.
Launch automatically GAB : Launch automatically GAB if the threshold is exceeded
Precise band : Bands from GAB always start from next to the rebuild segments.
Display more information : Display more information in the output of the recipe

"GAB" options :
Number of critters, generations and allowed loss

Nevertheless, it takes a lot of time for each cycle. Excellent recipe for an overnight folding!

Bruno Kestemont Lv 1

Now bilingual: L'Alliance Francophone and marie_s get it in French. Please contact me if you want other linguistic versions, or if you want to see it in French.

JDScienceTeacher Lv 1

maxContSegs:10 forceZone, allowLoss:true scoringMode:Backbone curSeg:1 herd,renew:4,firstGen:10,breedBest:3,breedBastards:2,keepBest:5,newRandom:4,maxBadGen:6,shuffle:true,maxGen:2 mutateAlways:false contSegsMax:12 solsPerScore:2 qstabThresh:1 onlyMutable:false rebuildCI:0.8 contSegsMin:7 useLigand:false passGAB:false mutateOnceCI:0.21 scoreFilter:20 fastMode:false fastFuse:false rebuildLoops:true curArray,1 1:11 2:-51.082419025879 3:* backbone:-51.082419025879                                
,2 1:10 2:-49.729362534766 3:* backbone:-49.729362534766                                
,3 1:12 2:-44.991079450522 3:* backbone:-44.991079450522                                
,4 1:9 2:-44.057049192758 3:* backbone:-44.057049192758                                
,5 1:28 2:-43.071154704375 3:* clashing:-43.071154704375                                
,6 1:30 2:-42.216364566698 3:* clashing:-42.216364566698                                
,7 1:29 2:-41.344078640533 3:* clashing:-41.344078640533                                
,8 1:31 2:-40.272502654169 3:* clashing:-40.272502654169                                
,9 1:32 2:-39.373918562726 3:* clashing:-39.373918562726                                
,10 1:45 2:-38.797102945374 3:* backbone:-38.797102945374                                
,11 1:48 2:-38.456597845988 3:* backbone:-38.456597845988                                
,12 1:65 2:-37.656429921894 3:* clashing:-37.656429921894                                
,13 1:27 2:-37.302348497267 3:* clashing:-37.302348497267                                
,14 1:63 2:-37.195951382538 3:* clashing:-37.195951382538                                
rebuildBest:false mutateOnce:false minRebuild:5000 bands,maxUp:6.1,minChng:3,minDist:4,minStr:0.3,minLen:2,minSkip:5,maxStr:1.1,maxDn:6.9 critter,breedScore:-20,maxBands:5,keepConditions:true,minBands:2,totalLoss:90,keepScore:-50,maxLoss:0,giveUp:200 fuzeThresh:10 preciseBands:false fastQstab:true maxCI:1 resumeScript:false pullCI:0.55 subscores,1 1:clashing 2:packing 3:hiding 4:bonding 5:backbone 6:sidechain 7:disulfides 8:other,2 1:clashing 2:packing 3:backbone,3 1:hiding 2:bonding 3:sidechain,4 1:other,mode 1:All 2:Backbone 3:Sidechain 4:Other energy:false maxVal:-5 forceZoneStr: recipeName:EbolaRebuild stIndex:2 verbose:false wholeProt:false rebuildNum:30 autoGab:true segs:7 maxRebuild:0.001 lossThresh:200 gabThresh:30 zoneWalk:false numSegs:14