/app/models/broadcast_event/qc_assay.rb

https://github.com/sanger/sequencescape · Ruby · 64 lines · 46 code · 14 blank · 4 comment · 1 complexity · 41eda7b8cfbef3e89e069429407c409c MD5 · raw file

  1. # frozen_string_literal: true
  2. require_dependency 'qc_assay'
  3. # Serializes lab events for the event warehouse
  4. class BroadcastEvent::QcAssay < BroadcastEvent
  5. seed_class ::QcAssay
  6. def self.generate_events(qc_assay)
  7. # A qc_assay is made up of multiple qc_results, which usually have the same assay_type, don't HAVE to.
  8. # We generate an event per assay type, and distinguish between then with properties
  9. qc_assay
  10. .qc_results
  11. .distinct
  12. .pluck(:assay_type, :assay_version)
  13. .map do |assay_type, assay_version|
  14. create!(seed: qc_assay, properties: { assay_type: assay_type, assay_version: assay_version })
  15. end
  16. end
  17. has_subjects(:sample) { |_qc_assay, event| event.samples }
  18. has_subjects(:study) { |_qc_assay, event| event.studies }
  19. has_subjects(:assayed_labware) { |_qc_assay, event| event.assayed_labware }
  20. has_subjects(:stock_plate) { |_qc_assay, event| event.stock_plates }
  21. has_metadata(:lot_number, :lot_number)
  22. has_metadata(:assay_version) { |_qc_assay, event| event.assay_version }
  23. def event_type
  24. "quant_#{assay_type.downcase.gsub(/[^\w]+/, '_')}"
  25. end
  26. def assay_type
  27. properties.fetch(:assay_type, template_result.assay_type)
  28. end
  29. def assay_version
  30. properties.fetch(:assay_version, template_result.assay_version)
  31. end
  32. def template_result
  33. seed.qc_results.first
  34. end
  35. def qc_results
  36. @qc_results || seed.qc_results.where(properties).includes(%i[asset samples studies])
  37. end
  38. def samples
  39. qc_results.flat_map(&:samples).uniq
  40. end
  41. def studies
  42. qc_results.flat_map(&:studies).uniq
  43. end
  44. def assayed_labware
  45. qc_results.flat_map { |qcr| qcr.asset.labware }.uniq
  46. end
  47. def stock_plates
  48. assayed_labware.flat_map(&:original_stock_plates).compact.uniq
  49. end
  50. end