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