From 21f86d7d690be477c73b93aba49a95d03c9c0044 Mon Sep 17 00:00:00 2001 From: Simon Ebner Date: Mon, 14 Apr 2014 13:14:45 +0200 Subject: [PATCH] Updated provider to also generate a vdescriptor --- .../psi/fda/aq/XScanDescriptorProvider.java | 249 ++++++++++++++++++ 1 file changed, 249 insertions(+) diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptorProvider.java b/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptorProvider.java index 91efc86..08a4a99 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptorProvider.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptorProvider.java @@ -1,17 +1,34 @@ package ch.psi.fda.aq; import java.io.File; +import java.util.List; +import java.util.logging.Logger; import ch.psi.fda.DescriptorProvider; import ch.psi.fda.edescriptor.EDescriptor; import ch.psi.fda.model.ModelManager; +import ch.psi.fda.model.v1.ArrayDetector; import ch.psi.fda.model.v1.Configuration; +import ch.psi.fda.model.v1.ContinuousPositioner; import ch.psi.fda.model.v1.Data; +import ch.psi.fda.model.v1.Detector; +import ch.psi.fda.model.v1.LinearPositioner; +import ch.psi.fda.model.v1.Positioner; +import ch.psi.fda.model.v1.PseudoPositioner; +import ch.psi.fda.model.v1.Visualization; +import ch.psi.fda.vdescriptor.LinePlot; import ch.psi.fda.vdescriptor.VDescriptor; +import ch.psi.fda.vdescriptor.XYSeries; +import ch.psi.fda.vdescriptor.XYZSeries; +import ch.psi.fda.vdescriptor.YSeries; +import ch.psi.fda.vdescriptor.YZSeries; public class XScanDescriptorProvider implements DescriptorProvider { + + private static final Logger logger = Logger.getLogger(XScanDescriptorProvider.class.getName()); private EDescriptor edescriptor; + private VDescriptor vdescriptor; @Override public void load(File... files) { @@ -62,7 +79,239 @@ public class XScanDescriptorProvider implements DescriptorProvider { } edescriptor = new XScanDescriptor(c); + vdescriptor = mapVisualizations(c.getVisualization()); + } + + private VDescriptor mapVisualizations(List vl){ + VDescriptor vd = new VDescriptor(); + + + for(Visualization v: vl){ + if(v instanceof ch.psi.fda.model.v1.LinePlot){ + ch.psi.fda.model.v1.LinePlot lp = (ch.psi.fda.model.v1.LinePlot) v; + + String x = getId(lp.getX()); + + LinePlot lineplot = new LinePlot(lp.getTitle()); + List l = lp.getY(); + for(Object o: l){ + String y = getId(o); + lineplot.getData().add(new XYSeries(x, y)); + } + + vd.getPlots().add(lineplot); + } + else if(v instanceof ch.psi.fda.model.v1.LinePlotArray){ + // Array visualization + ch.psi.fda.model.v1.LinePlotArray lp = (ch.psi.fda.model.v1.LinePlotArray) v; + + LinePlot lineplot = new LinePlot(lp.getTitle()); + // Create data filter for visualization + List l = lp.getY(); + for(Object o: l){ + String idY = getId(o); + + // TODO Need to actually check if minX of + lineplot.setMinX(lp.getOffset()); + lineplot.setMaxX(lp.getOffset()+lp.getSize()); + lineplot.getData().add(new YSeries(idY)); + } + } + else if(v instanceof ch.psi.fda.model.v1.MatrixPlot){ + + // MatrixPlot does currently not support RegionPositioners because of the + // plotting problems this would cause. If regions of the positioner have different + // step sizes it is not easily possible (without (specialized) rasterization) to plot the data. + + ch.psi.fda.model.v1.MatrixPlot mp = (ch.psi.fda.model.v1.MatrixPlot) v; + + + double minX, maxX; + int nX; + double minY, maxY; + int nY; + + String idX, idY, idZ; + + // X Axis + if(mp.getX() instanceof LinearPositioner){ + LinearPositioner linp = ((LinearPositioner)mp.getX()); + idX = linp.getId(); + + minX = (Math.min(linp.getStart(), linp.getEnd())); + maxX = (Math.max(linp.getStart(), linp.getEnd())); + nX = ((int) Math.floor((Math.abs(maxX-minX))/linp.getStepSize()) + 1); + } + else if(mp.getX() instanceof PseudoPositioner){ + PseudoPositioner pp = ((PseudoPositioner)mp.getX()); + idX = pp.getId(); + minX = (1); // Count starts at 1 + maxX = (pp.getCounts()); + nX = (pp.getCounts()); + } + else if(mp.getX() instanceof ContinuousPositioner){ + ContinuousPositioner conp = ((ContinuousPositioner)mp.getX()); + idX = conp.getId(); + + minX = (Math.min(conp.getStart(), conp.getEnd())); + maxX = (Math.max(conp.getStart(), conp.getEnd())); + nX = ((int) Math.floor((Math.abs(maxX-minX))/conp.getStepSize()) + 1); + } + else{ + // Fail as we cannot determine the min, max and number of steps + throw new RuntimeException(mp.getX().getClass().getName()+" is not supported as x-axis of a MatrixPlot"); + } + + // Y Axis + if(mp.getY() instanceof LinearPositioner){ + LinearPositioner linp = ((LinearPositioner)mp.getY()); + idY = linp.getId(); + minY = (Math.min(linp.getStart(), linp.getEnd())); + maxY = (Math.max(linp.getStart(), linp.getEnd())); + nY = ((int) Math.floor((Math.abs(maxY-minY))/linp.getStepSize()) + 1); + } + else if(mp.getY() instanceof PseudoPositioner){ + PseudoPositioner pp = ((PseudoPositioner)mp.getY()); + idY = pp.getId(); + minY = (1); // Count starts at 1 + maxY = (pp.getCounts()); + nY = (pp.getCounts()); + } + else{ + // Fail as we cannot determine the min, max and number of steps + throw new RuntimeException(mp.getY().getClass().getName()+" is not supported as y-axis of a MatrixPlot"); + } + + // Z Dimension + idZ = getId(mp.getZ()); + + + ch.psi.fda.vdescriptor.MatrixPlot matrixplot = new ch.psi.fda.vdescriptor.MatrixPlot(mp.getTitle()); + matrixplot.setMinX(minX); + matrixplot.setMaxX(maxX); + matrixplot.setnX(nX); + matrixplot.setMinY(minY); + matrixplot.setMaxY(maxY); + matrixplot.setnY(nY); + + matrixplot.getData().add(new XYZSeries(idX, idY, idZ)); + vdescriptor.getPlots().add(matrixplot); + } + else if(v instanceof ch.psi.fda.model.v1.MatrixPlotArray){ + // Support for 2D waveform plots + ch.psi.fda.model.v1.MatrixPlotArray mp = (ch.psi.fda.model.v1.MatrixPlotArray) v; + + // Get size of the array detector + int arraySize = 0; + Object o = mp.getZ(); + if(o instanceof ArrayDetector){ + ArrayDetector ad = (ArrayDetector) o; + arraySize = ad.getArraySize(); + } + else{ + // Workaround + arraySize = mp.getSize(); // of array is from a manipulation the size is not known. Then the size will indicate the size of the array to display + } + + int offset = mp.getOffset(); + // Determine size for array + int size = mp.getSize(); + if(size>0 && offset+size