Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
177 commits
Select commit Hold shift + click to select a range
1038d20
starting spectroscopy class
smribet Sep 3, 2025
9a67b3a
moving dataset3dspectroscopy
smribet Sep 18, 2025
cb2f678
updating inits for file loading
smribet Sep 19, 2025
f87fb21
Swapping to (E,x,y) at least for now. We may want validators.
smribet Sep 19, 2025
51fe26b
adding EDS and EELS
smribet Sep 19, 2025
32e8218
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Sep 23, 2025
09fe109
test commit
Sangoda Sep 24, 2025
e4c9b3b
checking pull
smribet Sep 24, 2025
f697492
test
Sep 25, 2025
4329f14
pull test
smribet Sep 25, 2025
57e0b70
DataSpectroscopy class for EELS and EDS.
Sangoda Oct 2, 2025
760ff16
added pca and plot_virtual_image
Oct 9, 2025
f5a0635
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Oct 24, 2025
b73cbb8
fixes
Nov 3, 2025
5e46224
file_readers fix for 3d spectroscopy data
Sangoda Nov 12, 2025
bd78da1
Updated the show_mean_spectrum function
Sangoda Dec 19, 2025
97830e7
added comment line as test commit
nwvlahakis Jan 7, 2026
447ce32
removed test comment line
nwvlahakis Jan 7, 2026
518f4ee
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Jan 8, 2026
a54b63a
adding metadata to spectroscopy
smribet Jan 8, 2026
7c9aa10
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Jan 12, 2026
fbf8900
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Jan 13, 2026
3b2f977
adding subtract_background function and moving background subtraction…
nwvlahakis Jan 16, 2026
c8dea15
Merge remote-tracking branch 'upstream/spectroscopy' into spectroscopy
nwvlahakis Jan 16, 2026
7bfa0a9
removing redundant background subtraction function definitions from d…
nwvlahakis Jan 17, 2026
fa1eaba
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Jan 20, 2026
edba0b8
Merge remote-tracking branch 'origin/spectroscopy' into spectroscopy
smribet Jan 20, 2026
0b2d5c7
first pass at torch model for EDS
smribet Jan 21, 2026
ddb2e2f
models
smribet Jan 21, 2026
96f975f
better plotting
smribet Jan 21, 2026
c7aa242
more flexible FWHM. let's see if this helps.
smribet Jan 21, 2026
e3b135a
add energy_range and cleanup background subtraction functions
nwvlahakis Jan 22, 2026
7422f05
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Jan 26, 2026
ca07d1d
fix transpose bug for digitalmicrograph EELS data in read_3d_spectros…
nwvlahakis Jan 26, 2026
2c8b5ec
modify print message to inform where 3D datasets are located in case …
nwvlahakis Jan 26, 2026
510a3a7
small edits for precommit compliance in dataset3dspectroscopy
nwvlahakis Jan 27, 2026
834792d
add checks/error messages for out-of-bounds energy range inputs
nwvlahakis Jan 27, 2026
44658b6
flags for returning back-subtracted 3D datasets and storage for back-…
nwvlahakis Jan 30, 2026
7db326e
edits to spectrum data storage flags/structure
nwvlahakis Jan 30, 2026
1f6bbb3
axis label fixes for EELS
nwvlahakis Feb 6, 2026
85a2117
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis Feb 6, 2026
f19cb55
improve optimizer
smribet Feb 7, 2026
48905a1
move to 3D fitting
smribet Feb 7, 2026
b222257
make plotting better
smribet Feb 7, 2026
5f7d8dc
change loss
smribet Feb 7, 2026
692b0db
reformatting, adding EELS
smribet Feb 8, 2026
89b93ce
lr flexibility
smribet Feb 8, 2026
69006b1
normalization fixes
smribet Feb 9, 2026
b31ee7c
cleaning up
smribet Feb 9, 2026
ff2cae0
plotting update
smribet Feb 10, 2026
fffe363
make gpu compatible
smribet Feb 10, 2026
aec39c6
a few more changes
smribet Feb 10, 2026
75e8adc
Apply local spectroscopy edits after pulling latest
Sangoda Feb 12, 2026
420e466
quantem spectroscopy: update dataset3dspectroscopy and add atomic wei…
Sangoda Feb 13, 2026
3029623
updates to zlp
Feb 13, 2026
64f8356
Merge branch 'spectroscopy' of https://github.com/electronmicroscopy/…
Feb 13, 2026
0959777
small cleanup and eels axis label fix
nwvlahakis Feb 13, 2026
c63b375
Merge remote-tracking branch 'upstream/spectroscopy' into spectroscopy
nwvlahakis Feb 13, 2026
f6a3466
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Feb 14, 2026
8241123
Merge remote-tracking branch 'origin/spectroscopy' into spectroscopy
smribet Feb 14, 2026
fa5a58d
dataset1d for spectra
nwvlahakis Feb 17, 2026
afb05f0
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis Feb 17, 2026
d1e1d7f
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Feb 18, 2026
f935bb2
Merge remote-tracking branch 'origin/spectroscopy' into spectroscopy
smribet Feb 18, 2026
422da10
removing titan k factors
smribet Feb 18, 2026
c69cb66
removing titan k factors
smribet Feb 18, 2026
88dafe2
Added a dedicated EDS auto-ID flow (peak_autoid).
Sangoda Feb 18, 2026
1800cf6
Merge branch 'spectroscopy' of https://github.com/electronmicroscopy/…
Sangoda Feb 19, 2026
0822824
-Added a new auto-ID method for EDS peaks
Sangoda Feb 19, 2026
266dc74
let's see if I broke the repo... changing X-ray lines
smribet Feb 19, 2026
746d5ca
patch of fitting
smribet Feb 23, 2026
7978c2b
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis Feb 26, 2026
88e9cac
1d spectra attached to 3d spectroscopy datasets now saved as dataset1…
nwvlahakis Feb 26, 2026
8a6325a
cleanup
nwvlahakis Feb 26, 2026
af5ec6e
simplifying
smribet Mar 2, 2026
5dfbb7d
a lot simplified
smribet Mar 2, 2026
c8f5865
doc strings
smribet Mar 4, 2026
0c17bd4
atomics weights update
smribet Mar 4, 2026
a3f1461
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Mar 5, 2026
3c1990a
restructure
smribet Mar 5, 2026
a9b0766
remove old code
smribet Mar 6, 2026
8bf94e0
lookup energy lines
smribet Mar 6, 2026
eeeba25
generate spectrum Images
smribet Mar 6, 2026
8e643d3
plot spectrum images
smribet Mar 6, 2026
5be8301
plotting update
smribet Mar 6, 2026
6fc62b6
fix
smribet Mar 6, 2026
522f50d
spectrum images pytorch
smribet Mar 6, 2026
735d6e9
improve naming
smribet Mar 6, 2026
181eecd
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Mar 6, 2026
d23c9eb
update plotting
smribet Mar 6, 2026
1b7ba7b
using model elements
smribet Mar 6, 2026
c9fab6d
refactor
smribet Mar 7, 2026
9d280f7
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Mar 7, 2026
e1f7bf5
trying to organize text parsing
smribet Mar 7, 2026
59322df
CL adding table
smribet Mar 7, 2026
c867952
clear spectrum images, update history size for lbfgs
smribet Mar 7, 2026
96927e5
add
smribet Mar 7, 2026
dbfb639
cleaning up show_mean_spectrum
smribet Mar 7, 2026
32aaf64
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Mar 9, 2026
72553fe
first chunk of powerlaw bg fit for eels and modified function call in…
nwvlahakis Mar 10, 2026
1726386
user specified pre-edge window size option for eels bg fit (powerlaw)
nwvlahakis Mar 10, 2026
cc970ff
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Mar 11, 2026
3463679
Merge remote-tracking branch 'origin/spectroscopy' into spectroscopy
smribet Mar 11, 2026
f53f0f9
fixing background curve fitting/plotting for eels
nwvlahakis Mar 11, 2026
01db033
increase max iterations for curve fit
nwvlahakis Mar 11, 2026
3e8b72d
draft EELS pca denoising function
nwvlahakis Mar 13, 2026
e4f1478
make pca denoising user energy_range compatible
nwvlahakis Mar 13, 2026
e3cd827
some cleanup
nwvlahakis Mar 13, 2026
8edf922
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis Mar 16, 2026
2f5633e
rolling average smoothing function for eels
nwvlahakis Mar 18, 2026
2ee116d
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Mar 18, 2026
a3d1746
remove sklearn and replace with pytorch pca
smribet Mar 19, 2026
25d3dc0
remove pca redundancy, 3d dataset output from perform_pca, and cleanup
nwvlahakis Mar 19, 2026
3c65fdb
remove smooth_eels_pca
nwvlahakis Mar 19, 2026
cc00c10
test
Sangoda Mar 20, 2026
0b69231
Local changes to uv.lock
Mar 6, 2026
81f0f25
Ignore local data and notebooks
Mar 19, 2026
d300e16
Add thickness module and supporting alignment/visualization modules w…
Mar 23, 2026
ccf1517
build: update uv.lock to match pyproject.toml
Mar 23, 2026
9c67621
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Mar 26, 2026
0e0b524
Merge remote-tracking branch 'origin/spectroscopy' into spectroscopy
smribet Mar 26, 2026
4e9d9e1
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis Mar 31, 2026
baabca0
added modes to autoid, made changes to scoring for more accuracy (wip)
Sangoda Apr 6, 2026
63898d2
Merge branch 'spectroscopy' of https://github.com/electronmicroscopy/…
Sangoda Apr 6, 2026
fccb83b
fixing mean_spectrum
smribet Apr 6, 2026
afd8dce
porting alignment/thickness functions to 3deels, removing widget and …
nwvlahakis Apr 7, 2026
b23d255
Update spectroscopy init by removing imports of deleted modules.
Apr 7, 2026
3c2e593
Added EELS visualization functions to monitor ZLP calibratrion, align…
Apr 7, 2026
14888e1
tab correct
Apr 7, 2026
96616e8
Double plotting corection in plot dual eels picker function.
Apr 7, 2026
5e286f3
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis Apr 17, 2026
457933f
fix for spec file readers
smribet Apr 17, 2026
7803d74
fix for load element info
smribet Apr 17, 2026
16802bf
fix for roi and auto_id
Sangoda Apr 20, 2026
795c87b
added docstrings to functions in dataset3deds.py
Sangoda Apr 20, 2026
f7bf217
auto_id labeling changes
Sangoda Apr 20, 2026
9b9f019
bug fix
smribet Apr 20, 2026
572044c
update return map logic
smribet Apr 20, 2026
619071c
convert eV to keV in read_3d_spectroscopy; refactor model_elements ch…
Sangoda Apr 21, 2026
cf19ca3
quick fix
smribet Apr 22, 2026
c861012
Merge remote-tracking branch 'upstream' into spectroscopy
nwvlahakis Apr 24, 2026
71edf75
updating xray csv
smribet Apr 24, 2026
3a33280
_normalize_element_info
smribet Apr 26, 2026
4bb4b13
Merge remote-tracking branch 'upstream/spectroscopy' into spectroscopy
nwvlahakis Apr 27, 2026
00d2052
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis Apr 27, 2026
f50f5ed
remove redundant functions
nwvlahakis Apr 27, 2026
652e862
beginning refactor of zlp code to separate "measure" and "correct" fu…
nwvlahakis Apr 27, 2026
9bf4680
bug fixes
smribet Apr 30, 2026
a521ee6
Merge remote-tracking branch 'origin/spectroscopy' into spectroscopy
smribet Apr 30, 2026
909aded
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet Apr 30, 2026
4f50f9e
some plotting and bug fixes
smribet Apr 30, 2026
b05c57b
changing data_type to self.dataset_type
smribet Apr 30, 2026
48c980f
bug fix for background subtraction
smribet Apr 30, 2026
c8ee683
pca plotting
smribet May 4, 2026
1507702
small fix
smribet May 4, 2026
8c3a4cc
adding local EELS background fitting
smribet May 4, 2026
108e16b
measure zlp refactor changes, a couple bugs to fix
nwvlahakis May 4, 2026
c428e3a
Merge remote-tracking branch 'upstream/spectroscopy' into spectroscopy
nwvlahakis May 4, 2026
4b9557f
zlp 2d plane fit
nwvlahakis May 4, 2026
01e67ba
user flag to make plane fit optional
nwvlahakis May 4, 2026
f98ac75
apply zlp correction function
nwvlahakis May 4, 2026
0e8f97e
add plotting
nwvlahakis May 4, 2026
494ad09
optional flags for measure and apply zlp functions
nwvlahakis May 5, 2026
74a49bd
updating eels edges
smribet May 6, 2026
d8b0683
updating eels edges pt 2
smribet May 6, 2026
dacdfc1
Merge remote-tracking branch 'upstream/dev' into spectroscopy
nwvlahakis May 7, 2026
4553f40
fixes to plotting/cleanup for zlp alignment
nwvlahakis May 7, 2026
fb99b76
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet May 8, 2026
bcfe64c
Merge remote-tracking branch 'origin/spectroscopy' into spectroscopy
smribet May 8, 2026
393d930
sanya's eds changes
smribet May 8, 2026
9d07ae1
sanya's spectroscopy changes
smribet May 8, 2026
af85309
fixing labels
smribet May 8, 2026
7f136bf
updated background subtraction EDS
smribet May 13, 2026
9cf731b
bug fix
smribet May 13, 2026
e4ae004
normalization bug
smribet May 13, 2026
aca05b9
removing unused code
smribet May 20, 2026
2f556e2
Merge remote-tracking branch 'origin/dev' into spectroscopy
smribet May 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/quantem/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from quantem.core import visualization as visualization

