/* * 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 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 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((Integer)getScienta("getPassEnergy")); } 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 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 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); } 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") // //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[] { "2", "5", "10", "20", "50", "100", "200" })); comboPass.setSelectedIndex(4); 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() .addGap(0, 0, 0) .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()) ); }// //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 }