diff --git a/athos-screens/gradle.properties b/athos-screens/gradle.properties
index bba6f39..70e582e 100644
--- a/athos-screens/gradle.properties
+++ b/athos-screens/gradle.properties
@@ -1 +1,3 @@
-action.debug.args=debug --args="-b -d -l -k -n -q -statusbar -persist -console_log=SEVERE -frame_rate=1.1 -p ch.psi.athos.AthosScreens -laf=dark -pipeline_server localhost:8889 -camera_server localhost:8888 ch.psi.jcae.ContextFactory.addressList=localhost:54321"\n
+action.custom-1=rpm
+action.custom-1.args=--configure-on-demand -w -x check -x test rpm
+action.debug.args=debug --args="-b -d -l -k -n -q -statusbar -persist -console_log SEVERE -frame_rate 1.1 -p ch.psi.athos.AthosScreens -cam simulation -laf=dark -pipeline_server localhost:8889 -camera_server localhost:8888 ch.psi.jcae.ContextFactory.addressList=localhost:54321"\n
diff --git a/athos-screens/scripts/app_startup b/athos-screens/scripts/app_startup
index 2c3ffc7..c7fd04e 100644
--- a/athos-screens/scripts/app_startup
+++ b/athos-screens/scripts/app_startup
@@ -1,7 +1,6 @@
#!/bin/sh
export PSHELL_EX_OPTIONS=${ex_options}
-APP_ARGS_NAME=\$(echo "APP_${app_name}" | tr '[:lower:]' '[:upper:]')_ARGS
-APP_ARGS_NAME=\${APP_ARGS_NAME//-/_}
+export PSHELL_CLASS_PATH=${jar_file}
-# Run the JAR with all passed arguments
-exec pshell-workbench -b -d -l -k -n -q -statusbar -persist -console_log=SEVERE -frame_rate=1.1 -p ${jar_file} \${!APP_ARGS_NAME} "\$@"
+# Run the plugin with application specific arguments, and all command-line passed arguments
+exec pshell-workbench -b -d -l -k -n -q -statusbar -persist -console_log=SEVERE -frame_rate 1.1 -p ${jar_file} \$${app_args_var} "\$@"
diff --git a/build.gradle b/build.gradle
index 5039d43..272c19a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,6 +12,7 @@ allprojects {
ext.ex_options= ''
ext.deploy_type= 'java'
ext.readonly = true
+ ext.plugin = ''
repositories {
mavenLocal()
@@ -90,19 +91,20 @@ subprojects {
def deploy_type = project.ext.deploy_type
def readonly = project.ext.readonly
def package_name = project.name
+ def plugin = project.plugin
def app_path = '/opt/' + package_name + "/" + app_version
def jar_file_name = app_name + "-" + app_version + ".jar";
def jar_file_path = app_path + '/lib/' + jar_file_name;
def fat_jar_file_name = app_name + "-" + app_version + "-" + jar_suffix + ".jar";
def fat_jar_file_path = app_path + '/lib/' + fat_jar_file_name;
- def main_class = project.mainClass
def sys_bin ='/usr/local/bin/'
def sys_lib ='/usr/local/lib/'
def bin_file_name = "${app_name}-${app_version}"
- def java_file_name = (deploy_type=='pkg') ? app_description + ".java" : main_class + ".java"
+ def plugin_file = plugin + ".java"
def editor = bin_file_name + "-editor"
def file_mode = readonly ? 0644: 0777
//def dir_mode = readonly ? 0755: 0777
+ def app_args_var = "APP_${app_name.replace('-', '_').toUpperCase()}_ARGS"
project.tasks.register("rpm", Rpm) {
doFirst {
@@ -143,7 +145,7 @@ subprojects {
if (deploy_type=='java'){
from ('src/main/java') {
- include java_file_name
+ include plugin_file
into 'lib'
fileMode file_mode
}
@@ -176,9 +178,10 @@ subprojects {
expand([
"app_name": app_name,
"app_version": app_version,
+ "app_args_var": app_args_var,
"jar_file": jar_file_path,
"fat_jar_file": fat_jar_file_path,
- "java_file": (deploy_type=='pkg') ? java_file_name : app_path + '/lib/' + java_file_name,
+ "java_file": (deploy_type=='pkg') ? plugin_file : app_path + '/lib/' + plugin_file,
"pkg_folder": app_path + '/lib',
"ex_options" :ex_options
])
diff --git a/correlation/build.gradle b/correlation/build.gradle
index a489dbc..9e3a398 100644
--- a/correlation/build.gradle
+++ b/correlation/build.gradle
@@ -1,7 +1,8 @@
description = 'correlation'
+ext.plugin = 'Correlation'
ext.mainClass = hasProperty('mainClass') ? mainClass : 'ch.psi.pshell.workbench.App'
ext.title = 'Correlation'
-ext.desc = 'Correlation' //The plugin class
+ext.desc = 'Correlation'
ext.readonly = true
ext.deploy_type= 'pkg'
diff --git a/correlation/scripts/app_editor b/correlation/scripts/app_editor
index b0c230c..afc4f3e 100644
--- a/correlation/scripts/app_editor
+++ b/correlation/scripts/app_editor
@@ -1,8 +1,7 @@
#!/bin/sh
-APP_ARGS_NAME=\$(echo "APP_${app_name}" | tr '[:lower:]' '[:upper:]')_ARGS
-APP_ARGS_NAME=\${APP_ARGS_NAME//-/_}
-exec pshell-workbench -b -l -g -nbcf \${!APP_ARGS_NAME} \
+# Run the workbench configured with the package paths, loading the plugin.
+exec pshell-workbench -b -l -g -nbcf \$${app_args_var} \
-plgp ${pkg_folder}/plugins \
-scpt ${pkg_folder}/script \
-devp ${pkg_folder}/devices \
diff --git a/correlation/scripts/app_startup b/correlation/scripts/app_startup
index c44965a..b8a24ce 100644
--- a/correlation/scripts/app_startup
+++ b/correlation/scripts/app_startup
@@ -1,7 +1,5 @@
#!/bin/sh
-APP_ARGS_NAME=\$(echo "APP_${app_name}" | tr '[:lower:]' '[:upper:]')_ARGS
-APP_ARGS_NAME=\${APP_ARGS_NAME//-/_}
-# Run the package with all passed arguments
-exec pshell-workbench -b -d -l -k -g -q -statusbar -size=1000x700 -console_log=SEVERE -m ${pkg_folder} \${!APP_ARGS_NAME} "\$@"
+# Run the package with application specific arguments, and all command-line passed arguments
+exec pshell-workbench -b -d -l -k -g -q -nbcf -statusbar -size=1000x700 -console_log=SEVERE -m ${pkg_folder} \$${app_args_var} "\$@"
diff --git a/correlation/src/main/pkg/config/devices.properties b/correlation/src/main/pkg/config/devices.properties
index b0992e6..5fca881 100755
--- a/correlation/src/main/pkg/config/devices.properties
+++ b/correlation/src/main/pkg/config/devices.properties
@@ -1,2 +1,2 @@
-dispatcher=ch.psi.pshell.bs.Dispatcher|https://dispatcher-api.psi.ch/sf|||
-cam_server=ch.psi.pshell.bs.PipelineServer|sf-daqsync-01:8889|||
+#dispatcher=ch.psi.pshell.bs.Dispatcher|https://dispatcher-api.psi.ch/sf|||
+
diff --git a/correlation/src/main/pkg/script/local.py b/correlation/src/main/pkg/script/local.py
new file mode 100644
index 0000000..954f626
--- /dev/null
+++ b/correlation/src/main/pkg/script/local.py
@@ -0,0 +1,3 @@
+
+add_device(PipelineSource("cam_server"), True)
+add_device(Dispatcher("dispatcher"), True)
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..e322dcd
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1 @@
+netbeans.hint.jdkPlatform=JDK_21
diff --git a/persplot/build.gradle b/persplot/build.gradle
index 3203913..d6d28ea 100644
--- a/persplot/build.gradle
+++ b/persplot/build.gradle
@@ -1,4 +1,5 @@
description = 'persplot'
+ext.plugin = 'PersistencePlot'
ext.mainClass = hasProperty('mainClass') ? mainClass : 'ch.psi.pshell.workbench.App'
ext.title = 'PersPlot'
ext.desc = 'PersPlot'
diff --git a/persplot/scripts/app_startup b/persplot/scripts/app_startup
index 7985300..fa36879 100644
--- a/persplot/scripts/app_startup
+++ b/persplot/scripts/app_startup
@@ -1,6 +1,4 @@
#!/bin/sh
-APP_ARGS_NAME=\$(echo "APP_${app_name}" | tr '[:lower:]' '[:upper:]')_ARGS
-APP_ARGS_NAME=\${APP_ARGS_NAME//-/_}
-# Run the JAR with all passed arguments
-exec pshell-workbench -b -d -l -k -n -q -console_log=SEVERE -p ${java_file} \${!APP_ARGS_NAME} "\$@"
+# Run the plugin with application specific arguments, and all command-line passed arguments
+exec pshell-workbench -b -d -l -k -n -q -console_log=SEVERE -p ${java_file} \$${app_args_var} "\$@"
diff --git a/psss-panel/build.gradle b/psss-panel/build.gradle
index f42ccef..a785b84 100644
--- a/psss-panel/build.gradle
+++ b/psss-panel/build.gradle
@@ -1,11 +1,21 @@
description = 'psss-panel'
+ext.plugin = 'PSSS'
ext.mainClass = hasProperty('mainClass') ? mainClass : 'ch.psi.pshell.workbench.App'
ext.title = 'PSSS Panel'
ext.desc = 'PSSS panel'
+ext.readonly = false
ext.deploy_type= 'pkg'
dependencies {
implementation 'ch.psi:pshell-workbench:' + version
- }
+}
+
+sourceSets {
+ main {
+ java {
+ srcDirs = ['src/main/pkg/plugins']
+ }
+ }
+}
createDefaultTasks(project)
diff --git a/psss-panel/scripts/app_editor b/psss-panel/scripts/app_editor
new file mode 100644
index 0000000..afc4f3e
--- /dev/null
+++ b/psss-panel/scripts/app_editor
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# Run the workbench configured with the package paths, loading the plugin.
+exec pshell-workbench -b -l -g -nbcf \$${app_args_var} \
+ -plgp ${pkg_folder}/plugins \
+ -scpt ${pkg_folder}/script \
+ -devp ${pkg_folder}/devices \
+ -pool ${pkg_folder}/config/devices.properties \
+ -p ${java_file} \
+ "\$@"
\ No newline at end of file
diff --git a/psss-panel/scripts/app_startup b/psss-panel/scripts/app_startup
new file mode 100644
index 0000000..0929313
--- /dev/null
+++ b/psss-panel/scripts/app_startup
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+//TODO: -py3
+
+# Run the package with application specific arguments, and all command-line passed arguments
+exec pshell-workbench -b -d -l -k -g -q -statusbar -size=1000x700 -console_log=SEVERE -m ${pkg_folder} \$${app_args_var} "\$@"
+
diff --git a/psss-panel/src/main/pkg/config/devices.properties b/psss-panel/src/main/pkg/config/devices.properties
new file mode 100755
index 0000000..1a9eafc
--- /dev/null
+++ b/psss-panel/src/main/pkg/config/devices.properties
@@ -0,0 +1,16 @@
+psss_fwhm_avg=ch.psi.pshell.epics.ChannelDouble|SARFE10-PSSS059:REL-E-SPREAD|||true
+dispatcher=ch.psi.pshell.bs.Dispatcher|https://dispatcher-api.psi.ch/sf|||
+cam_server=ch.psi.pshell.bs.PipelineServer|sf-daqsync-01:8889|||
+energy_machine=ch.psi.pshell.epics.ChannelDouble|SARFE10-PBPG050:ENERGY|||true
+psss_energy=ch.psi.pshell.epics.ChannelDouble|SARFE10-PSSS059:ENERGY|||true
+psss_spectrum_x=ch.psi.pshell.epics.ChannelDoubleArray|SARFE10-PSSS059:SPECTRUM_X -1 -3|||true
+psss_spectrum_y=ch.psi.pshell.epics.ChannelDoubleArray|SARFE10-PSSS059:SPECTRUM_Y -1 -3|||true
+psss_center=ch.psi.pshell.epics.ChannelDouble|SARFE10-PSSS059:SPECTRUM_CENTER|||true
+psss_fwhm=ch.psi.pshell.epics.ChannelDouble|SARFE10-PSSS059:SPECTRUM_FWHM|||true
+psss_roi_min=ch.psi.pshell.epics.ChannelInteger|SARFE10-PSSS059:SPC_ROI_YMIN|||true
+psss_roi_max=ch.psi.pshell.epics.ChannelInteger|SARFE10-PSSS059:SPC_ROI_YMAX|||true
+histo_center=ch.psi.pshell.device.HistogramGenerator|psss_center|||true
+histo_fwhm=ch.psi.pshell.device.HistogramGenerator|psss_fwhm|||true
+psss_spectrum_y_average=ch.psi.pshell.device.ArrayAverager|psss_spectrum_y|||true
+psss_center_average=ch.psi.pshell.device.Averager|psss_center|||true
+psss_fwhm_average=ch.psi.pshell.device.Averager|psss_fwhm|||true
diff --git a/psss-panel/src/main/pkg/config/jcae.properties b/psss-panel/src/main/pkg/config/jcae.properties
new file mode 100755
index 0000000..0e02d88
--- /dev/null
+++ b/psss-panel/src/main/pkg/config/jcae.properties
@@ -0,0 +1,12 @@
+#Mon Feb 22 20:35:07 CET 2021
+ch.psi.jcae.ContextFactory.addressList=
+ch.psi.jcae.ContextFactory.serverPort=
+ch.psi.jcae.ContextFactory.maxArrayBytes=50000000
+ch.psi.jcae.ChannelFactory.retries=1
+ch.psi.jcae.ChannelFactory.timeout=1250
+ch.psi.jcae.impl.DefaultChannelService.retries=4
+ch.psi.jcae.impl.DefaultChannelService.timeout=1000
+ch.psi.jcae.ContextFactory.autoAddressList=true
+ch.psi.jcae.ContextFactory.useShellVariables=true
+ch.psi.jcae.ContextFactory.addLocalBroadcastInterfaces=false
+ch.psi.jcae.ContextFactory.maxSendArrayBytes=1000000
diff --git a/psss-panel/src/main/pkg/devices/cam_server.properties b/psss-panel/src/main/pkg/devices/cam_server.properties
new file mode 100755
index 0000000..7f7cedb
--- /dev/null
+++ b/psss-panel/src/main/pkg/devices/cam_server.properties
@@ -0,0 +1,25 @@
+#Mon Jan 17 16:00:40 CET 2022
+spatialCalOffsetY=-50.02549719530852
+spatialCalOffsetX=-50.01953888237593
+colormapLogarithmic=false
+scale=1.0
+grayscale=false
+spatialCalScaleX=-1.0
+spatialCalScaleY=-1.0
+colormapMax=255.0
+rescaleOffset=0.0
+roiWidth=-1
+colormap=Temperature
+invert=false
+colormapMin=0.0
+rotationCrop=false
+rotation=0.0
+rescaleFactor=1.0
+spatialCalUnits=mm
+flipVertically=false
+roiHeight=-1
+flipHorizontally=false
+colormapAutomatic=true
+roiY=0
+roiX=0
+transpose=false
diff --git a/psss-panel/src/main/pkg/devices/dispatcher.properties b/psss-panel/src/main/pkg/devices/dispatcher.properties
new file mode 100755
index 0000000..9891517
--- /dev/null
+++ b/psss-panel/src/main/pkg/devices/dispatcher.properties
@@ -0,0 +1,13 @@
+#Wed Jun 03 18:45:57 CEST 2020
+sendStrategy=complete_all
+dropIncomplete=false
+keepListeningOnStop=false
+disableCompression=false
+parallelHandlerProcessing=true
+sendBuildChannelConfig=at_startup
+sendAwaitFirstMessage=false
+socketType=DEFAULT
+validationInconsistency=keep_as_is
+byteBufferAllocator=false
+mappingIncomplete=fill_null
+sendSyncTimeout=0
diff --git a/psss-panel/src/main/pkg/devices/histo_center.properties b/psss-panel/src/main/pkg/devices/histo_center.properties
new file mode 100755
index 0000000..dfccc99
--- /dev/null
+++ b/psss-panel/src/main/pkg/devices/histo_center.properties
@@ -0,0 +1,6 @@
+#Tue Jun 15 11:03:15 CEST 2021
+bins=1000
+min=11400.0
+max=11200.0
+precision=-1
+numberOfSamples=10000
diff --git a/psss-panel/src/main/pkg/devices/histo_fwhm.properties b/psss-panel/src/main/pkg/devices/histo_fwhm.properties
new file mode 100755
index 0000000..da35091
--- /dev/null
+++ b/psss-panel/src/main/pkg/devices/histo_fwhm.properties
@@ -0,0 +1,6 @@
+#Fri Apr 30 07:45:13 CEST 2021
+bins=1000
+min=0.0
+max=40.0
+precision=-1
+numberOfSamples=10000
diff --git a/psss-panel/src/main/pkg/devices/psss_center_average.properties b/psss-panel/src/main/pkg/devices/psss_center_average.properties
new file mode 100755
index 0000000..6a20991
--- /dev/null
+++ b/psss-panel/src/main/pkg/devices/psss_center_average.properties
@@ -0,0 +1,4 @@
+#Mon May 03 09:21:35 CEST 2021
+measures=10
+precision=-1
+interval=-1
diff --git a/psss-panel/src/main/pkg/devices/psss_fwhm_average.properties b/psss-panel/src/main/pkg/devices/psss_fwhm_average.properties
new file mode 100755
index 0000000..6aeec64
--- /dev/null
+++ b/psss-panel/src/main/pkg/devices/psss_fwhm_average.properties
@@ -0,0 +1,4 @@
+#Mon May 03 09:21:52 CEST 2021
+measures=10
+precision=-1
+interval=-1
diff --git a/psss-panel/src/main/pkg/devices/psss_spectrum_y_average.properties b/psss-panel/src/main/pkg/devices/psss_spectrum_y_average.properties
new file mode 100755
index 0000000..2c2e72a
--- /dev/null
+++ b/psss-panel/src/main/pkg/devices/psss_spectrum_y_average.properties
@@ -0,0 +1,5 @@
+#Mon May 03 09:15:04 CEST 2021
+measures=10
+precision=-1
+interval=-1
+integrate=false
diff --git a/psss-panel/src/main/pkg/plugins/PSSS.form b/psss-panel/src/main/pkg/plugins/PSSS.form
new file mode 100755
index 0000000..cab1b86
--- /dev/null
+++ b/psss-panel/src/main/pkg/plugins/PSSS.form
@@ -0,0 +1,715 @@
+
+
+
diff --git a/psss-panel/src/main/pkg/plugins/PSSS.java b/psss-panel/src/main/pkg/plugins/PSSS.java
new file mode 100755
index 0000000..e652bf2
--- /dev/null
+++ b/psss-panel/src/main/pkg/plugins/PSSS.java
@@ -0,0 +1,760 @@
+import ch.psi.pshell.bs.PipelineServer;
+import ch.psi.pshell.core.Context;
+import ch.psi.pshell.epics.ChannelDouble;
+import ch.psi.pshell.imaging.RendererMode;
+import ch.psi.pshell.plot.Plot;
+import ch.psi.pshell.plot.LinePlotJFree;
+import ch.psi.pshell.ui.Panel;
+import ch.psi.utils.Convert;
+import ch.psi.utils.State;
+import ch.psi.utils.Str;
+import java.awt.CardLayout;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+
+/**
+ *
+ */
+public class PSSS extends Panel {
+
+ final String CAMERA_NAME = "SARFE10-PSSS059";
+ PipelineServer pipelineServer;
+ volatile boolean updatingPlot;
+ volatile boolean updatingImage;
+
+ public PSSS() {
+ initComponents();
+ plot.getAxis(Plot.AxisId.X).setLabel(null);
+ plot.getAxis(Plot.AxisId.Y).setLabel(null);
+ renderer.setMode(RendererMode.Stretch);
+ }
+
+ //Overridable callbacks
+ @Override
+ public void onInitialize(int runCount) {
+ startTimer(1000);
+
+ try {
+ setGlobalVar("PSSS_PLOT", plot);
+ setGlobalVar("HISTORY_PLOT", history);
+ setGlobalVar("PSSS_RENDERER", renderer);
+
+ pipelineServer = (PipelineServer) getDevice("cam_server");
+ ((LinePlotJFree)histogramGeneratorPanelCenter.getPlot()).setLegendVisible(true);
+ ((LinePlotJFree)histogramGeneratorFwhm.getPlot()).setLegendVisible(true);
+ histogramGeneratorPanelCenter.getPlot().getAxis(Plot.AxisId.Y).setRange(0, 100);
+ histogramGeneratorFwhm.getPlot().getAxis(Plot.AxisId.Y).setRange(0, 100);
+ //setImageEnabled(true);
+ tabStateChanged(null);
+
+ spinnerAverage.setValue(( (Number) eval("get_psss_averaging()", true)).intValue());
+
+ try{
+ Double energy = (((ChannelDouble)getDevice("energy_machine")).take(-1));
+ energy=Convert.roundDouble(energy, 0);
+ spFromEn.setValue(energy-150);
+ spToEn.setValue(energy+150);
+ } catch (Exception ex) {
+ getLogger().warning("Error reading energy_machine");
+ }
+
+
+ } catch (Exception ex) {
+ getLogger().log(Level.WARNING, null, ex);
+ }
+ }
+
+ @Override
+ public void onStateChange(State state, State former) {
+ this.btStartCr.setEnabled(state == State.Ready);
+ this.btStartEn.setEnabled(state == State.Ready);
+ this.btStartCam.setEnabled(state == State.Ready);
+ radioEnergyScan.setEnabled(state == State.Ready);
+ radioCrystalScan.setEnabled(state == State.Ready);
+ radioCameraScan.setEnabled(state == State.Ready);
+ this.btAbort.setEnabled(state.isRunning());
+ }
+
+ @Override
+ public void onExecutedFile(String fileName, Object result) {
+ }
+
+ @Override
+ public void onTimer() {
+ try {
+ if (!updatingPlot){
+ updatingPlot = true;
+ //evalAsync("plot_psss(PSSS_PLOT, HISTORY_PLOT, " + spinnerAverage.getValue() + ")", true).handle((ret,ex)->{
+ evalAsync("plot_psss(PSSS_PLOT, HISTORY_PLOT)", true).handle((ret,ex)->{
+ updatingPlot = false;
+ return ret;
+ });
+ }
+ if (isImageEnabled()){
+ if (!updatingImage){
+ updatingImage = true;
+ evalAsync("update_psss_image(PSSS_RENDERER)", true).handle((ret,ex)->{
+ updatingImage = false;
+ return ret;
+ });
+ }
+ }
+ } catch (Exception ex) {
+ getLogger().log(Level.WARNING, null, ex);
+ }
+ }
+
+ //Callback to perform update - in event thread
+ @Override
+ protected void doUpdate() {
+ }
+
+ void setImageEnabled(boolean enabled){
+ try{
+ imageEnabled = enabled;
+ evalAsync("enable_psss_image(" + Str.capitalizeFirst(String.valueOf(enabled)) + ", PSSS_RENDERER)", true);
+ } catch (Exception ex) {
+ getLogger().log(Level.WARNING, null, ex);
+ }
+ }
+ volatile boolean imageEnabled;
+
+ boolean isImageEnabled(){
+ return imageEnabled;
+ }
+
+
+ void runScan(String name, Map args){
+ try {
+ args.put("PLOT", plotScan);
+ this.runAsync(name, args).handle((ret,ex)->{
+ if (ex!=null){
+ if (!getContext().isAborted()){
+ showException((Exception)ex);
+ }
+ }
+ return ret;
+ });
+ } catch (Context.ContextStateException ex) {
+ showException(ex);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ buttonGroup1 = new javax.swing.ButtonGroup();
+ tab = new javax.swing.JTabbedPane();
+ jPanel1 = new javax.swing.JPanel();
+ plot = new ch.psi.pshell.plot.LinePlotJFree();
+ history = new ch.psi.pshell.plot.TimePlotJFree();
+ jLabel1 = new javax.swing.JLabel();
+ spinnerAverage = new javax.swing.JSpinner();
+ histogramGeneratorPanelCenter = new ch.psi.pshell.swing.HistogramGeneratorPanel();
+ histogramGeneratorFwhm = new ch.psi.pshell.swing.HistogramGeneratorPanel();
+ jPanel4 = new javax.swing.JPanel();
+ renderer = new ch.psi.pshell.imaging.Renderer();
+ jPanel3 = new javax.swing.JPanel();
+ jPanel2 = new javax.swing.JPanel();
+ btAbort = new javax.swing.JButton();
+ radioEnergyScan = new javax.swing.JRadioButton();
+ radioCameraScan = new javax.swing.JRadioButton();
+ radioCrystalScan = new javax.swing.JRadioButton();
+ jPanel5 = new javax.swing.JPanel();
+ panelScan = new javax.swing.JPanel();
+ panelEnergyScan = new javax.swing.JPanel();
+ spFromEn = new javax.swing.JSpinner();
+ jLabel6 = new javax.swing.JLabel();
+ jLabel7 = new javax.swing.JLabel();
+ spToEn = new javax.swing.JSpinner();
+ spStepsEn = new javax.swing.JSpinner();
+ jLabel8 = new javax.swing.JLabel();
+ jLabel9 = new javax.swing.JLabel();
+ spShotsEn = new javax.swing.JSpinner();
+ btStartEn = new javax.swing.JButton();
+ panelCameraScan = new javax.swing.JPanel();
+ jLabel10 = new javax.swing.JLabel();
+ spFromCam = new javax.swing.JSpinner();
+ jLabel11 = new javax.swing.JLabel();
+ spToCam = new javax.swing.JSpinner();
+ jLabel12 = new javax.swing.JLabel();
+ spStepsCam = new javax.swing.JSpinner();
+ jLabel13 = new javax.swing.JLabel();
+ spShotsCam = new javax.swing.JSpinner();
+ btStartCam = new javax.swing.JButton();
+ panelCrystalScan = new javax.swing.JPanel();
+ jLabel2 = new javax.swing.JLabel();
+ spFromCr = new javax.swing.JSpinner();
+ jLabel3 = new javax.swing.JLabel();
+ spToCr = new javax.swing.JSpinner();
+ jLabel4 = new javax.swing.JLabel();
+ spStepsCr = new javax.swing.JSpinner();
+ jLabel5 = new javax.swing.JLabel();
+ spShotsCr = new javax.swing.JSpinner();
+ btStartCr = new javax.swing.JButton();
+ plotScan = new ch.psi.pshell.plot.LinePlotJFree();
+
+ tab.addChangeListener(new javax.swing.event.ChangeListener() {
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ tabStateChanged(evt);
+ }
+ });
+
+ plot.setTitle("");
+
+ jLabel1.setText("Average:");
+
+ spinnerAverage.setModel(new javax.swing.SpinnerNumberModel(1, 1, 100, 1));
+ spinnerAverage.addChangeListener(new javax.swing.event.ChangeListener() {
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
+ spinnerAverageStateChanged(evt);
+ }
+ });
+
+ histogramGeneratorPanelCenter.setDeviceName("histo_center");
+
+ histogramGeneratorFwhm.setDeviceName("histo_fwhm");
+
+ javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+ jPanel1.setLayout(jPanel1Layout);
+ jPanel1Layout.setHorizontalGroup(
+ jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jLabel1)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerAverage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(history, javax.swing.GroupLayout.DEFAULT_SIZE, 453, Short.MAX_VALUE)
+ .addComponent(plot, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addGap(12, 12, 12)
+ .addComponent(histogramGeneratorFwhm, javax.swing.GroupLayout.PREFERRED_SIZE, 372, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(histogramGeneratorPanelCenter, javax.swing.GroupLayout.PREFERRED_SIZE, 372, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(0, 0, 0))
+ );
+ jPanel1Layout.setVerticalGroup(
+ jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel1)
+ .addComponent(spinnerAverage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(6, 6, 6)
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(histogramGeneratorPanelCenter, javax.swing.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE)
+ .addComponent(plot, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(history, javax.swing.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE)
+ .addComponent(histogramGeneratorFwhm, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
+ );
+
+ tab.addTab("Spectrum", jPanel1);
+
+ javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
+ jPanel4.setLayout(jPanel4Layout);
+ jPanel4Layout.setHorizontalGroup(
+ jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 843, Short.MAX_VALUE)
+ .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(renderer, javax.swing.GroupLayout.DEFAULT_SIZE, 843, Short.MAX_VALUE))
+ );
+ jPanel4Layout.setVerticalGroup(
+ jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 432, Short.MAX_VALUE)
+ .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(renderer, javax.swing.GroupLayout.DEFAULT_SIZE, 432, Short.MAX_VALUE))
+ );
+
+ tab.addTab("Camera", jPanel4);
+
+ btAbort.setText("Abort");
+ btAbort.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btAbortActionPerformed(evt);
+ }
+ });
+
+ buttonGroup1.add(radioEnergyScan);
+ radioEnergyScan.setSelected(true);
+ radioEnergyScan.setText("Energy Scan");
+ radioEnergyScan.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ radioEnergyScanActionPerformed(evt);
+ }
+ });
+
+ buttonGroup1.add(radioCameraScan);
+ radioCameraScan.setText("Camera Scan");
+ radioCameraScan.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ radioCameraScanActionPerformed(evt);
+ }
+ });
+
+ buttonGroup1.add(radioCrystalScan);
+ radioCrystalScan.setText("Crystal Height Scan");
+ radioCrystalScan.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ radioCrystalScanActionPerformed(evt);
+ }
+ });
+
+ panelScan.setLayout(new java.awt.CardLayout());
+
+ spFromEn.setModel(new javax.swing.SpinnerNumberModel(7200.0d, 1.0d, 20000.0d, 10.0d));
+
+ jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel6.setText("Range From:");
+
+ jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel7.setText("Range To:");
+
+ spToEn.setModel(new javax.swing.SpinnerNumberModel(7340.0d, 1.0d, 20000.0d, 10.0d));
+
+ spStepsEn.setModel(new javax.swing.SpinnerNumberModel(20, 1, 1000, 1));
+
+ jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel8.setText("Steps:");
+
+ jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel9.setText("Num Shots:");
+
+ spShotsEn.setModel(new javax.swing.SpinnerNumberModel(100, 1, 1000, 1));
+
+ btStartEn.setText("Start Energy Scan");
+ btStartEn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btStartEnActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout panelEnergyScanLayout = new javax.swing.GroupLayout(panelEnergyScan);
+ panelEnergyScan.setLayout(panelEnergyScanLayout);
+ panelEnergyScanLayout.setHorizontalGroup(
+ panelEnergyScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelEnergyScanLayout.createSequentialGroup()
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(panelEnergyScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelEnergyScanLayout.createSequentialGroup()
+ .addComponent(jLabel7)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spToEn, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelEnergyScanLayout.createSequentialGroup()
+ .addComponent(jLabel6)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spFromEn, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelEnergyScanLayout.createSequentialGroup()
+ .addComponent(jLabel8)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spStepsEn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelEnergyScanLayout.createSequentialGroup()
+ .addComponent(jLabel9)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spShotsEn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addContainerGap())
+ .addComponent(btStartEn, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ );
+
+ panelEnergyScanLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel6, jLabel7, jLabel8, jLabel9});
+
+ panelEnergyScanLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spFromEn, spShotsEn, spStepsEn, spToEn});
+
+ panelEnergyScanLayout.setVerticalGroup(
+ panelEnergyScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelEnergyScanLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelEnergyScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel6)
+ .addComponent(spFromEn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelEnergyScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel7)
+ .addComponent(spToEn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelEnergyScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel8)
+ .addComponent(spStepsEn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelEnergyScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel9)
+ .addComponent(spShotsEn, 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)
+ .addComponent(btStartEn)
+ .addContainerGap())
+ );
+
+ panelScan.add(panelEnergyScan, "energy");
+
+ jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel10.setText("Range From:");
+
+ spFromCam.setModel(new javax.swing.SpinnerNumberModel(-17.0d, -30.0d, 30.0d, 1.0d));
+
+ jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel11.setText("Range To:");
+
+ spToCam.setModel(new javax.swing.SpinnerNumberModel(-11.0d, -30.0d, 30.0d, 1.0d));
+
+ jLabel12.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel12.setText("Steps:");
+
+ spStepsCam.setModel(new javax.swing.SpinnerNumberModel(20, 1, 1000, 1));
+
+ jLabel13.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel13.setText("Num Shots:");
+
+ spShotsCam.setModel(new javax.swing.SpinnerNumberModel(100, 1, 1000, 1));
+
+ btStartCam.setText("Start Camera Scan");
+ btStartCam.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btStartCamActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout panelCameraScanLayout = new javax.swing.GroupLayout(panelCameraScan);
+ panelCameraScan.setLayout(panelCameraScanLayout);
+ panelCameraScanLayout.setHorizontalGroup(
+ panelCameraScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelCameraScanLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelCameraScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelCameraScanLayout.createSequentialGroup()
+ .addComponent(jLabel11)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spToCam, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelCameraScanLayout.createSequentialGroup()
+ .addComponent(jLabel10)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spFromCam, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelCameraScanLayout.createSequentialGroup()
+ .addComponent(jLabel12)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spStepsCam, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelCameraScanLayout.createSequentialGroup()
+ .addComponent(jLabel13)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spShotsCam, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(btStartCam, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ );
+
+ panelCameraScanLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel10, jLabel11, jLabel12, jLabel13});
+
+ panelCameraScanLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spFromCam, spShotsCam, spStepsCam, spToCam});
+
+ panelCameraScanLayout.setVerticalGroup(
+ panelCameraScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelCameraScanLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelCameraScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel10)
+ .addComponent(spFromCam, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelCameraScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel11)
+ .addComponent(spToCam, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelCameraScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel12)
+ .addComponent(spStepsCam, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelCameraScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel13)
+ .addComponent(spShotsCam, 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)
+ .addComponent(btStartCam)
+ .addContainerGap())
+ );
+
+ panelScan.add(panelCameraScan, "camera");
+
+ jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel2.setText("Range From:");
+
+ spFromCr.setModel(new javax.swing.SpinnerNumberModel(-0.8d, -10.0d, 10.0d, 0.1d));
+
+ jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel3.setText("Range To:");
+
+ spToCr.setModel(new javax.swing.SpinnerNumberModel(-1.7d, -10.0d, 10.0d, 0.1d));
+
+ jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel4.setText("Steps:");
+
+ spStepsCr.setModel(new javax.swing.SpinnerNumberModel(20, 1, 1000, 1));
+
+ jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel5.setText("Num Shots:");
+
+ spShotsCr.setModel(new javax.swing.SpinnerNumberModel(100, 1, 1000, 1));
+
+ btStartCr.setText("Start Crystal Height Scan");
+ btStartCr.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btStartCrActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout panelCrystalScanLayout = new javax.swing.GroupLayout(panelCrystalScan);
+ panelCrystalScan.setLayout(panelCrystalScanLayout);
+ panelCrystalScanLayout.setHorizontalGroup(
+ panelCrystalScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelCrystalScanLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelCrystalScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelCrystalScanLayout.createSequentialGroup()
+ .addComponent(jLabel3)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spToCr, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelCrystalScanLayout.createSequentialGroup()
+ .addComponent(jLabel2)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spFromCr, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelCrystalScanLayout.createSequentialGroup()
+ .addComponent(jLabel4)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spStepsCr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(panelCrystalScanLayout.createSequentialGroup()
+ .addComponent(jLabel5)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spShotsCr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(btStartCr, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ );
+
+ panelCrystalScanLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel2, jLabel3, jLabel4, jLabel5});
+
+ panelCrystalScanLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spFromCr, spShotsCr, spStepsCr, spToCr});
+
+ panelCrystalScanLayout.setVerticalGroup(
+ panelCrystalScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelCrystalScanLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelCrystalScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel2)
+ .addComponent(spFromCr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelCrystalScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel3)
+ .addComponent(spToCr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelCrystalScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel4)
+ .addComponent(spStepsCr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelCrystalScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel5)
+ .addComponent(spShotsCr, 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)
+ .addComponent(btStartCr)
+ .addContainerGap())
+ );
+
+ panelScan.add(panelCrystalScan, "crystal");
+
+ javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
+ jPanel5.setLayout(jPanel5Layout);
+ jPanel5Layout.setHorizontalGroup(
+ jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 0, Short.MAX_VALUE)
+ .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel5Layout.createSequentialGroup()
+ .addGap(0, 0, Short.MAX_VALUE)
+ .addComponent(panelScan, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(0, 0, 0)))
+ );
+ jPanel5Layout.setVerticalGroup(
+ jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 0, Short.MAX_VALUE)
+ .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel5Layout.createSequentialGroup()
+ .addGap(0, 0, Short.MAX_VALUE)
+ .addComponent(panelScan, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGap(0, 0, 0)))
+ );
+
+ javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
+ jPanel2.setLayout(jPanel2Layout);
+ jPanel2Layout.setHorizontalGroup(
+ jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel2Layout.createSequentialGroup()
+ .addGap(12, 12, 12)
+ .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+ .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(radioCrystalScan)
+ .addComponent(radioCameraScan)
+ .addComponent(radioEnergyScan)
+ .addComponent(btAbort, javax.swing.GroupLayout.DEFAULT_SIZE, 213, Short.MAX_VALUE))
+ .addContainerGap())
+ );
+ jPanel2Layout.setVerticalGroup(
+ jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
+ .addGap(20, 20, 20)
+ .addComponent(radioEnergyScan)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(radioCameraScan)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(radioCrystalScan)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(btAbort)
+ .addContainerGap())
+ );
+
+ plotScan.setTitle("");
+
+ javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
+ jPanel3.setLayout(jPanel3Layout);
+ jPanel3Layout.setHorizontalGroup(
+ jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel3Layout.createSequentialGroup()
+ .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(0, 0, 0)
+ .addComponent(plotScan, javax.swing.GroupLayout.DEFAULT_SIZE, 614, Short.MAX_VALUE))
+ );
+ jPanel3Layout.setVerticalGroup(
+ jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(plotScan, javax.swing.GroupLayout.DEFAULT_SIZE, 432, Short.MAX_VALUE)
+ );
+
+ tab.addTab("Alignment", jPanel3);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(tab)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(tab, javax.swing.GroupLayout.Alignment.TRAILING)
+ );
+ }// //GEN-END:initComponents
+
+ private void tabStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tabStateChanged
+ setImageEnabled(tab.getSelectedIndex()==1);
+ }//GEN-LAST:event_tabStateChanged
+
+ private void btAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAbortActionPerformed
+ try {
+ abort();
+ } catch (Exception ex) {
+ showException(ex);
+ }
+ }//GEN-LAST:event_btAbortActionPerformed
+
+ private void btStartCrActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btStartCrActionPerformed
+ Map args = new HashMap();
+ args.put("RANGE_FROM", spFromCr.getValue());
+ args.put("RANGE_TO", spToCr.getValue());
+ args.put("STEPS", spStepsCr.getValue());
+ args.put("NUM_SHOTS", spShotsCr.getValue());
+ runScan("psss/CrystalHeightScan",args);
+ }//GEN-LAST:event_btStartCrActionPerformed
+
+ private void btStartCamActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btStartCamActionPerformed
+ Map args = new HashMap();
+ args.put("RANGE_FROM", spFromCam.getValue());
+ args.put("RANGE_TO", spToCam.getValue());
+ args.put("STEPS", spStepsCam.getValue());
+ args.put("NUM_SHOTS", spShotsCam.getValue());
+ runScan("psss/CameraScan",args);
+ }//GEN-LAST:event_btStartCamActionPerformed
+
+ private void btStartEnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btStartEnActionPerformed
+ Map args = new HashMap();
+ args.put("RANGE_OFF", null);
+ args.put("RANGE_FROM", spFromEn.getValue());
+ args.put("RANGE_TO", spToEn.getValue());
+ args.put("STEPS", spStepsEn.getValue());
+ args.put("NUM_SHOTS", spShotsEn.getValue());
+ runScan("psss/EnergyScan",args);
+ }//GEN-LAST:event_btStartEnActionPerformed
+
+ private void radioEnergyScanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioEnergyScanActionPerformed
+ ((CardLayout)panelScan.getLayout()).show(panelScan, "energy");
+ }//GEN-LAST:event_radioEnergyScanActionPerformed
+
+ private void radioCameraScanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioCameraScanActionPerformed
+ ((CardLayout)panelScan.getLayout()).show(panelScan, "camera");
+ }//GEN-LAST:event_radioCameraScanActionPerformed
+
+ private void radioCrystalScanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioCrystalScanActionPerformed
+ ((CardLayout)panelScan.getLayout()).show(panelScan, "crystal");
+ }//GEN-LAST:event_radioCrystalScanActionPerformed
+
+ private void spinnerAverageStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerAverageStateChanged
+ try {
+ eval("set_psss_averaging(" + spinnerAverage.getValue() + ")", true);
+ } catch (Exception ex) {
+ showException(ex);
+ }
+ }//GEN-LAST:event_spinnerAverageStateChanged
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton btAbort;
+ private javax.swing.JButton btStartCam;
+ private javax.swing.JButton btStartCr;
+ private javax.swing.JButton btStartEn;
+ private javax.swing.ButtonGroup buttonGroup1;
+ private ch.psi.pshell.swing.HistogramGeneratorPanel histogramGeneratorFwhm;
+ private ch.psi.pshell.swing.HistogramGeneratorPanel histogramGeneratorPanelCenter;
+ private ch.psi.pshell.plot.TimePlotJFree history;
+ 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;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JLabel jLabel3;
+ private javax.swing.JLabel jLabel4;
+ private javax.swing.JLabel jLabel5;
+ private javax.swing.JLabel jLabel6;
+ private javax.swing.JLabel jLabel7;
+ private javax.swing.JLabel jLabel8;
+ private javax.swing.JLabel jLabel9;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JPanel jPanel2;
+ private javax.swing.JPanel jPanel3;
+ private javax.swing.JPanel jPanel4;
+ private javax.swing.JPanel jPanel5;
+ private javax.swing.JPanel panelCameraScan;
+ private javax.swing.JPanel panelCrystalScan;
+ private javax.swing.JPanel panelEnergyScan;
+ private javax.swing.JPanel panelScan;
+ private ch.psi.pshell.plot.LinePlotJFree plot;
+ private ch.psi.pshell.plot.LinePlotJFree plotScan;
+ private javax.swing.JRadioButton radioCameraScan;
+ private javax.swing.JRadioButton radioCrystalScan;
+ private javax.swing.JRadioButton radioEnergyScan;
+ private ch.psi.pshell.imaging.Renderer renderer;
+ private javax.swing.JSpinner spFromCam;
+ private javax.swing.JSpinner spFromCr;
+ private javax.swing.JSpinner spFromEn;
+ private javax.swing.JSpinner spShotsCam;
+ private javax.swing.JSpinner spShotsCr;
+ private javax.swing.JSpinner spShotsEn;
+ private javax.swing.JSpinner spStepsCam;
+ private javax.swing.JSpinner spStepsCr;
+ private javax.swing.JSpinner spStepsEn;
+ private javax.swing.JSpinner spToCam;
+ private javax.swing.JSpinner spToCr;
+ private javax.swing.JSpinner spToEn;
+ private javax.swing.JSpinner spinnerAverage;
+ private javax.swing.JTabbedPane tab;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/psss-panel/src/main/pkg/script/cpython/psss.py b/psss-panel/src/main/pkg/script/cpython/psss.py
new file mode 100755
index 0000000..e5ce177
--- /dev/null
+++ b/psss-panel/src/main/pkg/script/cpython/psss.py
@@ -0,0 +1,45 @@
+import numpy as np
+from scipy.optimize import curve_fit
+import sys
+
+
+def gaus(x, a, x0, sigma, offset):
+ return offset + a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
+
+#Return [amp, mean_val, sigma, offset]
+def fit_energy(e_from, e_to, steps, num_shots, data):
+ energy_range = np.linspace(e_from, e_to, steps)
+ energy_range_fit = np.linspace(energy_range[0], energy_range[-1], len(energy_range)*10)
+ centre_line_out = data[:,:,int(data.shape[2]/2)].mean(axis=1)
+ try:
+ popt,pcov = curve_fit(gaus,energy_range,centre_line_out,p0=[1,energy_range[np.argmax(centre_line_out)],energy_range.mean()*1e-3,1e3*num_shots])
+ except:
+ raise Exception('Fit failed: spectrum might not be near scan range center \n' + str(sys.exc_info()[1]))
+ #print('Fit failed: spectrum might not be near scan range center')
+ #return None
+ max_ind = np.argmax(centre_line_out)
+ max_photon_energy=energy_range[max_ind]
+ print(max_photon_energy)
+ return popt, centre_line_out
+
+
+#Return [amp, mean_val, sigma, offset]
+def fit_crystal_height(xstal_from, xstal_to, steps, data):
+ xstal_range = np.linspace(xstal_from, xstal_to, steps)
+ projection = data.mean(axis=1).mean(axis=1)
+ offset = np.mean(projection[0:100])
+ signal_centre = xstal_range[np.argmax(projection)]
+ xstal_range_fit = np.linspace(xstal_range[0], xstal_range[-1], len(xstal_range)*10)
+ try:
+ popt,pcov = curve_fit(gaus,xstal_range,projection,p0=[100,signal_centre,-0.2,offset])
+ except:
+ raise Exception('Fit failed: spectrum might not be near scan range center \n' + str(sys.exc_info()[1]))
+ #print('Fit failed: spectrum might not be near scan range center')
+ #return None
+ return popt, projection
+
+
+def get_signal_centre(data, data_range):
+ projection = data.mean(axis=1).mean(axis=1)
+ signal_centre = data_range[np.argmax(projection)]
+ return signal_centre, projection
diff --git a/psss-panel/src/main/pkg/script/cpython/psss_plot.py b/psss-panel/src/main/pkg/script/cpython/psss_plot.py
new file mode 100755
index 0000000..27080e2
--- /dev/null
+++ b/psss-panel/src/main/pkg/script/cpython/psss_plot.py
@@ -0,0 +1,32 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+
+def gaus(x, a, x0, sigma, offset):
+ return offset + a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
+
+def plot_energy(E_from, E_to, steps, Scan_spec, popt, measured_offset):
+ Energy_range = np.linspace(E_from, E_to, steps)
+ centre_line_out = Scan_spec[:,:,int(Scan_spec.shape[2]/2)].mean(axis=1)
+ Energy_range_fit = np.linspace(Energy_range[0], Energy_range[-1], len(Energy_range)*10)
+
+
+ plt.figure(figsize=[10,5])
+ plt.subplot(121)
+ plt.title('PSSS scan of set photon energy')
+ plt.pcolormesh(np.arange(0,Scan_spec.shape[2]), Energy_range, Scan_spec.mean(axis=1),cmap='CMRmap')
+ plt.vlines(int(Scan_spec.shape[2]/2), Energy_range[0], Energy_range[-1],linestyles='--', colors='orange')
+ plt.xlim([0,Scan_spec.shape[2]])
+ plt.xlabel('Camera pixel')
+ plt.ylabel('Set PSSS energy [eV] \n SARFE10-PSSS059:ENERGY')
+
+ plt.subplot(122)
+ plt.title('At camera centre pixel %1i \nCalibrated energy = %.1f [eV]\n Offset from machine = %.1f [eV]'%(int(Scan_spec.shape[2]/2),popt[1],measured_offset))
+ plt.plot(centre_line_out,Energy_range,linewidth = 2, color = 'orange',label ='measured')
+ try:
+ plt.plot(gaus(Energy_range_fit,*popt),Energy_range_fit,'r:',label='fit')
+ except:
+ pass
+ plt.xticks([])
+ plt.legend()
+ plt.grid(True)
\ No newline at end of file
diff --git a/psss-panel/src/main/pkg/script/cpython/wrapper.py b/psss-panel/src/main/pkg/script/cpython/wrapper.py
new file mode 100755
index 0000000..5aa4031
--- /dev/null
+++ b/psss-panel/src/main/pkg/script/cpython/wrapper.py
@@ -0,0 +1,36 @@
+from jeputils import *
+
+RELOAD_CPYTHON = not App.isDetached()
+
+def fit_energy(e_from, e_to, steps, num_shots, data):
+ data = to_array(data, 'd')
+ dims = [len(data), len(data[0]), len(data[0][0])]
+ data = Convert.flatten(data)
+ arr = to_npa(data, dims)
+ popt, centre_line_out = call_jep("cpython/psss", "fit_energy", [e_from, e_to, steps, num_shots, arr], reload=RELOAD_CPYTHON)
+ return popt.getData(), centre_line_out.getData()
+
+def fit_crystal_height(xstal_from, xstal_to, steps, data):
+ data = to_array(data, 'd')
+ dims = [len(data), len(data[0]), len(data[0][0])]
+ data = Convert.flatten(data)
+ arr = to_npa(data, dims)
+ popt, projection = call_jep("cpython/psss", "fit_crystal_height", [xstal_from, xstal_to, steps, arr], reload=RELOAD_CPYTHON)
+ return popt.getData(), projection.getData()
+
+def get_signal_centre(data, data_range):
+ data = to_array(data, 'd')
+ dims = [len(data), len(data[0]), len(data[0][0])]
+ data = Convert.flatten(data)
+ arr = to_npa(data, dims)
+ data_range = to_npa(to_array(data_range, 'd'))
+ signal_centre, projection = call_jep("cpython/psss", "get_signal_centre", [arr, data_range], reload=RELOAD_CPYTHON)
+ return signal_centre, projection.getData()
+
+def plot_energy(e_from, e_to, steps, data, popt, measured_offset):
+ data = to_array(data, 'd')
+ dims = [len(data), len(data[0]), len(data[0][0])]
+ data = Convert.flatten(data)
+ arr = to_npa(data, dims)
+ ret = call_jep("cpython/psss_plot", "plot_energy", [e_from, e_to, steps, arr, popt, measured_offset], reload=RELOAD_CPYTHON)
+ return ret
diff --git a/psss-panel/src/main/pkg/script/local.py b/psss-panel/src/main/pkg/script/local.py
new file mode 100755
index 0000000..6ce8712
--- /dev/null
+++ b/psss-panel/src/main/pkg/script/local.py
@@ -0,0 +1,184 @@
+###################################################################################################
+# Deployment specific global definitions - executed after startup.py
+###################################################################################################
+
+from mathutils import estimate_peak_indexes, fit_gaussians, create_fit_point_list
+from mathutils import fit_polynomial,fit_gaussian, fit_harmonic, calculate_peaks, fit_gaussian_offset
+from mathutils import PolynomialFunction, Gaussian, HarmonicOscillator, GaussianOffset
+from plotutils import plot_function, plot_data
+
+import java.awt.Color as Color
+run("psss/psss")
+
+###################################################################################################
+# DRY RUN
+###################################################################################################
+
+def set_dry_run(value):
+ global dry_run
+ dry_run = value
+
+def is_dry_run():
+ if "dry_run" in globals():
+ return True if dry_run else False
+ return False
+
+
+###################################################################################################
+# Machine utilities
+###################################################################################################
+
+def is_laser_on():
+ return (caget ("SIN-TIMAST-TMA:Beam-Las-Delay-Sel",'d') == 0 )
+
+def is_timing_ok():
+ return caget("SIN-TIMAST-TMA:SOS-COUNT-CHECK") == 0
+
+def get_repetition_rate():
+ return caget("SIN-TIMAST-TMA:Evt-15-Freq-I")
+
+
+###################################################################################################
+# Shortcut to maths utilities
+###################################################################################################
+
+def gfit(ydata, xdata = None):
+ """
+ Gaussian fit
+ """
+ if xdata is None:
+ xdata = frange(0, len(ydata), 1)
+ #ydata = to_list(ydata)
+ #xdata = to_list(xdata)
+ max_y= max(ydata)
+ index_max = ydata.index(max_y)
+ max_x= xdata[index_max]
+ print "Max index:" + str(index_max),
+ print " x:" + str(max_x),
+ print " y:" + str(max_y)
+ gaussians = fit_gaussians(ydata, xdata, [index_max,])
+ (norm, mean, sigma) = gaussians[0]
+ p = plot([ydata],["data"],[xdata], title="Fit" )[0]
+ fitted_gaussian_function = Gaussian(norm, mean, sigma)
+ scale_x = [float(min(xdata)), float(max(xdata)) ]
+ points = max((len(xdata)+1), 100)
+ resolution = (scale_x[1]-scale_x[0]) / points
+ fit_y = []
+ fit_x = frange(scale_x[0],scale_x[1],resolution, True)
+ for x in fit_x:
+ fit_y.append(fitted_gaussian_function.value(x))
+ p.addSeries(LinePlotSeries("fit"))
+ p.getSeries(1).setData(fit_x, fit_y)
+
+ if abs(mean - xdata[index_max]) < ((scale_x[0] + scale_x[1])/2):
+ print "Mean -> " + str(mean)
+ p.addMarker(mean, None, "Mean="+str(round(norm,2)), Color.MAGENTA.darker())
+ return (norm, mean, sigma)
+ else:
+ p.addMarker(max_x, None, "Max="+str(round(max_x,2)), Color.GRAY)
+ print "Invalid gaussian fit: " + str(mean)
+ return (None, None, None)
+
+
+def hfit(ydata, xdata = None):
+ """
+ Harmonic fit
+ """
+ if xdata is None:
+ xdata = frange(0, len(ydata), 1)
+
+ max_y= max(ydata)
+ index_max = ydata.index(max_y)
+ max_x= xdata[index_max]
+
+ start,end = min(xdata), max(xdata)
+ (amplitude, angular_frequency, phase) = fit_harmonic(ydata, xdata)
+ fitted_harmonic_function = HarmonicOscillator(amplitude, angular_frequency, phase)
+
+ print "amplitude = ", amplitude
+ print "angular frequency = ", angular_frequency
+ print "phase = ", phase
+
+ f = angular_frequency/ (2* math.pi)
+ print "frequency = ", f
+
+ resolution = 4.00 # 1.00
+ fit_y = []
+ for x in frange(start,end,resolution, True):
+ fit_y.append(fitted_harmonic_function.value(x))
+ fit_x = frange(start, end+resolution, resolution)
+
+ p = plot(ydata,"data", xdata, title="HFit")[0]
+ p.addSeries(LinePlotSeries("fit"))
+ p.getSeries(1).setData(fit_x, fit_y)
+
+ #m = (phase + math.pi)/ angular_frequency
+ m = -phase / angular_frequency
+ if (m