mirror of
https://github.com/slsdetectorgroup/aare.git
synced 2026-05-01 11:32:23 +02:00
2736d975c5
- Allowing the users more flexibility to play around with custom eta
functions without touching the c++ code
- passing vector of eta values to ``transform_eta_values``
```
from aare import Interpolator, ClusterVector, Etai, Cluster
import numpy as np
def custom_eta(cluster_pixel_coordinate_x, cluster_pixel_coordinate_y, cluster_data):
# dummy custom eta function that just returns the sum of the cluster data
eta = Etai()
eta.x = 0.1 # dummy x value
eta.y = 0.1 # dummy y value
eta.sum = np.sum(cluster_data) # sum of the cluster data as the "energy
return eta
# Create a dummy eta distribution and bins
eta_distribution = np.zeros((10, 10, 1)) # dummy eta distribution
etax_bins = np.linspace(0, 1.0, 11)
etay_bins = np.linspace(0, 1.0, 11)
e_bins = np.array([0., 10.]) # dummy energy bins
# Create the interpolator
interpolator = Interpolator(eta_distribution, etax_bins, etay_bins, e_bins)
# Create a dummy cluster vector
cluster_vector = ClusterVector()
cluster_vector.push_back(Cluster(10, 5, np.ones(shape=9, dtype = np.int32)))
cluster_vector.push_back(Cluster(20, 10, np.ones(shape=9, dtype = np.int32)))
# Create dummy etas for the clusters
cluster_array = np.array(cluster_vector)
etas = np.array([custom_eta(cluster["x"], cluster["y"], cluster["data"]) for cluster in cluster_array])
# transform eta values to uniform coordinates
uniform_coordinates = interpolator.transform_eta_values(etas)
# Interpolate to get the photon coordinates e.g. apply interpolation logic
photon_coordinates_x = cluster_array["x"] + uniform_coordinates["x"] # add to pixel coordinate
photon_coordinates_y = cluster_array["y"] + uniform_coordinates["y"] # add to pixel coordinate
```
advantage: full control over interpolation logic,
downside: inefficient quite some loops in python
- passing pre computed eta values to interpolate function
```
Interpolator.interpolate(cluster_vector, etas)
```
downside: less flexibility in interpolation logic.
downside: People might misuse it instead of using interpolate directly
with a pre compiled eta function implemented in c++
31 lines
962 B
Python
31 lines
962 B
Python
import pytest
|
|
|
|
from aare import Interpolator, ClusterVector, Etai, Cluster
|
|
|
|
import numpy as np
|
|
|
|
|
|
def test_interpolation_api():
|
|
eta_distribution = np.zeros((10, 10, 1)) # dummy eta distribution
|
|
etax_bins = np.linspace(0, 1.0, 11)
|
|
etay_bins = np.linspace(0, 1.0, 11)
|
|
e_bins = np.array([0., 10.]) # dummy energy bins
|
|
interpolator = Interpolator(eta_distribution, etax_bins, etay_bins, e_bins)
|
|
|
|
cluster_vector = ClusterVector()
|
|
cluster_vector.push_back(Cluster(10, 5, np.ones(shape=9, dtype=np.int32)))
|
|
cluster_vector.push_back(Cluster(20, 10, np.ones(shape=9, dtype=np.int32)))
|
|
|
|
eta1 = Etai()
|
|
eta1.x = 0.1
|
|
eta1.y = 0.1
|
|
eta1.sum = 5
|
|
eta2 = Etai()
|
|
eta2.x = 0.1
|
|
eta2.y = 0.9
|
|
eta2.sum = 6
|
|
etas = np.array([eta1, eta2]) # dummy etas for the clusters
|
|
|
|
photons = interpolator.interpolate(cluster_vector, etas)
|
|
|
|
assert photons.size == cluster_vector.size # should return one photon per cluster |