diff options
Diffstat (limited to 'julia')
-rw-r--r-- | julia/plot-geom.jl | 123 |
1 files changed, 64 insertions, 59 deletions
diff --git a/julia/plot-geom.jl b/julia/plot-geom.jl index a903eac6..f5841064 100644 --- a/julia/plot-geom.jl +++ b/julia/plot-geom.jl @@ -1,23 +1,15 @@ using CrystFEL using GLMakie -f = Figure(size=(1024,1024)) -ax = Axis3(f[1,1], aspect=:equal, limits=(nothing,nothing,nothing,nothing,0,0.3), - xlabel="x (meters)", ylabel="y (meters)", zlabel="z (meters)") -sl = Slider(f[2,1], range=0:0.01:1) -btoggle = Toggle(f, halign=:left, tellwidth=false) -f[3,1] = grid!([1,1]=>Label(f, "Show beams", halign=:right, tellwidth=false), [1,2]=>btoggle) - -dtempl = loaddatatemplate("cxidb-21.geom") -cfimage = CrystFEL.Image(dtempl) - -motions = let fh = open("millepede.res", "r") - readline(fh) # discard header line - motions = map(eachline(fh)) do line - sgroupser,sdelta,_ = split(line) - (parse(Int,sgroupser), parse(Float64,sdelta)) +function readmillepede(filename) + motions = let fh = open(filename, "r") + readline(fh) # discard header line + motions = map(eachline(fh)) do line + sgroupser,sdelta,_ = split(line) + (parse(Int,sgroupser), parse(Float64,sdelta)) + end + motions end - motions end function translate!(panel::DetGeomPanel, vec) @@ -73,56 +65,69 @@ function rotatez!(group::DetGeomGroup, center, angle) end end -triangles = lift(sl.value) do trscale - - dgmoved = cfimage.detgeom # Makes a fresh copy of underlying C structure - - # Apply all `motions` in the same way as align_detector - for m in motions - param = m[1] % 100 - group = findgroup(dgmoved, m[1]-param) - if param == 1 - translate!(group, trscale*[-m[2],0,0]) - elseif param == 2 - translate!(group, trscale*[0,-m[2],0]) - elseif param == 3 - translate!(group, trscale*[0,0,-m[2]]) - elseif param == 4 - rotatex!(group, group.center, trscale*-m[2]) - elseif param == 5 - rotatey!(group, group.center, trscale*-m[2]) - elseif param == 6 - rotatez!(group, group.center, trscale*-m[2]) +function plotgeom!(dtempl, motions) + + f = Figure(size=(1024,1024)) + ax = Axis3(f[1,1], aspect=:equal, limits=(nothing,nothing,nothing,nothing,0,0.3), + xlabel="x (meters)", ylabel="y (meters)", zlabel="z (meters)") + sl = Slider(f[2,1], range=0:0.01:1) + btoggle = Toggle(f, halign=:left, tellwidth=false) + f[3,1] = grid!([1,1]=>Label(f, "Show beams", halign=:right, tellwidth=false), [1,2]=>btoggle) + + cfimage = CrystFEL.Image(dtempl) + triangles = lift(sl.value) do trscale + + dgmoved = cfimage.detgeom # Makes a fresh copy of underlying C structure + + # Apply all `motions` in the same way as align_detector + for m in motions + param = m[1] % 100 + group = findgroup(dgmoved, m[1]-param) + if param == 1 + translate!(group, trscale*[-m[2],0,0]) + elseif param == 2 + translate!(group, trscale*[0,-m[2],0]) + elseif param == 3 + translate!(group, trscale*[0,0,-m[2]]) + elseif param == 4 + rotatex!(group, group.center, trscale*-m[2]) + elseif param == 5 + rotatey!(group, group.center, trscale*-m[2]) + elseif param == 6 + rotatez!(group, group.center, trscale*-m[2]) + end end - end - # Generate triangle mesh from panel descriptions - points = Point3f[] - for panel in dgmoved.panels + # Generate triangle mesh from panel descriptions + points = Point3f[] + for panel in dgmoved.panels + + corner = panel.pixel_pitch*panel.corner + fs = panel.pixel_pitch*panel.w*panel.fsvec + ss = panel.pixel_pitch*panel.h*panel.ssvec - corner = panel.pixel_pitch*panel.corner - fs = panel.pixel_pitch*panel.w*panel.fsvec - ss = panel.pixel_pitch*panel.h*panel.ssvec + push!(points, corner) + push!(points, corner+fs) + push!(points, corner+fs+ss) + push!(points, corner+fs+ss) + push!(points, corner+ss) + push!(points, corner) + + end - push!(points, corner) - push!(points, corner+fs) - push!(points, corner+fs+ss) - push!(points, corner+fs+ss) - push!(points, corner+ss) - push!(points, corner) + return points end - return points + beams = map(cfimage.detgeom.panels) do p + cen = (p.corner+p.fsvec*p.w/2+p.ssvec*p.h/2)*1.5*p.pixel_pitch + ((0,0,0), Tuple(cen)) + end -end + mesh!(triangles, color="#7f7f7f") + beamv = lines!(collect(Iterators.flatten(beams[1:4:end])), color="#008080") + connect!(beamv.visible, btoggle.active) -beams = map(cfimage.detgeom.panels) do p - cen = (p.corner+p.fsvec*p.w/2+p.ssvec*p.h/2)*1.5*p.pixel_pitch - ((0,0,0), Tuple(cen)) -end + return f -mesh!(triangles, color="#7f7f7f") -beamv = lines!(collect(Iterators.flatten(beams[1:4:end])), color="#008080") -connect!(beamv.visible, btoggle.active) -f +end |