/*- * 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.externaldata; import java.util.Arrays; import org.eclipse.dawnsci.analysis.api.processing.IOperation; import org.eclipse.dawnsci.analysis.api.processing.OperationException; import org.eclipse.dawnsci.analysis.dataset.slicer.SliceFromSeriesMetadata; import org.eclipse.january.DatasetException; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetUtils; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.dataset.LazyMaths; import org.eclipse.january.dataset.ShapeUtils; import uk.ac.diamond.scisoft.analysis.processing.operations.utils.ProcessingUtils; public class DataUtils { public static Dataset getInternalFrameAverage(IDataset input, Integer start, Integer end) throws OperationException { SliceFromSeriesMetadata ssm = input.getFirstMetadata(SliceFromSeriesMetadata.class); ILazyDataset lz = ssm.getParent(); int s = start == null ? 0 : start; int e = end == null ? Integer.MAX_VALUE -1 : end; int[] dataDims = ssm.getDataDimensions(); if (input.getRank() == 1 && dataDims.length == 2) { dataDims = new int[]{dataDims[0]}; } Dataset data = null; try { if (lz.getRank() == dataDims.length) { data = DatasetUtils.sliceAndConvertLazyDataset(lz); } else { data = LazyMaths.mean(s, e, lz, dataDims).squeeze(); } } catch (DatasetException e1) { throw new OperationException(null, e1); } return data; } public static Dataset getExternalFrameAverage(IDataset input, Integer start, Integer end, String path, String name, IOperation op) throws OperationException { SliceFromSeriesMetadata ssm = input.getFirstMetadata(SliceFromSeriesMetadata.class); ILazyDataset lz = ProcessingUtils.getLazyDataset(op, path, name); int s = start == null ? 0 : start; int e = end == null ? Integer.MAX_VALUE -1 : end; int[] dataDims = ssm.getDataDimensions(); if (input.getRank() == 1 && dataDims.length == 2) { dataDims = new int[]{dataDims[0]}; } Dataset subtrahend = null; int[] shape = ShapeUtils.squeezeShape(lz.getShape(), false); try { if (shape.length == dataDims.length) { subtrahend = DatasetUtils.sliceAndConvertLazyDataset(lz); subtrahend.squeeze(); } else { subtrahend = LazyMaths.mean(s, e, lz, dataDims).squeeze(); } } catch (DatasetException e1) { throw new OperationException(op, e1); } return subtrahend; } public static Dataset getExternalFrameMatching(IDataset input, Integer start, Integer end, String path, String name, IOperation op) throws OperationException { SliceFromSeriesMetadata ssm = input.getFirstMetadata(SliceFromSeriesMetadata.class); ILazyDataset lz = ProcessingUtils.getLazyDataset(op, path, name); if (Arrays.equals(lz.getShape(), ssm.getSourceInfo().getParent().getShape())) { try { return DatasetUtils.convertToDataset(lz.getSlice(ssm.getSliceFromInput())).squeeze(); } catch (DatasetException e) { throw new OperationException(op, e); } } return null; } public static int calculateFastestDimension(int[] dataDims, int[] shape) { int[] dd = dataDims.clone(); Arrays.sort(dd); for (int i = shape.length-1; i > -1; i--) { int key = Arrays.binarySearch(dd, i); if (key < 0) return i; } return -1; } }