from quantem import imaging as imaging
from quantem import spectroscopy as spectroscopy
from quantem import diffractive_imaging as diffractive_imaging

__version__ = version("quantem")
1 change: 1 addition & 0 deletions src/quantem/core/datastructures/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
from quantem.core.datastructures.dataset4d import Dataset4d as Dataset4d
from quantem.core.datastructures.dataset3d import Dataset3d as Dataset3d
from quantem.core.datastructures.dataset2d import Dataset2d as Dataset2d
from quantem.core.datastructures.dataset1d import Dataset1d as Dataset1d
216 changes: 216 additions & 0 deletions src/quantem/core/datastructures/dataset1d.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
from typing import Self

import matplotlib.pyplot as plt
import numpy as np
from numpy.typing import NDArray

from quantem.core.datastructures.dataset import Dataset
from quantem.core.utils.validators import ensure_valid_array


@Dataset.register_dimension(1)
class Dataset1d(Dataset):
"""1D dataset class that inherits from Dataset.

This class represents a 1D dataset, such as spectra from EDS or EELS.

Attributes
----------
None beyond base Dataset.
"""

def __init__(
self,
array: NDArray,
name: str,
origin: NDArray | tuple | list | float | int,
sampling: NDArray | tuple | list | float | int,
units: list[str] | tuple | list | None = None,
signal_units: str = "arb. units",
metadata: dict = {},
_token: object | None = None,
):
"""Initialize a 1D dataset.

Parameters
----------
array : NDArray
The underlying 1D array data
name : str
A descriptive name for the dataset
origin : NDArray | tuple | list | float | int
The origin coordinates for each dimension
sampling : NDArray | tuple | list | float | int
The sampling rate/spacing for each dimension
units : list[str] | tuple | list
Units for each dimension
signal_units : str, optional
Units for the array values, by default "arb. units"
_token : object | None, optional
Token to prevent direct instantiation, by default None
"""
super().__init__(
array=array,
name=name,
origin=origin,
sampling=sampling,
units=units,
signal_units=signal_units,
metadata=metadata,
_token=_token,
)

