SI.PIXL.Client
Search Results for

    Show / Hide Table of Contents

    A Simple Example

    Below is a simple example of an integration of the PIXL client in C# 7.0. This runs the following actions:

    • Connects to the PIXL
    • Aborts any running operation
    • Resets the PIXL
    • Initialises the PIXL
    • Runs the colony detection workflow to detect all of the colonies on a source plate
    • Sorts the detected colonies to find the 3 biggest colonies on the source plate
    • Runs the re-array workflow to pin the 3 biggest colonies from the source plate on to a target plate

    To test this example:

    • Create a new Console Application in Visual Studio, targeting either:
      • .Net Framework 4.6.1 or above
      • .Net Core 2.0 or above
    • Install the SI.PIXL.Client NuGet package
    • Copy and paste the example code over the contents of the Program.cs file
    • Change the IP address and port to match your PIXL
    • Run the program
    using System;
    using System.Linq;
    using SI.PIXL.Client.Enums;
    using SI.PIXL.Client.Structs.CommandResponse;
    using SI.PIXL.Client.Structs.Instructions;
    using SI.PIXL.Client.Structs.PlateHandling;
    
    namespace SI.PIXL.Client.SimpleExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    // create a channel for communication with the PIXL - the IP address and port need to match the PIXL you are connecting to
                    var channel = PIXLClient.GetPIXLChannel("192.168.100.90", 50052);
    
                    // create a new instance of the PIXL class with the specified channel
                    var pixl = new PIXLClient(channel);
    
                    // display the status on the console
                    Console.WriteLine($"Connected to PIXL, operational status is {pixl.OperationalStatus.CommandStatus}.");
    
                    // if running
                    if (pixl.OperationalStatus.CommandStatus == CommandStatus.Running)
                    {
                        // call abort to cancel any pending operation
                        Console.WriteLine("Calling abort...");
                        var abortResult = pixl.Abort();
                        HandleResponse(abortResult);
                    }
    
                    // reset the PIXL
                    Console.WriteLine("Calling reset, this may take a little while...");
                    var resetResult = pixl.Reset().Result;
                    HandleResponse(resetResult);
    
                    // initialise the PIXL now that it has finished resetting
                    Console.WriteLine("Starting initialise...");
                    var initialiseResult = pixl.Initialise().Result;
                    HandleResponse(initialiseResult);
    
                    // create a source plate
                    var sourcePlate = new Plate("Source_Plate_1", PlateTypes.PlusPlate, PlateRoles.Source);
    
                    // TODO: do any actions required to load a source PlusPlate into the PIXLs black bay here. For example a robotic arm would load the plate at this point
    
                    // inform the PIXL the plate has been loaded
                    pixl.PlateLoaded(Bays.Black, sourcePlate.ID, sourcePlate.Type, sourcePlate.Role);
    
                    // use the colony detection workflow to find colonies
                    Console.WriteLine("Running colony detection workflow...");
                    var colonyDetectionResult = pixl.RunColonyDetectionWorkflow("Test project", "Empty").Result;
                    HandleResponse(colonyDetectionResult.Result);
    
                    // display some info on the detected colonies
                    Console.WriteLine($"Detected {colonyDetectionResult.ProgramInformation.ColonyInformation.Length} colonies, all data has been logged at {colonyDetectionResult.TrackingPath}.");
    
                    // select the 3 biggest colonies
                    var biggestColonies = colonyDetectionResult.ProgramInformation.ColonyInformation.OrderBy(x => x.Diameter).Reverse().Take(3).ToArray();
    
                    // create a target plate
                    var targetPlate = new Plate("Target_Plate_1", PlateTypes.PlusPlate_96, PlateRoles.Target);
    
                    // TODO: do any actions required to load a target PlusPlate into the PIXLs red bay here. For example a robotic arm would load the plate at this point
    
                    // inform the PIXL the plate has been loaded
                    pixl.PlateLoaded(Bays.Red, targetPlate.ID, targetPlate.Type, targetPlate.Role);
    
                    // create instructions for pinning the 3 colonies from the source plate to the target plate
                    var pinnings = new[]
                    {
                        new ConsecutivePinningInstruction(new[]
                        {
                            new PinningInstruction(sourcePlate, biggestColonies[0].X, biggestColonies[0].Y),
                            new PinningInstruction(targetPlate, 1, 1)
                        }),
                        new ConsecutivePinningInstruction(new[]
                        {
                            new PinningInstruction(sourcePlate, biggestColonies[1].X, biggestColonies[1].Y),
                            new PinningInstruction(targetPlate, 1, 2)
                        }),
                        new ConsecutivePinningInstruction(new[]
                        {
                            new PinningInstruction(sourcePlate, biggestColonies[2].X, biggestColonies[2].Y),
                            new PinningInstruction(targetPlate, 1, 3)
                        })
                    };
    
                    // use the re-array workflow to pin colonies from the source plate to the target plate
                    Console.WriteLine("Running re-array workflow...");
                    var rearrayResult = pixl.RunRearrayWorkflow("Test project", "Empty", string.Empty, pinnings).Result;
                    HandleResponse(rearrayResult.Result);
    
                    // TODO: do any actions required to remove the plates from the PIXLs black and red bays. For example a robotic arm would remove all plates at this point
    
                    // inform the PIXL the plates have been removed
                    pixl.PlateRemoved(Bays.Black);
                    pixl.PlateRemoved(Bays.Red);
    
                    Console.WriteLine($"Example complete! Pinned {rearrayResult.ProgramInformation.Pinnings.Length} colonies. Press any key to exit.");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// Handle a response from the Api.
            /// </summary>
            /// <param name="response">The response.</param>
            private static void HandleResponse(ApiCommandResponse response)
            {
                // display on console
                Console.WriteLine(response.Message);
    
                // if failed, throw exception
                if (!response.IsSuccess)
                    throw new Exception($"Unexpected result: {response.Code}: {response.Message}");
            }
        }
    }
    
    In this article
    Back to top Singer Instrument Company Limited 2024