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