Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(shared-data): Add more new labware definitions to shared-data #2703

Merged
merged 13 commits into from
Dec 10, 2018

Conversation

Laura-Danielle
Copy link
Contributor

@Laura-Danielle Laura-Danielle commented Nov 20, 2018

overview

Using the new generator functions, create and test more labware definitions according to issue #2614

changelog

  • Add: all modular tuberack defs, all fixed trash defs
  • Change definition names in shared-data/definitions to match with shared-data/definitions2 names for easier transition (change corresponding occurrence in PD)

Known Issues

  • 15_50 is backwards (oops) I think this is a irregular labware definition issue so I think it might be out of scope for this PR
  • 12 row Trough issuing a move_to causes the pipette to move to bottom of the well instead of center -- should this be baked into def or do we handle in code?

Labware Definition Data

1.5ml tuberack eppendorf

brand = {brand: "Opentrons", brandId: ["022363221", "022363247", "022363263", "022363280", "022363301", "022363328"]}
metadata = {tags: ["1.5", "mL", "eppendorf", "snapcap", "tuberack"], displayName: "Opentrons snapcap 1.5mL tuberack", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "tuberack"}
dimensions = {overallLength: 127.75, overallWidth: 85.5, overallHeight: 79.85}
parameters = {format: "irregular", isTiprack: false,isMagneticModuleCompatible: false}
grid = {row: 4, column: 6}
spacing = {row: 19.28, column: 19.89}
offset = {x: 18.21, y: 17.59, z: 79.85}
well = {depth: 37.8, diameter: 8.7, shape: "circular", totalLiquidVolume: 1.5}

2ml Tuberack eppendorf

brand = {brand: "Opentrons", brandId: ["022363344", "022363352", "022363379", "022363476"]}
metadata = {tags: ["2", "mL", "eppendorf", "snapcap", "tuberack"], displayName: "Opentrons snapcap 2mL tuberack", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "tuberack"}
dimensions = {overallLength: 127.75, overallWidth: 85.5, overallHeight: 79.85}
parameters = {format: "irregular", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row: 4, column: 6}
spacing = {row: 19.28, column: 19.89}
offset = {x: 18.21, y: 17.59, z: 79.85}
well = {depth: 38.58, diameter: 9.9, shape: "circular", totalLiquidVolume: 2}

2ml Tuberack screwcap

brand = {brand: "Opentrons", brandId: ["649020"]}
metadata = {tags: ["2", "mL", "E&K Scientific", "screwcap", "tuberack"], displayName: "Opentrons screwcap 2mL tuberack", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "tuberack"}
dimensions = {overallLength: 127.75, overallWidth: 85.5, overallHeight: 79.85}
parameters = {format: "irregular", isTiprack: false,isMagneticModuleCompatible: false}
grid = {row: 4, column: 6}
spacing = {row: 19.28, column 19.89}
offset = {x: 18.21, y: 17.59, z: 79.85}
well = {depth: 42, diameter: 8.5, shape: "circular", totalLiquidVolume: 2}

Opentrons Tuberack 15mL

brand = {brand: "Opentrons", "brandId": ["352096"]}
metadata = {tags: ["15", "mL", "falcon", "tuberack"], displayName: "Opentrons 15 mL tuberack", displayCategory: "tuberack", displayVolumeUnits: "mL", displayLengthUnits: "mm"}
dimensions = {overallLength: 121, overallWidth: 78.75, overallHeight: 123.76}
parameters = {format: "irregular", isTiprack: false}
grid = {row: 3, column: 5}
spacing = {row: 25, column: 25}
offset = {x: 10.5, y: 14.375, z: 123.76}
well = {depth: 117.98, diameter: 14.5, shape: "circular", totalLiquidVolume: 15}

Opentrons 50 mL tuberack

brand = {brand: "Opentrons", "brandId": ["352070"]}
metadata = {tags: ["50", "mL", "falcon", "tuberack"], displayName: "Opentrons 50 mL tuberack", displayCategory: "tuberack", displayVolumeUnits: "mL", displayLengthUnits: "mm"}
dimensions = {overallLength: 121, overallWidth: 78.75, overallHeight: 123.76}
parameters = {format: "irregular", isTiprack: false}
grid = {row: 2, column: 3}
spacing = {row: 35, column: 35}
offset = {x: 33.0, y: 21.875, z: 119.89}
well = {depth: 113.85, diameter: 26.45, shape: "circular", totalLiquidVolume: 50}

