From a541ff8f27b9008a5261bb93b3671df5f5873403 Mon Sep 17 00:00:00 2001 From: sfop Date: Mon, 29 Aug 2016 12:16:05 +0200 Subject: [PATCH] Closedown --- config/plugins.properties | 2 +- devices/CurrentCamera.properties | 10 +- plugins/Cameras.java | 3 +- plugins/LaserGunAlignment.form | 6 +- plugins/LaserGunAlignment.java | 117 +++++++++++++-------- script/Alignment/Gun_solenoid_alignment.py | 17 +-- script/Alignment/Laser_gun_alignment.py | 3 +- script/BpmStats.py | 2 +- script/test/particle_analysis.py | 30 +++--- 9 files changed, 113 insertions(+), 77 deletions(-) diff --git a/config/plugins.properties b/config/plugins.properties index ff32938..87b041a 100644 --- a/config/plugins.properties +++ b/config/plugins.properties @@ -1,5 +1,5 @@ Cameras.java=disabled -LaserGunAlignment.java=disabled +LaserGunAlignment.java=enabled test2.java=disabled GunSolenoidAlignment.java=disabled test.java=disabled diff --git a/devices/CurrentCamera.properties b/devices/CurrentCamera.properties index 1f6d4a6..3eb741c 100644 --- a/devices/CurrentCamera.properties +++ b/devices/CurrentCamera.properties @@ -1,13 +1,13 @@ -#Mon Aug 29 10:46:46 CEST 2016 -colormap=Grayscale -colormapAutomatic=false +#Mon Aug 29 11:09:30 CEST 2016 +colormap=Temperature +colormapAutomatic=true colormapMax=255.0 colormapMin=0.0 flipHorizontally=false flipVertically=false grayscale=false -imageHeight=2160 -imageWidth=2560 +imageHeight=1628 +imageWidth=1280 invert=false rescaleFactor=1.0 rescaleOffset=0.0 diff --git a/plugins/Cameras.java b/plugins/Cameras.java index 47cea86..7ea2b5a 100644 --- a/plugins/Cameras.java +++ b/plugins/Cameras.java @@ -310,7 +310,8 @@ public class Cameras extends Panel { editor.setTitle(cameraName); EditorDialog dlg = editor.getDialog(getTopLevel(), false); dlg.setSize(480, 640); - showWindow(dlg); + dlg.setVisible(true); + SwingUtils.centerComponent(this, dlg); } } catch(Exception ex){ showException(ex); diff --git a/plugins/LaserGunAlignment.form b/plugins/LaserGunAlignment.form index 2dc2a08..4e2d87a 100644 --- a/plugins/LaserGunAlignment.form +++ b/plugins/LaserGunAlignment.form @@ -21,7 +21,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -88,7 +88,7 @@ - + diff --git a/plugins/LaserGunAlignment.java b/plugins/LaserGunAlignment.java index 6e983a0..3ba1dee 100644 --- a/plugins/LaserGunAlignment.java +++ b/plugins/LaserGunAlignment.java @@ -13,9 +13,12 @@ import ch.psi.pshell.ui.Panel; import ch.psi.pshell.ui.Plugin; import ch.psi.utils.Convert; import ch.psi.utils.State; +import java.awt.Component; +import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.logging.Level; +import javax.swing.JPanel; /** * @@ -32,9 +35,11 @@ public class LaserGunAlignment extends Panel { public void onNewRecord(Scan scan, ScanRecord record) { try { if (running) { - double error_x = 0.2; - double error_y = 0.4; - scanSeries.appendData((Double) record.getValues()[0], (Double) record.getValues()[1], error_x, error_y); + double x = (Double) record.getValues()[0]; + double y = (Double) record.getValues()[1]; + double stdev_x = (Double) record.getValues()[2]; + double stdev_y = (Double) record.getValues()[3]; + scanSeries.appendData(x, y, stdev_x, stdev_y); progressBar.setValue((int) (1000.0 * record.getIndex() / scan.getNumberOfRecords())); } } catch (Exception ex) { @@ -59,6 +64,15 @@ public class LaserGunAlignment extends Panel { if (state != State.Busy) { running = false; } + + for (Component c : panelParameters.getComponents()) { + if (!(c instanceof JPanel)){ + c.setEnabled(state == State.Ready); + } + } + if (state == State.Ready){ + checkBackgroundActionPerformed(null); + } } @Override @@ -75,14 +89,32 @@ public class LaserGunAlignment extends Panel { int index = 1; void onEndScan(ScanResult sr, List hx, List hy) { +System.out.println("In onEndScan"); progressBar.setValue(1000); - //double[] x =(double[]) Convert.toDouble(sr.getReadable(0)); - //double[] y =(double[]) Convert.toDouble(sr.getReadable(1)); double[] x = (double[]) Convert.toDouble(hx); double[] y = (double[]) Convert.toDouble(hy); LinePlotErrorSeries hull = new LinePlotErrorSeries(scanSeries.getName() + "H", scanSeries.getColor()); centroidPlot.addSeries(hull); - hull.setData((double[]) Convert.toDouble(x), (double[]) Convert.toDouble(y)); + hull.setData((double[]) Convert.toDouble(x), (double[]) Convert.toDouble(y)); +System.out.println("Set"); + //Add ELOG entry + if (checkElog.isSelected()) { + String file = Paths.get(getController().getSetup().getContextPath(), "CentroidPlot.jpg").toString(); + try { + Thread.sleep(250); //Some time to plot update + centroidPlot.saveSnapshot(file , "jpg"); + evalAsync("elog('Gun solenoid current scan', gsa_log_msg, ['"+ file +"',])", true).handle((ret, ex) -> { + if (ex != null){ + getLogger().log(Level.WARNING, null, ex); + } else { + getLogger().info("Success generating ELOG entry"); + } + return null; + }); + } catch (Exception ex) { + showException(ex); + } + } } @SuppressWarnings("unchecked") @@ -92,7 +124,7 @@ public class LaserGunAlignment extends Panel { buttonGroupBack = new javax.swing.ButtonGroup(); buttonRun = new javax.swing.JButton(); buttonAbort = new javax.swing.JButton(); - jPanel1 = new javax.swing.JPanel(); + panelParameters = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); spinnerI1 = new javax.swing.JSpinner(); jLabel2 = new javax.swing.JLabel(); @@ -129,7 +161,7 @@ public class LaserGunAlignment extends Panel { } }); - jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Parameters")); + panelParameters.setBorder(javax.swing.BorderFactory.createTitledBorder("Parameters")); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); jLabel1.setText("phi_start"); @@ -185,43 +217,43 @@ public class LaserGunAlignment extends Panel { checkZeroSolenoids.setSelected(true); checkZeroSolenoids.setText("Zero solenoids"); - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() + javax.swing.GroupLayout panelParametersLayout = new javax.swing.GroupLayout(panelParameters); + panelParameters.setLayout(panelParametersLayout); + panelParametersLayout.setHorizontalGroup( + panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelParametersLayout.createSequentialGroup() .addContainerGap() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelParametersLayout.createSequentialGroup() .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spinnerI1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(panelParametersLayout.createSequentialGroup() .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spinnerI2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(panelParametersLayout.createSequentialGroup() .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spinnerStep, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(panelParametersLayout.createSequentialGroup() .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spinnerSettlingTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelParametersLayout.createSequentialGroup() .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spinnerNumBackgrounds, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(panelParametersLayout.createSequentialGroup() .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spinnerNumImages, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(panelParametersLayout.createSequentialGroup() + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(radioBackSimple) .addComponent(checkBackground)) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(panelParametersLayout.createSequentialGroup() .addGap(36, 36, 36) .addComponent(radioBackMultiple)) .addComponent(checkSaveImages) @@ -231,31 +263,31 @@ public class LaserGunAlignment extends Panel { .addContainerGap()) ); - jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerI1, spinnerI2, spinnerNumBackgrounds, spinnerNumImages, spinnerSettlingTime, spinnerStep}); + panelParametersLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerI1, spinnerI2, spinnerNumBackgrounds, spinnerNumImages, spinnerSettlingTime, spinnerStep}); - jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel2, jLabel3, jLabel4, jLabel5, jLabel6}); + panelParametersLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel2, jLabel3, jLabel4, jLabel5, jLabel6}); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() + panelParametersLayout.setVerticalGroup( + panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelParametersLayout.createSequentialGroup() .addGap(18, 18, 18) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(spinnerI1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(spinnerI2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(spinnerStep, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(spinnerSettlingTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(4, 4, 4) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel6) .addComponent(spinnerNumImages, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) @@ -265,7 +297,7 @@ public class LaserGunAlignment extends Panel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(radioBackMultiple) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(panelParametersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel5) .addComponent(spinnerNumBackgrounds, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(57, 57, 57) @@ -295,7 +327,7 @@ public class LaserGunAlignment extends Panel { layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(panelParameters, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -328,7 +360,7 @@ public class LaserGunAlignment extends Panel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(buttonClear) .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(panelParameters, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); }// //GEN-END:initComponents @@ -364,12 +396,13 @@ public class LaserGunAlignment extends Panel { args.put("multiple_background", radioBackMultiple.isSelected()); args.put("zero_solenoids", checkZeroSolenoids.isSelected()); args.put("do_elog", checkElog.isSelected()); - - ((Plugin) this).runAsync("Alignment/Laser_gun_alignment", args).thenAccept((Object t) -> { - List ret = (List) t; - onEndScan((ScanResult) ret.get(0), (List) ret.get(1), (List) ret.get(2)); + + runAsync("Alignment/Laser_gun_alignment", args).thenAccept((Object ret) -> { + List l = (List) ret; + onEndScan((ScanResult) l.get(0), (List) l.get(1), (List) l.get(2)); }); } catch (Exception ex) { + System.err.println(ex); running = false; showException(ex); } @@ -406,7 +439,7 @@ public class LaserGunAlignment extends Panel { private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; - private javax.swing.JPanel jPanel1; + private javax.swing.JPanel panelParameters; private javax.swing.JProgressBar progressBar; private javax.swing.JRadioButton radioBackMultiple; private javax.swing.JRadioButton radioBackSimple; diff --git a/script/Alignment/Gun_solenoid_alignment.py b/script/Alignment/Gun_solenoid_alignment.py index bde6e32..b45b04f 100755 --- a/script/Alignment/Gun_solenoid_alignment.py +++ b/script/Alignment/Gun_solenoid_alignment.py @@ -10,6 +10,8 @@ import datetime +use_bpm = True + if get_context().source == CommandSource.ui: I1 = 95.0 I2 = 100.0 @@ -35,12 +37,15 @@ print "Parameters: ", I1, I2, dI, settling_time, plot_image, number_images, use_ plot_name = datetime.datetime.fromtimestamp(time.time()).strftime('%H%M%S') -latch = True -if get_device("image_stats") is None: - print "Instantiating camtool" - add_device(CamTool("image_stats", prefix = "cam:", latch = latch, camera = "SINEG01-DSCR350"), True) -if (latch): - image_stats.start() +if (use_bpm): + add_device(BpmStats("image_stats", "SINEG01-DBPM340"), True) +else: + latch = True + if get_device("image_stats") is None: + print "Instantiating camtool" + add_device(CamTool("image_stats", prefix = "cam:", latch = latch, camera = "SINEG01-DSCR350"), True) + if (latch): + image_stats.start() #add_device(ImageStats("image_stats", get_simulated_source(image)), True) image_stats.setNumberOfImages(max(number_images,1)) diff --git a/script/Alignment/Laser_gun_alignment.py b/script/Alignment/Laser_gun_alignment.py index 60d099a..2a9a126 100755 --- a/script/Alignment/Laser_gun_alignment.py +++ b/script/Alignment/Laser_gun_alignment.py @@ -102,7 +102,7 @@ else: (hx,hy)= convex_hull(x=r.getReadable(0), y=r.getReadable(1)) hx.append(hx[0]); hy.append(hy[0]) -print "OK" + # save the entry in the logbook gsa_log_msg = "Data file: " + get_context().path gsa_log_msg = gsa_log_msg + "\nImages: " + str(number_images) @@ -111,6 +111,7 @@ gsa_log_msg = gsa_log_msg + "\n\n" + r.print() if do_elog: elog("Gun solenoid current scan", gsa_log_msg , get_plot_snapshots()) +_=[r, hx, hy] set_return([r, hx, hy]) diff --git a/script/BpmStats.py b/script/BpmStats.py index d4b5e2c..73c16f7 100644 --- a/script/BpmStats.py +++ b/script/BpmStats.py @@ -74,7 +74,7 @@ class BpmStats(DeviceBase): if __name__ == "__builtin__": - add_device(BpmStats("bpm_com", "SINEG01-DBPM340")) + add_device(BpmStats("bpm_com", "SINEG01-DBPM340"), True) bpm_com.setNumberOfImages(5) for i in range (10): bpm_com.update() diff --git a/script/test/particle_analysis.py b/script/test/particle_analysis.py index ed5293c..453ecdf 100644 --- a/script/test/particle_analysis.py +++ b/script/test/particle_analysis.py @@ -5,28 +5,24 @@ from ijutils import * import java.awt.Color as Color -ip2 = load_image(image.getImage(), title="Image2") - - show_panel(ip2.getBufferedImage(), "Original") - -#Particle Analysis -ip = grayscale(ip2, in_place = False) +ip2 = load_image("images/img2.png", title="Image2") -show_panel(ip.getBufferedImage(), "GS") -auto_threshold(ip, dark_background=True) + +show_panel(ip2.getBufferedImage(), "Original") + +#Particle Analysis +ip = grayscale(ip2, in_place = False) +auto_threshold(ip) binary_op(ip, "fill_holes") -pn=show_panel(ip.getBufferedImage(), "Binarization") -#pn.setZoom(0.25) -#binary_fill_holes(ip) -#ip.show() -(results,output_img)=analyse_particles(ip, 100,1000, print_table=True) -#output_img.show() - -pn=show_panel(output_img.getBufferedImage(), "Particle Analysis") -#pn.setZoom(0.25) +show_panel(ip.getBufferedImage(), "Binarization") +#binary_fill_holes(ip) +#ip.show() +(results,output_img)=analyse_particles(ip, 100,1000, print_table=True) +#output_img.show() +show_panel(output_img.getBufferedImage(), "Particle Analysis")