From 511f888e982506d12b99cffdcf9a2886135a1470 Mon Sep 17 00:00:00 2001 From: gobbo_a Date: Mon, 14 Jul 2025 17:48:44 +0200 Subject: [PATCH] Startup --- config/.DS_Store | Bin 0 -> 6148 bytes config/config.properties | 78 +++++++++++++ config/devices.properties | 1 + config/jcae.properties | 12 ++ config/mail.properties | 9 ++ config/plugins.properties | 3 + config/preferences.json | 132 +++++++++++++++++++++ config/variables.properties | 4 + config/xscan.properties | 14 +++ devices/CameraServer.properties | 25 ++++ devices/CurrentCamera.properties | 25 ++++ devices/dp1.properties | 12 ++ devices/m1.properties | 17 +++ devices/m2.properties | 17 +++ devices/p1.properties | 11 ++ devices/src1.properties | 25 ++++ devices/src2.properties | 25 ++++ plugins/.DS_Store | Bin 0 -> 6148 bytes plugins/CCC.form | 28 +++++ plugins/CCC.java | 65 +++++++++++ plugins/Test.form | 28 +++++ plugins/Test.java | 65 +++++++++++ plugins/XXX.form | 58 ++++++++++ plugins/XXX.java | 88 ++++++++++++++ plugins/YYY.form | 28 +++++ plugins/YYY.java | 65 +++++++++++ plugins/ZZZ.form | 28 +++++ plugins/ZZZ.java | 65 +++++++++++ script/.DS_Store | Bin 0 -> 6148 bytes script/listener.py | 47 ++++++++ script/local.groovy | 3 + script/local.js | 4 + script/local.py | 190 +++++++++++++++++++++++++++++++ script/methood.py | 2 + script/test.py | 14 +++ script/test.xml | 29 +++++ script/test2.py | 11 ++ script/test2.xml | 27 +++++ script/test8.xml | 29 +++++ 39 files changed, 1284 insertions(+) create mode 100644 config/.DS_Store create mode 100644 config/config.properties create mode 100644 config/devices.properties create mode 100644 config/jcae.properties create mode 100644 config/mail.properties create mode 100644 config/plugins.properties create mode 100644 config/preferences.json create mode 100644 config/variables.properties create mode 100644 config/xscan.properties create mode 100644 devices/CameraServer.properties create mode 100644 devices/CurrentCamera.properties create mode 100644 devices/dp1.properties create mode 100644 devices/m1.properties create mode 100644 devices/m2.properties create mode 100644 devices/p1.properties create mode 100644 devices/src1.properties create mode 100644 devices/src2.properties create mode 100644 plugins/.DS_Store create mode 100644 plugins/CCC.form create mode 100644 plugins/CCC.java create mode 100644 plugins/Test.form create mode 100644 plugins/Test.java create mode 100644 plugins/XXX.form create mode 100644 plugins/XXX.java create mode 100644 plugins/YYY.form create mode 100644 plugins/YYY.java create mode 100644 plugins/ZZZ.form create mode 100644 plugins/ZZZ.java create mode 100644 script/.DS_Store create mode 100644 script/listener.py create mode 100644 script/local.groovy create mode 100644 script/local.js create mode 100644 script/local.py create mode 100644 script/methood.py create mode 100644 script/test.py create mode 100644 script/test.xml create mode 100644 script/test2.py create mode 100644 script/test2.xml create mode 100755 script/test8.xml diff --git a/config/.DS_Store b/config/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/CCC.java b/plugins/CCC.java new file mode 100644 index 0000000..9ed3525 --- /dev/null +++ b/plugins/CCC.java @@ -0,0 +1,65 @@ +import ch.psi.pshell.framework.Panel; +import ch.psi.pshell.utils.State; + +/** + * + */ +public class CCC extends Panel { + + public CCC() { + initComponents(); + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + + } + + @Override + public void onStateChange(State state, State former) { + + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + @Override + protected void onTimer() { + } + + @Override + protected void onLoaded() { + + } + + @Override + protected void onUnloaded() { + + } + + //Invoked by 'update()' to update components in the event thread + @Override + protected void doUpdate() { + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 449, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 137, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +} diff --git a/plugins/Test.form b/plugins/Test.form new file mode 100644 index 0000000..ff9cfab --- /dev/null +++ b/plugins/Test.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/Test.java b/plugins/Test.java new file mode 100644 index 0000000..8f3c7fe --- /dev/null +++ b/plugins/Test.java @@ -0,0 +1,65 @@ +import ch.psi.pshell.framework.Panel; +import ch.psi.pshell.utils.State; + +/** + * + */ +public class Test extends Panel { + + public Test() { + initComponents(); + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + + } + + @Override + public void onStateChange(State state, State former) { + + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + @Override + protected void onTimer() { + } + + @Override + protected void onLoaded() { + + } + + @Override + protected void onUnloaded() { + + } + + //Invoked by 'update()' to update components in the event thread + @Override + protected void doUpdate() { + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 449, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 137, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +} diff --git a/plugins/XXX.form b/plugins/XXX.form new file mode 100644 index 0000000..73fb65f --- /dev/null +++ b/plugins/XXX.form @@ -0,0 +1,58 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/XXX.java b/plugins/XXX.java new file mode 100644 index 0000000..8256aea --- /dev/null +++ b/plugins/XXX.java @@ -0,0 +1,88 @@ + +import ch.psi.pshell.framework.Panel; +import ch.psi.pshell.utils.State; + +/** + * + */ +public class XXX extends Panel { + + public XXX() { + initComponents(); + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + + } + + @Override + public void onStateChange(State state, State former) { + + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + @Override + protected void onTimer() { + } + + @Override + protected void onLoaded() { + + } + + @Override + protected void onUnloaded() { + + } + + //Invoked by 'update()' to update components in the event thread + @Override + protected void doUpdate() { + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + deviceValuePanel1 = new ch.psi.pshell.swing.DeviceValuePanel(); + renderer1 = new ch.psi.pshell.imaging.Renderer(); + + deviceValuePanel1.setDeviceName("sin"); + + renderer1.setDeviceName("src1"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(renderer1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGap(81, 81, 81) + .addComponent(deviceValuePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(18, 18, 18) + .addComponent(deviceValuePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 57, Short.MAX_VALUE) + .addComponent(renderer1, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(34, 34, 34)) + ); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private ch.psi.pshell.swing.DeviceValuePanel deviceValuePanel1; + private ch.psi.pshell.imaging.Renderer renderer1; + // End of variables declaration//GEN-END:variables +} diff --git a/plugins/YYY.form b/plugins/YYY.form new file mode 100644 index 0000000..ff9cfab --- /dev/null +++ b/plugins/YYY.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/YYY.java b/plugins/YYY.java new file mode 100644 index 0000000..5f6b145 --- /dev/null +++ b/plugins/YYY.java @@ -0,0 +1,65 @@ +import ch.psi.pshell.framework.Panel; +import ch.psi.pshell.utils.State; + +/** + * + */ +public class YYY extends Panel { + + public YYY() { + initComponents(); + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + + } + + @Override + public void onStateChange(State state, State former) { + + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + @Override + protected void onTimer() { + } + + @Override + protected void onLoaded() { + + } + + @Override + protected void onUnloaded() { + + } + + //Invoked by 'update()' to update components in the event thread + @Override + protected void doUpdate() { + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 449, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 137, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +} diff --git a/plugins/ZZZ.form b/plugins/ZZZ.form new file mode 100644 index 0000000..ff9cfab --- /dev/null +++ b/plugins/ZZZ.form @@ -0,0 +1,28 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/ZZZ.java b/plugins/ZZZ.java new file mode 100644 index 0000000..2590eeb --- /dev/null +++ b/plugins/ZZZ.java @@ -0,0 +1,65 @@ +import ch.psi.pshell.framework.Panel; +import ch.psi.pshell.utils.State; + +/** + * + */ +public class ZZZ extends Panel { + + public ZZZ() { + initComponents(); + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + + } + + @Override + public void onStateChange(State state, State former) { + + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + @Override + protected void onTimer() { + } + + @Override + protected void onLoaded() { + + } + + @Override + protected void onUnloaded() { + + } + + //Invoked by 'update()' to update components in the event thread + @Override + protected void doUpdate() { + } + + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 449, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 137, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +} diff --git a/script/.DS_Store b/script/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c197415390ea4851326a7a341d9bec0e4882200d GIT binary patch literal 6148 zcmeH~JqiLr422WdLa^D=avBfd4F=K9&I^dz2!e&!&(VGPVZqf}L|!0yGueb?zhY-1 zBD#K@S0cTL%;2W7v@kNozLT9?!>izT2nwS^)B(`bc8tNIvX zd2ff7tgERlG}=XT_|SZ_+7tuRXcsNmz_hwBkN^pc2z0UU?fl=uKh6K67H&y^1pbVG zPB;6_8XuKs>)Yp9{*YN)H#pSG5ne6<*w|6LfV<&&u?4iIwoqhXya+f31`_xxfhX`D B5kdd} literal 0 HcmV?d00001 diff --git a/script/listener.py b/script/listener.py new file mode 100644 index 0000000..57ee33f --- /dev/null +++ b/script/listener.py @@ -0,0 +1,47 @@ +""" +Create a device listener to interrupt the scan +""" +import java.lang.InterruptedException + + +class ListenerAO (ch.psi.pshell.device.DeviceListener): + def onStateChanged(self, device, state, former): + pass + def onValueChanged(self, device, value, former): + pass + def onValueChanging(self, device, value, former): + pass + +#Create a listener to the sensor, verifying the readback values. +class ListenerAI (DeviceListener): + def onValueChanged(self, device, value, former): + if value > 1.02: + print "Value over limit-> aborting" + abort() +listenerAI = ListenerAI() +ai1.addListener(listenerAI) + + + +#Create a listener to the positioner checking the setpoint before each command is sent. +class ListenerAO (DeviceListener): + def onStateChanged(self, device, state, former): + pass + def onValueChanged(self, device, value, former): + print "Moved to: " + str(value) + def onValueChanging(self, device, value, former): + if value > 20: + #Vetoing the change will abort the scan + raise Exception("Forbidden move to " + str(value)) + print "Moving to: " + str(value) + " ... " , +listenerAO = ListenerAO() +ao1.addListener(listenerAO) + + +try: + lscan(ao1, (ai1), 0, 40, 200, 0.01) +except java.lang.InterruptedException: + print "Aborted" +finally: + ai1.removeListener(listenerAI) + ao1.removeListener(listenerAO) diff --git a/script/local.groovy b/script/local.groovy new file mode 100644 index 0000000..eef7106 --- /dev/null +++ b/script/local.groovy @@ -0,0 +1,3 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Deployment specific global definitions - executed after startup.groovy +/////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/script/local.js b/script/local.js new file mode 100644 index 0000000..e2eeaad --- /dev/null +++ b/script/local.js @@ -0,0 +1,4 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Deployment specific global definitions - executed after startup.js +/////////////////////////////////////////////////////////////////////////////////////////////////// + diff --git a/script/local.py b/script/local.py new file mode 100644 index 0000000..fafc516 --- /dev/null +++ b/script/local.py @@ -0,0 +1,190 @@ +################################################################################################### +# Deployment specific global definitions - executed after startup.py +################################################################################################### + +import random + +#################################################################################################### +# Simulated Devices +#################################################################################################### + +class AnalogOutput(RegisterBase): + def doRead(self): + return self.val if hasattr(self, 'val') else 0.0 + + def doWrite(self, val): + self.val = val + +class AnalogInput(ReadonlyRegisterBase): + def doRead(self): + time.sleep(0.001) + self.val = to_array(self.calc(), 'd') + return self.val + +class Waveform(ReadonlyRegisterBase, ReadonlyRegisterArray): + def doRead(self): + time.sleep(0.001) + self.val = to_array(self.calc(), 'd') + return self.val + +class Image(ReadonlyRegisterBase, ReadonlyRegisterMatrix): + def doRead(self): + time.sleep(0.001) + self.val = to_array(self.calc(), 'd') + return self.val + + def getWidth(self): + return len(self.take(-1)[0]) + + def getHeight(self): + return len(self.take(-1)) + + + +class Random(AnalogInput): + def calc(self): + return random.random() + + +class SinusoidSample(AnalogInput): + def calc(self): + self.x = self.x + 0.1 if hasattr(self, 'x') else 0.0 + noise = (random.random() - 0.5) / 10.0 + return math.sin(self.x) + noise + +class SinusoidTime(AnalogInput): + def calc(self): + noise = (random.random() - 0.5) / 10.0 + return math.sin(time.time()) + noise + + +class SinusoidWaveform(Waveform): + def calc(self): + ret = [] + x = random.random() + for i in range (20): + ret.append(math.sin(x)) + x = x + 0.1 + return ret + +class SinusoidImage(Image): + def calc(self): + (width, height) = (200, 100) + ret = [] + x = random.random(); + base = [] + for i in range (width): + base.append( math.sin(x)) + x = x + 0.05 + for i in range (height): + noise = (random.random() - 0.5)/5.0 + ret.append([x+noise for x in base]) + return ret + + +#Defintion +add_device(DummyMotor("m1"), True) +add_device(DummyMotor("m2"), True) +add_device(DummyRegister("reg1",3), True) +add_device(AnalogOutput("ao1"), True) +add_device(AnalogOutput("ao2"), True) +add_device(SinusoidSample("ai1"), True) +add_device(SinusoidTime("ai2"), True) +add_device(Random("ai3"), True) +add_device(SinusoidWaveform("wf1"), True) +add_device(SinusoidImage("im1"), True) +add_device(DummyPositioner("p1"),True) +add_device(MotorGroupBase("mg1", m1, m2), True) +add_device(MotorGroupDiscretePositioner("dp1", mg1), True) + + + +#Initial Configuration +if p1.config.unit is None: + p1.config.minValue = 0.0 #Not persisted + p1.config.maxValue = 1000.0 + p1.config.unit = "mm" + p1.config.save() + p1.initialize() + +if dp1.config.positions is None: + dp1.config.positions = ["Park","Ready","Out","Clear"] + dp1.config.motor1 = ["0.0","4.0","8.0" ,"0.0"] + dp1.config.motor2 = ["0.0","5.0","3.0" ,"NaN"] + dp1.config.save() + dp1.initialize() + + + +#Update +m1.setMonitored(True) +m2.setMonitored(True) + + + + +#################################################################################################### +# Simple Readable / Writable objects can be created and used in scans +#################################################################################################### +class WritableScalar(Writable): + def write(self, value): + pass + +class ReadableScalar(Readable): + def read(self): + return random.random() + + +class ReadableWaveform(ReadableArray): + def getSize(self): + return 20 + + def read(self): + ret = [] + for i in range (self.getSize()): + ret.append(random.random()) + return ret + +class ReadableImage(ReadableMatrix): + def read(self): + ret = [] + for i in range (self.getHeight()): + ret.append([random.random()] * self.getWidth()) + return to_array(ret, 'd') + + def getWidth(self): + return 80 + + def getHeight(self): + return 40 + + + +ws1 = WritableScalar() +rs1 = ReadableScalar() +rw1 = ReadableWaveform() +ri1 = ReadableImage() + + +#################################################################################################### +# Imaging +#################################################################################################### + +configured = os.path.exists(Device.getConfigFileName("src1")) + +add_device(RegisterMatrixSource("src1", im1), True) +add_device(RegisterMatrixSource("src2", ri1), True) + +src1.polling = 100 +src2.polling = 100 + +#Some configuration for so the imaging will work out of the box +if not configured: + src1.config.colormapAutomatic = True + src1.config.colormap = Colormap.Temperature + src1.config.save() + src2.config.colormapAutomatic = True + src2.config.save() + + + diff --git a/script/methood.py b/script/methood.py new file mode 100644 index 0000000..618d76e --- /dev/null +++ b/script/methood.py @@ -0,0 +1,2 @@ +def test(): + pass \ No newline at end of file diff --git a/script/test.py b/script/test.py new file mode 100644 index 0000000..02a649b --- /dev/null +++ b/script/test.py @@ -0,0 +1,14 @@ +################################################################################################### +# Demonstrate the use of Line Scan: one or multiple positioners move together linearly. +################################################################################################### + + +#Execute the scan: 100 steps, a1 from 0 to 40 +r1 = lscan(ao1, (ai1,ai2,wf1), 0, 40, 100, 0.01) + +#Steps of size 1.0, a1 from 0 to 40 +r2 = lscan(ao1, (ai1,ai2,wf1), 0, 40, 1.0, 0.01) + +#2 positioners moving together in 10 steps. Also sampling an image: +r3 = lscan((ao1,ao2), (ai1,ai2,wf1,im1), (0, 0), (40, 100), 4, 0.01) + diff --git a/script/test.xml b/script/test.xml new file mode 100644 index 0000000..facf9bb --- /dev/null +++ b/script/test.xml @@ -0,0 +1,29 @@ + + + + alexandre.gobbo@psi.ch + + + My first test + + + + + 0.0 + 31.0 + 1.0 + + + + + + + + + + + + + diff --git a/script/test2.py b/script/test2.py new file mode 100644 index 0000000..b17b2f4 --- /dev/null +++ b/script/test2.py @@ -0,0 +1,11 @@ +################################################################################################### +# Demonstrate the use of Line Scan: one or multiple positioners move together linearly. +################################################################################################### + + +#Execute the scan: 100 steps, a1 from 0 to 40 +r1 = lscan(ao1, (ai1,ai2), 0, 40, 100, 0.01) + + +r2 = lscan(ao1, (ai1,ai2), 0, 40, 100, 0.01) + diff --git a/script/test2.xml b/script/test2.xml new file mode 100644 index 0000000..d330c96 --- /dev/null +++ b/script/test2.xml @@ -0,0 +1,27 @@ + + + + alexandre.gobbo@psi.ch + + + My first test + + + + + 0.0 + 31.0 + 1.0 + + + + + + + + + + + diff --git a/script/test8.xml b/script/test8.xml new file mode 100755 index 0000000..facf9bb --- /dev/null +++ b/script/test8.xml @@ -0,0 +1,29 @@ + + + + alexandre.gobbo@psi.ch + + + My first test + + + + + 0.0 + 31.0 + 1.0 + + + + + + + + + + + + +