Code
-- created by Nicm25;
function pldc()
local retd=dialog.CreateDialog("BlizzardsBurner Ver 1.00")
retd.la=dialog.AddLabel(" inside.. ..none.. ..outside")
retd.si=dialog.AddSlider("threshold",0.5,-1.0,1.0,2)
retd.ck=dialog.AddCheckbox("bone only",false)
retd.ca=dialog.AddCheckbox("as one",false)
retd.cr=dialog.AddCheckbox("reset freezes",true)
retd.bt=dialog.AddButton("OK",1)
return retd
end
function plfa(avx,avy,avz)
local lc=1
local retv=0.0
for lc=avx,avy do
if avz-lc>1.5 or avz-lc<-1.5 then
retv=structure.GetDistance(avz,lc)+retv
end
end
return retv
end
function plfb(avx,avy)
local retv=(avy>1.0 and 2.0-avx or avx)-avy
return retv>0.0 and(retv>0.25 and 2 or 1)or 0
end
function plfc(avx,avy,avz,ava,avb)
local lc=1
local lfx=avz-(avz>2.5 and 2 or 0)
selection.DeselectAll()
for lc=1,avy-avx+1 do
if ava[lc]>lfx-0.5 and(avz<2.5 or avb[avx+lc-1]>0.5) then
selection.Select(avx+lc-1)
end
end
end
function plss()
local lc=1
local retd={}
for lc=1,structure.GetCount() do
retd[lc]=selection.IsSelected(lc) and 1 or 0
end
return retd
end
function run(avs,avx,avy,avz,ava)
local segs=1
local sege=0
local stcc=0.0
local stco=0.0
local stct={}
local stcv={}
local lc=0
local setbb=false
local setth=0.0
if avx<-1.001 or avx>1.001 then
return 1
end
setbb=avy and true or false
if ava then
freeze.UnfreezeAll()
end
setth=1.0-avx*2.0
if setth>1.0 then
setth=4.001-setth
end
sege=#avs
if not(avz) then
for lc=segs+1,sege do
if structure.GetDistance(lc-1,lc)>7.5 then
segs=lc
end
if avs[lc]>0.5 then
break
end
end
for lc=1+segs,sege do
if avs[lc]>0.5 then
sege=#avs
elseif structure.GetDistance(lc-1,lc)>7.5 and #avs-sege<0.5 then
sege=lc-1
end
end
end
if sege-segs<3.5 then
print("not supported small peptide")
return 1
end
stcv[1]=0.0
stcv[2]=plfa(segs,sege,segs)
stcv[3]=plfa(segs,sege,segs+1)
stcc=(stcv[2]-stcv[3]-structure.GetDistance(segs+1,segs+2))/(sege-segs+1)
stct[1]=plfb(stcc*0.25-0.25,setth)
for lc=segs+1,sege-1 do
stcv[1]=stcv[2]
stcv[2]=stcv[3]
stcv[3]=0.0
if structure.IsLocked(lc) then
stcc=-10.0
else
if stcv[1]<1.0 then
stcv[1]=plfa(segs,sege,lc-1)
end
if stcv[2]<1.0 then
stcv[2]=plfa(segs,sege,lc)
end
stcv[3]=plfa(segs,sege,lc+1)
stcv[4]=structure.GetDistance(lc-1,lc+1)
stcc=stcv[2]/(sege-segs+1)
stco=stcv[1]+stcv[3]-stcv[4]*2.0
if lc-segs>1.5 then
stco=stco+structure.GetDistance(lc-2,lc-1)
end
if sege-lc>1.5 then
stco=stco+structure.GetDistance(lc+1,lc+2)
end
stco=stco/((sege-segs+1)*2.0)
stcc=(stcc-stco)/(8.0-stcv[4])
end
stct[lc-segs+1]=plfb(stcc,setth)
end
stcc=plfa(segs,sege,sege)-plfa(segs,sege,sege-1)-structure.GetDistance(sege-2,sege-1)
stcc=stcc/(sege-segs+1)
stct[sege-segs+1]=plfb(stcc*0.25-0.25,setth)
lc=selection.GetCount()>1.5 and 2 or 0
plfc(segs,sege,lc+1,stct,avs)
if setbb then
freeze.FreezeSelected(true,false)
else
freeze.FreezeSelected(false,true)
plfc(segs,sege,lc+2,stct,avs)
freeze.FreezeSelected(true,true)
end
selection.DeselectAll()
return 0
end
local lfi=0
local tdr=pldc()
lfi=dialog.Show(tdr)
if lfi>0.5 then
lfi=run(plss(),tdr.si.value,tdr.ck.value,tdr.ca.value,tdr.cr.value)
if lfi>0.5 then
print("terminated by exception error")
end
end