@@ -122,6 +122,17 @@ apparent_valence!(mol::SimpleMolGraph) = set_descriptor!(
122122 mol, :apparent_valence , apparent_valence (mol. graph, bond_order (mol)))
123123
124124
125+ function formal_valence (symbol_arr:: Vector{Symbol} , charge_arr:: Vector{Int} )
126+ arr = fill (zero (Int), length (symbol_arr))
127+ for i in 1 : length (symbol_arr)
128+ if haskey (LONEPAIR_COUNT, symbol_arr[i])
129+ arr[i] = 4 - abs (LONEPAIR_COUNT[symbol_arr[i]] - charge_arr[i])
130+ end
131+ end
132+ return arr
133+ end
134+
135+
125136"""
126137 valence(mol::SimpleMolGraph) -> Vector{Int}
127138
@@ -142,22 +153,24 @@ end
142153function valence (
143154 symbol_arr:: Vector{Symbol} , charge_arr:: Vector{Int} ,
144155 apparent_valence_arr:: Vector{Int} )
145- arr = fill (zero (Int), length (symbol_arr))
146- for i in 1 : length (symbol_arr)
147- if haskey (LONEPAIR_COUNT, symbol_arr[i])
148- val = 4 - abs (LONEPAIR_COUNT[symbol_arr[i]] - charge_arr[i])
149- arr[i] = max (val, apparent_valence_arr[i])
150- else
151- arr[i] = apparent_valence_arr[i]
152- end
153- end
154- return arr
156+ return max .(formal_valence (symbol_arr, charge_arr), apparent_valence_arr)
155157end
156158
157159valence! (mol:: SimpleMolGraph ) = set_descriptor! (
158160 mol, :valence , valence (atom_symbol (mol), atom_charge (mol), apparent_valence (mol)))
159161
160162
163+ function check_valence! (mol:: SimpleMolGraph )
164+ av = apparent_valence (mol)
165+ fv = formal_valence (atom_symbol (mol), atom_charge (mol))
166+ comments = String[]
167+ for i in vertices (mol)[av .> fv]
168+ push! (comments, " unusual valence at #$(i) (actual $(av[i]) , expected $(fv[i]) )" )
169+ end
170+ mol[:logs ][" warning_valence" ] = join (comments, " ; " )
171+ end
172+
173+
161174"""
162175 explicit_hydrogens(mol::SimpleMolGraph) -> Vector{Int}
163176
0 commit comments