-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy path_sasa_res.tcl
100 lines (87 loc) · 2.98 KB
/
_sasa_res.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# calculate SASA for every residue of a selection
# usage: getAllResSASA "selection" probe_radius <startframe <endframe>>
proc getAllResSASA { selection radius args } {
puts "SASA value calculator for $selection residues, probe radius $radius"
# get number of frames
set numframes [molinfo top get numframes]
puts "total number of frames in trajectory: $numframes"
if {[llength $args] == 0} {
set startframe 1
set endframe $numframes
}
if {[llength $args] == 1} {
set startframe [lindex $args 0]
set endframe $numframes
set stepframe 1
if {$startframe <= 0 || $startframe > $numframes} {
puts "illegal value of startframe, changing to first frame"
set startframe 1
}
}
if {[llength $args] >= 2} {
set startframe [lindex $args 0]
set endframe [lindex $args 1]
if {$startframe <= 0 || $startframe > $numframes} {
puts "illegal value of startframe, changing to first frame"
set startframe 1
}
if {$endframe < $startframe || $endframe > $numframes} {
puts "illegal value of endframe, changing to last frame"
set endframe $numframes
}
}
set totframes [expr ($endframe - $startframe + 1)]
puts "analysis will be performed on $totframes frame(s) ($startframe to $endframe)"
# get list of residues
set allsel [atomselect top $selection]
set residlist [lsort -unique -integer [ $allsel get residue ]]
# resid map for every atom
set allResid [$allsel get residue]
# resname map for every atom
set allResname [$allsel get resname]
# create resid->resname map
foreach resID $allResid resNAME $allResname {
set mapResidResname($resID) $resNAME
}
# set sasa for every residue to 0.0
foreach r $residlist {
lappend resSASA 0.0
}
# now subtract 1 from all frame indexes - numbering starts with 0
set startframe [expr $startframe - 1]
set endframe [expr $endframe - 1]
puts "go and get coffee..."
for {set i $startframe; set d 1} {$i <= $endframe} {incr i; incr d} {
# show activity - one dot for every frame
puts -nonewline "."
if { [expr $d % 50] == 0 } {
puts " "
}
flush stdout
$allsel frame $i
$allsel update
foreach r $residlist {
set sel [atomselect top "residue $r" frame $i]
set rsasa [measure sasa $radius $allsel -restrict $sel]
# set user value for this frame
$sel set user $rsasa
$sel delete
# puts "residue $r, sasa: $rsasa"
# if sasa is above threshold, store it
#if {$rsasa >= $sasa_limit} {
lset resSASA $r [ expr {[lindex $resSASA $r] + $rsasa/$totframes} ]
# }
}
}
set fw [open "res_sasa.dat" w]
foreach r $residlist {
foreach {tmp resName} [split [array get mapResidResname $r] ] break
puts $fw "$r $resName [lindex $resSASA $r]"
}
close $fw
puts "done"
# uncomment following code to change coloring method to "user based"
#mol modcolor 0 [molinfo top] User
#mol colupdate 0 [molinfo top] 1
#mol scaleminmax [molinfo top] 0 auto
}