Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Scaffolding by Crashguard303
- -- Script request by Mat747
- -- Included faster band removing, submitted by rav3n_pl
- -- Applies bands between segments,
- -- if their SPATIAL and INDEX distance is inbetween an user-specified range,
- -- resulting a relative position lock of these segments (scaffolding).
- -- NOTE:
- -- At the moment, FoldIt doesn't allow us to set band lengths greater than 20.
- -- We can't apply bands between adjacent segments, so these are skipped
- function YesNo(Bool)
- local OS
- if Bool then
- OS="yes"
- else
- OS="no"
- end -- if BOOL
- return OS
- end -- function
- function ss_check(SegA,SegB)
- local SegAss=structure.GetSecondaryStructure(SegA)
- local SegBss=structure.GetSecondaryStructure(SegB)
- local ss_flag=false
- if SegAss~=SegBss then -- if secondary structure is unequal
- if Band_ss_mixed then -- And connecting mixed ss is okay
- ss_flag=true
- end -- if BandMixeed
- else -- so if ss is equal
- if Band_ss_equal[SegAss]then
- ss_flag=true
- end -- if Band_ss_equal
- end -- if SegAss unequal
- return ss_flag
- end -- function
- function DistanceCheck(k,l)
- local k=k
- local l=l
- local Distance=structure.GetDistance(k,l) -- get distance
- local DistanceFlag=false
- if Distance>=MinSdist then -- above or equal minimum?
- if Distance<=MaxSdist then -- below or equal maximum?
- DistanceFlag=true
- end -- if Distance
- end -- if Distance
- if Band_Invert_Result then DistanceFlag=not(DistanceFlag) end -- Invert result, if desired
- return Distance,DistanceFlag
- end -- function
- function Scaffolding()
- print("Executing...")
- if Band_DeleteAll_Before then
- print("Deleting old bands.")
- band.DeleteAll()
- end
- local kFinish=NumSegs-MinIdist
- local k
- for k=1,kFinish do -- k=first segment index to check
- local lStart=k+MinIdist
- local lFinish=k+MaxIdist
- if lFinish>NumSegs then lFinish=NumSegs end
- local l
- for l=lStart, lFinish do -- l=second segment index to check
- Distance,DistanceFlag=DistanceCheck(k,l) -- Get distance and distance flag
- if DistanceFlag then -- Does distance match?
- if ss_check(k,l) then -- Do secondary structures match?
- local OS="Connecting "..k..":"..l.." distance:"..Distance
- print(OS) -- Show
- band.AddBetweenSegments(k,l) -- Connect
- local TempBandCount=band.GetCount() -- Get new band amount
- Distance=Distance*Band_DistFactor -- Change distance value by applying Factor
- band.SetGoalLength(TempBandCount,Distance) -- Change length of last band
- band.SetStrength(TempBandCount,Band_Strength) -- Change strength of last band
- end -- if ss_check
- end -- if DistanceFlag
- end -- l loop
- end -- k loop
- print("Finished.")
- end -- function
- function InputDialog ()
- local ask = dialog.CreateDialog("Set parameters")
- ask.Band = dialog.AddLabel("Band which secondary structure:")
- ask.Helixes = dialog.AddCheckbox("Helix-Helix", Band_ss_equal["H"])
- ask.Sheets = dialog.AddCheckbox("Sheet-Sheet", Band_ss_equal["E"])
- ask.Loops = dialog.AddCheckbox("Loop-Loop", Band_ss_equal["L"])
- ask.Mixed = dialog.AddCheckbox("Mixed", Band_ss_mixed)
- ask.Distance = dialog.AddLabel("Band which distance:")
- ask.MinIdist = dialog.AddSlider("Min INDEX:", MinIdist, 2, (NumSegs-1), 0)
- ask.MaxIdist = dialog.AddSlider("Max INDEX:", MaxIdist, 2, (NumSegs-1), 0)
- ask.MinSdist = dialog.AddSlider("Min SPATIAL:", MinSdist, 0, ((NumSegs-1)*4), 1)
- ask.MaxSdist = dialog.AddSlider("Max SPATIAL:", MaxSdist, 0, ((NumSegs-1)*4), 1)
- ask.Properties = dialog.AddLabel("Band properties:")
- ask.Band_DistFactor = dialog.AddSlider("Band Factor", Band_DistFactor, 0.0, 10.0, 1)
- ask.Band_Strength = dialog.AddSlider("Band Strength", Band_Strength, 0.1, 10.0, 1)
- ask.Band_DeleteAll_Before = dialog.AddCheckbox("Delete all other bands before", Band_DeleteAll_Before)
- ask.Band_Invert_Result = dialog.AddCheckbox("Invert banding result (careful with this option!)", Band_Invert_Result)
- ask.OK = dialog.AddButton("OK", 1)
- ask.Cancel = dialog.AddButton("Cancel", 0)
- if dialog.Show(ask)>0 then -- If OK was pressed
- Band_ss_equal["H"]=ask.Helixes.value
- Band_ss_equal["E"]=ask.Sheets.value
- Band_ss_equal["L"]=ask.Loops.value
- Band_ss_mixed=ask.Mixed.value
- MinIdist=ask.MinIdist.value
- MaxIdist=ask.MaxIdist.value
- MinSdist=ask.MinSdist.value
- MaxSdist=ask.MaxSdist.value
- if MinIdist>MaxIdist then MinIdist,MaxIdist=MaxIdist,MinIdist end
- -- If Min>Max, swap them because it wouldn't make sense
- if MinSdist>MaxSdist then MinSdist,MaxSdist=MaxSdist,MinSdist end
- -- If Min>Max, swap them because it wouldn't make sense
- Band_DistFactor=ask.Band_DistFactor.value
- Band_Strength=ask.Band_Strength.value
- Band_DeleteAll_Before=ask.Band_DeleteAll_Before.value
- Band_Invert_Result=ask.Band_Invert_Result.value
- return true
- else -- If OK was not pressed
- print("Canceled.")
- return false
- end -- if dialog.Show(ask)
- end -- function
- -- Default parameters:
- NumSegs=structure.GetCount()
- -- Get amount of segments
- Band_ss_equal={}
- -- Initialize table containing information which equal secondary structures are allowed to be banded
- Band_ss_equal["L"]=false
- -- Boolean value. If true, banding loop to loop is allowed
- Band_ss_equal["H"]=true
- -- Boolean value. If true, banding helix to helix is allowed
- Band_ss_equal["E"]=false
- -- Boolean value. If true, banding sheet to sheet is allowed
- Band_ss_mixed=false
- -- Boolean value. If true, banding mixed secondary structures is allowed
- -- Note: If you change Band_ss_mixed,BandLoops,BandHelices AND BandSheets to false,
- -- NO band will be applied. You will just waste some of your precious time.
- MinIdist=3
- -- Minimum INDEX segment distance to band, INTEGER value
- -- Minimum value:2,
- -- because the game doesn't connect bands if the segments are too close
- MaxIdist=4
- -- MaxIdist=NumSegs-1
- -- Maximum INDEX segment distance to band, INTEGER value
- MinSdist=4
- -- Minimum SPATIAL segment distance to band, FLOAT value
- MaxSdist=8
- -- Maximum SPATIAL segment distance to band, FLOAT value
- Band_DistFactor=1
- -- Factor, which changes the band length according to its spatial distance, float value, >=0
- -- values<1 pull segments together,
- -- values keep them in postion,
- -- values>1 push them apart
- Band_Strength=1
- -- Band strength of the scaffold, float value
- -- Examples:
- -- If a segment distance is 4, and factor is 2, the band length will be 8.
- -- If a segment distance is 4, and factor is .5, the band length will be 2.
- Band_DeleteAll_Before=false
- -- delete all bands before script start, boolean value
- -- If true, all existing bands are deleted before script is executed.
- -- If false, previous bands are kept, however.
- Band_Invert_Result=false
- -- Distance inverting, boolean value
- -- Set this to true if you want to invert spatial distance banding
- -- Be careful with this option, it can create many bands if MinSdist and MaxSdist are close!
- if InputDialog() then
- -- Show/change values with input dialog
- -- If OK was pressed
- Scaffolding()
- -- call script with set parameters
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement