Source code for paws.core.operations.PROCESSING.BACKGROUND.SubtractMaximumBackground
import numpy as np
from collections import OrderedDict
from ... import Operation as opmod
from ...Operation import Operation
inputs = OrderedDict(
q_I=None,
q_I_bg=None,
dI=None,
dI_bg=None)
outputs = OrderedDict(
q_I=None,
dI=None,
bg_factor=None)
[docs]class SubtractMaximumBackground(Operation):
"""
Subtract a background from a foreground, with scaling to prevent over-subtraction.
Optionally, input an intensity error array,
and get an error estimate for the background-subtracted intensity.
Operation originally contributed by Amanda Fournier.
"""
def __init__(self):
super(SubtractMaximumBackground, self).__init__(inputs, outputs)
self.input_doc['q_I'] = 'n-by-2 array of q values and corresponding intensity values'
self.input_doc['q_I_bg'] = 'n-by-2 array, background corresponding to q_I'
self.input_doc['dI'] = '1d array, error estimate of I (optional, default None)'
self.input_doc['dI_bg'] = '1d array, error estimate of I_bg (optional, default None)'
self.output_doc['q_I'] = 'n-by-2 array of q values and background-subtracted intensity: I-(bg_factor*I_bg)'
self.output_doc['dI'] = 'error estimate of background-subtracted intensity'
self.output_doc['bg_factor'] = 'the factor the background was multiplied by '\
' before subraction to ensure positive values for output intensity'
[docs] def run(self):
q_I = self.inputs['q_I']
q_I_bg = self.inputs['q_I_bg']
if not all(q_I[:,0] == q_I_bg[:,0]):
msg = 'SPECTRUM AND BACKGROUND ON DIFFERENT q DOMAINS'
raise ValueError(msg)
I = q_I[:,1]
I_bg = q_I_bg[:,1]
bad_data = (I < 0) | (I_bg <= 0) | np.isnan(I) | np.isnan(I_bg)
bg_factor = np.min(I[~bad_data] / I_bg[~bad_data])
I_out = I-(bg_factor*I_bg)
dI = self.inputs['dI']
dI_bg = self.inputs['dI_bg']
dI_out = None
if dI_bg is not None and dI is not None:
dI_out = (dI**2+(bg_factor*dI_bg)**2)**0.5
self.outputs['q_I'] = np.array(zip(q_I[:,0],I_out))
self.outputs['dI'] = dI_out
self.outputs['bg_factor'] = bg_factor