diff --git a/config/devices.properties b/config/devices.properties index 55ec92c..8791863 100755 --- a/config/devices.properties +++ b/config/devices.properties @@ -1,5 +1,10 @@ dispatcher=ch.psi.pshell.bs.Dispatcher|https://dispatcher-api.psi.ch/sf||| cam_server=ch.psi.pshell.bs.PipelineServer|sf-daqsync-01:8889||| +charge=ch.psi.pshell.epics.ProcessVariable|SINEG01-DICT215:B1_CHARGE_AVERAGE-OP||| +rep_rate=ch.psi.pshell.epics.ProcessVariable|SIN-TIMAST-TMA:Beam-Appl-Freq-RB||| +destination_B1=ch.psi.pshell.epics.ChannelString|SF-MODE:MODE_B1 false||| +energy_B1=ch.psi.pshell.epics.ProcessVariable|SF-MODE:ENERGY_B1||| +laser=ch.psi.pshell.epics.ChannelString|SLG-LGEN:WHICH_LASER false||| virtual_accelerator_set=ch.psi.pshell.epics.ChannelDouble|VA-SINBC01-MCRX070:I-SET|||true virtual_accelerator_read=ch.psi.pshell.epics.ChannelDouble|VA-SINBC01-DBPM100:X1|||true gun_solenoid=ch.psi.pshell.epics.Positioner|SINEG01-MSOL130:I-SET SINEG01-MSOL130:I-READ|||true @@ -47,3 +52,4 @@ gsry=ch.psi.pshell.epics.Positioner|SINEG01-MSOL130:ROT_Y_SP SINEG01-MSOL130:ROT #SINEG01-DBPM340:Q=ch.psi.pshell.device.Averager|SINEG01-DBPM340:Q|||true #adc_xh1=ch.psi.pshell.epics.ChannelInteger|SARFE10-PBPG050:HAMP-014-x-h1-DATA-SUM|||true #adc_yh2=ch.psi.pshell.epics.ChannelInteger|SARFE10-PBPG050:HAMP-011-y-h2-DATA-SUM|||true +#blm_raw_test=ch.psi.pshell.epics.ChannelDoubleArray|SINDI02-DBLM025:LOSS_SIGNAL_RAW|||true diff --git a/devices/Beam phase.properties b/devices/Beam phase.properties index 0a1c38a..a37e95c 100644 --- a/devices/Beam phase.properties +++ b/devices/Beam phase.properties @@ -1,4 +1,4 @@ -#Mon Mar 05 09:04:33 CET 2018 +#Mon Apr 16 16:03:57 CEST 2018 maxValue=360.0 minValue=-360.0 offset=0.0 diff --git a/devices/CurrentCamera.properties b/devices/CurrentCamera.properties index 465a681..c2285c0 100644 --- a/devices/CurrentCamera.properties +++ b/devices/CurrentCamera.properties @@ -1,19 +1,16 @@ -#Mon Mar 05 21:23:13 CET 2018 -\u0000\u0000\u0000\u0000= -\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000= -\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000= +#Tue May 15 09:41:57 CEST 2018 colormap=Flame colormapAutomatic=true -colormapMax=18000.0 +colormapMax=1000.0 colormapMin=0.0 flipHorizontally=false flipVertically=false grayscale=false -imageHeight=1200 -imageWidth=1246 +imageHeight=2160 +imageWidth=2560 invert=false -regionStartX=304 -regionStartY=8 +regionStartX=1 +regionStartY=1 rescaleFactor=1.0 rescaleOffset=0.0 roiHeight=-1 @@ -23,11 +20,9 @@ roiY=0 rotation=0.0 rotationCrop=false scale=1.0 -serverURL=localhost\:10000 -spat= -spatialCalOffsetX=-50.01953888237593 -spatialCalOffsetY=-50.02315886984715 -spatialCalScaleX=-1.0 -spatialCalScaleY=-1.0 +spatialCalOffsetX=-430.65350059927124 +spatialCalOffsetY=-251.50913468375813 +spatialCalScaleX=-15.55967346005889 +spatialCalScaleY=-11.299434762455629 spatialCalUnits=null transpose=false diff --git a/devices/Gun Phase.properties b/devices/Gun Phase.properties new file mode 100644 index 0000000..cbd131e --- /dev/null +++ b/devices/Gun Phase.properties @@ -0,0 +1,9 @@ +#Thu May 03 15:36:18 CEST 2018 +maxValue=360.0 +minValue=-90.0 +offset=0.0 +precision=4 +resolution=0.1 +rotation=true +scale=1.0 +unit=deg diff --git a/devices/S10BC01-MQUA100.properties b/devices/S10BC01-MQUA100.properties new file mode 100644 index 0000000..c0bc743 --- /dev/null +++ b/devices/S10BC01-MQUA100.properties @@ -0,0 +1,8 @@ +#Tue Apr 24 11:02:49 CEST 2018 +maxValue=10.0 +minValue=-10.0 +offset=0.0 +precision=3 +resolution=0.007 +scale=1.0 +unit=A diff --git a/devices/S10CB09-RSYS:SET-VSUM-PHASE.properties b/devices/S10CB09-RSYS:SET-VSUM-PHASE.properties new file mode 100644 index 0000000..bc4ad79 --- /dev/null +++ b/devices/S10CB09-RSYS:SET-VSUM-PHASE.properties @@ -0,0 +1,9 @@ +#Sat Apr 28 10:49:47 CEST 2018 +maxValue=0.0 +minValue=0.0 +offset=0.0 +precision=4 +resolution=0.1 +rotation=true +scale=1.0 +unit=deg diff --git a/devices/SINEG01-RSYS:SET-BEAM-PHASE-SIM.properties b/devices/SINEG01-RSYS:SET-BEAM-PHASE-SIM.properties new file mode 100644 index 0000000..79fc5eb --- /dev/null +++ b/devices/SINEG01-RSYS:SET-BEAM-PHASE-SIM.properties @@ -0,0 +1,9 @@ +#Tue Apr 10 14:45:53 CEST 2018 +maxValue=360.0 +minValue=-360.0 +offset=0.0 +precision=3 +resolution=0.1 +rotation=false +scale=1.0 +unit=deg diff --git a/devices/SINEG01-RSYS:SET-BEAM-PHASE.properties b/devices/SINEG01-RSYS:SET-BEAM-PHASE.properties new file mode 100644 index 0000000..9ebc166 --- /dev/null +++ b/devices/SINEG01-RSYS:SET-BEAM-PHASE.properties @@ -0,0 +1,9 @@ +#Mon Apr 16 16:06:31 CEST 2018 +maxValue=360.0 +minValue=-360.0 +offset=0.0 +precision=3 +resolution=0.1 +rotation=false +scale=1.0 +unit=deg diff --git a/devices/STEST01-RSYS:SET-VSUM-PHASE.properties b/devices/STEST01-RSYS:SET-VSUM-PHASE.properties new file mode 100644 index 0000000..a3ae393 --- /dev/null +++ b/devices/STEST01-RSYS:SET-VSUM-PHASE.properties @@ -0,0 +1,9 @@ +#Thu Apr 26 17:13:03 CEST 2018 +maxValue=360.0 +minValue=-90.0 +offset=0.0 +precision=3 +resolution=0.1 +rotation=true +scale=1.0 +unit=deg diff --git a/devices/Test.properties b/devices/Test.properties new file mode 100644 index 0000000..012ef8a --- /dev/null +++ b/devices/Test.properties @@ -0,0 +1,9 @@ +#Wed Mar 28 15:57:27 CEST 2018 +maxValue=NaN +minValue=NaN +offset=0.0 +precision=-1 +resolution=NaN +rotation=false +scale=1.0 +unit=null diff --git a/devices/WireScanner motor.properties b/devices/WireScanner motor.properties index d66a230..47c59db 100644 --- a/devices/WireScanner motor.properties +++ b/devices/WireScanner motor.properties @@ -1,14 +1,14 @@ -#Mon Feb 19 17:21:23 CET 2018 -defaultSpeed=141.4213562373095 +#Mon May 14 14:06:13 CEST 2018 +defaultSpeed=565.685424949238 estbilizationDelay=0 hasEnable=false homingType=None maxSpeed=8000.0 maxValue=51500.0 minSpeed=50.0 -minValue=-56100.0 +minValue=-56300.0 offset=0.0 -precision=2 +precision=1 resolution=0.1 rotation=false scale=1.0 diff --git a/devices/cam_server provider.properties b/devices/cam_server provider.properties new file mode 100644 index 0000000..d5aa04c --- /dev/null +++ b/devices/cam_server provider.properties @@ -0,0 +1,4 @@ +#Thu Apr 05 14:20:51 CEST 2018 +keepListeningOnStop=false +parallelHandlerProcessing=true +socketType=SUB diff --git a/devices/cam_server.properties b/devices/cam_server.properties index a21294c..db1cf09 100644 --- a/devices/cam_server.properties +++ b/devices/cam_server.properties @@ -1,4 +1,4 @@ -#Wed Feb 14 07:23:04 CET 2018 +#Mon May 14 18:41:08 CEST 2018 colormap=Flame colormapAutomatic=true colormapMax=NaN @@ -16,9 +16,9 @@ roiY=0 rotation=0.0 rotationCrop=false scale=1.0 -spatialCalOffsetX=-861.4939970777481 -spatialCalOffsetY=-820.4883730911062 -spatialCalScaleX=-18.90359092620482 -spatialCalScaleY=-19.37984500632817 +spatialCalOffsetX=-797.0771270584523 +spatialCalOffsetY=-195.9069772960574 +spatialCalScaleX=-18.903591543153755 +spatialCalScaleY=-19.379845197810685 spatialCalUnits=mm transpose=false diff --git a/devices/charge.properties b/devices/charge.properties new file mode 100644 index 0000000..ca0c3a1 --- /dev/null +++ b/devices/charge.properties @@ -0,0 +1,8 @@ +#Thu May 03 16:23:33 CEST 2018 +maxValue=NaN +minValue=NaN +offset=0.0 +precision=1 +resolution=NaN +scale=1.0 +unit=pC diff --git a/devices/dispatcher.properties b/devices/dispatcher.properties index 8275407..d09fa10 100644 --- a/devices/dispatcher.properties +++ b/devices/dispatcher.properties @@ -1,8 +1,14 @@ -#Fri Jul 14 11:47:17 CEST 2017 +#Thu Apr 05 14:20:51 CEST 2018 alignmentRetries=20 disableCompression=false dropIncomplete=false keepListeningOnStop=false +mappingIncomplete=fill_null parallelHandlerProcessing=true +sendAwaitFirstMessage=false +sendBuildChannelConfig=at_startup sendIncompleteMessages=true +sendStrategy=complete_all +sendSyncTimeout=0 socketType=DEFAULT +validationInconsistency=keep_as_is diff --git a/devices/energy_B1.properties b/devices/energy_B1.properties new file mode 100644 index 0000000..e3e670b --- /dev/null +++ b/devices/energy_B1.properties @@ -0,0 +1,8 @@ +#Thu May 03 16:25:04 CEST 2018 +maxValue=NaN +minValue=NaN +offset=0.0 +precision=3 +resolution=NaN +scale=1.0 +unit=MeV diff --git a/devices/m1.properties b/devices/m1.properties index ed0cdb0..2d196a2 100755 --- a/devices/m1.properties +++ b/devices/m1.properties @@ -1,4 +1,4 @@ -#Tue Jul 11 15:24:17 CEST 2017 +#Wed Mar 28 14:33:20 CEST 2018 defaultSpeed=1.0 estbilizationDelay=0 maxSpeed=10.0 @@ -10,4 +10,5 @@ precision=2 resolution=NaN rotation=false scale=1.0 +startRetries=1 unit=mm diff --git a/devices/m2.properties b/devices/m2.properties index ed0cdb0..2d196a2 100755 --- a/devices/m2.properties +++ b/devices/m2.properties @@ -1,4 +1,4 @@ -#Tue Jul 11 15:24:17 CEST 2017 +#Wed Mar 28 14:33:20 CEST 2018 defaultSpeed=1.0 estbilizationDelay=0 maxSpeed=10.0 @@ -10,4 +10,5 @@ precision=2 resolution=NaN rotation=false scale=1.0 +startRetries=1 unit=mm diff --git a/devices/pipeline_server.properties b/devices/pipeline_server.properties index c3babde..8ff570e 100644 --- a/devices/pipeline_server.properties +++ b/devices/pipeline_server.properties @@ -1,4 +1,4 @@ -#Mon Dec 18 11:29:15 CET 2017 +#Tue Apr 24 11:42:23 CEST 2018 colormap=Flame colormapAutomatic=true colormapMax=NaN @@ -16,8 +16,8 @@ roiY=0 rotation=0.0 rotationCrop=false scale=1.0 -spatialCalOffsetX=-50.03909304143862 -spatialCalOffsetY=-50.048875855327466 +spatialCalOffsetX=-50.075987841945285 +spatialCalOffsetY=-50.10141987829615 spatialCalScaleX=-1.0 spatialCalScaleY=-1.0 spatialCalUnits=mm diff --git a/devices/rep_rate.properties b/devices/rep_rate.properties new file mode 100644 index 0000000..86e45d8 --- /dev/null +++ b/devices/rep_rate.properties @@ -0,0 +1,8 @@ +#Thu May 03 16:25:49 CEST 2018 +maxValue=NaN +minValue=NaN +offset=0.0 +precision=2 +resolution=NaN +scale=1.0 +unit=Hz diff --git a/plugins/GunEnergyScanNew.form b/plugins/GunEnergyScanNew.form new file mode 100644 index 0000000..3973280 --- /dev/null +++ b/plugins/GunEnergyScanNew.form @@ -0,0 +1,465 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/GunEnergyScanNew.java b/plugins/GunEnergyScanNew.java new file mode 100644 index 0000000..71d73ed --- /dev/null +++ b/plugins/GunEnergyScanNew.java @@ -0,0 +1,483 @@ +/* + * Copyright (c) 2014-2017 Paul Scherrer Institute. All rights reserved. + */ + +import ch.psi.pshell.plot.LinePlot; +import ch.psi.pshell.ui.Panel; +import ch.psi.utils.State; +import ch.psi.utils.swing.SwingUtils; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JSpinner; + +/** + * + */ +public class GunEnergyScanNew extends Panel { + + public GunEnergyScanNew() { + initComponents(); + setPersistedComponents(SwingUtils.getComponentsByType(panelScanPars, JSpinner.class)); + plot.setStyle(LinePlot.Style.ErrorY); + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + } + + @Override + public void onStateChange(State state, State former) { + buttonAbort.setEnabled(state.isProcessing()); + boolean enabled = (state == State.Ready); + buttonStart.setEnabled(enabled); + spinnerStart.setEnabled(enabled); + spinnerStop.setEnabled(enabled); + spinnerStep.setEnabled(enabled); + spinnerSamples.setEnabled(enabled); + spinnerLatency.setEnabled(enabled); + spinnerDispersion.setEnabled(enabled); + spinnerEnergy.setEnabled(enabled); + buttonPhaseSet.setEnabled(enabled && !textRefPhase.getText().trim().isEmpty()); + buttonSetDelay.setEnabled(enabled && !textOffset.getText().trim().isEmpty()); + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + //Callback to perform update - in event thread + @Override + protected void doUpdate() { + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + panelScanPars = new javax.swing.JPanel(); + labelStart = new javax.swing.JLabel(); + labelStop = new javax.swing.JLabel(); + spinnerStep = new javax.swing.JSpinner(); + labelStep = new javax.swing.JLabel(); + spinnerStart = new javax.swing.JSpinner(); + labelSamples = new javax.swing.JLabel(); + spinnerSamples = new javax.swing.JSpinner(); + labelLatency = new javax.swing.JLabel(); + spinnerLatency = new javax.swing.JSpinner(); + spinnerStop = new javax.swing.JSpinner(); + panelBeamPars = new javax.swing.JPanel(); + spinnerDispersion = new javax.swing.JSpinner(); + labelEnergy = new javax.swing.JLabel(); + spinnerEnergy = new javax.swing.JSpinner(); + labelDispersion = new javax.swing.JLabel(); + plot = new ch.psi.pshell.plot.LinePlotJFree(); + buttonStart = new javax.swing.JButton(); + buttonAbort = new javax.swing.JButton(); + jPanel1 = new javax.swing.JPanel(); + jLabel1 = new javax.swing.JLabel(); + buttonPhaseSet = new javax.swing.JButton(); + textRefPhase = new javax.swing.JTextField(); + jPanel2 = new javax.swing.JPanel(); + jLabel2 = new javax.swing.JLabel(); + buttonSetDelay = new javax.swing.JButton(); + textOffset = new javax.swing.JTextField(); + + setPreferredSize(new java.awt.Dimension(737, 445)); + + panelScanPars.setBorder(javax.swing.BorderFactory.createTitledBorder("Scan Parameters")); + + labelStart.setText("Start:"); + + labelStop.setText("Stop:"); + + spinnerStep.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.05d, 10.0d, 0.05d)); + spinnerStep.setPreferredSize(new java.awt.Dimension(64, 20)); + + labelStep.setText("Step size:"); + + spinnerStart.setModel(new javax.swing.SpinnerNumberModel(0.0d, -360.0d, 360.0d, 1.0d)); + spinnerStart.setPreferredSize(new java.awt.Dimension(64, 20)); + + labelSamples.setText("Nb Samples:"); + + spinnerSamples.setModel(new javax.swing.SpinnerNumberModel(1, 1, 50, 1)); + spinnerSamples.setPreferredSize(new java.awt.Dimension(64, 20)); + + labelLatency.setText("Latency:"); + + spinnerLatency.setModel(new javax.swing.SpinnerNumberModel(0.1d, 0.0d, 5.0d, 0.01d)); + spinnerLatency.setPreferredSize(new java.awt.Dimension(64, 20)); + + spinnerStop.setModel(new javax.swing.SpinnerNumberModel(180.0d, -360.0d, 360.0d, 1.0d)); + spinnerStop.setMinimumSize(new java.awt.Dimension(53, 20)); + spinnerStop.setPreferredSize(new java.awt.Dimension(64, 20)); + + javax.swing.GroupLayout panelScanParsLayout = new javax.swing.GroupLayout(panelScanPars); + panelScanPars.setLayout(panelScanParsLayout); + panelScanParsLayout.setHorizontalGroup( + panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelScanParsLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(panelScanParsLayout.createSequentialGroup() + .addComponent(labelLatency) + .addGap(2, 2, 2) + .addComponent(spinnerLatency, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(panelScanParsLayout.createSequentialGroup() + .addComponent(labelStop) + .addGap(2, 2, 2) + .addComponent(spinnerStop, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(panelScanParsLayout.createSequentialGroup() + .addComponent(labelStart) + .addGap(2, 2, 2) + .addComponent(spinnerStart, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(panelScanParsLayout.createSequentialGroup() + .addComponent(labelSamples) + .addGap(2, 2, 2) + .addComponent(spinnerSamples, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(panelScanParsLayout.createSequentialGroup() + .addComponent(labelStep) + .addGap(2, 2, 2) + .addComponent(spinnerStep, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + panelScanParsLayout.setVerticalGroup( + panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelScanParsLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(spinnerStart, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelStart)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(spinnerStop, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelStop)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(spinnerStep, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelStep)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(spinnerSamples, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelSamples)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelScanParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(spinnerLatency, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelLatency)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + panelBeamPars.setBorder(javax.swing.BorderFactory.createTitledBorder("Beam Parameters")); + + spinnerDispersion.setModel(new javax.swing.SpinnerNumberModel(-0.387d, -10.0d, 10.0d, 0.001d)); + spinnerDispersion.setPreferredSize(new java.awt.Dimension(64, 20)); + + labelEnergy.setText("p (MeV/c):"); + + spinnerEnergy.setModel(new javax.swing.SpinnerNumberModel(7.1d, 0.0d, 10.0d, 0.01d)); + spinnerEnergy.setPreferredSize(new java.awt.Dimension(64, 20)); + + labelDispersion.setText("Disp. (m):"); + + javax.swing.GroupLayout panelBeamParsLayout = new javax.swing.GroupLayout(panelBeamPars); + panelBeamPars.setLayout(panelBeamParsLayout); + panelBeamParsLayout.setHorizontalGroup( + panelBeamParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBeamParsLayout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(panelBeamParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(labelDispersion, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(labelEnergy)) + .addGap(4, 4, 4) + .addGroup(panelBeamParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(spinnerEnergy, javax.swing.GroupLayout.DEFAULT_SIZE, 73, Short.MAX_VALUE) + .addComponent(spinnerDispersion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + panelBeamParsLayout.setVerticalGroup( + panelBeamParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelBeamParsLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelBeamParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(spinnerDispersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelDispersion)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelBeamParsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(spinnerEnergy, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelEnergy)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + plot.setTitle(""); + + buttonStart.setText("Start"); + buttonStart.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonStartActionPerformed(evt); + } + }); + + buttonAbort.setText("Abort"); + buttonAbort.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonAbortActionPerformed(evt); + } + }); + + jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Set RF Phase")); + + jLabel1.setText("Ref phase:"); + + buttonPhaseSet.setText("Set"); + buttonPhaseSet.setEnabled(false); + buttonPhaseSet.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonPhaseSetActionPerformed(evt); + } + }); + + textRefPhase.setEditable(false); + textRefPhase.setHorizontalAlignment(javax.swing.JTextField.CENTER); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonPhaseSet) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(textRefPhase, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(textRefPhase, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonPhaseSet) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Set Laser Delay ")); + + jLabel2.setText("Offset:"); + + buttonSetDelay.setText("Set"); + buttonSetDelay.setEnabled(false); + buttonSetDelay.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonSetDelayActionPerformed(evt); + } + }); + + textOffset.setEditable(false); + textOffset.setHorizontalAlignment(javax.swing.JTextField.CENTER); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonSetDelay) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(textOffset, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(textOffset, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonSetDelay) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(buttonStart) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonAbort) + .addGap(15, 15, 15)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(panelScanPars, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelBeamPars, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))) + .addComponent(plot, javax.swing.GroupLayout.DEFAULT_SIZE, 528, Short.MAX_VALUE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(plot, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(panelScanPars, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(panelBeamPars, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(buttonStart) + .addComponent(buttonAbort)))) + .addGap(14, 14, 14)) + ); + + panelScanPars.getAccessibleContext().setAccessibleDescription(""); + }// //GEN-END:initComponents + + private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartActionPerformed + textRefPhase.setText(""); + ArrayList parameters = new ArrayList(); + parameters.add(spinnerStart.getValue()); + parameters.add(spinnerStop.getValue()); + parameters.add(spinnerStep.getValue()); + parameters.add(spinnerSamples.getValue()); + parameters.add(spinnerLatency.getValue()); + parameters.add((Double) spinnerDispersion.getValue()); + parameters.add((Double) spinnerEnergy.getValue()); + parameters.add(plot); + try { + runAsync("RFscan/GunEnergyScanNew", parameters).handle((ret, ex) -> { + if (ex != null) { + getLogger().info("Exception executing scan: " + ex); + showException((Exception) ex); + } else { + List list = (List)ret; + try{ + double phase = ((Number)list.get(0)).doubleValue(); + double offset = ((Number)list.get(1)).doubleValue(); + textRefPhase.setText(String.format("%1.2f",phase)); + textOffset.setText(String.format("%1.2f",offset)); + buttonPhaseSet.setEnabled(true); + buttonSetDelay.setEnabled(true); + } catch (Exception e) { + showException(e); + } + } + return ret; + }); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonStartActionPerformed + + private void buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed + try { + abort(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonAbortActionPerformed + + private void buttonPhaseSetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPhaseSetActionPerformed + try { + if (!textRefPhase.getText().isEmpty()){ + Double phase = Double.parseDouble(textRefPhase.getText()); + + ArrayList parameters = new ArrayList(); + parameters.add(phase); + parameters.add(plot); + try { + //How to get a callback on the end of execution + runAsync("RFscan/GunEnergyScanRfSetNew", parameters).handle((ret, ex) -> { + if (ex != null) { + getLogger().info("Exception executing scan: " + ex); + showException((Exception) ex); + } + return ret; + }); + } catch (Exception ex) { + showException(ex); + } + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonPhaseSetActionPerformed + + private void buttonSetDelayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSetDelayActionPerformed + try { + if (!textOffset.getText().isEmpty()){ + Double offset = Double.parseDouble(textOffset.getText()); + + ArrayList parameters = new ArrayList(); + parameters.add(offset); + parameters.add(plot); + try { + //How to get a callback on the end of execution + runAsync("RFscan/GunEnergyScanLasSetNew", parameters).handle((ret, ex) -> { + if (ex != null) { + getLogger().info("Exception executing scan: " + ex); + showException((Exception) ex); + } + return ret; + }); + } catch (Exception ex) { + showException(ex); + } + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonSetDelayActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonAbort; + private javax.swing.JButton buttonPhaseSet; + private javax.swing.JButton buttonSetDelay; + private javax.swing.JButton buttonStart; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JLabel labelDispersion; + private javax.swing.JLabel labelEnergy; + private javax.swing.JLabel labelLatency; + private javax.swing.JLabel labelSamples; + private javax.swing.JLabel labelStart; + private javax.swing.JLabel labelStep; + private javax.swing.JLabel labelStop; + private javax.swing.JPanel panelBeamPars; + private javax.swing.JPanel panelScanPars; + private ch.psi.pshell.plot.LinePlotJFree plot; + private javax.swing.JSpinner spinnerDispersion; + private javax.swing.JSpinner spinnerEnergy; + private javax.swing.JSpinner spinnerLatency; + private javax.swing.JSpinner spinnerSamples; + private javax.swing.JSpinner spinnerStart; + private javax.swing.JSpinner spinnerStep; + private javax.swing.JSpinner spinnerStop; + private javax.swing.JTextField textOffset; + private javax.swing.JTextField textRefPhase; + // End of variables declaration//GEN-END:variables +} diff --git a/plugins/GunSolenoidAlignment.java b/plugins/GunSolenoidAlignment.java index d5a492b..105103b 100644 --- a/plugins/GunSolenoidAlignment.java +++ b/plugins/GunSolenoidAlignment.java @@ -27,6 +27,7 @@ public class GunSolenoidAlignment extends Panel { } boolean running; + /* //Overridable callbacks @Override public void onInitialize(int runCount) { @@ -43,6 +44,7 @@ public class GunSolenoidAlignment extends Panel { } } } + */ @Override public void onStateChange(State state, State former) { diff --git a/plugins/LaserGunAlignment.java b/plugins/LaserGunAlignment.java index 04bfb78..41bb277 100644 --- a/plugins/LaserGunAlignment.java +++ b/plugins/LaserGunAlignment.java @@ -25,6 +25,7 @@ public class LaserGunAlignment extends Panel { boolean running; //Overridable callbacks + /* @Override public void onInitialize(int runCount) { if (runCount==0){ @@ -40,6 +41,7 @@ public class LaserGunAlignment extends Panel { } } } + */ @Override public void onStateChange(State state, State former) { diff --git a/plugins/ScreenPanel2.java b/plugins/ScreenPanel2.java index 3278abb..fe8c921 100644 --- a/plugins/ScreenPanel2.java +++ b/plugins/ScreenPanel2.java @@ -186,7 +186,9 @@ public class ScreenPanel2 extends Panel { Arrays.fill(gX2, Double.NaN); try { double x = getServerDoubleArray("gr_x_axis", cache)[0]; - System.arraycopy(x_fit_gauss_function, 0, gX2, (int) ((renderer.getCalibration() != null) ? renderer.getCalibration().convertToImageX(x) : x), x_fit_gauss_function.length); + gr_size_x = x_fit_gauss_function.length; + gr_pos_x = (int) ((renderer.getCalibration() != null) ? renderer.getCalibration().convertToImageX(x) : x); + System.arraycopy(x_fit_gauss_function, 0, gX2, gr_pos_x , gr_size_x); } catch (Exception ex) { } x_fit_gauss_function = gX2; @@ -194,7 +196,9 @@ public class ScreenPanel2 extends Panel { Arrays.fill(gY2, Double.NaN); try { double y = getServerDoubleArray("gr_y_axis", cache)[0]; - System.arraycopy(y_fit_gauss_function, 0, gY2, (int) ((renderer.getCalibration() != null) ? renderer.getCalibration().convertToImageY(y) : y), y_fit_gauss_function.length); + gr_size_y = y_fit_gauss_function.length; + gr_pos_y = (int) ((renderer.getCalibration() != null) ? renderer.getCalibration().convertToImageY(y) : y); + System.arraycopy(y_fit_gauss_function, 0, gY2, gr_pos_y, y_fit_gauss_function.length); } catch (Exception ex) { } y_fit_gauss_function = gY2; @@ -225,6 +229,10 @@ public class ScreenPanel2 extends Panel { public double[] x_fit_gauss_function; public double[] y_profile; public double[] y_fit_gauss_function; + public int gr_size_x; + public int gr_pos_x; + public int gr_size_y; + public int gr_pos_y; public PointDouble[] sliceCenters; public StreamValue cache; } @@ -1229,58 +1237,73 @@ public class ScreenPanel2 extends Panel { sliceCenters = id.sliceCenters; profileSize /= 4; - if (pX != null) { - int[] x = Arr.indexesInt(pX.length); - int[] y = new int[pX.length]; - int[] p = new int[pX.length]; + if (pX != null) { + int[] xp = Arr.indexesInt(pX.length); + int[] xg = xp; + int[] yp = new int[pX.length]; + int[] yg = new int[pX.length]; + List l = Arrays.asList((Double[]) Convert.toWrapperArray(pX)); - Double min = Collections.min(l); - Double max = Collections.max(l); - double minPlot = min; - double rangePlot = max - min; - - for (int i = 0; i < x.length; i++) { + double minProfile = Collections.min(l); + double maxProfile = Collections.max(l); + double rangeProfile = maxProfile - minProfile; + double minGauss = minProfile; + double rangeGauss = rangeProfile; + //If not good region, range of profile and fit are similar so save this calcultion + if (goodRegion && id.gr_size_x>0){ + l = Arrays.asList( (Double[]) Convert.toWrapperArray(Arrays.copyOfRange(gX, id.gr_pos_x, id.gr_pos_x + id.gr_size_x))); + minGauss = Collections.min(l); + rangeGauss = Collections.max(l) - minGauss; + } + + for (int i = 0; i < xp.length; i++) { if (gX != null) { - y[i] = (int) (height - 1 - (((gX[i] - minPlot) / rangePlot) * profileSize)); + yg[i] = (int) (height - 1 - (((gX[i] - minGauss) / rangeGauss) * profileSize)); } - p[i] = (int) (height - 1 - (((pX[i] - minPlot) / rangePlot) * profileSize)); + yp[i] = (int) (height - 1 - (((pX[i] - minProfile) / rangeProfile) * profileSize)); } - - if (goodRegion) { - for (int i = 0; i < x.length; i++) { - y[i] = (Double.isNaN(gX[i])) ? 100000 : y[i]; - } + + if (goodRegion && id.gr_size_x>0){ + xg = Arrays.copyOfRange(xg, id.gr_pos_x, id.gr_pos_x + id.gr_size_x); + yg = Arrays.copyOfRange(yg, id.gr_pos_x, id.gr_pos_x + id.gr_size_x); } - - vgaussian = new Overlays.Polyline(penFit, x, y); - vprofile = new Overlays.Polyline(renderer.getPenProfile(), x, p); + + vgaussian = new Overlays.Polyline(penFit, xg, yg); + vprofile = new Overlays.Polyline(renderer.getPenProfile(), xp, yp); } if (pY != null) { - int[] y = Arr.indexesInt(pY.length); - int[] x = new int[pY.length]; - int[] p = new int[pY.length]; + int[] xp = new int[pY.length]; + int[] xg = new int[pY.length]; + int[] yp = Arr.indexesInt(pY.length); + int[] yg = yp; List l = Arrays.asList((Double[]) Convert.toWrapperArray(pY)); - Double min = Collections.min(l); - Double max = Collections.max(l); - double minPlot = min; - double rangePlot = max - min; + double minProfile = Collections.min(l); + double maxProfile = Collections.max(l); + double rangeProfile = maxProfile - minProfile; + double minGauss = minProfile; + double rangeGauss = rangeProfile; + //If not good region, range of profile and fit are similar so save this calcultion + if (goodRegion && id.gr_size_y>0){ + l = Arrays.asList( (Double[]) Convert.toWrapperArray(Arrays.copyOfRange(gY, id.gr_pos_y, id.gr_pos_y + id.gr_size_y))); + minGauss = Collections.min(l); + rangeGauss = Collections.max(l) - minGauss; + } - for (int i = 0; i < x.length; i++) { + for (int i = 0; i < xp.length; i++) { if (gY != null) { - x[i] = (int) (((gY[i] - minPlot) / rangePlot) * profileSize); + xg[i] = (int) (((gY[i] - minGauss) / rangeGauss) * profileSize); } - p[i] = (int) (((pY[i] - minPlot) / rangePlot) * profileSize); + xp[i] = (int) (((pY[i] - minProfile) / rangeProfile) * profileSize); } - if (goodRegion) { - for (int i = 0; i < x.length; i++) { - x[i] = (Double.isNaN(gY[i])) ? -1 : x[i]; - } + if (goodRegion && id.gr_size_x>0){ + xg = Arrays.copyOfRange(xg, id.gr_pos_y, id.gr_pos_y + id.gr_size_y); + yg = Arrays.copyOfRange(yg, id.gr_pos_y, id.gr_pos_y + id.gr_size_y); } - hgaussian = new Overlays.Polyline(penFit, x, y); - hprofile = new Overlays.Polyline(renderer.getPenProfile(), p, y); + hgaussian = new Overlays.Polyline(penFit, xg, yg); + hprofile = new Overlays.Polyline(renderer.getPenProfile(), xp, yp); } } catch (Exception ex) { System.err.println(ex.getMessage()); @@ -2120,6 +2143,16 @@ public class ScreenPanel2 extends Panel { } catch (Exception ex) { dataTableModel.addRow(new Object[]{"Stream", ex.getMessage()}); } + try { + dataTableModel.addRow(new Object[]{"PID", value.getPulseId()}); + } catch (Exception ex) { + dataTableModel.addRow(new Object[]{"PID", ex.getMessage()}); + } + try { + dataTableModel.addRow(new Object[]{"Timestamp", value.getTimestamp()}); + } catch (Exception ex) { + dataTableModel.addRow(new Object[]{"Timestamp", ex.getMessage()}); + } Collections.sort(ids); for (String id : ids) { dataTableModel.addRow(new Object[]{id, ""}); @@ -2127,7 +2160,7 @@ public class ScreenPanel2 extends Panel { } Frame frame = getCurrentFrame(); if ((frame != null) && (frame.cache!=null)){ - for (int i = 2; i < dataTableModel.getRowCount(); i++) { + for (int i = 4; i < dataTableModel.getRowCount(); i++) { String id = String.valueOf(dataTableModel.getValueAt(i, 0)); //Object obj = server.getValue(id); Object obj = frame.cache.getValue(id); @@ -3071,7 +3104,8 @@ public class ScreenPanel2 extends Panel { ColormapSource source = (ColormapSource) camera; Color colorReticule = new Color(16, 16, 16); Color colorMarker = new Color(128, 128, 128); - source.getConfig().colormap = (Colormap) comboColormap.getSelectedItem(); + Colormap colormap = (Colormap) comboColormap.getSelectedItem(); + source.getConfig().colormap = (colormap==null) ? Colormap.Flame: colormap; switch (source.getConfig().colormap) { case Grayscale: case Inverted: diff --git a/plugins/WireScan.form b/plugins/WireScan.form index 701d207..b007898 100644 --- a/plugins/WireScan.form +++ b/plugins/WireScan.form @@ -70,9 +70,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -93,75 +150,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -187,26 +177,28 @@ - + - + + + - + - + @@ -623,6 +615,19 @@ + + + + + + + + + + + + + diff --git a/plugins/WireScan.java b/plugins/WireScan.java index 9c531ab..55a3819 100644 --- a/plugins/WireScan.java +++ b/plugins/WireScan.java @@ -168,6 +168,8 @@ public class WireScan extends Panel { spinnerEndX.setEnabled(spinnerStartX.isEnabled()); spinnerStartY.setEnabled(validWireScan && isY()); spinnerEndY.setEnabled(spinnerStartY.isEnabled()); + spinnerBunch.setEnabled(validWireScan); + spinnerBackground.setEnabled(validWireScan); updateRawButtons(); } @@ -380,6 +382,8 @@ public class WireScan extends Panel { buttonRaw3 = new javax.swing.JButton(); jLabel18 = new javax.swing.JLabel(); buttonScannerPanel = new javax.swing.JButton(); + jLabel21 = new javax.swing.JLabel(); + spinnerBunch = new javax.swing.JSpinner(); plot.setTitle(""); @@ -577,6 +581,11 @@ public class WireScan extends Panel { } }); + jLabel21.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel21.setText("Bunch:"); + + spinnerBunch.setModel(new javax.swing.SpinnerNumberModel(1, 1, 2, 1)); + javax.swing.GroupLayout panelLeftLayout = new javax.swing.GroupLayout(panelLeft); panelLeft.setLayout(panelLeftLayout); panelLeftLayout.setHorizontalGroup( @@ -601,9 +610,57 @@ public class WireScan extends Panel { .addComponent(jLabel6, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel20, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jLabel20, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel21, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(spinnerBunch, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(spinnerVel, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(spinnerStartX) + .addComponent(spinnerStartY)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(labelEndY) + .addComponent(jLabel7) + .addComponent(jLabel9) + .addComponent(jLabel19)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(spinnerCycles) + .addComponent(spinnerBackground, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(spinnerEndX) + .addComponent(spinnerEndY))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelLeftLayout.createSequentialGroup() + .addComponent(buttonPark) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonParkAll) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonMoveStart)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelLeftLayout.createSequentialGroup() + .addComponent(buttonScan) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(checkSaveRaw) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonAbort)) + .addGroup(panelLeftLayout.createSequentialGroup() + .addGap(98, 98, 98) + .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 324, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(panelLeftLayout.createSequentialGroup() + .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(comboBlm3, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboBlm2, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboBlm1, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(buttonRaw1, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(buttonRaw2, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(buttonRaw3, javax.swing.GroupLayout.Alignment.TRAILING))) + .addComponent(comboBpm2, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboBpm1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboBpm3, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboScanType, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboWireScanner, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(panelLeftLayout.createSequentialGroup() .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(panelPosition, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -619,64 +676,11 @@ public class WireScan extends Panel { .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(buttonHoming, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(buttonScannerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonMotorPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addComponent(comboWireScanner, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboScanType, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboBpm3, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboBpm1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboBpm2, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(panelLeftLayout.createSequentialGroup() - .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(spinnerStartY) - .addComponent(panelStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 324, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(0, 16, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelLeftLayout.createSequentialGroup() - .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(panelLeftLayout.createSequentialGroup() - .addComponent(spinnerVel, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel9)) - .addGroup(panelLeftLayout.createSequentialGroup() - .addComponent(spinnerStartX) - .addGap(18, 18, Short.MAX_VALUE) - .addComponent(jLabel7)) - .addGroup(panelLeftLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jLabel19) - .addComponent(labelEndY)))) - .addGap(8, 8, 8) - .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(spinnerEndX, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(spinnerEndY, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(spinnerBackground, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(spinnerCycles, javax.swing.GroupLayout.Alignment.TRAILING))) - .addGroup(panelLeftLayout.createSequentialGroup() - .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(comboBlm3, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboBlm2, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboBlm1, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(buttonRaw1, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(buttonRaw2, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(buttonRaw3, javax.swing.GroupLayout.Alignment.TRAILING))))) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelLeftLayout.createSequentialGroup() - .addComponent(buttonPark) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonParkAll) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonMoveStart)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelLeftLayout.createSequentialGroup() - .addComponent(buttonScan) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(checkSaveRaw) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonAbort))) + .addComponent(buttonMotorPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))) .addGap(0, 0, 0)) ); - panelLeftLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel10, jLabel11, jLabel13, jLabel14, jLabel15, jLabel16, jLabel17, jLabel18, jLabel2, jLabel20, jLabel3, jLabel4, jLabel5, jLabel6, jLabel7, jLabel8, jLabel9, labelEndY, labelStartY}); + panelLeftLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel10, jLabel11, jLabel13, jLabel14, jLabel15, jLabel16, jLabel17, jLabel18, jLabel19, jLabel2, jLabel20, jLabel21, jLabel3, jLabel4, jLabel5, jLabel6, jLabel7, jLabel8, jLabel9, labelEndY, labelStartY}); panelLeftLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonAbort, buttonMoveStart, buttonPark, buttonParkAll, buttonScan}); @@ -686,7 +690,7 @@ public class WireScan extends Panel { panelLeftLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerBackground, spinnerCycles, spinnerEndX, spinnerEndY}); - panelLeftLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerStartX, spinnerStartY, spinnerVel}); + panelLeftLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerBunch, spinnerStartX, spinnerStartY, spinnerVel}); panelLeftLayout.setVerticalGroup( panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -710,7 +714,9 @@ public class WireScan extends Panel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(spinnerBackground, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel19)) + .addComponent(jLabel19) + .addComponent(spinnerBunch, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel21)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelLeftLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel6) @@ -790,12 +796,14 @@ public class WireScan extends Panel { panelLeftLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {labelPosX, labelPosY, panelPosition}); - panelLeftLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {spinnerStartX, spinnerStartY, spinnerVel}); + panelLeftLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {spinnerBunch, spinnerStartX, spinnerStartY, spinnerVel}); panelLeftLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {spinnerCycles, spinnerEndX, spinnerEndY}); panelLeftLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {panelRepRate, panelStatus}); + panelLeftLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jLabel19, jLabel7, jLabel9, labelEndY}); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -950,6 +958,7 @@ public class WireScan extends Panel { parameters.add(spinnerBackground.getValue()); parameters.add(plot); parameters.add(checkSaveRaw.isSelected()); + parameters.add(spinnerBunch.getValue()); runAsync("Diagnostics/WireScan", parameters).handle((ret, ex) -> { if (ex != null) { @@ -1113,6 +1122,7 @@ public class WireScan extends Panel { private javax.swing.JLabel jLabel19; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel20; + private javax.swing.JLabel jLabel21; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; @@ -1131,6 +1141,7 @@ public class WireScan extends Panel { private ch.psi.pshell.swing.DeviceValuePanel panelStatus; private ch.psi.pshell.plot.LinePlotJFree plot; private javax.swing.JSpinner spinnerBackground; + private javax.swing.JSpinner spinnerBunch; private javax.swing.JSpinner spinnerCycles; private javax.swing.JSpinner spinnerEndX; private javax.swing.JSpinner spinnerEndY; diff --git a/script/Alignment/Gun_solenoid_alignment.py b/script/Alignment/Gun_solenoid_alignment.py index 209c64e..397d080 100755 --- a/script/Alignment/Gun_solenoid_alignment.py +++ b/script/Alignment/Gun_solenoid_alignment.py @@ -13,7 +13,7 @@ import datetime do_elog = True dry_run = False is_panel = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" -camera_name = "SINEG01-DSCR190" +camera_name = "simulation" if dry_run else "SINEG01-DSCR190" bpm_name = "SINEG01-DBPM340" use_good_region=False magnets = ["SINEG01-MCRX120","SINEG01-MCRY120", diff --git a/script/Alignment/Laser_gun_alignment.py b/script/Alignment/Laser_gun_alignment.py index 1bcfe9d..c1cf08e 100755 --- a/script/Alignment/Laser_gun_alignment.py +++ b/script/Alignment/Laser_gun_alignment.py @@ -14,7 +14,7 @@ import datetime do_elog = True dry_run = False is_panel = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" -camera_name = "SINEG01-DSCR190" +camera_name = "simulation" if dry_run else "SINEG01-DSCR190" bpm_name = "SINEG01-DBPM340" use_good_region=False magnets = ["SINEG01-MCRX120","SINEG01-MCRY120", diff --git a/script/Correlation/Correlation2.py b/script/Correlation/Correlation2.py index 133514b..334f4e6 100644 --- a/script/Correlation/Correlation2.py +++ b/script/Correlation/Correlation2.py @@ -115,7 +115,10 @@ try: _stream.initialize() _stream.start(True) if _camname != None: - cam_server.start(_camname ) + shared = _camname.endswith("_sp1") + print "Camera: " , _camname, " shared: ", shared + cam_server.start(_camname, shared ) + cam_server.stream.waitCacheChange(10000); if dxtype==TYPE_CAMERA: dx=cam_server.stream.getChild(dx) diff --git a/script/Devices/Elements.py b/script/Devices/Elements.py index 74c6dea..1cbebaa 100644 --- a/script/Devices/Elements.py +++ b/script/Devices/Elements.py @@ -299,3 +299,46 @@ def get_camera_type(camera_name): return "UNKNOWN" + +################################################################################################### +## BLMs in WS MODE +################################################################################################### + + +def start_blm_ws(blm, duration=10.0): + caput(blm+ ":WS_SCAN_DURATION", duration) + caput(blm + ":WS_START.PROC", 1) + +def stop_blm_ws(blm): + caput(blm + ":WS_STOP.PROC", 1) + +def set_blm_ws_gain(blm, gain): + caput(blm + ":WS_PMT_GAIN_VOLTS", 1) + +def get_blm_ws_gain(blm, gain): + caget(blm + ":WS_PMT_GAIN_VOLTS") + + +def set_blm_ws_att(blm, att): + caput(blm + ":WS_PMT_ATT_VOLTS", 1) + +def get_blm_ws_att(blm, att): + """ + string 0: Reference + string 1: "2 dB" + string 2: 4 dB + string 3: 6 dB + string 4: 8 dB + string 5: 10 dB + string 6: 12 dB + string 7: 14 dB + string 8: 16 dB + string 9: 18 dB + string 10: 20 dB + string 11: 22 dB + string 12: 24 dB + string 13: 26 dB + string 14: 28 dB + string 15: 30 dB + """ + caget(blm + ":WS_PMT_ATT_VOLTS", 'i') diff --git a/script/Devices/WireScanner.py b/script/Devices/WireScanner.py index 7992e4e..cdd115e 100644 --- a/script/Devices/WireScanner.py +++ b/script/Devices/WireScanner.py @@ -69,7 +69,40 @@ class WireScanInfo(DeviceBase): w2y = (pos_motor - self.home_offsets[3]) / (math.sqrt(2)) return [w1x, w1y, w2x, w2y] - + def is_valid(self): + return caget(self.prefix + ":VALID", 'i')==1 + + def _get_channel(self, bunch, wire, name): + return self.prefix + ":B" + str(int(bunch)) + "_" + wire.upper() + "_" + name + + def set_out_com(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "CENTER_OF_MASS"), float(value)) + + def set_out_rms(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "RMS"), float(value)) + + def set_out_amp(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "FIT_AMPLITUDE"), float(value)) + + def set_out_mean(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "FIT_MEAN"), float(value)) + + def set_out_off(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "FIT_OFFSET"), float(value)) + + def set_out_sigma(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "FIT_STANDARD_DEVIATION"), float(value)) + + def set_out_pos(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "POSITION"), to_array(value, 'd')) + + def set_out_samples(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "AMPLITUDE"), to_array(value, 'd')) + + def set_out_gauss(self, bunch, wire, value): + caput(self._get_channel(bunch, wire, "FIT_GAUSS_FUNCTION"), to_array(value, 'd')) + + def new_scan_info_device(name, prefix): return WireScanInfo(name, prefix) diff --git a/script/Diagnostics/CamtoolScan.py b/script/Diagnostics/CamtoolScan.py index 4a78ea0..69f8639 100644 --- a/script/Diagnostics/CamtoolScan.py +++ b/script/Diagnostics/CamtoolScan.py @@ -2,14 +2,16 @@ import ch.psi.pshell.epics.ControlledVariable as ControlledVariable #This scan is dedicated to scan either one parameter (e.g. a quadrupole) and take a certain amount of images at every location CAMERA = "SARCL01-DSCR170" #Specify the camera we want to use #CAMERA = "SINDI02-DLAC055" -QUADRUPOLE = "S20SY01-MQUA080" # quadrupole for the scan with S10DI01-DSCR020: S10CB02-MQUA230 +#CAMERA = "SINBC02-DSRM310" +#QUADRUPOLE = "S20SY01-MQUA080" # quadrupole for the scan with S10DI01-DSCR020: S10CB02-MQUA230 +QUADRUPOLE = "S10BC01-MQUA100" CHARGE_BPM = "SARCL01-DBPM120:Q1" #reading out the charge also CHARGE_ICT = "S10DI01-DICT025:B1_CHARGE-OP" #reading out the charge also -RANGE = (0.382,8.382) #range for the quadrupole -#RANGE = None #if range None, just NUM_IMAGES are recorded -STEPS = 50 #step size for the quadrupole scan range +#RANGE = (6.226,7.226) #range for the quadrupole +RANGE = None #if range None, just NUM_IMAGES are recorded +STEPS = 20 # number of steps for the quadrupole scan range (scan will take STEPS+1 measurements) SETTLING_TIME = 0.1 -NUM_IMAGES = 10 #number of images for every step +NUM_IMAGES = 50 #number of images for every step print cam_server.cameras cam_server.start(CAMERA + "_sp1", True) diff --git a/script/Diagnostics/ICT_timing_fine.py b/script/Diagnostics/ICT_timing_fine.py index 71ff683..64b365a 100644 --- a/script/Diagnostics/ICT_timing_fine.py +++ b/script/Diagnostics/ICT_timing_fine.py @@ -2,8 +2,8 @@ import ch.psi.pshell.epics.ChannelDouble as ChannelDouble dry_run = False do_elog = True -base_name = "SARBD01-DICT599" # SINEG01-DICT009 S10DI01-DICT113 SARMA01-DICT482 SARBD01-DICT599 -dev_name = "SARBD01-DICT030" # SINEG01-DICT215 S10DI01-DICT025 SARMA01-DICT090 SARBD01-DICT030 +base_name = "SARMA01-DICT482" # SINEG01-DICT009 S10DI01-DICT113 SARMA01-DICT482 SARBD01-DICT599 +dev_name = "SARMA01-DICT090" # SINEG01-DICT215 S10DI01-DICT025 SARMA01-DICT090 SARBD01-DICT030 run("CPython/wrapper") @@ -22,10 +22,10 @@ V.initialize() t0 = t.read() -start = 3 -stop = 10 +start = 4 +stop = 12 step = 0.1 -nb = 4 +nb = 10 lat = 0.150 plt = plot(None, title="Output")[0] diff --git a/script/Diagnostics/ICT_timing_rough.py b/script/Diagnostics/ICT_timing_rough.py index 02dce08..a087c88 100644 --- a/script/Diagnostics/ICT_timing_rough.py +++ b/script/Diagnostics/ICT_timing_rough.py @@ -20,8 +20,8 @@ V.initialize() t0 = t.read() -start = 1001.020 -stop = 1001.060 +start = 1001.035 +stop = 1001.050 step = 0.002 nb = 4 lat = 0.150 diff --git a/script/Diagnostics/WireScan.py b/script/Diagnostics/WireScan.py index 62f140b..7d1a104 100644 --- a/script/Diagnostics/WireScan.py +++ b/script/Diagnostics/WireScan.py @@ -1,27 +1,40 @@ import traceback -is_panel = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" +has_args = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" +is_script = get_exec_pars().source == CommandSource.script + run("Devices/Elements") run("Devices/WireScanner") run("Diagnostics/sig_process_wrapper") -BPM_SENSORS = [("x","X1"), ("y","Y1"), ("q","Q1")] #(logic name sufix, channel sufix) #Paramter parsing -prefix = args[0] if is_panel else "S30CB09-DWSC440" #"SINDI01-DWSC090" -scan_type = args[1] if is_panel else WireScanner.WireX1 -scan_range = args[2] if is_panel else [-200, 200, -200, 200] -cycles = args[3] if is_panel else 3 -velocity = args[4] if is_panel else 200 -bpms = args[5] if is_panel else get_wire_scanners_bpms(prefix) -blms = args[6] if is_panel else get_wire_scanners_blms(prefix) -bkgrd = args[7] if is_panel else 10 -plt = args[8] if is_panel else plot(None, title = "Wire Scan")[0] -save_raw = args[9] if is_panel else False -do_elog = False if (plt is None) else (True if is_panel else True) -print "WireScan parameters: ", prefix, scan_type, scan_range, cycles, velocity, bpms, blms, bkgrd +prefix = args[0] if has_args else "S10DI01-DWSC010" #"S10CB07-DWSC440" #"SINDI01-DWSC090" +scan_type = args[1] if has_args else WireScanner.WireX1 +scan_range = args[2] if has_args else [-1000, 1000, -1000, 1000] +cycles = args[3] if has_args else 2 +velocity = args[4] if has_args else 200 +bpms = args[5] if has_args else [] #get_wire_scanners_bpms(prefix) +blms = args[6] if has_args else get_wire_scanners_blms(prefix) +bkgrd = args[7] if has_args else 10 +plt = args[8] if has_args else plot(None, title = "Wire Scan")[0] +save_raw = args[9] if has_args else False +bunch = args[10] if has_args else 1 +do_elog = True if (is_panel and (not is_script) and (plt is not None)) else False +print is_panel, do_elog +print "WireScan parameters: ", prefix, scan_type, scan_range, cycles, velocity, bpms, blms, bkgrd, bunch + +SET_BLM_WS_MODE = True +SET_BLM_WS_SETTLING_TIME = 2.0 +SET_BLM_WS_BS_READBACK_TIMEOUT = 10000 #ms + +#TODO: configure biggerCAJ buffer size and set back to 10000 +SAMPLE_CHANNEL_SIZE = 2049 #10000 +SAMPLE_CHANNEL_EMPTY_VALUE = 0.0 + +BPM_SENSORS = [("x","X"+str(bunch)), ("y","Y"+str(bunch)), ("q","Q"+str(bunch))] #(logic name suffix, channel suffix) #Plot setup if plt is not None: @@ -43,8 +56,9 @@ scanner = WireScanner(prefix, scan_range, cycles, velocity, True) channels = [("m_pos", scanner.motor_bs_readback.get_name()), ("cur_cycle", scanner.curr_cycl.get_name()), ("scanning", scanner.status_channels[0].get_name())] + for i in range (len(blms)): - channels.append (("blm" + str(i+1), blms[i] + ":B1_LOSS")) + channels.append (("blm" + str(i+1), blms[i] + ":B" + str(bunch) + "_LOSS")) if plt is not None: series = LinePlotSeries(blms[i], None, min(i+1, 2)) plt.addSeries(series) @@ -55,6 +69,9 @@ for i in range (len(blms)): for i in range (len(bpms)): for sensor in BPM_SENSORS: channels.append (("bpm" + str(i+1) + "_" + sensor[0], bpms[i] + ":" + sensor[1])) + +if SET_BLM_WS_MODE and (len(blms)>0): + channels.append(("blm1_ws_mode", blms[0] + ":WS_RUNNING")) #Metadata set_attribute("/", "Wire Scanner", prefix) @@ -66,6 +83,7 @@ set_attribute("/", "Wire Velocity", velocity) set_attribute("/", "Background Measures", bkgrd) set_attribute("/", "BPMs", bpms) set_attribute("/", "BLMs", blms) +set_attribute("/", "Bunch", bunch) filename = get_exec_pars().path @@ -75,7 +93,10 @@ filename = get_exec_pars().path print "Starting stream..." st = Stream("pulse_id", dispatcher) for c in channels: - st.addScalar(c[0], c[1], int(100.0 / get_repetition_rate()), 0) + if c[1].endswith("LOSS_SIGNAL_RAW"): + st.addWaveform(c[0], c[1], int(100.0 / get_repetition_rate()), 0) + else: + st.addScalar(c[0], c[1], int(100.0 / get_repetition_rate()), 0) st.initialize() st.start() st.waitCacheChange(10000) #Wait stream be running before starting scan @@ -91,7 +112,7 @@ class Timestamp(Readable): #Pseudo-device returning the wire position class w_pos(Readable): def read(self): - return scanner.get_sel_wire_pos(st.getChildren()[0].take()) + return scanner.get_sel_wire_pos(st.getChild("m_pos").take()) #End of scan checking scan_complete, cur_cycle, wire = None, None, None @@ -117,27 +138,29 @@ def check_end_scan(record, scan): def do_background(): #Store Background if bkgrd>0: - scanner.park(wait=True) + scanner.park(wait=True) set_exec_pars(group = "background") r = mscan (st, st.getReadables()[4:], bkgrd) for i in range(len(r.getReadables())): d = r.getReadable(i) - path = get_exec_pars().group + "/"+ r.getReadables()[i].name - set_attribute(path, "Mean", mean(d)) - set_attribute(path, "Sigma", stdev(d) ) + try: + path = get_exec_pars().group + "/"+ r.getReadables()[i].name + set_attribute(path, "Mean", mean(d)) + set_attribute(path, "Sigma", stdev(d) ) + except: + pass #Scan def do_scan(index): global scan_complete, cur_cycle, wire wire = "y" if (index==1) or (scan_type in [WireScanner.WireY1, WireScanner.WireY2]) else "x" set_exec_pars(group=wire+"_{count}", reset=True) - scanner.set_selection(get_scan_selection(scan_type, index)) + scanner.set_selection(get_scan_selection(scan_type, index)) if plt is not None: - if wire == "x": + if wire == "x": plt.getAxis(plt.AxisId.X).setRange(scan_range[0], scan_range[1]) else: - plt.getAxis(plt.AxisId.X).setRange(scan_range[2], scan_range[3]) - + plt.getAxis(plt.AxisId.X).setRange(scan_range[2], scan_range[3]) scanner.init(wait=True) scanner.curr_cycl.write(0) scan_complete=False @@ -147,7 +170,7 @@ def do_scan(index): for s in plt.getAllSeries(): s.clear() plt.removeMarker(None) - try: + try: scanner.scan() #scanner.waitState(State.Busy, 60000) Not needed as stream filter will make the wait st.getChild("scanning").waitValue(1.0, 10000) #print st.getValues() @@ -183,30 +206,37 @@ msg = "" ret = [] def calculate(): global msg - stats = [] + stats, samples_val, samples_pos = [], [],[] for i in range(len(blms)): msg += "Wire " + wire + " - BLM " + str(i+1) + ":\n" try: bg = get_attributes("background/blm" + str(i+1))["Mean"] if bkgrd>0 else 0.0 - samples = [[], [], [], []] + samples = [[], [], [], [], [], []] for cycle in range (cycles): pos_path = wire+"_" + ("%04d" % (cycle+1)) + "/w_pos" pos = load_data(pos_path) path = wire+"_" + ("%04d" % (cycle+1)) + "/blm" + str(i+1) data = load_data(path) - sp = blm_remove_spikes(data) + sp = data #blm_remove_spikes(data) sig = sp if bg is None else [v-bg for v in sp] - - [rms_com, rms_sigma] = profile_rms_stats(pos, sig,noise_std=0, n_sigma=3.5) - set_attribute(path, "RMS COM", float("nan") if (rms_com is None) else rms_com) - set_attribute(path, "RMS Sigma", float("nan") if (rms_sigma is None) else rms_sigma) - + #print [com, rms] [off, amp, com, sigma] = profile_gauss_stats(pos, sig, off=None, amp=None, com=None, sigma=None) set_attribute(path, "Gauss COM", float("nan") if (com is None) else com) set_attribute(path, "Gauss Sigma", float("nan") if (sigma is None) else sigma) + + #[rms_com, rms_sigma] = profile_rms_stats(pos, sig,noise_std=0, n_sigma=3.5) + [rms_com, rms_sigma] = profile_rms_stats_with_estimate(pos, sig, com_estimate = com, window_size = sigma * 3.5) + set_attribute(path, "RMS COM", float("nan") if (rms_com is None) else rms_com) + set_attribute(path, "RMS Sigma", float("nan") if (rms_sigma is None) else rms_sigma) + + + if i==0: #Write channels for BLM 1 + samples_val.extend(sig) + samples_pos.extend(pos) - samples[0].append(rms_com);samples[1].append(rms_sigma);samples[2].append(com);samples[3].append(sigma) + samples[0].append(rms_com);samples[1].append(rms_sigma); + samples[2].append(com);samples[3].append(sigma);samples[4].append(amp);samples[5].append(off) #print [off, amp, com, sigma] #from mathutils import Gaussian @@ -227,19 +257,71 @@ def calculate(): msg += " RMS Sigma: " + "%.4f" % stats[i][1][0] + " +- " + "%.4f" % stats[i][1][1] + "\n" msg += " Gauss COM: " + "%.4f" % stats[i][2][0] + " +- " + "%.4f" % stats[i][2][1] + "\n" msg += " Gauss Sigma: " + "%.4f" % stats[i][3][0] + " +- " + "%.4f" % stats[i][3][1] + "\n" + + if i==0: #Write channels for BLM 1 + scanner.set_out_com(bunch,wire,stats[i][0][0]) + scanner.set_out_rms(bunch,wire,stats[i][1][0]) + scanner.set_out_mean(bunch,wire,stats[i][2][0]) + scanner.set_out_sigma(bunch,wire,stats[i][3][0] ) + scanner.set_out_amp(bunch,wire,stats[i][4][0]) + scanner.set_out_off(bunch,wire,stats[i][5][0]) + if len(samples_pos) > SAMPLE_CHANNEL_SIZE: + samples_pos = samples_pos[0:SAMPLE_CHANNEL_SIZE] + else: + samples_pos += [SAMPLE_CHANNEL_EMPTY_VALUE] * (SAMPLE_CHANNEL_SIZE - len(samples_pos)) + if len(samples_val) > SAMPLE_CHANNEL_SIZE: + samples_val = samples_pos[0:SAMPLE_CHANNEL_SIZE] + else: + samples_val += [SAMPLE_CHANNEL_EMPTY_VALUE] * (SAMPLE_CHANNEL_SIZE - len(samples_val)) + scanner.set_out_pos(bunch,wire,samples_pos) + scanner.set_out_samples(bunch,wire,samples_val) + + try: + gauss = Gaussian(stats[i][4][0], stats[i][2][0], stats[i][3][0]) + gauss = [gauss.value(v)+stats[i][5][0] for v in samples_pos] + except: + traceback.print_exc() + gauss = [0.0] * SAMPLE_CHANNEL_SIZE + scanner.set_out_gauss(bunch,wire,gauss) except Exception, e: print >> sys.stderr, traceback.format_exc() msg += str(e)+ "\n" +def get_scan_time(): + global bkgrd, scan_type, scan_range, velocity + _range = 0 + if not scan_type in [WireScanner.WireY1, WireScanner.WireY2]: + _range += abs(scan_range[0] - scan_range[1]) #X SCAN + if not scan_type in [WireScanner.WireX1, WireScanner.WireX2]: + _range += abs(scan_range[2] - scan_range[3]) #Y SCAN + ret = _range / velocity + ret += 2.0 #ACC/DEC + ret += bkgrd * (1.0/get_repetition_rate()) #BACK + print "Scan time = " + str(ret), + ret = ret * 2.0 + 10.0 #Tolernces + print "; with tolerance = " + str(ret), + return ret + print "Starting scan..." try: + if SET_BLM_WS_MODE and len(blms)>0: + start_blm_ws(blms[0], get_scan_time()) + #TODO: Wait for stream variable indicate bllm is in ws mode + print "Waiting for WS mode..." + #time.sleep(SET_BLM_WS_SETTLING_TIME) + st.getChild("blm1_ws_mode").waitValue(1, SET_BLM_WS_BS_READBACK_TIMEOUT) + print "Reading background..." do_background() st.setFilter(scanner.curr_cycl.get_name() + ">0") #scanner.status_channels[0].get_name() + ">0" not used because we must the transition to know when the finished + print "Executing scan 1..." do_scan(0) if scan_type in [WireScanner.Set1, WireScanner.Set2]: + print "Executing scan 2..." do_scan(1) finally: + if SET_BLM_WS_MODE and len(blms)>0: + stop_blm_ws(blms[0]) print "Closing scanner" scanner.close() print "Closing stream" @@ -259,6 +341,7 @@ if do_elog: log_msg = log_msg + "\nBackground Measures: " + str(bkgrd) log_msg = log_msg + "\nBPMs: " + str(bpms) log_msg = log_msg + "\nBLMs: " + str(blms) + log_msg = log_msg + "\nBunch: " + str(bunch) log_msg = log_msg + "\n" + msg elog("Wire Scan", log_msg, snapshots) diff --git a/script/Diagnostics/WireScanBack.py b/script/Diagnostics/WireScanBack.py new file mode 100644 index 0000000..62f140b --- /dev/null +++ b/script/Diagnostics/WireScanBack.py @@ -0,0 +1,267 @@ +import traceback + +is_panel = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" + +run("Devices/Elements") +run("Devices/WireScanner") +run("Diagnostics/sig_process_wrapper") + +BPM_SENSORS = [("x","X1"), ("y","Y1"), ("q","Q1")] #(logic name sufix, channel sufix) + +#Paramter parsing +prefix = args[0] if is_panel else "S30CB09-DWSC440" #"SINDI01-DWSC090" +scan_type = args[1] if is_panel else WireScanner.WireX1 +scan_range = args[2] if is_panel else [-200, 200, -200, 200] +cycles = args[3] if is_panel else 3 +velocity = args[4] if is_panel else 200 +bpms = args[5] if is_panel else get_wire_scanners_bpms(prefix) +blms = args[6] if is_panel else get_wire_scanners_blms(prefix) +bkgrd = args[7] if is_panel else 10 +plt = args[8] if is_panel else plot(None, title = "Wire Scan")[0] +save_raw = args[9] if is_panel else False +do_elog = False if (plt is None) else (True if is_panel else True) +print "WireScan parameters: ", prefix, scan_type, scan_range, cycles, velocity, bpms, blms, bkgrd + + +#Plot setup +if plt is not None: + plt.clear() + plt.removeMarker(None) + plt.getAxis(plt.AxisId.X).setLabel("Position"); + plt.getAxis(plt.AxisId.Y).setLabel(""); + plt.getAxis(plt.AxisId.Y2).setLabel(""); + plt.setLegendVisible(True); +snapshots = [] + +#Creating WireScanner object +print "Creating scanner..." +if prefix not in get_wire_scanners(): + raise Exception("Invalid wire scan: " + prefix) +scanner = WireScanner(prefix, scan_range, cycles, velocity, True) + +#List of stream channels +channels = [("m_pos", scanner.motor_bs_readback.get_name()), + ("cur_cycle", scanner.curr_cycl.get_name()), + ("scanning", scanner.status_channels[0].get_name())] +for i in range (len(blms)): + channels.append (("blm" + str(i+1), blms[i] + ":B1_LOSS")) + if plt is not None: + series = LinePlotSeries(blms[i], None, min(i+1, 2)) + plt.addSeries(series) + series.setLinesVisible(False) + series.setPointSize(2) + if save_raw: + channels.append (("blm" + str(i+1) + "_raw" , blms[i] + ":LOSS_SIGNAL_RAW")) +for i in range (len(bpms)): + for sensor in BPM_SENSORS: + channels.append (("bpm" + str(i+1) + "_" + sensor[0], bpms[i] + ":" + sensor[1])) + +#Metadata +set_attribute("/", "Wire Scanner", prefix) +set_attribute("/", "Scan Type", scan_type) +set_attribute("/", "Range", scan_range) +set_attribute("/", "Cycles", cycles) +set_attribute("/", "Motor Velocity", velocity*math.sqrt(2)) +set_attribute("/", "Wire Velocity", velocity) +set_attribute("/", "Background Measures", bkgrd) +set_attribute("/", "BPMs", bpms) +set_attribute("/", "BLMs", blms) + +filename = get_exec_pars().path + + + +#Stream creation +print "Starting stream..." +st = Stream("pulse_id", dispatcher) +for c in channels: + st.addScalar(c[0], c[1], int(100.0 / get_repetition_rate()), 0) +st.initialize() +st.start() +st.waitCacheChange(10000) #Wait stream be running before starting scan + + +class Timestamp(Readable): + def read(self): + return st.getTimestamp() + + + + +#Pseudo-device returning the wire position +class w_pos(Readable): + def read(self): + return scanner.get_sel_wire_pos(st.getChildren()[0].take()) + +#End of scan checking +scan_complete, cur_cycle, wire = None, None, None + +def check_end_scan(record, scan): + global scan_complete,cur_cycle + if record[4]<1: + print "Data aquisition completed" + scan_complete=True + scan.abort() + record.cancel() #So it won't be saved + else: + position = record[0] + if record[3] != cur_cycle: + cur_cycle = record[3] + get_context().dataManager.splitScanData(scan) + #if plt is not None: for s in plt.getAllSeries(): s.clear() + if plt is not None: + for i in range (len(blms)): + plt.getSeries(i).appendData(position, record[5 + i]) + +#Process background +def do_background(): + #Store Background + if bkgrd>0: + scanner.park(wait=True) + set_exec_pars(group = "background") + r = mscan (st, st.getReadables()[4:], bkgrd) + for i in range(len(r.getReadables())): + d = r.getReadable(i) + path = get_exec_pars().group + "/"+ r.getReadables()[i].name + set_attribute(path, "Mean", mean(d)) + set_attribute(path, "Sigma", stdev(d) ) + +#Scan +def do_scan(index): + global scan_complete, cur_cycle, wire + wire = "y" if (index==1) or (scan_type in [WireScanner.WireY1, WireScanner.WireY2]) else "x" + set_exec_pars(group=wire+"_{count}", reset=True) + scanner.set_selection(get_scan_selection(scan_type, index)) + if plt is not None: + if wire == "x": + plt.getAxis(plt.AxisId.X).setRange(scan_range[0], scan_range[1]) + else: + plt.getAxis(plt.AxisId.X).setRange(scan_range[2], scan_range[3]) + + scanner.init(wait=True) + scanner.curr_cycl.write(0) + scan_complete=False + cur_cycle = 1.0 + + if plt is not None: + for s in plt.getAllSeries(): + s.clear() + plt.removeMarker(None) + try: + scanner.scan() #scanner.waitState(State.Busy, 60000) Not needed as stream filter will make the wait + st.getChild("scanning").waitValue(1.0, 10000) + #print st.getValues() + + #TODO: Check what the problem is + #mscan (st, [w_pos(),] + st.getReadables() + [Timestamp(),], -1, -1, take_initial = True, after_read = check_end_scan) + + l=[w_pos()] ; l.extend(st.getReadables()); l.append(Timestamp()) + mscan (st, l, -1, -1, take_initial = True, after_read = check_end_scan) + + #tscan([w_pos()] + st.getReadables() + [Timestamp(),], 10, 0.5) + except: + print sys.exc_info()[1] + if not scanner.isReady(): + print "Aborting scan" + scanner.abort() + if not scan_complete: + raise + finally: + #Combining data of multiple series + #s=plt.getSeries(0) + #indexes = sorted(range(len(s.x)),key=lambda x:s.x[x]) + #x,y = [s.x[x] for x in indexes], [s.y[x] for x in indexes] + #plot(y, xdata = x) + calculate() + img_file = os.path.abspath(filename + "_" + get_exec_pars().group[0:1] + ".png") + time.sleep(0.1) #Give some time to plot finish (async) + if plt is not None: + plt.saveSnapshot(img_file, "png") + snapshots.append(img_file) + +msg = "" +ret = [] +def calculate(): + global msg + stats = [] + for i in range(len(blms)): + msg += "Wire " + wire + " - BLM " + str(i+1) + ":\n" + try: + bg = get_attributes("background/blm" + str(i+1))["Mean"] if bkgrd>0 else 0.0 + samples = [[], [], [], []] + for cycle in range (cycles): + pos_path = wire+"_" + ("%04d" % (cycle+1)) + "/w_pos" + pos = load_data(pos_path) + path = wire+"_" + ("%04d" % (cycle+1)) + "/blm" + str(i+1) + data = load_data(path) + sp = blm_remove_spikes(data) + sig = sp if bg is None else [v-bg for v in sp] + + [rms_com, rms_sigma] = profile_rms_stats(pos, sig,noise_std=0, n_sigma=3.5) + set_attribute(path, "RMS COM", float("nan") if (rms_com is None) else rms_com) + set_attribute(path, "RMS Sigma", float("nan") if (rms_sigma is None) else rms_sigma) + + #print [com, rms] + [off, amp, com, sigma] = profile_gauss_stats(pos, sig, off=None, amp=None, com=None, sigma=None) + set_attribute(path, "Gauss COM", float("nan") if (com is None) else com) + set_attribute(path, "Gauss Sigma", float("nan") if (sigma is None) else sigma) + + samples[0].append(rms_com);samples[1].append(rms_sigma);samples[2].append(com);samples[3].append(sigma) + #print [off, amp, com, sigma] + + #from mathutils import Gaussian + #g = Gaussian(amp, com, sigma) + #gauss = [g.value(v)+off for v in pos] + #plot([data, sp, sig, gauss], ["data", "sp", "signal", "gauss", ], xdata = pos, title="Fit blm" + str(i+1) + " - " + str(cycle+1)) + ret.extend([rms_com, rms_sigma, com, sigma, get_exec_pars().path + "|"+ pos_path, get_exec_pars().path + "|"+ path]) + + stats.append([]) + for sample in samples: + sample = [v for v in sample if v is not None] + stats[i].append( (mean(sample), stdev(sample)) if len(sample)>0 else (float("nan"), float("nan")) ) + if plt is not None: + plt.addMarker(stats[i][2][0], None, "Gcom=" + "%.2f" % stats[i][2][0], plt.getSeries(i).color) + plt.addMarker(stats[i][0][0], None, "Rcom=" + "%.2f" % stats[i][0][0], plt.getSeries(i).color.brighter()) + + msg += " RMS COM: " + "%.4f" % stats[i][0][0] + " +- " +"%.4f" % stats[i][0][1] + "\n" #unichr(0x03C3) + "=" + msg += " RMS Sigma: " + "%.4f" % stats[i][1][0] + " +- " + "%.4f" % stats[i][1][1] + "\n" + msg += " Gauss COM: " + "%.4f" % stats[i][2][0] + " +- " + "%.4f" % stats[i][2][1] + "\n" + msg += " Gauss Sigma: " + "%.4f" % stats[i][3][0] + " +- " + "%.4f" % stats[i][3][1] + "\n" + except Exception, e: + print >> sys.stderr, traceback.format_exc() + msg += str(e)+ "\n" + + +print "Starting scan..." +try: + do_background() + st.setFilter(scanner.curr_cycl.get_name() + ">0") #scanner.status_channels[0].get_name() + ">0" not used because we must the transition to know when the finished + do_scan(0) + if scan_type in [WireScanner.Set1, WireScanner.Set2]: + do_scan(1) +finally: + print "Closing scanner" + scanner.close() + print "Closing stream" + st.close() + +print msg + +# save the entry in the logbook +if do_elog: + if get_option("Generated data file:\n" + filename +"\n\n" + msg + "\n\n" + "Save to ELOG?", "YesNo") == "Yes": + log_msg = "Data file: " + filename + log_msg = log_msg + "\nWire Scanner: " + prefix + log_msg = log_msg + "\nScan Type: " + str(scan_type) + log_msg = log_msg + "\nRange: " + str(scan_range) + log_msg = log_msg + "\nCycles: " + str(cycles) + log_msg = log_msg + "\nWire Velocity: " + str(velocity) + log_msg = log_msg + "\nBackground Measures: " + str(bkgrd) + log_msg = log_msg + "\nBPMs: " + str(bpms) + log_msg = log_msg + "\nBLMs: " + str(blms) + + log_msg = log_msg + "\n" + msg + elog("Wire Scan", log_msg, snapshots) + +set_exec_pars(open=False) +set_return(ret) \ No newline at end of file diff --git a/script/Diagnostics/WireScanBack2.py b/script/Diagnostics/WireScanBack2.py new file mode 100644 index 0000000..011ac7e --- /dev/null +++ b/script/Diagnostics/WireScanBack2.py @@ -0,0 +1,302 @@ +import traceback + +is_panel = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" + +run("Devices/Elements") +run("Devices/WireScanner") +run("Diagnostics/sig_process_wrapper") + + +#Paramter parsing +prefix = args[0] if is_panel else "S10CB07-DWSC440" #"SINDI01-DWSC090" +scan_type = args[1] if is_panel else WireScanner.WireX1 +scan_range = args[2] if is_panel else [-200, 200, -200, 200] +cycles = args[3] if is_panel else 2 +velocity = args[4] if is_panel else 200 +bpms = args[5] if is_panel else get_wire_scanners_bpms(prefix) +blms = args[6] if is_panel else get_wire_scanners_blms(prefix) +bkgrd = args[7] if is_panel else 5 +plt = args[8] if is_panel else plot(None, title = "Wire Scan")[0] +save_raw = args[9] if is_panel else True +bunch = args[10] if is_panel else 1 +do_elog = False if (plt is None) else (True if is_panel else True) +print "WireScan parameters: ", prefix, scan_type, scan_range, cycles, velocity, bpms, blms, bkgrd, bunch + +SET_BLM_WS_MODE = False +SET_BLM_WS_SETTLING_TIME = 2.0 + +BPM_SENSORS = [("x","X"+str(bunch)), ("y","Y"+str(bunch)), ("q","Q"+str(bunch))] #(logic name suffix, channel suffix) + +#Plot setup +if plt is not None: + plt.clear() + plt.removeMarker(None) + plt.getAxis(plt.AxisId.X).setLabel("Position"); + plt.getAxis(plt.AxisId.Y).setLabel(""); + plt.getAxis(plt.AxisId.Y2).setLabel(""); + plt.setLegendVisible(True); +snapshots = [] + +#Creating WireScanner object +print "Creating scanner..." +if prefix not in get_wire_scanners(): + raise Exception("Invalid wire scan: " + prefix) +scanner = WireScanner(prefix, scan_range, cycles, velocity, True) + +#List of stream channels +channels = [("m_pos", scanner.motor_bs_readback.get_name()), + ("cur_cycle", scanner.curr_cycl.get_name()), + ("scanning", scanner.status_channels[0].get_name())] + +for i in range (len(blms)): + channels.append (("blm" + str(i+1), blms[i] + ":B" + str(bunch) + "_LOSS")) + if plt is not None: + series = LinePlotSeries(blms[i], None, min(i+1, 2)) + plt.addSeries(series) + series.setLinesVisible(False) + series.setPointSize(2) + if save_raw: + channels.append (("blm" + str(i+1) + "_raw" , blms[i] + ":LOSS_SIGNAL_RAW")) +for i in range (len(bpms)): + for sensor in BPM_SENSORS: + channels.append (("bpm" + str(i+1) + "_" + sensor[0], bpms[i] + ":" + sensor[1])) + +#Metadata +set_attribute("/", "Wire Scanner", prefix) +set_attribute("/", "Scan Type", scan_type) +set_attribute("/", "Range", scan_range) +set_attribute("/", "Cycles", cycles) +set_attribute("/", "Motor Velocity", velocity*math.sqrt(2)) +set_attribute("/", "Wire Velocity", velocity) +set_attribute("/", "Background Measures", bkgrd) +set_attribute("/", "BPMs", bpms) +set_attribute("/", "BLMs", blms) +set_attribute("/", "Bunch", bunch) + +filename = get_exec_pars().path + + + +#Stream creation +print "Starting stream..." +st = Stream("pulse_id", dispatcher) +for c in channels: + if c[1].endswith("LOSS_SIGNAL_RAW"): + st.addWaveform(c[0], c[1], int(100.0 / get_repetition_rate()), 0) + else: + st.addScalar(c[0], c[1], int(100.0 / get_repetition_rate()), 0) +st.initialize() +st.start() +st.waitCacheChange(10000) #Wait stream be running before starting scan + + +class Timestamp(Readable): + def read(self): + return st.getTimestamp() + + + + +#Pseudo-device returning the wire position +class w_pos(Readable): + def read(self): + return scanner.get_sel_wire_pos(st.getChild("m_pos").take()) + +#End of scan checking +scan_complete, cur_cycle, wire = None, None, None + +def check_end_scan(record, scan): + global scan_complete,cur_cycle + if record[4]<1: + print "Data aquisition completed" + scan_complete=True + scan.abort() + record.cancel() #So it won't be saved + else: + position = record[0] + if record[3] != cur_cycle: + cur_cycle = record[3] + get_context().dataManager.splitScanData(scan) + #if plt is not None: for s in plt.getAllSeries(): s.clear() + if plt is not None: + for i in range (len(blms)): + plt.getSeries(i).appendData(position, record[5 + i]) + +#Process background +def do_background(): + #Store Background + if bkgrd>0: + scanner.park(wait=True) + set_exec_pars(group = "background") + r = mscan (st, st.getReadables()[4:], bkgrd) + for i in range(len(r.getReadables())): + d = r.getReadable(i) + try: + path = get_exec_pars().group + "/"+ r.getReadables()[i].name + set_attribute(path, "Mean", mean(d)) + set_attribute(path, "Sigma", stdev(d) ) + except: + pass + +#Scan +def do_scan(index): + global scan_complete, cur_cycle, wire + wire = "y" if (index==1) or (scan_type in [WireScanner.WireY1, WireScanner.WireY2]) else "x" + set_exec_pars(group=wire+"_{count}", reset=True) + scanner.set_selection(get_scan_selection(scan_type, index)) + if plt is not None: + if wire == "x": + plt.getAxis(plt.AxisId.X).setRange(scan_range[0], scan_range[1]) + else: + plt.getAxis(plt.AxisId.X).setRange(scan_range[2], scan_range[3]) + scanner.init(wait=True) + scanner.curr_cycl.write(0) + scan_complete=False + cur_cycle = 1.0 + + if plt is not None: + for s in plt.getAllSeries(): + s.clear() + plt.removeMarker(None) + try: + scanner.scan() #scanner.waitState(State.Busy, 60000) Not needed as stream filter will make the wait + st.getChild("scanning").waitValue(1.0, 10000) + #print st.getValues() + + #TODO: Check what the problem is + #mscan (st, [w_pos(),] + st.getReadables() + [Timestamp(),], -1, -1, take_initial = True, after_read = check_end_scan) + + l=[w_pos()] ; l.extend(st.getReadables()); l.append(Timestamp()) + mscan (st, l, -1, -1, take_initial = True, after_read = check_end_scan) + + #tscan([w_pos()] + st.getReadables() + [Timestamp(),], 10, 0.5) + except: + print sys.exc_info()[1] + if not scanner.isReady(): + print "Aborting scan" + scanner.abort() + if not scan_complete: + raise + finally: + #Combining data of multiple series + #s=plt.getSeries(0) + #indexes = sorted(range(len(s.x)),key=lambda x:s.x[x]) + #x,y = [s.x[x] for x in indexes], [s.y[x] for x in indexes] + #plot(y, xdata = x) + calculate() + img_file = os.path.abspath(filename + "_" + get_exec_pars().group[0:1] + ".png") + time.sleep(0.1) #Give some time to plot finish (async) + if plt is not None: + plt.saveSnapshot(img_file, "png") + snapshots.append(img_file) + +msg = "" +ret = [] +def calculate(): + global msg + stats = [] + for i in range(len(blms)): + msg += "Wire " + wire + " - BLM " + str(i+1) + ":\n" + try: + bg = get_attributes("background/blm" + str(i+1))["Mean"] if bkgrd>0 else 0.0 + samples = [[], [], [], []] + for cycle in range (cycles): + pos_path = wire+"_" + ("%04d" % (cycle+1)) + "/w_pos" + pos = load_data(pos_path) + path = wire+"_" + ("%04d" % (cycle+1)) + "/blm" + str(i+1) + data = load_data(path) + sp = data #blm_remove_spikes(data) + sig = sp if bg is None else [v-bg for v in sp] + + #print [com, rms] + [off, amp, com, sigma] = profile_gauss_stats(pos, sig, off=None, amp=None, com=None, sigma=None) + set_attribute(path, "Gauss COM", float("nan") if (com is None) else com) + set_attribute(path, "Gauss Sigma", float("nan") if (sigma is None) else sigma) + + #[rms_com, rms_sigma] = profile_rms_stats(pos, sig,noise_std=0, n_sigma=3.5) + [rms_com, rms_sigma] = profile_rms_stats_with_estimate(pos, sig, com_estimate = com, window_size = sigma * 3.5) + set_attribute(path, "RMS COM", float("nan") if (rms_com is None) else rms_com) + set_attribute(path, "RMS Sigma", float("nan") if (rms_sigma is None) else rms_sigma) + + + samples[0].append(rms_com);samples[1].append(rms_sigma);samples[2].append(com);samples[3].append(sigma) + #print [off, amp, com, sigma] + + #from mathutils import Gaussian + #g = Gaussian(amp, com, sigma) + #gauss = [g.value(v)+off for v in pos] + #plot([data, sp, sig, gauss], ["data", "sp", "signal", "gauss", ], xdata = pos, title="Fit blm" + str(i+1) + " - " + str(cycle+1)) + ret.extend([rms_com, rms_sigma, com, sigma, get_exec_pars().path + "|"+ pos_path, get_exec_pars().path + "|"+ path]) + + stats.append([]) + for sample in samples: + sample = [v for v in sample if v is not None] + stats[i].append( (mean(sample), stdev(sample)) if len(sample)>0 else (float("nan"), float("nan")) ) + if plt is not None: + plt.addMarker(stats[i][2][0], None, "Gcom=" + "%.2f" % stats[i][2][0], plt.getSeries(i).color) + plt.addMarker(stats[i][0][0], None, "Rcom=" + "%.2f" % stats[i][0][0], plt.getSeries(i).color.brighter()) + + msg += " RMS COM: " + "%.4f" % stats[i][0][0] + " +- " +"%.4f" % stats[i][0][1] + "\n" #unichr(0x03C3) + "=" + msg += " RMS Sigma: " + "%.4f" % stats[i][1][0] + " +- " + "%.4f" % stats[i][1][1] + "\n" + msg += " Gauss COM: " + "%.4f" % stats[i][2][0] + " +- " + "%.4f" % stats[i][2][1] + "\n" + msg += " Gauss Sigma: " + "%.4f" % stats[i][3][0] + " +- " + "%.4f" % stats[i][3][1] + "\n" + except Exception, e: + print >> sys.stderr, traceback.format_exc() + msg += str(e)+ "\n" + + +def get_scan_time(): + global bkgrd, scan_type, scan_range, velocity + _range = 0 + if not scan_type in [WireScanner.WireY1, WireScanner.WireY2]: + _range += abs(scan_range[0] - scan_range[1]) #X SCAN + if not scan_type in [WireScanner.WireX1, WireScanner.WireX2]: + _range += abs(scan_range[2] - scan_range[3]) #Y SCAN + ret = _range / velocity + ret += 2.0 #ACC/DEC + ret += bkgrd * (1.0/get_repetition_rate()) #BACK + print "Scan time = " + str(ret), + ret = ret * 2.0 + 10.0 #Tolernces + print "; with tolerance = " + str(ret), + return ret + +print "Starting scan..." +try: + if SET_BLM_WS_MODE and len(blms)>0: + start_blm_ws(blms[0], get_scan_time()) + #TODO: Wait for stream variable indicate bllm is in ws mode + time.sleep(SET_BLM_WS_SETTLING_TIME) + do_background() + st.setFilter(scanner.curr_cycl.get_name() + ">0") #scanner.status_channels[0].get_name() + ">0" not used because we must the transition to know when the finished + do_scan(0) + if scan_type in [WireScanner.Set1, WireScanner.Set2]: + do_scan(1) +finally: + if SET_BLM_WS_MODE and len(blms)>0: + stop_blm_ws(blms[0]) + print "Closing scanner" + scanner.close() + print "Closing stream" + st.close() + +print msg + +# save the entry in the logbook +if do_elog: + if get_option("Generated data file:\n" + filename +"\n\n" + msg + "\n\n" + "Save to ELOG?", "YesNo") == "Yes": + log_msg = "Data file: " + filename + log_msg = log_msg + "\nWire Scanner: " + prefix + log_msg = log_msg + "\nScan Type: " + str(scan_type) + log_msg = log_msg + "\nRange: " + str(scan_range) + log_msg = log_msg + "\nCycles: " + str(cycles) + log_msg = log_msg + "\nWire Velocity: " + str(velocity) + log_msg = log_msg + "\nBackground Measures: " + str(bkgrd) + log_msg = log_msg + "\nBPMs: " + str(bpms) + log_msg = log_msg + "\nBLMs: " + str(blms) + log_msg = log_msg + "\nBunch: " + str(bunch) + + log_msg = log_msg + "\n" + msg + elog("Wire Scan", log_msg, snapshots) + +set_exec_pars(open=False) +set_return(ret) \ No newline at end of file diff --git a/script/Diagnostics/WireScanCalibration.py b/script/Diagnostics/WireScanCalibration.py new file mode 100644 index 0000000..02a1190 --- /dev/null +++ b/script/Diagnostics/WireScanCalibration.py @@ -0,0 +1,109 @@ +import traceback + +is_panel = get_exec_pars().source != CommandSource.ui #Must be checked before callin "run" + +run("Devices/Elements") +run("Devices/WireScanner") +run("Diagnostics/sig_process_wrapper") + +ws_prefix = args[0] if is_panel else "S10DI01-DWSC010" #"S10CB07-DWSC440" #"SINDI01-DWSC090" \\ +plt = args[1] if is_panel else plot(None, title = "Wire Scan Calibration")[0] +ws_blm = get_wire_scanners_blms(ws_prefix )[0] +#S10DI01-DBLM113:AL1-WS-PMT-GAIN + +SATURATION = 1000 +OPT_STEP = 0.01 + + +#2) Set the number of RF shots (N_shot) to be acquired during a single cycle WSC measurement (e.g.,N_shot=50) +n_shot = 50 + +#3) Set a test scanning range (e.g.,Xmin=-1000,Xmax=+1000um) +x_min, x_max = -1000.0, 1000.0 + + +#4) For a given machine repetition-rate (RR), the scan speed is automatically set to WSC_speed=(Xmax- Xmin)*RR/N_shot +rr = get_repetition_rate() +ws_speed = (x_max- x_min)*rr/n_shot + +#5) Proceed with a test scan (1 cycle) according to the above defined motor settings +args = [ ws_prefix , WireScanner.WireX1, [x_min, x_max, x_min, x_max], 1, ws_speed, [], [ws_blm], 10, plt, False,1] +ret = run("Diagnostics/WireScan", args) + + +#1) Select a BLM to be used in the WSC measurement and enable the WS_START so that it can be extracted out of the MPS and PMT-Gain and attenuation can be adjusted +#start_blm_ws(ws_blm, 600.0) + + +#6) Apply a gauss fit to the obtained WSC profile in order to determine X_CoM and standard deviation (sigma_Gauss) +[rms_com, rms_sigma, com, sigma, pos_path, path] = ret +#7) Move the wire to the X_CoM position and optimize the PMT-Gain so that the time-integral of the BLM voltage reaches a value equal to 90% of the Σsat level + +offset = caget(ws_prefix + ":W1X_U0_SP") +motor_pos=offset - com * math.sqrt(2) +caput(ws_prefix+":MOTOR_1.VAL", motor_pos) #DVAL? +#LOPR:0.5 HOPR:1.1 + +def get_gain(): + return caget(ws_blm + ":WS_PMT_GAIN_VOLTS") + +def set_gain(val): + caput(ws_blm + ":WS_PMT_GAIN_VOLTS", float(val)) + + + +print "Starting stream..." +st = Stream("blm_stream", dispatcher) +ch = ws_blm + ":B1_LOSS" +st.addScalar(ch, ch, int(100.0 / get_repetition_rate()), 0) +st.initialize() +st.start() +st.waitCacheChange(10000) #Wait stream be running before starting scan + + +def get_loss(): + return st.getValue(ch) + + +start_gain = get_gain() +pos = start_val = get_loss() +loss = get_loss() +target = SATURATION * 0.9 + +print "Start Gain = ", start_gain +print "Start Loss = ", start_val +print "Target = ", target + +if start_val>target: + for pos in range(start_val, target, -OPT_STEP): + set_gain(pos) + loss = get_loss() + if loss<=target: + break +elif start_val=target: + break + +print "Final Gain = ", pos +print "Final Loss = ", loss +print get_gain() +print get_loss() +#set_gain(0.6) +#set_gain(0.5) + + +#caget(ws_blm+":SAT_RAW_SUM") + +#Att: caget(ws_blm + ":WS_PMT_ATT_VOLTS") + +#8) Optimization of the scan interval: compare (Xmin, Xmax) with (X_CoM-N*sigma_Gauss , X_CoM+N*sigma_Gauss) where N is an integer value: N=5,6. + +#9) Increase or decrease Xmin and/or Xmax by 10% and repeat the scan until the conditions [abs(Xmin)-abs(X_CoM- N*sigma_Gauss)]/abs(X_CoM-N*sigma_Gauss)<=0.1 and [abs(Xmax) - abs(X_CoM+N*sigma_Gauss)]/abs(X_CoM+N*sigma_Gauss) <=0.1 is reached + +#10)Once condition 9) is reached, the flag: VALID_SCAN should be enabled and a WSC measurement can be performed according to the number of Cycles set in the control-panel and the optimized values of the scan interval and scan speed. + + +st.close() \ No newline at end of file diff --git a/script/Diagnostics/WireScannersStatus.py b/script/Diagnostics/WireScannersStatus.py new file mode 100644 index 0000000..025a46e --- /dev/null +++ b/script/Diagnostics/WireScannersStatus.py @@ -0,0 +1,14 @@ +run("Devices/Elements") + +for scanner in get_wire_scanners(): + try: + if caget(scanner + ":MOTOR_1_HOMED",'i') != 1: + print scanner + " is not homed" + else: + pos = caget(scanner + ":MOTOR_1.RBV", 's') + if (caget(scanner + ":WIRE_SP", 'i') != 0) or (caget(scanner + ":INIT_DONE", 'i') != 1): + print scanner + " is not parked - pos: " + pos + " - Parking..." + else: + print scanner + " is parked - pos: " + pos + except: + print "Error accessing: " + scanner \ No newline at end of file diff --git a/script/Diagnostics/sig_process.py b/script/Diagnostics/sig_process.py index 66f18db..d9d15da 100644 --- a/script/Diagnostics/sig_process.py +++ b/script/Diagnostics/sig_process.py @@ -103,7 +103,7 @@ def remove_beam_jitter(pos: np.ndarray, bpm1: np.ndarray, bpm2: np.ndarray, d_b1 # Profile statistics #### -def profile_gauss_stats(x, y, off=None, amp=None, com=None, sigma=None): +def profile_gauss_stats(x, y, off=None, amp=None, com=None, sigma=None, with_offset=True): if off is None: off = y.min() # good enough starting point for offset @@ -118,8 +118,14 @@ def profile_gauss_stats(x, y, off=None, amp=None, com=None, sigma=None): surface = np.trapz((y-off), x=x) sigma = surface / (amp * np.sqrt(2 * np.pi)) try: - popt, pcov = scipy.optimize.curve_fit(gauss_fn, x, y, p0=[off, amp, com, sigma], method='lm') - popt[3] = abs(popt[3]) # sigma should be returned as positive + #popt, pcov = scipy.optimize.curve_fit(gauss_fn, x, y, p0=[off, amp, com, sigma], method='lm') + #CHANGED BY GOBBO + if with_offset: + popt, pcov = scipy.optimize.curve_fit(gauss_fn, x, y, p0=[off, amp, com, sigma]) + popt[3] = abs(popt[3]) # sigma should be returned as positive + else: + popt, pcov = scipy.optimize.curve_fit(gauss_fn_no_offset, x, y, p0=[amp, com, sigma]) + popt[2] = abs(popt[2]) # sigma should be returned as positive except Exception as e: print("Gauss fitting not successful.\n" + str(e)) popt = [off, amp, com, abs(sigma)] @@ -130,6 +136,9 @@ def profile_gauss_stats(x, y, off=None, amp=None, com=None, sigma=None): def gauss_fn(x, a, b, c, d): return a + b * np.exp(-(np.power((x - c), 2) / (2 * np.power(d, 2)))) +def gauss_fn_no_offset(x, b, c, d): + return b * np.exp(-(np.power((x - c), 2) / (2 * np.power(d, 2)))) + def profile_rms_stats(x, y, noise_std=0, n_sigma=3.5): """ @@ -212,6 +221,49 @@ def profile_rms_stats(x, y, noise_std=0, n_sigma=3.5): else: return None, None +def profile_rms_stats_with_estimate(x, y, com_estimate, window_size): + """ + Does the center of mass and RMS calculation on given profile. + + :param x: data of x axis (wire position) + :param y: data of y axis (blm current) + :param noise_std: standard deviation of noise + :param n_sigma: multiplication of window size (n_sigma*sigma) where sigma is first estimation of sigma + :return: rms of signal + """ + window_size + + if x.shape == y.shape: + # Windowing the signal + # Define direction of scan + if x[0] < x[-1]: # increasing position + low_boundary = np.argmax(x >= com_estimate - window_size)-1 + high_boundary = np.argmax(x >= com_estimate +window_size)-1 + + else: # decreasing position + high_boundary = np.argmax(x <= com_estimate- window_size)-1 + low_boundary = np.argmax(x <= com_estimate +window_size)-1 + + if high_boundary <= 0: + high_boundary = x.size + + if low_boundary < 0: + low_boundary = 0 + + if (high_boundary-low_boundary) < 4: + print("RMS calculation not successful. Resolution to low.\n") + return None, None + + # Calculate final RMS and centroid on ROI data + if high_boundary == x.size: + com, rms = com_rms(x[low_boundary:], y[low_boundary:]) + else: + com, rms = com_rms(x[low_boundary:high_boundary], y[low_boundary:high_boundary]) + + return com, rms + else: + return None, None + def com_rms(x, y): # Centre of mass and rms diff --git a/script/Diagnostics/sig_process_wrapper.py b/script/Diagnostics/sig_process_wrapper.py index 9109bd0..0bce402 100644 --- a/script/Diagnostics/sig_process_wrapper.py +++ b/script/Diagnostics/sig_process_wrapper.py @@ -20,12 +20,14 @@ def remove_beam_jitter(pos, bpm1, bpm2, d_b1_w=1, d_w_b2=1): ret = call_jep(MODULE, "remove_beam_jitter", [to_npa(pos),to_npa(bpm1), to_npa(bpm2), d_b1_w, d_w_b2 ]) return ret if ret is None or is_list(ret) else ret.data -def profile_gauss_stats(x, y, off=None, amp=None, com=None, sigma=None): - ret = call_jep(MODULE, "profile_gauss_stats", [to_npa(x), to_npa(y), off, amp, com, sigma]) +def profile_gauss_stats(x, y, off=None, amp=None, com=None, sigma=None, with_offset = True): + ret = call_jep(MODULE, "profile_gauss_stats", [to_npa(x), to_npa(y), off, amp, com, sigma, with_offset]) return ret if ret is None or is_list(ret) else ret.data def profile_rms_stats(x, y, noise_std=0, n_sigma=3.5): return call_jep(MODULE, "profile_rms_stats", [to_npa(x), to_npa(y), noise_std, n_sigma]) - \ No newline at end of file + +def profile_rms_stats_with_estimate(x, y, com_estimate, window_size): + return call_jep(MODULE, "profile_rms_stats_with_estimate", [to_npa(x), to_npa(y), com_estimate, window_size]) diff --git a/script/K-calc.py b/script/K-calc.py deleted file mode 100644 index 5c94a6e..0000000 --- a/script/K-calc.py +++ /dev/null @@ -1,9 +0,0 @@ -Eph1 = 2365 -Eph2 = 2150 - -undlist = (SARUN03,SARUN04,SARUN05,SARUN06,SARUN07,SARUN08,SARUN09,SARUN10,SARUN11,SARUN12,SARUN13,SARUN14,SARUN15) - - -for und in undlist - K1 = caget(und + "-RSYS:SET-SCAN-START") - K2 = SQRT(2*(Eph1/Eph2*(1+0.5*K1^2)-1)) \ No newline at end of file diff --git a/script/RFscan/GunEnergyScan.py b/script/RFscan/GunEnergyScan.py index 9c75362..796ce5b 100644 --- a/script/RFscan/GunEnergyScan.py +++ b/script/RFscan/GunEnergyScan.py @@ -1,10 +1,11 @@ import ch.psi.pshell.epics.Positioner as Positioner -#import ch.psi.pshell.epics.Camtool as Camtool dry_run = False do_elog = True is_panel = get_exec_pars().source != CommandSource.ui #must be check before run +USE_SCREEN_PANEL = True + run("CPython/wrapper") #Parameters @@ -18,10 +19,10 @@ if is_panel: p0 = args[6] plt = args[7] else: - start = 44.0 - stop = 65.0 - step = 1.0 - nb = 3 + start = 85.0 + stop = 95.0 + step = 0.5 + nb = 20 lat = 0.3 disp = -0.387 p0 = 7.1 @@ -43,10 +44,10 @@ plt.setLegendVisible(True) #Creating Phase positioner if dry_run: - phase = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE-SIM", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") + phase = Positioner("SINEG01-RSYS:SET-BEAM-PHASE-SIM", "SINEG01-RSYS:SET-BEAM-PHASE-SIM", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") camera_name = "simulation" else: - phase = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE", "SINEG01-RSYS:GET-BEAM-PHASE") + phase = Positioner("SINEG01-RSYS:SET-BEAM-PHASE", "SINEG01-RSYS:SET-BEAM-PHASE", "SINEG01-RSYS:GET-BEAM-PHASE") camera_name = "SINBD01-DSCR010" phase.config.minValue = -360.0 phase.config.maxValue = 360.0 @@ -58,10 +59,11 @@ phase.initialize() phase0 = phase.read() #Camera setup -cam_server.start(camera_name) +if USE_SCREEN_PANEL: + cam_server.start(camera_name+"_sp1", True) #True for shared pipeline +else: + cam_server.start(camera_name) wait_cam_server_message() -#x = cam_server.stream.getChild("x_fit_mean") -#dx = cam_server.stream.getChild("x_fit_standard_deviation") x = cam_server.stream.getChild("x_center_of_mass") dx = cam_server.stream.getChild("x_rms") @@ -88,7 +90,6 @@ try: finally: phase.write(phase0) phase.close() - #camtool.stop() # stops camtool but does not close it camtool is a global object cam_server.stop() # stops cam_server but does not close it cam_server is a global object ph = r.getPositions(0) @@ -99,9 +100,9 @@ dp = [abs(A) * val.mean for val in r.getReadable(1)] try: i_max = p.index(max(p)) i_min = dp.index(min(dp)) - min_i, max_i = max(i_max-8, 0), min(i_max+6, len(p)) + min_i, max_i = max(i_max-8, 0), min(i_max+8, len(p)) (ph_p_max, p_max, ph_p_fit, p_fit, p_R2) = extremum(ph[min_i:max_i], p[min_i:max_i]) - min_i, max_i = max(i_min-8, 0), min(i_min+6, len(dp)) + min_i, max_i = max(i_min-8, 0), min(i_min+8, len(dp)) (ph_dp_min, dp_min, ph_dp_fit, dp_fit, dp_R2) = extremum(ph[min_i:max_i], dp[min_i:max_i]) plt.addSeries(LinePlotErrorSeries("Momentum Fit", plt.getSeries(0).color)) plt.addSeries(LinePlotErrorSeries("Momentum Spread Fit", plt.getSeries(1).color, 2)) @@ -115,14 +116,14 @@ except: raise Exception("Fit failure") #Saving metadata -save_dataset(get_exec_pars().group + "/p", p) -set_attribute(get_exec_pars().group + "/p", "p max", p_max) -set_attribute(get_exec_pars().group + "/p", "p max phase", ph_p_max) -set_attribute(get_exec_pars().group + "/p", "p fit R2", p_R2) -save_dataset(get_exec_pars().group + "/dp", dp) -set_attribute(get_exec_pars().group + "/dp", "dp min", dp_min) -set_attribute(get_exec_pars().group + "/dp", "dp min phase", ph_dp_min) -set_attribute(get_exec_pars().group + "/dp", "dp fit R2", dp_R2) +save_dataset(get_exec_pars().group + "/processed/p", p) +set_attribute(get_exec_pars().group + "/processed/p", "p max", p_max) +set_attribute(get_exec_pars().group + "/processed/p", "p max phase", ph_p_max) +set_attribute(get_exec_pars().group + "/processed/p", "p fit R2", p_R2) +save_dataset(get_exec_pars().group + "/processed/dp", dp) +set_attribute(get_exec_pars().group + "/processed/dp", "dp min", dp_min) +set_attribute(get_exec_pars().group + "/processed/dp", "dp min phase", ph_dp_min) +set_attribute(get_exec_pars().group + "/processed/dp", "dp fit R2", dp_R2) #Elog entry if do_elog: diff --git a/script/RFscan/GunEnergyScanLasSetNew.py b/script/RFscan/GunEnergyScanLasSetNew.py new file mode 100644 index 0000000..f3aef84 --- /dev/null +++ b/script/RFscan/GunEnergyScanLasSetNew.py @@ -0,0 +1,37 @@ +dry_run = False +do_elog = True + +if get_exec_pars().source == CommandSource.ui: + las_offset_deg = 0.0 + plt = None +else: + las_offset_deg = args[0] + plt = args[1] +cur_las_delay = 0.0 +if Laser == "Alcor": + cur_las_delay = caget("SLGOS01-TSPL-ALC:CURR_DELTA_T") +elif Laser == "Jaguar": + cur_las_delay = caget("SLGJG-TSPL-JAG:CURR_DELTA_T") +new_las_delay = cur_las_delay - 333.467 * las_offset_deg / 360.0 +if not dry_run: + if Laser == "Alcor": + caput("SLGOS01-TSPL-ALC:NEW_DELTA_T" , new_las_delay ) + caput("SLGOS01-TSPL-ALC:SET_NEW_PHASE.PROC" , 1 ) + elif Laser == "Jaguar": + caput("SLGJG-TSPL-JAG:NEW_DELTA_T" , new_las_delay ) + caput("SLGJG-TSPL-JAG:SET_NEW_PHASE.PROC" , 1 ) +if do_elog: + title = "Set laser delay" + log_msg = "" + if Laser == "Alcor": + log_msg = "SLGOS01-TSPL-ALC:NEW_DELTA_T: %0.4f" % new_las_delay + " ps (was %0.2f" % cur_las_delay + " ps)\n" + elif Laser == "Jaguar": + log_msg = "SLGJG-TSPL-JAG:NEW_DELTA_T: %0.4f" % new_las_delay + " ps (was %0.2f" % cur_las_delay + " ps)\n" + attachments = [] + if plt is not None: + sleep(0.1) #Give some time to plot to be finished - it is not sync with acquisition + file_name = os.path.abspath(get_context().setup.getContextPath() + "/GunEnergyScanLasSet.png") + plt.saveSnapshot(file_name , "png") + attachments = [file_name] + elog(title, log_msg, attachments) +show_message("Success setting laser delay") diff --git a/script/RFscan/GunEnergyScanNew.py b/script/RFscan/GunEnergyScanNew.py new file mode 100644 index 0000000..5ddb23d --- /dev/null +++ b/script/RFscan/GunEnergyScanNew.py @@ -0,0 +1,163 @@ +import ch.psi.pshell.epics.Positioner as Positioner + +dry_run = False +do_elog = True +set_exec_pars(layout="sf") +is_panel = get_exec_pars().source != CommandSource.ui #must be check before run +USE_SCREEN_PANEL = True + +run("CPython/wrapper") + +#Parameters +if is_panel: + start = args[0] + stop = args[1] + step = args[2] + nb = int(args[3]) + lat = args[4] + disp = args[5] + p0 = args[6] + plt = args[7] +else: + start = 85.0 + stop = 95.0 + step = 0.5 + nb = 3 + lat = 0.15 + disp = -0.387 + p0 = 7.1 + plt = plot(None, title="Output")[0] + +A = p0 / disp / 1e6 +B = p0 + +#Plot setup +plt.clear() +plt.removeMarker(None) +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Momentum", Color.red)) +plt.addSeries(LinePlotErrorSeries("Momentum Spread", Color.yellow, 2)) +plt.getAxis(plt.AxisId.X).setLabel("Gun Beam Phase (deg)") +plt.getAxis(plt.AxisId.Y).setLabel("Momentum (MeV/c)") +plt.getAxis(plt.AxisId.Y2).setLabel("Momentum Spread (MeV/c)") +plt.setLegendVisible(True) + +#Creating Phase positioner +if dry_run: + phase = Positioner("Gun Phase", "SINEG01-RSYS:SET-BEAM-PHASE-SIM", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") + camera_name = "simulation" +else: + phase = Positioner("Gun Phase", "SINEG01-RSYS:SET-BEAM-PHASE", "SINEG01-RSYS:GET-BEAM-PHASE") + camera_name = "SINBD01-DSCR010" +phase.config.minValue = -90.0 +phase.config.maxValue = 360.0 +phase.config.precision = 4 +phase.config.resolution = 0.1 +phase.config.rotation = True +phase.config.save() +phase.initialize() +phase0 = phase.read() % 360 + +#Camera setup +if USE_SCREEN_PANEL: + cam_server.start(camera_name+"_sp1", True) #True for shared pipeline +else: + cam_server.start(camera_name) +wait_cam_server_message() +x = cam_server.stream.getChild("x_center_of_mass") +dx = cam_server.stream.getChild("x_rms") + +#Creating averagers +x_averager = create_averager(x, nb, -1) # -1 event based, waits for the next value +dx_averager = create_averager(dx, nb, -1) +dx_averager.monitored = True # not blocking, will return last nb values + +#Record callback: uptate of output plot +def after_sample(record, scan): + global A, B, plt + x_pos_mean, x_pos_stdev = record.values[0].mean, record.values[0].stdev + x_width_mean, x_width_stdev = record.values[1].mean, record.values[1].stdev + p_mean, p_stdev = A * x_pos_mean + B, abs(A) * x_pos_stdev + dp_mean, dp_stdev = abs(A) * x_width_mean, abs(A) * x_width_stdev + phase = ((record.positions[0] + 90) % 360) - 90 if start < 0 else record.positions[0] + plt.getSeries(0).appendData(phase, p_mean, p_stdev) + plt.getSeries(1).appendData(phase, dp_mean, dp_stdev) + +#The scan loop +try: + phase.write(start) + time.sleep(2.0) + r = lscan(phase, [x_averager, dx_averager], start, stop, step , latency=lat, after_read = after_sample) +finally: + phase.write(phase0) + phase.close() + cam_server.stop() # stops cam_server but does not close it cam_server is a global object + +ph = r.getPositions(0) +if start < 0: + ph = [((val + 90) % 360) -90 for val in ph ] +p = [A * val.mean + B for val in r.getReadable(0)] +dp = [abs(A) * val.mean for val in r.getReadable(1)] + +#Fitting and plotting +try: + i_max = p.index(max(p)) + i_min = dp.index(min(dp)) + min_i, max_i = max(i_max-8, 0), min(i_max+8, len(p)) + (ph_p_max, p_max, ph_p_fit, p_fit, p_R2) = extremum(ph[min_i:max_i], p[min_i:max_i]) + min_i, max_i = max(i_min-8, 0), min(i_min+8, len(dp)) + (ph_dp_min, dp_min, ph_dp_fit, dp_fit, dp_R2) = extremum(ph[min_i:max_i], dp[min_i:max_i]) + plt.addSeries(LinePlotErrorSeries("Momentum Fit", plt.getSeries(0).color)) + plt.addSeries(LinePlotErrorSeries("Momentum Spread Fit", plt.getSeries(1).color, 2)) + plt.getSeries(2).setData(ph_p_fit, p_fit) + plt.getSeries(3).setData(ph_dp_fit, dp_fit) + plt.getSeries(2).setPointsVisible(False) + plt.getSeries(3).setPointsVisible(False) + plt.addMarker(ph_p_max, plt.AxisId.X, "%3.2f" % ph_p_max, plt.getSeries(0).color) + plt.addMarker(ph_dp_min, plt.AxisId.X, "%3.2f" % ph_dp_min, plt.getSeries(1).color) +except: + raise Exception("Fit failure") + +# Calculating laser offset in ps +las_offset_deg = ph_dp_min - 90.0 + +#Saving metadata +save_dataset( "scan 1/processed/p" , p ) +set_attribute( "scan 1/processed/p" , "p max" , p_max ) +set_attribute( "scan 1/processed/p" , "p max phase" , ph_p_max ) +set_attribute( "scan 1/processed/p" , "p fit R2" , p_R2 ) +set_attribute( "scan 1/processed/p" , "Unit" , "MeV" ) + +save_dataset( "scan 1/processed/dp" , dp ) +set_attribute( "scan 1/processed/dp" , "dp min" , dp_min ) +set_attribute( "scan 1/processed/dp" , "dp min phase" , ph_dp_min ) +set_attribute( "scan 1/processed/dp" , "dp fit R2" , dp_R2 ) +set_attribute( "scan 1/processed/dp" , "Unit" , "MeV" ) + +#Elog entry +if do_elog: + if get_option("Generated data file:\n" + get_exec_pars().path +"\n\n" + "Save to ELOG?", "YesNo") == "Yes": + title = "Gun Energy Scan" + Laser = str(caget("SLG-LGEN:WHICH_LASER")) + log_msg = "Data file: " + get_exec_pars().path + "\n\n" + log_msg = log_msg + "Laser: " + Laser + "\n" + if Laser == "Alcor": + log_msg = log_msg + "Energy plate Alcor: %0.2f" % caget("SLGTH01-LMRM-M074:MOT.RBV") + " deg \n" + elif Laser == "Jaguar": + log_msg = log_msg + "Energy plate Jaguar: %0.2f" % caget("SLGJG-LMRM-M031:MOT.RBV") + " deg \n" + elif Laser == "Both": + log_msg = log_msg + "Energy plate Alcor: %0.2f" % caget("SLGTH01-LMRM-M074:MOT.RBV") + " deg \n" + log_msg = log_msg + "Energy plate Jaguar: %0.2f" % caget("SLGJG-LMRM-M031:MOT.RBV") + " deg \n" + if caget("SLGTV-LMTO-M053:MOT-ACT-POS") == "IRIS": + log_msg = log_msg + "Collimator: IRIS %0.2f" % caget("SLGTV-LAPP:SIZE-GET") + " mm \n" + else: + log_msg = log_msg + "Collimator: " + str(caget("SLGTV-LMTO-M053:MOT-ACT-POS")) + "\n" + log_msg = log_msg + "Charge: %0.2f" % caget("SINEG01-DICT215:B1_CHARGE-OP") + " pC at %0.2f" % phase0 + " deg beam phase\n" + log_msg = log_msg + "p-max: %0.2f" % p_max + " MeV/c at %0.2f" % ph_p_max + " deg beam phase\n" + log_msg = log_msg + "dp-min: %0.4f" % dp_min + " MeV/c at %0.2f" % ph_dp_min + " deg beam phase\n" + sleep(0.1) #Give some time to plot to be finished - it is not sync with acquisition + file_name = os.path.abspath(get_context().setup.getContextPath() + "/GunEnergyScanPlot.png") + plt.saveSnapshot(file_name , "png") + elog(title, log_msg, [file_name,]) + +set_return([ph_dp_min, las_offset_deg]) \ No newline at end of file diff --git a/script/test/GunEnergyScanSet.py b/script/RFscan/GunEnergyScanRfSetNew.py similarity index 50% rename from script/test/GunEnergyScanSet.py rename to script/RFscan/GunEnergyScanRfSetNew.py index fee132e..3ba1bd3 100644 --- a/script/test/GunEnergyScanSet.py +++ b/script/RFscan/GunEnergyScanRfSetNew.py @@ -1,24 +1,25 @@ -dry_run = True +dry_run = False do_elog = True if get_exec_pars().source == CommandSource.ui: - bph_ref_user = 19.0 - plt = None + bph_ref_user = 90.0 + plt = None else: - bph_ref_user = args[0] - plt = args[1] -phaseOffset_old = caget("SINEG01-RSYS:SET-VSUM-PHASE-OFFSET-BASE") -phaseOffset_new = 90 - bph_ref_user + phaseOffset_old + bph_ref_user = args[0] + plt = args[1] +phase_offset_old = caget("SINEG01-RSYS:SET-VSUM-PHASE-OFFSET-BASE") +phase_offset_new = 90 - bph_ref_user + phase_offset_old if not dry_run: - caput("SINEG01-RSYS:SET-VSUM-PHASE-OFFSET-BASE", phaseOffset_new) - caput("SINEG01-RSYS:CMD-LOAD-CALIB-BEAM", 1) + caput("SINEG01-RSYS:SET-VSUM-PHASE-OFFSET-BASE" , phase_offset_new ) + caput("SINEG01-RSYS:CMD-LOAD-CALIB-BEAM" , 1 ) if do_elog: - log_msg = "SINEG01-RSYS:SET-VSUM-PHASE-OFFSET-BASE: %0.2f" % phase_offset_new + " deg (was %0.2f" % phase_offset_old + " deg)\n" + title = "Set gun phase" + log_msg = "SINEG01-RSYS:SET-VSUM-PHASE-OFFSET-BASE: %0.2f" % phase_offset_new + " deg (was %0.2f" % phase_offset_old + " deg)\n" attachments = [] if plt is not None: sleep(0.1) #Give some time to plot to be finished - it is not sync with acquisition - file_name = os.path.abspath(get_context().setup.getContextPath() + "/GunEnergyScanSet.png") + file_name = os.path.abspath(get_context().setup.getContextPath() + "/GunEnergyScanRfSet.png") plt.saveSnapshot(file_name , "png") attachments = [file_name] - elog("Set gun phase", log_msg, attachments) + elog(title, log_msg, attachments) show_message("Success setting phase reference") diff --git a/script/RFscan/phase_scan_caqtdm.py b/script/RFscan/phase_scan_caqtdm.py index 7d47b52..1e4db92 100644 --- a/script/RFscan/phase_scan_caqtdm.py +++ b/script/RFscan/phase_scan_caqtdm.py @@ -3,12 +3,14 @@ import ch.psi.pshell.epics.ChannelDouble as ChannelDouble dry_run = False do_elog = True +set_exec_pars(layout="sf") + is_panel = get_exec_pars().source != CommandSource.ui if is_panel: station = args[0] bpm_ch = args[1] else: - station = "STEST01" + station = "SINSB01" bpm_ch = "SINBC02-DBPM140" start = caget(station + "-RSYS:SET-SCAN-START") stop = caget(station + "-RSYS:SET-SCAN-STOP") @@ -22,7 +24,7 @@ def mbnd(bpm_ch): 'SINLH02-DBPM240': 'SINLH02-MBND100', 'SINBC02-DBPM140': 'SINBC02-MBND100', 'SINBC02-DBPM320': 'SINBC02-MBND100', - 'S10DI01-DBPM020': 'S10DI01-MBND100', + 'S10BD01-DBPM020': 'S10DI01-MBND100', 'S10BC02-DBPM140': 'S10BC02-MBND100', 'S10BC02-DBPM320': 'S10BC02-MBND100', 'SARCL02-DBPM110': 'SARCL02-MBND100', @@ -39,17 +41,17 @@ phase = Positioner("Phase", station + "-RSYS:SET-VSUM-PHASE", station + "-RSYS: phase.config.minValue =-90.0 phase.config.maxValue = 360.0 phase.config.precision = 4 -phase.config.rotation = True phase.config.resolution = 0.1 +phase.config.rotation = True phase.initialize() -V = ChannelDouble("Amplitude Readback", station + "-RSYS:GET-VSUM-AMPLT") -P = ChannelDouble("Power Readback", station + "-RSYS:GET-KLY-POWER") +V = ChannelDouble(station + " Amplitude", station + "-RSYS:GET-VSUM-AMPLT") +P = ChannelDouble(station + " Klystron Power", station + "-RSYS:GET-KLY-POWER-GATED") V.initialize() P.initialize() if dry_run: - x = ChannelDouble("BPM-X", bpm_ch + ":X1-SIMU") + x = ChannelDouble("BPM-X averager", bpm_ch + ":X1-SIMU") else: - x = ChannelDouble("BPM-X", bpm_ch + ":X1") + x = ChannelDouble("BPM-X averager", bpm_ch + ":X1") x.initialize() phase0 = phase.read() % 360 caput(station + "-RSYS:GET-FIT-PHASE-ARRAY", to_array([0.0],'d')) @@ -120,21 +122,19 @@ caput(station + "-RSYS:SET-VSUM-AMPLT-SCALE-CALC", amplitude_scale) caput(station + "-RSYS:SET-VOLT-POWER-SCALE-CALC", power_scale) #Saving metadata -save_dataset (get_exec_pars().group + "/Station" , station ) -save_dataset (get_exec_pars().group + "/Energy" , energy ) -save_dataset (get_exec_pars().group + "/Energy gain" , fit_amplitude ) -save_dataset (get_exec_pars().group + "/On-crest VS-phase" , ph_crest ) -save_dataset (get_exec_pars().group + "/VS-phase offset" , phase_offset ) -save_dataset (get_exec_pars().group + "/Amplitude scale" , amplitude_scale ) -save_dataset (get_exec_pars().group + "/Power scale" , power_scale ) -set_attribute(get_exec_pars().group + "/Energy" , "Unit", "MeV" ) -set_attribute(get_exec_pars().group + "/Energy gain" , "Unit", "MeV" ) -set_attribute(get_exec_pars().group + "/On-crest VS-phase" , "Unit", "deg" ) -set_attribute(get_exec_pars().group + "/VS-phase offset" , "Unit", "deg" ) -set_attribute(get_exec_pars().group + "/Amplitude scale" , "Unit", "MV" ) -set_attribute(get_exec_pars().group + "/Power scale" , "Unit", "MW/MV^2" ) -set_attribute(get_exec_pars().group + "/Phase" , "Unit", "deg" ) -set_attribute(get_exec_pars().group + "/BPM-X averager" , "Unit", "mm" ) +save_dataset ("experiment/Station" , station ) +save_dataset ("scan 1/processed/Energy" , energy ) +save_dataset ("scan 1/processed/Energy gain" , fit_amplitude ) +save_dataset ("scan 1/processed/On-crest VS-phase" , ph_crest ) +save_dataset ("scan 1/processed/VS-phase offset" , phase_offset ) +save_dataset ("scan 1/processed/Amplitude scale" , amplitude_scale ) +save_dataset ("scan 1/processed/Power scale" , power_scale ) +set_attribute("scan 1/processed/Energy" , "Unit", "MeV" ) +set_attribute("scan 1/processed/Energy gain" , "Unit", "MeV" ) +set_attribute("scan 1/processed/On-crest VS-phase" , "Unit", "deg" ) +set_attribute("scan 1/processed/VS-phase offset" , "Unit", "deg" ) +set_attribute("scan 1/processed/Amplitude scale" , "Unit", "MV" ) +set_attribute("scan 1/processed/Power scale" , "Unit", "MW/MV^2" ) #Elog entry if do_elog: diff --git a/script/Scan.py b/script/Scan.py new file mode 100644 index 0000000..3a77035 --- /dev/null +++ b/script/Scan.py @@ -0,0 +1,35 @@ +import ch.psi.pshell.epics.ChannelDouble as ChannelDouble +A1 = ChannelDouble("Current", "S20SY02-MKDC050:I-SET") +S1 = ChannelDouble("x1", "S20SY02-DBPM080:X1") +S2 = ChannelDouble("y1", "S20SY02-DBPM080:Y1") +A1.initialize() +S1.initialize() +S2.initialize() +A1_init = A1.read() +A1i = -2.0 +A1f = 2.0 +nstep = 21 +lat = 0.21 +nav = 10 +plt = plot(None, title="Output")[0] +plt.clear() +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Sensor1", Color.red)) +def after_sample(record, scan): + plt.getSeries(0).appendData(record.positions[0], record.values[0].mean, record.values[0].stdev) +try: + S1_averager = create_averager(S1, nav, lat) + S2_averager = create_averager(S2, nav, lat) + S2_averager.monitored=True + time.sleep(10.0) + r = lscan(A1, (S1_averager, S2_averager), A1i, A1f, nstep, latency=5.0, after_read = after_sample) + Act1 = r.getPositions(0) + S1mean = [val.mean for val in r.getReadable(0)] + S1rms = [val.stdev for val in r.getReadable(0)] + S2mean = [val.mean for val in r.getReadable(1)] + S2rmsn = [val.stdev for val in r.getReadable(1)] +finally: + A1.write(A1_init) + A1.close() + S1.close() + S2.close() \ No newline at end of file diff --git a/script/Scan2.py b/script/Scan2.py new file mode 100644 index 0000000..b46b449 --- /dev/null +++ b/script/Scan2.py @@ -0,0 +1,35 @@ +import ch.psi.pshell.epics.ChannelDouble as ChannelDouble +A1 = ChannelDouble("delay", "S20SY02-MKAC020:TCS-Pul0-TDELAY-K") +S1 = ChannelDouble("x1", "S20SY02-DBPM080:X1") +S2 = ChannelDouble("y1", "S20SY02-DBPM080:Y1") +A1.initialize() +S1.initialize() +S2.initialize() +A1_init = A1.read() +A1i = 489.837 +A1f = 409.837 +step = 2.2408963585434175 +lat = 0.21 +nav = 5 +plt = plot(None, title="Output")[0] +plt.clear() +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Sensor1", Color.red)) +def after_sample(record, scan): + plt.getSeries(0).appendData(record.positions[0], record.values[0].mean, record.values[0].stdev) +try: + S1_averager = create_averager(S1, nav, lat) + S2_averager = create_averager(S2, nav, lat) + S2_averager.monitored=True + time.sleep(1.0) + r = lscan(A1, (S1_averager, S2_averager), A1i, A1f, step, latency=0.5, after_read = after_sample) + Act1 = r.getPositions(0) + S1mean = [val.mean for val in r.getReadable(0)] + S1rms = [val.stdev for val in r.getReadable(0)] + S2mean = [val.mean for val in r.getReadable(1)] + S2rmsn = [val.stdev for val in r.getReadable(1)] +finally: + A1.write(A1_init) + A1.close() + S1.close() + S2.close() \ No newline at end of file diff --git a/script/Tools/save_camera_data.py b/script/Tools/save_camera_data.py index e4bdd4d..0848775 100644 --- a/script/Tools/save_camera_data.py +++ b/script/Tools/save_camera_data.py @@ -5,9 +5,9 @@ import ch.psi.pshell.imaging.Colormap as Colormap if get_exec_pars().source == CommandSource.ui: - camera_name = "SARBD02-DSCR050" # "SLG-LCAM-C041_sp" + #camera_name = "SARBD02-DSCR050" # "SLG-LCAM-C041_sp" #camera_name = "SARBD02-DSCR050_sp" # "SLG-LCAM-C041_sp" - #camera_name = "simulation_sp" # "SLG-LCAM-C041_sp" + camera_name = "simulation_sp" # "SLG-LCAM-C041_sp" shared = False images = 1 interval = -1 diff --git a/script/Undulators/1DscanEarthField.py b/script/Undulators/1DscanEarthField.py new file mode 100644 index 0000000..76ed45e --- /dev/null +++ b/script/Undulators/1DscanEarthField.py @@ -0,0 +1,29 @@ +import ch.psi.pshell.epics.ChannelDouble as ChannelDouble +A1 = ChannelDouble("Actuator1", "SARUN07-UIND030:I-SET") +#S1 = ChannelDouble("Sensor1", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US") +S1 = ChannelDouble("Sensor1", "SARFE10-PBPG050:HAMP-INTENSITY-CAL") +A1.initialize() +S1.initialize() +A1_init = A1.read() +A1i = -1.0 +A1f = 1.2 +nstep = 22 +lat = 0.11 +nav = 50 +plt = plot(None, title="Output")[0] +plt.clear() +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Sensor1", Color.red)) +def after_sample(record, scan): + plt.getSeries(0).appendData(record.positions[0], record.values[0].mean, record.values[0].stdev) +try: + S1_averager = create_averager(S1, nav, lat) + time.sleep(1.0) + r = lscan(A1, S1_averager, A1i, A1f, nstep, latency=2.0, after_read = after_sample) + Act1 = r.getPositions(0) + S1mean = [val.mean for val in r.getReadable(0)] + S1rms = [val.stdev for val in r.getReadable(0)] +finally: + A1.write(A1_init) + A1.close() + S1.close() \ No newline at end of file diff --git a/script/Undulators/1DscanEarthField2.py b/script/Undulators/1DscanEarthField2.py new file mode 100644 index 0000000..784988e --- /dev/null +++ b/script/Undulators/1DscanEarthField2.py @@ -0,0 +1,35 @@ +import ch.psi.pshell.epics.ChannelDouble as ChannelDouble +A1 = ChannelDouble("Current", "SARUN15-UIND030:I-SET") +S1 = ChannelDouble("energy per pulse", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US") +S2 = ChannelDouble("HAMP", "SARFE10-PBPG050:HAMP-INTENSITY-CAL") +A1.initialize() +S1.initialize() +S2.initialize() +A1_init = A1.read() +A1i = -0.5 +A1f = 1.5 +nstep = 20 +lat = 0.11 +nav = 50 +plt = plot(None, title="Output")[0] +plt.clear() +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Sensor1", Color.red)) +def after_sample(record, scan): + plt.getSeries(0).appendData(record.positions[0], record.values[0].mean, record.values[0].stdev) +try: + S1_averager = create_averager(S1, nav, lat) + S2_averager = create_averager(S2, nav, lat) + S2_averager.monitored=True + time.sleep(10.0) + r = lscan(A1, (S1_averager, S2_averager), A1i, A1f, nstep, latency=5.0, after_read = after_sample) + Act1 = r.getPositions(0) + S1mean = [val.mean for val in r.getReadable(0)] + S1rms = [val.stdev for val in r.getReadable(0)] + S2mean = [val.mean for val in r.getReadable(1)] + S2rmsn = [val.stdev for val in r.getReadable(1)] +finally: + A1.write(A1_init) + A1.close() + S1.close() + S2.close() \ No newline at end of file diff --git a/script/Undulators/1DscanPhaseShifter.py b/script/Undulators/1DscanPhaseShifter.py new file mode 100644 index 0000000..023c891 --- /dev/null +++ b/script/Undulators/1DscanPhaseShifter.py @@ -0,0 +1,44 @@ + +import ch.psi.pshell.epics.ChannelDouble as ChannelDouble +A1 = ChannelDouble("Gap", "SARUN03-UPHS060:GAP") +A1 = ChannelDouble("Gap", "SARUN03-UPHS060:GAP") +S1 = ChannelDouble("energy per pulse", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US") +S2 = ChannelDouble("HAMP", "SARFE10-PBPG050:HAMP-INTENSITY-CAL") +A1.initialize() +S1.initialize() +S2.initialize() +A1_init = A1.read() +A1i = -0.5 +A1f = 1.5 +nstep = 20 +lat = 0.11 +nav = 50 +plt = plot(None, title="Output")[0] +plt.clear() +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Sensor1", Color.red)) +def before(position, scan): + caput(GAP + ":GO", 1) + start = time.time() + while abs(readout.read() - GAP.read()) > TOLERANCE: + time.sleep(0.1) + if time.time() - start > TIMEOUT: + raise Exception ("Timeout waiting gap change") +def after_sample(record, scan): + plt.getSeries(0).appendData(record.positions[0], record.values[0].mean, record.values[0].stdev) +try: + S1_averager = create_averager(S1, nav, lat) + S2_averager = create_averager(S2, nav, lat) + S2_averager.monitored=True + time.sleep(10.0) + r = lscan(A1, (S1_averager, S2_averager), A1i, A1f, nstep, latency=5.0, after_read = after_sample) + Act1 = r.getPositions(0) + S1mean = [val.mean for val in r.getReadable(0)] + S1rms = [val.stdev for val in r.getReadable(0)] + S2mean = [val.mean for val in r.getReadable(1)] + S2rmsn = [val.stdev for val in r.getReadable(1)] +finally: + A1.write(A1_init) + A1.close() + S1.close() + S2.close() \ No newline at end of file diff --git a/script/Undulators/K-calc.py b/script/Undulators/K-calc.py new file mode 100644 index 0000000..7e7bb07 --- /dev/null +++ b/script/Undulators/K-calc.py @@ -0,0 +1,16 @@ +Eph1 = 2.165# actual photon energy +Eph2 = 2.185 # desired photon energy + +# beam on-delay during change! + +undlist = ("SARUN03","SARUN04","SARUN05","SARUN06","SARUN07","SARUN08","SARUN09","SARUN10","SARUN11","SARUN12","SARUN13","SARUN14","SARUN15") + + +for und in undlist: + K1 = caget(und + "-UIND030:K_SET") + K2 = ((Eph1 / Eph2 * (K1**2 + 2) - 2))**0.5 + print K1,K2 + caput(und + "-UIND030:K_SET", 0.07) + time.sleep(10.0) + caput(und + "-UIND030:K_SET", K2) +print "finished" \ No newline at end of file diff --git a/script/Undulators/K-calc2.py b/script/Undulators/K-calc2.py new file mode 100644 index 0000000..8cd71ed --- /dev/null +++ b/script/Undulators/K-calc2.py @@ -0,0 +1,31 @@ +Eph1 = 2.165 # actual photon energy +Eph2 = 2.185 # desired photon energy + +do_elog = False + +undlist = ("SARUN03","SARUN04","SARUN05","SARUN06","SARUN07","SARUN08","SARUN09","SARUN10","SARUN11","SARUN12","SARUN13","SARUN14","SARUN15") + +K1, K2 = {}, {} +for und in undlist: + K = caget(und + "-UIND030:K_SET") + K1[und] = K + K2[und] = ((Eph1 / Eph2 * (K**2 + 2) - 2))**0.5 +# set laser on-delay +caput("SIN-TIMAST-TMA:Beam-Las-Delay-Sel",1) +caput("SIN-TIMAST-TMA:Beam-Apply-Cmd.PROC",1) +if Eph2 < Eph1 : + for und in undlist: caput(und + "-UIND030:K_SET", 0.07) + time.sleep(40.0) +for und in undlist: caput(und + "-UIND030:K_SET", K2[und]) +time.sleep(40.0) +# set laser on-beam +caput("SIN-TIMAST-TMA:Beam-Las-Delay-Sel",0) +caput("SIN-TIMAST-TMA:Beam-Apply-Cmd.PROC",1) + +#Elog entry +if do_elog: + title = "Wavelength change" + log_msg = "Old photon energy: %0.2f" % Eph1 + " kev\n" + log_msg = log_msg + "New photon energy: %0.2f" % Eph2 + " keV\n" + attachments = none + elog(title, log_msg, attachments) \ No newline at end of file diff --git a/script/local.py b/script/local.py index 4ad8840..753f9c4 100755 --- a/script/local.py +++ b/script/local.py @@ -8,11 +8,22 @@ from mathutils import PolynomialFunction, Gaussian, HarmonicOscillator import java.awt.Color as Color - + + +################################################################################################### +# Layout setup +################################################################################################### +import ch.psi.pshell.data.LayoutSF as LayoutSF + +LayoutSF.setExperimentArguments([charge, laser, rep_rate, destination_B1, energy_B1]) + + + ################################################################################################### # Machine utilities ################################################################################################### + LASER_SETTLING_TIME = 3.0 def laser_on(): @@ -58,7 +69,12 @@ def is_timing_ok(): def get_repetition_rate(): return caget("SIN-TIMAST-TMA:Evt-15-Freq-I") - + +def ws_status(): + """ + Display status of all wire scanners + """ + run("Diagnostics/WireScannersStatus") ################################################################################################### # Maths utilities diff --git a/script/test/CheckWireScans.py b/script/test/CheckWireScans.py new file mode 100644 index 0000000..482e605 --- /dev/null +++ b/script/test/CheckWireScans.py @@ -0,0 +1,99 @@ +import mathutils +from mathutils import * +from plotutils import * + +#f = "2018/03/12/20180312_231754_WireScan.h5|" +#f = "2018/03/12/20180312_233008_WireScan.h5|" +f = "2018/03/12/20180312_234230_WireScan.h5|" +#p = f + "/x_000" +p = f + "/y_000" + +def gd(i): + global p + return load_data(p+str(i)+"/blm1") + +def gt(i): + global p + return load_data(p+str(i)+"/Time") +def gp(i): + global p + return load_data(p+str(i)+"/w_pos") + +def bg(i): + global f + return load_data(f+"/background/blm" + str(i)) + +def bga(blm): + global f + return get_attributes(f+"/background/blm" + str(blm))["Mean"] + +def sig(i): + bg = bga(1) + ret = gd(i) + #ret = blm_remove_spikes(ret) + ret = [v-bg for v in ret] + return ret + + +epsilon = 1e-10 +def make_monotonic(x): + for i in range(len(x)-1): + if x[i+1]<= x[i]: + x[i+1] = x[i] + epsilon + return x + +x = [x1,x2,x3,x4,x5,x6]= [gp(1), gp(2), gp(3), gp(4), gp(5), gp(6)] + +#plot(x, ["1", "2", "3", "4", "5", "6"], xdata = x) + + + +s = [s1, s1, s3, s4, s5, s6] = [sig(1), sig(2), sig(3), sig(4), sig(5), sig(6)] + +p=plot(s, ["1", "2", "3", "4", "5", "6"], xdata = x) +#print call_jep(MODULE, "profile_rms_stats", [to_npa(x), to_npa(y), 0, 3.5]) + +run("Diagnostics/sig_process_wrapper") + + +print "------------------ Gauss ---------------------------" +sum_mean=0.0 +sum_sigma=0.0 +sum_norm=0.0 +mathutils.MAX_EVALUATIONS = mathutils.MAX_EVALUATIONS*10 +for i in range(6): + [off, amp, com, sigma] = profile_gauss_stats(x[i], s[i], off=None, amp=None, com=None, sigma=None) + #[amp, com, sigma] = profile_gauss_stats(x[i], s[i], off=None, amp=None, com=None, sigma=None, with_offset=False) + """ + if i%2 == 0: + (amp, com, sigma) = fit_gaussian(s[i], make_monotonic(x[i])) + else : + (amp, com, sigma) = fit_gaussian(s[i][::-1], make_monotonic(x[i][::-1])) + """ + #print "Pass " , (i+1) ,": " , [off, amp, com, sigma] + sum_mean = sum_mean + com + sum_sigma = sum_sigma + sigma + sum_norm = sum_norm + amp + + plot_function(p[i], Gaussian(amp, com, sigma), "Fit",x[i], show_points = False, show_lines = True, color = Color.BLUE) + + +ave_mean, ave_sigma = sum_mean/6, sum_sigma/6 +print "Average: mean=" , ave_mean, ave_sigma + + + + +print "------------------ RMS ---------------------------" +sum_com=0.0 +sum_sigma=0.0 +for i in range(6): + #[rms_com, rms_sigma] = profile_rms_stats(x[i], s[i],noise_std=0, n_sigma=3.5) + [off, amp, com, sigma] = profile_gauss_stats(x[i], s[i], off=None, amp=None, com=None, sigma=None) + [rms_com, rms_sigma] = profile_rms_stats_with_estimate(x[i], s[i], com_estimate = com, window_size = sigma *3.5) + print "Pass " , (i+1) ,": " , [rms_com, rms_sigma] + sum_com = sum_com+ rms_com + sum_sigma = sum_sigma + rms_sigma +print "Average: mean=" , sum_com/6, " sigma=", sum_sigma/6 + + diff --git a/script/test/GunEnergyScan.py b/script/test/GunEnergyScan.py deleted file mode 100644 index 9ffc6f5..0000000 --- a/script/test/GunEnergyScan.py +++ /dev/null @@ -1,172 +0,0 @@ -import ch.psi.pshell.epics.Positioner as Positioner -from mathutils import PolynomialFunction - -dry_run = True -do_elog = True -is_panel = get_exec_pars().source != CommandSource.ui #must be check before run - -def quadfit(xdata, ydata): - """ - Quadratic fit - """ - p = (a0, a1, a2) = fit_polynomial(ydata, xdata, 2) - f = PolynomialFunction(p) - if a1 != 0: - x_ext = -a1 / (2 * a0) - y_ext = f.value(x_ext) - else: - x_ext = None - y_ext = None - yhat = [f.value(val) for val in xdata] - ybar = sum(ydata)/len(ydata) - ssreg = sum([(val - ybar)**2 for val in yhat]) - sstot = sum([(val - ybar)**2 for val in ydata]) - R2 = ssreg / sstot - x1 = min(xdata) - x2 = max(xdata) - x_fit = frange(x1, x2, (x2-x1)/100, True) - y_fit = [f.value(val) for val in x_fit] - return (p, x_ext, y_ext, R2, x_fit, y_fit) - -#Parameters -if is_panel: - start = args[0] - stop = args[1] - step = args[2] - nb = int(args[3]) - lat = args[4] - disp = args[5] - p0 = args[6] - plt = args[7] -else: - start = 44.0 - stop = 65.0 - step = 1.0 - nb = 3 - lat = 0.3 - disp = -0.387 - p0 = 7.1 - plt = plot(None, title="Output")[0] - -A = p0 / disp / 1e6 -B = p0 - -#Plot setup -plt.clear() -plt.removeMarker(None) -plt.setStyle(plt.Style.ErrorY) -plt.addSeries(LinePlotErrorSeries("Momentum", Color.red)) -plt.addSeries(LinePlotErrorSeries("Momentum Spread", Color.yellow, 2)) -plt.getAxis(plt.AxisId.X).setLabel("Gun Beam Phase (deg)") -plt.getAxis(plt.AxisId.Y).setLabel("Momentum (MeV/c)") -plt.getAxis(plt.AxisId.Y2).setLabel("Momentum Spread (MeV/c)") -plt.setLegendVisible(True) - -#Creating Phase positioner -if dry_run: - phase = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE-SIM", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") - camera_name = "simulation" -else: - phase = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE", "SINEG01-RSYS:GET-BEAM-PHASE") - camera_name = "SINBD01-DSCR010" -phase.config.minValue = -360.0 -phase.config.maxValue = 360.0 -phase.config.precision = 3 -phase.config.resolution = 0.1 -phase.config.rotation = False -phase.config.save() -phase.initialize() -phase0 = phase.read() - -#Camera setup -cam_server.start(camera_name) -wait_cam_server_message() -x = cam_server.stream.getChild("x_fit_mean") -dx = cam_server.stream.getChild("x_fit_standard_deviation") - -#Creating averagers -x_averager = create_averager(x, nb, -1) # -1 event based, waits for the next value -dx_averager = create_averager(dx, nb, -1) -dx_averager.monitored = True # not blocking, will return last nb values - -#Record callback: uptate of output plot -def after_sample(record, scan): - global A, B, plt - x_pos_mean, x_pos_stdev = record.values[0].mean, record.values[0].stdev - x_width_mean, x_width_stdev = record.values[1].mean, record.values[1].stdev - p_mean, p_stdev = A * x_pos_mean + B, abs(A) * x_pos_stdev - dp_mean, dp_stdev = abs(A) * x_width_mean, abs(A) * x_width_stdev - plt.getSeries(0).appendData(record.positions[0], p_mean, p_stdev) - plt.getSeries(1).appendData(record.positions[0], dp_mean, dp_stdev) - -#The scan loop -try: - phase.write(start) - time.sleep(2.0) - r = lscan(phase, [x_averager, dx_averager], start, stop, step , latency=lat, after_read = after_sample) -finally: - phase.write(phase0) - phase.close() - cam_server.stop() # stops cam_server but does not close it cam_server is a global object - -ph = r.getPositions(0) -p = [A * val.mean + B for val in r.getReadable(0)] -dp = [abs(A) * val.mean for val in r.getReadable(1)] - -#Fitting and plotting -try: - i_max = p.index(max(p)) - i_min = dp.index(min(dp)) - a,b = max(i_max-5, 0), min(i_max+6, len(p)) - Xdat = ph[a:b] - Ydat = p[a:b] - (p_poly, ph_p_max, p_max, p_R2, ph_p_fit, p_fit) = quadfit(Xdat, Ydat) - a,b = max(i_min-5, 0), min(i_min+6, len(dp)) - Xdat = ph[a:b] - Ydat = dp[a:b] - (dp_poly, ph_dp_min, dp_min, dp_R2, ph_dp_fit, dp_fit) = quadfit(Xdat, Ydat) - plt.addSeries(LinePlotErrorSeries("Momentum Fit", plt.getSeries(0).color)) - plt.addSeries(LinePlotErrorSeries("Momentum Spread Fit", plt.getSeries(1).color, 2)) - plt.getSeries(2).setData(ph_p_fit, p_fit) - plt.getSeries(3).setData(ph_dp_fit, dp_fit) - plt.getSeries(2).setPointsVisible(False) - plt.getSeries(3).setPointsVisible(False) - plt.addMarker(ph_p_max, plt.AxisId.X, "%3.2f" % ph_p_max, plt.getSeries(0).color) - plt.addMarker(ph_dp_min, plt.AxisId.X, "%3.2f" % ph_dp_min, plt.getSeries(1).color) -except: - raise Exception("Fit failure") - -#Setting the return value -set_return([ph_dp_min]) - -#Saving metadata -save_dataset(get_exec_pars().group + "/p", p) -set_attribute(get_exec_pars().group + "/p", "p max", p_max) -set_attribute(get_exec_pars().group + "/p", "p max phase", ph_p_max) -set_attribute(get_exec_pars().group + "/p", "p fit R2", p_R2) -save_dataset(get_exec_pars().group + "/dp", dp) -set_attribute(get_exec_pars().group + "/dp", "dp min", dp_min) -set_attribute(get_exec_pars().group + "/dp", "dp min phase", ph_dp_min) -set_attribute(get_exec_pars().group + "/dp", "dp fit R2", dp_R2) - -#Elog entry -if do_elog: - if get_option("Generated data file:\n" + get_exec_pars().path +"\n\n" + "Save to ELOG?", "YesNo") == "Yes": - Laser = str(caget("SLGTV-LMTO-M055:MOT-KNOWN-POS")) - log_msg = "Data file: " + get_exec_pars().path + "\n\n" - log_msg = log_msg + "Laser: " + Laser + "\n" - if Laser == "Alcor": - log_msg = log_msg + "Energy plate: %0.2f" % caget("SLGTH01-LMRM-M074:MOT.RBV") + " deg \n" - else: - log_msg = log_msg + "Energy plate: %0.2f" % caget("SLGJG-LMRM-M031:MOT.RBV") + " deg \n" - if caget("SLGTV-LMTO-M053:MOT-ACT-POS") == "IRIS": - log_msg = log_msg + "Collimator: IRIS %0.2f" % caget("SLGTV-LAPP:SIZE-GET") + " mm \n" - else: - log_msg = log_msg + "Collimator: " + str(caget("SLGTV-LMTO-M053:MOT-ACT-POS")) + "\n" - log_msg = log_msg + "Charge: %0.2f" % caget("SINEG01-DICT215:B1_CHARGE-OP") + " pC at %0.2f" % phase0 + " deg beam phase\n" - log_msg = log_msg + "p-max: %0.2f" % p_max + " MeV/c at %0.2f" % ph_p_max + " deg beam phase\n" - log_msg = log_msg + "dp-min: %0.2f" % dp_min + " MeV/c at %0.2f" % ph_dp_min + " deg beam phase\n" - sleep(0.1) #Give some time to plot to be finished - it is not sync with acquisition - file_name = os.path.abspath(get_context().setup.getContextPath() + "/GunEnergyScanPlot.png") - plt.saveSnapshot(file_name , "png") - elog("Gun Energy Scan", log_msg, [file_name,]) diff --git a/script/test/GunEnergyScan_dv.py b/script/test/GunEnergyScan_dv.py deleted file mode 100644 index ff2f01b..0000000 --- a/script/test/GunEnergyScan_dv.py +++ /dev/null @@ -1,140 +0,0 @@ -import ch.psi.pshell.epics.Positioner as Positioner -import ch.psi.pshell.epics.Camtool as Camtool - -dry_run = False -do_elog = True -is_panel = get_exec_pars().source != CommandSource.ui #must be check before run - -run("CPython/wrapper") - -#Parameters -if is_panel: - start = args[0] - stop = args[1] - step = args[2] - nb = int(args[3]) - lat = args[4] - disp = args[5] - p0 = args[6] - plt = args[7] -else: - start = 44.0 - stop = 65.0 - step = 1.0 - nb = 3 - lat = 0.3 - disp = -0.387 - p0 = 7.1 - plt = plot(None, title="Output")[0] - -A = p0 / disp / 1e6 -B = p0 - -#Plot setup -plt.clear() -plt.setStyle(plt.Style.ErrorY) -plt.addSeries(LinePlotErrorSeries("Momentum")) -plt.addSeries(LinePlotErrorSeries("Momentum Spread", None, 2)) -plt.getAxis(plt.AxisId.X).setLabel("Gun Beam Phase (deg)") -plt.getAxis(plt.AxisId.Y).setLabel("Momentum (MeV/c)") -plt.getAxis(plt.AxisId.Y2).setLabel("Momentum Spread (MeV/c)") -plt.setLegendVisible(True) - -#Creating Phase positioner -if dry_run: - phase = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE-SIM", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") - camera_name = "simulation" -else: - phase = Positioner("Beam phase", "SINEG01-RSYS:SET-BEAM-PHASE", "SINEG01-RSYS:GET-BEAM-PHASE") - camera_name = "SINBD01-DSCR010" -phase.config.minValue = -360.0 -phase.config.maxValue = 360.0 -phase.config.precision = 3 -phase.config.resolution = 0.1 -phase.config.rotation = False -phase.config.save() -phase.initialize() -phase0 = phase.read() - -#Camera setup -cam_server.start(camera_name) -wait_cam_server_message() -x = cam_server.stream.getChild("x_fit_mean") -dx = cam_server.stream.getChild("x_fit_standard_deviation") - - -#Creating averagers -x_averager = create_averager(x, nb, -1) # -1 event based, waits for the next value -dx_averager = create_averager(dx, nb, -1) -dx_averager.monitored = True # not blocking, will return last nb values - -#Record callback: uptate of output plot -def after_sample(record, scan): - global A, B, plt - x_pos_mean, x_pos_stdev = record.values[0].mean, record.values[0].stdev - x_width_mean, x_width_stdev = record.values[1].mean, record.values[1].stdev - p_mean, p_stdev = A * x_pos_mean + B, abs(A) * x_pos_stdev - dp_mean, dp_stdev = abs(A) * x_width_mean, abs(A) * x_width_stdev - plt.getSeries(0).appendData(record.positions[0], p_mean, p_stdev) - plt.getSeries(1).appendData(record.positions[0], dp_mean, dp_stdev) - -#The scan loop -try: - phase.write(start) - time.sleep(1.0) - r = lscan(phase, [x_averager, dx_averager], start, stop, step , latency=lat, after_read = after_sample) -finally: - phase.write(phase0) - phase.close() - cam_server.stop() # stops cam_server but does not close it cam_server is a global object - -ph = r.getPositions(0) -p = [A * val.mean + B for val in r.getReadable(0)] -dp = [abs(A) * val.mean for val in r.getReadable(1)] - -#Fitting and plotting -try: - i_max = p.index(max(p)) - i_min = dp.index(min(dp)) - min_i, max_i = max(i_max-5, 0), min(i_max+6, len(p)) - (ph_p_max, p_max, ph_p_fit, p_fit) = extremum(ph[min_i:max_i], p[min_i:max_i]) - min_i, max_i = max(i_min-5, 0), min(i_min+6, len(dp)) - (ph_dp_min, dp_min, ph_dp_fit, dp_fit) = extremum(ph[min_i:max_i], dp[min_i:max_i]) - plt.addSeries(LinePlotErrorSeries("Momentum Fit", plt.getSeries(0).color)) - plt.addSeries(LinePlotErrorSeries("Momentum Spread Fit", plt.getSeries(1).color, 2)) - plt.getSeries(2).setData(ph_p_fit, p_fit) - plt.getSeries(3).setData(ph_dp_fit, dp_fit) - plt.getSeries(2).setPointsVisible(False) - plt.getSeries(3).setPointsVisible(False) - plt.addMarker(ph_p_max, plt.AxisId.X, "%3.2f" % ph_p_max, plt.getSeries(0).color) - plt.addMarker(ph_dp_min, plt.AxisId.X, "%3.2f" % ph_dp_min, plt.getSeries(1).color) -except: - raise Exception("Fit failure") - -#Saving metadata -save_dataset(get_exec_pars().group + "/p", p) -set_attribute(get_exec_pars().group + "/p", "ph_p_max", ph_p_max) -set_attribute(get_exec_pars().group + "/p", "p_max", p_max) -save_dataset(get_exec_pars().group + "/dp", dp) -set_attribute(get_exec_pars().group + "/dp", "ph_dp_min", ph_dp_min) -set_attribute(get_exec_pars().group + "/dp", "dp_min", dp_min) - -#Elog entry -if do_elog: - if get_option("Generated data file:\n" + get_exec_pars().path +"\n\n" + "Save to ELOG?", "YesNo") == "Yes": - Laser = str(caget("SLGTV-LMTO-M055:MOT-KNOWN-POS")) - log_msg = "Data file: " + get_exec_pars().path + "\n\n" - log_msg = log_msg + "Laser: " + Laser + "\n" - if Laser == "Alcor": - log_msg = log_msg + "Energy plate: %0.2f" % caget("SLGTH01-LMRM-M074:MOT.RBV") + " deg \n" - else: - log_msg = log_msg + "Energy plate: %0.2f" % caget("SLGJG-LMRM-M031:MOT.RBV") + " deg \n" - if caget("SLGTV-LMTO-M053:MOT-ACT-POS") == "IRIS": - log_msg = log_msg + "Collimator: IRIS %0.2f" % caget("SLGTV-LAPP:SIZE-GET") + " mm \n" - else: - log_msg = log_msg + "Collimator: " + str(caget("SLGTV-LMTO-M053:MOT-ACT-POS")) + "\n" - log_msg = log_msg + "Charge: %0.2f" % caget("SINEG01-DICT215:B1_CHARGE-OP") + " pC at %0.2f" % phase0 + " deg beam phase\n" - sleep(0.1) #Give some time to plot to be finished - it is not sync with acquisition - file_name = os.path.abspath(get_context().setup.getContextPath() + "/GunEnergyScanPlot.png") - plt.saveSnapshot(file_name , "png") - elog("Gun Energy Scan", log_msg, [file_name,]) diff --git a/script/test/PhaseShifterScan_dv.py b/script/test/PhaseShifterScan_dv.py new file mode 100644 index 0000000..3ff49a3 --- /dev/null +++ b/script/test/PhaseShifterScan_dv.py @@ -0,0 +1,21 @@ +SAMPLES = 20 +TOLERANCE = 0.01 +TIMEOUT = 10.0 + +intensity = ChannelDouble("intensity", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US") +intensity.initialize() + +gap = Channel(GAP + ":GAP_SP", alias = "gap") +readout = Channel(GAP + ":GAP") + +av = create_averager(intensity, SAMPLES, interval = -1, name = None) + +def before(position, scan): + caput(GAP + ":GO", 1) + start = time.time() + while abs(readout.read() - gap.read()) > TOLERANCE: + time.sleep(0.1) + if time.time() - start > TIMEOUT: + raise Exception ("Timeout waiting gap change") + +ret = lscan (gap, av, 17.5, 19.5, 40, latency=10.0, before_read=before) diff --git a/script/test/Test2D.py b/script/test/Test2D.py new file mode 100644 index 0000000..9acc6bd --- /dev/null +++ b/script/test/Test2D.py @@ -0,0 +1 @@ +ascan([Test, 'ca://SWISSFEL-STYLE-GUIDE:AMPLITUDE-SIN'], ['ca://SWISSFEL-STYLE-GUIDE:SIGNAL1?monitored=true&samples=4&interval=-1', 'ca://SWISSFEL-STYLE-GUIDE:SIGNAL2?monitored=true'], [0.0, 10.0], [4.0, 20.0], [1, 1.0], latency=0.5, relative=False, passes=1, zigzag=True, name='Test2DScan2', layout='sf') \ No newline at end of file diff --git a/script/test/Test2DScan.scan b/script/test/Test2DScan.scan new file mode 100644 index 0000000..9d9f0aa --- /dev/null +++ b/script/test/Test2DScan.scan @@ -0,0 +1 @@ +[ "Multidimensional", [ [ "Channel", " SWISSFEL-STYLE-GUIDE:AMPLITUDE-SIN", 12.0, 14.0, 1.0 ], [ "Channel", "SWISSFEL-STYLE-GUIDE:SET-PRESSURE", 0.09, 0.1, 0.001 ] ], [ [ "CamServer", "http://sf-daqsync-01:8889/SARBD02-DSCR050_sp1?channel=gr_intensity", 3, -1.0, "Enabled" ], [ "CamServer", "http://sf-daqsync-01:8889/SARBD02-DSCR050_sp1?channel=intensity", 1, 0, "Enabled" ], [ "CamServer", "http://sf-daqsync-01:8889/SARBD02-DSCR050_sp1?channel=y_profile", 1, -1.0, "Line" ] ], false, [ ], "", 10, 0.0, 0.2, false, false, true, true, "TestScanEditor", "", "SF", " ", 0, null, null, "Positioner", false ] \ No newline at end of file diff --git a/script/test/Test2DScan2.scan b/script/test/Test2DScan2.scan new file mode 100644 index 0000000..503a2cb --- /dev/null +++ b/script/test/Test2DScan2.scan @@ -0,0 +1 @@ +[ "Multidimensional", [ [ "Device", "Test", 0.0, 4.0, 1 ], [ "Channel", "SWISSFEL-STYLE-GUIDE:AMPLITUDE-SIN", 10.0, 20.0, 1.0 ] ], [ [ "Channel", "SWISSFEL-STYLE-GUIDE:SIGNAL1?monitored=true", 4, -1.0, "Enabled" ], [ "Channel", "SWISSFEL-STYLE-GUIDE:SIGNAL2?monitored=true", 1, 0, "Enabled" ] ], false, [ ], "", 1, 1.0, 0.5, false, true, true, true, "", "", "SF", " ", 0, null, null, "Sensor 2", false ] \ No newline at end of file diff --git a/script/test/TestChangeEvScan.scan b/script/test/TestChangeEvScan.scan new file mode 100644 index 0000000..3ff02a2 --- /dev/null +++ b/script/test/TestChangeEvScan.scan @@ -0,0 +1 @@ +[ "Change event series", [ ], [ [ "Channel", "SINEG01-RSYS:GET-BEAM-PHASE?monitored=true", 5, -1.0, "Enabled" ] ], false, [ ], "", 10, 0.0, 0.0, false, false, true, true, "", "", "Default", "h5", 0, null, null, "Positioner", false ] \ No newline at end of file diff --git a/script/test/TestMetadataArray.py b/script/test/TestMetadataArray.py new file mode 100644 index 0000000..0c67663 --- /dev/null +++ b/script/test/TestMetadataArray.py @@ -0,0 +1,10 @@ +import ch.psi.pshell.epics.ChannelDoubleArray as ChannelDoubleArray + + +d = ChannelDoubleArray("test", "SINLH02-DBLM230:LOSS_SIGNAL_RAW", -1, False) + + +add_device(d,True) + + +print len(test.read()) \ No newline at end of file diff --git a/script/test/TestMonitScan.scan b/script/test/TestMonitScan.scan new file mode 100644 index 0000000..a684328 --- /dev/null +++ b/script/test/TestMonitScan.scan @@ -0,0 +1 @@ +[ "Change event series", [ ], [ [ "Channel", "SINLH02-DBLM230:LOSS_SIGNAL_RAW?monitored=True", 2, -1.0, "Enabled" ] ], true, [ ], "", 10, 0.0, 0.5, false, true, true, true, "", "", "SF", "", 0, null, null, "Time", false ] \ No newline at end of file diff --git a/script/test/TestMonitScan2.scan b/script/test/TestMonitScan2.scan new file mode 100644 index 0000000..2e16a27 --- /dev/null +++ b/script/test/TestMonitScan2.scan @@ -0,0 +1 @@ +[ "Change event series", [ ], [ [ "Channel", "SWISSFEL-STYLE-GUIDE:SIGNAL2?monitored=true", 1, -1.0, "Enabled" ], [ "Channel", "SWISSFEL-STYLE-GUIDE:SIGNAL1", 1, 0, "Enabled" ] ], false, [ ], "", 10, 0.0, 0.5, false, true, false, true, "", "", "SF", "", 0, null, null, "Positioner", false ] \ No newline at end of file diff --git a/script/test/TestyArrOp.py b/script/test/TestyArrOp.py new file mode 100644 index 0000000..58663a8 --- /dev/null +++ b/script/test/TestyArrOp.py @@ -0,0 +1,19 @@ +def create_device(url, parent=None): + """Create a device form a definition string(see URLDevice) + + Args: + url(str or list of string): the device definition string (or list of strings) + parent(bool, optional): parent device + + Returns: + The created device (or list of devices) + """ + return ch.psi.pshell.core.UrlDevice.create(url, parent) + + +devices = create_device(["ca://SINDI02-DBLM025:LOSS_SIGNAL_RAW?monitored=true&op=sum" ]) #SINDI02-DBLM025:LOSS_SIGNAL_RAW +try: + mscan([], devices , 10, -1, persist=False) #ar is ony updated on read + #tscan( devices , 5, 0.1) +finally: + devices[0].parent.close() \ No newline at end of file diff --git a/script/test/WireScannerChannels.py b/script/test/WireScannerChannels.py new file mode 100644 index 0000000..0b7d26b --- /dev/null +++ b/script/test/WireScannerChannels.py @@ -0,0 +1,58 @@ +#ws = "SARUN20-DWSC010" +#ws = "SINDI01-DWSC090" +#ws = "SARMA02-DWSC060" +#ws = "S10DI01-DWSC010" +ws = "SARMA02-DWSC060" + + +print caget(ws + ":VALID") + + +print "COM:" , caget(ws + ":B1_X_CENTER_OF_MASS") +print "RMS:" , caget(ws + ":B1_X_RMS") +print "AMP:" , caget(ws + ":B1_X_FIT_AMPLITUDE") +print "MEAN:" , caget(ws + ":B1_X_FIT_MEAN") +print "OFF:" , caget(ws + ":B1_X_FIT_OFFSET") +print "SIGMA:" , caget(ws + ":B1_X_FIT_STANDARD_DEVIATION") + +plot([caget(ws + ":B1_X_AMPLITUDE"), caget(ws + ":B1_X_FIT_GAUSS_FUNCTION")], ["data", "fit"], xdata = caget(ws + ":B1_X_POSITION")) + + + +""" +print caget(ws + ":B1_Y_CENTER_OF_MASS") +print caget(ws + ":B1_Y_RMS") +print caget(ws + ":B1_Y_FIT_AMPLITUDE") +print caget(ws + ":B1_Y_FIT_MEAN") +print caget(ws + ":B1_Y_FIT_OFFSET") +print caget(ws + ":B1_Y_FIT_STANDARD_DEVIATION") +print len(caget(ws + ":B1_Y_POSITION")) +print len(caget(ws + ":B1_Y_AMPLITUDE")) + + +print caget(ws + ":B2_X_CENTER_OF_MASS") +print caget(ws + ":B2_X_RMS") +print caget(ws + ":B2_X_FIT_AMPLITUDE") +print caget(ws + ":B2_X_FIT_MEAN") +print caget(ws + ":B2_X_FIT_OFFSET") +print caget(ws + ":B2_X_FIT_STANDARD_DEVIATION") +print len(caget(ws + ":B2_X_POSITION")) +print len(caget(ws + ":B2_X_AMPLITUDE")) + + +print caget(ws + ":B2_Y_CENTER_OF_MASS") +print caget(ws + ":B2_Y_RMS") +print caget(ws + ":B2_Y_FIT_AMPLITUDE") +print caget(ws + ":B2_Y_FIT_MEAN") +print caget(ws + ":B2_Y_FIT_OFFSET") +print caget(ws + ":B2_Y_FIT_STANDARD_DEVIATION") +print len(caget(ws + ":B2_Y_POSITION")) +print len(caget(ws + ":B2_Y_AMPLITUDE")) + +""" + +#print len(caget(ws + ":B1_X_FIT_GAUSS_FUNCTION")) +#print len(caget(ws + ":B1_Y_FIT_GAUSS_FUNCTION")) +#print len(caget(ws + ":B2_X_FIT_GAUSS_FUNCTION")) +#print len(caget(ws + ":B2_Y_FIT_GAUSS_FUNCTION")) + diff --git a/script/test/WireScannerOutputChannels.py b/script/test/WireScannerOutputChannels.py new file mode 100644 index 0000000..4066fa0 --- /dev/null +++ b/script/test/WireScannerOutputChannels.py @@ -0,0 +1,20 @@ + + +run("Devices/WireScanner") + +#ws = "SARUN20-DWSC010" +ws = "S10DI01-DWSC010" +dev = WireScanInfo("wscn", ws) + +print dev.is_valid() + +dev.set_out_com(1,'x',1) +dev.set_out_rms(1,'x',2) +dev.set_out_amp(1,'x',3) +dev.set_out_mean(1,'x',4) +dev.set_out_off(1,'x',5) +dev.set_out_sigma(1,'x',6) +dev.set_out_pos(1,'x',[1,2,3]) +dev.set_out_samples(1,'x',[4,5,6]) +dev.set_out_gauss(1,'x',[7,8,9]) + diff --git a/script/test/phase_scan_caqtdm_dv.py b/script/test/phase_scan_caqtdm_dv.py deleted file mode 100644 index 2a78033..0000000 --- a/script/test/phase_scan_caqtdm_dv.py +++ /dev/null @@ -1,149 +0,0 @@ -import ch.psi.pshell.epics.Positioner as Positioner -import ch.psi.pshell.epics.ChannelDouble as ChannelDouble - -dry_run = True -do_elog = False -is_panel = get_exec_pars().source != CommandSource.ui -if is_panel: - station = args[0] - bpm_ch = args[1] -else: - station = "STEST01" - bpm_ch = "SINBC02-DBPM140" -start = caget(station + "-RSYS:SET-SCAN-START") -stop = caget(station + "-RSYS:SET-SCAN-STOP") -step = caget(station + "-RSYS:SET-SCAN-STEP") -lat = caget(station + "-RSYS:SET-SCAN-WAIT-TIME") -nb = caget(station + "-RSYS:SET-NUM-AVERAGE") -disp = caget(bpm_ch + ":DISPERSION-OP") -def mbnd(bpm_ch): - return { - 'SINLH02-DBPM210': 'SINLH02-MBND100', - 'SINLH02-DBPM240': 'SINLH02-MBND100', - 'SINBC02-DBPM140': 'SINBC02-MBND100', - 'SINBC02-DBPM320': 'SINBC02-MBND100', - 'S10DI01-DBPM020': 'S10DI01-MBND100', - 'S10BC02-DBPM140': 'S10BC02-MBND100', - 'S10BC02-DBPM320': 'S10BC02-MBND100', - 'SARCL02-DBPM110': 'SARCL02-MBND100', - 'SARCL02-DBPM220': 'SARCL02-MBND100', - 'SARCL02-DBPM260': 'SARCL02-MBND100', - 'SARCL02-DBPM330': 'SARCL02-MBND100', - 'SARCL02-DBPM470': 'SARCL02-MBND100' - }[bpm_ch] -p0 = caget(mbnd(bpm_ch) + ":P-READ") -energy0 = p0 - 0.511 -A = energy0 / (disp * 1000) -B = energy0 -phase = Positioner("Phase", station + "-RSYS:SET-VSUM-PHASE", station + "-RSYS:GET-VSUM-PHASE") -phase.config.minValue =-90.0 -phase.config.maxValue = 360.0 -phase.config.precision = 4 -phase.config.rotation = True -phase.config.resolution = 0.1 -phase.initialize() -V = ChannelDouble("Amplitude Readback", station + "-RSYS:GET-VSUM-AMPLT") -P = ChannelDouble("Power Readback", station + "-RSYS:GET-KLY-POWER") -V.initialize() -P.initialize() -if dry_run: - x = ChannelDouble("BPM-X", bpm_ch + ":X1-SIMU") -else: - x = ChannelDouble("BPM-X", bpm_ch + ":X1") -x.initialize() -phase0 = phase.read() % 360 -caput(station + "-RSYS:GET-FIT-PHASE-ARRAY", to_array([0.0],'d')) -caput(station + "-RSYS:GET-FIT-ENERGY-ARRAY", to_array([0.0],'d')) -caput(station + "-RSYS:GET-ONCREST-VSUM-PHASE", float('nan')) -caput(station + "-RSYS:GET-ONCREST-VSUM-AMPLT", float('nan')) -caput(station + "-RSYS:GET-ONCREST-E-GAIN", float('nan')) -caput(station + "-RSYS:GET-ONCREST-KLY-POWER", float('nan')) - -#update the plot dynamically -arr_phase,arr_energy = [],[] -def after(rec): - global A, B - arr_phase.append(rec.positions[0]) - arr_energy.append(A * rec.values[0].mean + B) - caput(station + "-RSYS:GET-PHASE-ARRAY", to_array(arr_phase, 'd')) - caput(station + "-RSYS:GET-ENERGY-ARRAY", to_array(arr_energy,'d')) - -#scan and plot -try: - phase.write(start) - time.sleep(1.0) - x_averager = create_averager(x, nb, lat) - r = lscan(phase, x_averager, start, stop, step, latency=lat, after_read = after) - rf_phase = r.getPositions(0) - if start < 0: - rf_phase = [((ph + 90) % 360) -90 for ph in rf_phase ] - energy = [A * val.mean + B for val in r.getReadable(0)] - caput(station + "-RSYS:GET-ENERGY-ARRAY", to_array(energy, 'd')) - caput(station + "-RSYS:GET-PHASE-ARRAY", to_array(rf_phase,'d')) - try: - run("CPython/wrapper") - (fit_amplitude, fit_phase_deg, fit_offset, ph_crest, fit_x, fit_y) = hfitoff(energy , rf_phase) - except: - raise Exception("Fit failure") - plt = plot(None,name="phase scan")[0] - if plt is not None: - plt.getSeries(0).setData(to_array(rf_phase,'d'), to_array(energy,'d')) - plt.getSeries(0).setPointSize(6) - plt.getSeries(0).setLinesVisible(False) - plt.addSeries(LinePlotSeries("fit")) - plt.getSeries(1).setData(fit_x, fit_y) - plt.getSeries(1).setPointsVisible(False) - plt.setLegendVisible(True) - ph_crest = ph_crest % 360 - phase.write(ph_crest) - time.sleep(lat) - Ampl = V.read() - Power = P.read() - caput(station + "-RSYS:GET-ONCREST-VSUM-PHASE", ph_crest) - caput(station + "-RSYS:GET-ONCREST-E-GAIN", fit_amplitude) - caput(station + "-RSYS:GET-ONCREST-VSUM-AMPLT", Ampl) - caput(station + "-RSYS:GET-ONCREST-KLY-POWER", Power) - caput(station + "-RSYS:GET-FIT-PHASE-ARRAY", fit_x) - caput(station + "-RSYS:GET-FIT-ENERGY-ARRAY", fit_y) -finally: - phase.write(phase0) - phase.close() - V.close() - P.close() - x.close() -phase_corr = caget(station + "-RSYS:GET-VSUM-PHASE-OFFSET-CORR") -phase_offset = 90.0 - ph_crest - phase_corr -amplitude_scale = fit_amplitude / Ampl if Ampl != 0 else 0.0 -power_scale = Power / fit_amplitude**2 if fit_amplitude != 0 else 0.0 -caput(station + "-RSYS:SET-VSUM-PHASE-OFFSET-BASE-CALC", phase_offset) -caput(station + "-RSYS:SET-VSUM-AMPLT-SCALE-CALC", amplitude_scale) -caput(station + "-RSYS:SET-VOLT-POWER-SCALE-CALC", power_scale) - -#Saving metadata -save_dataset (get_exec_pars().group + "/Station" , station ) -save_dataset (get_exec_pars().group + "/Energy" , energy ) -save_dataset (get_exec_pars().group + "/Energy gain" , fit_amplitude ) -save_dataset (get_exec_pars().group + "/On-crest VS-phase" , ph_crest ) -save_dataset (get_exec_pars().group + "/VS-phase offset" , phase_offset ) -save_dataset (get_exec_pars().group + "/Amplitude scale" , amplitude_scale ) -save_dataset (get_exec_pars().group + "/Power scale" , power_scale ) -set_attribute(get_exec_pars().group + "/Energy" , "Unit", "MeV" ) -set_attribute(get_exec_pars().group + "/Energy gain" , "Unit", "MeV" ) -set_attribute(get_exec_pars().group + "/On-crest VS-phase" , "Unit", "deg" ) -set_attribute(get_exec_pars().group + "/VS-phase offset" , "Unit", "deg" ) -set_attribute(get_exec_pars().group + "/Amplitude scale" , "Unit", "MV" ) -set_attribute(get_exec_pars().group + "/Power scale" , "Unit", "MW/MV^2" ) -set_attribute(get_exec_pars().group + "/Phase" , "Unit", "deg" ) -set_attribute(get_exec_pars().group + "/BPM-X averager" , "Unit", "mm" ) - -#Elog entry -if do_elog: - title = "Phase scan " + station - log_msg = "Data file: " + get_exec_pars().path + "\n" - log_msg = log_msg + "On-crest VS phase: %0.2f" % ph_crest + " deg \n" - log_msg = log_msg + "Energy gain: %0.3f" % fit_amplitude + " MeV \n" - log_msg = log_msg + "VS-phase offset: %0.2f" % phase_offset + " deg \n" - log_msg = log_msg + "Amplitude scale: %0.3f" % amplitude_scale + " MV \n" - log_msg = log_msg + "Power scale: %0.6f" % power_scale + " MW/MV^2" - attachments = get_plot_snapshots(size=(600,400)) - elog(title, log_msg, attachments) diff --git a/script/test/phase_scan_caqtdm_set_dv.py b/script/test/phase_scan_caqtdm_set_dv.py deleted file mode 100644 index bc51f2a..0000000 --- a/script/test/phase_scan_caqtdm_set_dv.py +++ /dev/null @@ -1,40 +0,0 @@ -do_elog = False - -if get_exec_pars().source == CommandSource.ui: - station = "STEST01" -else: - station = args[0] - -phase_set = caget(station + "-RSYS:PHASE-SET") -ampli_set = caget(station + "-RSYS:AMPLT-SET") -power_set = caget(station + "-RSYS:POWER-SET") - -n = 0 -if (phase_set == 'True'): - phase_offset = caget(station + "-RSYS:SET-VSUM-PHASE-OFFSET-BASE-CALC") - phase_offset_old = caget(station + "-RSYS:SET-VSUM-PHASE-OFFSET-BASE") - caput(station + "-RSYS:SET-VSUM-PHASE-OFFSET-BASE", phase_offset) - print phase_set - n = n + 1 -if (ampli_set == 'True'): - amplitude_scale = caget(station + "-RSYS:SET-VSUM-AMPLT-SCALE-CALC") - amplitude_scale_old = caget(station + "-RSYS:SET-VSUM-AMPLT-SCALE") - caput(station + "-RSYS:SET-VSUM-AMPLT-SCALE", amplitude_scale) - print ampli_set - n = n + 1 -if (power_set == 'True'): - power_scale = caget(station + "-RSYS:SET-VOLT-POWER-SCALE-CALC") - power_scale_old = caget(station + "-RSYS:SET-VOLT-POWER-SCALE") - caput(station + "-RSYS:SET-VOLT-POWER-SCALE", power_scale) - print power_set - n = n + 1 -caput(station + "-RSYS:CMD-LOAD-CALIB-BEAM", 1) - -if do_elog == True and n > 0: - title = "Set RF calibration:" + station - log_msg = "" - if (phase_set == 'True'): log_msg = log_msg + station + "-RSYS:SET-VSUM-PHASE-OFFSET-BASE: %0.2f" % phase_offset + " deg (was %0.2f" % phase_offset_old + " deg)\n" - if (ampli_set == 'True'): log_msg = log_msg + station + "-RSYS:SET-VSUM-AMPLT-SCALE: %0.3f" % amplitude_scale + " MV (was %0.3f" % amplitude_scale_old + " MV)\n" - if (power_set == 'True'): log_msg = log_msg + station + "-RSYS:SET-VOLT-POWER-SCALE: %0.5f" % power_scale + " MW/MV^2 (was %0.5f" % power_scale_old + " MW/MV^2)" - attachments = [] - elog(title, log_msg, attachments) \ No newline at end of file diff --git a/script/test/scan_example2_dv.py b/script/test/scan_example2_dv.py new file mode 100644 index 0000000..fcef7c2 --- /dev/null +++ b/script/test/scan_example2_dv.py @@ -0,0 +1,34 @@ +import ch.psi.pshell.epics.ChannelDouble as ChannelDouble +A1 = ChannelDouble("Actuator1", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") +S1 = ChannelDouble("Sensor1", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US") +S2 = ChannelDouble("Sensor2", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-DS") +A1.initialize() +S1.initialize() +S2.initialize() +A1_init = A1.read() +A1i = -10.0 +A1f = 150.0 +nstep = 10 +lat = 0.150 +nav = 10 +plt = plot(None, title="Output")[0] +plt.clear() +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Sensor1", Color.red)) +def after_sample(record, scan): + plt.getSeries(0).appendData(record.positions[0], record.values[0].mean, record.values[0].stdev) +try: + S1_averager = create_averager(S1, nav, lat) + S2_averager = create_averager(S2, nav, lat) + S2_averager.monitored=True + r = lscan(A1, (S1_averager, S2_averager), A1i, A1f, nstep, latency=lat, after_read = after_sample) + Act1 = r.getPositions(0) + S1mean = [val.mean for val in r.getReadable(0)] + S1rms = [val.stdev for val in r.getReadable(0)] + S2mean = [val.mean for val in r.getReadable(1)] + S2rmsn = [val.stdev for val in r.getReadable(1)] +finally: + A1.write(A1_init) + A1.close() + S1.close() + S2.close() \ No newline at end of file diff --git a/script/test/scan_example3_dv.py b/script/test/scan_example3_dv.py new file mode 100644 index 0000000..d2d27ec --- /dev/null +++ b/script/test/scan_example3_dv.py @@ -0,0 +1,28 @@ +import ch.psi.pshell.epics.ChannelDouble as ChannelDouble +A1 = ChannelDouble("Actuator1", "SARUN07-UIND030:I-SET") +S1 = ChannelDouble("Sensor1", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US") +A1.initialize() +S1.initialize() +A1_init = A1.read() +A1i = -1.0 +A1f = 1.2 +nstep = 22 +lat = 0.11 +nav = 50 +plt = plot(None, title="Output")[0] +plt.clear() +plt.setStyle(plt.Style.ErrorY) +plt.addSeries(LinePlotErrorSeries("Sensor1", Color.red)) +def after_sample(record, scan): + plt.getSeries(0).appendData(record.positions[0], record.values[0].mean, record.values[0].stdev) +try: + S1_averager = create_averager(S1, nav, lat) + time.sleep(1.0) + r = lscan(A1, S1_averager, A1i, A1f, nstep, latency=2.0, after_read = after_sample) + Act1 = r.getPositions(0) + S1mean = [val.mean for val in r.getReadable(0)] + S1rms = [val.stdev for val in r.getReadable(0)] +finally: + A1.write(A1_init) + A1.close() + S1.close() \ No newline at end of file diff --git a/script/test/scan_example_dv.py b/script/test/scan_example_dv.py index 2c3bc5d..c563b58 100644 --- a/script/test/scan_example_dv.py +++ b/script/test/scan_example_dv.py @@ -1,8 +1,8 @@ import ch.psi.pshell.epics.ChannelDouble as ChannelDouble A1 = ChannelDouble("Actuator1", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") A2 = ChannelDouble("Actuator2", "SINEG01-RSYS:SET-BEAM-PHASE-SIM") -S1 = ChannelDouble("Sensor1", "SINEG01-DICT215:B1_CHARGE-SIM") -S2 = ChannelDouble("Sensor2", "SINEG01-RSYS:SET-VSUM-PHASE-SIM") +S1 = ChannelDouble("Sensor1", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US") +S2 = ChannelDouble("Sensor2", "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-DS") A1.initialize() A2.initialize() S1.initialize()