@@ -21,28 +21,33 @@ function parsestring(str)
21
21
return String (str[2 : end - 1 ])
22
22
end
23
23
24
- function parsexmlline (f, line, tag, keyname )
24
+ function parsexmlline (f, line, tag, keynames ... ; skip = () )
25
25
@assert startswith (line, " <$tag " )
26
26
@assert endswith (line, " />" )
27
27
kv = split (strip (line[length (tag)+ 2 : end - 2 ]), ' ' )
28
- key = " "
28
+ key = String[]
29
29
vals = Pair{Symbol,Any}[]
30
30
for kvp in kv
31
31
k, v = split (kvp, ' =' )
32
- if k == keyname
33
- key = parsestring (v)
32
+ k ∈ skip && continue
33
+ if k ∈ keynames
34
+ push! (key, parsestring (v))
34
35
else
35
36
push! (vals, Symbol (k) => f (k, v))
36
37
end
37
38
end
39
+ @assert length (key) == length (keynames)
40
+ key = length (key) == 1 ? only (key) : (key... ,)
38
41
return key => (; vals... )
39
42
end
40
43
41
- atomtypes, residues = open (" protein.ff14SB.xml" , " r" ) do io
44
+ atomtypes, residues, bondlengths, bondangles = open (" protein.ff14SB.xml" , " r" ) do io
42
45
line = readline (io)
43
46
@assert line == " <ForceField>"
44
47
atomtypes = Dict {String, @NamedTuple{element::String, mass::Float32, name::String}} ()
45
48
residues = Dict{String, @NamedTuple {atoms:: Dict{String, @NamedTuple{charge::Float32, type::String}} , bonds:: Vector{Tuple{String,String}} , externalbonds:: Vector{String} }}()
49
+ harmonicbonds = Dict {Tuple{String,String}, @NamedTuple{length::Float32}} ()
50
+ harmonicangles = Dict {Tuple{String,String,String}, @NamedTuple{angle::Float32}} ()
46
51
parsexmblock (io, " </ForceField>" ) do line
47
52
if line == " <AtomTypes>"
48
53
parsexmblock (io, " </AtomTypes>" ) do line
@@ -92,9 +97,31 @@ atomtypes, residues = open("protein.ff14SB.xml", "r") do io
92
97
error (" Unknown Residues line $line " )
93
98
end
94
99
end
100
+ elseif line == " <HarmonicBondForce>"
101
+ parsexmblock (io, " </HarmonicBondForce>" ) do line
102
+ push! (harmonicbonds, parsexmlline (line, " Bond" , " type1" , " type2" ; skip= (" k" ,)) do k, v
103
+ if k == " length"
104
+ return parse (Float32, v[2 : end - 1 ])
105
+ else
106
+ error (" Unknown Bond key $k " )
107
+ end
108
+ end )
109
+ end
110
+ elseif line == " <HarmonicAngleForce>"
111
+ parsexmblock (io, " </HarmonicAngleForce>" ) do line
112
+ push! (harmonicangles, parsexmlline (line, " Angle" , " type1" , " type2" , " type3" ; skip= (" k" ,)) do k, v
113
+ if k == " k"
114
+ return parse (Float32, v[2 : end - 1 ]) # strip the quotes
115
+ elseif k == " angle"
116
+ return parse (Float32, v[2 : end - 1 ]) # strip the quotes
117
+ else
118
+ error (" Unknown Angle key $k " )
119
+ end
120
+ end )
121
+ end
95
122
end
96
123
end
97
- atomtypes, residues
124
+ atomtypes, residues, Dict (k => 10 * v . length for (k, v) in harmonicbonds), Dict (k => v . angle for (k, v) in harmonicangles)
98
125
end
99
126
100
127
open (joinpath (dirname (@__DIR__ ), " src" , " bonding.jl" ), " w" ) do io
@@ -117,4 +144,18 @@ open(joinpath(dirname(@__DIR__), "src", "bonding.jl"), "w") do io
117
144
println (io, " externalbonds = " , v. externalbonds, " )," )
118
145
end
119
146
println (io, " )" )
147
+
148
+ println (io, " \n const bondlengths = Dict{Tuple{String,String}, Float32}(" )
149
+ hb = sort! (collect (bondlengths); by= first)
150
+ for pr in hb
151
+ println (io, " " , pr, ' ,' )
152
+ end
153
+ println (io, " )" )
154
+
155
+ println (io, " \n const bondangles = Dict{Tuple{String,String,String}, Float32}(" )
156
+ ha = sort! (collect (bondangles); by= first)
157
+ for pr in ha
158
+ println (io, " " , pr, ' ,' )
159
+ end
160
+ println (io, " )" )
120
161
end
0 commit comments