/*- * Copyright 2015 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.xpdf.operations; import java.io.Serializable; import java.util.Arrays; import java.util.Collections; import org.apache.commons.lang.ArrayUtils; 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.dataset.operations.AbstractOperation; import org.eclipse.dawnsci.analysis.dataset.slicer.SliceFromSeriesMetadata; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.IDataset; import uk.ac.diamond.scisoft.analysis.processing.operations.powder.AzimuthalPixelIntegrationOperation; import uk.ac.diamond.scisoft.xpdf.metadata.XPDFMetadata; /** * An operation to perform azimuthal integration while preserving the {@link XPDFMetadata} metadata associated with the data. * @author Timothy Spain, timothy.spain@diamond.ac.uk * * @param <T> a subclass of{@link AzimuthalPixalIntegrationModel}. */ public class XPDFAzimuthalIntegrationOperation extends AbstractOperation<XPDFAzimuthalIntegrationModel, OperationData>{ @Override public String getId() { return "uk.ac.diamond.scisoft.xpdf.operations.XPDFAzimuthalIntegration"; } @Override protected OperationData process(IDataset input, IMonitor monitor) throws OperationException { // get the XPDF metadata XPDFMetadata xMeta = input.getFirstMetadata(XPDFMetadata.class); // create the Operation that will do the processing AzimuthalPixelIntegrationOperation<XPDFAzimuthalIntegrationInternalModel> internalOperation = new AzimuthalPixelIntegrationOperation<XPDFAzimuthalIntegrationInternalModel>(); // create the fake model that will supply the parameters to the internal Operation XPDFAzimuthalIntegrationInternalModel internalModel = new XPDFAzimuthalIntegrationInternalModel( model.getAzimuthalRange(), model.getRadialRange(), model.isPixelSplitting(), model.getNumberOfBins()); internalOperation.setModel(internalModel); // Resize the data to be more like it was in the execute() method SliceFromSeriesMetadata ssm = getSliceSeriesMetadata(input); // Get the dimensions in the original data int[] dataDims = ssm.getDataDimensions(); int maxDimension = Collections.max(Arrays.asList(ArrayUtils.toObject(dataDims))); int[] newShape = new int[maxDimension+1]; int[] oldShape = input.getShape(); // All elements of the new shape are 1 Arrays.fill(newShape, 1); // except those that are in the data for (int dim = 0; dim < oldShape.length; dim++) newShape[dataDims[dim]] = oldShape[dim]; IDataset reshapedInput = input.clone(); // The reshaped data is now (hopefully) the same shape as input was in this.execute() reshapedInput.resize(newShape); OperationData output = internalOperation.execute(reshapedInput, monitor); // Set the axis coordinate to q if (xMeta != null) { xMeta.getSampleTrace().setAxisAngle(false); } output.getData().addMetadata(xMeta); return output; // OperationData superResult = super.process(input, monitor); // // // The downstream processing relies on metadata to tell if the axis is 2θ or q // if (xMeta != null) { // // if (model.getAxisType() != XAxis.ANGLE) // xMeta.getSample().getTrace().setAxisAngle(false); // // superResult.getData().setMetadata(xMeta); // } // return superResult; } @Override public OperationRank getInputRank() { return OperationRank.TWO; } @Override public OperationRank getOutputRank() { return OperationRank.ONE; } }