# LorentzVectors.jl

This package defines the `LorentzVector{T}`

and `SpatialVector{T}`

types for use in computations involving Special Relativity. These types are statically allocated and should therefore be very fast.

The usual algebraic operations are implemented, as well as some domain-specific functions (such as `boost`

) and many convenience methods.

The signature of the Minkowski metric (used for the inner product) is `+,-,-,-`

.

⬇️ Installing

This package is now registered. To install it, just issue the following command from the Julia REPL:

```
(v1.0) pkg> add LorentzVectors
```

ℹ️ Usage

```
using LorentzVectors
p1 = Vec4(10, 0, 0, 10)
p2 = Vec4(7, 0, 1, 5)
m1 = √(p1⋅p1)
@assert m1 == 0 # p1 is lightlike, so its mass must be zero
m2 = √(p2⋅p2)
@assert m2 > 0
β1 = Vec3(p1/p1.t)
@assert norm(β1) ≈ 1 # Check that p1 travels at the speed of light
p2_rest = boost(p2, p2/p2.t) # Boost p2 to its rest frame
@assert p2_rest.t ≈ m2 # Check that its energy at rest is equal to its mass
@assert boost(p2, zero(Vec3)) ≈ p2 # Identity boost
p_tot = p1 + p2
β_cm = p_tot/p_tot.t # Compute the velocity of the center of mass (CM)
p1_cm = boost(p1, β_cm) # Boost p1 and p2 to the CM frame
p2_cm = boost(p2, β_cm)
@assert norm(Vec3(p1_cm + p2_cm)) < 1e-12 # Check that the spatial parts cancel in the CM
u1 = rand(Vec3{Float64}) # Generate a random 3-vector on the unit sphere
@assert norm(u1) ≈ 1
u2 = normalize(Vec3(p2)) # Extract the spatial direction of p2
@assert norm(u2) ≈ 1
@assert Vec4 === LorentzVector # Long forms
@assert Vec3 === SpatialVector
x = Vec3(1f0, 0, 0) # Float64 is used by default, but it can be overriden
@assert typeof(x) == Vec3{Float32}
```

For more examples, have a look in the `test`

directory.

❤️ Contributing

All contributions and suggestions are welcome ! Just open an issue or directly send a PR.