Aluminum 2ml block

metadata = {displayName: "Aluminum 2mL block", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "tuberack"}
brand = {brand: "Opentrons", brandId: ["649020"]}
dimensions = {overallLength: 127.75, overallWidth: 85.5, overallHeight: 42}
parameters = {format: "irregular", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row:4, column: 6}
spacing = {row: 17.25, column: 17.25}
offset = {x: 20.75, y: 16.88, z: 48.7}
well = {shape: "circular", depth: 42, diameter: 8.5, totalLiquidVolume: 2}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

Aluminum 96 Block

metadata = {displayName: "Aluminum PCR block 200uL", displayVolumeUnits: "uL", displayLengthUnits: "mm", displayCategory: "tuberack"}
brand = {brand: "Opentrons", brandId: ["4ti-0785/M"]}
dimensions = {overallLength: 127.75, overallWidth: 85.5, overallHeight: 19.5}
parameters = {format: "96Standard", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row:8, column: 12}
spacing = {row: 9, column: 9}
offset = {x: 14.375, y: 11.250, z: 25.61}
well = {shape: "circular", depth: 20.3, diameter: 5.46, totalLiquidVolume: 200}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

12 Channel Trough

metadata = {displayName: "12 Channel Trough", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "trough"}
brand = {brand: "USA Scientific", brandId: ["1061-8150"]}
dimensions = {overallLength: 127.76, overallWidth: 85.8, overallHeight: 44.45}
parameters = {format: "trough", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row:1, column: 12}
spacing = {row: 0, column: 9.09}
offset = {x: 13.94, y: 42.9, z: 44.45}
well = {shape: "rectangular", depth: 42.16, length: 8.33, width= 71.88, totalLiquidVolume: 22}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

Aluminum 96 PCR Plate Biorad

metadata = {displayName: "Aluminum biorad PCR plate 200uL", displayVolumeUnits: "uL", displayLengthUnits: "mm", displayCategory: "tuberack"}
brand = {brand: "Opentrons", brandId: ["HSP9601"]}
dimensions = {overallLength: 127.76, overallWidth: 85.48, overallHeight: 18.81}
parameters = {format: "96Standard", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row:8, column: 12}
spacing = {row: 9, column: 9}
offset = {x: 14.38, y: 11.24, z: 18.81}
well = {shape: "circular", depth: 14.81, diameter: 5.46, totalLiquidVolume: 200}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

Eppendorf 10ul Tips

metadata = {displayName: "epT.I.P.S. 0.1-10 uL tiprack", displayVolumeUnits: "uL", displayLengthUnits: "mm", displayCategory: "tiprack", tags=["SBS", "tips", "10", "uL"]}
brand = {brand: "eppendorf", brandId: ["HSP9601"]}
dimensions = {overallLength: 127.76, overallWidth: 85.48, overallHeight: 65.4}
parameters = {format: "96Standard", isTiprack: true, isMagneticModuleCompatible: false, tipLength: 34}
grid = {row: 8, column: 12}
spacing = {row: 9, column: 9}
offset = {x: 14.38, y: 11.24, z: 65.4}
well = {shape: "circular", depth: 0, diameter: 6, totalLiquidVolume: 10}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

Eppendorf 1000ul Tips

metadata = {displayName: "epT.I.P.S. 50-1000 uL tiprack", displayVolumeUnits: "uL", displayLengthUnits: "mm", displayCategory: "tiprack", tags=["SBS", "tips", "1000", "uL"]}
brand = {brand: "eppendorf", brandId: ["022491105"]}
dimensions = {overallLength: 127.76, overallWidth: 85.48, overallHeight: 121.9}
parameters = {format: "96Standard", isTiprack: true, isMagneticModuleCompatible: false, tipLength: 70.7}
grid = {row: 8, column: 12}
spacing = {row: 9, column: 9}
offset = {x: 14.38, y: 11.24, z: 121.9}
well = {shape: "circular", depth: 0, diameter: 6, totalLiquidVolume: 1000}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

6 Well Plate Corning

