Class: CherrypickTask::ControlLocator
- Inherits:
-
Object
- Object
- CherrypickTask::ControlLocator
- Defined in:
- app/models/cherrypick_task/control_locator.rb
Overview
A cherrypick Batch can source one or more controls from a ControlPlate For the initial destination plate in a batch these controls are distributed (pseudo)randomly across available wells. (Two controls can't occupy the same wells) Subsequent destination plates within the same batch will offset the controls by a fixed amount to ensure destination plates in a batch have different control locations. This is especially important for negative controls, as it allows plate swaps to be identified (the negative control location can be thought of as a fingerprint).
Once all well locations have been used, an new set of random locations will be generated, and the cycle will begin again.
We need to be particularly careful with the offset value, as otherwise we risk reusing wells before the full cycle has been completed. For this reason we select prime numbers that are NOT a factor of the number of available wells.
Constant Summary collapse
- BETWEEN_PLATE_OFFSETS =
A cherrypick batch may contain multiple destination plates. In this case the control wells should be located at different locations on each destination. The positions on the first plate in a batch are determined randomly, and then the locations are advanced by BETWEEN_PLATE_OFFSET for each subsequent plate. This is done to avoid the risk of subsequent plates having the same negative control location, which would reduce the ability to detect plate swaps. WARNING! These needs to be a prime number (which isn't also a factor of the available well size) to avoid re-using wells prematurely. These offsets are prioritised in order. Technically any number that only shares 1 as a common factor with the available well size would work, but we limit ourself to primes to simplify validation.
[53, 59].freeze
Instance Attribute Summary collapse
-
#available_positions ⇒ Object
readonly
Returns the value of attribute available_positions.
-
#batch_id ⇒ Object
readonly
Returns the value of attribute batch_id.
-
#control_source_plate ⇒ Object
readonly
Returns the value of attribute control_source_plate.
-
#num_control_wells ⇒ Object
readonly
Returns the value of attribute num_control_wells.
-
#total_wells ⇒ Object
readonly
Returns the value of attribute total_wells.
-
#wells_to_leave_free ⇒ Object
readonly
Returns the value of attribute wells_to_leave_free.
Instance Method Summary collapse
-
#control_positions(num_plate) ⇒ Array<Integer>
Returns a list with the destination positions for the control wells distributed randomly using batch_id as seed and num_plate to increase position with plates in same batch.
- #handle_incompatible_plates ⇒ Object
-
#initialize(params) ⇒ ControlLocator
constructor
control wells being missed in cDNA quant QC.
Constructor Details
#initialize(params) ⇒ ControlLocator
wells_to_leave_free was originally hardcoded for 96 well plates at 24, in order to avoid
control wells being missed in cDNA quant QC. This requirement was removed in https://github.com/sanger/sequencescape/issues/2967 however I've avoided stripping out the behaviour completely in case controls are used in other pipelines.
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'app/models/cherrypick_task/control_locator.rb', line 52 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
Instance Attribute Details
#available_positions ⇒ Object (readonly)
Returns the value of attribute available_positions.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/cherrypick_task/control_locator.rb', line 32 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
#batch_id ⇒ Object (readonly)
Returns the value of attribute batch_id.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/cherrypick_task/control_locator.rb', line 32 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
#control_source_plate ⇒ Object (readonly)
Returns the value of attribute control_source_plate.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/cherrypick_task/control_locator.rb', line 32 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
#num_control_wells ⇒ Object (readonly)
Returns the value of attribute num_control_wells.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/cherrypick_task/control_locator.rb', line 32 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
#total_wells ⇒ Object (readonly)
Returns the value of attribute total_wells.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/cherrypick_task/control_locator.rb', line 32 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
#wells_to_leave_free ⇒ Object (readonly)
Returns the value of attribute wells_to_leave_free.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/cherrypick_task/control_locator.rb', line 32 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
Instance Method Details
#control_positions(num_plate) ⇒ Array<Integer>
Returns a list with the destination positions for the control wells distributed randomly using batch_id as seed and num_plate to increase position with plates in same batch.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'app/models/cherrypick_task/control_locator.rb', line 70 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |
#handle_incompatible_plates ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'app/models/cherrypick_task/control_locator.rb', line 88 do # NOTE: The following attribute is not required for Microarray Genotyping. # I think this might be broken and suggests that there should be separate classes for project: one for # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping # that doesn't. include ProjectManager::Associations include BudgetDivision::Associations custom_attribute(:project_cost_code, required: true) custom_attribute(:funding_comments) custom_attribute(:collaborators) custom_attribute(:external_funding_source) custom_attribute(:sequencing_budget_cost_centre) custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS) custom_attribute(:gt_committee_tracking_id) before_validation do |record| record.project_cost_code = nil if record.project_cost_code.blank? record.project_funding_model = nil if record.project_funding_model.blank? end end |