[{"data":1,"prerenderedAt":4124},["ShallowReactive",2],{"navigation":3,"/operate/guides/labware/tubes-and-tube-racks":764,"/operate/guides/labware/tubes-and-tube-racks-surround":4119},[4,80,134,343,378,442,544,581,660],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","/get-started","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","/get-started/welcome","01.get-started/00.welcome",{"title":14,"path":15,"stem":16},"How it works","/get-started/how-it-works","01.get-started/01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","/get-started/use-cases","01.get-started/02.use-cases",[22,26,30,34,38],{"title":23,"path":24,"stem":25},"Instrument Control","/get-started/use-cases/low-level-instrument-control","01.get-started/02.use-cases/10.low-level-instrument-control",{"title":27,"path":28,"stem":29},"Multidevice Control","/get-started/use-cases/multidevice-control","01.get-started/02.use-cases/20.multidevice-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","/get-started/use-cases/workflow-orchestration","01.get-started/02.use-cases/30.workflow-orchestration",{"title":35,"path":36,"stem":37},"Custom Apps and LIMS Integration","/get-started/use-cases/custom-apps-lims","01.get-started/02.use-cases/40.custom-apps-lims",{"title":39,"path":40,"stem":41},"Scale and Fleet Management","/get-started/use-cases/scale-and-fleet","01.get-started/02.use-cases/50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","/get-started/why-code","01.get-started/03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","/get-started/setup","01.get-started/20.setup",[52,56,60,64,68,72,76],{"title":53,"path":54,"stem":55},"GroundControl","/get-started/setup/groundcontrol","01.get-started/20.setup/10.groundcontrol",{"title":57,"path":58,"stem":59},"Network requirements","/get-started/setup/network-requirements","01.get-started/20.setup/20.network-requirements",{"title":61,"path":62,"stem":63},"Multi-device Networking","/get-started/setup/multiple-devices","01.get-started/20.setup/30.multiple-devices",{"title":65,"path":66,"stem":67},"Connect to Platform","/get-started/setup/connect-to-platform","01.get-started/20.setup/40.connect-to-platform",{"title":69,"path":70,"stem":71},"Headless install","/get-started/setup/headless-install","01.get-started/20.setup/50.headless-install",{"title":73,"path":74,"stem":75},"Raspberry Pi","/get-started/setup/raspberry-pi","01.get-started/20.setup/55.raspberry-pi",{"title":77,"path":78,"stem":79},"Installation","/get-started/setup/sdk-installation","01.get-started/20.setup/60.sdk-installation",{"title":81,"path":82,"stem":83,"children":84,"page":42},"Integrate","/integrate","02.integrate",[85,89,93,118],{"title":86,"path":87,"stem":88},"What is a connector?","/integrate/what-is-a-connector","02.integrate/00.what-is-a-connector",{"title":90,"path":91,"stem":92},"Calling a Connector","/integrate/control-with-code","02.integrate/05.control-with-code",{"title":94,"path":95,"stem":96,"children":97,"page":42},"Concepts","/integrate/concepts","02.integrate/10.concepts",[98,102,106,110,114],{"title":99,"path":100,"stem":101},"Connector","/integrate/concepts/connector","02.integrate/10.concepts/10.connector",{"title":103,"path":104,"stem":105},"Module","/integrate/concepts/module","02.integrate/10.concepts/20.module",{"title":107,"path":108,"stem":109},"Action","/integrate/concepts/action","02.integrate/10.concepts/30.action",{"title":111,"path":112,"stem":113},"Subscription","/integrate/concepts/subscription","02.integrate/10.concepts/40.subscription",{"title":115,"path":116,"stem":117},"Device","/integrate/concepts/device","02.integrate/10.concepts/50.device",{"title":119,"path":120,"stem":121,"children":122,"page":42},"Use a connector","/integrate/use-a-connector","02.integrate/30.use-a-connector",[123,126,130],{"title":53,"path":124,"stem":125},"/integrate/use-a-connector/groundcontrol","02.integrate/30.use-a-connector/10.groundcontrol",{"title":127,"path":128,"stem":129},"Platform","/integrate/use-a-connector/platform","02.integrate/30.use-a-connector/20.platform",{"title":131,"path":132,"stem":133},"UniteLabs SDK & REST API","/integrate/use-a-connector/python","02.integrate/30.use-a-connector/30.python",{"title":135,"path":136,"stem":137,"children":138,"page":42},"Operate","/operate","03.operate",[139,142,146,186,259],{"title":135,"path":140,"stem":141},"/operate/overview","03.operate/00.overview",{"title":143,"path":144,"stem":145},"Your First Protocol","/operate/your-first-protocol","03.operate/05.your-first-protocol",{"title":94,"path":147,"stem":148,"children":149,"page":42},"/operate/concepts","03.operate/10.concepts",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"Liquid Handling","/operate/concepts/liquid-handling","03.operate/10.concepts/10.liquid-handling",{"title":155,"path":156,"stem":157},"Modules","/operate/concepts/modules","03.operate/10.concepts/20.modules",{"title":159,"path":160,"stem":161},"Deck","/operate/concepts/deck","03.operate/10.concepts/30.deck",{"title":163,"path":164,"stem":165},"Labware","/operate/concepts/labware","03.operate/10.concepts/40.labware",{"title":167,"path":168,"stem":169},"Liquids","/operate/concepts/liquids","03.operate/10.concepts/50.liquids",{"title":171,"path":172,"stem":173},"Liquid Classes","/operate/concepts/liquid-classes","03.operate/10.concepts/60.liquid-classes",{"title":175,"path":176,"stem":177},"Tips and Tip Tracking","/operate/concepts/tips","03.operate/10.concepts/70.tips",{"title":179,"path":180,"stem":181},"Simulation","/operate/concepts/simulation","03.operate/10.concepts/80.simulation",{"title":183,"path":184,"stem":185},"Error Handling","/operate/concepts/error-handling","03.operate/10.concepts/90.error-handling",{"title":187,"path":188,"stem":189,"children":190,"page":42},"Guides","/operate/guides","03.operate/20.guides",[191,220,232,256],{"title":163,"path":192,"stem":193,"children":194},"/operate/guides/labware","03.operate/20.guides/10.labware/index",[195,196,200,204,208,212,216],{"title":163,"path":192,"stem":193},{"title":197,"path":198,"stem":199},"Standard Labware","/operate/guides/labware/standard-labware","03.operate/20.guides/10.labware/05.standard-labware",{"title":201,"path":202,"stem":203},"Plates","/operate/guides/labware/plates","03.operate/20.guides/10.labware/10.plates",{"title":205,"path":206,"stem":207},"Tips and Tip Racks","/operate/guides/labware/tips-and-racks","03.operate/20.guides/10.labware/20.tips-and-racks",{"title":209,"path":210,"stem":211},"Tubes and Tube Racks","/operate/guides/labware/tubes-and-tube-racks","03.operate/20.guides/10.labware/30.tubes-and-tube-racks",{"title":213,"path":214,"stem":215},"Troughs","/operate/guides/labware/troughs","03.operate/20.guides/10.labware/35.troughs",{"title":217,"path":218,"stem":219},"Carriers and Adapters","/operate/guides/labware/carriers-and-adapters","03.operate/20.guides/10.labware/40.carriers-and-adapters",{"title":159,"path":221,"stem":222,"children":223,"page":42},"/operate/guides/deck","03.operate/20.guides/20.deck",[224,228],{"title":225,"path":226,"stem":227},"Building a Deck","/operate/guides/deck/building-a-deck","03.operate/20.guides/20.deck/10.building-a-deck",{"title":229,"path":230,"stem":231},"Save/Load a Deck","/operate/guides/deck/save-load-deck","03.operate/20.guides/20.deck/20.save-load-deck",{"title":233,"path":234,"stem":235,"children":236,"page":42},"Pipetting","/operate/guides/pipetting","03.operate/20.guides/30.pipetting",[237,241,245,249,252],{"title":238,"path":239,"stem":240},"Basic Pipetting","/operate/guides/pipetting/basic-pipetting","03.operate/20.guides/30.pipetting/10.basic-pipetting",{"title":242,"path":243,"stem":244},"Advanced Pipetting","/operate/guides/pipetting/advanced-pipetting","03.operate/20.guides/30.pipetting/20.advanced-pipetting",{"title":246,"path":247,"stem":248},"Tip Handling","/operate/guides/pipetting/tip-handling","03.operate/20.guides/30.pipetting/30.tip-handling",{"title":171,"path":250,"stem":251},"/operate/guides/pipetting/liquid-classes","03.operate/20.guides/30.pipetting/40.liquid-classes",{"title":253,"path":254,"stem":255},"Labware Transport","/operate/guides/pipetting/labware-transport","03.operate/20.guides/30.pipetting/50.labware-transport",{"title":179,"path":257,"stem":258},"/operate/guides/simulation","03.operate/20.guides/40.simulation",{"title":260,"path":261,"stem":262,"children":263,"page":42},"Liquid Handler Guides","/operate/devices","03.operate/30.devices",[264,305,326],{"title":265,"path":266,"stem":267,"children":268,"page":42},"Hamilton STAR","/operate/devices/hamilton-star","03.operate/30.devices/10.hamilton-star",[269,273,277,281,285,289,293,297,301],{"title":270,"path":271,"stem":272},"Positioning & Movement","/operate/devices/hamilton-star/positioning","03.operate/30.devices/10.hamilton-star/10.positioning",{"title":274,"path":275,"stem":276},"Gripper Module","/operate/devices/hamilton-star/core-gripper","03.operate/30.devices/10.hamilton-star/20.core-gripper",{"title":278,"path":279,"stem":280},"iSWAP Module","/operate/devices/hamilton-star/iswap","03.operate/30.devices/10.hamilton-star/30.iswap",{"title":282,"path":283,"stem":284},"Using TADM","/operate/devices/hamilton-star/tadm","03.operate/30.devices/10.hamilton-star/40.tadm",{"title":286,"path":287,"stem":288},"Autoload Module","/operate/devices/hamilton-star/autoload","03.operate/30.devices/10.hamilton-star/50.autoload",{"title":290,"path":291,"stem":292},"Waste Block","/operate/devices/hamilton-star/waste-block","03.operate/30.devices/10.hamilton-star/60.waste-block",{"title":294,"path":295,"stem":296},"Complex Mixing","/operate/devices/hamilton-star/complex-mixing","03.operate/30.devices/10.hamilton-star/66.complex-mixing",{"title":298,"path":299,"stem":300},"Teaching Gripper Paddle Positions","/operate/devices/hamilton-star/gripper-positions","03.operate/30.devices/10.hamilton-star/70.gripper-positions",{"title":302,"path":303,"stem":304},"Training a Custom Deck Position With the iSWAP","/operate/devices/hamilton-star/custom-deck-position","03.operate/30.devices/10.hamilton-star/75.custom-deck-position",{"title":306,"path":307,"stem":308,"children":309,"page":42},"Hamilton Vantage","/operate/devices/hamilton-vantage","03.operate/30.devices/20.hamilton-vantage",[310,314,318,322],{"title":311,"path":312,"stem":313},"Waste Configuration","/operate/devices/hamilton-vantage/waste.configuration","03.operate/30.devices/20.hamilton-vantage/05.waste.configuration",{"title":315,"path":316,"stem":317},"Covers and Lights","/operate/devices/hamilton-vantage/covers-and-lights","03.operate/30.devices/20.hamilton-vantage/10.covers-and-lights",{"title":319,"path":320,"stem":321},"IDL Module","/operate/devices/hamilton-vantage/idl","03.operate/30.devices/20.hamilton-vantage/20.idl",{"title":323,"path":324,"stem":325},"IPG Module","/operate/devices/hamilton-vantage/ipg","03.operate/30.devices/20.hamilton-vantage/30.ipg",{"title":327,"path":328,"stem":329,"children":330,"page":42},"Agilent Bravo","/operate/devices/agilent-bravo","03.operate/30.devices/30.agilent-bravo",[331,334,337,340],{"title":246,"path":332,"stem":333},"/operate/devices/agilent-bravo/tip-handling","03.operate/30.devices/30.agilent-bravo/10.tip-handling",{"title":238,"path":335,"stem":336},"/operate/devices/agilent-bravo/basic-pipetting","03.operate/30.devices/30.agilent-bravo/20.basic-pipetting",{"title":171,"path":338,"stem":339},"/operate/devices/agilent-bravo/liquid-classes","03.operate/30.devices/30.agilent-bravo/25.liquid-classes",{"title":274,"path":341,"stem":342},"/operate/devices/agilent-bravo/using-the-gripper","03.operate/30.devices/30.agilent-bravo/30.using-the-gripper",{"title":344,"path":345,"stem":346,"children":347,"page":42},"Software Development Kit","/software-development-kit","03.software-development-kit",[348],{"title":187,"path":349,"stem":350,"children":351,"page":42},"/software-development-kit/guides","03.software-development-kit/40.guides",[352,362],{"title":306,"path":353,"stem":354,"children":355,"page":42},"/software-development-kit/guides/hamilton-vantage","03.software-development-kit/40.guides/20.hamilton-vantage",[356,359],{"title":323,"path":357,"stem":358},"/software-development-kit/guides/hamilton-vantage/using-the-ipg","03.software-development-kit/40.guides/20.hamilton-vantage/10.using-the-ipg",{"title":319,"path":360,"stem":361},"/software-development-kit/guides/hamilton-vantage/using-the-idl","03.software-development-kit/40.guides/20.hamilton-vantage/20.using-the-idl",{"title":327,"path":363,"stem":364,"children":365,"page":42},"/software-development-kit/guides/agilent-bravo","03.software-development-kit/40.guides/30.agilent-bravo",[366,369,372,375],{"title":246,"path":367,"stem":368},"/software-development-kit/guides/agilent-bravo/tip-handling","03.software-development-kit/40.guides/30.agilent-bravo/10.tip-handling",{"title":238,"path":370,"stem":371},"/software-development-kit/guides/agilent-bravo/basic-pipetting","03.software-development-kit/40.guides/30.agilent-bravo/20.basic-pipetting",{"title":171,"path":373,"stem":374},"/software-development-kit/guides/agilent-bravo/liquid-classes","03.software-development-kit/40.guides/30.agilent-bravo/25.liquid-classes",{"title":274,"path":376,"stem":377},"/software-development-kit/guides/agilent-bravo/using-the-gripper","03.software-development-kit/40.guides/30.agilent-bravo/30.using-the-gripper",{"title":379,"path":380,"stem":381,"children":382,"page":42},"Device Guides","/device-guides","06.device-guides",[383,386,399,416,429],{"title":379,"path":384,"stem":385},"/device-guides/overview","06.device-guides/00.overview",{"title":387,"path":388,"stem":389,"children":390,"page":42},"Incubation","/device-guides/incubation","06.device-guides/20.incubation",[391,395],{"title":392,"path":393,"stem":394},"Inheco ODTC","/device-guides/incubation/inheco-odtc","06.device-guides/20.incubation/10.inheco-odtc",{"title":396,"path":397,"stem":398},"Inheco SCILA","/device-guides/incubation/inheco-scila","06.device-guides/20.incubation/20.inheco-scila",{"title":400,"path":401,"stem":402,"children":403,"page":42},"Heater-Shakers","/device-guides/heater-shakers","06.device-guides/30.heater-shakers",[404,408,412],{"title":405,"path":406,"stem":407},"Inheco Thermoshake","/device-guides/heater-shakers/inheco-thermoshake","06.device-guides/30.heater-shakers/10.inheco-thermoshake",{"title":409,"path":410,"stem":411},"QInstruments Bioshake","/device-guides/heater-shakers/qinstruments-bioshake","06.device-guides/30.heater-shakers/20.qinstruments-bioshake",{"title":413,"path":414,"stem":415},"QInstruments ColdPlate","/device-guides/heater-shakers/qinstruments-coldplate","06.device-guides/30.heater-shakers/30.qinstruments-coldplate",{"title":417,"path":418,"stem":419,"children":420,"page":42},"Readers","/device-guides/readers","06.device-guides/40.readers",[421,425],{"title":422,"path":423,"stem":424},"Biotek Gen5","/device-guides/readers/biotek-gen5","06.device-guides/40.readers/10.biotek-gen5",{"title":426,"path":427,"stem":428},"Biotek Synergy H1","/device-guides/readers/biotek-synergy-h1","06.device-guides/40.readers/20.biotek-synergy-H1",{"title":430,"path":431,"stem":432,"children":433,"page":42},"Tilt & Turn","/device-guides/tilt-and-turn","06.device-guides/50.tilt-and-turn",[434,438],{"title":435,"path":436,"stem":437},"TurnStation","/device-guides/tilt-and-turn/qinstruments-turnstation","06.device-guides/50.tilt-and-turn/10.qinstruments-turnstation",{"title":439,"path":440,"stem":441},"TiltStation","/device-guides/tilt-and-turn/qinstruments-tiltstation","06.device-guides/50.tilt-and-turn/20.qinstruments-tiltstation",{"title":443,"path":444,"stem":445,"children":446,"page":42},"Automate","/automate","07.automate",[447,451,455,459,508],{"title":448,"path":449,"stem":450},"What is a workflow?","/automate/what-is-a-workflow","07.automate/00.what-is-a-workflow",{"title":452,"path":453,"stem":454},"Workflow template","/automate/workflow-template","07.automate/05.workflow-template",{"title":456,"path":457,"stem":458},"Your First Workflow","/automate/your-first-workflow","07.automate/08.your-first-workflow",{"title":94,"pages":460,"path":470,"stem":471,"children":472,"page":42},[461,462,463,464,465,466,467,468,469],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","/automate/concepts","07.automate/10.concepts",[473,477,481,485,489,493,497,501,505],{"title":474,"path":475,"stem":476},"Workflow","/automate/concepts/workflow","07.automate/10.concepts/10.workflow",{"title":478,"path":479,"stem":480},"Phase","/automate/concepts/phase","07.automate/10.concepts/20.phase",{"title":482,"path":483,"stem":484},"Step","/automate/concepts/step","07.automate/10.concepts/30.step",{"title":486,"path":487,"stem":488},"Runs","/automate/concepts/runs","07.automate/10.concepts/40.runs",{"title":490,"path":491,"stem":492},"Input","/automate/concepts/input","07.automate/10.concepts/50.input",{"title":494,"path":495,"stem":496},"Artifacts","/automate/concepts/artifacts","07.automate/10.concepts/60.artifacts",{"title":498,"path":499,"stem":500},"Logs","/automate/concepts/logs","07.automate/10.concepts/70.logs",{"title":502,"path":503,"stem":504},"Human in the Loop","/automate/concepts/human-in-the-loop","07.automate/10.concepts/80.human-in-the-loop",{"title":183,"path":506,"stem":507},"/automate/concepts/error-handling","07.automate/10.concepts/90.error-handling",{"title":187,"path":509,"stem":510,"children":511,"page":42},"/automate/guides","07.automate/25.guides",[512,516,520,524,528,532,536,540],{"title":513,"path":514,"stem":515},"Deploy a workflow","/automate/guides/deploy-a-workflow","07.automate/25.guides/30.deploy-a-workflow",{"title":517,"path":518,"stem":519},"Run a workflow","/automate/guides/run-a-workflow","07.automate/25.guides/35.run-a-workflow",{"title":521,"path":522,"stem":523},"CI/CD for workflows","/automate/guides/cicd-for-workflows","07.automate/25.guides/40.cicd-for-workflows",{"title":525,"path":526,"stem":527},"HITL basics","/automate/guides/basic-hitl","07.automate/25.guides/50.basic-hitl",{"title":529,"path":530,"stem":531},"Typed operator inputs","/automate/guides/typed-operator-inputs","07.automate/25.guides/55.typed-operator-inputs",{"title":533,"path":534,"stem":535},"Error recovery","/automate/guides/basic-error-handling","07.automate/25.guides/60.basic-error-handling",{"title":537,"path":538,"stem":539},"Advanced error handling","/automate/guides/advanced-error-handling","07.automate/25.guides/70.advanced-error-handling",{"title":541,"path":542,"stem":543},"Workflows REST API","/automate/guides/workflows-api","07.automate/25.guides/80.workflows-api",{"title":545,"path":546,"stem":547,"children":548,"page":42},"Observe","/observe","08.observe",[549,553,569],{"title":550,"path":551,"stem":552},"Overview","/observe/overview","08.observe/10.overview",{"title":94,"path":554,"stem":555,"children":556,"page":42},"/observe/concepts","08.observe/20.concepts",[557,561,565],{"title":558,"path":559,"stem":560},"Object Storage","/observe/concepts/storage","08.observe/20.concepts/10.storage",{"title":562,"path":563,"stem":564},"Secrets","/observe/concepts/secrets","08.observe/20.concepts/20.secrets",{"title":566,"path":567,"stem":568},"Data sources","/observe/concepts/data-sources","08.observe/20.concepts/30.data-sources",{"title":187,"path":570,"stem":571,"children":572,"page":42},"/observe/guides","08.observe/30.guides",[573,577],{"title":574,"path":575,"stem":576},"File System Connector","/observe/guides/filesystem-connector","08.observe/30.guides/10.filesystem-connector",{"title":578,"path":579,"stem":580},"Building an ETL","/observe/guides/building-an-etl","08.observe/30.guides/20.building-an-etl",{"title":582,"path":583,"stem":584,"children":585,"page":42},"Technical Reference","/technical-reference","10.technical-reference",[586,590,594,606,617,628,638,649],{"title":587,"path":588,"stem":589},"Introduction","/technical-reference/platform-blueprint","10.technical-reference/00.platform-blueprint",{"title":591,"path":592,"stem":593},"REST API","/technical-reference/rest-api","10.technical-reference/01.rest-api",{"title":53,"path":595,"stem":596,"children":597,"page":42},"/technical-reference/groundcontrol","10.technical-reference/10.groundcontrol",[598,602],{"title":599,"path":600,"stem":601},"Install & Setup","/technical-reference/groundcontrol/install","10.technical-reference/10.groundcontrol/10.install",{"title":603,"path":604,"stem":605},"Changelog","/technical-reference/groundcontrol/changelog","10.technical-reference/10.groundcontrol/20.changelog",{"title":607,"path":608,"stem":609,"children":610,"page":42},"UniteLabs SDK","/technical-reference/python-sdk","10.technical-reference/20.python-sdk",[611,614],{"title":599,"path":612,"stem":613},"/technical-reference/python-sdk/install","10.technical-reference/20.python-sdk/10.install",{"title":603,"path":615,"stem":616},"/technical-reference/python-sdk/changelog","10.technical-reference/20.python-sdk/20.changelog",{"title":618,"path":619,"stem":620,"children":621,"page":42},"Liquid Handling SDK","/technical-reference/python-liquid-handling-sdk","10.technical-reference/30.python-liquid-handling-sdk",[622,625],{"title":599,"path":623,"stem":624},"/technical-reference/python-liquid-handling-sdk/install","10.technical-reference/30.python-liquid-handling-sdk/10.install",{"title":603,"path":626,"stem":627},"/technical-reference/python-liquid-handling-sdk/changelog","10.technical-reference/30.python-liquid-handling-sdk/20.changelog",{"title":163,"path":629,"stem":630,"children":631,"page":42},"/technical-reference/labware","10.technical-reference/40.labware",[632,635],{"title":599,"path":633,"stem":634},"/technical-reference/labware/install","10.technical-reference/40.labware/10.install",{"title":603,"path":636,"stem":637},"/technical-reference/labware/changelog","10.technical-reference/40.labware/20.changelog",{"title":639,"path":640,"stem":641,"children":642,"page":42},"Python Omnibus","/technical-reference/python-omnibus","10.technical-reference/50.python-omnibus",[643,646],{"title":599,"path":644,"stem":645},"/technical-reference/python-omnibus/install","10.technical-reference/50.python-omnibus/10.install",{"title":603,"path":647,"stem":648},"/technical-reference/python-omnibus/changelog","10.technical-reference/50.python-omnibus/20.changelog",{"title":650,"path":651,"stem":652,"children":653,"page":42},"Python CDK","/technical-reference/python-cdk","10.technical-reference/60.python-cdk",[654,657],{"title":599,"path":655,"stem":656},"/technical-reference/python-cdk/install","10.technical-reference/60.python-cdk/10.install",{"title":603,"path":658,"stem":659},"/technical-reference/python-cdk/changelog","10.technical-reference/60.python-cdk/20.changelog",{"title":661,"path":662,"stem":663,"children":664},"Connector Development (CDK)","/connector-development","20.connector-development",[665,667,686,719,727,758],{"title":661,"path":662,"stem":666},"20.connector-development/index",{"title":668,"path":669,"stem":670,"children":671,"page":42},"Getting Started","/connector-development/getting-started","20.connector-development/10.getting-started",[672,675,679,682],{"title":550,"path":673,"stem":674},"/connector-development/getting-started/overview","20.connector-development/10.getting-started/10.overview",{"title":676,"path":677,"stem":678},"What's new","/connector-development/getting-started/whats-new","20.connector-development/10.getting-started/20.whats-new",{"title":77,"path":680,"stem":681},"/connector-development/getting-started/installation","20.connector-development/10.getting-started/30.installation",{"title":683,"path":684,"stem":685},"Contributing","/connector-development/getting-started/contributing","20.connector-development/10.getting-started/40.contributing",{"title":687,"path":688,"stem":689,"children":690,"page":42},"Tutorial","/connector-development/tutorial","20.connector-development/20.tutorial",[691,695,699,703,707,711,715],{"title":692,"path":693,"stem":694},"Walkthrough","/connector-development/tutorial/walkthrough","20.connector-development/20.tutorial/00.walkthrough",{"title":696,"path":697,"stem":698},"SiLA Endpoints","/connector-development/tutorial/sila-endpoints","20.connector-development/20.tutorial/10.sila-endpoints",{"title":700,"path":701,"stem":702},"Data Endpoints","/connector-development/tutorial/data-endpoints","20.connector-development/20.tutorial/20.data-endpoints",{"title":704,"path":705,"stem":706},"Controls","/connector-development/tutorial/controls","20.connector-development/20.tutorial/30.controls",{"title":708,"path":709,"stem":710},"SiLA Data Types","/connector-development/tutorial/data-types","20.connector-development/20.tutorial/40.data-types",{"title":712,"path":713,"stem":714},"Feature","/connector-development/tutorial/connector-structure","20.connector-development/20.tutorial/70.connector-structure",{"title":716,"path":717,"stem":718},"Hardware Communication","/connector-development/tutorial/hardware-communication","20.connector-development/20.tutorial/90.hardware-communication",{"title":94,"path":720,"stem":721,"children":722,"page":42},"/connector-development/concepts","20.connector-development/30.concepts",[723],{"title":724,"path":725,"stem":726},"SiLA","/connector-development/concepts/sila","20.connector-development/30.concepts/sila",{"title":187,"path":728,"stem":729,"children":730,"page":42},"/connector-development/guides","20.connector-development/40.guides",[731,735,739,743,747,750,754],{"title":732,"path":733,"stem":734},"Configuration","/connector-development/guides/configuration","20.connector-development/40.guides/20.configuration",{"title":736,"path":737,"stem":738},"Deployment","/connector-development/guides/deployment","20.connector-development/40.guides/30.deployment",{"title":740,"path":741,"stem":742},"Security","/connector-development/guides/security","20.connector-development/40.guides/40.security",{"title":744,"path":745,"stem":746},"Subscriptions","/connector-development/guides/subscriptions","20.connector-development/40.guides/45.subscriptions",{"title":183,"path":748,"stem":749},"/connector-development/guides/error-handling","20.connector-development/40.guides/50.error-handling",{"title":751,"path":752,"stem":753},"Serial Troubleshooting","/connector-development/guides/serial-troubleshooting","20.connector-development/40.guides/70.serial-troubleshooting",{"title":755,"path":756,"stem":757},"Testing","/connector-development/guides/testing","20.connector-development/40.guides/80.testing",{"title":759,"path":760,"stem":761,"children":762},"References","/connector-development/reference","20.connector-development/50.reference/index",[763],{"title":759,"path":760,"stem":761},{"id":765,"title":209,"body":766,"description":4113,"extension":4114,"links":4115,"meta":4116,"navigation":841,"path":210,"seo":4117,"stem":211,"__hash__":4118},"docs/03.operate/20.guides/10.labware/30.tubes-and-tube-racks.md",{"type":767,"value":768,"toc":4104},"minimark",[769,774,783,795,798,1417,1420,1675,1678,1682,1689,1866,1869,1983,1986,2077,2081,2091,2105,2731,2744,2758,3136,3141,3150,3227,3230,3376,3398,3498,3502,3512,3620,3626,3660,3666,3674,3930,3933,3939,4093,4100],[770,771,773],"h2",{"id":772},"tubes","Tubes",[775,776,777,778,782],"p",{},"Tubes can be defined using the ",[779,780,781],"code",{},"Tube"," base class. A tube has a base dimension equal to the maximum outer diameter in x- and y-direction and the maximum total height.",[775,784,785,786,790,791,794],{},"A fillable tube has a container made up of one or more sections. Sections are defined ",[787,788,789],"strong",{},"top-to-bottom"," — the first section in the list is the uppermost part of the tube, and the last section is the bottom. It is possible to define one or more ",[779,792,793],{},"Hole"," objects to model pipetting channel access points.",[775,796,797],{},"In the example below, a 50 mL conical tube is defined with a cylindrical upper section and a conical frustum at the bottom. A single 9 mm × 9 mm access hole is defined with a depth of 113.65 mm.",[799,800,805],"pre",{"className":801,"code":802,"language":803,"meta":804,"style":804},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import collections.abc\nimport dataclasses\n\nfrom unitelabs.labware import (\n    ConicalFrustum,\n    Container,\n    Cylinder,\n    Hole,\n    Tube,\n    Vector,\n    place,\n)\n\n\n@dataclasses.dataclass\nclass Standard50mLTube(Tube):\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=29.36, y=29.36, z=114.65))\n    container: Container = dataclasses.field(\n        default_factory=lambda: Container(\n            max_volume=50_000,\n            sections=[\n                Cylinder(radius=13.89, height=98.77),           # upper cylindrical section (top)\n                ConicalFrustum(radius_lower=3.6, radius_upper=13.89, height=14.88),  # conical bottom\n            ],\n        )\n    )\n    children: collections.abc.Sequence[Hole] = dataclasses.field(\n        repr=False,\n        default_factory=lambda: [\n            Hole(dimensions=dimensions).copy(location=location)\n            for location, dimensions in place(\n                cols=1, rows=1, item=Vector(x=9, y=9, z=113.65), boundary=Vector(x=29.36, y=29.36, z=114.65)\n            )\n        ],\n    )\n","python","",[779,806,807,828,836,843,862,871,879,887,895,903,911,919,925,930,935,950,969,1042,1064,1081,1094,1103,1136,1175,1181,1187,1193,1232,1241,1255,1287,1309,1400,1406,1412],{"__ignoreMap":804},[808,809,812,816,820,824],"span",{"class":810,"line":811},"line",1,[808,813,815],{"class":814},"s7zQu","import",[808,817,819],{"class":818},"sTEyZ"," collections",[808,821,823],{"class":822},"sMK4o",".",[808,825,827],{"class":826},"swJcz","abc\n",[808,829,831,833],{"class":810,"line":830},2,[808,832,815],{"class":814},[808,834,835],{"class":818}," dataclasses\n",[808,837,839],{"class":810,"line":838},3,[808,840,842],{"emptyLinePlaceholder":841},true,"\n",[808,844,846,849,852,854,857,859],{"class":810,"line":845},4,[808,847,848],{"class":814},"from",[808,850,851],{"class":818}," unitelabs",[808,853,823],{"class":822},[808,855,856],{"class":818},"labware ",[808,858,815],{"class":814},[808,860,861],{"class":822}," (\n",[808,863,865,868],{"class":810,"line":864},5,[808,866,867],{"class":818},"    ConicalFrustum",[808,869,870],{"class":822},",\n",[808,872,874,877],{"class":810,"line":873},6,[808,875,876],{"class":818},"    Container",[808,878,870],{"class":822},[808,880,882,885],{"class":810,"line":881},7,[808,883,884],{"class":818},"    Cylinder",[808,886,870],{"class":822},[808,888,890,893],{"class":810,"line":889},8,[808,891,892],{"class":818},"    Hole",[808,894,870],{"class":822},[808,896,898,901],{"class":810,"line":897},9,[808,899,900],{"class":818},"    Tube",[808,902,870],{"class":822},[808,904,906,909],{"class":810,"line":905},10,[808,907,908],{"class":818},"    Vector",[808,910,870],{"class":822},[808,912,914,917],{"class":810,"line":913},11,[808,915,916],{"class":818},"    place",[808,918,870],{"class":822},[808,920,922],{"class":810,"line":921},12,[808,923,924],{"class":822},")\n",[808,926,928],{"class":810,"line":927},13,[808,929,842],{"emptyLinePlaceholder":841},[808,931,933],{"class":810,"line":932},14,[808,934,842],{"emptyLinePlaceholder":841},[808,936,938,941,945,947],{"class":810,"line":937},15,[808,939,940],{"class":822},"@",[808,942,944],{"class":943},"s2Zo4","dataclasses",[808,946,823],{"class":822},[808,948,949],{"class":943},"dataclass\n",[808,951,953,957,961,964,966],{"class":810,"line":952},16,[808,954,956],{"class":955},"spNyl","class",[808,958,960],{"class":959},"sBMFI"," Standard50mLTube",[808,962,963],{"class":822},"(",[808,965,781],{"class":959},[808,967,968],{"class":822},"):\n",[808,970,972,975,978,981,984,987,989,992,994,998,1000,1003,1005,1008,1010,1013,1015,1019,1022,1025,1027,1029,1031,1034,1036,1039],{"class":810,"line":971},17,[808,973,974],{"class":818},"    dimensions",[808,976,977],{"class":822},":",[808,979,980],{"class":818}," Vector ",[808,982,983],{"class":822},"=",[808,985,986],{"class":818}," dataclasses",[808,988,823],{"class":822},[808,990,991],{"class":943},"field",[808,993,963],{"class":822},[808,995,997],{"class":996},"sHdIc","default_factory",[808,999,983],{"class":822},[808,1001,1002],{"class":955},"lambda",[808,1004,977],{"class":822},[808,1006,1007],{"class":943}," Vector",[808,1009,963],{"class":822},[808,1011,1012],{"class":996},"x",[808,1014,983],{"class":822},[808,1016,1018],{"class":1017},"sbssI","29.36",[808,1020,1021],{"class":822},",",[808,1023,1024],{"class":996}," y",[808,1026,983],{"class":822},[808,1028,1018],{"class":1017},[808,1030,1021],{"class":822},[808,1032,1033],{"class":996}," z",[808,1035,983],{"class":822},[808,1037,1038],{"class":1017},"114.65",[808,1040,1041],{"class":822},"))\n",[808,1043,1045,1048,1050,1053,1055,1057,1059,1061],{"class":810,"line":1044},18,[808,1046,1047],{"class":818},"    container",[808,1049,977],{"class":822},[808,1051,1052],{"class":818}," Container ",[808,1054,983],{"class":822},[808,1056,986],{"class":818},[808,1058,823],{"class":822},[808,1060,991],{"class":943},[808,1062,1063],{"class":822},"(\n",[808,1065,1067,1070,1072,1074,1076,1079],{"class":810,"line":1066},19,[808,1068,1069],{"class":996},"        default_factory",[808,1071,983],{"class":822},[808,1073,1002],{"class":955},[808,1075,977],{"class":822},[808,1077,1078],{"class":943}," Container",[808,1080,1063],{"class":822},[808,1082,1084,1087,1089,1092],{"class":810,"line":1083},20,[808,1085,1086],{"class":996},"            max_volume",[808,1088,983],{"class":822},[808,1090,1091],{"class":1017},"50_000",[808,1093,870],{"class":822},[808,1095,1097,1100],{"class":810,"line":1096},21,[808,1098,1099],{"class":996},"            sections",[808,1101,1102],{"class":822},"=[\n",[808,1104,1106,1109,1111,1114,1116,1119,1121,1124,1126,1129,1132],{"class":810,"line":1105},22,[808,1107,1108],{"class":943},"                Cylinder",[808,1110,963],{"class":822},[808,1112,1113],{"class":996},"radius",[808,1115,983],{"class":822},[808,1117,1118],{"class":1017},"13.89",[808,1120,1021],{"class":822},[808,1122,1123],{"class":996}," height",[808,1125,983],{"class":822},[808,1127,1128],{"class":1017},"98.77",[808,1130,1131],{"class":822},"),",[808,1133,1135],{"class":1134},"sHwdD","           # upper cylindrical section (top)\n",[808,1137,1139,1142,1144,1147,1149,1152,1154,1157,1159,1161,1163,1165,1167,1170,1172],{"class":810,"line":1138},23,[808,1140,1141],{"class":943},"                ConicalFrustum",[808,1143,963],{"class":822},[808,1145,1146],{"class":996},"radius_lower",[808,1148,983],{"class":822},[808,1150,1151],{"class":1017},"3.6",[808,1153,1021],{"class":822},[808,1155,1156],{"class":996}," radius_upper",[808,1158,983],{"class":822},[808,1160,1118],{"class":1017},[808,1162,1021],{"class":822},[808,1164,1123],{"class":996},[808,1166,983],{"class":822},[808,1168,1169],{"class":1017},"14.88",[808,1171,1131],{"class":822},[808,1173,1174],{"class":1134},"  # conical bottom\n",[808,1176,1178],{"class":810,"line":1177},24,[808,1179,1180],{"class":822},"            ],\n",[808,1182,1184],{"class":810,"line":1183},25,[808,1185,1186],{"class":822},"        )\n",[808,1188,1190],{"class":810,"line":1189},26,[808,1191,1192],{"class":822},"    )\n",[808,1194,1196,1199,1201,1203,1205,1208,1210,1213,1216,1218,1221,1224,1226,1228,1230],{"class":810,"line":1195},27,[808,1197,1198],{"class":818},"    children",[808,1200,977],{"class":822},[808,1202,819],{"class":818},[808,1204,823],{"class":822},[808,1206,1207],{"class":826},"abc",[808,1209,823],{"class":822},[808,1211,1212],{"class":826},"Sequence",[808,1214,1215],{"class":822},"[",[808,1217,793],{"class":826},[808,1219,1220],{"class":822},"]",[808,1222,1223],{"class":822}," =",[808,1225,986],{"class":818},[808,1227,823],{"class":822},[808,1229,991],{"class":943},[808,1231,1063],{"class":822},[808,1233,1235,1238],{"class":810,"line":1234},28,[808,1236,1237],{"class":996},"        repr",[808,1239,1240],{"class":822},"=False,\n",[808,1242,1244,1246,1248,1250,1252],{"class":810,"line":1243},29,[808,1245,1069],{"class":996},[808,1247,983],{"class":822},[808,1249,1002],{"class":955},[808,1251,977],{"class":822},[808,1253,1254],{"class":822}," [\n",[808,1256,1258,1261,1263,1266,1268,1270,1273,1276,1278,1281,1283,1285],{"class":810,"line":1257},30,[808,1259,1260],{"class":943},"            Hole",[808,1262,963],{"class":822},[808,1264,1265],{"class":996},"dimensions",[808,1267,983],{"class":822},[808,1269,1265],{"class":943},[808,1271,1272],{"class":822},").",[808,1274,1275],{"class":943},"copy",[808,1277,963],{"class":822},[808,1279,1280],{"class":996},"location",[808,1282,983],{"class":822},[808,1284,1280],{"class":943},[808,1286,924],{"class":822},[808,1288,1290,1293,1296,1298,1301,1304,1307],{"class":810,"line":1289},31,[808,1291,1292],{"class":814},"            for",[808,1294,1295],{"class":943}," location",[808,1297,1021],{"class":822},[808,1299,1300],{"class":943}," dimensions ",[808,1302,1303],{"class":814},"in",[808,1305,1306],{"class":943}," place",[808,1308,1063],{"class":822},[808,1310,1312,1315,1317,1320,1322,1325,1327,1329,1331,1334,1336,1339,1341,1343,1345,1348,1350,1352,1354,1356,1358,1360,1362,1365,1367,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1394,1396,1398],{"class":810,"line":1311},32,[808,1313,1314],{"class":996},"                cols",[808,1316,983],{"class":822},[808,1318,1319],{"class":1017},"1",[808,1321,1021],{"class":822},[808,1323,1324],{"class":996}," rows",[808,1326,983],{"class":822},[808,1328,1319],{"class":1017},[808,1330,1021],{"class":822},[808,1332,1333],{"class":996}," item",[808,1335,983],{"class":822},[808,1337,1338],{"class":943},"Vector",[808,1340,963],{"class":822},[808,1342,1012],{"class":996},[808,1344,983],{"class":822},[808,1346,1347],{"class":1017},"9",[808,1349,1021],{"class":822},[808,1351,1024],{"class":996},[808,1353,983],{"class":822},[808,1355,1347],{"class":1017},[808,1357,1021],{"class":822},[808,1359,1033],{"class":996},[808,1361,983],{"class":822},[808,1363,1364],{"class":1017},"113.65",[808,1366,1131],{"class":822},[808,1368,1369],{"class":996}," boundary",[808,1371,983],{"class":822},[808,1373,1338],{"class":943},[808,1375,963],{"class":822},[808,1377,1012],{"class":996},[808,1379,983],{"class":822},[808,1381,1018],{"class":1017},[808,1383,1021],{"class":822},[808,1385,1024],{"class":996},[808,1387,983],{"class":822},[808,1389,1018],{"class":1017},[808,1391,1021],{"class":822},[808,1393,1033],{"class":996},[808,1395,983],{"class":822},[808,1397,1038],{"class":1017},[808,1399,924],{"class":822},[808,1401,1403],{"class":810,"line":1402},33,[808,1404,1405],{"class":822},"            )\n",[808,1407,1409],{"class":810,"line":1408},34,[808,1410,1411],{"class":822},"        ],\n",[808,1413,1415],{"class":810,"line":1414},35,[808,1416,1192],{"class":822},[775,1418,1419],{},"A simpler tube can be defined by omitting explicit container sections — in this case the container geometry is automatically derived from the tube's dimensions and shape:",[799,1421,1423],{"className":801,"code":1422,"language":803,"meta":804,"style":804},"import dataclasses\n\nfrom unitelabs.labware import Tube, Vector\nfrom unitelabs.labware.liquids import Container\n\n\n@dataclasses.dataclass\nclass SimpleTube15mL(Tube):\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=17, y=17, z=120))\n    container: Container = dataclasses.field(default_factory=Container)\n\n# The above would be identical to:\n@dataclasses.dataclass\nclass SimpleTube15mL(Tube):\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=17, y=17, z=120))\n",[779,1424,1425,1431,1435,1455,1476,1480,1484,1494,1507,1563,1590,1594,1599,1609,1621],{"__ignoreMap":804},[808,1426,1427,1429],{"class":810,"line":811},[808,1428,815],{"class":814},[808,1430,835],{"class":818},[808,1432,1433],{"class":810,"line":830},[808,1434,842],{"emptyLinePlaceholder":841},[808,1436,1437,1439,1441,1443,1445,1447,1450,1452],{"class":810,"line":838},[808,1438,848],{"class":814},[808,1440,851],{"class":818},[808,1442,823],{"class":822},[808,1444,856],{"class":818},[808,1446,815],{"class":814},[808,1448,1449],{"class":818}," Tube",[808,1451,1021],{"class":822},[808,1453,1454],{"class":818}," Vector\n",[808,1456,1457,1459,1461,1463,1466,1468,1471,1473],{"class":810,"line":845},[808,1458,848],{"class":814},[808,1460,851],{"class":818},[808,1462,823],{"class":822},[808,1464,1465],{"class":818},"labware",[808,1467,823],{"class":822},[808,1469,1470],{"class":818},"liquids ",[808,1472,815],{"class":814},[808,1474,1475],{"class":818}," Container\n",[808,1477,1478],{"class":810,"line":864},[808,1479,842],{"emptyLinePlaceholder":841},[808,1481,1482],{"class":810,"line":873},[808,1483,842],{"emptyLinePlaceholder":841},[808,1485,1486,1488,1490,1492],{"class":810,"line":881},[808,1487,940],{"class":822},[808,1489,944],{"class":943},[808,1491,823],{"class":822},[808,1493,949],{"class":943},[808,1495,1496,1498,1501,1503,1505],{"class":810,"line":889},[808,1497,956],{"class":955},[808,1499,1500],{"class":959}," SimpleTube15mL",[808,1502,963],{"class":822},[808,1504,781],{"class":959},[808,1506,968],{"class":822},[808,1508,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1544,1546,1548,1550,1552,1554,1556,1558,1561],{"class":810,"line":897},[808,1510,974],{"class":818},[808,1512,977],{"class":822},[808,1514,980],{"class":818},[808,1516,983],{"class":822},[808,1518,986],{"class":818},[808,1520,823],{"class":822},[808,1522,991],{"class":943},[808,1524,963],{"class":822},[808,1526,997],{"class":996},[808,1528,983],{"class":822},[808,1530,1002],{"class":955},[808,1532,977],{"class":822},[808,1534,1007],{"class":943},[808,1536,963],{"class":822},[808,1538,1012],{"class":996},[808,1540,983],{"class":822},[808,1542,1543],{"class":1017},"17",[808,1545,1021],{"class":822},[808,1547,1024],{"class":996},[808,1549,983],{"class":822},[808,1551,1543],{"class":1017},[808,1553,1021],{"class":822},[808,1555,1033],{"class":996},[808,1557,983],{"class":822},[808,1559,1560],{"class":1017},"120",[808,1562,1041],{"class":822},[808,1564,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1588],{"class":810,"line":905},[808,1566,1047],{"class":818},[808,1568,977],{"class":822},[808,1570,1052],{"class":818},[808,1572,983],{"class":822},[808,1574,986],{"class":818},[808,1576,823],{"class":822},[808,1578,991],{"class":943},[808,1580,963],{"class":822},[808,1582,997],{"class":996},[808,1584,983],{"class":822},[808,1586,1587],{"class":943},"Container",[808,1589,924],{"class":822},[808,1591,1592],{"class":810,"line":913},[808,1593,842],{"emptyLinePlaceholder":841},[808,1595,1596],{"class":810,"line":921},[808,1597,1598],{"class":1134},"# The above would be identical to:\n",[808,1600,1601,1603,1605,1607],{"class":810,"line":927},[808,1602,940],{"class":822},[808,1604,944],{"class":943},[808,1606,823],{"class":822},[808,1608,949],{"class":943},[808,1610,1611,1613,1615,1617,1619],{"class":810,"line":932},[808,1612,956],{"class":955},[808,1614,1500],{"class":959},[808,1616,963],{"class":822},[808,1618,781],{"class":959},[808,1620,968],{"class":822},[808,1622,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673],{"class":810,"line":937},[808,1624,974],{"class":818},[808,1626,977],{"class":822},[808,1628,980],{"class":818},[808,1630,983],{"class":822},[808,1632,986],{"class":818},[808,1634,823],{"class":822},[808,1636,991],{"class":943},[808,1638,963],{"class":822},[808,1640,997],{"class":996},[808,1642,983],{"class":822},[808,1644,1002],{"class":955},[808,1646,977],{"class":822},[808,1648,1007],{"class":943},[808,1650,963],{"class":822},[808,1652,1012],{"class":996},[808,1654,983],{"class":822},[808,1656,1543],{"class":1017},[808,1658,1021],{"class":822},[808,1660,1024],{"class":996},[808,1662,983],{"class":822},[808,1664,1543],{"class":1017},[808,1666,1021],{"class":822},[808,1668,1033],{"class":996},[808,1670,983],{"class":822},[808,1672,1560],{"class":1017},[808,1674,1041],{"class":822},[775,1676,1677],{},"Here the container sections, height, and maximum volume are computed automatically from dimensions during initialization.",[770,1679,1681],{"id":1680},"tube-caps","Tube Caps",[775,1683,1684,1685,1688],{},"Tubes can have caps which are ",[779,1686,1687],{},"Cap"," objects placed on top of the tube:",[799,1690,1692],{"className":801,"code":1691,"language":803,"meta":804,"style":804},"from unitelabs.labware.tubes import Cap\nfrom unitelabs.labware.math import Decimal\n\n# Add a cap with custom dimensions\n@dataclasses.dataclass\nclass CustomCap(Cap):\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=8, y=8, z=8))\n    fitting_depth: Decimal = dataclasses.field(default=Decimal(\"5\"))  # 5mm overlap into tube\n",[779,1693,1694,1714,1734,1738,1743,1753,1766,1821],{"__ignoreMap":804},[808,1695,1696,1698,1700,1702,1704,1706,1709,1711],{"class":810,"line":811},[808,1697,848],{"class":814},[808,1699,851],{"class":818},[808,1701,823],{"class":822},[808,1703,1465],{"class":818},[808,1705,823],{"class":822},[808,1707,1708],{"class":818},"tubes ",[808,1710,815],{"class":814},[808,1712,1713],{"class":818}," Cap\n",[808,1715,1716,1718,1720,1722,1724,1726,1729,1731],{"class":810,"line":830},[808,1717,848],{"class":814},[808,1719,851],{"class":818},[808,1721,823],{"class":822},[808,1723,1465],{"class":818},[808,1725,823],{"class":822},[808,1727,1728],{"class":818},"math ",[808,1730,815],{"class":814},[808,1732,1733],{"class":818}," Decimal\n",[808,1735,1736],{"class":810,"line":838},[808,1737,842],{"emptyLinePlaceholder":841},[808,1739,1740],{"class":810,"line":845},[808,1741,1742],{"class":1134},"# Add a cap with custom dimensions\n",[808,1744,1745,1747,1749,1751],{"class":810,"line":864},[808,1746,940],{"class":822},[808,1748,944],{"class":943},[808,1750,823],{"class":822},[808,1752,949],{"class":943},[808,1754,1755,1757,1760,1762,1764],{"class":810,"line":873},[808,1756,956],{"class":955},[808,1758,1759],{"class":959}," CustomCap",[808,1761,963],{"class":822},[808,1763,1687],{"class":959},[808,1765,968],{"class":822},[808,1767,1768,1770,1772,1774,1776,1778,1780,1782,1784,1786,1788,1790,1792,1794,1796,1798,1800,1803,1805,1807,1809,1811,1813,1815,1817,1819],{"class":810,"line":881},[808,1769,974],{"class":818},[808,1771,977],{"class":822},[808,1773,980],{"class":818},[808,1775,983],{"class":822},[808,1777,986],{"class":818},[808,1779,823],{"class":822},[808,1781,991],{"class":943},[808,1783,963],{"class":822},[808,1785,997],{"class":996},[808,1787,983],{"class":822},[808,1789,1002],{"class":955},[808,1791,977],{"class":822},[808,1793,1007],{"class":943},[808,1795,963],{"class":822},[808,1797,1012],{"class":996},[808,1799,983],{"class":822},[808,1801,1802],{"class":1017},"8",[808,1804,1021],{"class":822},[808,1806,1024],{"class":996},[808,1808,983],{"class":822},[808,1810,1802],{"class":1017},[808,1812,1021],{"class":822},[808,1814,1033],{"class":996},[808,1816,983],{"class":822},[808,1818,1802],{"class":1017},[808,1820,1041],{"class":822},[808,1822,1823,1826,1828,1831,1833,1835,1837,1839,1841,1844,1846,1849,1851,1854,1858,1860,1863],{"class":810,"line":889},[808,1824,1825],{"class":818},"    fitting_depth",[808,1827,977],{"class":822},[808,1829,1830],{"class":818}," Decimal ",[808,1832,983],{"class":822},[808,1834,986],{"class":818},[808,1836,823],{"class":822},[808,1838,991],{"class":943},[808,1840,963],{"class":822},[808,1842,1843],{"class":996},"default",[808,1845,983],{"class":822},[808,1847,1848],{"class":943},"Decimal",[808,1850,963],{"class":822},[808,1852,1853],{"class":822},"\"",[808,1855,1857],{"class":1856},"sfazB","5",[808,1859,1853],{"class":822},[808,1861,1862],{"class":822},"))",[808,1864,1865],{"class":1134},"  # 5mm overlap into tube\n",[775,1867,1868],{},"One can assign a cap to a tube in the following ways:",[799,1870,1872],{"className":801,"code":1871,"language":803,"meta":804,"style":804},"# Initialize a lid with a cap directly (always defaults to None)\ntube = Tube(lid=CustomCap())\n\n# Or assign a cap to a tube's lid attribute\ntube.lid = CustomCap(fitting_depth=Decimal(\"5\"))\n\n# Or use tube.close() to assign a cap to a tube\ntube.close(CustomCap(fitting_depth=Decimal(\"5\")))\n",[779,1873,1874,1879,1901,1905,1910,1942,1946,1951],{"__ignoreMap":804},[808,1875,1876],{"class":810,"line":811},[808,1877,1878],{"class":1134},"# Initialize a lid with a cap directly (always defaults to None)\n",[808,1880,1881,1884,1886,1888,1890,1893,1895,1898],{"class":810,"line":830},[808,1882,1883],{"class":818},"tube ",[808,1885,983],{"class":822},[808,1887,1449],{"class":943},[808,1889,963],{"class":822},[808,1891,1892],{"class":996},"lid",[808,1894,983],{"class":822},[808,1896,1897],{"class":943},"CustomCap",[808,1899,1900],{"class":822},"())\n",[808,1902,1903],{"class":810,"line":838},[808,1904,842],{"emptyLinePlaceholder":841},[808,1906,1907],{"class":810,"line":845},[808,1908,1909],{"class":1134},"# Or assign a cap to a tube's lid attribute\n",[808,1911,1912,1915,1917,1919,1921,1923,1925,1928,1930,1932,1934,1936,1938,1940],{"class":810,"line":864},[808,1913,1914],{"class":818},"tube",[808,1916,823],{"class":822},[808,1918,1892],{"class":826},[808,1920,1223],{"class":822},[808,1922,1759],{"class":943},[808,1924,963],{"class":822},[808,1926,1927],{"class":996},"fitting_depth",[808,1929,983],{"class":822},[808,1931,1848],{"class":943},[808,1933,963],{"class":822},[808,1935,1853],{"class":822},[808,1937,1857],{"class":1856},[808,1939,1853],{"class":822},[808,1941,1041],{"class":822},[808,1943,1944],{"class":810,"line":873},[808,1945,842],{"emptyLinePlaceholder":841},[808,1947,1948],{"class":810,"line":881},[808,1949,1950],{"class":1134},"# Or use tube.close() to assign a cap to a tube\n",[808,1952,1953,1955,1957,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1980],{"class":810,"line":889},[808,1954,1914],{"class":818},[808,1956,823],{"class":822},[808,1958,1959],{"class":943},"close",[808,1961,963],{"class":822},[808,1963,1897],{"class":943},[808,1965,963],{"class":822},[808,1967,1927],{"class":996},[808,1969,983],{"class":822},[808,1971,1848],{"class":943},[808,1973,963],{"class":822},[808,1975,1853],{"class":822},[808,1977,1857],{"class":1856},[808,1979,1853],{"class":822},[808,1981,1982],{"class":822},")))\n",[775,1984,1985],{},"One can manage and reassign caps on tubes in the following ways:",[799,1987,1989],{"className":801,"code":1988,"language":803,"meta":804,"style":804},"# Remove the cap from the tube and return it\ncap = tube.open()\n\n# Place a cap back onto the tube\ntube.close(cap)\n\n# Move a cap from one tube to another\ntube.reassign(to=tube2, lid=cap)\n",[779,1990,1991,1996,2014,2018,2023,2038,2042,2047],{"__ignoreMap":804},[808,1992,1993],{"class":810,"line":811},[808,1994,1995],{"class":1134},"# Remove the cap from the tube and return it\n",[808,1997,1998,2001,2003,2006,2008,2011],{"class":810,"line":830},[808,1999,2000],{"class":818},"cap ",[808,2002,983],{"class":822},[808,2004,2005],{"class":818}," tube",[808,2007,823],{"class":822},[808,2009,2010],{"class":943},"open",[808,2012,2013],{"class":822},"()\n",[808,2015,2016],{"class":810,"line":838},[808,2017,842],{"emptyLinePlaceholder":841},[808,2019,2020],{"class":810,"line":845},[808,2021,2022],{"class":1134},"# Place a cap back onto the tube\n",[808,2024,2025,2027,2029,2031,2033,2036],{"class":810,"line":864},[808,2026,1914],{"class":818},[808,2028,823],{"class":822},[808,2030,1959],{"class":943},[808,2032,963],{"class":822},[808,2034,2035],{"class":943},"cap",[808,2037,924],{"class":822},[808,2039,2040],{"class":810,"line":873},[808,2041,842],{"emptyLinePlaceholder":841},[808,2043,2044],{"class":810,"line":881},[808,2045,2046],{"class":1134},"# Move a cap from one tube to another\n",[808,2048,2049,2051,2053,2056,2058,2061,2063,2066,2068,2071,2073,2075],{"class":810,"line":889},[808,2050,1914],{"class":818},[808,2052,823],{"class":822},[808,2054,2055],{"class":943},"reassign",[808,2057,963],{"class":822},[808,2059,2060],{"class":996},"to",[808,2062,983],{"class":822},[808,2064,2065],{"class":943},"tube2",[808,2067,1021],{"class":822},[808,2069,2070],{"class":996}," lid",[808,2072,983],{"class":822},[808,2074,2035],{"class":943},[808,2076,924],{"class":822},[770,2078,2080],{"id":2079},"tube-racks","Tube Racks",[775,2082,2083,2086,2087,2090],{},[779,2084,2085],{},"TubeRack","s consist of a grid of ",[779,2088,2089],{},"TubeSpot","s arranged into rows and columns. These spots can either contain tubes or be empty.",[775,2092,2093,2094,2096,2097,2100,2101,2104],{},"For non-standard grid sizes, create a subclass inheriting from ",[779,2095,2085],{},". The base class defaults to a 6x4 grid (24 tubes), but you can specify any ",[779,2098,2099],{},"cols"," and ",[779,2102,2103],{},"rows"," configuration:",[799,2106,2108],{"className":801,"code":2107,"language":803,"meta":804,"style":804},"import dataclasses\nimport decimal\nimport collections.abc\n\nfrom unitelabs.labware import TubeRack, Tube, TubeSpot, Vector\nfrom unitelabs.labware.liquids import Container\nfrom unitelabs.labware.math import place\n\n\n@dataclasses.dataclass\nclass CustomTubeRack(TubeRack):\n    \"\"\"A 6x4 tube rack for 15 mL conical tubes.\"\"\"\n\n    cols: int = 6\n    rows: int = 4\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=120, y=80, z=30))\n    fitting_depth: decimal.Decimal = dataclasses.field(default_factory=lambda: decimal.Decimal(\"25\"))\n\n    # Define tube spot positions using `place`\n    children: collections.abc.Sequence[TubeSpot] = dataclasses.field(\n        repr=False,\n        default_factory=lambda: [\n            TubeSpot().copy(location=loc)\n            for loc in place(\n                cols=6,\n                rows=4,\n                item=Vector(x=10, y=10),      # tube footprint\n                boundary=Vector(x=120, y=80),  # rack footprint\n            )\n        ],\n    )\n\n\n@dataclasses.dataclass\nclass Tube15mL(Tube):\n    \"\"\"15 mL conical tube.\"\"\"\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=17, y=17, z=120))\n    container: Container = dataclasses.field(default_factory=Container)\n\n\n# Create and fill the rack\nrack = CustomTubeRack(filled_with=Tube15mL)\n",[779,2109,2110,2116,2123,2133,2137,2165,2183,2202,2206,2210,2220,2233,2244,2248,2263,2277,2333,2381,2385,2390,2422,2428,2440,2461,2474,2485,2497,2528,2558,2562,2566,2570,2574,2578,2588,2601,2611,2666,2693,2698,2703,2709],{"__ignoreMap":804},[808,2111,2112,2114],{"class":810,"line":811},[808,2113,815],{"class":814},[808,2115,835],{"class":818},[808,2117,2118,2120],{"class":810,"line":830},[808,2119,815],{"class":814},[808,2121,2122],{"class":818}," decimal\n",[808,2124,2125,2127,2129,2131],{"class":810,"line":838},[808,2126,815],{"class":814},[808,2128,819],{"class":818},[808,2130,823],{"class":822},[808,2132,827],{"class":826},[808,2134,2135],{"class":810,"line":845},[808,2136,842],{"emptyLinePlaceholder":841},[808,2138,2139,2141,2143,2145,2147,2149,2152,2154,2156,2158,2161,2163],{"class":810,"line":864},[808,2140,848],{"class":814},[808,2142,851],{"class":818},[808,2144,823],{"class":822},[808,2146,856],{"class":818},[808,2148,815],{"class":814},[808,2150,2151],{"class":818}," TubeRack",[808,2153,1021],{"class":822},[808,2155,1449],{"class":818},[808,2157,1021],{"class":822},[808,2159,2160],{"class":818}," TubeSpot",[808,2162,1021],{"class":822},[808,2164,1454],{"class":818},[808,2166,2167,2169,2171,2173,2175,2177,2179,2181],{"class":810,"line":873},[808,2168,848],{"class":814},[808,2170,851],{"class":818},[808,2172,823],{"class":822},[808,2174,1465],{"class":818},[808,2176,823],{"class":822},[808,2178,1470],{"class":818},[808,2180,815],{"class":814},[808,2182,1475],{"class":818},[808,2184,2185,2187,2189,2191,2193,2195,2197,2199],{"class":810,"line":881},[808,2186,848],{"class":814},[808,2188,851],{"class":818},[808,2190,823],{"class":822},[808,2192,1465],{"class":818},[808,2194,823],{"class":822},[808,2196,1728],{"class":818},[808,2198,815],{"class":814},[808,2200,2201],{"class":818}," place\n",[808,2203,2204],{"class":810,"line":889},[808,2205,842],{"emptyLinePlaceholder":841},[808,2207,2208],{"class":810,"line":897},[808,2209,842],{"emptyLinePlaceholder":841},[808,2211,2212,2214,2216,2218],{"class":810,"line":905},[808,2213,940],{"class":822},[808,2215,944],{"class":943},[808,2217,823],{"class":822},[808,2219,949],{"class":943},[808,2221,2222,2224,2227,2229,2231],{"class":810,"line":913},[808,2223,956],{"class":955},[808,2225,2226],{"class":959}," CustomTubeRack",[808,2228,963],{"class":822},[808,2230,2085],{"class":959},[808,2232,968],{"class":822},[808,2234,2235,2238,2241],{"class":810,"line":921},[808,2236,2237],{"class":814},"    \"\"\"",[808,2239,2240],{"class":1134},"A 6x4 tube rack for 15 mL conical tubes.",[808,2242,2243],{"class":814},"\"\"\"\n",[808,2245,2246],{"class":810,"line":927},[808,2247,842],{"emptyLinePlaceholder":841},[808,2249,2250,2253,2255,2258,2260],{"class":810,"line":932},[808,2251,2252],{"class":818},"    cols",[808,2254,977],{"class":822},[808,2256,2257],{"class":959}," int",[808,2259,1223],{"class":822},[808,2261,2262],{"class":1017}," 6\n",[808,2264,2265,2268,2270,2272,2274],{"class":810,"line":937},[808,2266,2267],{"class":818},"    rows",[808,2269,977],{"class":822},[808,2271,2257],{"class":959},[808,2273,1223],{"class":822},[808,2275,2276],{"class":1017}," 4\n",[808,2278,2279,2281,2283,2285,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2322,2324,2326,2328,2331],{"class":810,"line":952},[808,2280,974],{"class":818},[808,2282,977],{"class":822},[808,2284,980],{"class":818},[808,2286,983],{"class":822},[808,2288,986],{"class":818},[808,2290,823],{"class":822},[808,2292,991],{"class":943},[808,2294,963],{"class":822},[808,2296,997],{"class":996},[808,2298,983],{"class":822},[808,2300,1002],{"class":955},[808,2302,977],{"class":822},[808,2304,1007],{"class":943},[808,2306,963],{"class":822},[808,2308,1012],{"class":996},[808,2310,983],{"class":822},[808,2312,1560],{"class":1017},[808,2314,1021],{"class":822},[808,2316,1024],{"class":996},[808,2318,983],{"class":822},[808,2320,2321],{"class":1017},"80",[808,2323,1021],{"class":822},[808,2325,1033],{"class":996},[808,2327,983],{"class":822},[808,2329,2330],{"class":1017},"30",[808,2332,1041],{"class":822},[808,2334,2335,2337,2339,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2377,2379],{"class":810,"line":971},[808,2336,1825],{"class":818},[808,2338,977],{"class":822},[808,2340,2341],{"class":818}," decimal",[808,2343,823],{"class":822},[808,2345,1848],{"class":826},[808,2347,1223],{"class":822},[808,2349,986],{"class":818},[808,2351,823],{"class":822},[808,2353,991],{"class":943},[808,2355,963],{"class":822},[808,2357,997],{"class":996},[808,2359,983],{"class":822},[808,2361,1002],{"class":955},[808,2363,977],{"class":822},[808,2365,2341],{"class":943},[808,2367,823],{"class":822},[808,2369,1848],{"class":943},[808,2371,963],{"class":822},[808,2373,1853],{"class":822},[808,2375,2376],{"class":1856},"25",[808,2378,1853],{"class":822},[808,2380,1041],{"class":822},[808,2382,2383],{"class":810,"line":1044},[808,2384,842],{"emptyLinePlaceholder":841},[808,2386,2387],{"class":810,"line":1066},[808,2388,2389],{"class":1134},"    # Define tube spot positions using `place`\n",[808,2391,2392,2394,2396,2398,2400,2402,2404,2406,2408,2410,2412,2414,2416,2418,2420],{"class":810,"line":1083},[808,2393,1198],{"class":818},[808,2395,977],{"class":822},[808,2397,819],{"class":818},[808,2399,823],{"class":822},[808,2401,1207],{"class":826},[808,2403,823],{"class":822},[808,2405,1212],{"class":826},[808,2407,1215],{"class":822},[808,2409,2089],{"class":826},[808,2411,1220],{"class":822},[808,2413,1223],{"class":822},[808,2415,986],{"class":818},[808,2417,823],{"class":822},[808,2419,991],{"class":943},[808,2421,1063],{"class":822},[808,2423,2424,2426],{"class":810,"line":1096},[808,2425,1237],{"class":996},[808,2427,1240],{"class":822},[808,2429,2430,2432,2434,2436,2438],{"class":810,"line":1105},[808,2431,1069],{"class":996},[808,2433,983],{"class":822},[808,2435,1002],{"class":955},[808,2437,977],{"class":822},[808,2439,1254],{"class":822},[808,2441,2442,2445,2448,2450,2452,2454,2456,2459],{"class":810,"line":1138},[808,2443,2444],{"class":943},"            TubeSpot",[808,2446,2447],{"class":822},"().",[808,2449,1275],{"class":943},[808,2451,963],{"class":822},[808,2453,1280],{"class":996},[808,2455,983],{"class":822},[808,2457,2458],{"class":943},"loc",[808,2460,924],{"class":822},[808,2462,2463,2465,2468,2470,2472],{"class":810,"line":1177},[808,2464,1292],{"class":814},[808,2466,2467],{"class":943}," loc ",[808,2469,1303],{"class":814},[808,2471,1306],{"class":943},[808,2473,1063],{"class":822},[808,2475,2476,2478,2480,2483],{"class":810,"line":1183},[808,2477,1314],{"class":996},[808,2479,983],{"class":822},[808,2481,2482],{"class":1017},"6",[808,2484,870],{"class":822},[808,2486,2487,2490,2492,2495],{"class":810,"line":1189},[808,2488,2489],{"class":996},"                rows",[808,2491,983],{"class":822},[808,2493,2494],{"class":1017},"4",[808,2496,870],{"class":822},[808,2498,2499,2502,2504,2506,2508,2510,2512,2515,2517,2519,2521,2523,2525],{"class":810,"line":1195},[808,2500,2501],{"class":996},"                item",[808,2503,983],{"class":822},[808,2505,1338],{"class":943},[808,2507,963],{"class":822},[808,2509,1012],{"class":996},[808,2511,983],{"class":822},[808,2513,2514],{"class":1017},"10",[808,2516,1021],{"class":822},[808,2518,1024],{"class":996},[808,2520,983],{"class":822},[808,2522,2514],{"class":1017},[808,2524,1131],{"class":822},[808,2526,2527],{"class":1134},"      # tube footprint\n",[808,2529,2530,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555],{"class":810,"line":1234},[808,2531,2532],{"class":996},"                boundary",[808,2534,983],{"class":822},[808,2536,1338],{"class":943},[808,2538,963],{"class":822},[808,2540,1012],{"class":996},[808,2542,983],{"class":822},[808,2544,1560],{"class":1017},[808,2546,1021],{"class":822},[808,2548,1024],{"class":996},[808,2550,983],{"class":822},[808,2552,2321],{"class":1017},[808,2554,1131],{"class":822},[808,2556,2557],{"class":1134},"  # rack footprint\n",[808,2559,2560],{"class":810,"line":1243},[808,2561,1405],{"class":822},[808,2563,2564],{"class":810,"line":1257},[808,2565,1411],{"class":822},[808,2567,2568],{"class":810,"line":1289},[808,2569,1192],{"class":822},[808,2571,2572],{"class":810,"line":1311},[808,2573,842],{"emptyLinePlaceholder":841},[808,2575,2576],{"class":810,"line":1402},[808,2577,842],{"emptyLinePlaceholder":841},[808,2579,2580,2582,2584,2586],{"class":810,"line":1408},[808,2581,940],{"class":822},[808,2583,944],{"class":943},[808,2585,823],{"class":822},[808,2587,949],{"class":943},[808,2589,2590,2592,2595,2597,2599],{"class":810,"line":1414},[808,2591,956],{"class":955},[808,2593,2594],{"class":959}," Tube15mL",[808,2596,963],{"class":822},[808,2598,781],{"class":959},[808,2600,968],{"class":822},[808,2602,2604,2606,2609],{"class":810,"line":2603},36,[808,2605,2237],{"class":814},[808,2607,2608],{"class":1134},"15 mL conical tube.",[808,2610,2243],{"class":814},[808,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664],{"class":810,"line":2613},37,[808,2615,974],{"class":818},[808,2617,977],{"class":822},[808,2619,980],{"class":818},[808,2621,983],{"class":822},[808,2623,986],{"class":818},[808,2625,823],{"class":822},[808,2627,991],{"class":943},[808,2629,963],{"class":822},[808,2631,997],{"class":996},[808,2633,983],{"class":822},[808,2635,1002],{"class":955},[808,2637,977],{"class":822},[808,2639,1007],{"class":943},[808,2641,963],{"class":822},[808,2643,1012],{"class":996},[808,2645,983],{"class":822},[808,2647,1543],{"class":1017},[808,2649,1021],{"class":822},[808,2651,1024],{"class":996},[808,2653,983],{"class":822},[808,2655,1543],{"class":1017},[808,2657,1021],{"class":822},[808,2659,1033],{"class":996},[808,2661,983],{"class":822},[808,2663,1560],{"class":1017},[808,2665,1041],{"class":822},[808,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691],{"class":810,"line":2668},38,[808,2670,1047],{"class":818},[808,2672,977],{"class":822},[808,2674,1052],{"class":818},[808,2676,983],{"class":822},[808,2678,986],{"class":818},[808,2680,823],{"class":822},[808,2682,991],{"class":943},[808,2684,963],{"class":822},[808,2686,997],{"class":996},[808,2688,983],{"class":822},[808,2690,1587],{"class":943},[808,2692,924],{"class":822},[808,2694,2696],{"class":810,"line":2695},39,[808,2697,842],{"emptyLinePlaceholder":841},[808,2699,2701],{"class":810,"line":2700},40,[808,2702,842],{"emptyLinePlaceholder":841},[808,2704,2706],{"class":810,"line":2705},41,[808,2707,2708],{"class":1134},"# Create and fill the rack\n",[808,2710,2712,2715,2717,2719,2721,2724,2726,2729],{"class":810,"line":2711},42,[808,2713,2714],{"class":818},"rack ",[808,2716,983],{"class":822},[808,2718,2226],{"class":943},[808,2720,963],{"class":822},[808,2722,2723],{"class":996},"filled_with",[808,2725,983],{"class":822},[808,2727,2728],{"class":943},"Tube15mL",[808,2730,924],{"class":822},[775,2732,2733,2734,2737,2738,2100,2741,2743],{},"A ",[779,2735,2736],{},"Standard96TubeRack"," (of standard ANSI-SLAS footprint) is implemented and easily customizable with the ",[779,2739,2740],{},"spot_offset",[779,2742,1927],{}," parameters:",[2745,2746,2747,2753],"ul",{},[2748,2749,2750,2752],"li",{},[779,2751,2740],{},": the offset of the A1 tube spot center from the A1 corner of the rack",[2748,2754,2755,2757],{},[779,2756,1927],{},": how far into the rack (from its top plane) that tubes sit in the rack",[799,2759,2761],{"className":801,"code":2760,"language":803,"meta":804,"style":804},"import dataclasses\nimport decimal\n\nfrom unitelabs.labware import Tube, Standard96TubeRack, Vector\nfrom unitelabs.labware.liquids import Container\n\n\n@dataclasses.dataclass\nclass CustomTube(Tube):\n    \"\"\"A 2 mL Eppendorf tube.\"\"\"\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(7.8, 7.8, 42.5))\n    container: Container = dataclasses.field(default_factory=Container)\n\n\n@dataclasses.dataclass\nclass Custom96TubeRack(Standard96TubeRack):\n    \"\"\"96-position tube rack for 2 mL tubes.\"\"\"\n    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(z=30.4))\n    spot_offset: Vector = dataclasses.field(default_factory=lambda: Vector(x=14.7, y=11.2))\n    fitting_depth: decimal.Decimal = dataclasses.field(default_factory=lambda: decimal.Decimal(\"28.1\"))\n\n# Create a filled rack\ntube_rack = Custom96TubeRack(filled_with=CustomTube)\n",[779,2762,2763,2769,2775,2779,2802,2820,2824,2828,2838,2851,2860,2905,2931,2935,2939,2949,2962,2971,3011,3060,3107,3111,3116],{"__ignoreMap":804},[808,2764,2765,2767],{"class":810,"line":811},[808,2766,815],{"class":814},[808,2768,835],{"class":818},[808,2770,2771,2773],{"class":810,"line":830},[808,2772,815],{"class":814},[808,2774,2122],{"class":818},[808,2776,2777],{"class":810,"line":838},[808,2778,842],{"emptyLinePlaceholder":841},[808,2780,2781,2783,2785,2787,2789,2791,2793,2795,2798,2800],{"class":810,"line":845},[808,2782,848],{"class":814},[808,2784,851],{"class":818},[808,2786,823],{"class":822},[808,2788,856],{"class":818},[808,2790,815],{"class":814},[808,2792,1449],{"class":818},[808,2794,1021],{"class":822},[808,2796,2797],{"class":818}," Standard96TubeRack",[808,2799,1021],{"class":822},[808,2801,1454],{"class":818},[808,2803,2804,2806,2808,2810,2812,2814,2816,2818],{"class":810,"line":864},[808,2805,848],{"class":814},[808,2807,851],{"class":818},[808,2809,823],{"class":822},[808,2811,1465],{"class":818},[808,2813,823],{"class":822},[808,2815,1470],{"class":818},[808,2817,815],{"class":814},[808,2819,1475],{"class":818},[808,2821,2822],{"class":810,"line":873},[808,2823,842],{"emptyLinePlaceholder":841},[808,2825,2826],{"class":810,"line":881},[808,2827,842],{"emptyLinePlaceholder":841},[808,2829,2830,2832,2834,2836],{"class":810,"line":889},[808,2831,940],{"class":822},[808,2833,944],{"class":943},[808,2835,823],{"class":822},[808,2837,949],{"class":943},[808,2839,2840,2842,2845,2847,2849],{"class":810,"line":897},[808,2841,956],{"class":955},[808,2843,2844],{"class":959}," CustomTube",[808,2846,963],{"class":822},[808,2848,781],{"class":959},[808,2850,968],{"class":822},[808,2852,2853,2855,2858],{"class":810,"line":905},[808,2854,2237],{"class":814},[808,2856,2857],{"class":1134},"A 2 mL Eppendorf tube.",[808,2859,2243],{"class":814},[808,2861,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884,2886,2888,2890,2893,2895,2898,2900,2903],{"class":810,"line":913},[808,2863,974],{"class":818},[808,2865,977],{"class":822},[808,2867,980],{"class":818},[808,2869,983],{"class":822},[808,2871,986],{"class":818},[808,2873,823],{"class":822},[808,2875,991],{"class":943},[808,2877,963],{"class":822},[808,2879,997],{"class":996},[808,2881,983],{"class":822},[808,2883,1002],{"class":955},[808,2885,977],{"class":822},[808,2887,1007],{"class":943},[808,2889,963],{"class":822},[808,2891,2892],{"class":1017},"7.8",[808,2894,1021],{"class":822},[808,2896,2897],{"class":1017}," 7.8",[808,2899,1021],{"class":822},[808,2901,2902],{"class":1017}," 42.5",[808,2904,1041],{"class":822},[808,2906,2907,2909,2911,2913,2915,2917,2919,2921,2923,2925,2927,2929],{"class":810,"line":921},[808,2908,1047],{"class":818},[808,2910,977],{"class":822},[808,2912,1052],{"class":818},[808,2914,983],{"class":822},[808,2916,986],{"class":818},[808,2918,823],{"class":822},[808,2920,991],{"class":943},[808,2922,963],{"class":822},[808,2924,997],{"class":996},[808,2926,983],{"class":822},[808,2928,1587],{"class":943},[808,2930,924],{"class":822},[808,2932,2933],{"class":810,"line":927},[808,2934,842],{"emptyLinePlaceholder":841},[808,2936,2937],{"class":810,"line":932},[808,2938,842],{"emptyLinePlaceholder":841},[808,2940,2941,2943,2945,2947],{"class":810,"line":937},[808,2942,940],{"class":822},[808,2944,944],{"class":943},[808,2946,823],{"class":822},[808,2948,949],{"class":943},[808,2950,2951,2953,2956,2958,2960],{"class":810,"line":952},[808,2952,956],{"class":955},[808,2954,2955],{"class":959}," Custom96TubeRack",[808,2957,963],{"class":822},[808,2959,2736],{"class":959},[808,2961,968],{"class":822},[808,2963,2964,2966,2969],{"class":810,"line":971},[808,2965,2237],{"class":814},[808,2967,2968],{"class":1134},"96-position tube rack for 2 mL tubes.",[808,2970,2243],{"class":814},[808,2972,2973,2975,2977,2979,2981,2983,2985,2987,2989,2991,2993,2995,2997,2999,3001,3004,3006,3009],{"class":810,"line":1044},[808,2974,974],{"class":818},[808,2976,977],{"class":822},[808,2978,980],{"class":818},[808,2980,983],{"class":822},[808,2982,986],{"class":818},[808,2984,823],{"class":822},[808,2986,991],{"class":943},[808,2988,963],{"class":822},[808,2990,997],{"class":996},[808,2992,983],{"class":822},[808,2994,1002],{"class":955},[808,2996,977],{"class":822},[808,2998,1007],{"class":943},[808,3000,963],{"class":822},[808,3002,3003],{"class":996},"z",[808,3005,983],{"class":822},[808,3007,3008],{"class":1017},"30.4",[808,3010,1041],{"class":822},[808,3012,3013,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3049,3051,3053,3055,3058],{"class":810,"line":1066},[808,3014,3015],{"class":818},"    spot_offset",[808,3017,977],{"class":822},[808,3019,980],{"class":818},[808,3021,983],{"class":822},[808,3023,986],{"class":818},[808,3025,823],{"class":822},[808,3027,991],{"class":943},[808,3029,963],{"class":822},[808,3031,997],{"class":996},[808,3033,983],{"class":822},[808,3035,1002],{"class":955},[808,3037,977],{"class":822},[808,3039,1007],{"class":943},[808,3041,963],{"class":822},[808,3043,1012],{"class":996},[808,3045,983],{"class":822},[808,3047,3048],{"class":1017},"14.7",[808,3050,1021],{"class":822},[808,3052,1024],{"class":996},[808,3054,983],{"class":822},[808,3056,3057],{"class":1017},"11.2",[808,3059,1041],{"class":822},[808,3061,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092,3094,3096,3098,3100,3103,3105],{"class":810,"line":1083},[808,3063,1825],{"class":818},[808,3065,977],{"class":822},[808,3067,2341],{"class":818},[808,3069,823],{"class":822},[808,3071,1848],{"class":826},[808,3073,1223],{"class":822},[808,3075,986],{"class":818},[808,3077,823],{"class":822},[808,3079,991],{"class":943},[808,3081,963],{"class":822},[808,3083,997],{"class":996},[808,3085,983],{"class":822},[808,3087,1002],{"class":955},[808,3089,977],{"class":822},[808,3091,2341],{"class":943},[808,3093,823],{"class":822},[808,3095,1848],{"class":943},[808,3097,963],{"class":822},[808,3099,1853],{"class":822},[808,3101,3102],{"class":1856},"28.1",[808,3104,1853],{"class":822},[808,3106,1041],{"class":822},[808,3108,3109],{"class":810,"line":1096},[808,3110,842],{"emptyLinePlaceholder":841},[808,3112,3113],{"class":810,"line":1105},[808,3114,3115],{"class":1134},"# Create a filled rack\n",[808,3117,3118,3121,3123,3125,3127,3129,3131,3134],{"class":810,"line":1138},[808,3119,3120],{"class":818},"tube_rack ",[808,3122,983],{"class":822},[808,3124,2955],{"class":943},[808,3126,963],{"class":822},[808,3128,2723],{"class":996},[808,3130,983],{"class":822},[808,3132,3133],{"class":943},"CustomTube",[808,3135,924],{"class":822},[3137,3138,3140],"h3",{"id":3139},"accessing-tubes","Accessing Tubes",[775,3142,3143,3144,3146,3147,977],{},"Any ",[779,3145,2085],{}," provides a convenient way to access tubes in the rack using ",[779,3148,3149],{},".tubes",[799,3151,3153],{"className":801,"code":3152,"language":803,"meta":804,"style":804},"tubes = tube_rack.tubes\nfor tube in tubes:\n    print(tube.container.volume)  # Volume of the tube\n    print(tube.lid)  # Lid of the tube, if any\n",[779,3154,3155,3169,3185,3210],{"__ignoreMap":804},[808,3156,3157,3159,3161,3164,3166],{"class":810,"line":811},[808,3158,1708],{"class":818},[808,3160,983],{"class":822},[808,3162,3163],{"class":818}," tube_rack",[808,3165,823],{"class":822},[808,3167,3168],{"class":826},"tubes\n",[808,3170,3171,3174,3177,3179,3182],{"class":810,"line":830},[808,3172,3173],{"class":814},"for",[808,3175,3176],{"class":818}," tube ",[808,3178,1303],{"class":814},[808,3180,3181],{"class":818}," tubes",[808,3183,3184],{"class":822},":\n",[808,3186,3187,3190,3192,3194,3196,3199,3201,3204,3207],{"class":810,"line":838},[808,3188,3189],{"class":943},"    print",[808,3191,963],{"class":822},[808,3193,1914],{"class":943},[808,3195,823],{"class":822},[808,3197,3198],{"class":826},"container",[808,3200,823],{"class":822},[808,3202,3203],{"class":826},"volume",[808,3205,3206],{"class":822},")",[808,3208,3209],{"class":1134},"  # Volume of the tube\n",[808,3211,3212,3214,3216,3218,3220,3222,3224],{"class":810,"line":845},[808,3213,3189],{"class":943},[808,3215,963],{"class":822},[808,3217,1914],{"class":943},[808,3219,823],{"class":822},[808,3221,1892],{"class":826},[808,3223,3206],{"class":822},[808,3225,3226],{"class":1134},"  # Lid of the tube, if any\n",[775,3228,3229],{},"One can access tubes by their well position or numerical (column-major) index:",[799,3231,3233],{"className":801,"code":3232,"language":803,"meta":804,"style":804},"# Access tubes by well position\ntube = tube_rack.tubes[\"A1\"]\ntube = tube_rack.tubes[\"A2\":\"H2\"]\ntube = tube_rack.tubes[\"A7\":]\n\n# Access tubes by numerical index\ntube = tube_rack.tubes[0]  # First tube (A1)\ntube = tube_rack.tubes[0:8]  # First column (A1:H1)\n",[779,3234,3235,3240,3264,3296,3320,3324,3329,3351],{"__ignoreMap":804},[808,3236,3237],{"class":810,"line":811},[808,3238,3239],{"class":1134},"# Access tubes by well position\n",[808,3241,3242,3244,3246,3248,3250,3252,3254,3256,3259,3261],{"class":810,"line":830},[808,3243,1883],{"class":818},[808,3245,983],{"class":822},[808,3247,3163],{"class":818},[808,3249,823],{"class":822},[808,3251,772],{"class":826},[808,3253,1215],{"class":822},[808,3255,1853],{"class":822},[808,3257,3258],{"class":1856},"A1",[808,3260,1853],{"class":822},[808,3262,3263],{"class":822},"]\n",[808,3265,3266,3268,3270,3272,3274,3276,3278,3280,3283,3285,3287,3289,3292,3294],{"class":810,"line":838},[808,3267,1883],{"class":818},[808,3269,983],{"class":822},[808,3271,3163],{"class":818},[808,3273,823],{"class":822},[808,3275,772],{"class":826},[808,3277,1215],{"class":822},[808,3279,1853],{"class":822},[808,3281,3282],{"class":1856},"A2",[808,3284,1853],{"class":822},[808,3286,977],{"class":822},[808,3288,1853],{"class":822},[808,3290,3291],{"class":1856},"H2",[808,3293,1853],{"class":822},[808,3295,3263],{"class":822},[808,3297,3298,3300,3302,3304,3306,3308,3310,3312,3315,3317],{"class":810,"line":845},[808,3299,1883],{"class":818},[808,3301,983],{"class":822},[808,3303,3163],{"class":818},[808,3305,823],{"class":822},[808,3307,772],{"class":826},[808,3309,1215],{"class":822},[808,3311,1853],{"class":822},[808,3313,3314],{"class":1856},"A7",[808,3316,1853],{"class":822},[808,3318,3319],{"class":822},":]\n",[808,3321,3322],{"class":810,"line":864},[808,3323,842],{"emptyLinePlaceholder":841},[808,3325,3326],{"class":810,"line":873},[808,3327,3328],{"class":1134},"# Access tubes by numerical index\n",[808,3330,3331,3333,3335,3337,3339,3341,3343,3346,3348],{"class":810,"line":881},[808,3332,1883],{"class":818},[808,3334,983],{"class":822},[808,3336,3163],{"class":818},[808,3338,823],{"class":822},[808,3340,772],{"class":826},[808,3342,1215],{"class":822},[808,3344,3345],{"class":1017},"0",[808,3347,1220],{"class":822},[808,3349,3350],{"class":1134},"  # First tube (A1)\n",[808,3352,3353,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373],{"class":810,"line":889},[808,3354,1883],{"class":818},[808,3356,983],{"class":822},[808,3358,3163],{"class":818},[808,3360,823],{"class":822},[808,3362,772],{"class":826},[808,3364,1215],{"class":822},[808,3366,3345],{"class":1017},[808,3368,977],{"class":822},[808,3370,1802],{"class":1017},[808,3372,1220],{"class":822},[808,3374,3375],{"class":1134},"  # First column (A1:H1)\n",[775,3377,3378,3379,3382,3383,3385,3386,3388,3389,3391,3392,3395,3396,977],{},"It is ",[787,3380,3381],{},"essential"," to note that since ",[779,3384,2089],{},"s can be empty, calling ",[779,3387,3149],{}," over a slice of ",[779,3390,2089],{},"s may return fewer tubes than the number of spots searched! When necessary, one can enforce that tubes are present in all spots by using ",[779,3393,3394],{},".tubes.strict",", following the same pattern as ",[779,3397,3149],{},[799,3399,3401],{"className":801,"code":3400,"language":803,"meta":804,"style":804},"tubes = tube_rack.tubes.strict  # Raises IndexError if any spot is empty on the rack\n\n# Access tubes by well position as with .tubes\ntube = tube_rack.tubes.strict[\"A2\":\"H2\"]  # Raises IndexError if any spot is empty\ntube = tube_rack.tubes.strict[9:16]  # Raises IndexError if any spot is empty\n",[779,3402,3403,3423,3427,3432,3469],{"__ignoreMap":804},[808,3404,3405,3407,3409,3411,3413,3415,3417,3420],{"class":810,"line":811},[808,3406,1708],{"class":818},[808,3408,983],{"class":822},[808,3410,3163],{"class":818},[808,3412,823],{"class":822},[808,3414,772],{"class":826},[808,3416,823],{"class":822},[808,3418,3419],{"class":826},"strict",[808,3421,3422],{"class":1134},"  # Raises IndexError if any spot is empty on the rack\n",[808,3424,3425],{"class":810,"line":830},[808,3426,842],{"emptyLinePlaceholder":841},[808,3428,3429],{"class":810,"line":838},[808,3430,3431],{"class":1134},"# Access tubes by well position as with .tubes\n",[808,3433,3434,3436,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3462,3464,3466],{"class":810,"line":845},[808,3435,1883],{"class":818},[808,3437,983],{"class":822},[808,3439,3163],{"class":818},[808,3441,823],{"class":822},[808,3443,772],{"class":826},[808,3445,823],{"class":822},[808,3447,3419],{"class":826},[808,3449,1215],{"class":822},[808,3451,1853],{"class":822},[808,3453,3282],{"class":1856},[808,3455,1853],{"class":822},[808,3457,977],{"class":822},[808,3459,1853],{"class":822},[808,3461,3291],{"class":1856},[808,3463,1853],{"class":822},[808,3465,1220],{"class":822},[808,3467,3468],{"class":1134},"  # Raises IndexError if any spot is empty\n",[808,3470,3471,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3494,3496],{"class":810,"line":864},[808,3472,1883],{"class":818},[808,3474,983],{"class":822},[808,3476,3163],{"class":818},[808,3478,823],{"class":822},[808,3480,772],{"class":826},[808,3482,823],{"class":822},[808,3484,3419],{"class":826},[808,3486,1215],{"class":822},[808,3488,1347],{"class":1017},[808,3490,977],{"class":822},[808,3492,3493],{"class":1017},"16",[808,3495,1220],{"class":822},[808,3497,3468],{"class":1134},[3137,3499,3501],{"id":3500},"convenience-methods","Convenience Methods",[775,3503,3504,3507,3508,3511],{},[779,3505,3506],{},".filled_spots",", ",[779,3509,3510],{},".empty_spots",": quickly find filled or empty spots in a tube rack:",[799,3513,3515],{"className":801,"code":3514,"language":803,"meta":804,"style":804},"filled_spots = tube_rack.filled_spots\nempty_spots = tube_rack.empty_spots\n\n# Print filled spot labels\nfor spot in filled_spots:\n    print(spot.well_label)\n\n# Print empty spot labels\nfor spot in empty_spots:\n    print(spot.well_label)\n",[779,3516,3517,3531,3545,3549,3554,3568,3584,3588,3593,3606],{"__ignoreMap":804},[808,3518,3519,3522,3524,3526,3528],{"class":810,"line":811},[808,3520,3521],{"class":818},"filled_spots ",[808,3523,983],{"class":822},[808,3525,3163],{"class":818},[808,3527,823],{"class":822},[808,3529,3530],{"class":826},"filled_spots\n",[808,3532,3533,3536,3538,3540,3542],{"class":810,"line":830},[808,3534,3535],{"class":818},"empty_spots ",[808,3537,983],{"class":822},[808,3539,3163],{"class":818},[808,3541,823],{"class":822},[808,3543,3544],{"class":826},"empty_spots\n",[808,3546,3547],{"class":810,"line":838},[808,3548,842],{"emptyLinePlaceholder":841},[808,3550,3551],{"class":810,"line":845},[808,3552,3553],{"class":1134},"# Print filled spot labels\n",[808,3555,3556,3558,3561,3563,3566],{"class":810,"line":864},[808,3557,3173],{"class":814},[808,3559,3560],{"class":818}," spot ",[808,3562,1303],{"class":814},[808,3564,3565],{"class":818}," filled_spots",[808,3567,3184],{"class":822},[808,3569,3570,3572,3574,3577,3579,3582],{"class":810,"line":873},[808,3571,3189],{"class":943},[808,3573,963],{"class":822},[808,3575,3576],{"class":943},"spot",[808,3578,823],{"class":822},[808,3580,3581],{"class":826},"well_label",[808,3583,924],{"class":822},[808,3585,3586],{"class":810,"line":881},[808,3587,842],{"emptyLinePlaceholder":841},[808,3589,3590],{"class":810,"line":889},[808,3591,3592],{"class":1134},"# Print empty spot labels\n",[808,3594,3595,3597,3599,3601,3604],{"class":810,"line":897},[808,3596,3173],{"class":814},[808,3598,3560],{"class":818},[808,3600,1303],{"class":814},[808,3602,3603],{"class":818}," empty_spots",[808,3605,3184],{"class":822},[808,3607,3608,3610,3612,3614,3616,3618],{"class":810,"line":905},[808,3609,3189],{"class":943},[808,3611,963],{"class":822},[808,3613,3576],{"class":943},[808,3615,823],{"class":822},[808,3617,3581],{"class":826},[808,3619,924],{"class":822},[775,3621,3622,3625],{},[779,3623,3624],{},".any_caps",": quickly find if a tube rack has any caps:",[799,3627,3629],{"className":801,"code":3628,"language":803,"meta":804,"style":804},"if tube_rack.any_caps:\n    print(\"The tube rack has at least one cap.\")\n",[779,3630,3631,3645],{"__ignoreMap":804},[808,3632,3633,3636,3638,3640,3643],{"class":810,"line":811},[808,3634,3635],{"class":814},"if",[808,3637,3163],{"class":818},[808,3639,823],{"class":822},[808,3641,3642],{"class":826},"any_caps",[808,3644,3184],{"class":822},[808,3646,3647,3649,3651,3653,3656,3658],{"class":810,"line":830},[808,3648,3189],{"class":943},[808,3650,963],{"class":822},[808,3652,1853],{"class":822},[808,3654,3655],{"class":1856},"The tube rack has at least one cap.",[808,3657,1853],{"class":822},[808,3659,924],{"class":822},[775,3661,3662,3665],{},[779,3663,3664],{},".height",": get the current effective height of the rack, accounting for:",[2745,3667,3668,3671],{},[2748,3669,3670],{},"Presence of tubes in the rack (adjusted by the rack's fitting depth)",[2748,3672,3673],{},"Presence of caps on tubes (adjusted by the cap's fitting depth)",[799,3675,3677],{"className":801,"code":3676,"language":803,"meta":804,"style":804},"empty_rack = Standard96TubeRack(dimensions=Vector(z=50.0))\nprint(empty_rack.height)  # empty_rack.dimensions.z\n\nfilled_rack = Standard96TubeRack(\n  filled_with=Tube(dimensions=Vector(x=9.0, y=9.0, z=30.0)),\n  fitting_depth=25.0\n)\nprint(filled_rack.height)  #  filled_rack.dimensions.z + Tube.dimensions.z - filled_rack.fitting_depth\n\ncap = Cap(\n  dimensions=Vector(x=10.0, y=10.0, z=5.0),\n  fitting_depth=3.0\n)\nfilled_rack.tubes[\"A1\"].close(cap)\nprint(filled_rack.height) # filled_rack.dimensions.z + Tube.dimensions.z - filled_rack.fitting_depth + cap.dimensions.z - cap.fitting_depth\n",[779,3678,3679,3707,3727,3731,3742,3788,3798,3802,3820,3824,3835,3873,3882,3886,3913],{"__ignoreMap":804},[808,3680,3681,3684,3686,3688,3690,3692,3694,3696,3698,3700,3702,3705],{"class":810,"line":811},[808,3682,3683],{"class":818},"empty_rack ",[808,3685,983],{"class":822},[808,3687,2797],{"class":943},[808,3689,963],{"class":822},[808,3691,1265],{"class":996},[808,3693,983],{"class":822},[808,3695,1338],{"class":943},[808,3697,963],{"class":822},[808,3699,3003],{"class":996},[808,3701,983],{"class":822},[808,3703,3704],{"class":1017},"50.0",[808,3706,1041],{"class":822},[808,3708,3709,3712,3714,3717,3719,3722,3724],{"class":810,"line":830},[808,3710,3711],{"class":943},"print",[808,3713,963],{"class":822},[808,3715,3716],{"class":943},"empty_rack",[808,3718,823],{"class":822},[808,3720,3721],{"class":826},"height",[808,3723,3206],{"class":822},[808,3725,3726],{"class":1134},"  # empty_rack.dimensions.z\n",[808,3728,3729],{"class":810,"line":838},[808,3730,842],{"emptyLinePlaceholder":841},[808,3732,3733,3736,3738,3740],{"class":810,"line":845},[808,3734,3735],{"class":818},"filled_rack ",[808,3737,983],{"class":822},[808,3739,2797],{"class":943},[808,3741,1063],{"class":822},[808,3743,3744,3747,3749,3751,3753,3755,3757,3759,3761,3763,3765,3768,3770,3772,3774,3776,3778,3780,3782,3785],{"class":810,"line":864},[808,3745,3746],{"class":996},"  filled_with",[808,3748,983],{"class":822},[808,3750,781],{"class":943},[808,3752,963],{"class":822},[808,3754,1265],{"class":996},[808,3756,983],{"class":822},[808,3758,1338],{"class":943},[808,3760,963],{"class":822},[808,3762,1012],{"class":996},[808,3764,983],{"class":822},[808,3766,3767],{"class":1017},"9.0",[808,3769,1021],{"class":822},[808,3771,1024],{"class":996},[808,3773,983],{"class":822},[808,3775,3767],{"class":1017},[808,3777,1021],{"class":822},[808,3779,1033],{"class":996},[808,3781,983],{"class":822},[808,3783,3784],{"class":1017},"30.0",[808,3786,3787],{"class":822},")),\n",[808,3789,3790,3793,3795],{"class":810,"line":873},[808,3791,3792],{"class":996},"  fitting_depth",[808,3794,983],{"class":822},[808,3796,3797],{"class":1017},"25.0\n",[808,3799,3800],{"class":810,"line":881},[808,3801,924],{"class":822},[808,3803,3804,3806,3808,3811,3813,3815,3817],{"class":810,"line":889},[808,3805,3711],{"class":943},[808,3807,963],{"class":822},[808,3809,3810],{"class":943},"filled_rack",[808,3812,823],{"class":822},[808,3814,3721],{"class":826},[808,3816,3206],{"class":822},[808,3818,3819],{"class":1134},"  #  filled_rack.dimensions.z + Tube.dimensions.z - filled_rack.fitting_depth\n",[808,3821,3822],{"class":810,"line":897},[808,3823,842],{"emptyLinePlaceholder":841},[808,3825,3826,3828,3830,3833],{"class":810,"line":905},[808,3827,2000],{"class":818},[808,3829,983],{"class":822},[808,3831,3832],{"class":943}," Cap",[808,3834,1063],{"class":822},[808,3836,3837,3840,3842,3844,3846,3848,3850,3853,3855,3857,3859,3861,3863,3865,3867,3870],{"class":810,"line":913},[808,3838,3839],{"class":996},"  dimensions",[808,3841,983],{"class":822},[808,3843,1338],{"class":943},[808,3845,963],{"class":822},[808,3847,1012],{"class":996},[808,3849,983],{"class":822},[808,3851,3852],{"class":1017},"10.0",[808,3854,1021],{"class":822},[808,3856,1024],{"class":996},[808,3858,983],{"class":822},[808,3860,3852],{"class":1017},[808,3862,1021],{"class":822},[808,3864,1033],{"class":996},[808,3866,983],{"class":822},[808,3868,3869],{"class":1017},"5.0",[808,3871,3872],{"class":822},"),\n",[808,3874,3875,3877,3879],{"class":810,"line":921},[808,3876,3792],{"class":996},[808,3878,983],{"class":822},[808,3880,3881],{"class":1017},"3.0\n",[808,3883,3884],{"class":810,"line":927},[808,3885,924],{"class":822},[808,3887,3888,3890,3892,3894,3896,3898,3900,3902,3905,3907,3909,3911],{"class":810,"line":932},[808,3889,3810],{"class":818},[808,3891,823],{"class":822},[808,3893,772],{"class":826},[808,3895,1215],{"class":822},[808,3897,1853],{"class":822},[808,3899,3258],{"class":1856},[808,3901,1853],{"class":822},[808,3903,3904],{"class":822},"].",[808,3906,1959],{"class":943},[808,3908,963],{"class":822},[808,3910,2035],{"class":943},[808,3912,924],{"class":822},[808,3914,3915,3917,3919,3921,3923,3925,3927],{"class":810,"line":937},[808,3916,3711],{"class":943},[808,3918,963],{"class":822},[808,3920,3810],{"class":943},[808,3922,823],{"class":822},[808,3924,3721],{"class":826},[808,3926,3206],{"class":822},[808,3928,3929],{"class":1134}," # filled_rack.dimensions.z + Tube.dimensions.z - filled_rack.fitting_depth + cap.dimensions.z - cap.fitting_depth\n",[3137,3931,151],{"id":3932},"liquid-handling",[775,3934,3935,3936,3938],{},"One can flexibly provide ",[779,3937,2085],{}," objects to liquid handling operations:",[799,3940,3942],{"className":801,"code":3941,"language":803,"meta":804,"style":804},"lhs.pipettes.aspirate(tube_rack) # Targets the first present tubes in the rack with column-major searching\n\nlhs.pipettes.dispense(tube_rack.tubes[\"A6\":\"H6\"]) # Target tubes present from A6-H6 on the rack\n\nlhs.pipettes.aspirate(tube_rack.tubes.strict[\"A6\":\"H6\"]) # Target tubes present from A6-H6 on the rack, raising an error if any spot is empty\n\nlhs.core96.aspirate(tube_rack) # Target all tubes in the rack. Note that for a 96-channel head, tubes must be arranged in a compatible layout on the rack!\n",[779,3943,3944,3969,3973,4018,4022,4067,4071],{"__ignoreMap":804},[808,3945,3946,3949,3951,3954,3956,3959,3961,3964,3966],{"class":810,"line":811},[808,3947,3948],{"class":818},"lhs",[808,3950,823],{"class":822},[808,3952,3953],{"class":826},"pipettes",[808,3955,823],{"class":822},[808,3957,3958],{"class":943},"aspirate",[808,3960,963],{"class":822},[808,3962,3963],{"class":943},"tube_rack",[808,3965,3206],{"class":822},[808,3967,3968],{"class":1134}," # Targets the first present tubes in the rack with column-major searching\n",[808,3970,3971],{"class":810,"line":830},[808,3972,842],{"emptyLinePlaceholder":841},[808,3974,3975,3977,3979,3981,3983,3986,3988,3990,3992,3994,3996,3998,4001,4003,4005,4007,4010,4012,4015],{"class":810,"line":838},[808,3976,3948],{"class":818},[808,3978,823],{"class":822},[808,3980,3953],{"class":826},[808,3982,823],{"class":822},[808,3984,3985],{"class":943},"dispense",[808,3987,963],{"class":822},[808,3989,3963],{"class":943},[808,3991,823],{"class":822},[808,3993,772],{"class":826},[808,3995,1215],{"class":822},[808,3997,1853],{"class":822},[808,3999,4000],{"class":1856},"A6",[808,4002,1853],{"class":822},[808,4004,977],{"class":822},[808,4006,1853],{"class":822},[808,4008,4009],{"class":1856},"H6",[808,4011,1853],{"class":822},[808,4013,4014],{"class":822},"])",[808,4016,4017],{"class":1134}," # Target tubes present from A6-H6 on the rack\n",[808,4019,4020],{"class":810,"line":845},[808,4021,842],{"emptyLinePlaceholder":841},[808,4023,4024,4026,4028,4030,4032,4034,4036,4038,4040,4042,4044,4046,4048,4050,4052,4054,4056,4058,4060,4062,4064],{"class":810,"line":864},[808,4025,3948],{"class":818},[808,4027,823],{"class":822},[808,4029,3953],{"class":826},[808,4031,823],{"class":822},[808,4033,3958],{"class":943},[808,4035,963],{"class":822},[808,4037,3963],{"class":943},[808,4039,823],{"class":822},[808,4041,772],{"class":826},[808,4043,823],{"class":822},[808,4045,3419],{"class":826},[808,4047,1215],{"class":822},[808,4049,1853],{"class":822},[808,4051,4000],{"class":1856},[808,4053,1853],{"class":822},[808,4055,977],{"class":822},[808,4057,1853],{"class":822},[808,4059,4009],{"class":1856},[808,4061,1853],{"class":822},[808,4063,4014],{"class":822},[808,4065,4066],{"class":1134}," # Target tubes present from A6-H6 on the rack, raising an error if any spot is empty\n",[808,4068,4069],{"class":810,"line":873},[808,4070,842],{"emptyLinePlaceholder":841},[808,4072,4073,4075,4077,4080,4082,4084,4086,4088,4090],{"class":810,"line":881},[808,4074,3948],{"class":818},[808,4076,823],{"class":822},[808,4078,4079],{"class":826},"core96",[808,4081,823],{"class":822},[808,4083,3958],{"class":943},[808,4085,963],{"class":822},[808,4087,3963],{"class":943},[808,4089,3206],{"class":822},[808,4091,4092],{"class":1134}," # Target all tubes in the rack. Note that for a 96-channel head, tubes must be arranged in a compatible layout on the rack!\n",[775,4094,4095,4096,4099],{},"See ",[4097,4098,238],"a",{"href":239}," for more information on liquid handling operations.",[4101,4102,4103],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":804,"searchDepth":811,"depth":830,"links":4105},[4106,4107,4108],{"id":772,"depth":830,"text":773},{"id":1680,"depth":830,"text":1681},{"id":2079,"depth":830,"text":2080,"children":4109},[4110,4111,4112],{"id":3139,"depth":838,"text":3140},{"id":3500,"depth":838,"text":3501},{"id":3932,"depth":838,"text":151},"Define custom tubes and tube racks using the Tube and TubeRack base classes.","md",null,{},{"title":209,"description":4113},"sRUlndahPR6_4MAfq2DXKqfra1wUh-A1PdLN3hh3x3c",[4120,4122],{"title":205,"path":206,"stem":207,"description":4121,"children":-1},"Define custom tip types and tip racks for Hamilton liquid handlers.",{"title":213,"path":214,"stem":215,"description":4123,"children":-1},"Define custom reagent troughs using the Trough base class.",1779956184103]