metadata = {displayName: "Corning 6 Well Plate", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "wellPlate", tags=["SBS", "microplate", "16.8", "mL", "6 wells"]}
brand = {brand: "corning", brandId: ["3335", "3506", "3516", "3471"]}
dimensions = {overallLength: 127.76, overallWidth: 85.47, overallHeight: 20.27}
parameters = {format: "irregular", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row: 2, column: 3}
spacing = {row: 39.12, column: 39.12}
offset = {x: 24.76, y: 23.16, z: 20.27}
well = {shape: "circular", depth: 17.4, diameter: 35.43, totalLiquidVolume: 16.8}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

12 Well Plate Corning

metadata = {displayName: "Corning 6 Well Plate", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "wellPlate", tags=["SBS", "microplate", "6.9", "mL", "12 wells"]}
brand = {brand: "corning", brandId: ["3336", "3512", "3513"]}
dimensions = {overallLength: 127.89, overallWidth: 85.6, overallHeight: 20.02}
parameters = {format: "irregular", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row: 3, column: 4}
spacing = {row: 26.01, column: 36.01}
offset = {x: 24.94, y: 16.79, z: 20.02}
well = {shape: "circular", depth: 17.53, diameter: 22.73, totalLiquidVolume: 6.9}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

24 Well Plate Corning

metadata = {displayName: "Corning 24 Well Plate", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "wellPlate", tags=["SBS", "microplate", "3.4", "mL", "24 wells"]}
brand = {brand: "corning", brandId: ["3337", "3524", "3526", "3527", "3473", "3738", "3987"]}
dimensions = {overallLength: 127.76, overallWidth: 85.47, overallHeight: 20.27}
parameters = {format: "irregular", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row: 4, column: 6}
spacing = {row: 19.3, column: 19.3}
offset = {x: 17.48, y: 19.3, z: 20.27}
well = {shape: "circular", depth: 17.40, diameter: 16.26, totalLiquidVolume: 3.4}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

48 Well Plate Corning

metadata = {displayName: "Corning 48 Well Plate", displayVolumeUnits: "mL", displayLengthUnits: "mm", displayCategory: "wellPlate", tags=["SBS", "microplate", "1.6", "mL", "48 wells"]}
brand = {brand: "corning", brandId: ["3548"]}
dimensions = {overallLength: 127.76, overallWidth: 85.47, overallHeight: 20.02}
parameters = {format: "irregular", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row: 6, column: 8}
spacing = {row: 13.08, column: 13.08}
offset = {x: 18.16, y: 10.08, z: 20.02}
well = {shape: "circular", depth: 17.40, diameter: 11.56, totalLiquidVolume: 1.6}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

384 Well Plate Corning

metadata = {displayName: "Corning 384 Well Plate", displayVolumeUnits: "uL", displayLengthUnits: "mm", displayCategory: "wellPlate", tags=["SBS", "microplate", "112", "uL", "384 wells"]}
brand = {brand: "corning", brandId: ["3640", "3662","3680", "3700", "3701", "3702"]}
dimensions = {overallLength: 127.76, overallWidth: 85.47, overallHeight: 14.22}
parameters = {format: "384Standard", isTiprack: false, isMagneticModuleCompatible: false}
grid = {row: 16, column: 24}
spacing = {row: 4.5, column: 4.5}
offset = {x: 12.12, y: 8.99, z: 14.22}
well = {shape: "circular", depth: 11.43, diameter: 3.63, totalLiquidVolume: 112}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

GEB tiprack 10ul (Opentrons)

metadata = {displayName: "Opentrons GEB 10uL Tiprack", displayVolumeUnits: "uL", displayLengthUnits: "mm", displayCategory: "tiprack", tags: ["GEB", "tiprack", "10uL", "Opentrons"]}
brand = {brand: "Opentrons"}
dimensions = {overallLength: 127.75, overallWidth: 85.5, overallHeight: 52.25}
parameters = {format: "96Standard", isTiprack: true, isMagneticModuleCompatible: false, tipLength: 39.2}
grid = {row:8, column: 12}
spacing = {row: 9, column: 9}
offset = {x: 14.375, y: 11.250, z: 56.25}
well = {shape: "circular", depth: 0, diameter: 3.46, totalLiquidVolume: 10}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

GEB tiprack 1000ul (Opentrons)

