Skip to main content

A package for generating toy tracking data.

Project description

ToyTrack

Documentation Status

ToyTrack is a Python library for generating toy tracking events for particle physics.

The goal: To produce a "good-enough" event simulation, in as few lines as possible (currently 3 lines), as quickly as possible (currently 0.07 seconds for a 10,000-particle event).

Installation

Use the package manager pip to install ToyTrack.

pip install toytrack

Optionally, there are Pytorch dataloaders available for convenience. These require the torch package.

pip install toytrack[torch]

Usage

Vanilla Event

from toytrack import ParticleGun, Detector, EventGenerator

# Initialize a particle gun which samples uniformly from pt between 2 and 20 GeV, 
# initial direction phi between -pi and pi, and creation vertex vx and vy between -0.1 and 0.1 cm
# and which fires a normally-distributed number of particles with mean 20 and standard deviation 5
particle_gun = ParticleGun(num_particles=[20, 5, 'normal'], pt=[2, 20], pphi=[-np.pi, np.pi], vx=[-0.1, 0.1], vy=[-0.1, 0.1])

# Initialize a detector, a barrel-like detector with inner radius of 0.5 cm, and outer radius of 3 cm,
# with 10 layers
detector = Detector(dimension=2).add_from_template('barrel', min_radius=0.5, max_radius=3, number_of_layers=10)

# Initialize an event generator and generate an event
event = EventGenerator(particle_gun, detector).generate_event()

# Access the particles, hits and tracks as needed
particles = event.particles
hits = event.hits
tracks = event.tracks

# Plot the event
event.display()

Example Event

Event with Track Holes

... # as above

# Initialize a detector that randomly drops 10% of hits. If an int N is given, then exactly
# N hits per track are dropped
detector = Detector(dimension=2, hole_inefficiency=0.1).add_from_template('barrel', min_radius=0.5, max_radius=3, number_of_layers=10)

... # as above

# Plot the event
event.display()

Example Event with Holes

Event with Noise Hits

... # as above

# Generate event with between 30% and 70% noise hits per real hits. E.g. If the event has 100 
# real hits, then between 30 and 70 noise hits will be generated. If an int N is given, then
# the absolute value of N noise hits are generated
event = EventGenerator(particle_gun, detector, noise=[0.3, 0.7]).generate_event()

... # as above

# Plot the event
event.display()

Example Event with Noise

Event with Multiple Particle Guns

# Initialize one particle gun which samples uniformly from pt between 2 and 3 GeV, 
# initial direction phi between -pi and pi, and creation vertex vx and vy between -0.1 and 0.1 cm
particle_gun_1 = ParticleGun(num_particles=[20, 5, 'normal'], pt=[2, 3], pphi=[-np.pi, np.pi], vx=[-0.1, 0.1], vy=[-0.1, 0.1])

# Initialize another particle gun which samples uniformly from pt between 100 and 200 GeV, 
# initial direction phi between -pi and pi, and creation vertex vx and vy between -0.1 and 0.1 cm
particle_gun_2 = ParticleGun(num_particles=1, pt=[100, 200], pphi=[-np.pi, np.pi], vx=[-0.1, 0.1], vy=[-0.1, 0.1])

... # as above

# Initialize an event generator with a list of particle guns
event = EventGenerator([particle_gun_1, particle_gun_2], detector).generate_event()

... # as above

# Plot the event
event.display()

Example Event with Multiple Particle Guns

Detector with Layer Safety Guarantee

We can ensure that each particle has exactly one hit per layer by setting the layer_safety_guarantee flag to True.

Consider an event with low pT particles:

particle_gun = ParticleGun(num_particles=[20, 5, 'normal'], pt=[1, 3], pphi=[-np.pi, np.pi], vx=[-0.1, 0.1], vy=[-0.1, 0.1])

detector = Detector(dimension=2, layer_safety_guarantee=False).add_from_template('barrel', min_radius=0.5, max_radius=3, number_of_layers=10)

event = EventGenerator(particle_gun, detector).generate_event()

event.display()

Example Event with Low pT Particles

... # as above

# Initialize a detector WITH layer safety guarantee
detector = Detector(dimension=2, layer_safety_guarantee=True).add_from_template('barrel', min_radius=0.5, max_radius=3, number_of_layers=10)

... # as above