@classmethod
def from_array(
cls,
array: NDArray,
name: str | None = None,
origin: NDArray | tuple | list | float | int | None = None,
sampling: NDArray | tuple | list | float | int | None = None,
units: list[str] | tuple | list | None = None,
signal_units: str = "arb. units",
) -> Self:
"""Create a Dataset1d from a 1D array.

Parameters
----------
array : NDArray
1D array with shape (length)
name : str | None
Dataset name. Default: "1D dataset"
origin : NDArray | tuple | list | float | int | None
Origin for each dimension. Default: [0]
sampling : NDArray | tuple | list | float | int | None
Sampling for each dimension. Default: [1]
units : list[str] | tuple | list | None
Units for each dimension. Default: ["pixels"]
signal_units : str
Units for array values. Default: "arb. units"

Returns
-------
Dataset1d

Examples
--------
>>> import numpy as np
>>> from quantem.core.datastructures import Dataset1d
>>> arr = np.random.rand(10)
>>> data = Dataset3d.from_array(arr)
>>> data.shape
(10,)

With calibration:

>>> data = Dataset1d.from_array(
... arr,
... sampling=[0.15],
... units=["eV"],
... )

Visualize:

>>> data.show() # all frames in grid
>>> data.show(index=0) # single frame
>>> data.show(ncols=2) # 2 columns
"""
array = ensure_valid_array(array, ndim=1)
return cls(
array=array,
name=name if name is not None else "1D dataset",
origin=origin if origin is not None else np.zeros(1),
sampling=sampling if sampling is not None else np.ones(1),
units=units if units is not None else ["pixels"],
signal_units=signal_units,
_token=cls._token,
)

