aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2024-01-18 17:25:20 +0100
committerThomas White <taw@physics.org>2024-02-06 16:59:35 +0100
commitff89f33377133352838f27057525701e71c9df7c (patch)
tree3a06ec063c5c2a6a3b28d31a2ea8c7738ecbe65a
parentdd6aed228f47eb6bfc713b20e635e2bacfe1a6f9 (diff)
Julia: Expose crystals and reflection lists from image
The memory management isn't quite right here yet.
-rw-r--r--julia/CrystFEL/src/crystal.jl9
-rw-r--r--julia/CrystFEL/src/image.jl23
-rw-r--r--julia/CrystFEL/src/reflists.jl1
3 files changed, 23 insertions, 10 deletions
diff --git a/julia/CrystFEL/src/crystal.jl b/julia/CrystFEL/src/crystal.jl
index 129c028c..eba7a615 100644
--- a/julia/CrystFEL/src/crystal.jl
+++ b/julia/CrystFEL/src/crystal.jl
@@ -10,7 +10,6 @@ mutable struct InternalCrystal end
mutable struct Crystal
internalptr::Ptr{InternalCrystal}
- in_image # if true, this PeakList belongs to an Image struct
end
@@ -40,13 +39,11 @@ function Crystal(cell::UnitCell; profileradius=2e6, mosaicity=0)
Cvoid, (Ptr{InternalCrystal},Cdouble),
out, mosaicity)
- cr = Crystal(out, false)
+ cr = Crystal(out)
finalizer(cr) do x
- if !x.in_image
- ccall((:crystal_free, libcrystfel), Cvoid, (Ptr{InternalCrystal},),
- x.internalptr)
- end
+ ccall((:crystal_free, libcrystfel), Cvoid, (Ptr{InternalCrystal},),
+ x.internalptr)
end
return cr
diff --git a/julia/CrystFEL/src/image.jl b/julia/CrystFEL/src/image.jl
index de79a556..a9d9c28f 100644
--- a/julia/CrystFEL/src/image.jl
+++ b/julia/CrystFEL/src/image.jl
@@ -5,16 +5,23 @@ import ..CrystFEL.DataTemplates: DataTemplate, InternalDataTemplate
import ..CrystFEL.DetGeoms: DetGeom
import ..CrystFEL.PeakLists: PeakList, InternalPeakList
import ..CrystFEL.Crystals: Crystal, InternalCrystal
+import ..CrystFEL.RefLists: RefList, InternalRefList, UnmergedReflection
+import ..CrystFEL.Symmetry: SymOpList
export Image
const HEADER_CACHE_SIZE = 128
+mutable struct CrystalRefListPair
+ crystal::Ptr{InternalCrystal}
+ reflist::Ptr{InternalRefList}
+end
+
mutable struct InternalImage
dp::Ptr{Ptr{Cfloat}}
bad::Ptr{Ptr{Cint}}
sat::Ptr{Ptr{Cfloat}}
hit::Cint
- crystals::Ptr{Ptr{Cvoid}}
+ crystals::Ptr{CrystalRefListPair}
n_crystals::Cint
indexed_by::Cint
n_indexing_tries::Cint
@@ -43,20 +50,28 @@ end
mutable struct Image
internalptr::Ptr{InternalImage}
peaklist::Union{Nothing,PeakList}
+ crystals
+ reflists
end
function makecrystallist(listptr, n)
- crystals = Crystal[]
+ crystals = []
if listptr == C_NULL
return crystals
end
for i in 1:n
- crystalptr = unsafe_load(listptr, i)
- push!(crystals, Crystal(crystalptr, true))
+ pairptr = unsafe_load(listptr, i)
+ cr = Crystal(pairptr.crystal)
+ if pairptr.reflist == C_NULL
+ reflist = nothing
+ else
+ reflist = RefList{UnmergedReflection}(pairptr.reflist, SymOpList("1"))
+ end
+ push!(crystals, (crystal=cr, reflections=reflist))
end
crystals
diff --git a/julia/CrystFEL/src/reflists.jl b/julia/CrystFEL/src/reflists.jl
index 007f0f07..d6b3a951 100644
--- a/julia/CrystFEL/src/reflists.jl
+++ b/julia/CrystFEL/src/reflists.jl
@@ -5,6 +5,7 @@ import ..CrystFEL: libcrystfel
import ..CrystFEL.Symmetry: SymOpList, InternalSymOpList, symmetry_name
export RefList, loadreflist
export Reflection, UnmergedReflection, MergedReflection
+export InternalRefList
# The internal libcrystfel structures, not exposed directly