# Specify Different Geometries and Absorption

RadonKA.jl offers two different geometries right now. See also this pluto notebook

The simple and default interface is `RadonParallelCircle`

. This traces the rays parallel through the volume. However, only rays inside a circle of the image are considered.

## RadonParallelCircle

See also the `RadonParallelCircle`

docstring. The essence is the specification of a range or vector where the incoming position of a ray is. This is with respect to the center pixel at `div(N, 2) +1`

.

### Parallel

The first example is the default. Just a parallel ray geometry.

```
angles = [0]
# output image size
N = 200
sinogram = zeros((N - 1, length(angles)))
sinogram[1:5:end] .= 1
geometry_parallel = RadonParallelCircle(N, -(N-1)÷2:(N-1)÷2)
projection_parallel = backproject(sinogram, angles; geometry=geometry_parallel);
simshow(projection_parallel)
```

### Parallel Small

```
sinogram_small = zeros((99, length(angles)))
sinogram_small[1:3:end] .= 1
geometry_small = RadonParallelCircle(200, -49:49)
projection_small = backproject(sinogram_small, angles; geometry=geometry_small);
simshow(projection_small)
```

`RadonFlexibleCircle`

See also the `RadonFlexibleCircle`

docstring. This interface has a simple API but is quite powerful. The first range indicates the position upon entrance in the circle. The second range indicates the position upon exit of the circle.

### fan Beam

```
geometry_fan = RadonFlexibleCircle(N, -(N-1)÷2:(N-1)÷2, range(-(N-1)÷4, (N-1)÷4, N-1))
projected_fan = backproject(sinogram, angles; geometry=geometry_fan);
simshow(projected_fan, γ=0.01)
```

```
geometry_extreme = RadonFlexibleCircle(N, -(N-1)÷2:(N-1)÷2, zeros((199,)))
projected_extreme = backproject(sinogram, angles; geometry=geometry_extreme);
simshow(projected_extreme, γ=0.01)
```

# Using Different weighting

For example, if in your application some rays are stronger than others you can include weight factor array into the API.

```
geometry_weight = RadonParallelCircle(N, -(N-1)÷2:(N-1)÷2, abs.(-(N-1)÷2:(N-1)÷2))
projection_weight = backproject(sinogram, angles; geometry=geometry_weight);
simshow(projection_weight)
```

### Absorption

The ray gets some attenuation with `exp(-μ*x)`

where `x`

is the distance traveled to the entry point of the circle. `μ`

is in units of pixel.

```
projected_exp = backproject(sinogram, angles; geometry=geometry_extreme, μ=0.04);
simshow(projected_exp)
```

### Spatially Varying Absorption

The ray gets some attenuation with `exp(-μ*x)`

where `μ`

varies spatially. To represent this spatial variation, we can simply use an array for μ.

```
μ = 0.5 .* box((N, N), (2, 50));
simshow(μ)
```

```
projected_1 = backproject(sinogram, angles, μ=μ);
projected_2 = backproject(sinogram, angles .+ π / 4, μ=μ);
[simshow(projected_1) simshow(projected_2)]
```