This commit is contained in:
sfop
2016-11-07 13:24:05 +01:00
parent c3abc7a144
commit 6fdcc33a48
2 changed files with 107 additions and 83 deletions

View File

@@ -20,7 +20,10 @@ import ch.psi.pshell.core.JsonSerializer;
import ch.psi.pshell.device.Device;
import ch.psi.pshell.device.DeviceAdapter;
import ch.psi.pshell.epics.ArraySource;
import ch.psi.pshell.epics.ChannelDouble;
import ch.psi.pshell.epics.ChannelDoubleArray;
import ch.psi.pshell.epics.ChannelInteger;
import ch.psi.pshell.epics.ChannelIntegerArray;
import ch.psi.pshell.epics.DiscretePositioner;
import ch.psi.pshell.epics.Epics;
import ch.psi.pshell.imaging.Colormap;
@@ -485,10 +488,13 @@ public class ScreenPanel extends Panel {
((Camtool)camera).shape.addListener(new DeviceAdapter(){
@Override
public void onValueChanged(Device device, Object value, Object former) {
if ((camera instanceof Camtool) &&(device==((Camtool)camera).shape) && (camera.getState().isInitialized())) {
if ((camera instanceof Camtool)
&&(device==((Camtool)camera).shape)
&& (camera.getState().isInitialized())
&& (camera.getImage()!=null)) {
try {
if ((value != null) && (value.getClass() == int[].class)) {
final int[] s = (int[]) value;
final int[] s = (int[]) value;
if ((s.length > 1) && (s[0] * s[1] > 0) &&
((s[0] != camera.getConfig().imageHeight) || (s[1] != camera.getConfig().imageWidth))) {
SwingUtilities.invokeLater(new Runnable() {
@@ -742,43 +748,52 @@ public class ScreenPanel extends Panel {
int profileSize = renderer.getProfileSize();
if ((useCamtoolStats) &&(camera instanceof Camtool)){
try{
profileSize/=4;
double[] gX = ((Camtool)camera).gaussX.read();
profileSize/=4;
double[] pX = ((Camtool)camera).profileX.read();
int[] x = Arr.indexesInt(gX.length);
int[] y = new int[gX.length];
int[] p = new int[gX.length];
List<Double> l = Arrays.asList((Double[]) Convert.toWrapperArray(pX));
Double min = Collections.min(l);
Double max = Collections.max(l);
double minPlot = min;
double rangePlot = max- min;
for (int i = 0; i < x.length; i++) {
y[i] = (int) (data.getHeight() - 1 - (((gX[i] - minPlot) / rangePlot) * profileSize));
p[i] = (int) (data.getHeight() - 1 - (((pX[i] - minPlot) / rangePlot) * profileSize));
}
vgaussian = new Overlays.Polyline(penFit, x, y);
vprofile = new Overlays.Polyline(renderer.getPenProfile(), x, p);
double[] gY = ((Camtool)camera).gaussY.read();
double[] pY = ((Camtool)camera).profileY.read();
y = Arr.indexesInt(gY.length);
x = new int[gY.length];
p = new int[gY.length];
l = Arrays.asList((Double[]) Convert.toWrapperArray(pY));
min = Collections.min(l);
max = Collections.max(l);
minPlot = min;
rangePlot = max- min;
if (pX!=null){
int[] x = Arr.indexesInt(pX.length);
int[] y = new int[pX.length];
int[] p = new int[pX.length];
double[] gX = ((Camtool)camera).gaussX.read();
for (int i = 0; i < x.length; i++) {
x[i] = (int) (((gY[i] - minPlot) / rangePlot) * profileSize);
p[i] = (int) (((pY[i] - minPlot) / rangePlot) * profileSize);
}
hgaussian = new Overlays.Polyline(penFit, x, y);
hprofile = new Overlays.Polyline(renderer.getPenProfile(), p, y);
List<Double> l = Arrays.asList((Double[]) Convert.toWrapperArray(pX));
Double min = Collections.min(l);
Double max = Collections.max(l);
double minPlot = min;
double rangePlot = max- min;
for (int i = 0; i < x.length; i++) {
if (gX!=null){
y[i] = (int) (data.getHeight() - 1 - (((gX[i] - minPlot) / rangePlot) * profileSize));
}
p[i] = (int) (data.getHeight() - 1 - (((pX[i] - minPlot) / rangePlot) * profileSize));
}
vgaussian = new Overlays.Polyline(penFit, x, y);
vprofile = new Overlays.Polyline(renderer.getPenProfile(), x, p);
}
double[] pY = ((Camtool)camera).profileY.read();
if (pX!=null){
double[] gY = ((Camtool)camera).gaussY.read();
int[] y = Arr.indexesInt(pY.length);
int[] x = new int[pY.length];
int[] p = new int[pY.length];
List<Double> l = Arrays.asList((Double[]) Convert.toWrapperArray(pY));
Double min = Collections.min(l);
Double max = Collections.max(l);
double minPlot = min;
double rangePlot = max- min;
for (int i = 0; i < x.length; i++) {
if (gY!=null){
x[i] = (int) (((gY[i] - minPlot) / rangePlot) * profileSize);
}
p[i] = (int) (((pY[i] - minPlot) / rangePlot) * profileSize);
}
hgaussian = new Overlays.Polyline(penFit, x, y);
hprofile = new Overlays.Polyline(renderer.getPenProfile(), p, y);
}
xMean = ((Camtool)camera).gaussCenterX.read();
yMean = ((Camtool)camera).gaussCenterY.read();
@@ -963,7 +978,7 @@ public class ScreenPanel extends Panel {
}
return fit;
}
/*
public class Camtool extends ArraySource {
final String prefix;
@@ -992,6 +1007,10 @@ public class ScreenPanel extends Panel {
}
public Camtool(String name, String prefix, boolean latch) {
this(name, prefix, false, false);
}
public Camtool(String name, String prefix, boolean latch, boolean gr) {
super(name, prefix + (latch ? ":latch" : ":pipeline") + ".roi.output");
this.prefix = prefix + ":";
this.latch = latch;
@@ -1001,8 +1020,6 @@ public class ScreenPanel extends Panel {
channelLatch = new ChannelInteger(name + " latch", this.prefix + "latch.capture");
channelTimestamp = new ChannelDouble(name + " timestamp", dataPrefix + "timestamp");
channelTimestamp.setMonitored(true);
posX = new ChannelDouble(name + " com x", dataPrefix + "x_stats.com_egu");
posY = new ChannelDouble(name + " com y", dataPrefix + "y_stats.com_egu");
profileX = new ChannelDoubleArray(name + " profile x", dataPrefix + "profile.x");
profileY = new ChannelDoubleArray(name + " profile y", dataPrefix + "profile.y");
shape = new ChannelIntegerArray(name + " shape", dataPrefix + ("roi.output.shape"));
@@ -1017,12 +1034,16 @@ public class ScreenPanel extends Panel {
calScaleX = new ChannelDouble(name + " cal scale x", this.prefix + "pipeline.egu.eslo_x");
calScaleY = new ChannelDouble(name + " cal scale y", this.prefix + "pipeline.egu.eslo_y");
gaussX = new ChannelDoubleArray(name + " gauss x", dataPrefix + ("x_stats.gauss"));
gaussY = new ChannelDoubleArray(name + " gauss y", dataPrefix + ("y_stats.gauss"));
gaussCenterX = new ChannelDouble(name + "gauss center x", dataPrefix + "x_stats.g_center_egu");
gaussCenterY = new ChannelDouble(name + "gauss center y", dataPrefix + "y_stats.g_center_egu");
gaussStdDivX = new ChannelDouble(name + "gauss stddiv x", dataPrefix + "x_stats.g_stddiv_egu");
gaussStdDivY = new ChannelDouble(name + "gauss stddiv t", dataPrefix + "y_stats.g_stddiv_egu");
String x_stats = dataPrefix + "x_stats" + (gr ? "_gr": "")+ ".";
String y_stats = dataPrefix + "y_stats" + (gr ? "_gr": "")+ ".";
posX = new ChannelDouble(name + " com x", x_stats + "com_egu");
posY = new ChannelDouble(name + " com y", y_stats + "com_egu");
gaussX = new ChannelDoubleArray(name + " gauss x", x_stats+ "gauss");
gaussY = new ChannelDoubleArray(name + " gauss y", y_stats+ "gauss");
gaussCenterX = new ChannelDouble(name + "gauss center x", x_stats+ "g_center_egu");
gaussCenterY = new ChannelDouble(name + "gauss center y", y_stats+ "g_center_egu");
gaussStdDivX = new ChannelDouble(name + "gauss stddiv x", x_stats+ "g_stddiv_egu");
gaussStdDivY = new ChannelDouble(name + "gauss stddiv t", y_stats+ "g_stddiv_egu");
}
@Override
@@ -1031,16 +1052,17 @@ public class ScreenPanel extends Panel {
getDevice().setMonitored(value);
}
void safeInitialize(Device dev, int timeout) throws IOException, InterruptedException {
for (int retries = 0; retries < 10; retries++) {
void safeInitialize(Device dev, int retries) throws IOException, InterruptedException {
for (int i = 0; i < retries; i++) {
try {
dev.initialize();
break;
} catch (IOException ex) {
if (retries == 9) {
if (i == (retries-1)) {
throw ex;
}
Thread.sleep(timeout / 10);
System.out.println("Failed initializing " + dev.getName() + ". Retrying");
Thread.sleep(1);
}
}
}
@@ -1048,38 +1070,40 @@ public class ScreenPanel extends Panel {
@Override
protected void doInitialize() throws IOException, InterruptedException {
try {
channelRun.initialize();
channelLatch.initialize();
System.out.println("Started initialization");
int retries = 5;
safeInitialize(channelTimestamp, retries);
safeInitialize(channelTimestamp, retries);
if (latch) {
start();
latch();
}
safeInitialize(channelTimestamp, 2000);
posX.initialize();
posY.initialize();
profileX.initialize();
profileY.initialize();
shape.initialize();
roiEnabled.initialize();
roi.initialize();
origin.initialize();
bgEnable.initialize();
bgCapture.initialize();
bgCaptureRemain.initialize();
}
safeInitialize(channelTimestamp, retries);
safeInitialize(posX, retries);
safeInitialize(posY, retries);
safeInitialize(profileX, retries);
safeInitialize(profileY, retries);
safeInitialize(shape, retries);
safeInitialize(roiEnabled, retries);
safeInitialize(roi, retries);
safeInitialize(origin, retries);
safeInitialize(bgEnable, retries);
safeInitialize(bgCapture, retries);
safeInitialize(bgCaptureRemain, retries);
try {
calOffX.initialize();
calOffY.initialize();
calScaleX.initialize();
calScaleY.initialize();
safeInitialize(calOffX, retries);
safeInitialize(calOffY, retries);
safeInitialize(calScaleX, retries);
safeInitialize(calScaleY, retries);
} catch (Exception ex) {
ex.printStackTrace();
}
gaussX.initialize();
gaussY.initialize();
gaussCenterX.initialize();
gaussCenterY.initialize();
gaussStdDivX.initialize();
gaussStdDivY.initialize();
safeInitialize(gaussX, retries);
safeInitialize(gaussY, retries);
safeInitialize(gaussCenterX, retries);
safeInitialize(gaussCenterY, retries);
safeInitialize(gaussStdDivX, retries);
safeInitialize(gaussStdDivY, retries);
int[] s = shape.read();
getConfig().imageHeight = s[0];
@@ -1209,7 +1233,7 @@ public class ScreenPanel extends Panel {
}
}
}
*/
void setHistogramVisible(boolean value) {
if (value) {