diff --git a/config/config.properties b/config/config.properties
index bb816f6..79e395e 100644
--- a/config/config.properties
+++ b/config/config.properties
@@ -1,42 +1,42 @@
-#Fri Aug 14 09:09:23 CEST 2020
-hostName=null
-userManagement=true
+#Wed Sep 30 11:44:30 CEST 2020
imageSourcesFile={config}/imaging.properties
-instanceName=SIM
autoSaveScanData=true
simulation=false
+commandExecutionEvents=true
+logDaysToLive=7
+dataScanSaveOutput=false
+userAuthenticator=
+logLevelConsole=Off
+scanStreamerPort=-1
+dataScanSaveScript=false
+dataScanSaveSetpoints=false
+parallelInitialization=false
+scanStreamingPort=-1
+devicePoolFile={config}/devices.properties
+versionTrackingManual=true
+hostName=null
+userManagement=true
+instanceName=SIM
dataServerPort=-1
hideServerMessages=false
serverPort=8080
versionTrackingEnabled=true
dataPath={data}/{year}_{month}/{date}_{seq}%03d
serverEnabled=false
-commandExecutionEvents=false
-logDaysToLive=7
dataScanReleaseRecords=false
depthDimension=0
dataScanPreserveTypes=false
logLevel=Info
-dataScanSaveOutput=false
dataScanFlushRecords=true
logPath={logs}/{date}_{time}
dataLayout=table
deviceUpdateStrategyFile={config}/update.properties
terminalEnabled=false
notificationLevel=null
-userAuthenticator=
-logLevelConsole=Off
terminalPort=3579
tasksFile={config}/tasks.properties
-scanStreamerPort=-1
-dataScanSaveScript=false
-dataScanSaveSetpoints=false
-parallelInitialization=false
-scanStreamingPort=-1
createSessionFiles=false
versionTrackingLogin={context}/svcusr-hlapp_robot
-devicePoolFile={config}/devices.properties
-versionTrackingManual=true
versionTrackingRemote=git@git.psi.ch\:pshell_config/x11ma.git
dataProvider=txt
saveCommandStatistics=false
diff --git a/config/settings.properties b/config/settings.properties
index a12bdf1..3204786 100644
--- a/config/settings.properties
+++ b/config/settings.properties
@@ -1,10 +1,12 @@
-#Wed Sep 30 09:03:39 CEST 2020
+#Wed Sep 30 12:34:20 CEST 2020
HARMONIC_ID_1=1
+RSYNC_USER=e18720
ENERGY=639.2
OUTLIERS_THRESHOLD=1000000000
POL_ID_1=Circ_Plus
NORM_FILE=/sls/X11MA/data/X11MA/Data1/public/PEEM/2020_09/i1904_1_0.tif
AUTO_SWITCH_VALVE=true
+RSYNC_PATH=
DRY_RUN=false
ALPHA_ID_2=45.0
ALPHA_ID_1=15.0
diff --git a/config/variables.properties b/config/variables.properties
index 91674cc..d8ef150 100644
--- a/config/variables.properties
+++ b/config/variables.properties
@@ -1,2 +1,2 @@
-#Tue Sep 29 14:16:06 CEST 2020
-FileSequentialNumber=2336
+#Wed Sep 30 14:19:41 CEST 2020
+FileSequentialNumber=2360
diff --git a/plugins/Eiger.form b/plugins/Eiger.form
index f7b3fad..66b37ef 100644
--- a/plugins/Eiger.form
+++ b/plugins/Eiger.form
@@ -22,7 +22,7 @@
-
+
@@ -33,7 +33,7 @@
-
+
@@ -45,29 +45,31 @@
-
-
+
+
-
-
+
+
+
+
+
-
+
+
-
-
-
+
-
+
@@ -86,7 +88,7 @@
-
+
@@ -99,11 +101,11 @@
-
-
+
+
-
+
@@ -112,7 +114,7 @@
-
+
@@ -202,8 +204,8 @@
-
+
@@ -681,6 +683,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -783,7 +907,7 @@
-
+
@@ -860,6 +984,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -876,13 +1024,10 @@
-
+
-
-
-
@@ -906,13 +1051,7 @@
-
-
-
-
-
-
-
+
@@ -977,30 +1116,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1017,18 +1132,16 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -1036,12 +1149,12 @@
-
+
-
+
@@ -1437,14 +1550,14 @@
-
-
+
+
+
-
+
-
@@ -1455,12 +1568,12 @@
-
+
-
+
@@ -1488,18 +1601,19 @@
-
+
-
+
-
+
-
-
+
+
+
@@ -1520,11 +1634,10 @@
-
+
-
+
-
diff --git a/plugins/Eiger.java b/plugins/Eiger.java
index 4db6daa..1d5f846 100644
--- a/plugins/Eiger.java
+++ b/plugins/Eiger.java
@@ -24,6 +24,9 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.script.ScriptException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
@@ -143,6 +146,7 @@ public class Eiger extends Panel {
}
});
modelRegions = (DefaultTableModel) tableRegions.getModel();
+ updateRsync();
}
//Overridable callbacks
@@ -420,7 +424,27 @@ public class Eiger extends Panel {
});
}
}
-
+ boolean updatingRsync;
+ void updateRsync(){
+ try{
+ updatingRsync = true;
+ String user = null;
+ String path = null;
+ try {
+ user = getSetting("RSYNC_USER");
+ path = getSetting("RSYNC_PATH");
+ } catch (IOException ex) {
+ }
+ boolean enabled = ((user != null) && (!user.trim().isEmpty()));
+ textRsyncUser.setText(enabled ? user : "");
+ textRsyncPath.setText((enabled && (path != null)) ? path : "");
+ textRsyncUser.setEnabled(!enabled);
+ textRsyncPath.setEnabled(!enabled);
+ checkRsyncEnable.setSelected(enabled);
+ } finally{
+ updatingRsync = false;
+ }
+ }
@SuppressWarnings("unchecked")
@@ -428,7 +452,7 @@ public class Eiger extends Panel {
private void initComponents() {
jTabbedPane1 = new javax.swing.JTabbedPane();
- jPanel1 = new javax.swing.JPanel();
+ jPanel5 = new javax.swing.JPanel();
panelDataFile = new javax.swing.JPanel();
buttonSetSeq = new javax.swing.JButton();
buttonUndoSeq = new javax.swing.JButton();
@@ -474,6 +498,13 @@ public class Eiger extends Panel {
checkAutoValve = new javax.swing.JCheckBox();
deviceValuePanel1 = new ch.psi.pshell.swing.DeviceValuePanel();
deviceValuePanel10 = new ch.psi.pshell.swing.DeviceValuePanel();
+ jPanel6 = new javax.swing.JPanel();
+ jLabel10 = new javax.swing.JLabel();
+ textRsyncUser = new javax.swing.JTextField();
+ jLabel18 = new javax.swing.JLabel();
+ textRsyncPath = new javax.swing.JTextField();
+ checkRsyncEnable = new javax.swing.JCheckBox();
+ jPanel1 = new javax.swing.JPanel();
panelNorm = new javax.swing.JPanel();
buttonSetNorm = new javax.swing.JButton();
textNorm = new javax.swing.JTextField();
@@ -486,6 +517,9 @@ public class Eiger extends Panel {
jLabel31 = new javax.swing.JLabel();
textClearOutliersMask = new javax.swing.JButton();
spinnerOutliersThreshold = new javax.swing.JSpinner();
+ buttonTriggerDetector = new javax.swing.JButton();
+ buttonShowDetectorPanel = new javax.swing.JButton();
+ buttonMeasurements = new javax.swing.JToggleButton();
panelRoi = new javax.swing.JPanel();
rendererRoi = new ch.psi.pshell.imaging.Renderer();
jLabel26 = new javax.swing.JLabel();
@@ -493,9 +527,6 @@ public class Eiger extends Panel {
buttonRoiRemove = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
tableRoi = new javax.swing.JTable();
- buttonTriggerDetector = new javax.swing.JButton();
- buttonShowDetectorPanel = new javax.swing.JButton();
- buttonMeasurements = new javax.swing.JToggleButton();
jPanel2 = new javax.swing.JPanel();
buttonImgStart = new javax.swing.JButton();
buttonImgAbort = new javax.swing.JButton();
@@ -597,12 +628,12 @@ public class Eiger extends Panel {
});
textDataPath.addKeyListener(new java.awt.event.KeyAdapter() {
- public void keyReleased(java.awt.event.KeyEvent evt) {
- textDataPathKeyReleased(evt);
- }
public void keyTyped(java.awt.event.KeyEvent evt) {
textDataPathKeyTyped(evt);
}
+ public void keyReleased(java.awt.event.KeyEvent evt) {
+ textDataPathKeyReleased(evt);
+ }
});
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
@@ -626,7 +657,7 @@ public class Eiger extends Panel {
.addGroup(panelDataFileLayout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(textDataPath, javax.swing.GroupLayout.PREFERRED_SIZE, 362, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addComponent(textDataPath, javax.swing.GroupLayout.DEFAULT_SIZE, 360, Short.MAX_VALUE)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(panelDataFileLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(panelDataFileLayout.createSequentialGroup()
@@ -956,6 +987,80 @@ public class Eiger extends Panel {
panelBeamlineLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {comboID, deviceValuePanel10});
+ jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder("Data Transfer"));
+
+ jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel10.setText("User:");
+
+ jLabel18.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel18.setText("Folder:");
+
+ checkRsyncEnable.setText("Enable");
+ checkRsyncEnable.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ checkRsyncEnableActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
+ jPanel6.setLayout(jPanel6Layout);
+ jPanel6Layout.setHorizontalGroup(
+ jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(checkRsyncEnable)
+ .addGap(83, 83, 83)
+ .addComponent(jLabel10)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(textRsyncUser)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jLabel18)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(textRsyncPath)
+ .addContainerGap())
+ );
+ jPanel6Layout.setVerticalGroup(
+ jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel6Layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel10)
+ .addComponent(textRsyncUser, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel18)
+ .addComponent(textRsyncPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(checkRsyncEnable))
+ .addContainerGap())
+ );
+
+ javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
+ jPanel5.setLayout(jPanel5Layout);
+ jPanel5Layout.setHorizontalGroup(
+ jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel5Layout.createSequentialGroup()
+ .addGap(10, 10, 10)
+ .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(panelDataFile, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(panelBeamline, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addContainerGap())
+ .addGroup(jPanel5Layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+ jPanel5Layout.setVerticalGroup(
+ jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(panelDataFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(panelBeamline, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap())
+ );
+
+ jTabbedPane1.addTab("Config", jPanel5);
+
panelNorm.setBorder(javax.swing.BorderFactory.createTitledBorder("Normalization"));
buttonSetNorm.setText("Select");
@@ -1070,7 +1175,7 @@ public class Eiger extends Panel {
.addComponent(jLabel31)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spinnerOutliersThreshold, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(0, 0, Short.MAX_VALUE)))
+ .addGap(0, 326, Short.MAX_VALUE)))
.addContainerGap())
);
@@ -1092,6 +1197,27 @@ public class Eiger extends Panel {
.addContainerGap())
);
+ buttonTriggerDetector.setText("Trigger Detector");
+ buttonTriggerDetector.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ buttonTriggerDetectorActionPerformed(evt);
+ }
+ });
+
+ buttonShowDetectorPanel.setText("Show Detector Panel");
+ buttonShowDetectorPanel.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ buttonShowDetectorPanelActionPerformed(evt);
+ }
+ });
+
+ buttonMeasurements.setText("Image Measurements");
+ buttonMeasurements.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ buttonMeasurementsActionPerformed(evt);
+ }
+ });
+
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
@@ -1099,26 +1225,37 @@ public class Eiger extends Panel {
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(panelDataFile, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(panelBeamline, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panelNorm, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panelNorm1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
- );
- jPanel1Layout.setVerticalGroup(
- jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addComponent(panelDataFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(panelNorm, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(panelNorm1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(panelBeamline, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(buttonTriggerDetector, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(buttonShowDetectorPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 201, Short.MAX_VALUE)
+ .addComponent(buttonMeasurements, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
- jTabbedPane1.addTab("Config", jPanel1);
+ jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonMeasurements, buttonShowDetectorPanel, buttonTriggerDetector});
+
+ jPanel1Layout.setVerticalGroup(
+ jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(panelNorm, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(panelNorm1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(18, 18, Short.MAX_VALUE)
+ .addComponent(buttonMeasurements)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(buttonShowDetectorPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(buttonTriggerDetector)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+
+ jTabbedPane1.addTab("Detector", jPanel1);
rendererRoi.setDeviceName("image");
rendererRoi.setMode(ch.psi.pshell.imaging.RendererMode.Stretch);
@@ -1167,40 +1304,16 @@ public class Eiger extends Panel {
tableRoi.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jScrollPane1.setViewportView(tableRoi);
- buttonTriggerDetector.setText("Trigger Detector");
- buttonTriggerDetector.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- buttonTriggerDetectorActionPerformed(evt);
- }
- });
-
- buttonShowDetectorPanel.setText("Show Detector Panel");
- buttonShowDetectorPanel.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- buttonShowDetectorPanelActionPerformed(evt);
- }
- });
-
- buttonMeasurements.setText("Image Measurements");
- buttonMeasurements.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- buttonMeasurementsActionPerformed(evt);
- }
- });
-
javax.swing.GroupLayout panelRoiLayout = new javax.swing.GroupLayout(panelRoi);
panelRoi.setLayout(panelRoiLayout);
panelRoiLayout.setHorizontalGroup(
panelRoiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelRoiLayout.createSequentialGroup()
.addGap(17, 17, 17)
- .addComponent(rendererRoi, javax.swing.GroupLayout.DEFAULT_SIZE, 443, Short.MAX_VALUE)
+ .addComponent(rendererRoi, javax.swing.GroupLayout.DEFAULT_SIZE, 444, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(panelRoiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelRoiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(buttonTriggerDetector, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(buttonShowDetectorPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 201, Short.MAX_VALUE)
- .addComponent(buttonMeasurements, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(buttonRoiRemove, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(buttonRoiAdd, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE))
@@ -1208,7 +1321,7 @@ public class Eiger extends Panel {
.addGap(13, 13, 13))
);
- panelRoiLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonMeasurements, buttonRoiAdd, buttonRoiRemove, buttonShowDetectorPanel, buttonTriggerDetector, jScrollPane1});
+ panelRoiLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonRoiAdd, buttonRoiRemove, jScrollPane1});
panelRoiLayout.setVerticalGroup(
panelRoiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -1223,13 +1336,7 @@ public class Eiger extends Panel {
.addGap(18, 18, 18)
.addComponent(jLabel26)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 297, Short.MAX_VALUE)
- .addGap(18, 18, 18)
- .addComponent(buttonMeasurements)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(buttonShowDetectorPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(buttonTriggerDetector)))
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)))
.addContainerGap())
);
@@ -1463,15 +1570,14 @@ public class Eiger extends Panel {
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
- .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(jPanel2Layout.createSequentialGroup()
- .addGap(0, 0, Short.MAX_VALUE)
- .addComponent(buttonImgStart)
- .addGap(76, 76, 76)
- .addComponent(buttonImgAbort)
- .addGap(0, 0, Short.MAX_VALUE))
- .addComponent(panelImgControls, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(panelImgControls, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
+ .addGroup(jPanel2Layout.createSequentialGroup()
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(buttonImgStart)
+ .addGap(76, 76, 76)
+ .addComponent(buttonImgAbort)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonImgAbort, buttonImgStart});
@@ -1481,11 +1587,11 @@ public class Eiger extends Panel {
.addGroup(jPanel2Layout.createSequentialGroup()
.addGap(18, 18, 18)
.addComponent(panelImgControls, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 250, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(buttonImgStart)
.addComponent(buttonImgAbort))
- .addContainerGap())
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jTabbedPane1.addTab("2-Images", jPanel2);
@@ -1598,9 +1704,9 @@ public class Eiger extends Panel {
.addComponent(spinnerSpecScans, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(spinnerSpecExp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(spinnerSpecAvg, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 108, Short.MAX_VALUE)
.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap())
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
panelSpectrumLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerSpecAvg, spinnerSpecExp, spinnerSpecScans});
@@ -1609,7 +1715,8 @@ public class Eiger extends Panel {
panelSpectrumLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelSpectrumLayout.createSequentialGroup()
.addContainerGap()
- .addGroup(panelSpectrumLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelSpectrumLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(panelSpectrumLayout.createSequentialGroup()
.addComponent(checkSpecSaveSpectrum)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
@@ -1628,10 +1735,9 @@ public class Eiger extends Panel {
.addGroup(panelSpectrumLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel25)
.addComponent(spinnerSpecScans, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, 127, Short.MAX_VALUE)
+ .addGap(59, 59, 59)
.addComponent(checkSpecSwitchPol)
- .addGap(0, 122, Short.MAX_VALUE))
- .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
@@ -1656,13 +1762,13 @@ public class Eiger extends Panel {
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
- .addGap(0, 226, Short.MAX_VALUE)
+ .addComponent(panelSpectrum, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(jPanel3Layout.createSequentialGroup()
+ .addGap(0, 0, Short.MAX_VALUE)
.addComponent(buttonSpecStart)
.addGap(76, 76, 76)
.addComponent(buttonSpecAbort)
- .addGap(0, 226, Short.MAX_VALUE))
- .addComponent(panelSpectrum, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
@@ -1673,11 +1779,11 @@ public class Eiger extends Panel {
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(panelSpectrum, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addGap(33, 33, 33)
+ .addGap(76, 76, 76)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(buttonSpecStart)
.addComponent(buttonSpecAbort))
- .addContainerGap())
+ .addGap(73, 73, 73))
);
jTabbedPane1.addTab("Absorption Spectrum", jPanel3);
@@ -1686,12 +1792,12 @@ public class Eiger extends Panel {
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 691, Short.MAX_VALUE)
+ .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 691, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
- .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 560, Short.MAX_VALUE)
+ .addComponent(jTabbedPane1)
.addGap(0, 0, 0))
);
}// //GEN-END:initComponents
@@ -1941,6 +2047,42 @@ public class Eiger extends Panel {
}
}//GEN-LAST:event_buttonMeasurementsActionPerformed
+ private void checkRsyncEnableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkRsyncEnableActionPerformed
+ if (!updatingRsync){
+ try {
+ setSetting("RSYNC_USER", "");
+ setSetting("RSYNC_PATH", "");
+ } catch (IOException ex) {
+ Logger.getLogger(Eiger.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ if (checkRsyncEnable.isSelected()){
+ String user = textRsyncUser.getText().trim();
+ String path = textRsyncPath.getText().trim();
+ if (!user.isEmpty()){
+ try {
+ this.eval("authorize_user('" + user +"', aux_file = '/scratch/.rsync.tmp')");
+ setSetting("RSYNC_USER", user);
+ setSetting("RSYNC_PATH", path);
+ } catch (Exception ex) {
+ try {
+ this.evalAsync("remove_user_key()");
+ } catch (Exception e) {
+ Logger.getLogger(Eiger.class.getName()).log(Level.SEVERE, null, e);
+ }
+ showException(ex);
+ }
+ }
+ } else {
+ try {
+ this.evalAsync("remove_user_key()");
+ } catch (Exception e) {
+ Logger.getLogger(Eiger.class.getName()).log(Level.SEVERE, null, e);
+ }
+ }
+ updateRsync();
+ }
+ }//GEN-LAST:event_checkRsyncEnableActionPerformed
+
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton buttonAdd;
private javax.swing.JButton buttonApply;
@@ -1963,6 +2105,7 @@ public class Eiger extends Panel {
private javax.swing.JButton buttonUndoSeq;
private javax.swing.JCheckBox checkAutoValve;
private javax.swing.JCheckBox checkImgAutosave;
+ private javax.swing.JCheckBox checkRsyncEnable;
private javax.swing.JCheckBox checkSpecSaveImages;
private javax.swing.JCheckBox checkSpecSaveSpectrum;
private javax.swing.JCheckBox checkSpecSwitchPol;
@@ -1985,6 +2128,7 @@ public class Eiger extends Panel {
private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel8;
private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel9;
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;
@@ -1992,6 +2136,7 @@ public class Eiger extends Panel {
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel16;
private javax.swing.JLabel jLabel17;
+ private javax.swing.JLabel jLabel18;
private javax.swing.JLabel jLabel19;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel20;
@@ -2018,6 +2163,8 @@ public class Eiger extends Panel {
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
+ private javax.swing.JPanel jPanel5;
+ private javax.swing.JPanel jPanel6;
private javax.swing.JPanel jPanel7;
private javax.swing.JPanel jPanel8;
private javax.swing.JPanel jPanel9;
@@ -2058,6 +2205,8 @@ public class Eiger extends Panel {
private javax.swing.JTextField textDataPath;
private javax.swing.JTextField textNorm;
private javax.swing.JTextField textOutliersMask;
+ private javax.swing.JTextField textRsyncPath;
+ private javax.swing.JTextField textRsyncUser;
private javax.swing.JButton textSelectOutliersMask;
// End of variables declaration//GEN-END:variables
}
diff --git a/script/devices/eiger.py b/script/devices/eiger.py
index ef53d08..9abb2bd 100644
--- a/script/devices/eiger.py
+++ b/script/devices/eiger.py
@@ -6,8 +6,7 @@ import java.awt.Rectangle as Rectangle
import ch.psi.pshell.imaging.Data as Data
import ch.psi.pshell.device.Camera.DataType as DataType
-eiger.setDataType(DataType.Float32)
-eiger.getDataArray().monitored=True
+
###############################################################################
# ROI Integration
###############################################################################
@@ -233,6 +232,8 @@ def get_outliers_mask(data_type='f'):
pass
return _outliers_mask
+eiger.setDataType(DataType.Float32)
+eiger.getDataArray().monitored=True
if False:
integrate_roi(image, 10, 5, 20, 10)
diff --git a/script/local.py b/script/local.py
index e83a2e2..9a88e85 100644
--- a/script/local.py
+++ b/script/local.py
@@ -3,6 +3,7 @@
###################################################################################################
import ntpath
import traceback
+from rsync import *
"""
OTF_START = "X11MA-OTF:GO"
@@ -486,7 +487,33 @@ def stop_measurements():
if filter_measurements is not None:
filter_measurements.stop()
filter_measurements = None
-
+
+###################################################################################################
+#Rsync
+###################################################################################################
+
+def check_sync_user_data(path):
+ rsync_user = get_setting("RSYNC_USER");
+ rsync_path = get_setting("RSYNC_PATH");
+ if rsync_user:
+ if not rsync_path:
+ rsync_path = "~/Data1"
+ if path is not None:
+ sync_user_data(rsync_user, path, rsync_path)
+
+
+_CURRENT_DATA_PATH = None
+def on_change_data_path(path):
+ global _CURRENT_DATA_PATH
+ if path is None:
+ if _CURRENT_DATA_PATH is not None:
+ check_sync_user_data(_CURRENT_DATA_PATH)
+ else:
+ _CURRENT_DATA_PATH = path
+ #print "Data path: " + str(path)
+
+
+
###################################################################################################
#Settings
###################################################################################################
diff --git a/script/test/Simu2Img.py b/script/test/Simu2Img.py
new file mode 100644
index 0000000..f7a341e
--- /dev/null
+++ b/script/test/Simu2Img.py
@@ -0,0 +1,264 @@
+import ch.psi.pshell.imaging.Data as Data
+
+#If running from editor
+if get_exec_pars().source == CommandSource.ui:
+ METHOD = "Two_Pol"
+ SWITCHING = "Tune_Detune"
+ MEASUREMENTS = 4
+ AUTO_SAVE = True
+ EXPOSURE_1 = 1.0
+ AVERAGE_1 = 2.0
+ ENERGY_1 = 850.0
+ #POLARIZATION_1 = "Circ_Plus"
+ EXPOSURE_2 = 1.0
+ AVERAGE_2 = 2.0
+ ENERGY_2= 900.0
+ #POLARIZATION_2 = "Circ_Minus"
+
+
+
+DRY_RUN = True
+SHOW_IMAGES = True
+SAVE_DIAGS = Fals
+
+ID = get_setting("ID")
+
+EXPOSURE = [EXPOSURE_1, EXPOSURE_2]
+AVERAGE = [int(AVERAGE_1), int(AVERAGE_2)]
+ENERGY = [ENERGY_1, ENERGY_2]
+#POLARIZATION = [POLARIZATION_1, POLARIZATION_2]
+
+if METHOD == "Two_Energies":
+ for en in [ENERGY_1, ENERGY_2]:
+ if en < 89.9 or en > 2000:
+ raise Exception("Bad energy argument")
+
+start = time.time()
+threads = []
+
+path = "{data}/{year}_{month}/{date}" + "/" + "{seq}%03d_" + METHOD
+set_exec_pars(path= path, format="txt", layout="table", open=True)
+data_path = get_context().setup.expandPath(path)
+#get_context().incrementFileSequentialNumber()
+
+def get_image_file_name(cycle=-1, frame_index=0, short_name=False):
+ root = "" if short_name else (data_path + "/")
+ if cycle < 0:
+ ret = root + "i"+"{seq}%03d" + "_" + ("%d" % frame_index) + ".tif"
+ else:
+ ret= root + ("%d/" % frame_index) + "i"+"{seq}%03d" + "_" + str(cycle) + ("_%d" % frame_index) + ".tif"
+ ret = get_context().setup.expandPath(ret)
+ return ret
+
+
+"""
+def getLEEM():
+ global startvoltage,objective, LEEMtemp
+ startvoltage=getStartvoltage()
+ objective=getObjective()
+ LEEMtemp=getLEEMtemp()
+"""
+set_exec_pars(path= path, format="txt", layout="table", open=True)
+data_path = get_context().setup.expandPath(path)
+
+
+
+
+def assert_status_ok():
+ if DRY_RUN: return
+ assert_machine_ok()
+ #assert_beamline_ok()
+ """
+ getbeamline
+ getLEEM
+ Rem check status of machine
+ If checkRing = 3 Then
+ Close
+ Exit Sub
+ End If
+ Rem check status of the beamline
+ If checkbeamline = 3 Then
+ Close
+ Exit Sub
+ """
+
+#Initialize vartiables
+if not DRY_RUN and str(get_setting("AUTO_SWITCH_VALVE")).lower() == "true":
+ open_vg10()
+
+
+active_id = 1
+current_pol=None
+pol_id1=POL_IDS[get_setting("POL_ID_1")]
+pol_id2=POL_IDS[get_setting("POL_ID_2")]
+
+
+#rbkEnergy=energy_rbk.read()
+if METHOD == "Two_Pol":
+ if ID == "ID1":
+ current_pol = pol_id1
+ elif ID == "ID2":
+ current_pol = pol_id2
+ elif ID == "ID1_ID2":
+ current_pol=pol_id1
+ if SWITCHING == "Tune_Detune":
+ tune_detune(1) #Tune ID1, Detune ID2
+ else:
+ if ID == "ID1_ID2":
+ put_id_pol(2, current_pol) #Force both IDs to same polarization
+ wait_channel("X11PHS:alldone", 1)
+
+def imageinfo(info):
+ pass
+
+
+
+#Beamline setting
+def nextpol():
+ global current_pol, pol_id1, pol_id2, active_id
+ if SWITCHING == "Normal":
+ if current_pol==1: return 2 #circ+ -> circ-
+ if current_pol==2: return 1 #circ+ -> circ-
+ if current_pol==3: return 4 #lin hor -> lin vert
+ if current_pol==4: return 3 #lin vert -> lin hor
+ if current_pol==5: return 5 #lin rot -> lin rot
+ elif SWITCHING == "Tune_Detune":
+ if active_id==1: return pol_id2
+ if active_id==2: return pol_id1
+
+
+def switch_pol():
+ global active_id
+ if DRY_RUN:
+ return
+ newpol=nextpol()
+ if ID == "ID1":
+ put_id_pol(1,newpol)
+ elif ID == "ID2":
+ put_id_pol(2,newpol)
+ elif ID == "ID1_ID2":
+ if SWITCHING == "Normal":
+ put_id_pol(1, newpol)
+ put_id_pol(2, newpol)
+ elif SWITCHING == "Tune_Detune":
+ if active_id==1:
+ active_id=2
+ else:
+ active_id=1
+ tune_detune(active_id)
+ time.sleep(1.0)
+ wait_channel("X11PHS:alldone", 1)
+
+def change_energy(v):
+ if v<91 or v>2500:
+ raise Exception ("Invalid energy: " + str(v))
+ if DRY_RUN:
+ return
+ put_energy(v)
+
+
+
+def save_image_file(frame, cycle=-1, frame_index=0):
+ if SHOW_IMAGES:
+ print 3
+ plot(frame.matrix if (type(frame) == Data) else get_ip_array(frame), name = get_image_file_name(cycle, frame_index, True))
+ if AUTO_SAVE and (frame is not None):
+ print 4
+ filename = get_image_file_name(cycle, frame_index)
+ print 5
+ threads.append(save_as_tiff(frame, filename, check=False, parallel=True, metadata=(get_diags() if SAVE_DIAGS else {})))
+ print 6
+ log(filename)
+ print filename
+ # log("SV:"+Format(startvoltage,"0.000")+" OB:"+Format(objective,"0.00")+" ST:"+Format(LEEMtemp,"0.0"))
+ print 7
+#eiger.stop()
+#eiger.grabMode=eiger.GrabMode.Single
+#time.sleep(0.3)
+
+try:
+ #Do the measurement loop
+ for cycle in range(1, MEASUREMENTS + 1):
+ frames = []
+ if MEASUREMENTS > 1:
+ log("")
+ log("nround = " + str(cycle) + " / " + str(MEASUREMENTS))
+
+ if METHOD == "Two_Energies":
+ change_energy(ENERGY_1)
+
+ for i in range(2):
+ if (cycle == 1) or (METHOD != "Take_Image"):
+ assert_status_ok()
+ #set_exposure_time(EXPOSURE[i])
+ print "--- Grabing " + str(AVERAGE[i])+ " frames - cycle: " + str(cycle) + " step: " + str(i)
+ #ret = grab_frames(image, AVERAGE[i], roi=None, wait_next=True)
+ ret = []
+ for j in range( AVERAGE[i]):
+ ret.append(Data(Arr.indexesDouble(600),30,20))
+
+
+ frames.append(average_frames(ret) if AVERAGE[i] > 1 else ret[0])
+ imageinfo("I")
+ print 1
+ save_image_file(frames[i], cycle, i)
+ print 2
+ if METHOD == "Take_Image":
+ break
+
+
+ if METHOD == "Two_Pol":
+ print "--- Switching polatization..."
+ switch_pol()
+ if METHOD == "Two_Energies":
+ print "--- Switching energy..."
+ change_energy(ENERGY_2)
+ #time.sleep(1)
+
+ if (METHOD == "Two_Pol") or (METHOD == "Two_Energies"):
+ if (METHOD == "Two_Energies") or ((current_pol == 2) or (current_pol==3)):
+ ###??? autocontrast???
+ frames.append(frames[0].copy())
+ frames[2].div(frames[1])
+ else:
+ frames.append(frames[1].copy())
+ frames[2].div(frames[0])
+ save_image_file(frames[2],cycle, 2)
+
+ # objective = getObjective()
+ # temp = getLEEMtemp()
+ # log(0 , "Temp : " + Format(temp,"0.00") + " OB : " + Format(objective,"0.00") + " StigmaA : " + " StigmaB : " )
+ # Auto average and save
+
+ print "Waiting file writing threads to finish..."
+ for t in threads:
+ join(t)
+ if (MEASUREMENTS > 1) and (AUTO_SAVE == 1):
+ print "--- Averaging..."
+ for i in range(len(frames)):
+ """
+ measures = []
+ for cycle in range(1, MEASUREMENTS + 1):
+ filename = get_image_file_name(cycle, i)
+ ip = open_image(filename)
+ #measures.append(Data(get_ip_array(ip)))
+ measures.append(ip)
+ #av = average_frames(measures) #Result is transposed???
+ av=average_ips (measures, roi=None, as_float=True)
+ """
+ integration = None
+ for cycle in range(1, MEASUREMENTS + 1):
+ filename = get_image_file_name(cycle, i)
+ print "Open " , filename
+ ip = open_image(filename)
+ if integration is None:
+ integration = ip
+ else:
+ integration =integrate_ips ([integration, ip], as_float=True)
+ av=op_const(integration, "divide", float(MEASUREMENTS), in_place=True)
+ save_image_file(av, -1, i)
+finally:
+ if not DRY_RUN and str(get_setting("AUTO_SWITCH_VALVE")).lower() == "true":
+ close_vg10()
+ #restore_eiger()
+ print "Running time: " + str(time.time() - start)
\ No newline at end of file
diff --git a/script/test/SimuAbsSpec.py b/script/test/SimuAbsSpec.py
new file mode 100644
index 0000000..c6a140b
--- /dev/null
+++ b/script/test/SimuAbsSpec.py
@@ -0,0 +1,122 @@
+#If running from editor
+if get_exec_pars().source == CommandSource.ui:
+ ROI = {"Region1": [10,5,20, 10], "Region2": [20,15,20, 10]}
+ SAVE_SPECTRUM = True
+ SAVE_IMAGES = True
+ WITH_I0 = True
+ SWITCH_POL = False
+ EXPOSURE = 1.0
+ AVERAGE = 2
+ NUMBER_SCANS =1
+ RANGES = [[500.0, 1000.0, 100.0]]
+
+DRY_RUN = True
+SAVE_DIAGS = False
+
+log("ROIs: " + str(ROI))
+
+if len(RANGES) == 0:
+ raise Exception("No scan range defined")
+
+start = time.time()
+
+#eiger.stop()
+#eiger.grabMode=eiger.GrabMode.Single
+time.sleep(0.3)
+#set_exposure_time(EXPOSURE)
+
+set_exec_pars(path="{data}/{year}_{month}/{date}/{seq}%03d_AbsortionSpectrum", format="csv", layout="table")
+tag= "AbsortionSpectrum_{seq}%03d_{count}%02d"
+
+rois = create_roi_devices(ROI)
+
+if AVERAGE>1:
+ for i in range(len(rois)):
+ rois[i].monitored = True
+ rois[i] = create_averager(rois[i], AVERAGE, -1)
+ rois[i].monitored = True
+
+
+frames=[]
+
+
+class SyncEnergy(Writable):
+ def write(self,pos):
+ if not DRY_RUN:
+ put_energy(pos)
+ else:
+ print "Energy=" + str(pos)
+sync_energy=SyncEnergy()
+set_device_alias(sync_energy, "Energy") #Set display name
+
+sensors = rois + [machine_cur]
+if WITH_I0:
+ sensors = rois + [keithley_1a]
+
+
+
+av=None
+def grab_image(position, scan):
+ global av
+ #frames = grab_frames(image, AVERAGE, roi=None, wait_next=True)
+ frames = []
+ for j in range( AVERAGE):
+ frames.append(Data(Arr.indexesDouble(600),30,20))
+ av = average_frames(frames)
+ if SAVE_IMAGES:
+ #Scan_Nr = (scan.recordIndex-1)/NUMBER_SCANS
+ #filename = get_exec_pars().path + "/" + ("%02d" % Scan_Nr) + "/s" + "{seq}%03d" + "_" + ("%03d.tif" % scan.recordIndex)
+ filename = get_exec_pars().path + "/" + str(scan.currentPass) + "/s" + "{seq}%03d" + "_" + ("%03d.tif" % scan.recordIndex)
+ filename = get_context().setup.expandPath(filename)
+ print filename
+ save_as_tiff(av, filename, metadata=(get_diags() if SAVE_DIAGS else {}))
+
+class Average(ReadableMatrix):
+ def read(self):
+ return av.matrix
+ def getWidth(self):
+ return 30 #eiger.dataMatrix.getWidth()
+ def getHeight(self):
+ return 20 #eiger.dataMatrix.getHeight()
+averager=Average()
+set_device_alias(averager, "Image") #Set display name
+sensors.append(averager) #sensors.append(eiger.getDataMatrix())
+
+#Initialize vartiables
+if not DRY_RUN and str(get_setting("AUTO_SWITCH_VALVE")).lower() == "true":
+ open_vg10()
+
+#put_id_offset(1, OFFSET_ID_1) #offset on ID1
+#put_id_offset(2, OFFSET_ID_2) #offset on ID2
+
+
+
+"""
+if ID == "ID1":
+ current_pol=POL_IDS[POL_ID_1] #get_id_pol(1)
+ put_id_pol(1,current_pol)
+ caput('X11MA-ID2-GAP:SET',100) #open Gap ID2
+elif ID == "ID2":
+ current_pol=POL_IDS[POL_ID_2]#get_id_pol(2)
+ put_id_pol(2,current_pol)
+
+ caput('X11MA-Ivg10D1-GAP:SET',100) #open Gap ID1
+elif ID == "ID1_ID2":
+ polID1=POL_IDS[POL_ID_1]
+ polID2=POL_IDS[POL_ID_2]
+ put_id_pol(1,polID1)
+ put_id_pol(2,polID2)
+wait_channel("X11PHS:alldone", 1)
+"""
+
+try:
+ #tscan(rois, 10, 0.1, format="csv", before_read=grab_image, passes = NUMBER_SCANS, tag=tag)
+ rscan(sync_energy, sensors, RANGES, latency = 0.0 , passes = NUMBER_SCANS, tag=tag, before_read=grab_image, save=SAVE_SPECTRUM, split=True, keep=False)
+finally:
+ if AVERAGE>1:
+ for i in range(len(rois)):
+ rois[i].parent.monitored = False # Remove listeners on the image
+ if not DRY_RUN and str(get_setting("AUTO_SWITCH_VALVE")).lower() == "true":
+ close_vg10()
+ #restore_eiger()
+ print "Running time: " + str(time.time() - start)
\ No newline at end of file