891 lines
44 KiB
Java
891 lines
44 KiB
Java
/*
|
|
* Copyright (c) 2014 Paul Scherrer Institute. All rights reserved.
|
|
*/
|
|
|
|
import ch.psi.pshell.core.Context;
|
|
import ch.psi.pshell.device.Device;
|
|
import ch.psi.pshell.device.DeviceAdapter;
|
|
import ch.psi.pshell.device.DeviceListener;
|
|
import ch.psi.pshell.device.Writable;
|
|
import ch.psi.pshell.epics.AreaDetector;
|
|
import ch.psi.pshell.plot.LinePlotSeries;
|
|
import ch.psi.pshell.plot.RangeSelectionPlot.RangeSelection;
|
|
import ch.psi.pshell.ui.Panel;
|
|
import ch.psi.utils.Convert;
|
|
import ch.psi.utils.IO;
|
|
import ch.psi.utils.Serializer;
|
|
import ch.psi.utils.State;
|
|
import ch.psi.utils.swing.SwingUtils;
|
|
import ch.psi.pshell.swing.ValueSelection;
|
|
import ch.psi.pshell.swing.ValueSelection.ValueSelectionListener;
|
|
import ch.psi.pshell.ui.ScriptProcessor;
|
|
import java.awt.Component;
|
|
import java.io.File;
|
|
import java.lang.reflect.Method;
|
|
import java.nio.file.Files;
|
|
import java.time.LocalTime;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
import javax.swing.JCheckBox;
|
|
import javax.swing.JComboBox;
|
|
import javax.swing.JFileChooser;
|
|
import javax.swing.JToggleButton;
|
|
import javax.swing.SwingUtilities;
|
|
import javax.swing.event.TableModelEvent;
|
|
import javax.swing.event.TableModelListener;
|
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
|
import javax.swing.table.DefaultTableModel;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public class XPSSpectrum extends ScriptProcessor {
|
|
|
|
boolean detailedScan;
|
|
boolean running;
|
|
AreaDetector scienta;
|
|
SwingUtils.TableChangeListener tableChangeListener;
|
|
|
|
boolean showMiddle = false;
|
|
int indexTime = showMiddle? 3 :2;
|
|
int indexSize = showMiddle? 4 :3;
|
|
int indexIter = showMiddle? 5 :4;
|
|
int indexEph = showMiddle? 6 :5;
|
|
|
|
public XPSSpectrum() {
|
|
initComponents();
|
|
rangeSelectionPanel.setOverlapAllowed(true);
|
|
rangeSelectionPanel.setDuplicateAllowed(true);
|
|
rangeSelectionPanel.setShowMiddle(showMiddle);
|
|
buttonSkip.setVisible(false);
|
|
rangeSelectionPanel.setAditionalColumns(new String[]{"Time", "Size", "Iter", "Eph", "Name"}, new Class[]{Double.class, Double.class, Integer.class, Double.class, String.class});
|
|
final DefaultTableModel model = (DefaultTableModel) rangeSelectionPanel.getTable().getModel();
|
|
model.addTableModelListener(new TableModelListener() {
|
|
@Override
|
|
public void tableChanged(TableModelEvent e) {
|
|
if (e.getType() == TableModelEvent.INSERT) {
|
|
final int row = e.getFirstRow();
|
|
final int col = e.getColumn();
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
if (col<model.getColumnCount()){
|
|
if (row > 0) {
|
|
for (int col = indexTime; col <=indexEph; col++) {
|
|
model.setValueAt(model.getValueAt(row - 1, col), row, col);
|
|
}
|
|
} else if (row == 0) {
|
|
model.setValueAt(valueTime.getValue(), row, indexTime);
|
|
model.setValueAt(valueSize.getValue(), row, indexSize);
|
|
model.setValueAt((int) valueIterations.getValue(), row, indexIter);
|
|
model.setValueAt(Double.NaN, row, indexEph);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
//Component persistence
|
|
ArrayList<Component> persistedComponents = new ArrayList<>();
|
|
persistedComponents.addAll(Arrays.asList(SwingUtils.getComponentsByType(this, JToggleButton.class)));
|
|
persistedComponents.addAll(Arrays.asList(SwingUtils.getComponentsByType(this, ValueSelection.class)));
|
|
persistedComponents.addAll(Arrays.asList(SwingUtils.getComponentsByType(this, JComboBox.class)));
|
|
setPersistedComponents(persistedComponents.toArray(new Component[0]));
|
|
|
|
ValueSelectionListener listener = new ValueSelectionListener() {
|
|
@Override
|
|
public void onValueChanged(ValueSelection origin, double value, boolean editing) {
|
|
try{
|
|
if (editing){
|
|
if (scienta!=null){
|
|
if (origin == valueLow){
|
|
((Writable)scienta.getChild(scienta.getName() + " low energy")).write(value);
|
|
} else if (origin == valueHigh){
|
|
((Writable)scienta.getChild(scienta.getName() + " high energy")).write(value);
|
|
} else if (origin == valueTime){
|
|
((Writable)scienta.getChild(scienta.getName() + " exposure time")).write(value);
|
|
} else if (origin == valueSize){
|
|
((Writable)scienta.getChild(scienta.getName() + " step size")).write(value);
|
|
}
|
|
}
|
|
}
|
|
} catch (Exception ex){
|
|
getLogger().log(Level.WARNING, null, ex);
|
|
}
|
|
}
|
|
};
|
|
|
|
valueLow.addListener(listener);
|
|
valueHigh.addListener(listener);
|
|
valueTime.addListener(listener);
|
|
valueSize.addListener(listener);
|
|
|
|
|
|
tableChangeListener = new SwingUtils.TableChangeListener(rangeSelectionPanel.getTable()) {
|
|
@Override
|
|
protected void onTableChange(int row, int column, Object value, Object former) {
|
|
if ((checkCIS.isSelected()) && (column == indexEph)){
|
|
try{
|
|
if (!isDefined (value)){
|
|
value = XPSSpectrum.this.getDevice("Eph").take();
|
|
}
|
|
if (!isDefined (former)){
|
|
former = XPSSpectrum.this.getDevice("Eph").take();
|
|
}
|
|
if (isDefined (value) && isDefined (former) && (!value.equals(former))){
|
|
double offset = ((Double)value) - ((Double)former);
|
|
Double lower = (Double) model.getValueAt(row, 0);
|
|
Double upper = (Double) model.getValueAt(row, indexTime-1);
|
|
if ( isDefined (lower) && isDefined (upper)){
|
|
model.setValueAt(lower + offset, row, 0);
|
|
model.setValueAt(upper + offset, row, indexTime-1);
|
|
RangeSelection range = rangeSelectionPanel.getPlotRange(lower, null, upper);
|
|
if (range!=null){
|
|
rangeSelectionPanel.getPlot().updateRange(range, lower + offset, upper + offset);
|
|
}
|
|
}
|
|
}
|
|
} catch (Exception ex) {
|
|
showException(ex);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
boolean isDefined(Object value){
|
|
return (value != null) && (value instanceof Double) && !(((Double)value).isNaN());
|
|
}
|
|
|
|
@Override
|
|
public void onInitialize(int runCount) {
|
|
scienta = (AreaDetector) getDevice("Scienta");
|
|
|
|
try {
|
|
if (scienta.getChild(scienta.getName() + " current step")!=null){
|
|
scienta.getChild(scienta.getName() + " current step").addListener(progressListener);
|
|
scienta.getChild(scienta.getName() + " total steps").addListener(progressListener);
|
|
} else {
|
|
scienta.getChild(scienta.getName() + " current channel").addListener(progressListener);
|
|
scienta.getChild(scienta.getName() + " total points").addListener(progressListener);
|
|
}
|
|
dvpAcqTime.setDevice((Device)getScienta("getAcquisitionTime"));
|
|
comboPass.setSelectedItem(getScienta("getPassEnergy").toString());
|
|
} catch (Exception ex) {
|
|
Logger.getLogger(XPSSpectrum.class.getName()).log(Level.SEVERE, null, ex);
|
|
}
|
|
startTimer(500, 100);
|
|
manualInitPlotData();
|
|
}
|
|
|
|
void manualInitPlotData(){
|
|
//Setting data so cam define ranges for detailed without initial
|
|
LinePlotSeries series = new LinePlotSeries("Data");
|
|
rangeSelectionPanel.setSeries(series);
|
|
series.setData(new double[]{valueLow.getValue(), valueHigh.getValue()}, new double[]{Double.NaN,Double.NaN});
|
|
}
|
|
|
|
@Override
|
|
public void onStateChange(State state, State former) {
|
|
setEnabled(state == State.Ready);
|
|
if (!state.isProcessing()) {
|
|
buttonSkip.setVisible(false);
|
|
if (running) {
|
|
//stopTimer();
|
|
running = false;
|
|
getView().getStatusBar().setProgress(-1);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onExecutedFile(String fileName, Object result) {
|
|
String script = IO.getPrefix(fileName);
|
|
if (script != null) {
|
|
switch (script) {
|
|
case "XPSSpectrum":
|
|
if (result instanceof Exception) {
|
|
//SwingUtils.showMessage(getComponent(), "Error in " + fileName, exception.getMessage());
|
|
if (detailedScan) {
|
|
|
|
} else {
|
|
manualInitPlotData();
|
|
}
|
|
} else {
|
|
if (detailedScan) {
|
|
|
|
} else {
|
|
Object[] ret = (Object[]) ((Object[]) result)[0];
|
|
if (ret.length > 0) {
|
|
double[] xdata = (double[]) Convert.toPrimitiveArray(ret[0], Double.class);
|
|
double[] ydata = (double[]) Convert.toPrimitiveArray(ret[1], Double.class);
|
|
|
|
//double[] xdata = (double[]) ret[0];
|
|
//double[] ydata = (double[]) ret[1];
|
|
|
|
//double[] data = new double[]{1.0,1.0,1.0,1.0,1.0};
|
|
LinePlotSeries series = new LinePlotSeries("Data");
|
|
rangeSelectionPanel.setSeries(series);
|
|
series.setData(xdata, ydata);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
detailedScan = false;
|
|
updateButtons();
|
|
}
|
|
|
|
@Override
|
|
public void setEnabled(boolean value) {
|
|
super.setEnabled(value);
|
|
rangeSelectionPanel.setEnabled(value);
|
|
valueLow.setEnabled(value);
|
|
valueHigh.setEnabled(value);
|
|
valueTime.setEnabled(value);
|
|
valueSize.setEnabled(value);
|
|
valueIterations.setEnabled(value);
|
|
comboPass.setEnabled(value);
|
|
checkEndScan.setEnabled(value);
|
|
checkSaveImage.setEnabled(value);
|
|
updateButtons();
|
|
}
|
|
|
|
void updateButtons() {
|
|
buttonStart.setEnabled(isEnabled());
|
|
radioInitial.setEnabled(isEnabled());
|
|
radioDetailed.setEnabled(isEnabled() && rangeSelectionPanel.getPlot().getSelectedRanges().length > 0);
|
|
if (!radioDetailed.isEnabled()){
|
|
radioInitial.setSelected(true);
|
|
}
|
|
btLoad.setEnabled(isEnabled());
|
|
btSave.setEnabled(radioDetailed.isEnabled());
|
|
}
|
|
|
|
DeviceListener progressListener = new DeviceAdapter() {
|
|
|
|
@Override
|
|
public void onValueChanged(Device device, Object o, Object o1) {
|
|
if (running) {
|
|
try {
|
|
getView().getStatusBar().setProgress((Double)getScienta("getProgress"));
|
|
} catch (Exception ex) {
|
|
Logger.getLogger(XPSSpectrum.class.getName()).log(Level.WARNING, null, ex);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
public final String CURRERNT_RANGE_VAR = "cur_range";
|
|
public final String CURRERNT_ITERATION_VAR = "cur_iteration";
|
|
int currentScanIndex;
|
|
RangeSelection[] scanRanges;
|
|
|
|
@Override
|
|
protected void onTimer() {
|
|
try {
|
|
if (running) {
|
|
Object index = XPSSpectrum.this.eval(CURRERNT_RANGE_VAR, true);
|
|
if ((index != null) && (index instanceof Integer) && ((Integer) index >= 0)) {
|
|
int scanIndex = (Integer) index;
|
|
if (scanIndex != currentScanIndex) {
|
|
buttonSkip.setEnabled(true);
|
|
}
|
|
currentScanIndex = scanIndex;
|
|
|
|
int current_iteration = (Integer) XPSSpectrum.this.eval(CURRERNT_ITERATION_VAR, true);
|
|
int iterations = (Integer) scanRanges[currentScanIndex].getVars()[2];
|
|
|
|
buttonSkip.setVisible((iterations > 1) && (current_iteration < (iterations - 1)));
|
|
|
|
if (detailedScan) {
|
|
RangeSelection range = rangeSelectionPanel.getRanges()[scanIndex];
|
|
for (int row = 0; row < rangeSelectionPanel.getTable().getRowCount(); row++) {
|
|
if (range.equals((Double) rangeSelectionPanel.getTable().getValueAt(row, 0), (Double) rangeSelectionPanel.getTable().getValueAt(row, 2))) {
|
|
rangeSelectionPanel.getTable().setRowSelectionInterval(row, row);
|
|
break;
|
|
}
|
|
if (row == (rangeSelectionPanel.getTable().getRowCount() - 1)) {
|
|
rangeSelectionPanel.getTable().clearSelection();
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
rangeSelectionPanel.getTable().clearSelection();
|
|
}
|
|
} else {
|
|
try{
|
|
int steps = 0;
|
|
RangeSelection[] r = rangeSelectionPanel.getRanges();
|
|
if ((radioDetailed.isEnabled()) && (r.length > 0)) {
|
|
for (int i = 0; i < r.length; i++) {
|
|
int iterations = (Integer) r[i].getVars()[2];
|
|
steps += iterations;
|
|
}
|
|
} else {
|
|
steps = Math.max(1, (int) valueIterations.getValue());
|
|
}
|
|
int seconds = (int) (Double.valueOf(dvpAcqTime.getLabel().getText()) * steps);
|
|
int hours = seconds / (60 * 60);
|
|
textTotalTime.setText(hours >= 24 ? hours + "h" : LocalTime.ofSecondOfDay(seconds).toString());
|
|
} catch (Exception ex) {
|
|
textTotalTime.setText("");
|
|
}
|
|
}
|
|
} catch (Exception ex) {
|
|
getLogger().log(Level.FINE, null, ex);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getScript() {
|
|
return "XPSSpectrum";
|
|
}
|
|
|
|
@Override
|
|
public Map<String, Object> getArgs() {
|
|
if (radioInitial.isSelected()){
|
|
RangeSelection initialRange = new RangeSelection(valueLow.getValue(), valueHigh.getValue());
|
|
int iterations = (int) valueIterations.getValue();
|
|
initialRange.setVars(new Object[]{valueTime.getValue(), valueSize.getValue(), iterations, Double.NaN});
|
|
scanRanges = new RangeSelection[]{initialRange};
|
|
rangeSelectionPanel.clear(); //TODO: should be done in execute?
|
|
} else {
|
|
scanRanges = rangeSelectionPanel.getRanges();
|
|
}
|
|
detailedScan = !radioInitial.isSelected();
|
|
|
|
HashMap<String, Object> args = new HashMap<>();
|
|
args.put("DETAILED", !detailedScan);
|
|
args.put("ranges", scanRanges);
|
|
args.put("pass_energy", Integer.valueOf(comboPass.getSelectedItem().toString()));
|
|
args.put("save_scienta_image", checkSaveImage.isSelected());
|
|
args.put("ENDSCAN", checkEndScan.isSelected());
|
|
return args;
|
|
}
|
|
|
|
@Override
|
|
public void execute() throws Exception {
|
|
currentScanIndex = -1;
|
|
super.execute();
|
|
running = true;
|
|
}
|
|
|
|
Object getScienta(String method) throws Exception{
|
|
Method m = scienta.getClass().getMethod(method, new Class[0]);
|
|
return m.invoke(scienta, new Object[0]);
|
|
}
|
|
|
|
void setScienta(String method, Object obj) throws Exception{
|
|
Method m = scienta.getClass().getMethod(method, new Class[]{obj.getClass()});
|
|
m.invoke(scienta, new Object[]{obj});
|
|
}
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
private void initComponents() {
|
|
|
|
buttonGroup1 = new javax.swing.ButtonGroup();
|
|
panelArguments = new javax.swing.JPanel();
|
|
jLabel1 = new javax.swing.JLabel();
|
|
valueIterations = new ch.psi.pshell.swing.ValueSelection();
|
|
jLabel9 = new javax.swing.JLabel();
|
|
valueTime = new ch.psi.pshell.swing.ValueSelection();
|
|
comboPass = new javax.swing.JComboBox();
|
|
valueSize = new ch.psi.pshell.swing.ValueSelection();
|
|
jLabel11 = new javax.swing.JLabel();
|
|
valueLow = new ch.psi.pshell.swing.ValueSelection();
|
|
jLabel2 = new javax.swing.JLabel();
|
|
valueHigh = new ch.psi.pshell.swing.ValueSelection();
|
|
jLabel8 = new javax.swing.JLabel();
|
|
jLabel17 = new javax.swing.JLabel();
|
|
buttonScientaSetup = new javax.swing.JButton();
|
|
checkEndScan = new javax.swing.JCheckBox();
|
|
checkSaveImage = new javax.swing.JCheckBox();
|
|
textTotalTime = new javax.swing.JLabel();
|
|
dvpAcqTime = new ch.psi.pshell.swing.DeviceValuePanel();
|
|
labelAcqTime = new javax.swing.JLabel();
|
|
labelTotalTime = new javax.swing.JLabel();
|
|
jPanel2 = new javax.swing.JPanel();
|
|
btLoad = new javax.swing.JButton();
|
|
btSave = new javax.swing.JButton();
|
|
buttonStart = new javax.swing.JButton();
|
|
rangeSelectionPanel = new ch.psi.pshell.swing.RangeSelectionPanel() {
|
|
protected void onSeriesChanged() {
|
|
updateButtons();
|
|
}
|
|
protected void onSelectionChanged() {
|
|
updateButtons();
|
|
}
|
|
}
|
|
;
|
|
buttonAbort = new javax.swing.JButton();
|
|
buttonSkip = new javax.swing.JButton();
|
|
checkCIS = new javax.swing.JCheckBox();
|
|
radioInitial = new javax.swing.JRadioButton();
|
|
radioDetailed = new javax.swing.JRadioButton();
|
|
|
|
panelArguments.setBorder(javax.swing.BorderFactory.createTitledBorder("Arguments"));
|
|
|
|
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel1.setText("Low:");
|
|
|
|
valueIterations.setDecimals(0);
|
|
valueIterations.setMaxValue(1000.0);
|
|
valueIterations.setMinValue(0.0);
|
|
valueIterations.setShowButtons(false);
|
|
valueIterations.setValue(1.0);
|
|
|
|
jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel9.setText("Size:");
|
|
|
|
valueTime.setDecimals(3);
|
|
valueTime.setMaxValue(1000.0);
|
|
valueTime.setMinValue(0.0);
|
|
valueTime.setShowButtons(false);
|
|
valueTime.setValue(1.0);
|
|
|
|
comboPass.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1", "2", "5", "10", "20", "50", "100", "200" }));
|
|
comboPass.setToolTipText("");
|
|
comboPass.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
comboPassActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
valueSize.setDecimals(3);
|
|
valueSize.setMaxValue(1000.0);
|
|
valueSize.setMinValue(0.0);
|
|
valueSize.setShowButtons(false);
|
|
valueSize.setValue(1.0);
|
|
|
|
jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel11.setText("Pass:");
|
|
|
|
valueLow.setDecimals(3);
|
|
valueLow.setMaxValue(2000.0);
|
|
valueLow.setMinValue(0.0);
|
|
valueLow.setShowButtons(false);
|
|
valueLow.setValue(0.0);
|
|
|
|
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel2.setText("High:");
|
|
|
|
valueHigh.setDecimals(3);
|
|
valueHigh.setMaxValue(2000.0);
|
|
valueHigh.setMinValue(0.0);
|
|
valueHigh.setShowButtons(false);
|
|
valueHigh.setValue(100.0);
|
|
|
|
jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel8.setText("Time:");
|
|
|
|
jLabel17.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel17.setText("Iter:");
|
|
|
|
buttonScientaSetup.setText("Scienta Setup");
|
|
buttonScientaSetup.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonScientaSetupActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
checkEndScan.setText("Turn off beam at end");
|
|
|
|
checkSaveImage.setText("Save Scienta image");
|
|
|
|
textTotalTime.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
|
|
textTotalTime.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
|
|
|
|
labelAcqTime.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
labelAcqTime.setText("Acquisition time(s):");
|
|
|
|
labelTotalTime.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
labelTotalTime.setText("Total time:");
|
|
|
|
javax.swing.GroupLayout panelArgumentsLayout = new javax.swing.GroupLayout(panelArguments);
|
|
panelArguments.setLayout(panelArgumentsLayout);
|
|
panelArgumentsLayout.setHorizontalGroup(
|
|
panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(panelArgumentsLayout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(buttonScientaSetup, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelArgumentsLayout.createSequentialGroup()
|
|
.addGap(0, 0, Short.MAX_VALUE)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(labelAcqTime)
|
|
.addComponent(labelTotalTime))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(textTotalTime, javax.swing.GroupLayout.Alignment.TRAILING)
|
|
.addComponent(dvpAcqTime, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
.addGroup(panelArgumentsLayout.createSequentialGroup()
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(checkEndScan)
|
|
.addComponent(checkSaveImage)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelArgumentsLayout.createSequentialGroup()
|
|
.addComponent(jLabel11)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(comboPass, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelArgumentsLayout.createSequentialGroup()
|
|
.addComponent(jLabel17)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(valueIterations, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelArgumentsLayout.createSequentialGroup()
|
|
.addComponent(jLabel9)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(valueSize, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelArgumentsLayout.createSequentialGroup()
|
|
.addComponent(jLabel8)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(valueTime, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelArgumentsLayout.createSequentialGroup()
|
|
.addComponent(jLabel2)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(valueHigh, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelArgumentsLayout.createSequentialGroup()
|
|
.addComponent(jLabel1)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(valueLow, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))))
|
|
.addGap(0, 0, Short.MAX_VALUE)))
|
|
.addContainerGap())
|
|
);
|
|
|
|
panelArgumentsLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel11, jLabel17, jLabel2, jLabel8, jLabel9});
|
|
|
|
panelArgumentsLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {dvpAcqTime, textTotalTime});
|
|
|
|
panelArgumentsLayout.setVerticalGroup(
|
|
panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(panelArgumentsLayout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
|
|
.addComponent(valueLow, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(jLabel1))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
|
|
.addComponent(jLabel2)
|
|
.addComponent(valueHigh, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(jLabel8)
|
|
.addComponent(valueTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(jLabel9)
|
|
.addComponent(valueSize, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(jLabel17)
|
|
.addComponent(valueIterations, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGap(18, 18, 18)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
|
|
.addComponent(jLabel11)
|
|
.addComponent(comboPass, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 32, Short.MAX_VALUE)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
|
|
.addComponent(labelAcqTime)
|
|
.addComponent(dvpAcqTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(panelArgumentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
|
|
.addComponent(textTotalTime)
|
|
.addComponent(labelTotalTime))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 32, Short.MAX_VALUE)
|
|
.addComponent(checkEndScan)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(checkSaveImage)
|
|
.addGap(18, 18, 18)
|
|
.addComponent(buttonScientaSetup)
|
|
.addGap(26, 26, 26))
|
|
);
|
|
|
|
panelArgumentsLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {dvpAcqTime, textTotalTime});
|
|
|
|
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Scan Control"));
|
|
|
|
btLoad.setText("Load");
|
|
btLoad.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btLoadActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
btSave.setText("Save");
|
|
btSave.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
btSaveActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
buttonStart.setText("Start");
|
|
buttonStart.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonStartActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
rangeSelectionPanel.setTablePosition(ch.psi.pshell.swing.RangeSelectionPanel.TablePosition.bottom);
|
|
|
|
buttonAbort.setText("Abort");
|
|
buttonAbort.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonAbortActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
buttonSkip.setText("Skip");
|
|
buttonSkip.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonSkipActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
checkCIS.setText("Constant Initial State");
|
|
|
|
buttonGroup1.add(radioInitial);
|
|
radioInitial.setSelected(true);
|
|
radioInitial.setText("Initial Scan");
|
|
|
|
buttonGroup1.add(radioDetailed);
|
|
radioDetailed.setText("Detailed");
|
|
|
|
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
|
|
jPanel2.setLayout(jPanel2Layout);
|
|
jPanel2Layout.setHorizontalGroup(
|
|
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel2Layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
.addGroup(jPanel2Layout.createSequentialGroup()
|
|
.addGap(0, 0, Short.MAX_VALUE)
|
|
.addComponent(btLoad)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(btSave))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel2Layout.createSequentialGroup()
|
|
.addComponent(radioInitial)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(radioDetailed)
|
|
.addGap(18, 18, 18)
|
|
.addComponent(checkCIS)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 70, Short.MAX_VALUE)
|
|
.addComponent(buttonStart, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(buttonSkip)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(buttonAbort))
|
|
.addComponent(rangeSelectionPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addContainerGap())
|
|
);
|
|
|
|
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btLoad, btSave, buttonAbort, buttonSkip, buttonStart});
|
|
|
|
jPanel2Layout.setVerticalGroup(
|
|
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel2Layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(buttonStart)
|
|
.addComponent(buttonAbort)
|
|
.addComponent(buttonSkip)
|
|
.addComponent(checkCIS)
|
|
.addComponent(radioInitial)
|
|
.addComponent(radioDetailed))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(rangeSelectionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(btLoad, javax.swing.GroupLayout.Alignment.TRAILING)
|
|
.addComponent(btSave, javax.swing.GroupLayout.Alignment.TRAILING))
|
|
.addContainerGap())
|
|
);
|
|
|
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
|
this.setLayout(layout);
|
|
layout.setHorizontalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addComponent(panelArguments, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addContainerGap())
|
|
);
|
|
layout.setVerticalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(panelArguments, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
.addContainerGap())
|
|
);
|
|
}// </editor-fold>//GEN-END:initComponents
|
|
|
|
private void buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed
|
|
try {
|
|
abort();
|
|
if (scienta!=null){
|
|
scienta.stop();
|
|
}
|
|
} catch (Exception ex) {
|
|
showException(ex);
|
|
}
|
|
}//GEN-LAST:event_buttonAbortActionPerformed
|
|
|
|
private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartActionPerformed
|
|
try {
|
|
execute();
|
|
} catch (Exception ex) {
|
|
showException(ex);
|
|
}
|
|
|
|
}//GEN-LAST:event_buttonStartActionPerformed
|
|
|
|
private void btSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSaveActionPerformed
|
|
try {
|
|
JFileChooser chooser = new JFileChooser(getContext().getSetup().getContextPath());
|
|
FileNameExtensionFilter filter = new FileNameExtensionFilter("XPS Spectrum scan definition file", "xps");
|
|
chooser.setFileFilter(filter);
|
|
int rVal = chooser.showSaveDialog(this);
|
|
if (rVal == JFileChooser.APPROVE_OPTION) {
|
|
File f = chooser.getSelectedFile();
|
|
if (IO.getExtension(f).isEmpty()) {
|
|
f = new File(f.getPath() + ".xps");
|
|
}
|
|
Object[] obj = new Object[]{SwingUtils.getTableData(rangeSelectionPanel.getTable()),
|
|
rangeSelectionPanel.getPlot().getSeries(0).getX(),
|
|
rangeSelectionPanel.getPlot().getSeries(0).getY()};
|
|
Files.write(f.toPath(), Serializer.encode(obj, Serializer.EncoderType.bin));
|
|
|
|
}
|
|
} catch (Exception ex) {
|
|
showException(ex);
|
|
}
|
|
|
|
}//GEN-LAST:event_btSaveActionPerformed
|
|
|
|
private void btLoadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btLoadActionPerformed
|
|
try {
|
|
JFileChooser chooser = new JFileChooser(getContext().getSetup().getContextPath());
|
|
FileNameExtensionFilter filter = new FileNameExtensionFilter("XPS Spectrum scan definition file", "xps");
|
|
chooser.setFileFilter(filter);
|
|
int rVal = chooser.showOpenDialog(this);
|
|
if (rVal == JFileChooser.APPROVE_OPTION) {
|
|
rangeSelectionPanel.removeAllRanges();
|
|
Object[] obj = (Object[]) Serializer.decode(Files.readAllBytes(chooser.getSelectedFile().toPath()), Serializer.EncoderType.bin);
|
|
Object[][] table = (Object[][]) obj[0];
|
|
if (!rangeSelectionPanel.getPlot().hasData()) {
|
|
double[] x = (double[]) obj[1];
|
|
double[] y = (double[]) obj[2];
|
|
LinePlotSeries series = new LinePlotSeries("Data");
|
|
rangeSelectionPanel.setSeries(series);
|
|
series.setData(x, y);
|
|
}
|
|
int indexUpper;
|
|
int varCols;
|
|
if (table.length>0){
|
|
boolean hasName = (table[0].length > 6) && (table[0][table[0].length-1] instanceof String);
|
|
int size_with_center = hasName?8:7;
|
|
indexUpper = (table[0].length >=size_with_center) ? 2 : 1;
|
|
varCols = table[0].length - indexUpper-1;
|
|
} else {
|
|
indexUpper=1;
|
|
varCols = 0;
|
|
}
|
|
for (Object[] row : table) {
|
|
rangeSelectionPanel.getPlot().addRange((Double) row[0], (Double) row[indexUpper]);
|
|
}
|
|
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
for (int row = 0; row < table.length; row++) {
|
|
for (int col = 0; col < varCols; col++) {
|
|
rangeSelectionPanel.getTable().setValueAt(table[row][col + indexUpper + 1], row, col + indexTime);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
} catch (Exception ex) {
|
|
showException(ex);
|
|
}
|
|
}//GEN-LAST:event_btLoadActionPerformed
|
|
|
|
private void buttonSkipActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSkipActionPerformed
|
|
try {
|
|
this.eval("skip_iteration = True", true);
|
|
buttonSkip.setEnabled(false);
|
|
} catch (Exception ex) {
|
|
showException(ex);
|
|
}
|
|
}//GEN-LAST:event_buttonSkipActionPerformed
|
|
|
|
private void buttonScientaSetupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonScientaSetupActionPerformed
|
|
try {
|
|
showDevicePanel("Scienta");
|
|
} catch (Exception ex) {
|
|
SwingUtils.showException(this, ex);
|
|
}
|
|
}//GEN-LAST:event_buttonScientaSetupActionPerformed
|
|
|
|
private void comboPassActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboPassActionPerformed
|
|
try {
|
|
if (scienta!=null){
|
|
Integer energy = Integer.valueOf(comboPass.getSelectedItem().toString());
|
|
if (!energy.equals(getScienta("getPassEnergy"))){
|
|
setScienta("setPassEnergy", energy);
|
|
}
|
|
}
|
|
} catch (Exception ex) {
|
|
getLogger().log(Level.WARNING, null, ex);
|
|
}
|
|
}//GEN-LAST:event_comboPassActionPerformed
|
|
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
private javax.swing.JButton btLoad;
|
|
private javax.swing.JButton btSave;
|
|
private javax.swing.JButton buttonAbort;
|
|
private javax.swing.ButtonGroup buttonGroup1;
|
|
private javax.swing.JButton buttonScientaSetup;
|
|
private javax.swing.JButton buttonSkip;
|
|
private javax.swing.JButton buttonStart;
|
|
private javax.swing.JCheckBox checkCIS;
|
|
private javax.swing.JCheckBox checkEndScan;
|
|
private javax.swing.JCheckBox checkSaveImage;
|
|
private javax.swing.JComboBox comboPass;
|
|
private ch.psi.pshell.swing.DeviceValuePanel dvpAcqTime;
|
|
private javax.swing.JLabel jLabel1;
|
|
private javax.swing.JLabel jLabel11;
|
|
private javax.swing.JLabel jLabel17;
|
|
private javax.swing.JLabel jLabel2;
|
|
private javax.swing.JLabel jLabel8;
|
|
private javax.swing.JLabel jLabel9;
|
|
private javax.swing.JPanel jPanel2;
|
|
private javax.swing.JLabel labelAcqTime;
|
|
private javax.swing.JLabel labelTotalTime;
|
|
private javax.swing.JPanel panelArguments;
|
|
private javax.swing.JRadioButton radioDetailed;
|
|
private javax.swing.JRadioButton radioInitial;
|
|
private ch.psi.pshell.swing.RangeSelectionPanel rangeSelectionPanel;
|
|
private javax.swing.JLabel textTotalTime;
|
|
private ch.psi.pshell.swing.ValueSelection valueHigh;
|
|
private ch.psi.pshell.swing.ValueSelection valueIterations;
|
|
private ch.psi.pshell.swing.ValueSelection valueLow;
|
|
private ch.psi.pshell.swing.ValueSelection valueSize;
|
|
private ch.psi.pshell.swing.ValueSelection valueTime;
|
|
// End of variables declaration//GEN-END:variables
|
|
}
|