diff --git a/config/plugins.properties b/config/plugins.properties index 435c38c..d79e0f3 100644 --- a/config/plugins.properties +++ b/config/plugins.properties @@ -1 +1,2 @@ +TimeResolved.java=enabled EnergyScan.java=enabled diff --git a/config/variables.properties b/config/variables.properties index 64f39a0..fd93627 100644 --- a/config/variables.properties +++ b/config/variables.properties @@ -1,2 +1,2 @@ -#Wed Aug 04 08:34:55 CEST 2021 -FileSequentialNumber=14 +#Wed Aug 04 10:23:44 CEST 2021 +FileSequentialNumber=30 diff --git a/plugins/TimeResolved.form b/plugins/TimeResolved.form new file mode 100644 index 0000000..f55ca79 --- /dev/null +++ b/plugins/TimeResolved.form @@ -0,0 +1,222 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/TimeResolved.java b/plugins/TimeResolved.java new file mode 100644 index 0000000..45124ee --- /dev/null +++ b/plugins/TimeResolved.java @@ -0,0 +1,388 @@ + +import ch.psi.pshell.core.JsonSerializer; +import ch.psi.pshell.ui.PanelProcessor; +import ch.psi.utils.IO; +import ch.psi.utils.State; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileNameExtensionFilter; +/** + * + */ +public class TimeResolved extends PanelProcessor { + + File currentFile; + public static final String FILE_EXTENSION = "tmr"; + + public TimeResolved() { + initComponents(); + } + + @Override + public String getType() { + return "Time Resolved"; + } + + @Override + public boolean createMenuNew() { + return true; + } + + @Override + public boolean createFilePanel() { + return true; + } + + @Override + public String getDescription() { + return "Time Resolved scan definition file (*." + FILE_EXTENSION + ")"; + } + + @Override + public String[] getExtensions() { + return new String[]{FILE_EXTENSION}; + } + + @Override + public String getHomePath() { + return "{home}/parameters"; + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + } + + @Override + public void onStateChange(State state, State former) { + buttonStart.setEnabled(state == State.Ready); + buttonAbort.setEnabled(state.isProcessing()); + buttonScienta.setEnabled(state.isInitialized()); + updateSeq(); + } + + void updateSeq() { + try { + textFileId.setText(String.valueOf(getContext().getFileSequentialNumber())); + } catch (Exception ex) { + textFileId.setText(""); + } + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + //Callback to perform update - in event thread + @Override + protected void doUpdate() { + } + + String getScanName() { + String name = textName.getText().trim(); + return name.isEmpty() ? null : name; + } + + @Override + public void execute() throws Exception { + String lastOutput = getContext().getDataManager().getLastOutput(); + + HashMap args = new HashMap(); + args.put("FILE", null); + args.put("NAME", getScanName()); + args.put("SCANS", spinnerScans.getValue()); + this.runAsync("templates/TimeResolved", args).handle((ret, ex) -> { + if (ex != null) { + } + return ret; + }); + } + + @Override + public void saveAs(String fileName) throws IOException { + currentFile = new File(fileName); + ArrayList data = new ArrayList(); + data.add(textName.getText()); + data.add(spinnerScans.getValue()); + String json = JsonSerializer.encode(data, true); + Files.write(currentFile.toPath(), json.getBytes()); + } + + @Override + public void open(String fileName) throws IOException { + if (fileName==null){ + currentFile = null; + textName.setText(""); + spinnerScans.setValue(0); + } else { + Path path = Paths.get(fileName); + String json = new String(Files.readAllBytes(path)); + currentFile = path.toFile(); + Object[] vector = (Object[]) JsonSerializer.decode(json, Object[].class); + textName.setText(String.valueOf(vector[0])); + spinnerScans.setValue(vector[1]); + } + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jScrollPane2 = new javax.swing.JScrollPane(); + jEditorPane1 = new javax.swing.JEditorPane(); + buttonStart = new javax.swing.JButton(); + buttonAbort = new javax.swing.JButton(); + buttonScienta = new javax.swing.JButton(); + jPanel2 = new javax.swing.JPanel(); + jLabel3 = new javax.swing.JLabel(); + spinnerScans = new javax.swing.JSpinner(); + jLabel1 = new javax.swing.JLabel(); + textName = new javax.swing.JTextField(); + buttonOpen = new javax.swing.JButton(); + buttonSave = new javax.swing.JButton(); + jLabel2 = new javax.swing.JLabel(); + textFileId = new javax.swing.JTextField(); + buttonResetId = new javax.swing.JButton(); + + jScrollPane2.setViewportView(jEditorPane1); + + 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); + } + }); + + buttonScienta.setText("Scienta Panel"); + buttonScienta.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonScientaActionPerformed(evt); + } + }); + + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Parameters")); + + jLabel3.setText("Scans:"); + + spinnerScans.setModel(new javax.swing.SpinnerNumberModel(10, 1, 1000000, 1)); + + jLabel1.setText("Name:"); + + buttonOpen.setText("Open"); + buttonOpen.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonOpenActionPerformed(evt); + } + }); + + buttonSave.setText("Save"); + buttonSave.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonSaveActionPerformed(evt); + } + }); + + 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.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerScans, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel2Layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(textName) + .addGap(18, 18, 18) + .addComponent(buttonOpen) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonSave))) + .addGap(14, 14, 14)) + ); + + jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel3}); + + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(textName) + .addComponent(jLabel1) + .addComponent(buttonOpen) + .addComponent(buttonSave)) + .addGap(11, 11, 11) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(spinnerScans, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(166, Short.MAX_VALUE)) + ); + + jLabel2.setText("File ID:"); + + textFileId.setEditable(false); + textFileId.setHorizontalAlignment(javax.swing.JTextField.CENTER); + + buttonResetId.setText("Reset"); + buttonResetId.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonResetIdActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(buttonStart, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(33, 33, 33) + .addComponent(buttonAbort) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(buttonResetId)) + .addGroup(layout.createSequentialGroup() + .addComponent(buttonScienta) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(textFileId, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap()))) + ); + + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonAbort, buttonStart}); + + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonResetId, textFileId}); + + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(7, 7, 7) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(textFileId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonScienta)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonResetId) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(buttonStart) + .addComponent(buttonAbort)) + .addContainerGap()) + ); + }// //GEN-END:initComponents + + 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 buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed + try { + abort(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonAbortActionPerformed + + private void buttonScientaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonScientaActionPerformed + try { + this.showDevicePanel("scienta"); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonScientaActionPerformed + + private void buttonResetIdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonResetIdActionPerformed + try { + this.getContext().setFileSequentialNumber(0); + updateSeq(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonResetIdActionPerformed + + private void buttonOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOpenActionPerformed + try { + open(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonOpenActionPerformed + + private void buttonSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSaveActionPerformed + try { + JFileChooser chooser = new JFileChooser(getContext().getSetup().expandPath(getHomePath())); + FileNameExtensionFilter filter = new FileNameExtensionFilter(getDescription(), getExtensions()); + chooser.setFileFilter(filter); + try { + if (currentFile != null) { + chooser.setSelectedFile(currentFile); + } else if (getScanName() != null) { + File file = Paths.get(chooser.getCurrentDirectory().getAbsolutePath(), getScanName()).toFile(); + chooser.setSelectedFile(file); + } + } catch (Exception ex) { + this.showException(ex); + } + int rVal = chooser.showSaveDialog(this); + if (rVal == JFileChooser.APPROVE_OPTION) { + String fileName = chooser.getSelectedFile().getAbsolutePath(); + if (IO.getExtension(chooser.getSelectedFile().getAbsolutePath()).isEmpty()) { + fileName += "." + FILE_EXTENSION; + } + saveAs(fileName); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonSaveActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonAbort; + private javax.swing.JButton buttonOpen; + private javax.swing.JButton buttonResetId; + private javax.swing.JButton buttonSave; + private javax.swing.JButton buttonScienta; + private javax.swing.JButton buttonStart; + private javax.swing.JEditorPane jEditorPane1; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JPanel jPanel2; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JSpinner spinnerScans; + private javax.swing.JTextField textFileId; + private javax.swing.JTextField textName; + // End of variables declaration//GEN-END:variables + +} diff --git a/script/local.py b/script/local.py index a5015cd..a674464 100644 --- a/script/local.py +++ b/script/local.py @@ -81,3 +81,23 @@ def after_readout(rec): +def trigger_scienta(): + """ + Trigger new acquisition + """ + scienta.start() + scienta.waitNewImage(-1) + + +def dummy_trigger_scienta(): + """ + Trigger detector to update the array sizes and calibration + """ + iterations = scienta.getIterations() + scienta.setIterations(1) + try: + trigger_scienta() + finally: + scienta.setIterations(iterations) + + diff --git a/script/templates/EnergyScan.py b/script/templates/EnergyScan.py index eea70bd..203be50 100644 --- a/script/templates/EnergyScan.py +++ b/script/templates/EnergyScan.py @@ -1,48 +1,41 @@ -if get_exec_pars().debug: - print "Setting debug parameters" - REGIONS = [[523.0, 527.0, 2.0], [527.0, 535.0, 4.0], [535.0, 558.0, 2.0]] - NAME = None - FILE = None - -if FILE: - FILE = get_context().setup.expandPath("{home}/parameters/" + FILE) - import json - with open(FILE) as json_file: - cfg = json.load(json_file) - NAME , REGIONS= cfg[0][0][0], cfg[1] - print "FILE: ", FILE -print "NAME: ", NAME -print "REGIONS: ", REGIONS - -IOC_AUTO_SAVE = False -DUMMY_TRIGGER = True #Trigger detector to update the array sizes and calibration - -set_device_alias(scienta.getSpectrum(), "spectrum") -set_device_alias(scienta.getDataMatrix(), "image") -set_device_alias(scienta.stats[0], "sum") - -sensors=[i0, scienta.stats[0], scienta.getSpectrum()] #), scienta.getDataMatrix()] - -def trigger(position, scan): - scienta.start() - scienta.waitNewImage(-1) - - -if DUMMY_TRIGGER: - iterations = scienta.getIterations() - scienta.setIterations(1) - try: - trigger(None, None) - finally: - scienta.setIterations(iterations) - - -if IOC_AUTO_SAVE: - capture.write(1) - -try: - rscan(energy, sensors, REGIONS, latency = 0.0, before_read=trigger, after_read=after_readout, name = NAME) -finally: - if IOC_AUTO_SAVE: - capture.write(0) - scienta.zeroSupplies() +if get_exec_pars().debug: + print "Setting debug parameters" + REGIONS = [[523.0, 527.0, 2.0], [527.0, 535.0, 4.0], [535.0, 558.0, 2.0]] + NAME = None + FILE = None + +if FILE: + FILE = get_context().setup.expandPath("{home}/parameters/" + FILE) + import json + with open(FILE) as json_file: + cfg = json.load(json_file) + NAME , REGIONS= cfg[0][0][0], cfg[1] + print "FILE: ", FILE +print "NAME: ", NAME +print "REGIONS: ", REGIONS + +IOC_AUTO_SAVE = False +DUMMY_TRIGGER = True + +set_device_alias(scienta.getSpectrum(), "spectrum") +set_device_alias(scienta.getDataMatrix(), "image") +set_device_alias(scienta.stats[0], "sum") + +sensors=[i0, scienta.stats[0], scienta.getSpectrum()] #), scienta.getDataMatrix()] + +def before_read(position, scan): + trigger_scienta() + +if DUMMY_TRIGGER: + dummy_trigger_scienta() + + +if IOC_AUTO_SAVE: + capture.write(1) + +try: + rscan(energy, sensors, REGIONS, latency = 0.0, before_read=before_read, after_read=after_readout, name = NAME) +finally: + if IOC_AUTO_SAVE: + capture.write(0) + scienta.zeroSupplies() diff --git a/script/templates/TimeResolved.py b/script/templates/TimeResolved.py index 1ac8fd3..93263a8 100644 --- a/script/templates/TimeResolved.py +++ b/script/templates/TimeResolved.py @@ -1,8 +1,48 @@ +if get_exec_pars().debug: + print "Setting debug parameters" + SCANS = 10 + NAME = None + FILE = None + +if FILE: + FILE = get_context().setup.expandPath("{home}/parameters/" + FILE) + import json + with open(FILE) as json_file: + cfg = json.load(json_file) + NAME , SCANS= cfg[0], cfg[1] + print "FILE: ", FILE +print "SCANS: ", SCANS + + +""" +scienta.getState().assertReady() +current_spectrum=scienta.getSpectrum().take() scienta.start() +try: + scienta.getSpectrum().waitValueNot(current_spectrum, -1) + mscan(scienta.getSpectrum(), scienta.getSpectrum(), scienta.getIterations(), -1, take_initial=True) +except: + scienta.stop() + scienta.zeroSupplies() + +""" + + +set_device_alias(scienta.getSpectrum(), "spectrum") + +sensors=[i0, scienta.getSpectrum()] + +def before_read(position, scan): + trigger_scienta() -mscan(scienta.getSpectrum(), scienta.getSpectrum(), scienta.getIterations() -1) +dummy_trigger_scienta() +try: + tscan(sensors, SCANS, 0.001, before_read=before_read, after_read=after_readout, name = NAME) +finally: + scienta.zeroSupplies() +