diff --git a/plugins/OTF.form b/plugins/OTF.form
new file mode 100644
index 00000000..a03682f8
--- /dev/null
+++ b/plugins/OTF.form
@@ -0,0 +1,370 @@
+
+
+
diff --git a/plugins/OTF.java b/plugins/OTF.java
new file mode 100644
index 00000000..24880dd7
--- /dev/null
+++ b/plugins/OTF.java
@@ -0,0 +1,388 @@
+
+import ch.psi.pshell.ui.Panel;
+import ch.psi.utils.State;
+import ch.psi.utils.swing.SwingUtils;
+import java.awt.Component;
+import java.util.HashMap;
+import javax.swing.JSpinner;
+
+/**
+ *
+ */
+public class OTF extends Panel {
+
+ public OTF() {
+ initComponents();
+ }
+
+ //Overridable callbacks
+ @Override
+ public void onInitialize(int runCount) {
+
+ }
+
+ @Override
+ public void onStateChange(State state, State former) {
+ boolean enabled = state==State.Ready;
+ buttonAbort.setEnabled(state.isProcessing());
+ buttonStart.setEnabled(enabled);
+ for (Component c : SwingUtils.getComponentsByType(panelPositioner, JSpinner.class)) {
+ c.setEnabled(enabled);
+ }
+ boolean energy = spinnerMode.getValue().equals("ENERGY");
+ spinnerMode.setEnabled(enabled);
+ spinnerTime.setEnabled(enabled);
+ spinnerModulo.setEnabled(enabled);
+ spinnerE1.setEnabled(enabled && energy);
+ spinnerE2.setEnabled(enabled && energy);
+ spinnerBeta1.setEnabled(enabled && !energy);
+ spinnerBeta2.setEnabled(enabled && !energy);
+ spinnerTheta1.setEnabled(enabled && !energy);
+ spinnerTheta2.setEnabled(enabled && !energy);
+ }
+
+ @Override
+ public void onExecutedFile(String fileName, Object result) {
+ }
+
+ @Override
+ protected void onTimer() {
+ }
+
+ @Override
+ protected void onLoaded() {
+
+ }
+
+ @Override
+ protected void onUnloaded() {
+
+ }
+
+ //Invoked by 'update()' to update components in the event thread
+ @Override
+ protected void doUpdate() {
+ }
+
+ void startScan() throws Exception {
+ HashMap args = new HashMap<>();
+ /*
+ ArrayList sensors = new ArrayList();
+ for (Component c : panelSensors.getComponents()) {
+ if ((c instanceof JCheckBox) && ((JCheckBox) c).isSelected()) {
+ sensors.add(c.getName());
+ }
+ }
+ args.put("SENSORS", sensors);
+ */
+ args.put("MODE", spinnerMode.getValue());
+ args.put("E1", spinnerE1.getValue());
+ args.put("E2", spinnerE2.getValue());
+ args.put("BETA1", spinnerBeta1.getValue());
+ args.put("BETA2", spinnerBeta2.getValue());
+ args.put("THETA1", spinnerTheta1.getValue());
+ args.put("THETA2", spinnerTheta2.getValue());
+ args.put("TIME", spinnerTime.getValue());
+ args.put("MODULO", spinnerModulo.getValue());
+ args.put("ENDSCAN", checkEndScan.isSelected());
+ runAsync("otf", args);
+ }
+
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ panelSensors = new javax.swing.JPanel();
+ panelPositioner = new javax.swing.JPanel();
+ jLabel4 = new javax.swing.JLabel();
+ spinnerE1 = new javax.swing.JSpinner();
+ spinnerE2 = new javax.swing.JSpinner();
+ jLabel5 = new javax.swing.JLabel();
+ jLabel6 = new javax.swing.JLabel();
+ spinnerTime = new javax.swing.JSpinner();
+ jLabel7 = new javax.swing.JLabel();
+ spinnerModulo = new javax.swing.JSpinner();
+ jLabel8 = new javax.swing.JLabel();
+ spinnerMode = new javax.swing.JSpinner();
+ jLabel9 = new javax.swing.JLabel();
+ spinnerBeta1 = new javax.swing.JSpinner();
+ jLabel10 = new javax.swing.JLabel();
+ spinnerBeta2 = new javax.swing.JSpinner();
+ jLabel11 = new javax.swing.JLabel();
+ spinnerTheta1 = new javax.swing.JSpinner();
+ spinnerTheta2 = new javax.swing.JSpinner();
+ jLabel12 = new javax.swing.JLabel();
+ jPanel3 = new javax.swing.JPanel();
+ buttonStart = new javax.swing.JButton();
+ buttonAbort = new javax.swing.JButton();
+ checkEndScan = new javax.swing.JCheckBox();
+
+ panelSensors.setBorder(javax.swing.BorderFactory.createTitledBorder("Sensors"));
+
+ javax.swing.GroupLayout panelSensorsLayout = new javax.swing.GroupLayout(panelSensors);
+ panelSensors.setLayout(panelSensorsLayout);
+ panelSensorsLayout.setHorizontalGroup(
+ panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 228, Short.MAX_VALUE)
+ );
+ panelSensorsLayout.setVerticalGroup(
+ panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 530, Short.MAX_VALUE)
+ );
+
+ panelPositioner.setBorder(javax.swing.BorderFactory.createTitledBorder("Parameters"));
+
+ jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel4.setText("E1(eV):");
+
+ spinnerE1.setModel(new javax.swing.SpinnerNumberModel(450.0d, 50.0d, 2000.0d, 1.0d));
+
+ spinnerE2.setModel(new javax.swing.SpinnerNumberModel(460.0d, 50.0d, 2000.0d, 1.0d));
+
+ jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel5.setText("E2(eV):");
+
+ jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel6.setText("Time(min):");
+
+ spinnerTime.setModel(new javax.swing.SpinnerNumberModel(1, 1, 1440, 1));
+
+ jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel7.setText("Modulo:");
+
+ spinnerModulo.setModel(new javax.swing.SpinnerNumberModel(4, 1, 10, 1));
+
+ jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel8.setText("Mode:");
+
+ spinnerMode.setModel(new javax.swing.SpinnerListModel(new String[] {"ENERGY", "ANGLE"}));
+ spinnerMode.addChangeListener(new javax.swing.event.ChangeListener() {
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ spinnerModeStateChanged(evt);
+ }
+ });
+
+ jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel9.setText("Beta1(deg):");
+
+ spinnerBeta1.setModel(new javax.swing.SpinnerNumberModel(-86.325d, -360.0d, 360.0d, 1.0d));
+
+ jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel10.setText("Beta2(deg):");
+
+ spinnerBeta2.setModel(new javax.swing.SpinnerNumberModel(-86.365d, -360.0d, 360.0d, 1.0d));
+
+ jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel11.setText("Theta1(deg):");
+
+ spinnerTheta1.setModel(new javax.swing.SpinnerNumberModel(87.345d, -360.0d, 360.0d, 1.0d));
+
+ spinnerTheta2.setModel(new javax.swing.SpinnerNumberModel(87.37d, -360.0d, 360.0d, 1.0d));
+
+ jLabel12.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel12.setText("Theta2(deg):");
+
+ javax.swing.GroupLayout panelPositionerLayout = new javax.swing.GroupLayout(panelPositioner);
+ panelPositioner.setLayout(panelPositionerLayout);
+ panelPositionerLayout.setHorizontalGroup(
+ panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelPositionerLayout.createSequentialGroup()
+ .addGap(41, 41, 41)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelPositionerLayout.createSequentialGroup()
+ .addComponent(jLabel4)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerE1))
+ .addGroup(panelPositionerLayout.createSequentialGroup()
+ .addComponent(jLabel5)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerE2))
+ .addGroup(panelPositionerLayout.createSequentialGroup()
+ .addComponent(jLabel6)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerTime))
+ .addGroup(panelPositionerLayout.createSequentialGroup()
+ .addComponent(jLabel7)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerModulo))
+ .addGroup(panelPositionerLayout.createSequentialGroup()
+ .addComponent(jLabel8)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerMode))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionerLayout.createSequentialGroup()
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jLabel9)
+ .addComponent(jLabel10)
+ .addComponent(jLabel11)
+ .addComponent(jLabel12))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(spinnerBeta1)
+ .addComponent(spinnerBeta2, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(spinnerTheta1)
+ .addComponent(spinnerTheta2, javax.swing.GroupLayout.Alignment.TRAILING))))
+ .addContainerGap())
+ );
+
+ panelPositionerLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel10, jLabel11, jLabel12, jLabel4, jLabel5, jLabel6, jLabel7, jLabel8, jLabel9});
+
+ panelPositionerLayout.setVerticalGroup(
+ panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelPositionerLayout.createSequentialGroup()
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel8))
+ .addGap(50, 50, 50)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerE1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel4))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerE2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel5))
+ .addGap(18, 18, 18)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerBeta1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel9))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel10)
+ .addComponent(spinnerBeta2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(18, 18, 18)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerTheta1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel11))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel12)
+ .addComponent(spinnerTheta2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(50, 50, 50)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel6))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerModulo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel7))
+ .addContainerGap(136, 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);
+ }
+ });
+
+ checkEndScan.setText("Turn off beam at end");
+
+ 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)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
+ .addComponent(checkEndScan)
+ .addGap(0, 62, 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(checkEndScan)
+ .addGap(26, 26, 26))
+ );
+
+ 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(panelSensors, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(panelPositioner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(17, Short.MAX_VALUE))
+ );
+
+ layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jPanel3, panelPositioner, panelSensors});
+
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(panelPositioner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(panelSensors, 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))
+ .addContainerGap())
+ );
+ }// //GEN-END:initComponents
+
+ private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartActionPerformed
+ try {
+ startScan();
+ } catch (Exception ex) {
+ showException(ex);
+ }
+ }//GEN-LAST:event_buttonStartActionPerformed
+
+ private void buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed
+ try {
+ abort();
+ } catch (Exception ex) {
+ showException(ex);
+ }
+ }//GEN-LAST:event_buttonAbortActionPerformed
+
+ private void spinnerModeStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerModeStateChanged
+ onStateChange(getState(), getState());
+ }//GEN-LAST:event_spinnerModeStateChanged
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton buttonAbort;
+ private javax.swing.JButton buttonStart;
+ private javax.swing.JCheckBox checkEndScan;
+ private javax.swing.JLabel jLabel10;
+ private javax.swing.JLabel jLabel11;
+ private javax.swing.JLabel jLabel12;
+ private javax.swing.JLabel jLabel4;
+ private javax.swing.JLabel jLabel5;
+ private javax.swing.JLabel jLabel6;
+ private javax.swing.JLabel jLabel7;
+ private javax.swing.JLabel jLabel8;
+ private javax.swing.JLabel jLabel9;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JPanel panelPositioner;
+ private javax.swing.JPanel panelSensors;
+ private javax.swing.JSpinner spinnerBeta1;
+ private javax.swing.JSpinner spinnerBeta2;
+ private javax.swing.JSpinner spinnerE1;
+ private javax.swing.JSpinner spinnerE2;
+ private javax.swing.JSpinner spinnerMode;
+ private javax.swing.JSpinner spinnerModulo;
+ private javax.swing.JSpinner spinnerTheta1;
+ private javax.swing.JSpinner spinnerTheta2;
+ private javax.swing.JSpinner spinnerTime;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/script/otf.py b/script/otf.py
new file mode 100644
index 00000000..e47d112c
--- /dev/null
+++ b/script/otf.py
@@ -0,0 +1,115 @@
+if get_exec_pars().source==CommandSource.ui:
+ MODE = "ANGLE"
+ E1 = 450.0
+ E2 = 460.0
+ BETA1 = -86.325
+ BETA2 = -86.365
+ THETA1 = 87.345
+ THETA2 = 87.370
+ TIME = 1 #min
+ MODULO=4
+ ENDSCAN=False
+
+
+
+if MODE=="ANGLE":
+ raise Exception("Angle mode not supported")
+ print "\nStart OTF scan... Beta", BETA1,"->",BETA2," Theta", THETA1,"->",THETA2, TIME,"- min modulo=",MODULO
+else:
+ print "\nStart OTF scan...", E1,"eV ->",E2,"eV,",TIME,"- min modulo=",MODULO
+
+
+wait_beam()
+sensors = MonoEnergy, MonoBeta, MonoTheta, Keithley1, Keithley2
+
+#dev_run='ca://X03DA-OTF:RUN?monitored=true&type=d'
+#dev_sts='ca://X03DA-OTF:STATUS?monitored=true&type=d'
+#sensors = dev_run,dev_sts, MonoEnergy, MonoBeta, MonoTheta, Keithley1, Keithley2
+
+caput('X03DA-OTF:TIME', TIME)
+caput('X03DA-OTF:MODE', MODE)
+if MODE=="ANGLE":
+ caput('X03DA-OTF:BETA1', BETA1)
+ caput('X03DA-OTF:BETA2', BETA2)
+ caput('X03DA-OTF:THETA1', THETA1)
+ caput('X03DA-OTF:THETA2', THETA2)
+else:
+ caput('X03DA-OTF:E1', E1)
+ caput('X03DA-OTF:E2', E2)
+
+#caput('X03DA-OTF:FOLDER', FOLDER)
+#caput('X03DA-OTF:FILE', FILE)
+
+if MODE=="ENERGY":
+ print "Set Energy"
+ Eph.move(E1)
+ print "Energy setting done"
+
+#caput('X07MA-PGM:CERBK.N',10) # set energy readback averaging to 10 pts
+
+
+time.sleep(0.1)
+
+scan_completed = False
+
+caput('X03DA-OTF:RUN', "START")
+if MODE=="ENERGY":
+ time.sleep(0.5)
+else:
+ MonoBeta.waitValueInRange(BETA1, 0.001, -1)
+
+
+def monitoring_task():
+ global scan_completed
+ time.sleep(1.0)
+ #Not working
+ #cawait('X03DA-OTF:RUN', "STOP", type = 's')
+ #cawait('X03DA-OTF:STATUS', "DONE", type = 's')
+ if MODE=="ENERGY":
+ Eph.readback.waitValueInRange(E2, 1.0, -1)
+ time.sleep(5.0)
+ else:
+ MonoBeta.waitValueInRange(BETA2, 0.0001, -1)
+ scan_completed = True
+ get_exec_pars().currentScan.abort()
+ print "otf wait done"
+ret = fork(monitoring_task)
+
+last_energy=None
+count=0
+def after_read(rec):
+ global last_energy, count
+ if (count % MODULO) != 0:
+ rec.invalidate()
+ elif MODE=="ENERGY":
+ energy =rec[MonoEnergy]
+ if last_energy is not None:
+ if ((E2>E1) and ((last_energy>=energy) or (energyE2) and ((last_energy<=energy) or (energy>E2))) :
+ rec.invalidate()
+ else:
+ last_energy=energy
+ else:
+ last_energy=energy
+ rec.invalidate()
+ count=count+1
+
+try:
+ print "Scanning...",
+ try:
+ if MODE=="ANGLE":
+ mscan(MonoBeta, sensors, -1, None, range="auto", take_initial=False, after_read=after_read)
+ else:
+ mscan(MonoEnergy, sensors, -1, None, range="auto", take_initial=False, after_read=after_read, domain_axis="MonoEnergy" )
+ finally:
+ ret[0].cancel(True)
+
+except:
+ if not scan_completed:
+ print sys.exc_info()
+ print("Aborting...")
+ caput('X03DA-OTF:RUN', 'STOP')
+ raise
+finally:
+ if ENDSCAN:
+ after_scan()
\ No newline at end of file