Software Projects
Scientific (Examol)
Cloud-native kubernetes applications and infrastructure for computational drug-discovery. Should be open-sourced in the near future.
Scientific (PhD)
wepy
Repo: https://github.com/ADicksonLab/wepy
wepy
is a pure-python framework and library I wrote to support my
PhD thesis work in doing weighted ensemble simulations of drug
binding via the OpenMM extension.
The main feature of wepy
was to add support for fast prototyping new
resampling algorithms that are substantially more flexible & complex
than other libraries allowed for.
It also has support for a general purpose random-access single-file database format in HDF5 that drastically simplifies the organization of simulation data as well as making it cross-platform; avoiding bugs such as those arising from differences in lexical sorting of file names between different OSes.
wepy
simulations are assembled and configured in python and avoids
the complexities of dealing with various static configuration files
(which are really only necessary for allowing untrusted users to
customize behavior).
wepy
is highly customizable while still isolating each component
making it very simple to extend only the things you need.
geomm
Repo: https://github.com/ADicksonLab/geomm
geomm
is a python library that provides pure-function
implementations for common computations in biophysics.
It is mainly a response to most libraries in the field of biophysics all having mutually incompatible in-memory object representations and the need to convert between all of them when composing them.
mastic
Repo: https://github.com/ADicksonLab/mastic
This is a library for profiling arbitrary inter-molecular interactions in molecular systems.
It provides automatic detection of functional groups through rdkit
but also allows you to define your own definitions for functional
groups.
It provides a library of common functional groups for profiling, but this is extensible as well.
Results come as pure-python objects as well as pandas tables which can then be exported to any format or database.
Scopes programming language
In my spare time I mostly enjoy programming in the Scopes programming language as a alternative to C/C++ or Rust for multimedia applications.
See the scopes-demos for some demonstrations of it in action.
If your interested also check out my (WIP) third party user guide to programming in Scopes, especially oriented towards those coming from dynamic languages like Python: scopes-newbs.
Some other things I maintain related to Scopes:
- scopes library template
- This is a template managed by the copier templating tool that will automatically generate a Scopes library project and keep it up to date that utilizes Spack for package management.
- scopes-raylib
- Scopes bindings to raylib game development toolkit.
- scopes-chipmunk2d
- Scopes bindings to the chipmunk2d 2D physics library.
- ob-scopes
- Org-babel code execution and code blocks for
emacs. Allows you to execute scopes code directly in Org-mode
files. This is utilized in
scopes-newbs
.
Spack package index
I also maintain a Spack repository of packages oriented towards multimedia and Scopes development called, snailpacks. This repo also has many examples of integrating Spack as a package manager into your build system scripts.
General Purpose Utilities
bibby
- Command line interface to update a local bibtex file from bibsonomy.org for paper and book citations.
inkscape_pages
- CLI to turn a multi-layer Inkscape SVG file into a multi-page PDF. I use this for making slide decks.
- python
serialize_test
- Simple utility to quickly benchmark the speed of various python serialization tools on files of your choice.
- pymatuning
- Generate org-mode TODO hierarchies from python modules. I used this to generate a TODO list for writing/auditing docstrings for my large projects.
Personal Productivity
bimhaw
Repo: https://github.com/salotz/bimhaw.
bimhaw
provides layer of indirection over shell configurations
(i.e. .profile
and .bashrc
files) that is semantically meaningful
and allows for componentization and several distinct user profiles.
refugue
Repo: https://github.com/salotz/refugue
refugue
is a tool for managing data synchronizations between a
personal network of computers and drives.
It allows you to perform synchronizations from any computer (actually the more fine-grained concept of a replica) by using meaningful pet names instead of network addresses.
Synchronizations are specified using a small vocabulary of
well-documented behaviors that are then "compiled" to the underlying
tool being used to perform transfers (i.e. rsync
).
It also simplifies and unifies the process of defining working sets that are to be present on different machines. For instance having different sets of files on your laptop vs. your servers.
Here is an example:
refugue --sync='' computerA/tree computerB/backup
Where computerA/tree
and computerB/bacup
are file subtree on a
specific host or disk drive.
Working sets for each are defined in a local versionable configuration file and need not be executed on either of the two computers in the command (as long as they are reachable via ssh).
Polyrepo Tools
jubeo
Repo: https://github.com/salotz/jubeo
Sometimes I described this as a "Meta-Project Protocol" which is based on a term from object based systems like Smalltalk and Common Lisp's Meta-Object Protocol which is a way to update "living" code objects.
This is a tool for updating and maintaining tooling for different types of projects (software dev, analytics, website design, etc.).
The overarching goal is to regain some of the original unix-philosophy of writing small tools that do one thing, and work well together. I.e. developing polyrepos (as opposed to monorepos).
The problem is that in modern dev environments there are so many things to set up and manage:
- versioning
- tests
- releases
- building documentation
- running regression tests
- code formatting
- type checking
- managing virtual environments
Which can get tedious very quickly if you have more than a few projects to do this all for.
Historically, this was done through makefiles which is a practice almost long-forgotten by python devs. And as a result a dizzying plethora of repository management tools have come up that try to do all of this in one package.
jubeo
allows you to configure simple tools in one place (a
repository and component modules) and then distribute (through simple
file copying) to many different projects, while allowing you to name
tasks semantically rather than based on specific tools (i.e. build
rather than python setup.py sdist wheel
).
Furthermore, once tools are copied they belong to the code base and
are versioned along with it. You aren't adding a dependency on jubeo
to give you this stuff. All jubeo
does is make it simple to update
or fix tooling (such as build
, release
, & publish
) that are all
the same across many different projects.
This makes it much lower friction to just make a new tool (i.e. a different package to `pip install`) rather than adding a feature to an existing CLI you are familiar with since you won't have to manually perform all the boring stuff maintainers do.
In an existing project you would run something similar to get started (on a new python package):
jubeo init --upstream=git+https://github.com/salotz/jubeo.git#repos/python .
pip install -r .jubeo/requirements.txt
Then you should be able to see all the tasks that are available to you:
inv -l
inv py.build
Then just commit them like you would any other helper script.
When you want to update your tools just run:
jubeo update .
git commit -m "updated jubeo tools"
If you don't like the new changes, just roll back that commit! No more figuring out dependency hell for your tooling. Just fix the problem and get back to work.
It also allows you to add custom tasks and targets for your project
which will always be necessary. Just write new invoke
files in the
tasks/plugins
folder and add them to the list in
tasks/plugins/__init__.py
It leverages invoke
and doit
(WIP) to give a uniform command-line
interface across all tools.