aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2023-11-09 11:07:25 +0100
committerThomas White <taw@physics.org>2024-02-06 16:59:34 +0100
commitd482752291dce86107bf97cda0e163db6fcc7b70 (patch)
tree6b13ad09b7218f55fe20b4f90e9eb171a424b50f
parenta117a52f03dbba5ac030f5256752b0f39613d4ba (diff)
Julia: add initial Crystal type and reflection prediction
-rw-r--r--julia/CrystFEL/src/CrystFEL.jl8
-rw-r--r--julia/CrystFEL/src/crystal.jl40
-rw-r--r--julia/CrystFEL/src/diffcalc.jl21
-rw-r--r--julia/alignment-test.jl3
4 files changed, 71 insertions, 1 deletions
diff --git a/julia/CrystFEL/src/CrystFEL.jl b/julia/CrystFEL/src/CrystFEL.jl
index 0496897f..590b8973 100644
--- a/julia/CrystFEL/src/CrystFEL.jl
+++ b/julia/CrystFEL/src/CrystFEL.jl
@@ -43,4 +43,12 @@ using .RefLists
export RefList, loadreflist
export Reflection, MergedReflection, UnmergedReflection
+include("crystal.jl")
+using .Crystals
+export Crystal, InternalCrystal
+
+include("diffcalc.jl")
+using .DiffractionCalculations
+export predictreflections
+
end # of module
diff --git a/julia/CrystFEL/src/crystal.jl b/julia/CrystFEL/src/crystal.jl
new file mode 100644
index 00000000..9e222554
--- /dev/null
+++ b/julia/CrystFEL/src/crystal.jl
@@ -0,0 +1,40 @@
+module Crystals
+
+import ..CrystFEL: libcrystfel
+import ..CrystFEL.RefLists: RefList, UnmergedReflection
+import ..CrystFEL.UnitCells: UnitCell, InternalUnitCell
+export Crystal, InternalCrystal
+
+# Represents the real C-side (opaque) structure.
+mutable struct InternalCrystal end
+
+mutable struct Crystal
+ internalptr::Ptr{InternalCrystal}
+end
+
+
+function Crystal(cell::UnitCell)
+
+ out = ccall((:crystal_new, libcrystfel),
+ Ptr{InternalCrystal}, ())
+
+ if out == C_NULL
+ throw(ArgumentError("Failed to create crystal"))
+ end
+
+ ccall((:crystal_set_cell, libcrystfel),
+ Cvoid, (Ptr{InternalCrystal},Ptr{InternalUnitCell}),
+ out, cell.internalptr)
+
+ cr = Crystal(out)
+
+ finalizer(cr) do x
+ ccall((:crystal_free, libcrystfel), Cvoid, (Ptr{InternalCrystal},),
+ x.internalptr)
+ end
+
+ return cr
+end
+
+
+end # of module
diff --git a/julia/CrystFEL/src/diffcalc.jl b/julia/CrystFEL/src/diffcalc.jl
new file mode 100644
index 00000000..2e039a20
--- /dev/null
+++ b/julia/CrystFEL/src/diffcalc.jl
@@ -0,0 +1,21 @@
+module DiffractionCalculations
+
+import ..CrystFEL: libcrystfel
+import ..CrystFEL.Images: InternalImage
+import ..CrystFEL.Crystals: InternalCrystal
+import ..CrystFEL.RefLists: RefList, UnmergedReflection, InternalRefList
+import ..CrystFEL.Symmetry: SymOpList
+export predictreflections
+
+
+function predictreflections(cr, image; maxres=1e10)
+ refls = ccall((:predict_to_res, libcrystfel),
+ Ptr{InternalRefList},
+ (Ptr{InternalCrystal}, Ptr{InternalImage}, Cdouble),
+ cr.internalptr, image.internalptr, maxres)
+ sym = SymOpList("1")
+ return RefList{UnmergedReflection}(refls, sym)
+end
+
+
+end # of module
diff --git a/julia/alignment-test.jl b/julia/alignment-test.jl
index a72c79c6..397ed094 100644
--- a/julia/alignment-test.jl
+++ b/julia/alignment-test.jl
@@ -3,5 +3,6 @@ using CrystFEL
dtempl = loaddatatemplate("julia/alignment-test.geom")
image = Image(dtempl)
cell = UnitCell(MonoclinicLattice, PrimitiveCell, 123, 45, 80, 90, 97, 90)
-cr = Crystal(cell, image)
+cr = Crystal(cell)
truth = predictreflections(cr, image)
+println(truth)