Skip to content

Commit 9dadf2e

Browse files
committed
Extract data on harmonic bonds
More data from ff14SB
1 parent a507527 commit 9dadf2e

File tree

2 files changed

+402
-6
lines changed

2 files changed

+402
-6
lines changed

extractdata/bonding.jl

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,32 @@ function parsestring(str)
2121
return String(str[2:end-1])
2222
end
2323

24-
function parsexmlline(f, line, tag, keyname)
24+
function parsexmlline(f, line, tag, keynames...)
2525
@assert startswith(line, "<$tag ")
2626
@assert endswith(line, "/>")
2727
kv = split(strip(line[length(tag)+2:end-2]), ' ')
28-
key = ""
28+
key = String[]
2929
vals = Pair{Symbol,Any}[]
3030
for kvp in kv
3131
k, v = split(kvp, '=')
32-
if k == keyname
33-
key = parsestring(v)
32+
if k keynames
33+
push!(key, parsestring(v))
3434
else
3535
push!(vals, Symbol(k) => f(k, v))
3636
end
3737
end
38+
@assert length(key) == length(keynames)
39+
key = length(key) == 1 ? only(key) : (key...,)
3840
return key => (; vals...)
3941
end
4042

41-
atomtypes, residues = open("protein.ff14SB.xml", "r") do io
43+
atomtypes, residues, harmonicbonds, harmonicangles = open("protein.ff14SB.xml", "r") do io
4244
line = readline(io)
4345
@assert line == "<ForceField>"
4446
atomtypes = Dict{String, @NamedTuple{element::String, mass::Float32, name::String}}()
4547
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}}()
4650
parsexmblock(io, "</ForceField>") do line
4751
if line == "<AtomTypes>"
4852
parsexmblock(io, "</AtomTypes>") do line
@@ -92,9 +96,33 @@ atomtypes, residues = open("protein.ff14SB.xml", "r") do io
9296
error("Unknown Residues line $line")
9397
end
9498
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
95123
end
96124
end
97-
atomtypes, residues
125+
atomtypes, residues, harmonicbonds, harmonicangles
98126
end
99127

100128
open(joinpath(dirname(@__DIR__), "src", "bonding.jl"), "w") do io
@@ -117,4 +145,18 @@ open(joinpath(dirname(@__DIR__), "src", "bonding.jl"), "w") do io
117145
println(io, " externalbonds = ", v.externalbonds, "),")
118146
end
119147
println(io, ")")
148+
149+
println(io, "\nconst 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, "\nconst 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, ")")
120162
end

0 commit comments

Comments
 (0)