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