aboutsummaryrefslogtreecommitdiff
path: root/julia/CrystFEL/src/symmetry.jl
diff options
context:
space:
mode:
Diffstat (limited to 'julia/CrystFEL/src/symmetry.jl')
-rw-r--r--julia/CrystFEL/src/symmetry.jl134
1 files changed, 134 insertions, 0 deletions
diff --git a/julia/CrystFEL/src/symmetry.jl b/julia/CrystFEL/src/symmetry.jl
new file mode 100644
index 00000000..4b4caa4d
--- /dev/null
+++ b/julia/CrystFEL/src/symmetry.jl
@@ -0,0 +1,134 @@
+module Symmetry
+
+import ..CrystFEL: libcrystfel
+export SymOpList, InternalSymOpList, InternalIntegerMatrix
+export symmetry_name, asymmetricindices
+
+
+# Types for pointers returned by libcrystfel
+mutable struct InternalSymOpList end
+mutable struct InternalIntegerMatrix end
+
+
+# Exposed types
+mutable struct SymOpList
+ internalptr::Ptr{InternalSymOpList}
+end
+
+
+mutable struct SymOp
+ internalptr::Ptr{InternalIntegerMatrix}
+end
+
+
+function SymOpList(pointgroup::AbstractString)
+
+ out = ccall((:get_pointgroup, libcrystfel),
+ Ptr{InternalSymOpList}, (Cstring,), pointgroup)
+ if out == C_NULL
+ throw(OutOfMemoryError())
+ end
+
+ sym = SymOpList(out)
+
+ finalizer(sym) do x
+ ccall((:free_symoplist, libcrystfel),
+ Cvoid, (Ptr{InternalSymOpList},), x.internalptr)
+ end
+
+ return sym
+
+end
+
+
+function Base.getindex(sym::SymOpList, i::Int)
+
+ if (i<1) || (i > length(sym))
+ throw(BoundsError())
+ end
+
+ out = ccall((:get_symop, libcrystfel),
+ Ptr{InternalIntegerMatrix},
+ (Ptr{InternalSymOpList},Ptr{Cvoid},Cint),
+ sym.internalptr,C_NULL,i-1)
+
+ if out == C_NULL
+ throw(OutOfMemoryError())
+ end
+
+ return SymOp(out)
+
+end
+
+
+function Base.length(sym::SymOpList)
+ return ccall((:num_equivs, libcrystfel),
+ Cint, (Ptr{InternalSymOpList},Ptr{Cvoid}),
+ sym.internalptr, C_NULL)
+end
+
+
+function hkl_op(op::SymOp)
+ s = ccall((:name_equiv, libcrystfel),
+ Cstring,
+ (Ptr{InternalIntegerMatrix},),
+ op.internalptr)
+ return unsafe_string(s)
+end
+
+
+function symmetry_name(sym::SymOpList)
+ s = ccall((:symmetry_name, libcrystfel),
+ Cstring,
+ (Ptr{InternalSymOpList},),
+ sym.internalptr)
+ return unsafe_string(s)
+end
+
+
+function Base.iterate(sym::SymOpList)
+ return (sym[1], 2)
+end
+
+
+function Base.iterate(sym::SymOpList, i)
+ if i > length(sym)
+ return nothing
+ else
+ return (sym[i], i+1)
+ end
+end
+
+
+function asymmetricindices(sym::SymOpList, indices)
+ ho = Ref{Cint}(0)
+ ko = Ref{Cint}(0)
+ lo = Ref{Cint}(0)
+ @ccall libcrystfel.get_asymm(sym.internalptr::Ptr{InternalSymOpList},
+ indices[1]::Cint, indices[2]::Cint, indices[3]::Cint,
+ ho::Ref{Cint}, ko::Ref{Cint}, lo::Ref{Cint})::Cvoid
+ (ho[], ko[], lo[])
+end
+
+
+function Base.show(io::IO, ::MIME"text/plain", sym::SymOpList)
+ print(io, length(sym), "-element SymOpList (\"", symmetry_name(sym), "\")")
+ for op in sym
+ print(io, "\n", hkl_op(op))
+ end
+end
+
+
+function Base.show(io::IO, sym::SymOpList)
+ write(io, "SymOpList(\"", symmetry_name(sym), "\")")
+end
+
+
+function Base.show(io::IO, op::SymOp)
+ write(io, "SymOp(")
+ write(io, "\"")
+ write(io, hkl_op(op))
+ write(io, "\")")
+end
+
+end # of module