From c7e3adab0b3a133e68913278af2549173648c6f1 Mon Sep 17 00:00:00 2001 From: gac-x11ma Date: Wed, 30 Sep 2020 14:43:53 +0200 Subject: [PATCH] Rsync --- config/config.properties | 32 ++-- config/settings.properties | 4 +- config/variables.properties | 4 +- plugins/Eiger.form | 271 ++++++++++++++++++++++--------- plugins/Eiger.java | 311 ++++++++++++++++++++++++++---------- script/devices/eiger.py | 5 +- script/local.py | 29 +++- script/test/Simu2Img.py | 264 ++++++++++++++++++++++++++++++ script/test/SimuAbsSpec.py | 122 ++++++++++++++ 9 files changed, 860 insertions(+), 182 deletions(-) create mode 100644 script/test/Simu2Img.py create mode 100644 script/test/SimuAbsSpec.py 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