Got feedback or spotted a mistake?

Leave a comment at the end of this page or email contact@krishagni.com

Auto Container Allocation

Introduction

Freezers can be set up with different restrictions:

  • What site does it belong to.

  • From which collection protocol specimens can be stored.

  • What types of specimens can be stored.

These restrictions are set while setting up containers like below:



For more details on creating containers, refer to Managing containers.

Using these restrictions, the system can accurately auto allocate storage locations for the specimens. This helps in high throughput banks where you can collect multiple specimens at once and let the system choose the storage locations.

To use auto allocation, the administrator has to choose between the below allocation strategies and set them at the protocol level:

  • Least empty container: the container with the least number of vacant positions that can store the specific specimens in question is chosen first. This helps you to back-fill positions freed up by specimens that are given away.

  • Recently used container: recently used container to store specimens of the same type and same CP are chosen first. 

  • Store aliquots in the same box: makes sure that all aliquots being created at once under a parent are stored under the same box.

To set this at the protocol level-

  • Go to the collection protocol overview page, click on 'Settings'→'Container' and click 'Edit' 

  • Choose the options for auto allocation and click 'Save' 

During specimen collection, containers are auto-allocated based on the settings done. You can reject automatically allocated container positions by clicking 'More' and selecting-

Note: Container auto allocation is enabled at the CP level.

  • Rerun auto allocation: Sometimes, you might want to remove the uncollected specimens. In such cases, 'rerun auto allocation' can be used to re-order positions.  

  • Manual allocation: The container fields would become editable. You can edit containers/positions and assign a new one. 

  • Clear positions: Positions assigned to specimens in a container would be cleared.

  • Clear container names and positions: Clears both auto-allocated containers and positions.

When rerun auto allocation prompted? (v8.0)

Auto Allocation Strategy

Inputs

Auto Allocation Strategy

Inputs

Recently Used Container

Increase aliquot count on below collection page

Recently Used Container

Decrease aliquot count on below collection page

Least Empty Container

Increase aliquot count on below collection page

Least Empty Container

Decrease aliquot count on below collection page

Least Empty Container / Recently Used Container

Change Collection Status to Missed/Not Collected/Pending

Least Empty Container / Recently Used Container

Manually Run auto allocation

Navigate to More—> Rerun Auto Allocation

Furthermore, the system can auto allocate container positions by rules based on specimen properties like quantity, type, requirement code, lineage, etc. This is done via API. Refer to 'Advanced auto allocation' for more details. 

Blocked Container Positions

After the user has set up the auto allocation, the positions are auto-suggested under the 'Container' column in the collection page. If we open the container overview page in another tab, it is visible that the positions are blocked. A horizontal line is shown across the positions that are suggested in auto-allocation, specifying them as locked.

These auto-allocated positions are blocked until the user clicks 'Cancel' or 'Submit' from the collection page. If the positions are not freed up, then wait for 5 minutes till an internal job runs to clean up these positions. From v6.3, onwards we have made sure that the internal job never stops running. If you still see the blue lines, please report to support@krishagni.com

Even if any specimen is canceled from the collection page, these auto-suggested locations continue to be blocked.

To free them and allow OpenSpecimen to suggest more appropriate locations, you need to re-run the auto-allocation from the collection page > Container > More > Rerun auto allocation

Reload the container page. It will show that only the one auto-suggested position is blocked.

In case you are not happy with this auto-allocated position, you can select 'Manual allocation' from the collection page and select any other storage location.

Advanced container auto-allocation

Administrators can configure to auto-allocate containers based on different parameters via JSON workflow. Specimens can be auto-allocated to different storage container types during specimen collection. This can be achieved by setting up criteria in various fields, as listed below.

From V10.3 it's possible to include dimensionless container types for condition-based auto allocation. Refer to wiki page to create dimensionless container type.

Level

Field

Variable to be used

Level

Field

Variable to be used

Visit

Event label

specimen.eventLabel

Specimen

Quantity

specimen.initialQty

Specimen

Type

specimen.type

Specimen

Lineage

specimen.lineage

Specimen

Requirement code

specimen.reqCode

 

 

