Usage Guide

How to use Quantum Collider Sandbox for simulation, exploration, and analysis.

Starting the Simulation

Basic startup:

make run

Or directly:

python -m quantum_collider_sandbox

With command-line options:

python -m quantum_collider_sandbox \
   --preset lhc_pp \
   --particles 50 \
   --width 1920 \
   --height 1200

Available CLI options:

  • --preset NAME — Load preset (“default”, “lhc_pp”, “black_hole”, etc.)

  • --particles N — Spawn N particles on startup

  • --width W — Window width (pixels)

  • --height H — Window height (pixels)

  • --fullscreen — Launch in fullscreen mode

  • --backend BACKEND — GPU backend (“vulkan”, “cuda”, “cpu”, “metal”)

Basic Workflow

1. Explore a preset:

  1. Launch with make run

  2. From ImGui left panel, select “Presets” dropdown

  3. Pick one (e.g., “Cyclotron”)

  4. Watch simulation play (SPACE to pause/resume)

  5. Rotate camera with right-mouse drag

  6. Zoom with mouse scroll

2. Adjust parameters in real-time:

  1. Find slider in ImGui (e.g., “Coulomb K”)

  2. Drag to new value

  3. See effect immediately (forces recalculate each frame)

  4. Adjust Substeps if motion looks jerky

3. Export results:

# Save current state to HDF5
Ctrl+S

# Export physics events to JSONL
Ctrl+Shift+J

# Files go to data/exports/ and data/logs/

4. Analyze output:

import h5py
import json

# Load state
with h5py.File("data/exports/state_1234567.h5", "r") as f:
    particles = f["particles"][:]
    positions = f["positions"][:]

# Read physics log
with open("data/logs/physics_1234567.jsonl") as f:
    for line in f:
        event = json.loads(line)
        if event["type"] == "collision":
            print(f"Collision: {event['particle_a']} + {event['particle_b']}")

Common Tasks

Spawn specific particle type:

  1. Press + to spawn random particle

  2. Use Python API directly (see below)

Create high-energy collision:

  1. Select “LHC pp” or “e⁺e⁻” preset

  2. Watch beams collide

  3. Adjust forces if desired

Study gravitational dynamics:

  1. Select “N-Body Virial” preset

  2. Watch self-gravitating cluster

  3. Adjust G slider to change strength

Test Coulomb scattering:

  1. Select “Rutherford” preset

  2. Observe scattering angles vs impact parameter

  3. Adjust K to strengthen/weaken repulsion

Record trajectory data:

  1. Run simulation

  2. Press Ctrl+S periodically to snapshot states

  3. Load and analyze in Python (see examples below)

Python API Usage

You can script simulations and analysis in Python:

from quantum_collider_sandbox.simulation import Simulation
from quantum_collider_sandbox.config import Config
import numpy as np

# Initialize simulation
sim = Simulation(preset="default")

# Run for N timesteps
for step in range(1000):
    sim.step()
    if step % 100 == 0:
        ke = sim.compute_kinetic_energy()
        print(f"Step {step}: KE = {ke:.2f}")

# Get particle data
positions = sim.get_particle_positions()
velocities = sim.get_particle_velocities()
types = sim.get_particle_types()

print(f"Total particles: {len(types)}")
print(f"Avg velocity: {np.mean(np.linalg.norm(velocities, axis=1)):.2f}")

Data Export & Import

Export current state:

ImGui panel → “Save State” button, or press Ctrl+S

This creates an HDF5 file with:
  • Particle positions, velocities, types

  • Force parameters at export time

  • Timestamp metadata

Import previous state:

Press Ctrl+L and select an HDF5 file from data/exports/

Simulation will resume from that configuration.

Export physics events:

Press Ctrl+Shift+J to log all physics events to JSONL

Logged events include:
  • Collisions (type A + type B → products)

  • Decays (X → Y + Z + …)

  • Pair creations

  • Boundary interactions

Analyze events in Python:

import json

with open("data/logs/physics_events.jsonl") as f:
    collisions = []
    for line in f:
        event = json.loads(line)
        if event["type"] == "collision":
            collisions.append(event)

print(f"Total collisions: {len(collisions)}")
for coll in collisions[:5]:
    print(f"  {coll['particle_a']} + {coll['particle_b']}{coll['products']}")

Performance Monitoring

In-window stats:

The ImGui left panel shows real-time statistics:

  • FPS — Frames per second (target ≥ 30)

  • Frame Time — Milliseconds per frame

  • Particle Count — Active particles (update per step)

  • Kinetic Energy — Total KE summed over particles

  • Momentum — Total momentum magnitude |**p**|

  • Avg Velocity — Mean speed across particles

If FPS drops:

  1. See Performance Tuning section

  2. Common fixes: - Reduce TRAIL_LENGTH (Press T to bypass trails) - Reduce particle count - Lower rendered resolution

Advanced: Batch Scripting

Run multiple simulations automatically:

from quantum_collider_sandbox.simulation import Simulation
import json

results = []

# Sweep over Coulomb strength
for k in [10, 20, 40, 80]:
    config = {"coulomb_k": k}
    sim = Simulation(preset="rutherford", config_override=config)

    for step in range(500):
        sim.step()

    # Record final state
    results.append({
        "coulomb_k": k,
        "final_particles": sim.num_particles,
        "final_ke": sim.compute_kinetic_energy(),
    })

# Save results
with open("sweep_results.json", "w") as f:
    json.dump(results, f, indent=2)

Tips & Tricks

Faster frame rate:

  • Reduce window resolution (WINDOW_WIDTH, WINDOW_HEIGHT in config)

  • Disable trails (T key)

  • Reduce trail length (TRAIL_LENGTH in config; Phase 1: try 5-20)

  • Fewer particles (use +/- keys or IMGui slider)

Better camera angles:

  • Right-mouse drag to rotate

  • Scroll wheel to zoom

  • Pan with middle-mouse (or Shift+right-drag)

  • Reset to default: R key (but particles reset too!)

Inspect a specific particle:

  • Hover over particle in 3D view

  • Click to select (if implemented)

  • Inspector panel shows type, mass, lifetime, trajectory

Slow-motion analysis:

  • Pause (SPACE)

  • Advance frame-by-frame with arrow keys (if implemented)

  • Or reduce DT and SUBSTEPS in config for slower speed

Record for video:

  1. Pause simulation (SPACE)

  2. Set up desired initial state

  3. Press Ctrl+S to snapshot

  4. Use FFmpeg or OBS to capture screen:

    ffmpeg -f x11grab -i :0 -vcodec libx264 -crf 0 recording.mp4