using Unitful: mm, ° using Plots # these 2 must precede 'using Sinograms' for sino_plot_rays to work using Sinograms: SinoPar, SinoMoj, SinoFanArc, SinoFanFlat, SinoFan using Sinograms: sino_plot_rays, rays, angles using MIRTjim: jim, prompt using InteractiveUtils: versioninfo isinteractive() ? jim(:prompt, true) : prompt(:draw); SinoPar() rg = SinoPar( ; nb = 64, # number of radial samples ("bins") na = 30, # number of angular samples d = 2mm, # detector spacing offset = 0.25, # quarter detector offset (unitless) orbit = 180, # angular range (in degrees) orbit_start = 0, # starting angle (in degrees) ) angles(rg) sino_plot_rays(rg; ylims=(0,180), yticks=(0:90:180), widen=true, title="Parallel") prompt() rg = SinoFanArc( ; nb=888, na=984, d=1.0239mm, offset=1.25, dsd=949.075mm, dod=408.075mm) rg = SinoFanArc( ; nb=64, na=30, d=20mm, offset=0.25, dsd=900mm, dod=400mm) sino_plot_rays(rg; ylims=(-50,400), yticks=(0:180:360), widen=true, title="Fan-beam for arc detector") prompt() rg = SinoFanFlat( ; nb=64, na=30, d=20mm, offset=0.25, dsd=900mm, dod=400mm) sino_plot_rays(rg; ylims=(-50,400), yticks=(0:180:360), widen=true, title="Fan-beam for flat detector") prompt() rg = SinoMoj( ; nb=60, na=30) sino_plot_rays(rg; ylims=(0,180), yticks=(0:90:180), widen=true, title="Mojette sampling") plot(xlims=(-1,1) .* 3.5, ylims = (-1,1) .* 2.5, xlabel="x", ylabel="x") default(label="") for y in -2:2 plot!([-3, 3], [y, y], color=:black) end for x in -3:3 plot!([x, x], [-2, 2], color=:black) end plot_ray!(r, ϕ) = plot!( r*cos(ϕ) .+ [-1, 1] * 4 * sin(ϕ), r*sin(ϕ) .+ [1, -1] * 4 * cos(ϕ), color = :blue, ) ia = 4 # pick an angle i = rays(rg) # iterator rs = [i[1] for i in i] # radial samples ϕs = [i[2] for i in i] # projection angle r = rs[:,ia] r = r[abs.(r) .< 3] ϕ = ϕs[1,ia] plot_ray!.(r, ϕ) plot!(aspect_ratio=1, title = "Mojette line integrals")