metadata = {displayName: "Opentrons GEB 1000uL Tiprack", displayVolumeUnits: "uL", displayLengthUnits: "mm", displayCategory: "tiprack", tags: ["GEB", "tiprack", "1000uL", "Opentrons"]}
brand = {brand: "Opentrons"}
dimensions = {overallLength: 127.75, overallWidth: 85.5, overallHeight: 100.25}
parameters = {format: "96Standard", isTiprack: true, isMagneticModuleCompatible: false, tipLength: 87.9}
grid = {row:8, column: 12}
spacing = {row: 9, column: 9}
offset = {x: 14.2, y: 11.2, z: 100.25}
well = {shape: "circular", depth: 0, diameter: 7.46, totalLiquidVolume: 1000}
input = {brand, dimensions, well, metadata, spacing, grid, offset, parameters}
def = sharedData.createRegularLabware(input)

review requests

Pls test on a robot if you can by the following:

  1. Kill main server
from opentrons import protocol_api, hardware_control, types
import asyncio
ctx = protocol_api.ProtocolContext()
l = asyncio.get_event_loop()
api = l.run_until_complete(hardware_control.API.build_hardware_controller(force=True))
ad = hardware_control.adapters.SynchronousAdapter(api)
ctx.connect(ad)
labware = ctx.load_labware_by_name(LABWARE NAME, SLOT)
pip = ctx.load_instrument(’p300_single’, types.Mount.LEFT (or right) )
pip.move_to(labware.wells()[0].top())

@btmorr
Copy link
Contributor

btmorr commented Nov 20, 2018

@IanLondon could you look into what ramifications the rename would have on PD? Specifically, would it make it so a protocol made in a previous version will no longer load correctly? No longer run correctly? Any other weirdness?

Copy link
Contributor

@btmorr btmorr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a few questions about the data, but they're comparatively minor. Could you attach or link the documents where the measurements came from (machine drawings or the like), and include the arguments you passed to the generator functions for record-sake?

@Laura-Danielle Laura-Danielle force-pushed the shared-data_add-tuberacks-trash branch from 1b2059d to bc1fd48 Compare November 23, 2018 15:35
@codecov
Copy link

codecov bot commented Nov 23, 2018

Codecov Report

Merging #2703 into edge will decrease coverage by 0.16%.
The diff coverage is 100%.

Impacted file tree graph

@@            Coverage Diff             @@
##             edge    #2703      +/-   ##
==========================================
- Coverage   51.29%   51.13%   -0.17%     
==========================================
  Files         653      671      +18     
  Lines       17874    18793     +919     
==========================================
+ Hits         9169     9609     +440     
- Misses       8705     9184     +479
Impacted Files Coverage Δ
shared-data/js/labwareTools/index.js 92.59% <100%> (+0.13%) ⬆️
...r/src/step-generation/aspirateUpdateLiquidState.js 72.72% <0%> (-27.28%) ⬇️
...ol-designer/src/file-data/selectors/fileCreator.js 28.12% <0%> (-1.29%) ⬇️
...steplist/formLevel/stepFormToArgs/mixFormToArgs.js 4.34% <0%> (-0.92%) ⬇️
...formLevel/stepFormToArgs/transferLikeFormToArgs.js 3.37% <0%> (-0.02%) ⬇️
...tocol-designer/src/components/steplist/StepItem.js 0% <0%> (ø) ⬆️
...r/src/steplist/formLevel/getDefaultsForStepType.js 0% <0%> (ø) ⬆️
...designer/src/components/StepEditForm/formFields.js 0% <0%> (ø) ⬆️
...signer/src/components/modals/NewFileModal/index.js 0% <0%> (ø) ⬆️
...omponents/RobotSettings/UpdateRobot/VersionList.js 0% <0%> (ø) ⬆️
... and 42 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 7fe3f0f...1affe1e. Read the comment docs.

Copy link
Contributor

@IanLondon IanLondon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the labware rename breaks tube racks in old PD protocols and would not allow new PD protocols (this PR) to run on the robot if they use tube racks (see my rambling comment)

