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

GPL 963 LCMB pipeline #1337

Merged
merged 18 commits into from
Jul 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 14 additions & 108 deletions .tours/lcmb.tour
Original file line number Diff line number Diff line change
Expand Up @@ -4,139 +4,45 @@
"steps": [
{
"title": "Introduction",
"description": "The current implementation of the LCMB pipeline mostly reuses the WGS and ISC pipelines.\n\nIt begins in SS with the SS making a \"Limber-Htp - LCMB\" submission on an LB Cherrypick plate,\nthis generates requests with the limber_lcmb request type.\n\nValid library types are:\n'Standard' (Probably don't want to keep this one in future)\n'Chromium single cell CNV'"
"description": "TODO: check library types. The LCMB pipeline has similarities with parts of the WGS and ISC pipelines.\n\nIt begins in SS with the SS making a \"Limber-Htp - LCMB\" submission on an LCMB Cherrypick plate,\nthis generates requests with the limber_lcmb request type.\n\nValid library types are:\n'LCMB'\n'Chromium single cell CNV'"
},
{
"file": "config/pipelines/high_throughput_wgs.yml",
"description": "So We start here, in the WGS Pipeline.\n\nFor more information about how these pipelines are configured see the [pipeline documentation](https://github.com/sanger/limber/blob/HEAD/./docs/configuring_new_pipelines.md)\nor the documentation [for pipeline yaml files](https://github.com/sanger/limber/blob/HEAD/./docs/pipelines_yaml_files.md)\n",
"pattern": "^[^\\S\\n]*WGS: # Top of the pipeline \\(Library Prep\\)"
"file": "config/pipelines/high_throughput_lcmb.yml",
"description": "This is the configuration file for the LCMB Pipeline.\n\nFor more information about how these pipelines are configured see the [pipeline documentation](https://github.com/sanger/limber/blob/HEAD/./docs/configuring_new_pipelines.md)\nor the documentation [for pipeline yaml files](https://github.com/sanger/limber/blob/HEAD/./docs/pipelines_yaml_files.md)\n",
"pattern": "^[^\\S\\n]*LCMB: # Top of the pipeline \\(Library Prep\\)"
},
{
"file": "config/pipelines/high_throughput_wgs.yml",
"description": "Here we associate the limber_lcmb pipeline with the this set of plate transitions,\nYou'll notice this is share with WGS and LCMB",
"file": "config/pipelines/high_throughput_lcmb.yml",
"description": "Here we associate the limber_lcmb pipeline with a set of plate transitions",
"pattern": "^[^\\S\\n]*- limber_lcmb"
},
{
"file": "config/pipelines/high_throughput_wgs.yml",
"file": "config/pipelines/high_throughput_lcmb.yml",
"selection": {
"start": {
"line": 11,
"character": 1
},
"end": {
"line": 15,
"character": 30
}
},
"description": "And here are the steps, that take us up to the LB Lib PCR-XP.\nMost of these are simple stamps, but:\n\n- LB Lib PCR is the tag plate\n- LB Lib PCR-XP has the qc performed on it\n\nThen the customer makes a decision based on the QC... either..."
},
{
"file": "config/purposes/isc_bottom.yml",
"selection": {
"start": {
"line": 41,
"character": 1
},
"end": {
"line": 55,
"line": 14,
"character": 1
}
},
"description": "We go into these tubes, misleadingly grouped in the ISC pipeline; these should probably be in their own yaml file.\n\nThis allows the lab team to upload their robot driver CSV to configure custom pooling. The second tube is\njust a basic transfer during which the lab team normalize the tube.\n\nThe SSR doesn't need to be involved in this route, and we don't actually generate a request for this bit.\nThis is the only LCMB specific behaviour.\n\nFor information about purposes/*.yml files, [check here](https://github.com/sanger/limber/blob/HEAD/./purposes_yaml_files.md)"
},
{
"file": "config/pipelines/high_throughput_custom_pool.yml",
"selection": {
"start": {
"line": 4,
"character": 23
},
"end": {
"line": 4,
"line": 16,
"character": 34
}
},
"description": "And the pipeline flow is configure here.\n\nYou'll notice this triggers when the limber_lcmb workflow\nhas been passed.\n\nWe don't generate a new request to handle these."
"description": "And here are the steps that take us up to the LCMB Lib PCR-XP.\nMost of these are simple stamps, but:\n\n- LCMB Lib PCR is the tag plate\n- LCMB Lib PCR-XP has the qc performed on it\n\nThen we use custom pooling to make the tubes:"
},
{
"file": "config/pipelines/high_throughput_isc.yml",
"file": "config/pipelines/high_throughput_lcmb.yml",
"selection": {
"start": {
"line": 2,
"line": 23,
"character": 1
},
"end": {
"line": 2,
"character": 5
}
},
"description": "The other option is for the customer to enter the bottom half of the ISC pipeline.\nIt is possible for the same sample to enter both the WGS *and* ISC pipelines.\n\nThis decision is triggered by an SSR making a \"Limber-Htp - ReISC - ...\" submission,\nwhere ... depends on the sequencing wanted. This is currently identical to standard\nReISC submissions (Re in this case is short for repeat, and is usually used in cases\nwhere the customer wants another round of ISC, has changed their mind, or wants ISC\nperformed on libraries previouisly made for WGS)"
},
{
"file": "config/pipelines/high_throughput_isc.yml",
"selection": {
"start": {
"line": 6,
"character": 2
},
"end": {
"line": 6,
"character": 61
}
},
"description": "The ReISC submisison has the limber_reisc request type, and potentially\nlibrary types of Agilent Pulldown or Twist Pulldown"
},
{
"file": "config/pipelines/high_throughput_isc.yml",
"selection": {
"start": {
"line": 14,
"character": 3
},
"end": {
"line": 18,
"character": 30
}
},
"description": ""
},
{
"file": "config/pipelines/high_throughput_isc.yml",
"selection": {
"start": {
"line": 19,
"character": 4
},
"end": {
"line": 24,
"character": 39
}
},
"description": "And these are the steps it'll actually go through:\n\nWe begin with the \"LB Lib PCR-XP\" plate that we finished on,\nand then pool in the \"LB Lib PrePool\" plate.\n\nThis pooling is determined during submission, and groups\nsamples together prior to pulldown.\n\nSamples can go through two rounds of pooling in this pipeline,\nso may be pooled at 8 plex here, then 96 plex at the end of the pipeline."
},
{
"file": "config/pipelines/high_throughput_isc.yml",
"description": "The LB Hyb plate is also a bit special, and:\n\n1) Lets the user know what bait library to use\n2) Records the use of the bait library against the aliquot",
"pattern": "^[^\\S\\n]*LB Lib PrePool: LB Hyb"
},
{
"file": "config/pipelines/high_throughput_isc.yml",
"description": "Finally we pool the samples for the final time, according to the submission.\nIn practice, last ime I checked, this is actually usually done into a tube rack, \nrather than a plate.",
"line": 24
},
{
"file": "config/pipelines/high_throughput_isc.yml",
"selection": {
"start": {
"line": 25,
"character": 1
},
"end": {
"line": 33,
"character": 1
"character": 38
}
},
"description": "Then these pools are transfered into tubes and normalized, very similar to the steps at the end of\nWGS"
"description": "Here we use custom pooling to create the LCMB Lib Pool tube and then normalise it ready for sequencing."
},
{
"file": "docs/configuring_new_pipelines.md",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<%= CSV.generate_line [
'Source Barcode',
'Sample Name',
'Well',
'Concentration (ng/ul)',
'Sequencescape Sample ID',
'Shotgun?',
'ISC?'
], row_sep: "" %>
<% @plate.wells_in_columns.each_with_index do |well, well_index| %>
<% unless well.empty? || @ancestor_plate.blank? %>
<%= CSV.generate_line [
@ancestor_plate.human_barcode,
well.aliquots.first.sample.name,
well.location,
well.latest_concentration&.value,
well.aliquots.first.sample.sanger_sample_id,
nil,
nil
], row_sep: "" %>
<% end %>
<% end %>
4 changes: 4 additions & 0 deletions config/exports/exports.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,7 @@ bioscan_mbrave:
file_extension: 'tsv'
filename:
include_barcode: true
lcmb_pcr_xp_concentrations_for_custom_pooling:
csv: lcmb_pcr_xp_concentrations_for_custom_pooling
plate_includes: wells.qc_results,wells.aliquots,wells.aliquots.sample
ancestor_purpose: LCMB Cherrypick
18 changes: 18 additions & 0 deletions config/pipelines/high_throughput_lcmb.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
# LCMB pipeline configuration
LCMB: # Top of the pipeline (Library Prep)
pipeline_group: LCMB
filters:
request_type_key:
- limber_lcmb
library_type:
# TODO: confirm with NPG - same as 'standard'
- LCMB
library_pass:
- LCMB Lib PCR-XP
relationships:
LCMB Cherrypick: LCMB End Prep
LCMB End Prep: LCMB Lib PCR
LCMB Lib PCR: LCMB Lib PCR-XP
LCMB Lib PCR-XP: LCMB Custom Pool
LCMB Custom Pool: LCMB Custom Pool Norm
1 change: 0 additions & 1 deletion config/pipelines/high_throughput_wgs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ WGS: # Top of the pipeline (Library Prep)
filters:
request_type_key:
- limber_wgs
- limber_lcmb
- limber_rnaa
library_type: Standard
library_pass: LB Lib PCR-XP
Expand Down
43 changes: 43 additions & 0 deletions config/purposes/lcmb.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
LCMB Cherrypick:
:asset_type: plate
:stock_plate: true
:cherrypickable_target: true
:input_plate: true
:presenter_class: Presenters::StockPlatePresenter
LCMB End Prep:
:asset_type: plate
LCMB Lib PCR:
:asset_type: plate
:presenter_class: Presenters::PcrPresenter
:creator_class: LabwareCreators::TaggedPlate
# TODO: do we need this limitation (from WGS)?
# warnings:
# pcr_cycles_not_in:
# - 6
:tag_layout_templates:
- pWGS UDI tag layout v2 A
- pWGS UDI tag layout v2 B
- pWGS UDI tag layout v2 C
- pWGS UDI tag layout v2 D
LCMB Lib PCR-XP:
:asset_type: plate
:default_printer_type: :plate_b
andrewsparkes marked this conversation as resolved.
Show resolved Hide resolved
:label_template: plate_xp
:file_links:
- name: 'Download Concentration (ng/ul) CSV for Custom Pooling'
id: lcmb_pcr_xp_concentrations_for_custom_pooling
LCMB Custom Pool:
:asset_type: tube
:target: StockMultiplexedLibraryTube
:type: IlluminaHtp::InitialStockTubePurpose
:creator_class: LabwareCreators::CustomPooledTubes
:presenter_class: Presenters::SimpleTubePresenter
:default_printer_type: :tube
LCMB Custom Pool Norm:
:asset_type: tube
:target: MultiplexedLibraryTube
:type: IlluminaHtp::InitialStockTubePurpose
:creator_class: LabwareCreators::TubeFromTube
:presenter_class: Presenters::FinalTubePresenter
:default_printer_type: :tube
99 changes: 99 additions & 0 deletions config/robots.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2940,4 +2940,103 @@
}
}
)

