Portfolio
I have worked on various programming projects over the years, this page is an overview over the projects. The portfolio showcases the most important ones, further below is a simple list of the other projects.
Lüscher Analysis
For the $I = 1$, $I_3 = 1$ scattering project I created most of the analysis code using R and our hadron library. The analysis is written in a general way that we can re-use most of the infrastructure for later projects, hence the general name of the code. It starts with the projected correlation functions and does all these steps:
- Outlier detection
- Estimation of autocorrelation time
- Error estimation with bootstrap and/or jackknife
- Generalized eigenvalue problem (GEVP) solving
- Effective mass analysis
- Fitting of two-point and four-point correlation functions
- Conversion of energies into phase shifts via the Lüscher method
- Fitting of Breit-Wigner and IAM phases
- Extrapolation in lattice volume, lattice spacing and pion mass
Each of these steps feeds into extensive R-markdown documents that render to documents with many plots and tables.
Parameter Value Framework
In data analysis I have often faced the need to try multiple variants of the same steps. Inserting variants here and there quickly lead to unmanageable code. The parameter value framework paramvalf provides an effective mean to manage arbitrary many variants of the same analysis. A table with parameters is used to distinguish all the variants and associated values. Different parameter-value-objects are combined using SQL join logic to automatically cover all parameter combinations that are sensible and provide the user with the matching values.
The current implementation is done with R and makes heavy use of the dplyr library. The same ideas could be implemented in Python as well.
hadron
The hadron library is our Lattice QCD analysis toolbox that has functionality for IO, error estimation, GEVP solving, fitting, plotting and other tasks. It is written in R. Since 2018 all members of the group use this for their analysis projects and most people contribute to the library.
My contributions are some new functions but mostly refactoring that was necessary in order to cleanly extend the library. Also I introduced unit tests with testthat and continuous testing on Travis CI. Enforcing that all changes to the master branch go through a reviewed pull request has improved our joint work on the library.
sLapH Projection NG
There was a sLapH projection code that was able to do pion–pion scattering but only with two particles, only in $I = 1$, $I_3 = 1$ and only in P-wave. For my project with three pions I needed something that could project other operators down to the lattice irreducible representations of the octahedral group and created sLapH-projection-NG.
The group theory was already figured out, so I “just” needed to implement this in its general form. For this I have chosen the Wolfram Language and Mathematica. Using this code we can now project operators with arbitrary many particles to all the lattice irreps. During this project I learned a lot about the Wolfram Language and were able to use my functional programming knowledge from Haskell.
There also is a second part which does the numerical projections using the prescriptions computed analytically. This part is written in R and highly parallelized such that each irrep and configuration can be run independently of each other.
sLapH Contractions
One step in the lattice QCD measurement process are the contractions. Large tensorial quantities are reduced down to correlation functions. Tensor contractions themselves are not a hard problem, the logistics around them are. I have contributed to the existing C++11 project sLapH-contractions with a major refactoring. The first step has been the introduction of an integration test such that between each chance we were certain that the results have not changed and have them run on Travis CI. This allowed complete overhaul of control flow without an endless bug search later on.
After the refactoring, there is less code, more features; it uses less memory and further additions are now easier than before.
The project uses OpenMP for multithreading, Eigen for the actual matrix multiplications, CMake to build and HDF5 to store the results.
QPhiX
As part of my master thesis, I have worked on QPhiX, a solver for sparse systems of equations as they appear in lattice quantum chromodynamics (Lattice QCD). It is written in C++ and uses MPI for inter-node communication and OpenMP for threading. The code is tailored for the Intel Xeon Phi platform which runs 64-Bit x86 code but has a large number of threads. The various SIMD length of the Xeon and Xeon Phi architectures requires a data structure that is flexible enough.
A code generator generates intrinsics code for the various targets (none, SSE, AVX, AVX2, AVX512) which by construction unrolls all loops and can interleave software prefetches (needed for Knights Corner). The sparse matrix multiplication is memory bandwidth bound, QPhiX achieves some 75% of the theoretical performance on a single node.
My contributions to the project:
Extension to support two-flavor operators, which is effectively the addition of another dimension to all the array structures. A lot of C++ templates have been used to offer both one-flavor and two-flavor operators without changing existing interfaces and prevent performance regressions.
Introduction of continuous integration on Travis CI. All code is build for general architecture, AVX, AVX2 and AVX512 for each commit in git. Unit tests are run with MPI for AVX on Travis CI.
The build system was ported from GNU Autotools to CMake. The code generator was included in the main repository and code is now generated during the compilation using Jinja templates.
SU(2) Hybrid Monte Carlo
As part of my master thesis, I have written a Hybrid Monte Carlo (HMC) simulation for SU(2) Yang-Mills theory (just gluons, no fermions with two colors). It was an exercise to get to know the HMC algorithm by Duane et al and was compared to data by Creutz. It is available at su2-hmc.
It uses Eigen for the matrices, Boost for its INI parser, gtest for unit tests, and OpenMP for parallelization of loops. Also it uses CMake to build.
Fast Multipole Method
Within the scope of the Guest Student Program (GSP) at the Jülich Supercomputing Center (JSC), I got to work with the Fast Multipole Method (FMM) group for a little over two months. The FMM is a scalable algorithm to compute the long ranged forces between particles with computational complexity linear in the number of particles.
The previous Fortran implementation had been rewritten in C++11 to use costless abstraction features like templates and make specialization for different architectures manageable. During my stay I parallelized one step of the whole algorithm using a communication optimal algorithm by Driscoll et al using MPI. Scaling tests have been performed on the BlueGene/Q installation JUQUEEN.
MEGraMa Data Analysis
The DLR Institute of Materials Physics in Space conducts a series of experiments of granular matter in weightlessness. Particles, in my case about 100 steel spheres of a few millimeter diameter, are excited using magnetic fields and then let to cool down; all while the experiment drops in Bremen’s drop tower. Three high speed cameras observe the weightless particles from perpendicular directions. In less than 10 seconds, five gigabyte of footage has been recorded.
My task has been to extract the 3D trajectories of the particles. In a four month project I have used the OpenCV library to extract 2D information from the images and a 3D model for the cameras (focal length, position, orientation). Correlating the data obtained from the three cameras allowed me to reconstruct the 3D path that the particles took. In this process several [Boost]http://www.boost.org/ classes have been used as well as linear algebra via Eigen. Using those 3D trajectories, the group has been able to compute interesting physical quantities.
The process of extracting data needs a lot of parameters. Thresholds have to be tuned for optimal image processing, path reconstruction, and 3D correlation of data. In order to make this task productive, I have added a Qt 4 GUI that presents the parameters to the user. Leveraging the performance of C++ with OpenMP allows to see the results in real time on a standard desktop computer.
thinkpad-scripts
My ThinkPad X220 Tablet has a rotatable screen which includes a Wacom digitizer pen. On desktop Linux, neither the special bezel buttons nor the correct digital rotation when physically turning the screen works out of the box. In order to conveniently use the laptop, I have started with a small XRandR script in Bash and expanded it to correctly map everything when external screens are present, disabling the TrackPoint, and adding support for the docking station.
A couple years ago I rewrote the collection of Bash scripts in Python. This allowed contributors and me to supply configuration file support, more features for edge cases, and also write unit test. The thinkpad-scripts project is mature now and has attracted a few forks and pull requests.
Unfortunately it only works with X.Org and I have not looked into making it work with Wayland.
jscribble
At first I did not find a note taking program that I could use with my netbook and Wacom digitizer tablet. Taking handwritten notes in a normal photo editing program is cumbersome as one has to create new images for pages manually. My need was to create a new page with one button and quickly switch between the pages.
Using Java and combining a MouseMotionListener
with the
JPanel.paintComponent
led to the very basic drawing program
jscribbe that allowed me to take
as many notes as I wanted. Today I use Xournal which is a much more
sophisticated program for taking handwritten notes.
The whole list
The following is a terse list of the projects that I have worked on over the years. The links usually point to the GitHub repository where you can find more information about the projects as well as the source code.
- awesome-config: Configuration files for Awesome WM
Admin
- ansible-role-dependency: Creates graphs of Ansible role dependencies
- fritzbox-guest-access-analysis: Analyze FRITZ!Box guest WLAN access
- unibn-setup: Setup script for "EDV für Physiker" in 2011
Development
- copyright-updater: Automatically updates copyright headers in source code
- git-changelog: Format a changelog from annotated git tags
-
git-ignore-untracked:
Add all untracked files to
.gitignore
- git-simple-push-build: Automated building as push-hook
- project-tools: Little helpers for programming project management
- python-find2: Find projects which use an outdated Python version
- python-readmeextract: Extract the top-level docstring from a Python module
- vim-headings: Heading formatting shortcut for various markup languages
- vim-regex-collection: A collection of handy regular expressions
Finance
- vigilant-crypto-snatch: A crypto currency trading bot
Games
- brick: Classic brick arcade game
- buddler: Dig out diamonds in a 2D mine
- cornflakes: Shoot a box of cornflakes with a shotgun
- plankton: Collect plankton, similar to Snake
- project-ubernahme: An overly ambitious game project
- risk-auto-dice: Performs the dice rolling in Risk
- samegame: Classic same game
- vacu-clean: Vacuum all the digital dust
- wolverine: Little hit-and-run game without a story
Some utilities for Urban Terror:
- urt-launcher: Disable all but one screen and sets the in-game resolution
- urt-map-silencer: Removes ambient sounds from Urban Terror maps
- urt-map-start: Starts Urban Terror with a given map
- urt-weapbind: Create weapon binding shortcuts
Graphics
-
a4-scan: A wrapper for
scanimage
- fz-juelich-laundry-panels: Translation of the washing machine panels at the FZ Jülich guest house
- info-wallpaper: Generate wallpapers with static information baked in
- jscribble: Note taking program for digitizer enables laptops
- multiimage: Generates a HTML file from multiple images
- picture-db-scripts: Scripts for managing my photo directory
- similar-images: Finds similar images with an O(N²) algorithm, better use Digikam instead
- unwrap-pdf-to-jpeg: Converts PDF to a bunch of JPEGs and back
Hardware
- battery-health: A tracker for battery status information, now obsolete
- external-screen-auto-brightness: Glue between ColorHugALS and ddccontrol
- python-TK5000: Interface for the TK5000 GPS tracker
LaTeX
- csv2latex: Yet another CSV to LaTeX table converter
- fedora-texlive-doc: Installs TeXLive documentation packages for installed packages on Fedora
- latex-edit: Open text editor and compile in the background on changes
- pdflatex-multifont: Typesets the same document with various fonts
- simplewick-generator: Convenient program to generate complicated Wick contractions
-
tex-keywordprg: Opens documentation for a LaTeX package, use
texdoc
instead
Science
- affinator: Visualizes a 2D linear transformation
- lagrange-simulator: Simple animation for various simple Lagrangian systems
- mouse-problem-reloaded: The "mouse problem" with lots of mice
- quasar: A simple game with linear gravity
- traffic-light-efficiency: Tests various acceleration schemes
- van-allen-sim-3d: Simulates a Van-Allen-belt with 3D graphics
Lattice QCD:
- chroma-auxiliary-scripts: Helpers for working with Chroma
- hadron: Lattice QCD analysis toolbox
- mu-correlators: ππ-scattering analysis code for arXiv:1506.00408
- sLapH-contractions: Tensor contractions for stochastic distillation method
- sLapH-projection-NG: Projection of meson operators into octahedral group irreducible representations
- su2-hmc: Pure Yang-Mills gauge theory with two colors and Hybrid Monte Carlo
Fractals:
- iterated-fractal-generator: Generates fractals iteratively
- koch-flake-raphael: Paints a Koch snowflake with RafaëlJS
- mandelbrot-performance: Mandelbrot image generator with various performance stages
- sierpinski-generator: Generates Sierpinski sieves
- sierpinski-png: Generates Sierpinski sieves
Group Theory:
- cycle-structure: Generate cycle structure of the permutation group
- young-frame-product: Compute products of Young frames
Data Analysis:
- fastplot: Quickly generate X-Y plots from TSV data
- format-value-error: Pretty printer for value and error, implemented in Octave, Python, and R
- paramvalf: Parameter value framework
- test-fit-error: Test error scaling of different curve fit implementations
Sound & Video
- mp3-packer: Duplicates a hierarchy of music files with lower bitrate
- Ultrastar-Song-Checker: Data management for the Ultrastar karaoke system
Utilities
- adium2pidgin: A log converter from Adium to Pidgin
- backup-scripts: Helper scripts for creating backups
- bank-statement-parser: Parses CSV files from the bank
- bogomips: Neat output of bogomips
- bqm-interface: Unification for various batch queue management systems
- computerphysik-review: Combine program and supplements into one review PDF
- firefox-bookmark-normalizer: Converts URLs of bookmarks into a common format
- freemind-auto-link: Link PDF files within a FreeMind mind map
- legacy-file-formats: Converts non-standard into standard formats
- live-power-cost: Calculates the electricity cost of the laptop
- lock-and-off: Locks the screens and powers them off
- maintenance: Recurring task executor
- math-clock: A 24-hour clock which moves counter-clockwise
- moinmoin-to-csv: Converts MoinMoin tables to CSV and back
- pretty-json: Pretty-printer for JSON data
- problem-set-peer-review: Send current problem sets to friends via email
- template-spawner: Copies templates into a given location
- thinkpad-scripts: Utilities for ThinkPads
- type-speed: Measures typing speed
- uni-tools: Tools for my university studies
- wlan-qr: Generate a WLAN QR code for Android
- xournal-page-count: Counts pages in Xournal files
Websites and Webapps
- address-db: An address database for a whole family
- cakemarks: Bookmark management
- php-note-capture: Allows to store notes on the go and download them later
- robotic-arm: Inverse kinematic robotic arm widget
- server-bill: Bill management for freelancing web developers
- shopping-list: Shopping list
- yearbook-gossip: Collection of gossip for our yearbook