event.display()

Example Event with Layer Safety Guarantee

Observe that particles with such low pT that they "curled" before the final layer are now removed.

Performance

ToyTrack is designed to be fast. The following benchmarks were performed on a 64-core AMD EPYC 7763 (Milan) CPU.

Scaling Study

Data Loading

Pytorch Dataset

The TracksDataset class is a Pytorch dataset which can be used with a Pytorch dataloader. It can return either hitwise structure or trackwise structure.

from toytrack.dataloaders import TracksDataset

config = {
    "detector": {
        "dimension": 2,
        "hole_inefficiency": 0,
        "min_radius": 0.5,
        "max_radius": 3.,
        "number_of_layers": 10,
    },
    "particle_guns": [
        {
            "num_particles": [20, 5, 'normal'],
            "pt": [2, 20],
            "pphi": [-3.14159, 3.14159],
            "vx": [-0.1, 0.1],
            "vy": [-0.1, 0.1]
        }
    ],
    "structure": "hitwise"
}

# initialize dataloader
dataset = TracksDataset(config)

# iterate over dataset
for sample in dataset:
    x, mask, pids, event = sample["x"], sample["mask"], sample["pids"], sample["event"]
    # x has shape (num_hits, num_features)

For trackwise structure:

config = {
    ... # as above
    "detector": {
        ... # as above
        "layer_safety_guarantee": True # Must be True for trackwise structure
        ... # as above
    }
    "structure": "trackwise"
}

# initialize dataloader
dataset = TracksDataset(config)

# iterate over dataset
for sample in dataset:
    x, mask, pids, event = sample["x"], sample["mask"], sample["pids"], sample["event"]
    # x has shape (num_tracks, num_hits_per_track, num_features)

Pytorch DataLoader

from torch.utils.data import DataLoader

dataloader = DataLoader(dataset, batch_size=100, collate_fn=dataset.collate_fn)

# iterate over dataloader
for batch in dataloader:
    x, mask, pids, event = batch["x"], batch["mask"], batch["pids"], batch["event"]
    # Do something with the batch (which now has an extra batch dimension of size 100)

You can also get a straightforward parallelisation, with

dataloader = DataLoader(dataset, batch_size=100, collate_fn=dataset.collate_fn, num_workers=16)

Transformations

You can apply transformations to the dataset by passing a list of transformations to the TracksDataset class. For example, to convert a trackwise dataset into patches of 3 hits each, you can do the following:

from toytrack.transforms import TrackletPatchify

transform = TrackletPatchify(num_patches_per_track=3)
dataset = TracksDataset(config, transform=transform)

# iterate over dataset
for sample in dataset:
    x, mask, pids, event = sample["x"], sample["mask"], sample["pids"], sample["event"]
    # x has shape (num_tracks * num_patches_per_track, num_hits_per_patch, num_features)

Example Event with Tracklet Patchify

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

toytrack-0.1.22.tar.gz (15.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

toytrack-0.1.22-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file toytrack-0.1.22.tar.gz.

File metadata

  • Download URL: toytrack-0.1.22.tar.gz
  • Upload date:
  • Size: 15.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.26.0 requests-toolbelt/0.9.1 urllib3/1.26.7 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.5

File hashes

Hashes for toytrack-0.1.22.tar.gz
Algorithm Hash digest
SHA256 38fdd712a6649b22d2e61529fb9761d2bc14111112b2fe39b70190bb95cce674
MD5 4713859d6da0c5cb71ccc90ef69c519a
BLAKE2b-256 a91705e9354d4fe8c91f696f1b94c1363a1db4cea16f514efa3e0e0510328718

See more details on using hashes here.

File details

Details for the file toytrack-0.1.22-py3-none-any.whl.

File metadata

  • Download URL: toytrack-0.1.22-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.26.0 requests-toolbelt/0.9.1 urllib3/1.26.7 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.5

File hashes

Hashes for toytrack-0.1.22-py3-none-any.whl
Algorithm Hash digest
SHA256 f97c9885ba07b0557dd6f9da20f790c953eb8e26948845d82b593c7f978809ac
MD5 565cbc0a6d2d6fb345a5d6b78085cb08
BLAKE2b-256 6531bd20571c61c91dd4c84dfb024337d8cd66808375a94c854e9531b09f3736

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page