mirror of
https://github.com/slsdetectorgroup/aare.git
synced 2025-06-05 20:30:41 +02:00
Streamlined build, new transforms (#106)
This commit is contained in:
commit
2d33fd4813
43
.github/workflows/build_pkg.yml
vendored
43
.github/workflows/build_pkg.yml
vendored
@ -1,43 +0,0 @@
|
|||||||
name: Build packages but don't deploy
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- developer
|
|
||||||
|
|
||||||
#run on PRs as well?
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform: [ubuntu-latest, ] # macos-12, windows-2019]
|
|
||||||
python-version: ["3.12",]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
|
||||||
|
|
||||||
# The setup-miniconda action needs this to activate miniconda
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: "bash -l {0}"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get conda
|
|
||||||
uses: conda-incubator/setup-miniconda@v3.0.4
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python-version }}
|
|
||||||
channels: conda-forge
|
|
||||||
|
|
||||||
- name: Prepare
|
|
||||||
run: conda install conda-build conda-verify pytest anaconda-client
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
env:
|
|
||||||
CONDA_TOKEN: ${{ secrets.CONDA_TOKEN }}
|
|
||||||
run: conda build conda-recipe
|
|
||||||
|
|
10
.github/workflows/deploy.yml
vendored
10
.github/workflows/deploy.yml
vendored
@ -1,7 +1,10 @@
|
|||||||
name: Deploy to slsdetectorgroup conda channel
|
name: Build pkgs and deploy if on main
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- developer
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@ -28,9 +31,10 @@ jobs:
|
|||||||
channels: conda-forge
|
channels: conda-forge
|
||||||
|
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
run: conda install conda-build conda-verify pytest anaconda-client
|
run: conda install conda-build=24.9 conda-verify pytest anaconda-client
|
||||||
|
|
||||||
- name: Enable upload
|
- name: Enable upload
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
run: conda config --set anaconda_upload yes
|
run: conda config --set anaconda_upload yes
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package:
|
package:
|
||||||
name: aare
|
name: aare
|
||||||
version: 2024.11.15.dev0 #TODO! how to not duplicate this?
|
version: 2024.11.26.dev0 #TODO! how to not duplicate this?
|
||||||
|
|
||||||
|
|
||||||
source:
|
source:
|
||||||
|
@ -7,6 +7,8 @@ namespace aare {
|
|||||||
|
|
||||||
NDArray<ssize_t, 2> GenerateMoench03PixelMap();
|
NDArray<ssize_t, 2> GenerateMoench03PixelMap();
|
||||||
NDArray<ssize_t, 2> GenerateMoench05PixelMap();
|
NDArray<ssize_t, 2> GenerateMoench05PixelMap();
|
||||||
|
NDArray<ssize_t, 2> GenerateMoench05PixelMap1g();
|
||||||
|
NDArray<ssize_t, 2> GenerateMoench05PixelMapOld();
|
||||||
|
|
||||||
//Matterhorn02
|
//Matterhorn02
|
||||||
NDArray<ssize_t, 2>GenerateMH02SingleCounterPixelMap();
|
NDArray<ssize_t, 2>GenerateMH02SingleCounterPixelMap();
|
||||||
|
@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "aare"
|
name = "aare"
|
||||||
version = "2024.11.15.dev0"
|
version = "2024.11.26.dev0"
|
||||||
|
|
||||||
|
|
||||||
[tool.scikit-build]
|
[tool.scikit-build]
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
from . import _aare
|
from . import _aare
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from .ScanParameters import ScanParameters
|
from .ScanParameters import ScanParameters
|
||||||
|
|
||||||
class CtbRawFile(_aare.CtbRawFile):
|
class CtbRawFile(_aare.CtbRawFile):
|
||||||
"""File reader for the CTB raw file format.
|
"""File reader for the CTB raw file format.
|
||||||
|
|
||||||
@ -11,9 +12,10 @@ class CtbRawFile(_aare.CtbRawFile):
|
|||||||
The function should take a numpy array of type uint8 and return one
|
The function should take a numpy array of type uint8 and return one
|
||||||
or several numpy arrays.
|
or several numpy arrays.
|
||||||
"""
|
"""
|
||||||
def __init__(self, fname, transform = None):
|
def __init__(self, fname, transform = None, chunk_size = 1):
|
||||||
super().__init__(fname)
|
super().__init__(fname)
|
||||||
self.transform = transform
|
self.transform = transform
|
||||||
|
self._chunk_size = chunk_size
|
||||||
|
|
||||||
|
|
||||||
def read_frame(self, frame_index: int | None = None ) -> tuple:
|
def read_frame(self, frame_index: int | None = None ) -> tuple:
|
||||||
@ -59,6 +61,10 @@ class CtbRawFile(_aare.CtbRawFile):
|
|||||||
Uses the position of the file pointer :py:meth:`~CtbRawFile.tell` to determine
|
Uses the position of the file pointer :py:meth:`~CtbRawFile.tell` to determine
|
||||||
where to start reading from.
|
where to start reading from.
|
||||||
|
|
||||||
|
If the number of frames requested is larger than the number of frames left in the file,
|
||||||
|
the function will read the remaining frames. If no frames are left in the file
|
||||||
|
a RuntimeError is raised.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
n_frames (int): Number of frames to read.
|
n_frames (int): Number of frames to read.
|
||||||
|
|
||||||
@ -68,6 +74,12 @@ class CtbRawFile(_aare.CtbRawFile):
|
|||||||
Raises:
|
Raises:
|
||||||
RuntimeError: If EOF is reached.
|
RuntimeError: If EOF is reached.
|
||||||
"""
|
"""
|
||||||
|
# Calculate the number of frames to actually read
|
||||||
|
n_frames = min(n_frames, self.frames_in_file - self.tell())
|
||||||
|
if n_frames == 0:
|
||||||
|
raise RuntimeError("No frames left in file.")
|
||||||
|
|
||||||
|
|
||||||
# Do the first read to figure out what we have
|
# Do the first read to figure out what we have
|
||||||
tmp_header, tmp_data = self.read_frame()
|
tmp_header, tmp_data = self.read_frame()
|
||||||
|
|
||||||
@ -87,10 +99,12 @@ class CtbRawFile(_aare.CtbRawFile):
|
|||||||
|
|
||||||
def read(self) -> tuple:
|
def read(self) -> tuple:
|
||||||
"""Read the entire file.
|
"""Read the entire file.
|
||||||
|
Seeks to the beginning of the file before reading.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
tuple: header, data
|
tuple: header, data
|
||||||
"""
|
"""
|
||||||
|
self.seek(0)
|
||||||
return self.read_n(self.frames_in_file)
|
return self.read_n(self.frames_in_file)
|
||||||
|
|
||||||
def seek(self, frame_index:int) -> None:
|
def seek(self, frame_index:int) -> None:
|
||||||
@ -101,7 +115,7 @@ class CtbRawFile(_aare.CtbRawFile):
|
|||||||
"""
|
"""
|
||||||
super().seek(frame_index)
|
super().seek(frame_index)
|
||||||
|
|
||||||
def tell() -> int:
|
def tell(self) -> int:
|
||||||
"""Return the current frame position in the file.
|
"""Return the current frame position in the file.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -164,7 +178,12 @@ class CtbRawFile(_aare.CtbRawFile):
|
|||||||
|
|
||||||
def __next__(self):
|
def __next__(self):
|
||||||
try:
|
try:
|
||||||
return self.read_frame()
|
if self._chunk_size == 1:
|
||||||
|
return self.read_frame()
|
||||||
|
else:
|
||||||
|
return self.read_n(self._chunk_size)
|
||||||
|
|
||||||
|
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
# TODO! find a good way to check that we actually have the right exception
|
# TODO! find a good way to check that we actually have the right exception
|
||||||
raise StopIteration
|
raise StopIteration
|
||||||
|
@ -9,6 +9,24 @@ class Moench05Transform:
|
|||||||
|
|
||||||
def __call__(self, data):
|
def __call__(self, data):
|
||||||
return np.take(data.view(np.uint16), self.pixel_map)
|
return np.take(data.view(np.uint16), self.pixel_map)
|
||||||
|
|
||||||
|
|
||||||
|
class Moench05Transform1g:
|
||||||
|
#Could be moved to C++ without changing the interface
|
||||||
|
def __init__(self):
|
||||||
|
self.pixel_map = _aare.GenerateMoench05PixelMap1g()
|
||||||
|
|
||||||
|
def __call__(self, data):
|
||||||
|
return np.take(data.view(np.uint16), self.pixel_map)
|
||||||
|
|
||||||
|
|
||||||
|
class Moench05TransformOld:
|
||||||
|
#Could be moved to C++ without changing the interface
|
||||||
|
def __init__(self):
|
||||||
|
self.pixel_map = _aare.GenerateMoench05PixelMapOld()
|
||||||
|
|
||||||
|
def __call__(self, data):
|
||||||
|
return np.take(data.view(np.uint16), self.pixel_map)
|
||||||
|
|
||||||
|
|
||||||
class Matterhorn02Transform:
|
class Matterhorn02Transform:
|
||||||
@ -25,4 +43,6 @@ class Matterhorn02Transform:
|
|||||||
|
|
||||||
#on import generate the pixel maps to avoid doing it every time
|
#on import generate the pixel maps to avoid doing it every time
|
||||||
moench05 = Moench05Transform()
|
moench05 = Moench05Transform()
|
||||||
|
moench05_1g = Moench05Transform1g()
|
||||||
|
moench05_old = Moench05TransformOld()
|
||||||
matterhorn02 = Matterhorn02Transform()
|
matterhorn02 = Matterhorn02Transform()
|
@ -20,6 +20,14 @@ void define_pixel_map_bindings(py::module &m) {
|
|||||||
.def("GenerateMoench05PixelMap", []() {
|
.def("GenerateMoench05PixelMap", []() {
|
||||||
auto ptr = new NDArray<ssize_t,2>(GenerateMoench05PixelMap());
|
auto ptr = new NDArray<ssize_t,2>(GenerateMoench05PixelMap());
|
||||||
return return_image_data(ptr);
|
return return_image_data(ptr);
|
||||||
|
})
|
||||||
|
.def("GenerateMoench05PixelMap1g", []() {
|
||||||
|
auto ptr = new NDArray<ssize_t,2>(GenerateMoench05PixelMap1g());
|
||||||
|
return return_image_data(ptr);
|
||||||
|
})
|
||||||
|
.def("GenerateMoench05PixelMapOld", []() {
|
||||||
|
auto ptr = new NDArray<ssize_t,2>(GenerateMoench05PixelMapOld());
|
||||||
|
return return_image_data(ptr);
|
||||||
})
|
})
|
||||||
.def("GenerateMH02SingleCounterPixelMap", []() {
|
.def("GenerateMH02SingleCounterPixelMap", []() {
|
||||||
auto ptr = new NDArray<ssize_t,2>(GenerateMH02SingleCounterPixelMap());
|
auto ptr = new NDArray<ssize_t,2>(GenerateMH02SingleCounterPixelMap());
|
||||||
|
@ -16,7 +16,7 @@ CtbRawFile::CtbRawFile(const std::filesystem::path &fname) : m_master(fname) {
|
|||||||
|
|
||||||
void CtbRawFile::read_into(std::byte *image_buf, DetectorHeader* header) {
|
void CtbRawFile::read_into(std::byte *image_buf, DetectorHeader* header) {
|
||||||
if(m_current_frame >= m_master.frames_in_file()){
|
if(m_current_frame >= m_master.frames_in_file()){
|
||||||
throw std::runtime_error(LOCATION + "End of file reached");
|
throw std::runtime_error(LOCATION + " End of file reached");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_current_frame != 0 && m_current_frame % m_master.max_frames_per_file() == 0){
|
if(m_current_frame != 0 && m_current_frame % m_master.max_frames_per_file() == 0){
|
||||||
|
@ -31,6 +31,49 @@ NDArray<ssize_t, 2> GenerateMoench03PixelMap() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NDArray<ssize_t, 2> GenerateMoench05PixelMap() {
|
NDArray<ssize_t, 2> GenerateMoench05PixelMap() {
|
||||||
|
std::array<int, 3> adc_numbers = {5, 9, 1};
|
||||||
|
NDArray<ssize_t, 2> order_map({160, 150});
|
||||||
|
int n_pixel = 0;
|
||||||
|
for (int row = 0; row < 160; row++) {
|
||||||
|
for (int i_col = 0; i_col < 50; i_col++) {
|
||||||
|
n_pixel = row * 50 + i_col;
|
||||||
|
for (int i_sc = 0; i_sc < 3; i_sc++) {
|
||||||
|
int col = 50 * i_sc + i_col;
|
||||||
|
int adc_nr = adc_numbers[i_sc];
|
||||||
|
int i_analog = n_pixel * 12 + adc_nr;
|
||||||
|
|
||||||
|
// analog_frame[row * 150 + col] = analog_data[i_analog] & 0x3FFF;
|
||||||
|
order_map(row, col) = i_analog;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return order_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
NDArray<ssize_t, 2> GenerateMoench05PixelMap1g() {
|
||||||
|
std::array<int, 3> adc_numbers = {1, 2, 0};
|
||||||
|
NDArray<ssize_t, 2> order_map({160, 150});
|
||||||
|
int n_pixel = 0;
|
||||||
|
for (int row = 0; row < 160; row++) {
|
||||||
|
for (int i_col = 0; i_col < 50; i_col++) {
|
||||||
|
n_pixel = row * 50 + i_col;
|
||||||
|
for (int i_sc = 0; i_sc < 3; i_sc++) {
|
||||||
|
int col = 50 * i_sc + i_col;
|
||||||
|
int adc_nr = adc_numbers[i_sc];
|
||||||
|
int i_analog = n_pixel * 3 + adc_nr;
|
||||||
|
|
||||||
|
|
||||||
|
// analog_frame[row * 150 + col] = analog_data[i_analog] & 0x3FFF;
|
||||||
|
order_map(row, col) = i_analog;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return order_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
NDArray<ssize_t, 2> GenerateMoench05PixelMapOld() {
|
||||||
std::array<int, 3> adc_numbers = {9, 13, 1};
|
std::array<int, 3> adc_numbers = {9, 13, 1};
|
||||||
NDArray<ssize_t, 2> order_map({160, 150});
|
NDArray<ssize_t, 2> order_map({160, 150});
|
||||||
int n_pixel = 0;
|
int n_pixel = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user