diff options
author | Thomas White <taw@physics.org> | 2023-11-09 11:07:25 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2024-02-06 16:59:34 +0100 |
commit | d482752291dce86107bf97cda0e163db6fcc7b70 (patch) | |
tree | 6b13ad09b7218f55fe20b4f90e9eb171a424b50f | |
parent | a117a52f03dbba5ac030f5256752b0f39613d4ba (diff) |
Julia: add initial Crystal type and reflection prediction
-rw-r--r-- | julia/CrystFEL/src/CrystFEL.jl | 8 | ||||
-rw-r--r-- | julia/CrystFEL/src/crystal.jl | 40 | ||||
-rw-r--r-- | julia/CrystFEL/src/diffcalc.jl | 21 | ||||
-rw-r--r-- | julia/alignment-test.jl | 3 |
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) |