@@ -37,12 +37,12 @@ const hardcodedLabware = {
['opentrons-aluminum-block-PCR-strips-200ul', 'Aluminum Block - 0.2mL PCR Strips'],
],
'Tube Rack': [
['opentrons-tuberack-1.5ml-eppendorf', '1.5mL Tube Rack (4-in-1 Rack)'],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

doing this name change will break existing protocols that our beta users have made in an ugly way (if the protocol uses any of these tuberacks),

it also makes it so protocols using tube racks won't run on the robot because these names don't work with labware.load in Python - as it is now, I think you'd get "ValueError: container not found in default-containers.json" on upload

If we wanted to support these new names now, we could do a migration so that while loading a file, PD swaps the old names to the new names. And we'd also have to make PD translate back to 'opentrons-tuberack-15ml' style name when it saves the file, so that the JSON executor in Python can put that into labware.load

But it seems messy. I think I'd rather do the name change all at once when we move to definitions2/ and have the JSON definitions embedded in the protocols. Once we get to that point, the labware names in JSON protocols no longer need to reference a key in default-containers.json, so it's easier to change the names (they might only have nicknames and no "load name" in the commands part, and in the PD-specific data they would have a "load name" referencing the definitions2/ file name? maybe)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That sounds fine to me, Ben had wanted to maybe change the names to make transitioning easier. But it seems like that might cause us to have to do more upfront work and thus defeat the purpose of attempting to change the names earlier

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with doing this in a way that is less painful to PD users

@Laura-Danielle Laura-Danielle force-pushed the shared-data_add-tuberacks-trash branch from cdcebe1 to accb263 Compare December 5, 2018 18:20
Copy link
Contributor

@IanLondon IanLondon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Did not test on robot

Copy link
Contributor

@btmorr btmorr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📻

Copy link
Member

@sfoster1 sfoster1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I hate to do it to you but can we take the opportunity now to lowercase the filenames and load names? @IanLondon is right, it's kind of inconsistent and the names are so long that getting the capitalization right is annoying even for us now doing testing.

@sfoster1
Copy link
Member

Names are better now but IMO we should still think about changing the python load labware functions to lowercase everything

@Laura-Danielle Laura-Danielle merged commit 9737196 into edge Dec 10, 2018
@Laura-Danielle Laura-Danielle deleted the shared-data_add-tuberacks-trash branch December 10, 2018 17:38
b-cooper added a commit that referenced this pull request Dec 13, 2018
* refactor(components): remove old clickOutside HoC (#2664)

Closes #2590

* refactor(shared-data): Modify z-height logic and docs for labware designer (#2670)

* refactor(shared-data): Modify z-height logic and docs for labware designer

* feat(protocol-designer): liquid placement modal performance boost (#2661)

Move liquid placement modal to use new abstraction, SelectableLabware, and mirror the changes that
went into the performance improvements of the WellSelectionModal.  Also, rename the SelectablePlate
component and container to HighlightableLabware as it is now only being used in the LabwareOnDeck
compound and is neither hoverable, nor selectable.

Closes #2557

* feat(protocol-designer): disconnect well selection modal from hovered step state (#2662)

Well selection modal well contents are now only correlated with the currently selected step (the one
being edited)

Closes #2558

* refactor(protocol-designer): change StepType from number to string (#2666)

* uses UUID for steps
* update step reducer tests to use string IDs not numbers

Closes #2588

* build(travis): Refactor build to use stages (#2668)

* build(app-shell): Add publisherName to electron-builder windows config (#2677)

* ci(travis): Move flow typechecking to separate job in test stage (#2683)

* refactor(protocol-designer): unite delete labware and handleFormChange logic (#2680)

There was some unecessary duplication of concerns between handling unsaved form changes and handling
deletion of labware in all saved forms. This addition creates a function that can be used by both
cases, to unite the logic into one source of truth.

Closes #2657

* fix(api): re-position p1000 droptip/blowout positions (#2681)

* fix(api): re-position p1000 droptip/blowout positions to better handle tip variance

* restores p1000_single_v1 positions to previous API values

* perf(api): Decrease plunger motor max speed by 20% (#2682)

* feat(api): Add 1.5ml tuberack to old labware definition section (#2679)

* refactor(api): more functions use hc (#2675)

* refactor(api): Move smoothie update into smoothie driver

This makes it easier to use hardware control instead of the robot in main and is
where the functionality should have been in the first place.

Note that this doesn’t currently apply to the update server.

* refactor(api): Add a fixture to test with both new and old apis

By using the new old_and_new_client fixture instead of either async_client or
test_client and building a server instance directly, tests can now check both
the old and new versions of the API.

old_and_new_client is a parameterized fixture that pytest will automatically run
once with each parameter, resetting the globals to the correct version.

In addition, the globals in opentrons/__init__ are now defined such that they
can be reset to a different API version by a function call. This has to be used
quite carefully since it will only reset the global instances themselves, not
copies interned elsewhere, but it’s quite useful for this testing purpose.

* refactor(api): Change modules to work with control endpoints

We needed the old and new modules to look a bit more alike, and now can get
attached modules and module info from the run app while using hardware_control.

* refactor(api): Pull light control fully into gpio driver

Previously it lived an uncomfortable life half in robot and half in gpio. Since
lights aren’t controlled by smoothie, robot is a bad place for them (but the
calls remain there for back compatibility).

* refactor(api): Make servers use injected hw and new api if ff set

The RPC and HTTP servers (to a large but not complete extent) and the system as
a whole now rely on an injected hardware instance for talking to hardware.

This does not extend to deck calibration, protocol sessions (including labware
calibration), or testing tools.

In addition, there’s work done on the tests so that tests can more easily run on
both versions of the api while relying on simple fixtures; async_client and
main_router and the things that depend on them, for instance, now will run on
both apis unless marked otherwise.

Many small additions have been made to both the new and old APIs to get them to
work a bit more like each other to make the logic necessary in dependent systems
like the servers to be a little more similar between versions.

* refactor(api): add ability to override critical point in moves and get position

This is needed for the move endpoint because it makes it a lot easier to move
pipettes to a change pipette position guaranteed to neither be too high nor too low.

Closes #2245

* feat(protocol-designer): use tip max vol, not pipette max vol (#2656)

* aspirate/consolidate/transfer/distribute use smallest of (tip max volume, pipette max volume)
* added 200uL Tiprack to PD as an option

Closes #2160

* chore(react): upgrade react to v16.6.3 (#2687)

* feat(protocol-designer): allow user to set touch-tip offset (#2691)

* refactor tip offset components to allow them to also work with touch tip
* add new fields for forms and to step-generation command creator args to allow touch-tip offsets
* rename fields used only by mix to have mix_ prefix
* refactor field types

Closes #2540

* docs(api): Add instructions to set up API locally (#2699)

There have been several customer questions about how to use the API locally to test protocols. While
there is still not a good workflow, these instructions should help.

* feat(protocol-designer): make settings tab always active (#2700)

Closes #2697

* refactor(protocol-designer): remove activeModals selector (#2701)

Closes #2592

* feat(protocol-designer): disambiguate left/right pipette names when they match (#2698)

Closes #2078

* refactor(app): Update app before robot (#2685)

* feat(api): Adds pipette models v1.4 to robot config (#2689)

* feat(api): Adds pipette models v1.4 to robot config

* shift p10-multi blowout position up 1.5mm

* fixed mistake in p1000 v1.4 blow-out position

* adds v1.4 to pipette barcoding scanning tool

* refactor(api): Use modules in protocol api (#2702)

* refactor(api): Use modules in protocol api

There are now ModuleContexts in protocol_api/contexts.py that expose the module
API. The protocol API also has a new workflow for adding labware to modules:

- create a module with ProtocolContext.load_module()
- call module.load_labware[_by_name]() to load the labware

This avoids the shared=True functionality that was only used for modules but was
designed to be super generic.

Modules also now have their own specs file that defines their geometry,
including the offsets from the deck to their labware and their overall shape.

In addition, fix some minor bugs:
- axis maxima bumped by +0.05mm for all axes to avoid floating point precision
problems when positions are run through deck transform
- hardware_control SynchronousAdapter needs to actually return the results of
coroutines it executes
- Reset the protocol context location cache after homing

feature(api): Add magnetic module compatiblity to labware schema

Labware now has an extra couple of parameters. isMagneticModuleCompatible is a
bool indicating whether the labware can be easily used by a magdeck;
magneticModuleEngageHeight is the height to raise the magnets for that piece of
labware. If a labware that is not compatible is loaded onto a magdeck, you get a
warning and must explicitly specify the magnet height.

* Fix failing tests

* docs(api): Fix incorrect labels for rows and columns in labware docs (#2710)

* docs: Correct the link for changing robot gantry speed (#2711)

* chore(release): 3.6.0-beta.1 (#2724)

* refactor(app): Remove padding from wifi connect form (#2730)

* refactor(protocol-designer): rename selectors to start with "get" (#2720)

Closes #2591

* feat(protocol-designer): make multichannel substeps collapsed by default (#2729)

Closes #2678

* feat(protocol-designer): add tooltip to advanced settings icon (#2727)

Closes #2706

* feat(protocol-designer): remove label from 200ul/300ul tiprack image (#2722)

Closes #2704

* fix(api): Fix the flaky tempdeck test (#2725)

* fix(api): Fix the flaky tempdeck test

The tempdeck driver, when it fails, will sleep and try again. When we’re testing
that, we need to wait a bit - since it’s in a thread - before checking the output.

* refactor(app): Add update in progress and restart screens (#2728)

* refactor(shared-data): rename slot width/height constants (#2723)

use separate constants when dealing with robot coordinate system (eg in labwareTools) versus when rendering deck/labware in SVG coordinates

Closes #2535

* refactor(app): Add app update message and release notes toggle (#2738)

* fix(shared-data): fix total-liquid-volume of opentrons-tuberack-50ml (#2744)

Closes #2743

* chore(release): 3.6.0 (#2746)

* feat(protocol-designer): allow user to re-enable dismissed hints (#2726)

Closes #2652

* feat(protocol-designer): highlight tips per substep (#2716)

Closes #2537

* feat(protocol-designer): drag and drop step reordering (#2714)

Add drag and drop functionality allowing users to arbitrarily reorder their steps in the steplist.

Closes #2654

* fix(protocol-designer): fix missing disposal volume in new distribute forms (#2733)

Closes #2705

* feat(protocol-designer): remove option of tiprack-1000ul-chem from pd (#2745)

* feat(protocol-designer): new protocol modal defaults and visual updates (#2739)

remove null selection for pipette models from new file modal. Also condense styles to clean up
visual space.

Closes #2721

* feat(protocol-designer): remove delay from advanced settings of all step types (#2731)

Closes #2579

* feat(protocol-designer): place tipracks on protocol creation (#2750)

By default, when a user creates a protocol, one tip rack for each given mount should be placed on
the deck.

Closes #1327

* new p10s function added to config file (#2774)

* fix(api): new p10s function added to config file

Due to inaccuracy of the old function, this new function was calculated based on testing several pipettes. The function has been tested on the scale and the robot.

* feat(protocol-designer): show file created and modified date (#2754)

* make metadata be a Formik form; remove unsaved metadata fields from redux

Closes #1623

* chore(release): 3.6.1 (#2780)

*  feat(protocol-designer): implement duplicate step (#2715)

* feat(protocol-designer): implement duplicate step

Right click on a step in the step list and you now have the option to duplicate it or delete it.

* feat(protocol-designer): standardize blowout and disposal volume destinations (#2732)

Flesh out differences in options and implementation of blowout destination (disposal volume and
otherwise) across Transfer, Consolidate, Distribute, and Mix type steps.

Closes #1989

*  refactor(step-generation): getNextRobotStateAndWarnings and use in aspirate (#2747)

In an effort to consolidate the logic in step generation that calculates the next robotState given a
command, this adds a function called getNextRobotStateAndWarnings. Eventually this will be used in
all command creators to generate the next robotState given StepArgs. This takes the first step by
migrating the aspirate commandCreator from aspirateUpdateLiquidState to the new
getNextRobotStateAndWarnings

Closes #2734

* feat(protocol-designer): enable sharing tip racks between pipettes (#2753)

* feat(protocol-designer): scroll to top of page when step created/selected (#2785)

* fix(protocol-designer): fix changeTip once bug in distribute step (#2784)

Closes #2748

* fix(protocol-designer): finish implementing flow rate in PD (#2782)

Closes #2773

* fix(protocol-designer): fix when add liquid hint is shown (#2787)

Closes #2777

* feat(protocol-designer): use pipette min vol as default/recommended disposal volume (#2788)

Closes #2777

* fix(protocol-designer): fix regression of #2370 (#2791)

* feat(api): p10 behavior feature flag (#2794)

This moves the P10 aspiration changes previously introduced in the config to code behind feature flag.

This reverts commit 9c5e0a2.

The revert is because shipping this change might compromise users’ science
efforts if their aspiration volumes change without sufficiently notifying them.
To prevent behavior changing in unexpected ways that
has bad effects on science, it’s now behind a feature flag that is off by
default.

Closes #2792

* refactor(app): Simplify upgrade/downgrade modal render logic (#2751)

* fix(protocol-designer): fix distribute aspirate touchtip offset (#2795)

* fix(protocol-designer): fix bug where new protocol w 1 pipette deleted fixedTrash (#2797)

* feat(shared-data): Add more new labware definitions to shared-data (#2703)

* fix(protocol-designer): fix swap pipettes button dispatch (#2798)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
extra-large labware shared data Affects the `shared-data` project
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants