import { readBoolean, readInteger, readNumber, readNumberList, readOptionalString, readString, readStringList, } from './builderReadUtils' import { readPlateFormat } from '../components/WellPlate.geometry' import { getBioTemplatePresetInfo } from './presets' import type { CreateElisaAssayCollectionOptions, CreateFlowCytometryAssayCollectionOptions, CreateLcmsBatchCollectionOptions, CreateQpcrExpressionCollectionOptions, CreateQpcrPlateTemplateOptions, CreateSamplePrepTemplateOptions, CreateTargetedMetabolomicsCollectionOptions, CreateWellPlateScreenCollectionOptions, CreateWesternBlotAssayCollectionOptions, TemplatePresetId, } from './types' export type BioTemplateControlValues = Record /** @deprecated Scheduled for removal from the core SDK in MINT 1.4; the biology templates move to a dedicated package or the owning plugins. */ export function bioTemplatePresetControlValuesToOptions( name: 'wellplate-screen', values: BioTemplateControlValues ): CreateWellPlateScreenCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: 'qpcr-expression', values: BioTemplateControlValues ): CreateQpcrExpressionCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: 'lcms-batch', values: BioTemplateControlValues ): CreateLcmsBatchCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: 'targeted-metabolomics', values: BioTemplateControlValues ): CreateTargetedMetabolomicsCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: 'elisa-assay', values: BioTemplateControlValues ): CreateElisaAssayCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: 'flow-cytometry-assay', values: BioTemplateControlValues ): CreateFlowCytometryAssayCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: 'western-blot-assay', values: BioTemplateControlValues ): CreateWesternBlotAssayCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: TemplatePresetId | string, values: BioTemplateControlValues ): | CreateWellPlateScreenCollectionOptions | CreateQpcrExpressionCollectionOptions | CreateLcmsBatchCollectionOptions | CreateTargetedMetabolomicsCollectionOptions | CreateElisaAssayCollectionOptions | CreateFlowCytometryAssayCollectionOptions | CreateWesternBlotAssayCollectionOptions export function bioTemplatePresetControlValuesToOptions( name: TemplatePresetId | string, values: BioTemplateControlValues ): | CreateWellPlateScreenCollectionOptions | CreateQpcrExpressionCollectionOptions | CreateLcmsBatchCollectionOptions | CreateTargetedMetabolomicsCollectionOptions | CreateElisaAssayCollectionOptions | CreateFlowCytometryAssayCollectionOptions | CreateWesternBlotAssayCollectionOptions { const preset = getBioTemplatePresetInfo(name) if (!preset) { throw new Error(`Unknown template preset '${name}'.`) } if (preset.name === 'wellplate-screen') { return { samples: readStringList(values.sampleNames, ['Control', 'Treatment']), plateName: readString(values.plateName, 'Screen plate'), plateFormat: readPlateFormat(values.plateFormat, 96), unit: readString(values.unit, 'uM'), replicates: readInteger(values.replicates, 3), } } if (preset.name === 'qpcr-expression') { return { samples: readStringList(values.sampleNames, ['Control', 'Treatment']), targets: readStringList(values.targets, ['ACTB', 'GAPDH']), chemistry: readString(values.chemistry, 'sybr') as CreateQpcrPlateTemplateOptions['chemistry'], format: readPlateFormat(values.plateFormat, 96), includeNoTemplateControls: readBoolean(values.includeNoTemplateControls, true), replicates: readInteger(values.replicates, 3), instrument: readOptionalString(values.instrument), } } if (preset.name === 'lcms-batch') { return { samples: readStringList(values.sampleNames, ['S001', 'S002']), features: readStringList(values.featureNames, ['Glucose', 'Lactate']), instrument: readString(values.instrument, 'LC-MS'), method: readString(values.method, 'Default method'), includeQc: readBoolean(values.includeQc, true), } } if (preset.name === 'targeted-metabolomics') { return { samples: readStringList(values.sampleNames, ['S001', 'S002']), metabolites: readStringList(values.metaboliteNames, ['Glucose', 'Lactate', 'Pyruvate']), internalStandards: readStringList( values.internalStandards, ['Stable isotope internal standard mix'], ), standardConcentrations: readNumberList(values.standardConcentrations, [0.1, 1, 10, 100]), concentrationUnit: readString(values.concentrationUnit, 'uM'), responseUnit: readString(values.responseUnit, 'peak area ratio'), calibrationAnalyte: readOptionalString(values.calibrationAnalyte), instrument: readString(values.instrument, 'LC-MS'), method: readString(values.method, 'Targeted metabolomics'), prepType: readString(values.prepType, 'extraction') as CreateSamplePrepTemplateOptions['prepType'], outputVolume: readNumber(values.outputVolume, 50), includeQc: readBoolean(values.includeQc, true), } } if (preset.name === 'elisa-assay') { return { samples: readStringList(values.sampleNames, ['Control', 'Treatment']), analyte: readString(values.analyte, 'Analyte'), standardConcentrations: readNumberList(values.standardConcentrations, [1000, 100, 10, 1]), unit: readString(values.unit, 'pg/mL'), responseUnit: readString(values.responseUnit, 'OD450'), plateName: readString(values.plateName, 'ELISA plate'), plateFormat: readPlateFormat(values.plateFormat, 96), } } if (preset.name === 'flow-cytometry-assay') { return { samples: readStringList(values.sampleNames, ['Control', 'Treatment']), markers: readStringList(values.markers, ['CD3', 'CD4', 'CD8']), features: readStringList(values.featureNames, ['CD3+ cells', 'CD4+ cells', 'CD8+ cells']), instrument: readString(values.instrument, 'Flow cytometer'), includeDefaultControls: readBoolean(values.includeDefaultControls, true), } } if (preset.name === 'western-blot-assay') { return { samples: readStringList(values.sampleNames, ['Control', 'Treatment']), targets: readStringList(values.targets, ['Target protein']), loadingControl: readString(values.loadingControl, 'ACTB'), } } throw new Error(`Unknown template preset '${name}'.`) }