# LCMB Bravo bed verification
# LCMB Cherrypick to LCMB End Prep
# Transfers 1:1
custom_robot(
'bravo-lcmb-cherrypick-to-lcmb-end-prep',
name: 'Bravo LCMB Cherrypick => LCMB End Prep',
beds: {
bed(4).barcode => {
purpose: 'LCMB Cherrypick',
states: ['passed'],
label: 'Bed 4'
},
car('1,4').barcode => {
purpose: 'LCMB End Prep',
states: ['pending'],
label: 'Carousel 1,4',
parent: bed(4).barcode,
target_state: 'started'
}
}
)

# LCMB Bravo bed verification
# Checks LCMB End Prep plate is on deck (alone)
# Requires robot scan so can be checked in next bed verification
custom_robot(
'bravo-lcmb-end-prep',
name: 'Bravo LCMB End Prep',
require_robot: true,
beds: {
bed(7).barcode => {
purpose: 'LCMB End Prep',
states: ['started'],
label: 'Bed 7',
target_state: 'passed'
}
}
)

# LCMB Bravo bed verification
# LCMB End Prep to LCMB Lib PCR
# Transfers 1:1
# Checks same robot used as for previous bed verification ie. LCMB End Prep is in same
# position on same robot as before.
custom_robot(
'bravo-lcmb-end-prep-to-lcmb-lib-pcr',
name: 'Bravo LCMB End Prep => LCMB Lib PCR',
verify_robot: true,
beds: {
bed(7).barcode => {
purpose: 'LCMB End Prep',
states: ['passed'],
label: 'Bed 7'
},
bed(6).barcode => {
purpose: 'LCMB Lib PCR',
states: ['pending'],
label: 'Bed 6',
parent: bed(7).barcode,
target_state: 'passed'
}
}
)

# LCMB Hamilton Star bed verification
# LCMB Lib PCR to LCMB Lib PCR-XP
# Transfers up to 2 pairs of plates at the same time
custom_robot(
'star-96-lcmb-lib-pcr-purification',
name: 'STAR-96 LCMB Lib PCR => LCMB Lib PCR-XP',
verify_robot: false,
beds: {
bed(7).barcode => {
purpose: 'LCMB Lib PCR',
states: ['passed'],
label: 'Bed 7'
},
bed(9).barcode => {
purpose: 'LCMB Lib PCR-XP',
states: ['pending'],
label: 'Bed 9',
parent: bed(7).barcode,
target_state: 'passed'
},
bed(12).barcode => {
purpose: 'LCMB Lib PCR',
states: ['passed'],
label: 'Bed 12'
},
bed(14).barcode => {
purpose: 'LCMB Lib PCR-XP',
states: ['pending'],
label: 'Bed 14',
parent: bed(12).barcode,
target_state: 'passed'
}
}
)
end
Loading
Loading