package uk.ac.diamond.scisoft.analysis.processing.operations.expressions; import java.util.Arrays; import org.eclipse.dawnsci.analysis.api.expressions.IExpressionEngine; import org.eclipse.dawnsci.analysis.api.expressions.IExpressionService; 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.january.DatasetException; import org.eclipse.january.IMonitor; import org.eclipse.january.MetadataException; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.metadata.AxesMetadata; import org.eclipse.january.metadata.MetadataFactory; public class Expression2DOperation<T extends Expression2DModel> extends Expression1DOperation<Expression2DModel> { @Override public String getId() { return "uk.ac.diamond.scisoft.analysis.processing.operations.expressions.Expression2DOperation"; } protected OperationData process(IDataset input, IMonitor monitor) throws OperationException { if (engine == null) { try { IExpressionService service = ExpressionServiceHolder.getExpressionService(); engine = service.getExpressionEngine(); } catch (Exception e) { throw new OperationException(this, e.getMessage()); } } engine.addLoadedVariable("data", input); IDataset[] axes = addAxesToEngine(input); addAdditionalValues(input,engine); IDataset outdata = evaluateData(input, model.getDataExpression(),2); IDataset outaxisx = evaluateData(axes[0], model.getAxisExpressionX(), axes[0].getRank()); IDataset outaxisy = evaluateData(axes[1], ((Expression2DModel)model).getAxisExpressionY(), axes[1].getRank()); outdata.setName("custom_expression"); if (((Expression2DModel)model).getAxisExpressionY() != null && !((Expression2DModel)model).getAxisExpressionY().isEmpty()) outaxisy.setName("custom_y_axis"); //outaxisy.setShape(new int[]{outaxisy.getShape()[0],1}); if (model.getAxisExpressionX() != null && !model.getAxisExpressionX().isEmpty()) outaxisx.setName("custom_x_axis"); //outaxisx.setShape(new int[]{1,outaxisx.getShape()[0]}); if (Arrays.equals(input.getShape(), outdata.getShape())) { copyMetadata(input, outdata); } AxesMetadata am; try { am = MetadataFactory.createMetadata(AxesMetadata.class, 2); } catch (MetadataException e) { throw new OperationException(this, e); } am.setAxis(0, outaxisy); am.setAxis(1, outaxisx); outdata.setMetadata(am); return new OperationData(outdata); } @Override public OperationRank getInputRank() { return OperationRank.TWO; } @Override public OperationRank getOutputRank() { return OperationRank.TWO; } protected IDataset[] addAxesToEngine(IDataset input) { //1D should be in [0] ILazyDataset[] axes = getFirstAxes(input); IDataset axisx = null; IDataset axisy = null; if (axes != null ) { try { if (axes[0] != null) { axisx= axes[1].getSlice().squeeze(); } if (axes[0] != null) { axisy= axes[0].getSlice().squeeze(); } } catch (DatasetException e) { throw new OperationException(this, e); } } if (axisx == null) axisx = DatasetFactory.createRange(input.getShape()[0], Dataset.FLOAT64); if (axisy == null) axisy = DatasetFactory.createRange(input.getShape()[1], Dataset.FLOAT64); engine.addLoadedVariable("xaxis", axisx); engine.addLoadedVariable("yaxis", axisy); return new IDataset[]{axisx,axisy}; } protected void addAdditionalValues(IDataset input, IExpressionEngine engine) throws OperationException { //do nothing } }