package uk.ac.diamond.scisoft.analysis.processing.operations.backgroundsubtraction;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.dawnsci.analysis.api.processing.OperationData;
import org.eclipse.dawnsci.analysis.api.processing.OperationException;
import org.eclipse.dawnsci.analysis.api.processing.OperationRank;
import org.eclipse.dawnsci.analysis.api.processing.model.AbstractOperationModel;
import org.eclipse.dawnsci.analysis.api.processing.model.IOperationModel;
import org.eclipse.dawnsci.analysis.dataset.operations.AbstractOperation;
import org.eclipse.january.IMonitor;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.january.dataset.Maths;
import org.eclipse.january.metadata.OriginMetadata;
import uk.ac.diamond.scisoft.analysis.processing.operations.powder.AbstractPixelIntegrationOperation;
public abstract class AbstractImageSubtrationOperation<T extends AbstractOperationModel> extends AbstractOperation<T, OperationData> {
protected Dataset image;
private PropertyChangeListener listener;
protected OperationData process(IDataset input, IMonitor monitor) throws OperationException {
Dataset bg = null;
if (image == null) {
bg = getImage(input);
} else {
bg = image;
}
Dataset output = Maths.subtract(input, bg);
copyMetadata(input, output);
return new OperationData(output);
}
@Override
public OperationRank getInputRank() {
return OperationRank.TWO;
}
@Override
public OperationRank getOutputRank() {
return OperationRank.TWO;
}
protected abstract Dataset getImage(IDataset input) throws OperationException;
@Override
public void setModel(T model) {
super.setModel(model);
if (listener == null) {
listener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
image = null;
}
};
} else {
((AbstractOperationModel)this.model).removePropertyChangeListener(listener);
}
((AbstractOperationModel)this.model).addPropertyChangeListener(listener);
}
}