@classmethod
def from_shape(
cls,
shape: tuple[int],
name: str = "constant 1D dataset",
fill_value: float = 0.0,
origin: NDArray | tuple | list | float | int | None = None,
sampling: NDArray | tuple | list | float | int | None = None,
units: list[str] | tuple | list | None = None,
signal_units: str = "arb. units",
) -> Self:
"""Create a Dataset1d filled with a constant value.

Parameters
----------
shape : tuple[int, int, int]
Shape (n_frames, height, width)
name : str
Dataset name. Default: "constant 1D dataset"
fill_value : float
Value to fill array with. Default: 0.0
origin : NDArray | tuple | list | float | int | None
Origin for each dimension
sampling : NDArray | tuple | list | float | int | None
Sampling for each dimension
units : list[str] | tuple | list | None
Units for each dimension
signal_units : str
Units for array values

Returns
-------
Dataset1d

Examples
--------
>>> data = Dataset1d.from_shape((10000))
>>> data.shape
(10000,)
>>> data.array.max()
0.0
"""
array = np.full(shape, fill_value, dtype=np.float32)
return cls.from_array(
array=array,
name=name,
origin=origin,
sampling=sampling,
units=units,
signal_units=signal_units,
)

def show(
self,
title: str | None = None,
returnfig: bool = False,
**kwargs,
):
"""
Plots 1D dataset

Parameters
----------
scalebar: ScalebarConfig or bool
If True, displays scalebar
title: str
Title of Dataset
**kwargs: dict
Keyword arguments for show_2d
"""

