added dispersion class, full optimiser in the test suite, and created rainbows