Icon representing a recipe

Recipe: Loop explorer 1.0 With Mutate

created by phallicies

Profile


Name
Loop explorer 1.0 With Mutate
ID
44633
Shared with
Public
Parent
Loop explorer 1.0
Children
None
Created on
November 17, 2012 at 06:05 AM UTC
Updated on
November 17, 2012 at 06:05 AM UTC
Description

Added Mutate

Best for


Code


-- Repeatedly rebuild/shake/wiggle a particular segment -- Constants kWorstAllowableAngle = 75 -- ignore rebuilds with backbone angles less than this (degrees) kMaxSphereDistance = 13 -- Residues further than this away won't be shaken -- Globals best_score = 0 min_residue = 0 max_residue = 0 n_residues = 0 rb = 0 SphereSegList = {} -- store list of residues within kMaxSphereDistance of any residue in the segment. -- speeds things up when shaking best_post_rebuild_weighted_score_delta_1 = 999999 best_post_rebuild_weighted_score_delta_2 = 999999 -- Difference heuristic variables weight_by_difference = false closest_to_mid = -1 init_differences = {} curr_differences = {} -- Quicksave slots kOriginalStructureOrNewBest = 1 kTemp = 2 kPostRebuild_1 = 11 kPostRebuild_2 = 12 function r3 ( x ) -- Round to 3 decimal places t = 10 ^ 3 return math.floor ( x*t + 0.5 ) / t end function GetScore () score = current.GetEnergyScore () return score end function FindResidueClosestToMidRebuild ( start_idx , end_idx ) mid_x = ( start_idx + end_idx ) / 2 closest_to_mid = -1 cv = 999999 for i = 1 , n_residues do if ( i < start_idx or i > end_idx ) then d = structure.GetDistance ( i , mid_x ) if ( d < cv ) then closest_to_mid = i cv = d end end end end function FindDifferenceValues ( table , start_idx , end_idx ) for i = start_idx , end_idx do table [ i ] = structure.GetDistance ( i , mid_x ) end end function ComputeDifferenceHeuristic ( start_idx , end_idx ) d = 0 for i = start_idx , end_idx do d = d + ( init_differences [ i ] - curr_differences [ i ] ) * ( init_differences [ i ] - curr_differences [ i ] ) end return ( math.sqrt ( d ) ) end function ComputeWeightedDifference ( score , dh ) if ( dh < 1e-5 ) then return 1e10 else return ( best_score - score ) / dh end end function ConstructListOfResiduesWithinRange ( start_idx , end_idx ) -- Mildly inefficient but it's only done once at startup for i = 1 , n_residues do SphereSegList [ i ] = false end for j = start_idx , end_idx do for i = 1 , n_residues do if ( ( i >= start_idx and i <= end_idx ) or ( structure.GetDistance ( i , j ) < kMaxSphereDistance ) ) then SphereSegList [ i ] = true end end end end function SelectSphere () selection.DeselectAll () for i = 1 , n_residues do if ( SphereSegList [ i ] == true ) then selection.Select ( i ) end end end function get_parameters () local dlog = dialog.CreateDialog ( "Loop explorer" ) dlog.min_residue = dialog.AddSlider ( "Min residue" , 1 , 1 , n_residues , 0 ) dlog.max_residue = dialog.AddSlider ( "Max residue" , n_residues , 1 , n_residues , 0 ) dlog.weight_difference = dialog.AddCheckbox ( "Weight according to difference" , weight_by_difference ) dlog.ok = dialog.AddButton ( "OK" , 1 ) dlog.cancel = dialog.AddButton ( "Cancel" , 0 ) if ( dialog.Show ( dlog ) > 0 ) then min_residue = dlog.min_residue.value max_residue = dlog.max_residue.value weight_by_difference = dlog.weight_difference.value return true else return false end end function NudgeWiggle () selection.SelectAll () score_in_kTemp = GetScore () save.Quicksave ( kTemp) behavior.SetClashImportance ( 0.7 ) structure.WiggleSelected ( 1 ) behavior.SetClashImportance ( 1 ) structure.WiggleSelected ( 6 ) score = GetScore () if ( score < score_in_kTemp ) then save.Quickload ( kTemp ) end end function rebuild_section ( start_idx , end_idx ) save.Quickload ( kOriginalStructureOrNewBest ) selection.DeselectAll () selection.SelectRange ( start_idx , end_idx ) structure.RebuildSelected ( 1 ) score_after_rebuild_shake = GetScore () SelectSphere () structure.MutateSidechainsSelected ( 1 ) score_after_rebuild_shake = GetScore () selection.SelectAll () structure.WiggleSelected ( 10 ) score_after_wiggle = GetScore () if ( score_after_wiggle - score_after_rebuild_shake < 10 ) then -- The wiggle got stuck and didn't achieve anything NudgeWiggle () score_after_wiggle = GetScore () end if ( weight_by_difference == true ) then FindDifferenceValues ( curr_differences , min_residue , max_residue ) dh = ComputeDifferenceHeuristic ( start_idx , end_idx ) wd = ComputeWeightedDifference ( score_after_wiggle , dh ) else wd = best_score - score_after_wiggle dh = 1 end if ( score_after_wiggle > best_score ) then best_score = score_after_wiggle save.Quicksave ( kOriginalStructureOrNewBest ) print ( "rb : " .. rb .. " Improvement to " .. r3 ( score_after_wiggle ) ) --print ( " dh " , r3 ( dh ) ) elseif ( wd < math.max ( best_post_rebuild_weighted_score_delta_1 , best_post_rebuild_weighted_score_delta_2 ) ) then if ( best_post_rebuild_weighted_score_delta_1 > best_post_rebuild_weighted_score_delta_2 ) then slot = kPostRebuild_1 best_post_rebuild_weighted_score_delta_1 = wd else slot = kPostRebuild_2 best_post_rebuild_weighted_score_delta_2 = wd end save.Quicksave ( slot ) print ( "rb : " .. rb .. " Storing " .. r3 ( score_after_wiggle ) .. " in quicksave " .. slot ) --print ( " dh " , r3 ( dh ) ) --print ( " wd " , r3 ( wd ) ) else print ( "rb : " .. rb ) --print ( "rb : " .. rb .. " dh " , r3 ( dh ) ) end end function main() band.DisableAll () n_residues = structure.GetCount () rb = 0 save.Quicksave ( kOriginalStructureOrNewBest ) behavior.SetClashImportance ( 1 ) if ( get_parameters () == false ) then return -- graceful exit end best_score = GetScore () print ( "Start score : " .. r3 ( best_score ) ) if ( max_residue <= min_residue ) then print ( "Rebuild range error." ) print ( "Max residue (" .. max_residue .. ") must be greater than or equal to Min residue (" .. min_residue .. ")" ) return end print ( "Rebuilding " .. min_residue .. " to " .. max_residue ) ConstructListOfResiduesWithinRange ( min_residue , max_residue ) cos_worst_allowable_angle = math.cos ( math.rad ( kWorstAllowableAngle ) ) FindResidueClosestToMidRebuild ( min_residue , max_residue ) FindDifferenceValues ( init_differences , min_residue , max_residue ) store_next_post_rebuild_in_1 = true while true do rb = rb + 1 rebuild_section ( min_residue , max_residue ) end save.Quickload ( kOriginalStructureOrNewBest ) band.EnableAll () end function cleanup () print ( "Cleaning up" ) behavior.SetClashImportance ( 1.0 ) save.Quickload ( kOriginalStructureOrNewBest ) band.EnableAll () end --main () xpcall ( main , cleanup )

Comments