if title is None:
title = self.name

fig, (ax) = plt.subplots(1, 1, figsize=(4, 4))

ax.plot(
float(self.origin[0]) + float(self.sampling[0]) * np.arange(self.shape[0]),
self.array,
linewidth=1.5,
)
ax.set_xlabel(self.units[0])
ax.set_ylabel(self.signal_units)
ax.set_title(title)

fig.tight_layout()
plt.show()

return (fig, ax) if returnfig else None
2 changes: 2 additions & 0 deletions src/quantem/core/datastructures/dataset3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def __init__(
sampling: NDArray | tuple | list | float | int,
units: list[str] | tuple | list,
signal_units: str = "arb. units",
metadata: dict = {},
_token: object | None = None,
):
"""Initialize a 3D dataset.
Expand Down Expand Up @@ -58,6 +59,7 @@ def __init__(
sampling=sampling,
units=units,
signal_units=signal_units,
metadata=metadata,
_token=_token,
)

Expand Down
2 changes: 1 addition & 1 deletion src/quantem/core/io/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from quantem.core.io.file_readers import read_2d as read_2d
from quantem.core.io.file_readers import read_4dstem as read_4dstem
from quantem.core.io.file_readers import (
read_emdfile_to_4dstem as read_emdfile_to_4dstem,
read_3d_spectroscopy as read_3d_spectroscopy,
)
from quantem.core.io.serialize import AutoSerialize as AutoSerialize
from quantem.core.io.serialize import load as load
Expand Down
96 changes: 96 additions & 0 deletions src/quantem/core/io/file_readers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@
from quantem.core.datastructures import Dataset2d as Dataset2d
from quantem.core.datastructures import Dataset3d as Dataset3d
from quantem.core.datastructures import Dataset4dstem as Dataset4dstem
from quantem.spectroscopy import (
Dataset3deds as Dataset3deds,
)
from quantem.spectroscopy import (
Dataset3deels as Dataset3deels,
)
from quantem.spectroscopy import Dataset3dspectroscopy as Dataset3dspectroscopy


def read_4dstem(
Expand Down Expand Up @@ -147,6 +154,95 @@ def read_4dstem(
return dataset


def read_3d_spectroscopy(
file_path: str, file_type: str, data_type: str, dataset_index: int | None = None
) -> Dataset3dspectroscopy:
"""
File reader for 3D spectroscopy data

