/*- * Copyright 2016 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.analysis.processing.operations.roiprofile; 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.roi.ROIUtils; import org.eclipse.dawnsci.analysis.dataset.roi.RectangularROI; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.BooleanDataset; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetUtils; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.metadata.MaskMetadata; import uk.ac.diamond.scisoft.analysis.roi.ROIProfile; public abstract class AbstractTwoBoxMeanOperation<T extends TwoBoxModel> extends AbstractOperation<TwoBoxModel, OperationData> { @Override public OperationRank getInputRank() { return OperationRank.TWO; } @Override public OperationRank getOutputRank() { return OperationRank.TWO; } @Override protected OperationData process(IDataset input, IMonitor monitor) throws OperationException { RectangularROI box1 = model.getBox1(); RectangularROI box2 = model.getBox2(); // Dataset mask = null; // MaskMetadata mmd = input.getFirstMetadata(MaskMetadata.class); // if (mmd != null && mmd.getMask() != null) mask = DatasetUtils.sliceAndConvertLazyDataset(mmd.getMask()); // // Dataset data = DatasetUtils.convertToDataset(input); // // Dataset[] b1 = ROIProfile.boxMean(data, mask, box1, false); // Dataset[] b2 = ROIProfile.boxMean(data, mask, box2, false); long t = System.currentTimeMillis(); Dataset out = result(getMeanFromBox(input,box1), getMeanFromBox(input,box2)); System.out.println(System.currentTimeMillis()-t); return new OperationData(input, out); } abstract protected Dataset result(double mean1, double mean2); public static double getMeanFromBox(IDataset input, RectangularROI roi){ Dataset slice = getSliceFromBox(input, roi); MaskMetadata m = slice.getFirstMetadata(MaskMetadata.class); if (m != null && m.getMask() != null) slice = ROIProfile.nanalize(slice, (BooleanDataset)m.getMask().getSlice()); return (double)slice.mean(true); } public static Dataset getSliceFromBox(IDataset input, RectangularROI roi){ //data set shape corresponds to plot [y,x] int[] spt = roi.getIntPoint(); int[] len = roi.getIntLengths(); final int xstart = Math.max(0, spt[0]); final int xend = Math.min(spt[0] + len[0], input.getShape()[1]); final int ystart = Math.max(0, spt[1]); final int yend = Math.min(spt[1] + len[1], input.getShape()[0]); return DatasetUtils.convertToDataset(input.getSlice(new int[]{ystart, xstart}, new int[]{yend, xend}, new int[]{1,1})); } }