From 1507333ad4e7c9eba568f5c519203a18dc64e2bb Mon Sep 17 00:00:00 2001 From: gac-x11ma Date: Tue, 29 Sep 2020 10:37:10 +0200 Subject: [PATCH] Image Measurements --- config/devices.properties | 13 +- config/settings.properties | 18 +- config/variables.properties | 4 +- devices/image.properties | 4 +- plugins/Eiger.form | 394 +++++++++++++++++----------- plugins/Eiger.java | 410 +++++++++++++++++++++--------- script/devices/diag.py | 86 +++++++ script/devices/eiger.py | 27 +- script/devices/id.py | 80 ++++-- script/local.py | 61 ++++- script/templates/Eiger2Img.py | 41 +-- script/templates/EigerAbsSpec.py | 6 +- script/templates/SetupBeamline.py | 16 +- script/test/Diagnostics.py | 89 +++++++ 14 files changed, 912 insertions(+), 337 deletions(-) create mode 100644 script/devices/diag.py create mode 100644 script/test/Diagnostics.py diff --git a/config/devices.properties b/config/devices.properties index e3ba7ee..2d8159e 100644 --- a/config/devices.properties +++ b/config/devices.properties @@ -4,7 +4,18 @@ pol_mode=ch.psi.pshell.epics.DiscretePositioner|X11MA-ID2:MODE|||true pol_angle=ch.psi.pshell.epics.ChannelDouble|X11MA-ID2:ALPHA|||true pol_offset=ch.psi.pshell.epics.ChannelDouble|X11MA-ID2:ENERGY-OFFS|||true pol_done=ch.psi.pshell.epics.ChannelString|X11MA-ID2:DONE|Read||true -energy=ch.psi.pshell.epics.ChannelDouble|X11PHS-E:GO.A||| +id1_mode=ch.psi.pshell.epics.DiscretePositioner|X11MA-ID1:MODE|||true +id1_alpha=ch.psi.pshell.epics.ChannelDouble|X11MA-ID1:ALPHA|||true +id1_offset=ch.psi.pshell.epics.ChannelDouble|X11MA-ID1:ENERGY-OFFS|||true +id1_harmonic=ch.psi.pshell.epics.ChannelDouble|X11MA-ID1:HARMONIC|||true +id1_done=ch.psi.pshell.epics.ChannelString|X11MA-ID1:DONE|Read||true +id2_mode=ch.psi.pshell.epics.DiscretePositioner|X11MA-ID2:MODE|||true +id2_alpha=ch.psi.pshell.epics.ChannelDouble|X11MA-ID2:ALPHA|||true +id2_offset=ch.psi.pshell.epics.ChannelDouble|X11MA-ID2:ENERGY-OFFS|||true +id2_harmonic=ch.psi.pshell.epics.ChannelDouble|X11MA-ID2:HARMONIC|||true +id2_done=ch.psi.pshell.epics.ChannelString|X11MA-ID2:DONE|Read||true +energy=ch.psi.pshell.epics.ChannelDouble|X11PHS-E:GO.A|||true +energy_opt=ch.psi.pshell.epics.ChannelString|X11PHS-E:OPT|||true id_error=ch.psi.pshell.epics.ChannelInteger|X11MA-ID2-PLC:ERROR|||true beam_status=ch.psi.pshell.epics.DiscretePositioner|ACOAU-ACCU:OP-MODE|Read||true edata=ch.psi.pshell.epics.ChannelDoubleArray|EDATA 3|Read|| diff --git a/config/settings.properties b/config/settings.properties index ca1b0c3..bcb5952 100644 --- a/config/settings.properties +++ b/config/settings.properties @@ -1,16 +1,16 @@ -#Tue Sep 22 10:55:47 CEST 2020 +#Tue Sep 29 10:36:31 CEST 2020 HARMONIC_ID_1=1 -ENERGY=720.3 +ENERGY=639.2 OUTLIERS_THRESHOLD=1000000000 -POL_ID_1=Lin_Ver +POL_ID_1=Circ_Plus NORM_FILE=/sls/X11MA/data/X11MA/Data1/public/PEEM/2020_09/i1904_1_0.tif AUTO_SWITCH_VALVE=true DRY_RUN=false -ALPHA_ID_2=0.0 -ALPHA_ID_1=0.0 -POL_ID_2=Lin_Hor -OFFSET_ID_1=-0.2 -ID=ID1_ID2 -OFFSET_ID_2=-1.3 +ALPHA_ID_2=45.0 +ALPHA_ID_1=15.0 +POL_ID_2=Lin_Ver +OFFSET_ID_1=-1.5 +ID=ID2 +OFFSET_ID_2=-1.5 HARMONIC_ID_2=1 FdaBrowser=true diff --git a/config/variables.properties b/config/variables.properties index 93eb476..6ff24f0 100644 --- a/config/variables.properties +++ b/config/variables.properties @@ -1,2 +1,2 @@ -#Tue Sep 22 11:22:50 CEST 2020 -FileSequentialNumber=2124 +#Tue Sep 29 04:32:04 CEST 2020 +FileSequentialNumber=2333 diff --git a/devices/image.properties b/devices/image.properties index 3d1f437..17e7b65 100644 --- a/devices/image.properties +++ b/devices/image.properties @@ -1,4 +1,4 @@ -#Tue Sep 22 11:17:20 CEST 2020 +#Fri Sep 25 21:06:12 CEST 2020 spatialCalOffsetY=NaN spatialCalOffsetX=NaN colormapLogarithmic=false @@ -6,7 +6,7 @@ scale=1.0 grayscale=false spatialCalScaleX=NaN spatialCalScaleY=NaN -colormapMax=300.0 +colormapMax=0.5 rescaleOffset=0.0 roiWidth=-1 colormap=Grayscale diff --git a/plugins/Eiger.form b/plugins/Eiger.form index e0808fa..71fc3ee 100644 --- a/plugins/Eiger.form +++ b/plugins/Eiger.form @@ -22,7 +22,7 @@ - + @@ -229,60 +229,69 @@ + - - - - - - - - - - - - + + + + + - - - - - - - + + + + + + - + + + + + + + + + - - - - - + + + + + + + + + - + + + - + - + + + - + @@ -305,6 +314,9 @@ + + + @@ -331,10 +343,26 @@ - - - - + + + + + + + + + + + + + + + + + + + + @@ -344,24 +372,28 @@ - - - + + + + - - - + + + + - - - + + + + - - - + + + + @@ -371,7 +403,7 @@ - + @@ -385,6 +417,9 @@ + + + @@ -428,6 +463,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -457,32 +512,43 @@ + + + + + + + - + - - - + + + + - - - + + + + - - - + + + + - - - + + + + @@ -492,7 +558,7 @@ - + @@ -506,6 +572,9 @@ + + + @@ -549,6 +618,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -562,7 +651,7 @@ - + @@ -580,6 +669,16 @@ + + + + + + + + + + @@ -777,22 +876,22 @@ - + - - - - - - - - - - - + + + + + + - + + + + + + @@ -808,9 +907,11 @@ - - - + + + + + @@ -894,6 +995,14 @@ + + + + + + + + @@ -929,7 +1038,7 @@ - + @@ -961,12 +1070,23 @@ - - + - - - + + + + + + + + + + + + + + + @@ -974,10 +1094,12 @@ + + - + - + @@ -987,9 +1109,7 @@ - - - + @@ -1008,8 +1128,20 @@ + + + + + + + + + + + + @@ -1028,9 +1160,8 @@ - + - @@ -1039,7 +1170,6 @@ - @@ -1064,11 +1194,6 @@ - - - - - @@ -1101,26 +1226,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -1149,10 +1254,9 @@ - + - @@ -1160,7 +1264,6 @@ - @@ -1185,11 +1288,6 @@ - - - - - @@ -1222,26 +1320,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -1320,6 +1398,28 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -1422,9 +1522,9 @@ - + - + diff --git a/plugins/Eiger.java b/plugins/Eiger.java index f110958..5d56c10 100644 --- a/plugins/Eiger.java +++ b/plugins/Eiger.java @@ -5,6 +5,7 @@ import ch.psi.pshell.imaging.Overlays.Rect; import ch.psi.pshell.imaging.Pen; import ch.psi.pshell.imaging.Renderer; import ch.psi.pshell.imaging.RendererListener; +import ch.psi.pshell.swing.DeviceValuePanel; import ch.psi.pshell.ui.App; import ch.psi.pshell.ui.Panel; import ch.psi.utils.Arr; @@ -12,6 +13,7 @@ import ch.psi.utils.State; import ch.psi.utils.swing.SwingUtils; import java.awt.Component; import java.awt.Dimension; +import java.awt.Font; import java.awt.Point; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -29,6 +31,7 @@ import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JToggleButton; +import javax.swing.SwingConstants; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.filechooser.FileNameExtensionFilter; @@ -54,7 +57,8 @@ public class Eiger extends Panel { Circ_Plus, Circ_Minus, Lin_Hor, - Lin_Ver + Lin_Ver, + Lin } public enum ImgMethod { @@ -78,8 +82,6 @@ public class Eiger extends Panel { comboSwitch.setSelectedIndex(1); SwingUtils.setEnumCombo(comboPol1, Polarization.class, true); SwingUtils.setEnumCombo(comboPol2, Polarization.class, true); - SwingUtils.setEnumCombo(comboImgPol1, Polarization.class, true); - SwingUtils.setEnumCombo(comboImgPol2, Polarization.class, true); SwingUtils.setEnumCombo(comboImgMethod, ImgMethod.class, true); Component[] parameterControls = new Component[0]; @@ -88,6 +90,16 @@ public class Eiger extends Panel { parameterControls = Arr.append(parameterControls, SwingUtils.getComponentsByType(panel, cls)); } } + + Font devValueFont = deviceValuePanel1.getFont().deriveFont(8.0f); + for (Component panel : SwingUtils.getComponentsByType(panelBeamline, DeviceValuePanel.class)){ + ((DeviceValuePanel)panel).getLabel().setFont(devValueFont); + ((DeviceValuePanel)panel).getLabel().setVerticalAlignment(SwingConstants.TOP); + ((DeviceValuePanel)panel).getLabel().setVerticalTextPosition(SwingConstants.TOP); + } + + deviceValuePanel1.getLabel().setVerticalAlignment(SwingConstants.TOP); + deviceValuePanel1.getLabel().setFont(deviceValuePanel1.getFont().deriveFont(8.0f)); parameterControls = Arr.append(parameterControls, SwingUtils.getComponentsByType(panelRoi, JButton.class)); this.parameterControls = parameterControls; setPersistedComponents(parameterControls); @@ -192,6 +204,8 @@ public class Eiger extends Panel { void updateControls() { boolean editable = getState().isInitialized() && !getState().isProcessing(); + boolean is_id1 = comboID.getSelectedIndex() != 1; + boolean is_id2 = comboID.getSelectedIndex() != 0; textDataPath.setEnabled(editable); spinnerSeq.setEnabled(editable); buttonDefaultPath.setEnabled(editable && !textDataPath.getText().equals(DEFAULT_PATH)); @@ -199,17 +213,24 @@ public class Eiger extends Panel { buttonUndoPath.setEnabled(editable && !textDataPath.getText().equals(getContext().getConfig().dataPath)); buttonSetSeq.setEnabled(editable && !spinnerSeq.getValue().equals(getContext().getFileSequentialNumber())); buttonUndoSeq.setEnabled(editable && !spinnerSeq.getValue().equals(getContext().getFileSequentialNumber())); - + buttonApply.setEnabled(editable); + for (Component c : parameterControls) { c.setEnabled(editable); } if (editable) { comboSwitch.setEnabled(comboImgMethod.getSelectedItem() == ImgMethod.Two_Pol.toString()); - comboImgPol1.setEnabled(comboImgMethod.getSelectedItem() == ImgMethod.Two_Pol.toString()); - comboImgPol2.setEnabled(comboImgMethod.getSelectedItem() == ImgMethod.Two_Pol.toString()); spinnerImgEng1.setEnabled(comboImgMethod.getSelectedItem() == ImgMethod.Two_Energies.toString()); - spinnerImgEng2.setEnabled(comboImgMethod.getSelectedItem() == ImgMethod.Two_Energies.toString()); + spinnerImgEng2.setEnabled(comboImgMethod.getSelectedItem() == ImgMethod.Two_Energies.toString()); + spinnerAlp1.setEnabled(is_id1 && (comboPol1.getSelectedItem() == Polarization.Lin.toString())); + spinnerAlp2.setEnabled(is_id2 & (comboPol2.getSelectedItem() == Polarization.Lin.toString())); + spinnerHar1.setEnabled(is_id1 ); + spinnerHar2.setEnabled(is_id2 ); + spinnerOff1.setEnabled(is_id1 ); + spinnerOff2.setEnabled(is_id2 ); + comboPol1.setEnabled(is_id1 ); + comboPol2.setEnabled(is_id2 ); } buttonImgStart.setEnabled(getState() == State.Ready); @@ -298,11 +319,9 @@ public class Eiger extends Panel { args.put("EXPOSURE_1", spinnerImgExp1.getValue()); args.put("AVERAGE_1", spinnerImgAvg1.getValue()); args.put("ENERGY_1", spinnerImgEng1.getValue()); - args.put("POLARIZATION_1", comboImgPol1.getSelectedItem()); args.put("EXPOSURE_2", spinnerImgExp2.getValue()); args.put("AVERAGE_2", spinnerImgAvg2.getValue()); args.put("ENERGY_2", spinnerImgEng2.getValue()); - args.put("POLARIZATION_2", comboImgPol2.getSelectedItem()); runAsync("templates/Eiger2Img", args).handle((ret, t) -> { if ((t != null) && (!getContext().isAborted())) { @@ -432,6 +451,10 @@ public class Eiger extends Panel { spinnerHar1 = new javax.swing.JSpinner(); jLabel8 = new javax.swing.JLabel(); spinnerOff1 = new javax.swing.JSpinner(); + deviceValuePanel2 = new ch.psi.pshell.swing.DeviceValuePanel(); + deviceValuePanel3 = new ch.psi.pshell.swing.DeviceValuePanel(); + deviceValuePanel4 = new ch.psi.pshell.swing.DeviceValuePanel(); + deviceValuePanel5 = new ch.psi.pshell.swing.DeviceValuePanel(); jPanel9 = new javax.swing.JPanel(); jLabel13 = new javax.swing.JLabel(); comboPol2 = new javax.swing.JComboBox<>(); @@ -441,10 +464,16 @@ public class Eiger extends Panel { spinnerHar2 = new javax.swing.JSpinner(); jLabel16 = new javax.swing.JLabel(); spinnerOff2 = new javax.swing.JSpinner(); + deviceValuePanel6 = new ch.psi.pshell.swing.DeviceValuePanel(); + deviceValuePanel7 = new ch.psi.pshell.swing.DeviceValuePanel(); + deviceValuePanel8 = new ch.psi.pshell.swing.DeviceValuePanel(); + deviceValuePanel9 = new ch.psi.pshell.swing.DeviceValuePanel(); buttonApply = new javax.swing.JButton(); jLabel27 = new javax.swing.JLabel(); spinnerImgEng = new javax.swing.JSpinner(); checkAutoValve = new javax.swing.JCheckBox(); + deviceValuePanel1 = new ch.psi.pshell.swing.DeviceValuePanel(); + deviceValuePanel10 = new ch.psi.pshell.swing.DeviceValuePanel(); panelNorm = new javax.swing.JPanel(); buttonSetNorm = new javax.swing.JButton(); textNorm = new javax.swing.JTextField(); @@ -466,6 +495,7 @@ public class Eiger extends Panel { 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(); @@ -475,8 +505,6 @@ public class Eiger extends Panel { spinnerImgExp1 = new javax.swing.JSpinner(); jLabel9 = new javax.swing.JLabel(); spinnerImgAvg1 = new javax.swing.JSpinner(); - jLabel10 = new javax.swing.JLabel(); - comboImgPol1 = new javax.swing.JComboBox<>(); jLabel11 = new javax.swing.JLabel(); spinnerImgEng1 = new javax.swing.JSpinner(); jPanel10 = new javax.swing.JPanel(); @@ -484,8 +512,6 @@ public class Eiger extends Panel { spinnerImgExp2 = new javax.swing.JSpinner(); jLabel17 = new javax.swing.JLabel(); spinnerImgAvg2 = new javax.swing.JSpinner(); - jLabel18 = new javax.swing.JLabel(); - comboImgPol2 = new javax.swing.JComboBox<>(); jLabel19 = new javax.swing.JLabel(); spinnerImgEng2 = new javax.swing.JSpinner(); jLabel21 = new javax.swing.JLabel(); @@ -495,6 +521,10 @@ public class Eiger extends Panel { checkImgAutosave = new javax.swing.JCheckBox(); labelSwitching = new javax.swing.JLabel(); comboSwitch = new javax.swing.JComboBox<>(); + deviceValuePanel11 = new ch.psi.pshell.swing.DeviceValuePanel(); + jLabel22 = new javax.swing.JLabel(); + jLabel28 = new javax.swing.JLabel(); + deviceValuePanel12 = new ch.psi.pshell.swing.DeviceValuePanel(); jPanel3 = new javax.swing.JPanel(); panelSpectrum = new javax.swing.JPanel(); jLabel23 = new javax.swing.JLabel(); @@ -636,12 +666,22 @@ public class Eiger extends Panel { jLabel3.setText("ID:"); comboID.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + comboID.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboIDActionPerformed(evt); + } + }); jPanel7.setBorder(javax.swing.BorderFactory.createTitledBorder("ID1")); - jLabel5.setText("Polarization:"); + jLabel5.setText("Mode:"); comboPol1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + comboPol1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboPol1ActionPerformed(evt); + } + }); jLabel6.setText("Alpha:"); @@ -655,6 +695,14 @@ public class Eiger extends Panel { spinnerOff1.setModel(new javax.swing.SpinnerNumberModel(0.0d, -10.0d, 10.0d, 1.0d)); + deviceValuePanel2.setDeviceName("id1_alpha"); + + deviceValuePanel3.setDeviceName("id1_pol"); + + deviceValuePanel4.setDeviceName("id1_harmonic"); + + deviceValuePanel5.setDeviceName("id1_offset"); + javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7); jPanel7.setLayout(jPanel7Layout); jPanel7Layout.setHorizontalGroup( @@ -668,42 +716,73 @@ public class Eiger extends Panel { .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(spinnerOff1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(spinnerHar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(spinnerAlp1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(comboPol1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(spinnerAlp1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deviceValuePanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(spinnerHar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deviceValuePanel4, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(comboPol1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deviceValuePanel3, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(spinnerOff1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deviceValuePanel5, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {comboPol1, spinnerAlp1, spinnerHar1, spinnerOff1}); + jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deviceValuePanel2, deviceValuePanel3, deviceValuePanel4, deviceValuePanel5}); + jPanel7Layout.setVerticalGroup( jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel7Layout.createSequentialGroup() .addContainerGap() - .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel5) - .addComponent(comboPol1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(deviceValuePanel3, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(comboPol1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel6) - .addComponent(spinnerAlp1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(spinnerAlp1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(deviceValuePanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel7) - .addComponent(spinnerHar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(spinnerHar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(deviceValuePanel4, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel8) - .addComponent(spinnerOff1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(spinnerOff1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(deviceValuePanel5, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); + jPanel7Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {comboPol1, deviceValuePanel3}); + + jPanel7Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deviceValuePanel2, spinnerAlp1}); + + jPanel7Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deviceValuePanel4, spinnerHar1}); + + jPanel7Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deviceValuePanel5, spinnerOff1}); + jPanel9.setBorder(javax.swing.BorderFactory.createTitledBorder("ID2")); - jLabel13.setText("Polarization:"); + jLabel13.setText("Mode:"); comboPol2.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + comboPol2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboPol2ActionPerformed(evt); + } + }); jLabel14.setText("Alpha:"); @@ -717,6 +796,14 @@ public class Eiger extends Panel { spinnerOff2.setModel(new javax.swing.SpinnerNumberModel(0.0d, -10.0d, 10.0d, 1.0d)); + deviceValuePanel6.setDeviceName("id2_pol"); + + deviceValuePanel7.setDeviceName("id2_alpha"); + + deviceValuePanel8.setDeviceName("id2_harmonic"); + + deviceValuePanel9.setDeviceName("id2_offset"); + javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9); jPanel9.setLayout(jPanel9Layout); jPanel9Layout.setHorizontalGroup( @@ -734,6 +821,12 @@ public class Eiger extends Panel { .addComponent(spinnerHar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerAlp2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(comboPol2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(deviceValuePanel6, javax.swing.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE) + .addComponent(deviceValuePanel7, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(deviceValuePanel8, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(deviceValuePanel9, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -743,24 +836,36 @@ public class Eiger extends Panel { jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel9Layout.createSequentialGroup() .addContainerGap() - .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel13) - .addComponent(comboPol2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(deviceValuePanel6, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(comboPol2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel13)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel14) - .addComponent(spinnerAlp2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(deviceValuePanel7, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(spinnerAlp2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel14)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel15) - .addComponent(spinnerHar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(spinnerHar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(deviceValuePanel8, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel16) - .addComponent(spinnerOff2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(spinnerOff2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(deviceValuePanel9, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); + jPanel9Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {comboPol2, deviceValuePanel6}); + + jPanel9Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deviceValuePanel7, spinnerAlp2}); + + jPanel9Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deviceValuePanel8, spinnerHar2}); + + jPanel9Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deviceValuePanel9, spinnerOff2}); + buttonApply.setText("Apply"); buttonApply.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -769,7 +874,7 @@ public class Eiger extends Panel { }); jLabel27.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel27.setText("Energy"); + jLabel27.setText("Energy:"); spinnerImgEng.setModel(new javax.swing.SpinnerNumberModel(1000.0d, 90.0d, 2520.0d, 1.0d)); @@ -780,6 +885,10 @@ public class Eiger extends Panel { } }); + deviceValuePanel1.setDeviceName("energy"); + + deviceValuePanel10.setDeviceName("energy_opt_desc"); + javax.swing.GroupLayout panelBeamlineLayout = new javax.swing.GroupLayout(panelBeamline); panelBeamline.setLayout(panelBeamlineLayout); panelBeamlineLayout.setHorizontalGroup( @@ -787,26 +896,27 @@ public class Eiger extends Panel { .addGroup(panelBeamlineLayout.createSequentialGroup() .addContainerGap() .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(checkAutoValve) .addGroup(panelBeamlineLayout.createSequentialGroup() - .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelBeamlineLayout.createSequentialGroup() - .addComponent(jLabel3) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(comboID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(panelBeamlineLayout.createSequentialGroup() - .addComponent(jLabel27) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(spinnerImgEng, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(checkAutoValve)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(18, 18, 18) - .addComponent(jPanel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(jLabel27) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(deviceValuePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(spinnerImgEng))) .addGroup(panelBeamlineLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(buttonApply, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(comboID, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(deviceValuePanel10, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(panelBeamlineLayout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonApply, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) ); panelBeamlineLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel27, jLabel3}); @@ -815,27 +925,37 @@ public class Eiger extends Panel { panelBeamlineLayout.setVerticalGroup( panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBeamlineLayout.createSequentialGroup() - .addContainerGap() - .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(panelBeamlineLayout.createSequentialGroup() + .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelBeamlineLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(panelBeamlineLayout.createSequentialGroup() .addGap(30, 30, 30) .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(comboID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel3)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deviceValuePanel10, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(panelBeamlineLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel27) .addComponent(spinnerImgEng, 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) + .addComponent(deviceValuePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(checkAutoValve))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(buttonApply) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) ); + panelBeamlineLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deviceValuePanel1, spinnerImgEng}); + + panelBeamlineLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {comboID, deviceValuePanel10}); + panelNorm.setBorder(javax.swing.BorderFactory.createTitledBorder("Normalization")); buttonSetNorm.setText("Select"); @@ -1061,28 +1181,36 @@ public class Eiger extends Panel { } }); + 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.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(rendererRoi, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelRoiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelRoiLayout.createSequentialGroup() - .addGroup(panelRoiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel26) - .addComponent(buttonRoiAdd, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(buttonRoiRemove, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(buttonTriggerDetector, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(1, 1, 1)) - .addComponent(buttonShowDetectorPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) + .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)) + .addGap(13, 13, 13)) + .addGroup(panelRoiLayout.createSequentialGroup() + .addGap(472, 472, 472) + .addComponent(jLabel26) + .addGap(182, 182, 182)) ); - panelRoiLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonRoiAdd, buttonRoiRemove, buttonShowDetectorPanel, buttonTriggerDetector, jScrollPane1}); + panelRoiLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonMeasurements, buttonRoiAdd, buttonRoiRemove, buttonShowDetectorPanel, buttonTriggerDetector, jScrollPane1}); panelRoiLayout.setVerticalGroup( panelRoiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1097,7 +1225,9 @@ public class Eiger extends Panel { .addGap(18, 18, 18) .addComponent(jLabel26) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) + .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) @@ -1133,10 +1263,6 @@ public class Eiger extends Panel { spinnerImgAvg1.setModel(new javax.swing.SpinnerNumberModel(1, 1, 1000, 1)); - jLabel10.setText("Polarization:"); - - comboImgPol1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); - jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel11.setText("Energy:"); @@ -1147,9 +1273,8 @@ public class Eiger extends Panel { jPanel8Layout.setHorizontalGroup( jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel8Layout.createSequentialGroup() - .addContainerGap() + .addGap(14, 14, 14) .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel10, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel11, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel9, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.TRAILING)) @@ -1157,12 +1282,11 @@ public class Eiger extends Panel { .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(spinnerImgExp1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerImgAvg1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(comboImgPol1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerImgEng1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - jPanel8Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {comboImgPol1, spinnerImgAvg1, spinnerImgEng1, spinnerImgExp1}); + jPanel8Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerImgAvg1, spinnerImgEng1, spinnerImgExp1}); jPanel8Layout.setVerticalGroup( jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1179,10 +1303,6 @@ public class Eiger extends Panel { .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel11) .addComponent(spinnerImgEng1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel10) - .addComponent(comboImgPol1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -1198,10 +1318,6 @@ public class Eiger extends Panel { spinnerImgAvg2.setModel(new javax.swing.SpinnerNumberModel(1, 1, 1000, 1)); - jLabel18.setText("Polarization:"); - - comboImgPol2.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); - jLabel19.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel19.setText("Energy:"); @@ -1212,22 +1328,20 @@ public class Eiger extends Panel { jPanel10Layout.setHorizontalGroup( jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel10Layout.createSequentialGroup() - .addContainerGap() + .addGap(14, 14, 14) .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel19, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jLabel18, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel17, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel12, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(spinnerImgExp2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerImgAvg2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(comboImgPol2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerImgEng2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - jPanel10Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {comboImgPol2, spinnerImgAvg2, spinnerImgEng2, spinnerImgExp2}); + jPanel10Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerImgAvg2, spinnerImgEng2, spinnerImgExp2}); jPanel10Layout.setVerticalGroup( jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1244,10 +1358,6 @@ public class Eiger extends Panel { .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel19) .addComponent(spinnerImgEng2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel18) - .addComponent(comboImgPol2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -1273,25 +1383,44 @@ public class Eiger extends Panel { comboSwitch.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + deviceValuePanel11.setDeviceName("id1_pol"); + + jLabel22.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel22.setText("Mode ID1:"); + + jLabel28.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel28.setText("Mode ID2:"); + + deviceValuePanel12.setDeviceName("id2_pol"); + javax.swing.GroupLayout panelImgControlsLayout = new javax.swing.GroupLayout(panelImgControls); panelImgControls.setLayout(panelImgControlsLayout); panelImgControlsLayout.setHorizontalGroup( panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelImgControlsLayout.createSequentialGroup() - .addContainerGap() .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(labelSwitching) - .addComponent(jLabel21) - .addComponent(jLabel20)) + .addComponent(jLabel28, javax.swing.GroupLayout.DEFAULT_SIZE, 99, Short.MAX_VALUE) + .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addGroup(panelImgControlsLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(labelSwitching) + .addComponent(jLabel21) + .addComponent(jLabel20))) + .addGroup(panelImgControlsLayout.createSequentialGroup() + .addGap(22, 22, 22) + .addComponent(jLabel22, javax.swing.GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE)))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(spinnerImgMeasurements) .addComponent(comboImgMethod, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(checkImgAutosave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboSwitch, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(18, 18, Short.MAX_VALUE) + .addComponent(comboSwitch, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(deviceValuePanel11, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(deviceValuePanel12, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) + .addGap(18, 20, Short.MAX_VALUE) .addComponent(jPanel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(18, 18, Short.MAX_VALUE) + .addGap(18, 21, Short.MAX_VALUE) .addComponent(jPanel10, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); @@ -1302,9 +1431,7 @@ public class Eiger extends Panel { panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelImgControlsLayout.createSequentialGroup() .addContainerGap() - .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(panelImgControlsLayout.createSequentialGroup() .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(comboImgMethod, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -1318,8 +1445,18 @@ public class Eiger extends Panel { .addComponent(labelSwitching) .addComponent(comboSwitch, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(checkImgAutosave))) - .addContainerGap()) + .addComponent(checkImgAutosave)) + .addComponent(jPanel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel10, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(24, 24, 24) + .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(jLabel22) + .addComponent(deviceValuePanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelImgControlsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(jLabel28) + .addComponent(deviceValuePanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(34, Short.MAX_VALUE)) ); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); @@ -1346,7 +1483,7 @@ 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, 304, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 250, Short.MAX_VALUE) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonImgStart) .addComponent(buttonImgAbort)) @@ -1493,9 +1630,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, 126, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, 127, Short.MAX_VALUE) .addComponent(checkSpecSwitchPol) - .addGap(0, 121, Short.MAX_VALUE)) + .addGap(0, 122, Short.MAX_VALUE)) .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); @@ -1556,7 +1693,7 @@ public class Eiger extends Panel { layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(jTabbedPane1) + .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 560, Short.MAX_VALUE) .addGap(0, 0, 0)) ); }// //GEN-END:initComponents @@ -1786,12 +1923,33 @@ public class Eiger extends Panel { } }//GEN-LAST:event_spinnerOutliersThresholdStateChanged + private void comboPol1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboPol1ActionPerformed + updateControls(); + }//GEN-LAST:event_comboPol1ActionPerformed + + private void comboPol2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboPol2ActionPerformed + updateControls(); + }//GEN-LAST:event_comboPol2ActionPerformed + + private void comboIDActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboIDActionPerformed + updateControls(); + }//GEN-LAST:event_comboIDActionPerformed + + private void buttonMeasurementsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonMeasurementsActionPerformed + try{ + evalAsync(buttonMeasurements.isSelected() ? "start_measurements()" : "stop_measurements()"); + } catch (Exception ex){ + showException (ex); + } + }//GEN-LAST:event_buttonMeasurementsActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonAdd; private javax.swing.JButton buttonApply; private javax.swing.JButton buttonDefaultPath; private javax.swing.JButton buttonImgAbort; private javax.swing.JButton buttonImgStart; + private javax.swing.JToggleButton buttonMeasurements; private javax.swing.JButton buttonRemove; private javax.swing.JButton buttonRoiAdd; private javax.swing.JButton buttonRoiRemove; @@ -1813,13 +1971,22 @@ public class Eiger extends Panel { private javax.swing.JCheckBox checkSpecWithI0; private javax.swing.JComboBox comboID; private javax.swing.JComboBox comboImgMethod; - private javax.swing.JComboBox comboImgPol1; - private javax.swing.JComboBox comboImgPol2; private javax.swing.JComboBox comboPol1; private javax.swing.JComboBox comboPol2; private javax.swing.JComboBox comboSwitch; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel1; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel10; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel11; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel12; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel2; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel3; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel4; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel5; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel6; + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel7; + 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; @@ -1827,16 +1994,17 @@ 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; private javax.swing.JLabel jLabel21; + private javax.swing.JLabel jLabel22; private javax.swing.JLabel jLabel23; private javax.swing.JLabel jLabel24; private javax.swing.JLabel jLabel25; private javax.swing.JLabel jLabel26; private javax.swing.JLabel jLabel27; + private javax.swing.JLabel jLabel28; private javax.swing.JLabel jLabel29; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel30; diff --git a/script/devices/diag.py b/script/devices/diag.py new file mode 100644 index 0000000..d21a1de --- /dev/null +++ b/script/devices/diag.py @@ -0,0 +1,86 @@ +from collections import OrderedDict + +diag_channels = { \ + #"photon energy": "X11MA-PGM:rbkenergy", \ + #"grating number": "X11MA-PGM:grating", \ + #"cff value": "X11MA-PGM:rbkcff", \ + "diffraction order": "X11MA-PGM:difforder0", \ + #"exit slit size":"X11MA-OP2-SL:TRY.VAL", \ + "front end size":"X11MA-FE-DSAPER", \ + "status fast shutter":"X11MA-VME-ES1:FAST-SHTR", \ + "girder x": "X11MA-HG:X1", \ + "girder y": "X11MA-HG:Y1", \ + "girder z": "X11MA-HG:Z1", \ + "girder pitch": "X11MA-HG:PITCH1", \ + "girder yaw": "X11MA-HG:YAW1", \ + "girder roll set": "X11MA-HG:ROLL_SET", \ + "CMU ox": "X11MA-OP-CM:ox", \ + "CMU oy": "X11MA-OP-CM:oy", \ + "CMU oz": "X11MA-OP-CM:oz", \ + "CMU oRx": "X11MA-OP-CM:oRx", \ + "CMU oRy": "X11MA-OP-CM:oRy", \ + "CMU oRz": "X11MA-OP-CM:oRz", \ + "CMU TRB": "X11MA-OP2-CM:TRB.RBV", \ + #"mode": "X11PHS-E:OPT", \ + #"id1 mode": "X11MA-ID1:MODE", \ + #"id1 offset": "X11MA-ID1:ENERGY-OFFS", \ + #"id1 alpha": "X11MA-ID1:ALPHA", \ + #"id1 harmonic": "X11MA-ID1:HARMONIC", \ + "id1 gap": "X11MA-ID1-GAP:READ", \ + "id1 shift": "X11MA-ID1-SHIFT:READ", \ + #"id2 mode": "X11MA-ID2:MODE", \ + #"id2 offset": "X11MA-ID2:ENERGY-OFFS", \ + #"id2 alpha": "X11MA-ID2:ALPHA", \ + #"id2 harmonic": "X11MA-ID2:HARMONIC", \ + "id2 gap": "X11MA-ID2-GAP:READ", \ + "id2 shift": "X11MA-ID2-SHIFT:READ", \ + "keithley 10 IO": "X11Keithley1-read", \ + #"ring current": "ARIDI-PCT:CURRENT", \ + "PEEM high voltage": "X11MA-ES1-PEEM:UMON", \ + "PEEM leakage current": "X11MA-ES1-PEEM:IMON", \ + "Pressure in PEEM": "X11MA-ES1-MAIN:PRESSURE", \ + "Pressure in Column": "X11MA-ES1-COLU:PRESSURE", \ + "Sample temperature": "X11MA-ES1-SW:Pt100-T", \ + "Pt100 resistance": "X11MA-ES1-SW:Pt100-R", \ + "high voltage": "X11MA-ES1-SD1:cam1:HighVoltage_RBV", \ + } + +diag_devices = { + "photon energy": energy_rbk, \ + "grating number": Grating, \ + "cff value": cff, \ + "exit slit size": ES, \ + "mode": energy_opt, \ + "id1 mode": id1_mode, \ + "id1 offset": id1_offset, \ + "id1 alpha": id1_alpha, \ + "id1 harmonic": id1_harmonic, \ + "id2 mode": id2_mode, \ + "id2 offset": id2_offset, \ + "id2 alpha": id2_alpha, \ + "id2 harmonic": id2_harmonic, \ + "ring current": machine_cur, \ + } + + +def get_diags(): + ret = {} + for k,v in diag_devices.items(): + try: + ret[k]=str(v.read()) + except: + ret[k]="Error: " + sys.exc_info()[1] + for k,v in diag_channels.items(): + try: + ret[k]=caget(v,'s') + except: + ret[k]="Error: " + sys.exc_info()[1] + ret["exposure time"] = str(eiger.getExposure()) + return OrderedDict(sorted(ret.items(), key=lambda i: i[0].lower())) + +def print_diags(): + diags = get_diags() + for k in diags.keys(): + print k + ": " + diags[k] + + diff --git a/script/devices/eiger.py b/script/devices/eiger.py index a70588b..ef53d08 100644 --- a/script/devices/eiger.py +++ b/script/devices/eiger.py @@ -145,22 +145,29 @@ def _save_as_tiff(data, filename, check=False, show = False, metadata={}): ip = load_array(data.matrix) else: ip = data - info = "Timestamp: " + _timestamp(3) - for key,val in metadata.items(): - info = info + "\n" + str(key) + ": " + str(val) - - ip.setProperty("Info", info) - data = get_ip_array(ip) + #info = "Timestamp: " + _timestamp(3) + #for key,val in metadata.items(): + # info = info + "\n" + str(key) + ": " + str(val) + #print "Info:" ,info + #ip.setProperty("Info", info) + metadata["Timestamp"] = time.strftime("%y/%m/%d %H:%M:%S",time.localtime()) + if not os.path.exists(os.path.dirname(filename)): os.makedirs(os.path.dirname(filename)) - save_image(ip, filename,"tiff") + save_image(ip, filename,"tiff", metadata) + + #finfo = open(filename + ".info", "w") + #for k, v in metadata.items(): + # finfo.write(str(k) + ': '+ str(v) + '\n') + #info.close() - if check: + if check: + data = get_ip_array(ip) import java.util.Arrays as Arrays ip=open_image(filename) read = get_ip_array(ip) - print (" ------> Error reading array: " + str(filename)) - + #print (" ------> Error reading array: " + str(filename)) + #TODO: Original checkcode was deleted! def save_as_tiff(data, filename, check=False, show = False, parallel=True, metadata={}): if parallel: diff --git a/script/devices/id.py b/script/devices/id.py index 2bcddfb..c12be89 100644 --- a/script/devices/id.py +++ b/script/devices/id.py @@ -32,8 +32,8 @@ def get_id_pol(id, as_string=False): # 5: LIn if id<1 or id>2: raise Exception("Invalid id") #ret = caget ("X11MA-ID1:MODE" if id==1 else "X11MA-ID2:MODE", 's' if as_string else 'i') - ret = caget ("X11MA-ID1:MODE" if id==1 else "X11MA-ID2:MODE", 'i') - if ret==0: + mode = id1_mode.read() if (id==1) else id2_mode.read() + if mode=="LINEAR": #linear mode alpha = get_alpha_id(id) if alpha==0 : @@ -42,6 +42,12 @@ def get_id_pol(id, as_string=False): ret = 4 else: ret = 5 + elif mode == "CIRC +": + ret = 1 + elif mode == "CIRC -": + ret = 2 + else: + ret = -1 if as_string: for (k,v) in POL_IDS.items(): if v==ret: @@ -51,18 +57,21 @@ def get_id_pol(id, as_string=False): def get_alpha_id(id): if id<1 or id>2: raise Exception("Invalid id") - return caget ("X11MA-ID1:ALPHA" if id==1 else "X11MA-ID2:ALPHA") + return id1_alpha.read() if (id==1) else id2_alpha.read() def put_id_offset(id, v): - if id<1 or id>2: + if id == 1: + id1_offset.write(v) + elif id == 2: + id2_offset.write(v) + else: raise Exception("Invalid id") - caput("X11MA-ID1:ENERGY-OFFS" if (id==1) else "X11MA-ID2:ENERGY-OFFS",v) def get_id_offset(id): if id<1 or id>2: raise Exception("Invalid id") - return caget("X11MA-ID1:ENERGY-OFFS" if (id==1) else "X11MA-ID2:ENERGY-OFFS") + return id1_offset.read() if (id==1) else id2_offset.read() def put_id_pol(id, pol, alpha=None): @@ -71,31 +80,35 @@ def put_id_pol(id, pol, alpha=None): #pol = 3 : Mode =0, alpha = 0 lin hor #pol = 4 : Mode =0, alpha = 90 lin vert #pol = 5 : Mode =0, alpha = ? lin rot + print "Set id" + str(id) + " Pol=" + str(pol) + " Alpha=" + str(alpha) + if id<1 or id>2: raise Exception("Invalid id") - pv1="X11MA-ID1:MODE" if (id==1) else "X11MA-ID2:MODE" - pv2="X11MA-ID1:ALPHA" if (id==1) else "X11MA-ID2:ALPHA" - + mode_dev = id1_mode if (id==1) else id2_mode + alpha_dev = id1_alpha if (id==1) else id2_alpha if is_string(pol): pol=POL_IDS[pol] if pol == 1: - caput(pv1,1) + mode_dev.write("CIRC +") elif pol == 2: - caput(pv1,2) + mode_dev.write("CIRC -") elif pol == 3: - caput(pv1,0) - caput(pv2,0) + mode_dev.write("LINEAR") + time.sleep(0.5) + alpha_dev.write(0) elif pol == 4: - caput(pv1,0) - caput(pv2,90) + mode_dev.write("LINEAR") + time.sleep(0.5) + alpha_dev.write(90) elif pol == 5: - caput(pv1,0) + mode_dev.write("LINEAR") if alpha is not None: - time.sleep(1.0) - caput(pv2,alpha) + time.sleep(0.5) + alpha_dev.write(alpha) + def tune_detune(active_id): offset_1 = float(get_setting("OFFSET_ID_1")) @@ -109,3 +122,34 @@ def tune_detune(active_id): print "Tune ID2" put_id_offset(1, offset_1-40) #detuneID1 put_id_offset(2, offset_2) #tuneID2 + +class IdPol(ReadonlyRegisterBase): + def __init__(self, id): + self.id = id + def doRead(self): + return get_id_pol(self.id, True) + def getName(self): + return "id" + str(self.id) + "_pol" + +add_device(IdPol(1), True) +add_device(IdPol(2), True) +id1_pol.update() +id2_pol.update() +id1_pol.setPolling(2000) +id2_pol.setPolling(2000) + + +class EnOptDesc(ReadonlyRegisterBase): + def doRead(self): + opt = energy_opt.read() + if opt == "PGM": return "PGM" + if opt == "PGM+ID1": return "ID1" + if opt == "PGM+ID2": return "ID2" + if opt == "PGM+ID1+ID2": return "ID1_ID2" + return "" + + def getName(self): + return "energy_opt_desc" + +add_device(EnOptDesc(), True) +energy_opt_desc.setPolling(2000) diff --git a/script/local.py b/script/local.py index fed06d1..e83a2e2 100644 --- a/script/local.py +++ b/script/local.py @@ -235,7 +235,7 @@ def otf(start, end, time, delay = 0.0, mode = None, offset = None, alpha = None, #Devices ################################################################################################### -for dev in ["eiger", "id", "chopper"]: +for dev in ["eiger", "id", "chopper", "diag"]: try: run("devices/" + dev) except: @@ -428,6 +428,65 @@ def put_energy(v): wait_channel(ALL_DONE, 1, type = 'i') +################################################################################################### +#Image measurements +################################################################################################### + +from ijutils import get_measurement, load_array +import ch.psi.pshell.imaging.Filter as Filter +from ch.psi.pshell.imaging.Overlays import Text +import ch.psi.pshell.imaging.Pen as Pen + +class MeasurementsFilter(Filter): + def __init__(self, measurements): + self.overlay = Text(Pen(java.awt.Color.GREEN.darker()), "", \ + java.awt.Font("Verdana", java.awt.Font.PLAIN, 12), java.awt.Point(20,20)) + self.measurements = measurements + self.source = None + self.renderer = None + + def process(self, image, data): + try: + ip = load_array(data.array, data.width, data.height) + msg = "" + if self.measurements is not None: + for measurement in self.measurements: + val = get_measurement(ip,measurement) + msg = msg + "%s = %1.4f\n" % (measurement,val) + self.overlay.update(msg) + except: + self.overlay.update(str(sys.exc_info()[1])) + return image + + def start(self, source, renderer=None): + self.stop() + self.source = source + self.renderer = renderer if (renderer is not None) else show_panel(source) + self.source.setFilter(self) + self.renderer.addOverlay(self.overlay) + + def stop(self): + if self.renderer is not None: + self.renderer.removeOverlay(self.overlay) + if self.source is not None: + self.source.setFilter(None) + self.source = None + self.renderer = None + +filter_measurements = None + +def start_measurements(measurements=["StdDev"], source = image, renderer=None): + global filter_measurements + stop_measurements() + filter_measurements = MeasurementsFilter(measurements) + filter_measurements.start(string_to_obj(source), string_to_obj(renderer)) + +def stop_measurements(): + global filter_measurements + if filter_measurements is not None: + filter_measurements.stop() + filter_measurements = None + ################################################################################################### #Settings ################################################################################################### diff --git a/script/templates/Eiger2Img.py b/script/templates/Eiger2Img.py index b8be596..901439a 100644 --- a/script/templates/Eiger2Img.py +++ b/script/templates/Eiger2Img.py @@ -8,22 +8,23 @@ if get_exec_pars().source == CommandSource.ui: EXPOSURE_1 = 1.0 AVERAGE_1 = 2.0 ENERGY_1 = 850.0 - POLARIZATION_1 = "Circ_Plus" + #POLARIZATION_1 = "Circ_Plus" EXPOSURE_2 = 1.0 AVERAGE_2 = 2.0 ENERGY_2= 900.0 - POLARIZATION_2 = "Circ_Minus" + #POLARIZATION_2 = "Circ_Minus" DRY_RUN = get_dry_run() SHOW_IMAGES = True +SAVE_DIAGS = True 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] +#POLARIZATION = [POLARIZATION_1, POLARIZATION_2] if METHOD == "Two_Energies": for en in [ENERGY_1, ENERGY_2]: @@ -92,19 +93,18 @@ pol_id2=POL_IDS[get_setting("POL_ID_2")] #rbkEnergy=energy_rbk.read() if METHOD == "Two_Pol": - if ID == "ID1": - put_id_pol(1,pol_id1) + if ID == "ID1": current_pol = pol_id1 elif ID == "ID2": - put_id_pol(2,pol_id2) current_pol = pol_id2 elif ID == "ID1_ID2": - put_id_pol(1,pol_id1) - put_id_pol(2,pol_id2) - current_pol=pol_id1 + current_pol=pol_id1 if SWITCHING == "Tune_Detune": tune_detune(1) #Tune ID1, Detune ID2 - wait_channel("X11PHS:alldone", 1) + 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 @@ -161,7 +161,7 @@ def save_image_file(frame, cycle=-1, frame_index=0): 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): filename = get_image_file_name(cycle, frame_index) - threads.append(save_as_tiff(frame, filename, check=False, parallel=True)) + threads.append(save_as_tiff(frame, filename, check=False, parallel=True, metadata=(get_diags() if SAVE_DIAGS else {}))) log(filename) print filename @@ -180,10 +180,7 @@ try: log("nround = " + str(cycle) + " / " + str(MEASUREMENTS)) if METHOD == "Two_Energies": - change_energy(ENERGY_1) - - ###??? SETAR POLARIZATION? - #time.sleep(1) + change_energy(ENERGY_1) for i in range(2): if (cycle == 1) or (METHOD != "Take_Image"): @@ -228,6 +225,7 @@ try: 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) @@ -235,7 +233,18 @@ try: #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) + 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": diff --git a/script/templates/EigerAbsSpec.py b/script/templates/EigerAbsSpec.py index d3eb238..3e03688 100644 --- a/script/templates/EigerAbsSpec.py +++ b/script/templates/EigerAbsSpec.py @@ -11,6 +11,8 @@ if get_exec_pars().source == CommandSource.ui: RANGES = [[500.0, 1000.0, 100.0]] DRY_RUN = get_dry_run() +SAVE_DIAGS = True + log("ROIs: " + str(ROI)) if len(RANGES) == 0: @@ -63,8 +65,8 @@ def grab_image(position, scan): #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) + print filename + save_as_tiff(av, filename, metadata=(get_diags() if SAVE_DIAGS else {})) class Average(ReadableMatrix): def read(self): diff --git a/script/templates/SetupBeamline.py b/script/templates/SetupBeamline.py index 586f8ea..e3f49f1 100644 --- a/script/templates/SetupBeamline.py +++ b/script/templates/SetupBeamline.py @@ -38,26 +38,26 @@ elif ID =='ID1_ID2': if ID == "ID1": #current_pol=POL_IDS[POL_ID_1] #get_id_pol(1) - put_id_pol(1,POL_ID_1) + put_id_pol(1,POL_ID_1, ALPHA_ID_1 if (POL_ID_1=="Lin") else None ) caput('X11MA-ID2-GAP:SET',100) #open Gap ID2 - caput('X11MA-ID1:HARMONIC', int(HARMONIC_ID_1)) + id1_harmonic.write(int(HARMONIC_ID_1)) put_id_offset(1, float(OFFSET_ID_1)) #offset on ID1 elif ID == "ID2": #current_pol=POL_IDS[POL_ID_2]#get_id_pol(2) - put_id_pol(2,POL_ID_2) + put_id_pol(2,POL_ID_2, ALPHA_ID_2 if (POL_ID_2=="Lin") else None ) caput('X11MA-ID1-GAP:SET',100) #open Gap ID1 - caput('X11MA-ID2:HARMONIC', int(HARMONIC_ID_2)) + id2_harmonic.write(int(HARMONIC_ID_2)) put_id_offset(2, float(OFFSET_ID_2)) #offset on ID2 elif ID == "ID1_ID2": #polID1=POL_IDS[POL_ID_1] #polID2=POL_IDS[POL_ID_2] - put_id_pol(1,POL_ID_1) - put_id_pol(2,POL_ID_2) + put_id_pol(1,POL_ID_1, ALPHA_ID_1 if (POL_ID_1=="Lin") else None ) + put_id_pol(2,POL_ID_2, ALPHA_ID_2 if (POL_ID_2=="Lin") else None ) #current_pol=polID1 - caput('X11MA-ID1:HARMONIC', int(HARMONIC_ID_1)) - caput('X11MA-ID2:HARMONIC', int(HARMONIC_ID_2)) + id1_harmonic.write(int(HARMONIC_ID_1)) + id2_harmonic.write(int(HARMONIC_ID_2)) put_id_offset(1, float(OFFSET_ID_1)) #offset on ID1 put_id_offset(2, float(OFFSET_ID_2)) #offset on ID2 diff --git a/script/test/Diagnostics.py b/script/test/Diagnostics.py new file mode 100644 index 0000000..3bb8659 --- /dev/null +++ b/script/test/Diagnostics.py @@ -0,0 +1,89 @@ +from collections import OrderedDict + +diag_channels = { \ + #"photon energy": "X11MA-PGM:rbkenergy", \ + #"grating number": "X11MA-PGM:grating", \ + #"cff value": "X11MA-PGM:rbkcff", \ + "diffraction order": "X11MA-PGM:difforder0", \ + #"exit slit size":"X11MA-OP2-SL:TRY.VAL", \ + "front end size":"X11MA-FE-DSAPER", \ + "status fast shutter":"X11MA-VME-ES1:FAST-SHTR", \ + "girder x": "X11MA-HG:X1", \ + "girder y": "X11MA-HG:Y1", \ + "girder z": "X11MA-HG:Z1", \ + "girder pitch": "X11MA-HG:PITCH1", \ + "girder yaw": "X11MA-HG:YAW1", \ + "girder roll set": "X11MA-HG:ROLL_SET", \ + "CMU ox": "X11MA-OP-CM:ox", \ + "CMU oy": "X11MA-OP-CM:oy", \ + "CMU oz": "X11MA-OP-CM:oz", \ + "CMU oRx": "X11MA-OP-CM:oRx", \ + "CMU oRy": "X11MA-OP-CM:oRy", \ + "CMU oRz": "X11MA-OP-CM:oRz", \ + "CMU TRB": "X11MA-OP2-CM:TRB.RBV", \ + #"mode": "X11PHS-E:OPT", \ + #"id1 mode": "X11MA-ID1:MODE", \ + #"id1 offset": "X11MA-ID1:ENERGY-OFFS", \ + #"id1 alpha": "X11MA-ID1:ALPHA", \ + #"id1 harmonic": "X11MA-ID1:HARMONIC", \ + "id1 gap": "X11MA-ID1-GAP:READ", \ + "id1 shift": "X11MA-ID1-SHIFT:READ", \ + #"id2 mode": "X11MA-ID2:MODE", \ + #"id2 offset": "X11MA-ID2:ENERGY-OFFS", \ + #"id2 alpha": "X11MA-ID2:ALPHA", \ + #"id2 harmonic": "X11MA-ID2:HARMONIC", \ + "id2 gap": "X11MA-ID2-GAP:READ", \ + "id2 shift": "X11MA-ID2-SHIFT:READ", \ + "keithley 10 IO": "X11Keithley1-read", \ + #"ring current": "ARIDI-PCT:CURRENT", \ + "PEEM high voltage": "X11MA-ES1-PEEM:UMON", \ + "PEEM leakage current": "X11MA-ES1-PEEM:IMON", \ + "Pressure in PEEM": "X11MA-ES1-MAIN:PRESSURE", \ + "Pressure in Column": "X11MA-ES1-COLU:PRESSURE", \ + "Sample temperature": "X11MA-ES1-SW:Pt100-T", \ + "Pt100 resistance": "X11MA-ES1-SW:Pt100-R", \ + "high voltage": "X11MA-ES1-SD1:cam1:HighVoltage_RBV", \ + } + +diag_devices = { + "photon energy": energy_rbk, \ + "grating number": Grating, \ + "cff value": cff, \ + "exit slit size": ES, \ + "mode": energy_opt, \ + "id1 mode": id1_mode, \ + "id1 offset": id1_offset, \ + "id1 alpha": id1_alpha, \ + "id1 harmonic": id1_harmonic, \ + "id2 mode": id2_mode, \ + "id2 offset": id2_offset, \ + "id2 alpha": id2_alpha, \ + "id2 harmonic": id2_harmonic, \ + "ring current": machine_cur, \ + } + + +def get_diags(): + ret = {} + for k,v in diag_devices.items(): + try: + ret[k]=str(v.read()) + except: + ret[k]="Error: " + sys.exc_info()[1] + for k,v in diag_channels.items(): + try: + ret[k]=caget(v,'s') + except: + ret[k]="Error: " + sys.exc_info()[1] + ret["exposure time"] = str(eiger.getExposure()) + return OrderedDict(sorted(ret.items(), key=lambda i: i[0].lower())) + +def print_diags(): + diags = get_diags() + for k in diags.keys(): + print k + ": " + diags[k] + + +#- exposure time +#- mode: normal or tune/detune +