Parameters
----------
file_path: str
Path to data
file_type: str
The type of file reader needed. See rosettasciio for supported formats
https://hyperspy.org/rosettasciio/supported_formats/index.html
data_type: str
type of spectroscopy data 'EELS' or 'EDS'
Returns
--------
Dataset3dspectroscopy
"""
file_reader = importlib.import_module(f"rsciio.{file_type}").file_reader # type: ignore
data_list = file_reader(file_path)

# If specific index provided, use it
if dataset_index is not None:
imported_data = data_list[dataset_index]
if imported_data["data"].ndim != 3:
raise ValueError(
f"Dataset at index {dataset_index} has {imported_data['data'].ndim} dimensions, "
f"expected 4D. Shape: {imported_data['data'].shape}"
)
else:
# Automatically find first 3D dataset
three_d_datasets = [(i, d) for i, d in enumerate(data_list) if d["data"].ndim == 3]

if len(three_d_datasets) == 0:
print(f"No 3D datasets found in {file_path}. Available datasets:")
for i, d in enumerate(data_list):
print(f" Dataset {i}: shape {d['data'].shape}, ndim={d['data'].ndim}")
raise ValueError("No 3D dataset found in file")

dataset_index, imported_data = three_d_datasets[0]

dataset_indices = []
for entry in three_d_datasets:
dataset_indices.append(entry[0])

if len(data_list) > 1:
print(
f"File contains {len(data_list)} dataset(s) and {len(three_d_datasets)} 3D dataset(s) at indices {', '.join(map(str, dataset_indices))}. Using dataset {dataset_index} with shape {imported_data['data'].shape}"
)

imported_axes = imported_data["axes"]
axis_order = (0, 1, 2) if file_type == "digitalmicrograph" else (2, 0, 1)
array = (
imported_data["data"]
if file_type == "digitalmicrograph"
else imported_data["data"].transpose(axis_order)
)
ordered_axes = [imported_axes[idx] for idx in axis_order]
sampling = [ax.get("scale", 1) for ax in ordered_axes]
origin = [ax.get("offset", 0) for ax in ordered_axes]
units = [
"pixels" if ax.get("units", "1") == "1" else ax.get("units", "pixels")
for ax in ordered_axes
]

for i, unit in enumerate(units):
if unit == "eV" and data_type == "EDS":
sampling[i] = sampling[i] / 1000
origin[i] = origin[i] / 1000
units[i] = "keV"

if data_type == "EELS":
dataset_cls = Dataset3deels
elif data_type == "EDS":
dataset_cls = Dataset3deds
else:
raise ValueError(f"`data_type` must be `EDS` or `EELS` not `{data_type}`")

dataset = dataset_cls.from_array(
array=array,
sampling=sampling,
origin=origin,
units=units,
)

return dataset


def read_2d(
file_path: str | PathLike,
file_type: str | None = None,
Expand Down
10 changes: 10 additions & 0 deletions src/quantem/spectroscopy/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from quantem.spectroscopy.dataset3dspectroscopy import (
Dataset3dspectroscopy as Dataset3dspectroscopy,
)
from quantem.spectroscopy.dataset3deels import (
Dataset3deels as Dataset3deels,
)

from quantem.spectroscopy.dataset3deds import (
Dataset3deds as Dataset3deds,
)
Loading