sanger/sequencescape

View on GitHub
app/models/plate/fluidigm_behaviour.rb

Summary

Maintainability
A
1 hr
Test Coverage
F
31%
# frozen_string_literal: true
module Plate::FluidigmBehaviour
  class FluidigmError < StandardError
  end

  def self.included(base) # rubocop:todo Metrics/MethodLength
    base.class_eval do
      scope :requiring_fluidigm_data,
            -> {
              fluidigm_request_ids = RequestType.where(key: 'pick_to_fluidigm').ids

              joins(
                  [
                    :well_requests_as_target,
                    "LEFT OUTER JOIN events
            ON eventful_id = #{Plate.table_name}.id
            AND eventful_type = \"#{Plate.base_class.name}\"
            AND family = \"update_fluidigm_plate\"
            AND content = \"FLUIDIGM_DATA\""
                  ]
                )
                .includes(:barcodes)
                .where(events: { id: nil }, requests: { request_type_id: fluidigm_request_ids })
                .distinct
            }
    end
  end

  def retrieve_fluidigm_data
    ActiveRecord::Base.transaction do
      fluidigm_data = FluidigmFile::Finder.find(fluidigm_barcode)

      # rubocop:todo Rails/TransactionExitStatement
      return false if fluidigm_data.empty? # Return false if we have no data

      # rubocop:enable Rails/TransactionExitStatement

      apply_fluidigm_data(FluidigmFile.new(fluidigm_data.content))
      return true # rubocop:todo Rails/TransactionExitStatement
    end
  end

  # rubocop:todo Metrics/MethodLength
  def apply_fluidigm_data(fluidigm_file) # rubocop:todo Metrics/AbcSize
    qc_assay = QcAssay.new
    raise FluidigmError, 'File does not match plate' unless fluidigm_file.for_plate?(fluidigm_barcode)

    wells
      .located_at(fluidigm_file.well_locations)
      .include_stock_wells
      .each do |well|
        well.stock_wells.each do |sw|
          gender_markers = fluidigm_file.well_at(well.map_description).gender_markers.join('')
          loci_passed = fluidigm_file.well_at(well.map_description).count
          QcResult.create!(
            [
              {
                asset: sw,
                key: 'gender_markers',
                assay_type: 'FLUIDIGM',
                assay_version: 'v0.1',
                value: gender_markers,
                units: 'bases',
                qc_assay: qc_assay
              },
              {
                asset: sw,
                key: 'loci_passed',
                assay_type: 'FLUIDIGM',
                assay_version: 'v0.1',
                value: loci_passed,
                units: 'bases',
                qc_assay: qc_assay
              }
            ]
          )
        end
      end
    events.updated_fluidigm_plate!('FLUIDIGM_DATA')
  end
  # rubocop:enable Metrics/MethodLength
end