Biomek 5: Sample Tracking Discussion

Morning y’all. I am working on implementing sample tracking with our i7 methods since they were originally written without this feature. I don’t love the reports generated by the software at the end of the methods and I also don’t love the using the log files as reports to upload to lab notebooks. I’d love to use this thread as a place for people to learn about various different sample tracking/metadata handling & manipulation using i7 software.

Here are my questions to you all:

  • Does your lab pull sample information through a database or through .csv file?
  • How does your lab handle report generation/Sample tracking within your automation methods?
  • If your group uses a LIMS/LIS (We don’t yet but we are looking at them now), how was the integration process with your methods?

I’ll go first:
Our group pulls sample information through a .csv file uploaded by the user at runtime. For us, this CSV file only contains sample IDs and CT values to determine what master mix to dispense to which well. Currently, we do not have any form of reporting. The sample IDs are in the csv but nothing happens with them, but we want to be able to generate a report to see which master mix was dispensed to each well and any sample transfer re-arrangement should be shown through new plate maps. I am interested in potentially writing my own program and executing it through the “Run Program” step.

1 Like

It sounds like I’m a little further behind you in terms of integration, but I’ve been exploring custom logging to serve this purpose.

I had the same thought about Biomek reports - I generate them to a backup folder but haven’t utilized them to any extent - I just keep them as a “just in case”

You can create custom logging using a script

logFile = "MyLogPath"
msgLogging = "this is my message"
World.Globals.Logger.AddToLog World, logFile, msgLogging

This will create a path in…
C:\Users\Public\Documents\Biomek5\Logs*logFile*

It could be a way to create your own outputs for things like volume added, etc after a bit of formatting. I currently only use it for tracking user entered parameters and instrument decisions.

Other than that, you could use Create Dataset command to add in tracked attributes for liquid transfers (volume/liquid)
image

1 Like

Regarding your question:

  1. You can use both a CSV file and a database. Set the AlphaWell Properties to Labware and create a Data Set Definition for your data if you have a plate barcode or Sample ID.
  2. When the Biomek transfers liquid from Plate X to Plate Y, all the new data will be transferred to the new plate. You then have two options: you can either generate a CSV file report with the desired format and data, or use Dart Tools to import the data into your database.
  3. LIMS/LIS will connect to Dart, and the robot will connect to two SQL databases. When you import the plate barcode containing the sample data, it will retrieve the information from the database. Your LIMS software must be integrated with Dart.

Example of generating a report on the normalization method, including what was transferred and what failed.

Option Explicit

Dim z, i, oFs, oFile, PlateName, FilePath, FileName, FileExtension, sLine, Delimiter
Dim TMP_Well, od_w, rnaconc_w, rnatake_w, addupw_w, addrtreagents_w, wellstatus_w, RNASource_w, DilSource_w,SampleName
Dim Pos(6) ' Declaring the size of the array

' Function to calculate well number
Function WellNumCountingDown(wellNum)
    Dim col, row
    col = ((wellNum-1) \ 8) + 1
    row = (wellNum-1) Mod 8 + 1
    WellNumCountingDown = col + ((row-1) * 12)
End Function

' Set positions
Pos(1) = "P7"
Pos(2) = "P11"
Pos(3) = "P12"
Pos(4) = "P15"
Pos(5) = "P20"
Pos(6) = "P23"
' Set File path and delimiter
FilePath = "X:\qPCR\"
Delimiter = ","

' Start the main loop for each plate
For z = 1 To SamplePlate_Num
    ' Set variables for each plate
    FileName =Eval("BRC" & z)' Constructing filename for each plate
    FileExtension = ".csv"

    ' Initialize the FileSystemObject and file for writing
    Set oFs = CreateObject("Scripting.FileSystemObject")
    Set oFile = oFs.CreateTextFile(FilePath & FileName & FileExtension, True)

    ' Writing CSV header
    sLine = "Well" & Delimiter & "name" & Delimiter & "od" & Delimiter & "rnaconc" & Delimiter & "rnatake" & Delimiter & "addupw" & Delimiter & "addrtreagents" & Delimiter & "wellstatus" & Delimiter & "RNASource" & Delimiter & "DilSource"
    oFile.WriteLine sLine

    ' Process each well
    For i = 1 To 96
        ' The next lines assume the existence of certain methods and properties within your environment.
        ' Make sure to replace "Positions", "Pipettor.Deck.findlabwareposition", and ".Labware.Datasets" with your actual methods for fetching these data.
        addrtreagents_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.addrtreagents(WellNumCountingDown(i))
        If addrtreagents_w <> 0 Then
            ' Access well properties. This part of the code is highly dependent on your environment and objects structure.
            SampleName = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.name(WellNumCountingDown(i))
            TMP_Well = Positions(Pipettor.Deck.findlabwareposition("P9")).Labware.Datasets.AlphaWellNoZero(WellNumCountingDown(i))
            od_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.od(WellNumCountingDown(i))
            rnaconc_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.rnaconc(WellNumCountingDown(i))
            rnatake_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.rnatake(WellNumCountingDown(i))
            addupw_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.addupw(WellNumCountingDown(i))
            wellstatus_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.wellstatus(WellNumCountingDown(i))
            RNASource_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.RNASource(WellNumCountingDown(i))
            DilSource_w = Positions(Pipettor.Deck.findlabwareposition(Pos(z))).Labware.Datasets.DilSource(WellNumCountingDown(i))

            ' Compile the line for this well's data
            sLine = TMP_Well & Delimiter & SampleName & Delimiter & od_w & Delimiter & rnaconc_w & Delimiter & rnatake_w & Delimiter &  addupw_w & Delimiter & addrtreagents_w & Delimiter & wellstatus_w & Delimiter & RNASource_w & Delimiter & DilSource_w
            ' Write the data line to file
            oFile.WriteLine sLine
        End If
    Next ' next well

    oFile.Close ' Close the file for the current plate
Next ' next plate

' Cleanup
Set oFs = Nothing
Set oFile = Nothing

I have an attachment method for cDNA and a report generation file. The user will enter the barcode plate (by scanning) into the UI. The method will then import data from a CSV file where the barcode of the plate matches the CSV file name. The CSV file will be located in a specific folder, for example: FileLoc(i) = "X:\cDNA\" & BRC(i) & ".csv". Every time the user enters a plate name that matches a file name in the folder, the data will be automatically imported from that file.(Static Folder called “cDNA”)

Then, when transferring liquid, any value that fails or has a value of 0 will generate a new file in another Static folder called “qPCR”, excluding the samples that failed.

https://www.mediafire.com/file/4c47fstp5nxq9od/Normalization_Biosorts_Services_Plates.bmf/file

https://www.mediafire.com/file/y13yn8t1qqqjgwe/Import_File.csv/file