diff --git a/plugins/RegineSpiral.java b/plugins/RegineSpiral.java new file mode 100644 index 0000000..1f7aa9b --- /dev/null +++ b/plugins/RegineSpiral.java @@ -0,0 +1,455 @@ +/* + * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. + */ + + +import ch.psi.pshell.device.Motor; +import ch.psi.pshell.epics.AreaDetector; +import ch.psi.pshell.ui.ScriptProcessor; +import ch.psi.pshell.ui.QueueProcessor; +import ch.psi.utils.Arr; +import ch.psi.utils.Convert; +import ch.psi.utils.State; +import ch.psi.utils.Str; +import ch.psi.utils.swing.SwingUtils; + +import java.awt.Component; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.swing.SpinnerNumberModel; + +/** + * + */ +public class RegineSpiral extends ScriptProcessor { + final String SAMPLE_X = "sample_x"; + final String SAMPLE_Y = "sample_y"; + final String DETECTOR = "ccd"; + final String SCRIPT = "templates/RegineSpiral"; + + public RegineSpiral() { + initComponents(); + motorPanelX.setDeviceName(SAMPLE_X); + motorPanelY.setDeviceName(SAMPLE_Y); + setPersistedComponents(new Component[] { + spinnerCenterX, + spinnerCenterY, + spinnerSettlingTime, + spinnerNPoints, + spinnerRadius, + textExposures, + checkCompression, + checkZigZag + }); + } + + Motor getSampleX(){ + return (Motor) getDevice(SAMPLE_X); + } + + Motor getSampleY(){ + return (Motor) getDevice(SAMPLE_Y); + } + + AreaDetector getDetecor(){ + return (AreaDetector) getDevice(DETECTOR); + } + + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + ((SpinnerNumberModel)spinnerCenterX.getModel()).setMinimum(getSampleX().getMinValue()); + ((SpinnerNumberModel)spinnerCenterX.getModel()).setMaximum(getSampleX().getMaxValue()); + ((SpinnerNumberModel)spinnerCenterY.getModel()).setMinimum(getSampleY().getMinValue()); + ((SpinnerNumberModel)spinnerCenterY.getModel()).setMaximum(getSampleY().getMaxValue()); + setGlobalVar("POSITION_PLOT", plot); + } + + @Override + public void onStateChange(State state, State former) { + setEnabled(isEnabled()); + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + @Override + public void setEnabled(boolean value) { + super.setEnabled(value); + boolean enableControls = (value && (getState() == State.Ready)); + buttonAbort.setEnabled(value && getState().isInitialized()); + buttonStart.setEnabled(enableControls); + for (Component c : panelParameters.getComponents()) { + c.setEnabled(enableControls); + } + motorPanelX.setReadOnly(!enableControls); + motorPanelY.setReadOnly(!enableControls); + } + + + @Override + public String getScript() { + return SCRIPT; + } + + @Override + public Map getArgs(){ + HashMap args = new HashMap<>(); + args.put("DRY_RUN", false); + args.put("CENTER_X", (Double) spinnerCenterX.getValue()); + args.put("CENTER_Y", (Double) spinnerCenterY.getValue()); + args.put("NPOINTS", (Integer) spinnerNPoints.getValue()); + args.put("RADIUS", (Integer) spinnerRadius.getValue()); + args.put("SETTLING_TIME", (Double) spinnerSettlingTime.getValue()); + args.put("ZIGZAG", checkZigZag.isSelected()); + args.put("COMPRESSION", checkCompression.isSelected()); + if (textExposures.getText().isBlank()){ + args.put("EXPOSURES", null); + } else { + String[] tokens = Str.split(textExposures.getText().trim(), new String[]{"|", ";", ",", " "}); + tokens = Arr.removeEquals(tokens, ""); + args.put("EXPOSURES", Arrays.stream(tokens) + .mapToDouble(Double::parseDouble) + .toArray()); + } + return args; + } + + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + buttonGroup2 = new javax.swing.ButtonGroup(); + panelParameters = new javax.swing.JPanel(); + jLabel1 = new javax.swing.JLabel(); + spinnerCenterX = new javax.swing.JSpinner(); + spinnerCenterY = new javax.swing.JSpinner(); + jLabel4 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + spinnerNPoints = new javax.swing.JSpinner(); + spinnerRadius = new javax.swing.JSpinner(); + jLabel6 = new javax.swing.JLabel(); + spinnerSettlingTime = new javax.swing.JSpinner(); + jLabel10 = new javax.swing.JLabel(); + jLabel11 = new javax.swing.JLabel(); + textExposures = new javax.swing.JTextField(); + checkZigZag = new javax.swing.JCheckBox(); + jLabel12 = new javax.swing.JLabel(); + jLabel13 = new javax.swing.JLabel(); + checkCompression = new javax.swing.JCheckBox(); + jPanel3 = new javax.swing.JPanel(); + buttonStart = new javax.swing.JButton(); + buttonAbort = new javax.swing.JButton(); + buttonAddToQueue = new javax.swing.JButton(); + jPanel4 = new javax.swing.JPanel(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + motorPanelX = new ch.psi.pshell.swing.MotorReadoutPanel(); + motorPanelY = new ch.psi.pshell.swing.MotorReadoutPanel(); + plot = new ch.psi.pshell.plot.LinePlotJFree(); + + panelParameters.setBorder(javax.swing.BorderFactory.createTitledBorder("Parameters")); + + jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel1.setText("Center X (um):"); + + spinnerCenterX.setModel(new javax.swing.SpinnerNumberModel(0.0d, 0.0d, 100.0d, 1.0d)); + + spinnerCenterY.setModel(new javax.swing.SpinnerNumberModel(0.0d, 0.0d, 100.0d, 1.0d)); + + jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel4.setText("Center Y (um):"); + + jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel5.setText("Number of points:"); + + spinnerNPoints.setModel(new javax.swing.SpinnerNumberModel(10, 0, 100000, 1)); + + spinnerRadius.setModel(new javax.swing.SpinnerNumberModel(10, 0, 100000, 1)); + + jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel6.setText("Radius (um):"); + + spinnerSettlingTime.setModel(new javax.swing.SpinnerNumberModel(0.1d, 0.0d, 10.0d, 1.0d)); + + jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel10.setText("Settling Time (s):"); + + jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel11.setText("Exposures(s):"); + + checkZigZag.setSelected(true); + + jLabel12.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel12.setText("ZigZag:"); + + jLabel13.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel13.setText("Compression:"); + + javax.swing.GroupLayout panelParametersLayout = new javax.swing.GroupLayout(panelParameters); + panelParameters.setLayout(panelParametersLayout); + panelParametersLayout.setHorizontalGroup( + panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelParametersLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelParametersLayout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerCenterX)) + .addGroup(panelParametersLayout.createSequentialGroup() + .addComponent(jLabel4) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerCenterY)) + .addGroup(panelParametersLayout.createSequentialGroup() + .addComponent(jLabel5) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerNPoints)) + .addGroup(panelParametersLayout.createSequentialGroup() + .addComponent(jLabel6) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerRadius)) + .addGroup(panelParametersLayout.createSequentialGroup() + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel10) + .addComponent(jLabel11) + .addComponent(jLabel12) + .addComponent(jLabel13)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(spinnerSettlingTime) + .addComponent(textExposures) + .addGroup(panelParametersLayout.createSequentialGroup() + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(checkZigZag) + .addComponent(checkCompression)) + .addGap(0, 0, Short.MAX_VALUE))))) + .addContainerGap()) + ); + + panelParametersLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel10, jLabel11, jLabel12, jLabel13, jLabel4, jLabel5, jLabel6}); + + panelParametersLayout.setVerticalGroup( + panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelParametersLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(spinnerCenterX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel4) + .addComponent(spinnerCenterY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel5) + .addComponent(spinnerNPoints, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel6) + .addComponent(spinnerRadius, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(93, 93, 93) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel10) + .addComponent(spinnerSettlingTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel11) + .addComponent(textExposures, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(checkZigZag) + .addComponent(jLabel12)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(checkCompression) + .addComponent(jLabel13)) + .addContainerGap(98, Short.MAX_VALUE)) + ); + + jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Scan Control")); + + buttonStart.setText("Start"); + buttonStart.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonStartActionPerformed(evt); + } + }); + + buttonAbort.setText("Abort"); + buttonAbort.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonAbortActionPerformed(evt); + } + }); + + buttonAddToQueue.setText("Add To Queue"); + buttonAddToQueue.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonAddToQueueActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(buttonStart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonAbort, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonAddToQueue, javax.swing.GroupLayout.DEFAULT_SIZE, 206, Short.MAX_VALUE)) + .addContainerGap()) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addComponent(buttonStart) + .addGap(18, 18, 18) + .addComponent(buttonAbort) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonAddToQueue) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Motor Positions")); + + jLabel2.setText("Sample X:"); + + jLabel3.setText("Sample Y:"); + + motorPanelX.setDeviceName("sample_x"); + + motorPanelY.setDeviceName("sample_y"); + + plot.setTitle(""); + + javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); + jPanel4.setLayout(jPanel4Layout); + jPanel4Layout.setHorizontalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(motorPanelY, javax.swing.GroupLayout.DEFAULT_SIZE, 186, Short.MAX_VALUE)) + .addGroup(jPanel4Layout.createSequentialGroup() + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(motorPanelX, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(1, 1, 1)) + .addComponent(plot, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) + .addContainerGap()) + ); + jPanel4Layout.setVerticalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel2) + .addComponent(motorPanelX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel3) + .addComponent(motorPanelY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addComponent(plot, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(panelParameters, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(12, 12, 12) + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelParameters, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + }// //GEN-END:initComponents + + private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartActionPerformed + try { + execute(); + } catch (Exception ex) { + SwingUtils.showException(this, ex); + } + }//GEN-LAST:event_buttonStartActionPerformed + + private void buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed + try { + abort(); + } catch (InterruptedException ex) { + SwingUtils.showException(this, ex); + } + }//GEN-LAST:event_buttonAbortActionPerformed + + private void buttonAddToQueueActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAddToQueueActionPerformed + try { + List queues = getView().getQueues(); + QueueProcessor tq = (queues.size() == 0) ? getView().openProcessor(QueueProcessor.class, null) : queues.get(0); + getView().getDocumentsTab().setSelectedComponent(tq); + tq.addNewFile(getScript(), getArgs()); + } catch (Exception ex) { + showException( ex); + } + }//GEN-LAST:event_buttonAddToQueueActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonAbort; + private javax.swing.JButton buttonAddToQueue; + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.ButtonGroup buttonGroup2; + private javax.swing.JButton buttonStart; + private javax.swing.JCheckBox checkCompression; + private javax.swing.JCheckBox checkZigZag; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel10; + private javax.swing.JLabel jLabel11; + private javax.swing.JLabel jLabel12; + private javax.swing.JLabel jLabel13; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JPanel jPanel3; + private javax.swing.JPanel jPanel4; + private ch.psi.pshell.swing.MotorReadoutPanel motorPanelX; + private ch.psi.pshell.swing.MotorReadoutPanel motorPanelY; + private javax.swing.JPanel panelParameters; + private ch.psi.pshell.plot.LinePlotJFree plot; + private javax.swing.JSpinner spinnerCenterX; + private javax.swing.JSpinner spinnerCenterY; + private javax.swing.JSpinner spinnerNPoints; + private javax.swing.JSpinner spinnerRadius; + private javax.swing.JSpinner spinnerSettlingTime; + private javax.swing.JTextField textExposures; + // End of variables declaration//GEN-END:variables + +} diff --git a/script/templates/RegineSpiral.py b/script/templates/RegineSpiral.py new file mode 100644 index 0000000..11a3670 --- /dev/null +++ b/script/templates/RegineSpiral.py @@ -0,0 +1,88 @@ +""" +Arguments: +DRY_RUN (BOOL) +CENTER_X, CENTER_Y (FLOAT) +NPOINTS (INT) +RADIUS (FLOAT) +EXPOSURES (list or None) +SETTLING_TIME (double) +ZIGZAG (BOOLEAN) +COMPRESSION (BOOLEAN) +NOISE (FLOAT) +""" +import random +import math + +position_plot = None if "POSITION_PLOT" not in globals() else POSITION_PLOT + +#Debugging +if (get_exec_pars().args is None) and (get_exec_pars().script=="RegineSpiral"): + DRY_RUN = True + CENTER_X = 11458.0 + CENTER_Y = 10398.0 + EXPOSURES = [1,2] #unit:s + NPOINTS = 100 + RADIUS = 10 + SETTLING_TIME = 1.0 + ZIGZAG = False + COMPRESSION = True + position_plot=None + + +if not position_plot: position_plot=plot(None, title="Motor Positions")[0] + + +#Constants +SENSORS = [current,ccd.dataMatrix, interf_0, interf_1] +#SENSORS = [ccd.dataMatrix] +POSITIONERS = [dummy_x, dummy_y] if DRY_RUN else [sample_x, sample_y] + +ENABLED_PLOTS = [ccd.dataMatrix] +CUSTOM_PLOT_TYPES = {ccd.dataMatrix:"ch.psi.pshell.plot.MatrixPlotRenderer"} + +RANGE_X=[-RADIUS * math.sqrt(NPOINTS)*2 + CENTER_X, RADIUS * math.sqrt(NPOINTS)*2 + CENTER_X] +RANGE_Y=[-RADIUS * math.sqrt(NPOINTS)*2 + CENTER_Y, RADIUS * math.sqrt(NPOINTS)*2 + CENTER_Y] + +position_plot.clear() +position_plot.addSeries(LinePlotSeries("positions")) +position_plot.getAxis(AxisId.X).label = POSITIONERS[0].name +position_plot.getAxis(AxisId.X).setRange(RANGE_X[0], RANGE_X[1]) +position_plot.getAxis(AxisId.Y).label = POSITIONERS[1].name +position_plot.getAxis(AxisId.Y).setRange(RANGE_Y[0], RANGE_Y[1]) + + +def after_read(record, scan): + after_readout(record, scan) + position_plot.getSeries(0).appendData(record[POSITIONERS[0]], record[POSITIONERS[1]]) + + +if EXPOSURES: + POSITIONERS = POSITIONERS + [exposure_index()] + SENSORS = SENSORS + [exposure()] + RANGE_E=[0, len(EXPOSURES)-1] + +def gen(): + th = 137.508*math.pi/180 + for n in range(NPOINTS): + r = RADIUS * math.sqrt(n) + xpos = CENTER_X + r * math.cos(th*n) + ypos = CENTER_Y + r * math.sin(th*n) + if EXPOSURES: + range_e = range(len(EXPOSURES)) + for e in range_e: + yield([xpos,ypos,e]) + else: + yield([xpos,ypos]) + + +try: + r = vscan(POSITIONERS, SENSORS , gen(), False,\ + SETTLING_TIME, relative=False, zigzag = False, initial_move=False, \ + before_read=before_readout, after_read = after_read, \ + manual_range=RANGE_X, manual_range_y=RANGE_Y, \ + compression = COMPRESSION, enabled_plots=ENABLED_PLOTS, \ + keep=False, check_positions=False, plot_types=CUSTOM_PLOT_TYPES) + set_return(r) +finally: + after_scan() + \ No newline at end of file