Skip to content
Snippets Groups Projects

Added fit_elastic method to hRIXS class that allows one to automatically fit the images in each run

Closed Benjamin van Kuiken requested to merge hrixs_fit into master
1 file
+ 57
2
Compare changes
  • Side-by-side
  • Inline
@@ -234,12 +234,16 @@ class hRIXS:
self.Y_RANGE = np.s_[:]
# centroid
self.C_METHOD='manual'
self.THRESHOLD = None # pixel counts above which a hit candidate is assumed
self.STD_THRESHOLD = 3.5 # same as THRESHOLD, in standard deviations
self.DBL_THRESHOLD = 0.1 # factor used for double hits in centroid_one
self.DBL_THRESHOLD = 5 # factor used for double hits in centroid_one
self.CURVE_A = 0 # curvature parameters as determined elsewhere
self.CURVE_B = 0
# integral
self.BINS = 100
@@ -442,7 +446,7 @@ class hRIXS:
dres.append((mx, my))
return res, dres
def centroid(self, data, bins=None, method='auto'):
def centroid(self, data, bins=None, method=None):
"""calculate a spectrum by finding the centroid of individual photons
This takes the `xarray.Dataset` `data` and returns a copy of it, with
@@ -462,6 +466,8 @@ class hRIXS:
"""
if bins is None:
bins = self.BINS
if method is None:
method = self.C_METHOD
ret = np.zeros((len(data["hRIXS_det"]), bins))
retd = np.zeros((len(data["hRIXS_det"]), bins))
total_hits = np.zeros((len(data["hRIXS_det"])))
@@ -553,6 +559,55 @@ class hRIXS:
data['spectrum'] = (("trainId", "energy"), ret)
return data
def fit_elastic(self, data, fit_hw=10, plot=False):
"""Fits elastic line in each spectum found in data. Returns fit params
and integrated area of RIXS spectrum.
data - xarray containing hRIXS data that has already been centroided
or integrated
fit_hw - half width of the fitting window (in bins) around the elastic
line
plot - plot each individual fit
Example
-------
data = h.centroid(data)
p, int = h.fit_elastic(data)
"""
#if data["spectrum"] == None:
# print("No spectrum found in data structure. "+
# "Centroid or integrate images first.")
# return
if self.ENERGY_SLOPE == None:
energy = np.arange(self.Y_RANGE.start, self.Y_RANGE.stop)
else:
energy = (np.arange(self.Y_RANGE.start, self.Y_RANGE.stop) *
self.ENERGY_SLOPE+self.ENERGY_INTERCEPT)
fit_param = []
data_int = []
for spec in data["spectrum"].data:
x0 = np.argmax(spec)
fit_start = x0-fit_hw
fit_end = x0+fit_hw
fit_result = gaussian_fit(energy[fit_start:fit_end],
spec[fit_start:fit_end])
fit_param.append(fit_result)
data_int.append(np.trapz(spec))
if plot:
plt.figure()
plt.plot(energy, spec)
plt.plot(energy, gauss1d(energy, *fit_result))
return np.array(fit_param), data_int
aggregators = dict(
hRIXS_det=lambda x, dim: x.sum(dim=dim),
Delay=lambda x, dim: x.mean(dim=dim),
Loading