aboutsummaryrefslogtreecommitdiff
path: root/julia/CrystFEL/src/indexing.jl
diff options
context:
space:
mode:
Diffstat (limited to 'julia/CrystFEL/src/indexing.jl')
-rw-r--r--julia/CrystFEL/src/indexing.jl151
1 files changed, 151 insertions, 0 deletions
diff --git a/julia/CrystFEL/src/indexing.jl b/julia/CrystFEL/src/indexing.jl
new file mode 100644
index 00000000..543246ec
--- /dev/null
+++ b/julia/CrystFEL/src/indexing.jl
@@ -0,0 +1,151 @@
+module Indexing
+
+import ..CrystFEL: libcrystfel
+import ..CrystFEL.UnitCells: UnitCell, InternalUnitCell
+import ..CrystFEL.Images: Image, InternalImage
+import ..CrystFEL.DataTemplates: wavelength, cameralength
+export Indexer, index
+
+mutable struct IndexingPriv end
+
+mutable struct Indexer
+ indexingpriv::Ptr{IndexingPriv}
+end
+
+
+function indexflags(retry, multilattice, refine, peakcheck, cellcheck)
+ flags = 0
+ if retry
+ flags |= 1
+ end
+ if multilattice
+ flags |= 2
+ end
+ if refine
+ flags |= 4
+ end
+ if peakcheck
+ flags |= 32
+ end
+ if cellcheck
+ flags |= 64
+ end
+ return flags
+end
+
+
+"""
+ Indexer(methods, dtempl, cell;
+ tolerances=(0.05,0.05,0.05,1.5,1.5,1.5),
+ retry=true, multilattice=false, refine=true,
+ peakcheck=true, cellcheck=true,
+ wavelength_estimate=nothing, clen_estimate=missing,
+ n_threads=1)
+
+Creates a new CrystFEL indexing engine, which you can later apply to CrystFEL
+`Image` structures using `index()`.
+"""
+function Indexer(methods, dtempl, cell; tolerances=(0.05,0.05,0.05,1.5,1.5,1.5),
+ retry=true, multilattice=false, refine=true, peakcheck=true, cellcheck=true,
+ wavelength_estimate=nothing, clen_estimate=missing, n_threads=1)
+
+ taketwoopts = Ref{Ptr{Cvoid}}(C_NULL)
+ xgandalfopts = Ref{Ptr{Cvoid}}(C_NULL)
+ pinkindexeropts = Ref{Ptr{Cvoid}}(C_NULL)
+ felixopts = Ref{Ptr{Cvoid}}(C_NULL)
+ fromfileopts = Ref{Ptr{Cvoid}}(C_NULL)
+ asdfopts = Ref{Ptr{Cvoid}}(C_NULL)
+
+ @ccall libcrystfel.default_method_options(taketwoopts::Ref{Ptr{Cvoid}},
+ xgandalfopts::Ref{Ptr{Cvoid}},
+ pinkindexeropts::Ref{Ptr{Cvoid}},
+ felixopts::Ref{Ptr{Cvoid}},
+ fromfileopts::Ref{Ptr{Cvoid}},
+ asdfopts::Ref{Ptr{Cvoid}})::Cvoid
+
+ flags = indexflags(retry, multilattice, refine, peakcheck, cellcheck)
+
+ let wlfromdtempl = wavelength(dtempl)
+ if !isnothing(wlfromdtempl)
+ wavelength_estimate = wlfromdtempl
+ else
+ if isnothing(wavelength_estimate)
+ throw(ArgumentError("Wavelength cannot be determined from data template. "*
+ "Use Indexer(wavelength_estimate=...)"))
+ end
+ end
+ end
+
+ let clenfromdtempl = cameralength(dtempl)
+ if !isnothing(clenfromdtempl)
+ clen_estimate = clenfromdtempl
+ else
+ if isnothing(clen_estimate)
+ throw(ArgumentError("Camera length cannot be determined from data template. "*
+ "Use Indexer(clen_estimate=...)"))
+ end
+ end
+ end
+
+ tols = Vector{Cfloat}(undef, 6)
+ tols[1] = tolerances[1]
+ tols[2] = tolerances[2]
+ tols[3] = tolerances[3]
+ tols[4] = deg2rad(tolerances[4])
+ tols[5] = deg2rad(tolerances[5])
+ tols[6] = deg2rad(tolerances[6])
+
+ out = @ccall libcrystfel.setup_indexing(methods::Cstring,
+ cell.internalptr::Ptr{InternalUnitCell},
+ tols::Ptr{Cfloat},
+ flags::Cint,
+ wavelength_estimate::Cdouble,
+ clen_estimate::Cdouble,
+ n_threads::Cint,
+ taketwoopts[]::Ptr{Cvoid},
+ xgandalfopts[]::Ptr{Cvoid},
+ pinkindexeropts[]::Ptr{Cvoid},
+ felixopts[]::Ptr{Cvoid},
+ fromfileopts[]::Ptr{Cvoid},
+ asdfopts[]::Ptr{Cvoid})::Ptr{IndexingPriv}
+
+ if out == C_NULL
+ throw(ErrorException("Indexing setup failed"))
+ end
+
+ indexer = Indexer(out)
+
+ finalizer(indexer) do x
+ @ccall libcrystfel.cleanup_indexing(x.indexingpriv::Ptr{IndexingPriv})::Cvoid
+ end
+
+ return indexer
+
+end
+
+
+"""
+ index(image::Image, indexer::Indexer; mille=nothing)
+
+Index `image` using `indexer`.
+
+If `mille` is a valid `Mille` object, detector geometry alignment data will
+be written.
+"""
+function index(image::Image, idxr::Indexer; mille=nothing)
+
+ if mille === nothing
+ imille = C_NULL
+ else
+ imille = mille.internalptr
+ end
+
+ @ccall libcrystfel.index_pattern_4(image.internalptr::Ptr{InternalImage},
+ idxr.indexingpriv::Ptr{IndexingPriv},
+ C_NULL::Ptr{Cvoid},
+ C_NULL::Ptr{Cvoid},
+ imille::Ptr{Cvoid})::Cvoid
+end
+
+
+end # of module