{ "name": "auto-allocation", "data": { "rules": [ { "criteria": "specimen.eventLabel == 'Visit' && specimen.initialQty == 1 && specimen.type == 'Plasma' && ['EP01', 'LP01'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "specimen.eventLabel == 'Visit' && specimen.initialQty == 1 && specimen.type == 'Plasma' && ['EP02', 'LP02'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10B_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Serum' && ['S02', 'S03', 'S04'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Serum' && ['S18', 'S19'].indexOf(specimen.reqCode) != -1 && visit.site == 'USB Biobank'", "name": "ContainerType", "params": { "name": "-10R_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Plasma' && ['EP14', 'LP15'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10W_Box" } }, { "criteria": "specimen.initialQty == 2.5 && specimen.reqCode=='RNA'", "name": "ContainerType", "params": { "name": "-7Y_Box" } }, { "criteria": "specimen.type == 'Urine (complete)' && specimen.initialQty == 20", "name": "ContainerType", "params": { "name": "-4W_Box" } } } ] }

 

{ "name": "auto-allocation", "view": null, "ctrl": null, "data": { "rules": [ { "criteria": "specimen.initialQty == 1 && specimen.type == 'Plasma' && ['EP21', 'EP20', 'LP21'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "specimen.initialQty == 1 && specimen.type == 'Plasma' && ['EP19', 'LP20'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10B_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Plasma' && ['EP01', 'EP02', 'EP03', 'EP04', 'EP05', 'EP06', 'EP07', 'EP08', 'LP01', 'LP02', 'LP03', 'LP04', 'LP05', 'LP06', 'LP07', 'LP08', 'LP09'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Serum' && ['S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "specimen.initialQty == 1 && specimen.type == 'Serum' && ['S48', 'S49', 'S50', 'S51'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Plasma' && ['EP09', 'EP10', 'EP11', 'EP12', 'EP13', 'LP10', 'LP11', 'LP12', 'LP13', 'LP14'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10R_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Serum' && ['S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10R_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Plasma' && ['EP14', 'EP15', 'EP16', 'EP17', 'EP18', 'LP15', 'LP16', 'LP17', 'LP18', 'LP19'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10W_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Serum' && ['S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10W_Box" } }, { "criteria": "specimen.initialQty == 0.1 && specimen.type == 'Serum' && ['S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44', 'S45', 'S46','S47'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10Y_Box" } }, { "criteria": "specimen.initialQty == 1 && specimen.type == 'Serum' && ['S'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-7B_Box" } }, { "criteria": "specimen.initialQty == 2.5 && specimen.reqCode=='RNA'", "name": "ContainerType", "params": { "name": "-7Y_Box" } }, { "criteria": "specimen.type == 'Urine (complete)' && specimen.initialQty == 20", "name": "ContainerType", "params": { "name": "-4W_Box" } }, { "criteria": "['U02', 'U03', 'U04', 'U05', 'U06'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "['U07', 'U08', 'U09', 'U10', 'U11'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10R_Box" } }, { "criteria": "['U12', 'U13', 'U14', 'U15', 'U16'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10W_Box" } }, { "criteria": "['U17', 'U18', 'U19'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10Y_Box" } }, { "criteria": "['U20'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10B_Box" } }, { "criteria": "['U'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-7B_Box" } }, { "criteria": "['WB1', 'WB2'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-7R_Box" } }, { "criteria": "specimen.type == 'Cell-free (spun) Urine' && ['FU01', 'FU02', 'FU03', 'FU04', 'FU05'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10G_Box" } }, { "criteria": "specimen.type == 'Cell-free (spun) Urine' && ['FU06', 'FU07', 'FU08', 'FU09', 'FU10'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10R_Box" } }, { "criteria": "specimen.type == 'Cell-free (spun) Urine' && ['FU11', 'FU12', 'FU13', 'FU14', 'FU15'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "-10W_Box" } } ] } }

Screenshot: Auto allocation

{ "name" : "auto-allocation", "view" : null, "ctrl" : null, "data" : { "rules" : [ { "criteria": "['PD1','PD2'].indexOf(specimen.reqCode) != -1", "name": "ContainerType", "params": { "name": "Aditi JSON Box" } }, { "criteria": "specimen.type == 'Urine (complete)' && specimen.initialQty == 20", "name": "ContainerType", "params": { "name": "Ahk -20 box" } }, { "criteria": "specimen.type == 'Serum' && specimen.lineage == 'New'", "name": "ContainerType", "params": { "name": "Dimensionless_CT2" } }, { "criteria" : "specimen.biohazards.indexOf('Tuberculosis') != -1", "name" : "ContainerType", "params" : { "name" : "Dimensionless_CT" } } ] } }

Screenshot: Auto allocation

 

 

 

 



Got feedback or spotted a mistake?

Leave a comment at the end of this page or email contact@krishagni.com