hillclimber 0.1.6__cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hillclimber/__init__.py +41 -0
- hillclimber/actions.py +53 -0
- hillclimber/analysis.py +590 -0
- hillclimber/biases.py +293 -0
- hillclimber/calc.py +22 -0
- hillclimber/cvs.py +1070 -0
- hillclimber/interfaces.py +133 -0
- hillclimber/metadynamics.py +416 -0
- hillclimber/nodes.py +6 -0
- hillclimber/opes.py +359 -0
- hillclimber/pycv.py +362 -0
- hillclimber/selectors.py +230 -0
- hillclimber/virtual_atoms.py +341 -0
- hillclimber-0.1.6.dist-info/METADATA +325 -0
- hillclimber-0.1.6.dist-info/RECORD +475 -0
- hillclimber-0.1.6.dist-info/WHEEL +6 -0
- hillclimber-0.1.6.dist-info/entry_points.txt +8 -0
- hillclimber-0.1.6.dist-info/licenses/LICENSE +165 -0
- hillclimber-0.1.6.dist-info/sboms/auditwheel.cdx.json +1 -0
- hillclimber.libs/libgomp-a49a47f9.so.1.0.0 +0 -0
- plumed/__init__.py +104 -0
- plumed/_lib/bin/plumed +0 -0
- plumed/_lib/bin/plumed-config +9 -0
- plumed/_lib/bin/plumed-patch +9 -0
- plumed/_lib/include/plumed/adjmat/AdjacencyMatrixBase.h +659 -0
- plumed/_lib/include/plumed/adjmat/ContactMatrix.h +59 -0
- plumed/_lib/include/plumed/asmjit/arch.h +228 -0
- plumed/_lib/include/plumed/asmjit/arm.h +43 -0
- plumed/_lib/include/plumed/asmjit/asmjit.h +69 -0
- plumed/_lib/include/plumed/asmjit/asmjit_apibegin.h +143 -0
- plumed/_lib/include/plumed/asmjit/asmjit_apiend.h +93 -0
- plumed/_lib/include/plumed/asmjit/asmjit_build.h +971 -0
- plumed/_lib/include/plumed/asmjit/assembler.h +183 -0
- plumed/_lib/include/plumed/asmjit/base.h +56 -0
- plumed/_lib/include/plumed/asmjit/codebuilder.h +944 -0
- plumed/_lib/include/plumed/asmjit/codecompiler.h +767 -0
- plumed/_lib/include/plumed/asmjit/codeemitter.h +528 -0
- plumed/_lib/include/plumed/asmjit/codeholder.h +777 -0
- plumed/_lib/include/plumed/asmjit/constpool.h +286 -0
- plumed/_lib/include/plumed/asmjit/cpuinfo.h +402 -0
- plumed/_lib/include/plumed/asmjit/func.h +1327 -0
- plumed/_lib/include/plumed/asmjit/globals.h +370 -0
- plumed/_lib/include/plumed/asmjit/inst.h +137 -0
- plumed/_lib/include/plumed/asmjit/logging.h +317 -0
- plumed/_lib/include/plumed/asmjit/misc_p.h +103 -0
- plumed/_lib/include/plumed/asmjit/moved_string.h +318 -0
- plumed/_lib/include/plumed/asmjit/operand.h +1599 -0
- plumed/_lib/include/plumed/asmjit/osutils.h +207 -0
- plumed/_lib/include/plumed/asmjit/regalloc_p.h +597 -0
- plumed/_lib/include/plumed/asmjit/runtime.h +227 -0
- plumed/_lib/include/plumed/asmjit/simdtypes.h +1104 -0
- plumed/_lib/include/plumed/asmjit/utils.h +1387 -0
- plumed/_lib/include/plumed/asmjit/vmem.h +183 -0
- plumed/_lib/include/plumed/asmjit/x86.h +45 -0
- plumed/_lib/include/plumed/asmjit/x86assembler.h +125 -0
- plumed/_lib/include/plumed/asmjit/x86builder.h +117 -0
- plumed/_lib/include/plumed/asmjit/x86compiler.h +322 -0
- plumed/_lib/include/plumed/asmjit/x86emitter.h +5149 -0
- plumed/_lib/include/plumed/asmjit/x86globals.h +535 -0
- plumed/_lib/include/plumed/asmjit/x86inst.h +2547 -0
- plumed/_lib/include/plumed/asmjit/x86instimpl_p.h +74 -0
- plumed/_lib/include/plumed/asmjit/x86internal_p.h +108 -0
- plumed/_lib/include/plumed/asmjit/x86logging_p.h +92 -0
- plumed/_lib/include/plumed/asmjit/x86misc.h +417 -0
- plumed/_lib/include/plumed/asmjit/x86operand.h +1133 -0
- plumed/_lib/include/plumed/asmjit/x86regalloc_p.h +734 -0
- plumed/_lib/include/plumed/asmjit/zone.h +1157 -0
- plumed/_lib/include/plumed/bias/Bias.h +82 -0
- plumed/_lib/include/plumed/bias/ReweightBase.h +58 -0
- plumed/_lib/include/plumed/blas/blas.h +253 -0
- plumed/_lib/include/plumed/blas/def_external.h +61 -0
- plumed/_lib/include/plumed/blas/def_internal.h +97 -0
- plumed/_lib/include/plumed/blas/real.h +49 -0
- plumed/_lib/include/plumed/cltools/CLTool.h +32 -0
- plumed/_lib/include/plumed/clusters/ClusteringBase.h +70 -0
- plumed/_lib/include/plumed/colvar/Colvar.h +32 -0
- plumed/_lib/include/plumed/colvar/ColvarInput.h +68 -0
- plumed/_lib/include/plumed/colvar/ColvarShortcut.h +81 -0
- plumed/_lib/include/plumed/colvar/CoordinationBase.h +52 -0
- plumed/_lib/include/plumed/colvar/MultiColvarTemplate.h +333 -0
- plumed/_lib/include/plumed/colvar/PathMSDBase.h +101 -0
- plumed/_lib/include/plumed/colvar/RMSDVector.h +78 -0
- plumed/_lib/include/plumed/config/Config.h +118 -0
- plumed/_lib/include/plumed/config/version.h +9 -0
- plumed/_lib/include/plumed/contour/ContourFindingObject.h +87 -0
- plumed/_lib/include/plumed/contour/DistanceFromContourBase.h +82 -0
- plumed/_lib/include/plumed/contour/FindContour.h +67 -0
- plumed/_lib/include/plumed/core/Action.h +540 -0
- plumed/_lib/include/plumed/core/ActionAnyorder.h +48 -0
- plumed/_lib/include/plumed/core/ActionAtomistic.h +343 -0
- plumed/_lib/include/plumed/core/ActionForInterface.h +99 -0
- plumed/_lib/include/plumed/core/ActionPilot.h +57 -0
- plumed/_lib/include/plumed/core/ActionRegister.h +124 -0
- plumed/_lib/include/plumed/core/ActionSet.h +163 -0
- plumed/_lib/include/plumed/core/ActionSetup.h +48 -0
- plumed/_lib/include/plumed/core/ActionShortcut.h +73 -0
- plumed/_lib/include/plumed/core/ActionToGetData.h +59 -0
- plumed/_lib/include/plumed/core/ActionToPutData.h +101 -0
- plumed/_lib/include/plumed/core/ActionWithArguments.h +140 -0
- plumed/_lib/include/plumed/core/ActionWithMatrix.h +87 -0
- plumed/_lib/include/plumed/core/ActionWithValue.h +258 -0
- plumed/_lib/include/plumed/core/ActionWithVector.h +94 -0
- plumed/_lib/include/plumed/core/ActionWithVirtualAtom.h +123 -0
- plumed/_lib/include/plumed/core/CLTool.h +177 -0
- plumed/_lib/include/plumed/core/CLToolMain.h +102 -0
- plumed/_lib/include/plumed/core/CLToolRegister.h +108 -0
- plumed/_lib/include/plumed/core/Colvar.h +115 -0
- plumed/_lib/include/plumed/core/DataPassingObject.h +94 -0
- plumed/_lib/include/plumed/core/DataPassingTools.h +54 -0
- plumed/_lib/include/plumed/core/DomainDecomposition.h +120 -0
- plumed/_lib/include/plumed/core/ExchangePatterns.h +47 -0
- plumed/_lib/include/plumed/core/FlexibleBin.h +63 -0
- plumed/_lib/include/plumed/core/GREX.h +61 -0
- plumed/_lib/include/plumed/core/GenericMolInfo.h +89 -0
- plumed/_lib/include/plumed/core/Group.h +41 -0
- plumed/_lib/include/plumed/core/ModuleMap.h +30 -0
- plumed/_lib/include/plumed/core/ParallelTaskManager.h +1023 -0
- plumed/_lib/include/plumed/core/PbcAction.h +61 -0
- plumed/_lib/include/plumed/core/PlumedMain.h +632 -0
- plumed/_lib/include/plumed/core/PlumedMainInitializer.h +118 -0
- plumed/_lib/include/plumed/core/RegisterBase.h +340 -0
- plumed/_lib/include/plumed/core/TargetDist.h +48 -0
- plumed/_lib/include/plumed/core/Value.h +547 -0
- plumed/_lib/include/plumed/core/WithCmd.h +93 -0
- plumed/_lib/include/plumed/dimred/SMACOF.h +55 -0
- plumed/_lib/include/plumed/drr/DRR.h +383 -0
- plumed/_lib/include/plumed/drr/colvar_UIestimator.h +777 -0
- plumed/_lib/include/plumed/fisst/legendre_rule_fast.h +44 -0
- plumed/_lib/include/plumed/function/Custom.h +54 -0
- plumed/_lib/include/plumed/function/Function.h +85 -0
- plumed/_lib/include/plumed/function/FunctionOfMatrix.h +368 -0
- plumed/_lib/include/plumed/function/FunctionOfScalar.h +135 -0
- plumed/_lib/include/plumed/function/FunctionOfVector.h +296 -0
- plumed/_lib/include/plumed/function/FunctionSetup.h +180 -0
- plumed/_lib/include/plumed/function/FunctionShortcut.h +130 -0
- plumed/_lib/include/plumed/function/FunctionWithSingleArgument.h +165 -0
- plumed/_lib/include/plumed/gridtools/ActionWithGrid.h +43 -0
- plumed/_lib/include/plumed/gridtools/EvaluateGridFunction.h +99 -0
- plumed/_lib/include/plumed/gridtools/FunctionOfGrid.h +295 -0
- plumed/_lib/include/plumed/gridtools/GridCoordinatesObject.h +179 -0
- plumed/_lib/include/plumed/gridtools/GridSearch.h +135 -0
- plumed/_lib/include/plumed/gridtools/Interpolator.h +45 -0
- plumed/_lib/include/plumed/gridtools/KDE.h +455 -0
- plumed/_lib/include/plumed/gridtools/RDF.h +40 -0
- plumed/_lib/include/plumed/gridtools/SumOfKernels.h +219 -0
- plumed/_lib/include/plumed/isdb/MetainferenceBase.h +398 -0
- plumed/_lib/include/plumed/lapack/def_external.h +207 -0
- plumed/_lib/include/plumed/lapack/def_internal.h +388 -0
- plumed/_lib/include/plumed/lapack/lapack.h +899 -0
- plumed/_lib/include/plumed/lapack/lapack_limits.h +79 -0
- plumed/_lib/include/plumed/lapack/real.h +50 -0
- plumed/_lib/include/plumed/lepton/CompiledExpression.h +164 -0
- plumed/_lib/include/plumed/lepton/CustomFunction.h +143 -0
- plumed/_lib/include/plumed/lepton/Exception.h +93 -0
- plumed/_lib/include/plumed/lepton/ExpressionProgram.h +137 -0
- plumed/_lib/include/plumed/lepton/ExpressionTreeNode.h +145 -0
- plumed/_lib/include/plumed/lepton/Lepton.h +85 -0
- plumed/_lib/include/plumed/lepton/MSVC_erfc.h +123 -0
- plumed/_lib/include/plumed/lepton/Operation.h +1302 -0
- plumed/_lib/include/plumed/lepton/ParsedExpression.h +165 -0
- plumed/_lib/include/plumed/lepton/Parser.h +111 -0
- plumed/_lib/include/plumed/lepton/windowsIncludes.h +73 -0
- plumed/_lib/include/plumed/mapping/Path.h +44 -0
- plumed/_lib/include/plumed/mapping/PathProjectionCalculator.h +57 -0
- plumed/_lib/include/plumed/matrixtools/MatrixOperationBase.h +54 -0
- plumed/_lib/include/plumed/matrixtools/MatrixTimesMatrix.h +309 -0
- plumed/_lib/include/plumed/matrixtools/MatrixTimesVectorBase.h +365 -0
- plumed/_lib/include/plumed/matrixtools/OuterProduct.h +238 -0
- plumed/_lib/include/plumed/maze/Core.h +65 -0
- plumed/_lib/include/plumed/maze/Loss.h +86 -0
- plumed/_lib/include/plumed/maze/Member.h +66 -0
- plumed/_lib/include/plumed/maze/Memetic.h +799 -0
- plumed/_lib/include/plumed/maze/Optimizer.h +357 -0
- plumed/_lib/include/plumed/maze/Random_MT.h +156 -0
- plumed/_lib/include/plumed/maze/Tools.h +183 -0
- plumed/_lib/include/plumed/metatomic/vesin.h +188 -0
- plumed/_lib/include/plumed/molfile/Gromacs.h +2013 -0
- plumed/_lib/include/plumed/molfile/endianswap.h +217 -0
- plumed/_lib/include/plumed/molfile/fastio.h +683 -0
- plumed/_lib/include/plumed/molfile/largefiles.h +78 -0
- plumed/_lib/include/plumed/molfile/libmolfile_plugin.h +77 -0
- plumed/_lib/include/plumed/molfile/molfile_plugin.h +1034 -0
- plumed/_lib/include/plumed/molfile/periodic_table.h +248 -0
- plumed/_lib/include/plumed/molfile/readpdb.h +447 -0
- plumed/_lib/include/plumed/molfile/vmdplugin.h +236 -0
- plumed/_lib/include/plumed/multicolvar/MultiColvarShortcuts.h +45 -0
- plumed/_lib/include/plumed/opes/ExpansionCVs.h +79 -0
- plumed/_lib/include/plumed/sasa/Sasa.h +32 -0
- plumed/_lib/include/plumed/secondarystructure/SecondaryStructureBase.h +372 -0
- plumed/_lib/include/plumed/setup/ActionSetup.h +25 -0
- plumed/_lib/include/plumed/small_vector/small_vector.h +6114 -0
- plumed/_lib/include/plumed/symfunc/CoordinationNumbers.h +41 -0
- plumed/_lib/include/plumed/tools/Angle.h +52 -0
- plumed/_lib/include/plumed/tools/AtomDistribution.h +138 -0
- plumed/_lib/include/plumed/tools/AtomNumber.h +152 -0
- plumed/_lib/include/plumed/tools/BiasRepresentation.h +106 -0
- plumed/_lib/include/plumed/tools/BitmaskEnum.h +167 -0
- plumed/_lib/include/plumed/tools/Brent1DRootSearch.h +159 -0
- plumed/_lib/include/plumed/tools/CheckInRange.h +44 -0
- plumed/_lib/include/plumed/tools/Citations.h +74 -0
- plumed/_lib/include/plumed/tools/ColvarOutput.h +118 -0
- plumed/_lib/include/plumed/tools/Communicator.h +316 -0
- plumed/_lib/include/plumed/tools/ConjugateGradient.h +80 -0
- plumed/_lib/include/plumed/tools/DLLoader.h +79 -0
- plumed/_lib/include/plumed/tools/ERMSD.h +73 -0
- plumed/_lib/include/plumed/tools/Exception.h +406 -0
- plumed/_lib/include/plumed/tools/File.h +28 -0
- plumed/_lib/include/plumed/tools/FileBase.h +153 -0
- plumed/_lib/include/plumed/tools/FileTools.h +37 -0
- plumed/_lib/include/plumed/tools/ForwardDecl.h +54 -0
- plumed/_lib/include/plumed/tools/Grid.h +638 -0
- plumed/_lib/include/plumed/tools/HistogramBead.h +136 -0
- plumed/_lib/include/plumed/tools/IFile.h +117 -0
- plumed/_lib/include/plumed/tools/KernelFunctions.h +113 -0
- plumed/_lib/include/plumed/tools/Keywords.h +380 -0
- plumed/_lib/include/plumed/tools/LatticeReduction.h +66 -0
- plumed/_lib/include/plumed/tools/LeptonCall.h +64 -0
- plumed/_lib/include/plumed/tools/LinkCells.h +126 -0
- plumed/_lib/include/plumed/tools/Log.h +41 -0
- plumed/_lib/include/plumed/tools/LoopUnroller.h +163 -0
- plumed/_lib/include/plumed/tools/Matrix.h +721 -0
- plumed/_lib/include/plumed/tools/MatrixSquareBracketsAccess.h +138 -0
- plumed/_lib/include/plumed/tools/MergeVectorTools.h +153 -0
- plumed/_lib/include/plumed/tools/Minimise1DBrent.h +244 -0
- plumed/_lib/include/plumed/tools/MinimiseBase.h +120 -0
- plumed/_lib/include/plumed/tools/MolDataClass.h +51 -0
- plumed/_lib/include/plumed/tools/NeighborList.h +112 -0
- plumed/_lib/include/plumed/tools/OFile.h +286 -0
- plumed/_lib/include/plumed/tools/OpenACC.h +180 -0
- plumed/_lib/include/plumed/tools/OpenMP.h +75 -0
- plumed/_lib/include/plumed/tools/PDB.h +154 -0
- plumed/_lib/include/plumed/tools/Pbc.h +139 -0
- plumed/_lib/include/plumed/tools/PlumedHandle.h +105 -0
- plumed/_lib/include/plumed/tools/RMSD.h +493 -0
- plumed/_lib/include/plumed/tools/Random.h +80 -0
- plumed/_lib/include/plumed/tools/RootFindingBase.h +79 -0
- plumed/_lib/include/plumed/tools/Stopwatch.h +475 -0
- plumed/_lib/include/plumed/tools/Subprocess.h +142 -0
- plumed/_lib/include/plumed/tools/SwitchingFunction.h +208 -0
- plumed/_lib/include/plumed/tools/Tensor.h +724 -0
- plumed/_lib/include/plumed/tools/TokenizedLine.h +123 -0
- plumed/_lib/include/plumed/tools/Tools.h +638 -0
- plumed/_lib/include/plumed/tools/Torsion.h +55 -0
- plumed/_lib/include/plumed/tools/TrajectoryParser.h +118 -0
- plumed/_lib/include/plumed/tools/Tree.h +61 -0
- plumed/_lib/include/plumed/tools/TypesafePtr.h +463 -0
- plumed/_lib/include/plumed/tools/Units.h +167 -0
- plumed/_lib/include/plumed/tools/Vector.h +433 -0
- plumed/_lib/include/plumed/tools/View.h +296 -0
- plumed/_lib/include/plumed/tools/View2D.h +100 -0
- plumed/_lib/include/plumed/tools/h36.h +39 -0
- plumed/_lib/include/plumed/vatom/ActionWithVirtualAtom.h +32 -0
- plumed/_lib/include/plumed/ves/BasisFunctions.h +380 -0
- plumed/_lib/include/plumed/ves/CoeffsBase.h +310 -0
- plumed/_lib/include/plumed/ves/CoeffsMatrix.h +220 -0
- plumed/_lib/include/plumed/ves/CoeffsVector.h +251 -0
- plumed/_lib/include/plumed/ves/FermiSwitchingFunction.h +74 -0
- plumed/_lib/include/plumed/ves/GridIntegrationWeights.h +50 -0
- plumed/_lib/include/plumed/ves/GridLinearInterpolation.h +81 -0
- plumed/_lib/include/plumed/ves/GridProjWeights.h +61 -0
- plumed/_lib/include/plumed/ves/LinearBasisSetExpansion.h +303 -0
- plumed/_lib/include/plumed/ves/Optimizer.h +444 -0
- plumed/_lib/include/plumed/ves/TargetDistModifer.h +53 -0
- plumed/_lib/include/plumed/ves/TargetDistribution.h +266 -0
- plumed/_lib/include/plumed/ves/VesBias.h +545 -0
- plumed/_lib/include/plumed/ves/VesTools.h +142 -0
- plumed/_lib/include/plumed/ves/WaveletGrid.h +75 -0
- plumed/_lib/include/plumed/volumes/ActionVolume.h +268 -0
- plumed/_lib/include/plumed/volumes/VolumeShortcut.h +147 -0
- plumed/_lib/include/plumed/wrapper/Plumed.h +5025 -0
- plumed/_lib/include/plumed/xdrfile/xdrfile.h +663 -0
- plumed/_lib/include/plumed/xdrfile/xdrfile_trr.h +89 -0
- plumed/_lib/include/plumed/xdrfile/xdrfile_xtc.h +90 -0
- plumed/_lib/lib/PythonCVInterface.so +0 -0
- plumed/_lib/lib/libplumed.a +0 -0
- plumed/_lib/lib/libplumed.so +0 -0
- plumed/_lib/lib/libplumedKernel.so +0 -0
- plumed/_lib/lib/libplumedWrapper.a +0 -0
- plumed/_lib/lib/pkgconfig/plumed.pc +13 -0
- plumed/_lib/lib/pkgconfig/plumedInternals.pc +13 -0
- plumed/_lib/lib/pkgconfig/plumedWrapper.pc +13 -0
- plumed/_lib/lib/plumed/fortran/plumed.f90 +879 -0
- plumed/_lib/lib/plumed/fortran/plumed_f08.f90 +2625 -0
- plumed/_lib/lib/plumed/modulefile +69 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.config +43 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/CMakeLists.txt +543 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/CMakeLists.txt.preplumed +540 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.cpp +1628 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1590 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.h +103 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.h.preplumed +99 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/sim_util.cpp +2527 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2513 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.h +408 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +394 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/md.cpp +2348 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/md.cpp.preplumed +2091 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/minimize.cpp +3573 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3495 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.cpp +1506 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1402 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/rerun.cpp +997 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/rerun.cpp.preplumed +906 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/runner.cpp +2780 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/runner.cpp.preplumed +2738 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.config +43 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/CMakeLists.txt +549 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/CMakeLists.txt.preplumed +546 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.cpp +1632 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1594 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.h +104 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.h.preplumed +100 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/sim_util.cpp +2624 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2610 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.h +409 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +395 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/md.cpp +2419 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/md.cpp.preplumed +2164 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/minimize.cpp +3546 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3468 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.cpp +1513 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1409 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/rerun.cpp +991 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/rerun.cpp.preplumed +900 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/runner.cpp +2895 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/runner.cpp.preplumed +2849 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/decidegpuusage.cpp +886 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/decidegpuusage.cpp.preplumed +880 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h +347 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h.preplumed +345 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.config +43 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/CMakeLists.txt +575 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/CMakeLists.txt.preplumed +572 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.cpp +1632 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1594 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.h +104 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.h.preplumed +100 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/sim_util.cpp +2564 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2550 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.h +410 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +396 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/md.cpp +2435 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/md.cpp.preplumed +2187 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/minimize.cpp +3592 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3514 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.cpp +1513 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1409 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/rerun.cpp +958 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/rerun.cpp.preplumed +929 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/runner.cpp +2987 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/runner.cpp.preplumed +2941 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/decidegpuusage.cpp +904 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/decidegpuusage.cpp.preplumed +898 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h +353 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h.preplumed +351 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.config +39 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/cmake/gmxManagePlumed.cmake +82 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/cmake/gmxManagePlumed.cmake.preplumed +82 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedMDModule.cpp +162 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedMDModule.cpp.preplumed +154 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.cpp +107 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.cpp.preplumed +99 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.h +120 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.h.preplumed +111 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.cpp +215 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.cpp.preplumed +197 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.h +87 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.h.preplumed +86 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrun/runner.cpp +2971 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrun/runner.cpp.preplumed +2970 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrunutility/mdmodulesnotifiers.h +430 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrunutility/mdmodulesnotifiers.h.preplumed +429 -0
- plumed/_lib/lib/plumed/patches/namd-2.12.config +30 -0
- plumed/_lib/lib/plumed/patches/namd-2.12.diff +267 -0
- plumed/_lib/lib/plumed/patches/namd-2.13.config +30 -0
- plumed/_lib/lib/plumed/patches/namd-2.13.diff +267 -0
- plumed/_lib/lib/plumed/patches/namd-2.14.config +30 -0
- plumed/_lib/lib/plumed/patches/namd-2.14.diff +268 -0
- plumed/_lib/lib/plumed/patches/patch.sh +500 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.config +25 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/forces.f90 +368 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/forces.f90.preplumed +366 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_forces.f90 +71 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_forces.f90.preplumed +24 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_initialization.f90 +62 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/pwscf.f90 +189 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/pwscf.f90.preplumed +185 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.config +26 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/forces.f90 +422 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/forces.f90.preplumed +420 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_ext_forces.f90 +70 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_initialization.f90 +62 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/run_pwscf.f90 +233 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/run_pwscf.f90.preplumed +230 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.config +28 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/Modules/Makefile +175 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/Modules/Makefile.preplumed +171 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/forces.f90 +486 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/forces.f90.preplumed +484 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_ext_forces.f90 +74 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_initialization.f90 +64 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/run_pwscf.f90 +532 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/run_pwscf.f90.preplumed +518 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.config +28 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/Modules/Makefile +249 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/Modules/Makefile.preplumed +244 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/forces.f90 +532 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/forces.f90.preplumed +535 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_ext_forces.f90 +74 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_initialization.f90 +64 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/run_pwscf.f90 +569 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/run_pwscf.f90.preplumed +560 -0
- plumed/_lib/lib/plumed/plumed-config +9 -0
- plumed/_lib/lib/plumed/plumed-mklib +9 -0
- plumed/_lib/lib/plumed/plumed-newcv +9 -0
- plumed/_lib/lib/plumed/plumed-partial_tempering +9 -0
- plumed/_lib/lib/plumed/plumed-patch +9 -0
- plumed/_lib/lib/plumed/plumed-runtime +0 -0
- plumed/_lib/lib/plumed/plumed-selector +9 -0
- plumed/_lib/lib/plumed/plumed-vim2html +9 -0
- plumed/_lib/lib/plumed/scripts/config.sh +126 -0
- plumed/_lib/lib/plumed/scripts/mklib.sh +175 -0
- plumed/_lib/lib/plumed/scripts/newcv.sh +26 -0
- plumed/_lib/lib/plumed/scripts/partial_tempering.sh +319 -0
- plumed/_lib/lib/plumed/scripts/patch.sh +4 -0
- plumed/_lib/lib/plumed/scripts/selector.sh +234 -0
- plumed/_lib/lib/plumed/scripts/vim2html.sh +190 -0
- plumed/_lib/lib/plumed/src/colvar/Template.cpp +116 -0
- plumed/_lib/lib/plumed/src/config/compile_options.sh +3 -0
- plumed/_lib/lib/plumed/src/config/config.txt +179 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake +8 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake.runtime +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake.shared +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake.static +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc +8 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc.runtime +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc.shared +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc.static +5 -0
- plumed/_lib/lib/plumed/vim/scripts.vim +6 -0
- plumed/_plumed_core.cpython-311-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-312-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-313-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-314-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-314t-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-311-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-312-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-313-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-314-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-314t-aarch64-linux-gnu.so +0 -0
- plumedCommunications.pyi +431 -0
hillclimber/pycv.py
ADDED
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"""Python Collective Variables (PyCV) for PLUMED.
|
|
2
|
+
|
|
3
|
+
This module provides a base class for implementing custom collective variables
|
|
4
|
+
in Python that integrate with PLUMED via the PYCVINTERFACE mechanism.
|
|
5
|
+
|
|
6
|
+
Resources
|
|
7
|
+
---------
|
|
8
|
+
- https://www.plumed-tutorials.org/lessons/24/015/data/GAT_SAFE_README.html
|
|
9
|
+
- https://joss.theoj.org/papers/10.21105/joss.01773
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import dataclasses
|
|
15
|
+
from abc import ABC, abstractmethod
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
import numpy.typing as npt
|
|
21
|
+
from ase import Atoms
|
|
22
|
+
from PIL import Image
|
|
23
|
+
|
|
24
|
+
from hillclimber.interfaces import AtomSelector
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class PyCV(ABC):
|
|
29
|
+
"""Base class for user-defined Python Collective Variables.
|
|
30
|
+
|
|
31
|
+
Users subclass this and implement the `compute()` method.
|
|
32
|
+
The CV is evaluated via PLUMED's PYCVINTERFACE mechanism.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
atoms : AtomSelector | list[int]
|
|
37
|
+
Atoms to pass to the CV. Either an AtomSelector or direct indices (0-based).
|
|
38
|
+
prefix : str
|
|
39
|
+
Label prefix for PLUMED commands.
|
|
40
|
+
|
|
41
|
+
Examples
|
|
42
|
+
--------
|
|
43
|
+
>>> import hillclimber as hc
|
|
44
|
+
>>> import numpy as np
|
|
45
|
+
>>> from ase import Atoms
|
|
46
|
+
>>>
|
|
47
|
+
>>> class MyDistanceCV(hc.PyCV):
|
|
48
|
+
... def compute(self, atoms: Atoms) -> tuple[float, np.ndarray]:
|
|
49
|
+
... positions = atoms.get_positions()
|
|
50
|
+
... diff = positions[1] - positions[0]
|
|
51
|
+
... dist = np.sqrt(np.sum(diff**2))
|
|
52
|
+
... grad = np.zeros((len(atoms), 3))
|
|
53
|
+
... grad[0] = -diff / dist
|
|
54
|
+
... grad[1] = diff / dist
|
|
55
|
+
... return dist, grad
|
|
56
|
+
>>>
|
|
57
|
+
>>> cv = MyDistanceCV(
|
|
58
|
+
... atoms=hc.IndexSelector(indices=[[0, 1]]),
|
|
59
|
+
... prefix="my_dist"
|
|
60
|
+
... )
|
|
61
|
+
|
|
62
|
+
Resources
|
|
63
|
+
---------
|
|
64
|
+
- https://www.plumed-tutorials.org/lessons/24/015/data/GAT_SAFE_README.html
|
|
65
|
+
- https://joss.theoj.org/papers/10.21105/joss.01773
|
|
66
|
+
|
|
67
|
+
Notes
|
|
68
|
+
-----
|
|
69
|
+
The `compute()` method receives an ASE Atoms object with positions in
|
|
70
|
+
the same units as specified in the PLUMED UNITS line. When used with
|
|
71
|
+
hillclimber's MetaDynamicsModel, this is Angstrom (ASE default units).
|
|
72
|
+
|
|
73
|
+
If `compute()` returns gradients, the CV can be used for biasing
|
|
74
|
+
(metadynamics, restraints, etc.). If only a scalar is returned,
|
|
75
|
+
the CV can only be printed/monitored.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
atoms: AtomSelector | list[int]
|
|
79
|
+
prefix: str
|
|
80
|
+
|
|
81
|
+
@abstractmethod
|
|
82
|
+
def compute(
|
|
83
|
+
self,
|
|
84
|
+
atoms: Atoms,
|
|
85
|
+
) -> tuple[float, npt.NDArray[np.float64]] | float:
|
|
86
|
+
"""Compute the CV value and optionally gradients.
|
|
87
|
+
|
|
88
|
+
Parameters
|
|
89
|
+
----------
|
|
90
|
+
atoms : ase.Atoms
|
|
91
|
+
The selected atoms with their current positions from the simulation.
|
|
92
|
+
Positions are in the units specified by PLUMED's UNITS line
|
|
93
|
+
(Angstrom when using hillclimber's default configuration).
|
|
94
|
+
Species, masses, and other properties are preserved from the
|
|
95
|
+
original system definition.
|
|
96
|
+
|
|
97
|
+
Returns
|
|
98
|
+
-------
|
|
99
|
+
value : float
|
|
100
|
+
The CV value.
|
|
101
|
+
gradients : np.ndarray, optional
|
|
102
|
+
Gradients of shape (n_atoms, 3) where n_atoms is the number of
|
|
103
|
+
atoms in the input. If not returned, derivatives will not be
|
|
104
|
+
available and the CV cannot be biased.
|
|
105
|
+
|
|
106
|
+
Examples
|
|
107
|
+
--------
|
|
108
|
+
>>> def compute(self, atoms):
|
|
109
|
+
... # Simple distance between first two atoms
|
|
110
|
+
... pos = atoms.get_positions()
|
|
111
|
+
... diff = pos[1] - pos[0]
|
|
112
|
+
... dist = np.linalg.norm(diff)
|
|
113
|
+
...
|
|
114
|
+
... # Compute gradients
|
|
115
|
+
... grad = np.zeros((len(atoms), 3))
|
|
116
|
+
... grad[0] = -diff / dist
|
|
117
|
+
... grad[1] = diff / dist
|
|
118
|
+
...
|
|
119
|
+
... return dist, grad
|
|
120
|
+
"""
|
|
121
|
+
...
|
|
122
|
+
|
|
123
|
+
def to_plumed(self, atoms: Atoms) -> tuple[list[str], list[str]]:
|
|
124
|
+
"""Generate PLUMED commands for this CV.
|
|
125
|
+
|
|
126
|
+
Parameters
|
|
127
|
+
----------
|
|
128
|
+
atoms : ase.Atoms
|
|
129
|
+
Reference structure for atom selection.
|
|
130
|
+
|
|
131
|
+
Returns
|
|
132
|
+
-------
|
|
133
|
+
labels : list[str]
|
|
134
|
+
CV labels generated (single element list with self.prefix).
|
|
135
|
+
commands : list[str]
|
|
136
|
+
PLUMED command strings for PYCVINTERFACE.
|
|
137
|
+
|
|
138
|
+
Notes
|
|
139
|
+
-----
|
|
140
|
+
The actual LOAD command for the pycv plugin is added by
|
|
141
|
+
MetaDynamicsModel, not here.
|
|
142
|
+
"""
|
|
143
|
+
# Get atom indices (0-based)
|
|
144
|
+
indices = self._get_atom_indices(atoms)
|
|
145
|
+
|
|
146
|
+
if not indices:
|
|
147
|
+
raise ValueError(f"Empty atom selection for PyCV '{self.prefix}'")
|
|
148
|
+
|
|
149
|
+
# Generate module name based on prefix
|
|
150
|
+
module_name = f"_pycv_{self.prefix}"
|
|
151
|
+
|
|
152
|
+
# Convert to 1-based indices for PLUMED
|
|
153
|
+
atom_list = ",".join(str(i + 1) for i in indices)
|
|
154
|
+
|
|
155
|
+
commands = [
|
|
156
|
+
f"{self.prefix}: PYCVINTERFACE ATOMS={atom_list} IMPORT={module_name}",
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
return [self.prefix], commands
|
|
160
|
+
|
|
161
|
+
def get_img(self, atoms: Atoms) -> Image.Image:
|
|
162
|
+
"""Generate visualization for this CV.
|
|
163
|
+
|
|
164
|
+
For PyCV, returns a placeholder gray image since the CV logic
|
|
165
|
+
is user-defined and may not have a simple visual representation.
|
|
166
|
+
|
|
167
|
+
Parameters
|
|
168
|
+
----------
|
|
169
|
+
atoms : ase.Atoms
|
|
170
|
+
The atomic structure.
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
Image.Image
|
|
175
|
+
A placeholder gray image.
|
|
176
|
+
"""
|
|
177
|
+
# Create a simple placeholder image
|
|
178
|
+
img = Image.new("RGB", (400, 400), color=(200, 200, 200))
|
|
179
|
+
return img
|
|
180
|
+
|
|
181
|
+
def _get_atom_indices(self, atoms: Atoms) -> list[int]:
|
|
182
|
+
"""Get flat list of atom indices (0-based).
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
atoms : ase.Atoms
|
|
187
|
+
Reference structure for atom selection.
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
list[int]
|
|
192
|
+
Flat list of 0-based atom indices.
|
|
193
|
+
"""
|
|
194
|
+
if isinstance(self.atoms, list):
|
|
195
|
+
return self.atoms
|
|
196
|
+
else:
|
|
197
|
+
# AtomSelector returns list[list[int]], flatten it
|
|
198
|
+
groups = self.atoms.select(atoms)
|
|
199
|
+
return [idx for group in groups for idx in group]
|
|
200
|
+
|
|
201
|
+
def _get_symbols(self, atoms: Atoms) -> list[str]:
|
|
202
|
+
"""Get atomic symbols for the selected atoms.
|
|
203
|
+
|
|
204
|
+
Parameters
|
|
205
|
+
----------
|
|
206
|
+
atoms : ase.Atoms
|
|
207
|
+
Reference structure.
|
|
208
|
+
|
|
209
|
+
Returns
|
|
210
|
+
-------
|
|
211
|
+
list[str]
|
|
212
|
+
List of chemical symbols in selection order.
|
|
213
|
+
"""
|
|
214
|
+
indices = self._get_atom_indices(atoms)
|
|
215
|
+
all_symbols = atoms.get_chemical_symbols()
|
|
216
|
+
return [all_symbols[i] for i in indices]
|
|
217
|
+
|
|
218
|
+
def get_init_args(self) -> str:
|
|
219
|
+
"""Generate Python code to reconstruct this PyCV's initialization arguments.
|
|
220
|
+
|
|
221
|
+
This method serializes the atoms and prefix arguments so the PyCV can be
|
|
222
|
+
reconstructed in the PLUMED adapter script.
|
|
223
|
+
|
|
224
|
+
Returns
|
|
225
|
+
-------
|
|
226
|
+
str
|
|
227
|
+
Python code string for initializing this PyCV instance.
|
|
228
|
+
"""
|
|
229
|
+
# Serialize atoms argument
|
|
230
|
+
if isinstance(self.atoms, list):
|
|
231
|
+
atoms_repr = repr(self.atoms)
|
|
232
|
+
else:
|
|
233
|
+
# AtomSelector - use dataclass fields for serialization
|
|
234
|
+
selector = self.atoms
|
|
235
|
+
selector_class = type(selector).__name__
|
|
236
|
+
|
|
237
|
+
if dataclasses.is_dataclass(selector):
|
|
238
|
+
fields = dataclasses.fields(selector)
|
|
239
|
+
args = ", ".join(
|
|
240
|
+
f"{f.name}={repr(getattr(selector, f.name))}" for f in fields
|
|
241
|
+
)
|
|
242
|
+
atoms_repr = f"{selector_class}({args})"
|
|
243
|
+
else:
|
|
244
|
+
raise ValueError(
|
|
245
|
+
f"Cannot serialize AtomSelector of type {selector_class}. "
|
|
246
|
+
"AtomSelector must be a dataclass."
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
return f"atoms={atoms_repr}, prefix={repr(self.prefix)}"
|
|
250
|
+
|
|
251
|
+
def _generate_adapter_script(
|
|
252
|
+
self,
|
|
253
|
+
symbols: list[str],
|
|
254
|
+
cv_class_module: str,
|
|
255
|
+
cv_class_name: str,
|
|
256
|
+
cv_init_args: str,
|
|
257
|
+
) -> str:
|
|
258
|
+
"""Generate the Python adapter script content for PLUMED.
|
|
259
|
+
|
|
260
|
+
Parameters
|
|
261
|
+
----------
|
|
262
|
+
symbols : list[str]
|
|
263
|
+
Atomic symbols for reconstructing the Atoms object.
|
|
264
|
+
cv_class_module : str
|
|
265
|
+
Module path where the PyCV subclass is defined.
|
|
266
|
+
cv_class_name : str
|
|
267
|
+
Name of the PyCV subclass.
|
|
268
|
+
cv_init_args : str
|
|
269
|
+
Python code to reconstruct the CV initialization arguments.
|
|
270
|
+
|
|
271
|
+
Returns
|
|
272
|
+
-------
|
|
273
|
+
str
|
|
274
|
+
Python script content.
|
|
275
|
+
"""
|
|
276
|
+
symbols_repr = repr(symbols)
|
|
277
|
+
|
|
278
|
+
return f'''"""Auto-generated PYCV adapter script for {self.prefix}.
|
|
279
|
+
|
|
280
|
+
This script bridges PLUMED's PYCVINTERFACE to the user's PyCV.compute() method.
|
|
281
|
+
Generated by hillclimber.
|
|
282
|
+
"""
|
|
283
|
+
import numpy as np
|
|
284
|
+
import plumedCommunications as PLMD
|
|
285
|
+
from ase import Atoms
|
|
286
|
+
|
|
287
|
+
# Atomic symbols for reconstructing Atoms object
|
|
288
|
+
_SYMBOLS = {symbols_repr}
|
|
289
|
+
|
|
290
|
+
# CV class import and instantiation
|
|
291
|
+
from {cv_class_module} import {cv_class_name}
|
|
292
|
+
_CV_INSTANCE = {cv_class_name}({cv_init_args})
|
|
293
|
+
|
|
294
|
+
# PLUMED initialization - request derivatives
|
|
295
|
+
plumedInit = {{"Value": PLMD.defaults.COMPONENT}}
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def plumedCalculate(action: PLMD.PythonCVInterface):
|
|
299
|
+
"""PLUMED callback for CV calculation."""
|
|
300
|
+
# Get positions from PLUMED (shape: n_atoms x 3)
|
|
301
|
+
positions = action.getPositions()
|
|
302
|
+
|
|
303
|
+
# Reconstruct ASE Atoms object with species info
|
|
304
|
+
atoms = Atoms(symbols=_SYMBOLS, positions=positions)
|
|
305
|
+
|
|
306
|
+
# Call user's compute method
|
|
307
|
+
result = _CV_INSTANCE.compute(atoms)
|
|
308
|
+
|
|
309
|
+
# Handle return value
|
|
310
|
+
if isinstance(result, tuple):
|
|
311
|
+
value, grad = result
|
|
312
|
+
# Box gradients (zeros - no contribution to virial)
|
|
313
|
+
box_grad = np.zeros((3, 3))
|
|
314
|
+
return float(value), np.asarray(grad, dtype=np.float64), box_grad
|
|
315
|
+
else:
|
|
316
|
+
# No gradients provided - return value only
|
|
317
|
+
# Note: This means the CV cannot be biased
|
|
318
|
+
return float(result)
|
|
319
|
+
'''
|
|
320
|
+
|
|
321
|
+
def write_adapter_script(
|
|
322
|
+
self,
|
|
323
|
+
directory: Path,
|
|
324
|
+
atoms: Atoms,
|
|
325
|
+
cv_class_module: str,
|
|
326
|
+
cv_class_name: str,
|
|
327
|
+
cv_init_args: str,
|
|
328
|
+
) -> Path:
|
|
329
|
+
"""Write the Python adapter script for PLUMED.
|
|
330
|
+
|
|
331
|
+
Parameters
|
|
332
|
+
----------
|
|
333
|
+
directory : Path
|
|
334
|
+
Directory to write the script to.
|
|
335
|
+
atoms : ase.Atoms
|
|
336
|
+
Reference structure for extracting symbols.
|
|
337
|
+
cv_class_module : str
|
|
338
|
+
Module path where the PyCV subclass is defined.
|
|
339
|
+
cv_class_name : str
|
|
340
|
+
Name of the PyCV subclass.
|
|
341
|
+
cv_init_args : str
|
|
342
|
+
Python code to reconstruct the CV initialization arguments.
|
|
343
|
+
|
|
344
|
+
Returns
|
|
345
|
+
-------
|
|
346
|
+
Path
|
|
347
|
+
Path to the written script file.
|
|
348
|
+
"""
|
|
349
|
+
symbols = self._get_symbols(atoms)
|
|
350
|
+
module_name = f"_pycv_{self.prefix}"
|
|
351
|
+
script_content = self._generate_adapter_script(
|
|
352
|
+
symbols=symbols,
|
|
353
|
+
cv_class_module=cv_class_module,
|
|
354
|
+
cv_class_name=cv_class_name,
|
|
355
|
+
cv_init_args=cv_init_args,
|
|
356
|
+
)
|
|
357
|
+
script_path = directory / f"{module_name}.py"
|
|
358
|
+
script_path.write_text(script_content)
|
|
359
|
+
return script_path
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
__all__ = ["PyCV"]
|
hillclimber/selectors.py
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import dataclasses
|
|
2
|
+
import typing as tp
|
|
3
|
+
|
|
4
|
+
import ase
|
|
5
|
+
import molify
|
|
6
|
+
import rdkit2ase
|
|
7
|
+
|
|
8
|
+
from hillclimber.interfaces import AtomSelector
|
|
9
|
+
|
|
10
|
+
# --- Indexable Selector Wrappers ---
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclasses.dataclass
|
|
14
|
+
class _GroupIndexedSelector(AtomSelector):
|
|
15
|
+
"""Selector with group-level indexing applied.
|
|
16
|
+
|
|
17
|
+
This is an internal class created when you index a selector at the group level.
|
|
18
|
+
For example: water_sel[0] or water_sel[0:2]
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
selector: AtomSelector
|
|
22
|
+
group_index: int | slice | list[int]
|
|
23
|
+
|
|
24
|
+
def __getitem__(self, idx: int | slice | list[int]) -> AtomSelector:
|
|
25
|
+
"""Atom-level indexing.
|
|
26
|
+
|
|
27
|
+
After group indexing, this applies atom-level indexing.
|
|
28
|
+
For example: water_sel[0:2][1:3] selects atoms 1-2 from groups 0-1.
|
|
29
|
+
"""
|
|
30
|
+
return _AtomIndexedSelector(self, idx)
|
|
31
|
+
|
|
32
|
+
def __add__(self, other: AtomSelector) -> AtomSelector:
|
|
33
|
+
"""Combine two selectors."""
|
|
34
|
+
return _CombinedSelector([self, other])
|
|
35
|
+
|
|
36
|
+
def select(self, atoms: ase.Atoms) -> list[list[int]]:
|
|
37
|
+
"""Apply group indexing to the underlying selector."""
|
|
38
|
+
groups = self.selector.select(atoms)
|
|
39
|
+
|
|
40
|
+
# Apply group indexing (supports negative indices)
|
|
41
|
+
if isinstance(self.group_index, int):
|
|
42
|
+
return [groups[self.group_index]] # Python handles negative indices
|
|
43
|
+
elif isinstance(self.group_index, slice):
|
|
44
|
+
return groups[self.group_index] # Python handles negative indices in slices
|
|
45
|
+
else: # list[int]
|
|
46
|
+
return [
|
|
47
|
+
groups[i] for i in self.group_index
|
|
48
|
+
] # Negative indices work here too
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclasses.dataclass
|
|
52
|
+
class _AtomIndexedSelector(AtomSelector):
|
|
53
|
+
"""Selector with both group and atom-level indexing applied.
|
|
54
|
+
|
|
55
|
+
This is an internal class created when you apply two levels of indexing.
|
|
56
|
+
For example: water_sel[0][0] or water_sel[0:2][1:3]
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
group_selector: _GroupIndexedSelector
|
|
60
|
+
atom_index: int | slice | list[int]
|
|
61
|
+
|
|
62
|
+
def __getitem__(self, idx) -> AtomSelector:
|
|
63
|
+
"""Prevent three-level indexing."""
|
|
64
|
+
raise ValueError("Cannot index beyond 2 levels (group, then atom)")
|
|
65
|
+
|
|
66
|
+
def __add__(self, other: AtomSelector) -> AtomSelector:
|
|
67
|
+
"""Combine two selectors."""
|
|
68
|
+
return _CombinedSelector([self, other])
|
|
69
|
+
|
|
70
|
+
def select(self, atoms: ase.Atoms) -> list[list[int]]:
|
|
71
|
+
"""Apply atom-level indexing to each group."""
|
|
72
|
+
groups = self.group_selector.select(atoms)
|
|
73
|
+
|
|
74
|
+
# Apply atom-level indexing to each group (supports negative indices)
|
|
75
|
+
result = []
|
|
76
|
+
for group in groups:
|
|
77
|
+
if isinstance(self.atom_index, int):
|
|
78
|
+
result.append([group[self.atom_index]]) # Negative indices work
|
|
79
|
+
elif isinstance(self.atom_index, slice):
|
|
80
|
+
result.append(group[self.atom_index]) # Negative indices in slices work
|
|
81
|
+
else: # list[int]
|
|
82
|
+
result.append(
|
|
83
|
+
[group[i] for i in self.atom_index]
|
|
84
|
+
) # Negative indices work
|
|
85
|
+
|
|
86
|
+
return result
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@dataclasses.dataclass
|
|
90
|
+
class _CombinedSelector(AtomSelector):
|
|
91
|
+
"""Selector that combines multiple selectors.
|
|
92
|
+
|
|
93
|
+
This is an internal class created when you combine selectors with +.
|
|
94
|
+
For example: water_sel + ethanol_sel
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
selectors: list[AtomSelector]
|
|
98
|
+
|
|
99
|
+
def __getitem__(self, idx: int | slice | list[int]) -> AtomSelector:
|
|
100
|
+
"""Group-level indexing on combined result."""
|
|
101
|
+
return _GroupIndexedSelector(self, idx)
|
|
102
|
+
|
|
103
|
+
def __add__(self, other: AtomSelector) -> AtomSelector:
|
|
104
|
+
"""Combine with another selector."""
|
|
105
|
+
# Flatten if other is also a CombinedSelector
|
|
106
|
+
if isinstance(other, _CombinedSelector):
|
|
107
|
+
return _CombinedSelector(self.selectors + other.selectors)
|
|
108
|
+
return _CombinedSelector(self.selectors + [other])
|
|
109
|
+
|
|
110
|
+
def select(self, atoms: ase.Atoms) -> list[list[int]]:
|
|
111
|
+
"""Concatenate all groups from all selectors."""
|
|
112
|
+
result = []
|
|
113
|
+
for selector in self.selectors:
|
|
114
|
+
result.extend(selector.select(atoms))
|
|
115
|
+
return result
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclasses.dataclass
|
|
119
|
+
class IndexSelector(AtomSelector):
|
|
120
|
+
"""Select atoms based on grouped indices.
|
|
121
|
+
|
|
122
|
+
Parameters
|
|
123
|
+
----------
|
|
124
|
+
indices : list[list[int]]
|
|
125
|
+
A list of atom index groups to select. Each inner list represents
|
|
126
|
+
a group of atoms (e.g., a molecule). For example:
|
|
127
|
+
- [[0, 1], [2, 3]] selects two groups: atoms [0,1] and atoms [2,3]
|
|
128
|
+
- [[0], [1]] selects two single-atom groups
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
# mostly used for debugging
|
|
132
|
+
indices: list[list[int]]
|
|
133
|
+
|
|
134
|
+
def __getitem__(self, idx: int | slice | list[int]) -> AtomSelector:
|
|
135
|
+
"""Group-level indexing."""
|
|
136
|
+
return _GroupIndexedSelector(self, idx)
|
|
137
|
+
|
|
138
|
+
def __add__(self, other: AtomSelector) -> AtomSelector:
|
|
139
|
+
"""Combine two selectors."""
|
|
140
|
+
return _CombinedSelector([self, other])
|
|
141
|
+
|
|
142
|
+
def select(self, atoms: ase.Atoms) -> list[list[int]]:
|
|
143
|
+
return self.indices
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@dataclasses.dataclass
|
|
147
|
+
class SMILESSelector(AtomSelector):
|
|
148
|
+
"""Select atoms based on a SMILES string.
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
smiles : str
|
|
153
|
+
The SMILES string to use for selection.
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
smiles: str
|
|
157
|
+
|
|
158
|
+
def __getitem__(self, idx: int | slice | list[int]) -> AtomSelector:
|
|
159
|
+
"""Group-level indexing."""
|
|
160
|
+
return _GroupIndexedSelector(self, idx)
|
|
161
|
+
|
|
162
|
+
def __add__(self, other: AtomSelector) -> AtomSelector:
|
|
163
|
+
"""Combine two selectors."""
|
|
164
|
+
return _CombinedSelector([self, other])
|
|
165
|
+
|
|
166
|
+
def select(self, atoms: ase.Atoms) -> list[list[int]]:
|
|
167
|
+
# TODO: switch to molify once available
|
|
168
|
+
matches = rdkit2ase.match_substructure(atoms, smiles=self.smiles)
|
|
169
|
+
return [list(match) for match in matches]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@dataclasses.dataclass
|
|
173
|
+
class SMARTSSelector(AtomSelector):
|
|
174
|
+
"""Select atoms based on SMARTS or mapped SMILES patterns.
|
|
175
|
+
|
|
176
|
+
This selector uses RDKit's substructure matching to identify atoms
|
|
177
|
+
matching a given SMARTS pattern or mapped SMILES string. It supports
|
|
178
|
+
flexible hydrogen handling and can work with mapped atoms for
|
|
179
|
+
precise selection.
|
|
180
|
+
|
|
181
|
+
Note
|
|
182
|
+
----
|
|
183
|
+
The selector is applied only to the first trajectory frame.
|
|
184
|
+
Since indices can change during e.g. proton transfer, biasing specific groups (e.g. `[OH-]`) may fail.
|
|
185
|
+
In such cases, select all `[OH2]` and `[OH-]` groups and use CoordinationNumber CVs.
|
|
186
|
+
Account for this method with all changes in chemical structure.
|
|
187
|
+
|
|
188
|
+
Parameters
|
|
189
|
+
----------
|
|
190
|
+
pattern : str
|
|
191
|
+
SMARTS pattern (e.g., "[F]", "[OH]", "C(=O)O") or SMILES with
|
|
192
|
+
atom maps (e.g., "C1[C:1]OC(=[O:1])O1"). If atom maps are present,
|
|
193
|
+
only the mapped atoms are selected.
|
|
194
|
+
hydrogens : {'exclude', 'include', 'isolated'}, default='exclude'
|
|
195
|
+
How to handle hydrogen atoms in the selection:
|
|
196
|
+
- 'exclude': Remove all hydrogens from the selection
|
|
197
|
+
- 'include': Include hydrogens bonded to selected heavy atoms
|
|
198
|
+
- 'isolated': Select only hydrogens bonded to selected heavy atoms
|
|
199
|
+
|
|
200
|
+
Examples
|
|
201
|
+
--------
|
|
202
|
+
>>> # Select all fluorine atoms
|
|
203
|
+
>>> selector = SMARTSSelection(pattern="[F]")
|
|
204
|
+
|
|
205
|
+
>>> # Select carboxylic acid groups including hydrogens
|
|
206
|
+
>>> selector = SMARTSSelection(pattern="C(=O)O", hydrogens="include")
|
|
207
|
+
|
|
208
|
+
>>> # Select only specific mapped atoms
|
|
209
|
+
>>> selector = SMARTSSelection(pattern="C1[C:1]OC(=[O:1])O1")
|
|
210
|
+
|
|
211
|
+
>>> # Select 4 elements in order to define an angle
|
|
212
|
+
>>> selector = SMARTSSelection(pattern="CC(=O)N[C:1]([C:2])[C:3](=O)[N:4]C")
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
pattern: str
|
|
216
|
+
hydrogens: tp.Literal["include", "exclude", "isolated"] = "exclude"
|
|
217
|
+
|
|
218
|
+
def __getitem__(self, idx: int | slice | list[int]) -> AtomSelector:
|
|
219
|
+
"""Group-level indexing."""
|
|
220
|
+
return _GroupIndexedSelector(self, idx)
|
|
221
|
+
|
|
222
|
+
def __add__(self, other: AtomSelector) -> AtomSelector:
|
|
223
|
+
"""Combine two selectors."""
|
|
224
|
+
return _CombinedSelector([self, other])
|
|
225
|
+
|
|
226
|
+
def select(self, atoms: ase.Atoms) -> list[list[int]]:
|
|
227
|
+
# TODO: switch to molify once available
|
|
228
|
+
return rdkit2ase.select_atoms_grouped(
|
|
229
|
+
molify.ase2rdkit(atoms), self.pattern, self.hydrogens
|
|
230
|
+
)
|