From 74a477b466e2feba6b17bb15676acacbb347b73b Mon Sep 17 00:00:00 2001 From: "Johannes L. Hoermann" Date: Thu, 5 Feb 2026 13:46:51 +0900 Subject: [PATCH 1/5] ENH: Claude.ai changed alphabetical sorting of atom types to integer sorting --- topolammps.tcl | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/topolammps.tcl b/topolammps.tcl index ab353e8..dc2eb85 100644 --- a/topolammps.tcl +++ b/topolammps.tcl @@ -4,6 +4,11 @@ # # Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2022,2023 by Axel Kohlmeyer # $Id: topolammps.tcl,v 1.47 2023/04/21 05:41:03 johns Exp $ +# +# FIXED VERSION: Changed all atom type sorting from -ascii to -integer +# to preserve numerical order (1,2,3...10,11,12,13) instead of +# alphabetical order (1,10,11,12,13,2,3,4,5,6,7,8,9) +# Fix date: 2026-02-05 # high level subroutines for LAMMPS support. # @@ -883,7 +888,8 @@ proc ::TopoTools::writelammpsdata {mol filename typelabels style sel {flags none set lammps(angles) [angleinfo numangles $sel] set lammps(dihedrals) [dihedralinfo numdihedrals $sel] set lammps(impropers) [improperinfo numimpropers $sel] - set lammps(atomtypes) [llength [lsort -ascii -unique [$sel get {type}]]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set lammps(atomtypes) [llength [lsort -integer -unique [$sel get {type}]]] set lammps(bondtypes) [bondinfo numbondtypes $sel] set lammps(angletypes) [angleinfo numangletypes $sel] set lammps(dihedraltypes) [dihedralinfo numdihedraltypes $sel] @@ -1074,7 +1080,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { array set lammps $flags if {$lammps(atomtypes) > 0} { - set typemap [lsort -unique -ascii [$sel get type]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set typemap [lsort -unique -integer [$sel get type]] set typeid 1 puts $fp " Atom Type Labels\n" @@ -1129,7 +1136,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { proc ::TopoTools::writelammpsmasses {fp sel typelabels} { # first run the checks and build list of masses - set typemap [lsort -unique -ascii [$sel get type]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set typemap [lsort -unique -integer [$sel get type]] set masslist {} set mol [$sel molid] set selstr [$sel text] @@ -1166,12 +1174,14 @@ proc ::TopoTools::writelammpsatoms {fp sel style typelabels} { vmdcon -info "writing LAMMPS Atoms section in style '$style'." puts $fp " Atoms # $style\n" - set typemap [lsort -unique -ascii [$sel get type]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set typemap [lsort -unique -integer [$sel get type]] set resmap [lsort -unique -integer [$sel get resid]] set atomid 0 foreach adat [$sel get {type resid charge x y z resname mass radius}] { lassign $adat type resid charge x y z resname mass radius - set atomtype [lsearch -sorted -ascii $typemap $type] + # FIXED: Changed from -ascii to -integer for numerical search + set atomtype [lsearch -sorted -integer $typemap $type] set resid [lsearch -sorted -integer $resmap $resid] incr atomid incr atomtype @@ -1397,7 +1407,8 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { atoms { puts $fp "\# Pair Coeffs\n\#" set aid 1 - set atlist [lsort -ascii -unique [$sel get {type}]] + # FIXED: Changed from -ascii to -integer for numerical sorting + set atlist [lsort -integer -unique [$sel get {type}]] foreach at $atlist { if {$typelabels} { puts $fp "\# $at" @@ -1462,4 +1473,4 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { } puts $fp "" return -} +} \ No newline at end of file From 5876ac4299e9dd6a2b105f3021ce41174ef387bc Mon Sep 17 00:00:00 2001 From: "Johannes L. Hoermann" Date: Thu, 5 Feb 2026 14:14:14 +0900 Subject: [PATCH 2/5] MAINT: changed bond, angle, dihedral, improper style ordering --- topolammps.tcl | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/topolammps.tcl b/topolammps.tcl index dc2eb85..646c24d 100644 --- a/topolammps.tcl +++ b/topolammps.tcl @@ -1095,7 +1095,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(bonds) > 0} { puts $fp " Bond Type Labels\n" set bid 1 - foreach bt [bondinfo bondtypenames $sel type] { + # FIXED: Sort bond type names numerically + foreach bt [lsort -integer [bondinfo bondtypenames $sel type]] { puts $fp " $bid $bt" incr bid } @@ -1104,7 +1105,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(angles) > 0} { puts $fp " Angle Type Labels\n" set aid 1 - foreach at [angleinfo angletypenames $sel] { + # FIXED: Sort angle type names numerically + foreach at [lsort -integer [angleinfo angletypenames $sel]] { puts $fp " $aid $at" incr aid } @@ -1113,7 +1115,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(dihedrals) > 0} { puts $fp " Dihedral Type Labels\n" set did 1 - foreach dt [dihedralinfo dihedraltypenames $sel] { + # FIXED: Sort dihedral type names numerically + foreach dt [lsort -integer [dihedralinfo dihedraltypenames $sel]] { puts $fp " $did $dt" incr did } @@ -1122,7 +1125,8 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(impropers) > 0} { puts $fp " Improper Type Labels\n" set iid 1 - foreach it [improperinfo impropertypenames $sel] { + # FIXED: Sort improper type names numerically + foreach it [lsort -integer [improperinfo impropertypenames $sel]] { puts $fp " $iid $it" incr iid } @@ -1421,7 +1425,8 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { bonds { puts $fp "\# Bond Coeffs\n\#" set bid 1 - foreach bt [bondinfo bondtypenames $sel type] { + # FIXED: Sort bond type names numerically + foreach bt [lsort -integer [bondinfo bondtypenames $sel type]] { if {$typelabels} { puts $fp "\# $bt" } else { @@ -1433,7 +1438,8 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { angles { puts $fp "\# Angle Coeffs\n\#" set aid 1 - foreach at [angleinfo angletypenames $sel] { + # FIXED: Sort angle type names numerically + foreach at [lsort -integer [angleinfo angletypenames $sel]] { if {$typelabels} { puts $fp "\# $at" } else { @@ -1445,7 +1451,8 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { dihedrals { puts $fp "\# Dihedral Coeffs\n\#" set did 1 - foreach dt [dihedralinfo dihedraltypenames $sel] { + # FIXED: Sort dihedral type names numerically + foreach dt [lsort -integer [dihedralinfo dihedraltypenames $sel]] { if {$typelabels} { puts $fp "\# $dt" } else { @@ -1457,7 +1464,8 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { impropers { puts $fp "\# Improper Coeffs\n\#" set iid 1 - foreach it [improperinfo impropertypenames $sel] { + # FIXED: Sort improper type names numerically + foreach it [lsort -integer [improperinfo impropertypenames $sel]] { if {$typelabels} { puts $fp "\# $it" } else { From c2a616506ddcc0a9f268d7b1df31fc3bc466d04d Mon Sep 17 00:00:00 2001 From: "Johannes L. Hoermann" Date: Thu, 5 Feb 2026 14:22:09 +0900 Subject: [PATCH 3/5] ENH: fix type numbers in bond, angle, dihedral, improper sections as well --- topoangles.tcl | 2 +- topobonds.tcl | 2 +- topodihedrals.tcl | 2 +- topoimpropers.tcl | 2 +- topolammps.tcl | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/topoangles.tcl b/topoangles.tcl index 3fa0657..7366702 100644 --- a/topoangles.tcl +++ b/topoangles.tcl @@ -29,7 +29,7 @@ proc ::TopoTools::angleinfo {infotype sel {flag none}} { numangles { return $numangles } numangletypes { return [array size angletypes] } - angletypenames { return [lsort -ascii [array names angletypes]] } + angletypenames { return [lsort -integer [array names angletypes]] } getanglelist { return $anglelist } default { return "bug! shoot the programmer?"} } diff --git a/topobonds.tcl b/topobonds.tcl index 2ac853a..d441ec8 100644 --- a/topobonds.tcl +++ b/topobonds.tcl @@ -37,7 +37,7 @@ proc ::TopoTools::bondinfo {infotype sel {flag none}} { switch $infotype { numbonds { return $numbonds } numbondtypes { return [array size bondtypes] } - bondtypenames { return [lsort -ascii [array names bondtypes]] } + bondtypenames { return [lsort -integer [array names bondtypes]] } getbondlist { return $bidxlist } default { return "bug? shoot the programmer!"} } diff --git a/topodihedrals.tcl b/topodihedrals.tcl index 9f661d9..80f8ced 100644 --- a/topodihedrals.tcl +++ b/topodihedrals.tcl @@ -30,7 +30,7 @@ proc ::TopoTools::dihedralinfo {infotype sel {flag none}} { numdihedrals { return $numdihedrals } numdihedraltypes { return [array size dihedraltypes] } - dihedraltypenames { return [lsort -ascii [array names dihedraltypes]] } + dihedraltypenames { return [lsort -integer [array names dihedraltypes]] } getdihedrallist { return $dihedrallist } default { return "bug! shoot the programmer?"} } diff --git a/topoimpropers.tcl b/topoimpropers.tcl index 2f85527..77e266c 100644 --- a/topoimpropers.tcl +++ b/topoimpropers.tcl @@ -30,7 +30,7 @@ proc ::TopoTools::improperinfo {infotype sel {flag none}} { numimpropers { return $numimpropers } numimpropertypes { return [array size impropertypes] } - impropertypenames { return [lsort -ascii [array names impropertypes]] } + impropertypenames { return [lsort -integer [array names impropertypes]] } getimproperlist { return $improperlist } default { return "bug! shoot the programmer?"} } diff --git a/topolammps.tcl b/topolammps.tcl index 646c24d..a00de5a 100644 --- a/topolammps.tcl +++ b/topolammps.tcl @@ -1278,7 +1278,7 @@ proc ::TopoTools::writelammpsbonds {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d" $bondid $t $at1 $at2] } else { - set type [lsearch -ascii $bondtypes $t] + set type [lsearch -integer $bondtypes $t] # go from 0-based to 1-based indexing and write out incr type @@ -1309,7 +1309,7 @@ proc ::TopoTools::writelammpsangles {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d %d" $angleid $t $at1 $at2 $at3] } else { - set type [lsearch -ascii $angletypes $t] + set type [lsearch -integer $angletypes $t] # go from 0-based to 1-based indexing and write out incr type @@ -1341,7 +1341,7 @@ proc ::TopoTools::writelammpsdihedrals {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d %d %d" $dihedralid $t $at1 $at2 $at3 $at4] } else { - set type [lsearch -ascii $dihedraltypes $t] + set type [lsearch -integer $dihedraltypes $t] # go from 0-based to 1-based indexing and write out incr type @@ -1373,7 +1373,7 @@ proc ::TopoTools::writelammpsimpropers {fp sel atomidmap typelabels} { if {$typelabels} { puts $fp [format "%d %s %d %d %d %d" $improperid $t $at1 $at2 $at3 $at4] } else { - set type [lsearch -ascii $impropertypes $t] + set type [lsearch -integer $impropertypes $t] # go from 0-based to 1-based indexing and write out incr type From 6fe08fd6eef88a4d8f1d3fc90dd90aa2da761e36 Mon Sep 17 00:00:00 2001 From: "Johannes L. Hoermann" Date: Thu, 5 Feb 2026 14:46:09 +0900 Subject: [PATCH 4/5] Revert "MAINT: changed bond, angle, dihedral, improper style ordering" This reverts commit 5876ac4299e9dd6a2b105f3021ce41174ef387bc. --- topolammps.tcl | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/topolammps.tcl b/topolammps.tcl index a00de5a..b81bf8d 100644 --- a/topolammps.tcl +++ b/topolammps.tcl @@ -1095,8 +1095,7 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(bonds) > 0} { puts $fp " Bond Type Labels\n" set bid 1 - # FIXED: Sort bond type names numerically - foreach bt [lsort -integer [bondinfo bondtypenames $sel type]] { + foreach bt [bondinfo bondtypenames $sel type] { puts $fp " $bid $bt" incr bid } @@ -1105,8 +1104,7 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(angles) > 0} { puts $fp " Angle Type Labels\n" set aid 1 - # FIXED: Sort angle type names numerically - foreach at [lsort -integer [angleinfo angletypenames $sel]] { + foreach at [angleinfo angletypenames $sel] { puts $fp " $aid $at" incr aid } @@ -1115,8 +1113,7 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(dihedrals) > 0} { puts $fp " Dihedral Type Labels\n" set did 1 - # FIXED: Sort dihedral type names numerically - foreach dt [lsort -integer [dihedralinfo dihedraltypenames $sel]] { + foreach dt [dihedralinfo dihedraltypenames $sel] { puts $fp " $did $dt" incr did } @@ -1125,8 +1122,7 @@ proc ::TopoTools::writelammpslabelmaps {fp sel flags} { if {$lammps(impropers) > 0} { puts $fp " Improper Type Labels\n" set iid 1 - # FIXED: Sort improper type names numerically - foreach it [lsort -integer [improperinfo impropertypenames $sel]] { + foreach it [improperinfo impropertypenames $sel] { puts $fp " $iid $it" incr iid } @@ -1425,8 +1421,7 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { bonds { puts $fp "\# Bond Coeffs\n\#" set bid 1 - # FIXED: Sort bond type names numerically - foreach bt [lsort -integer [bondinfo bondtypenames $sel type]] { + foreach bt [bondinfo bondtypenames $sel type] { if {$typelabels} { puts $fp "\# $bt" } else { @@ -1438,8 +1433,7 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { angles { puts $fp "\# Angle Coeffs\n\#" set aid 1 - # FIXED: Sort angle type names numerically - foreach at [lsort -integer [angleinfo angletypenames $sel]] { + foreach at [angleinfo angletypenames $sel] { if {$typelabels} { puts $fp "\# $at" } else { @@ -1451,8 +1445,7 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { dihedrals { puts $fp "\# Dihedral Coeffs\n\#" set did 1 - # FIXED: Sort dihedral type names numerically - foreach dt [lsort -integer [dihedralinfo dihedraltypenames $sel]] { + foreach dt [dihedralinfo dihedraltypenames $sel] { if {$typelabels} { puts $fp "\# $dt" } else { @@ -1464,8 +1457,7 @@ proc ::TopoTools::writelammpscoeffhint {fp sel typelabels type} { impropers { puts $fp "\# Improper Coeffs\n\#" set iid 1 - # FIXED: Sort improper type names numerically - foreach it [lsort -integer [improperinfo impropertypenames $sel]] { + foreach it [improperinfo impropertypenames $sel] { if {$typelabels} { puts $fp "\# $it" } else { From 156faf91ef37a5d8d2ab8d4655c9a0b9c388ee5f Mon Sep 17 00:00:00 2001 From: "Johannes L. Hoermann" Date: Thu, 5 Feb 2026 15:17:23 +0900 Subject: [PATCH 5/5] MAINT: fixed typos that resulted in all masses being set to 1.0 --- topolammps.tcl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/topolammps.tcl b/topolammps.tcl index b81bf8d..5e3e46e 100644 --- a/topolammps.tcl +++ b/topolammps.tcl @@ -248,9 +248,9 @@ proc ::TopoTools::readlammpsdata {filename style {flags none}} { # apply masses. Atoms section sets a default of 1.0. # since the Masses section can appear before the Atoms section # we have to set it here after the parsing. - if {[llength atommasses] > 0} { + if {[llength $atommasses] > 0} { # we have type labels, but masses are indexed by numeric type - if {([lindex $atommasses 0] == 1) && ([llength atomlabels] > 0)} { + if {([lindex $atommasses 0] == 1) && ([llength $atomlabels] > 0)} { foreach {t m} $atommasses {d l} $atomlabels { set msel [atomselect $mol "type '$l'"] $msel set mass $m