import { idFromName } from './builderIdUtils' import { normalizeCalibrationAcceptance, normalizeCalibrationPoint, } from './calibrationNormalizers' import { createTemplateEnvelope } from './templateEnvelopes' import { validateCalibrationCurveData } from './templateValidators' import type { CalibrationCurveTemplate, CalibrationCurveTemplateData, CalibrationPoint, CreateCalibrationCurveTemplateOptions, } from './types' /** @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 createCalibrationCurveTemplate( options: CreateCalibrationCurveTemplateOptions ): CalibrationCurveTemplate { const unit = options.unit ?? 'uM' const points: CalibrationPoint[] = [] let order = 1 if (options.includeBlank !== false) { points.push({ id: 'blank', order, role: 'blank', level: 'Blank', concentration: 0, unit, replicate: 1, include: true, status: 'planned', metadata: {}, }) order += 1 } const standardValues: number[] = [] for (const [index, concentration] of options.concentrations.entries()) { if (typeof concentration !== 'number') { const point = normalizeCalibrationPoint(concentration, unit, order, index) points.push(point) if (point.role === 'standard') standardValues.push(point.concentration) order = Math.max(order, point.order + 1) continue } standardValues.push(concentration) points.push({ id: `std-${index + 1}`, order, role: 'standard', level: `Standard ${index + 1}`, concentration, unit, replicate: 1, include: true, status: 'planned', metadata: {}, }) order += 1 } if (options.includeQc !== false) { const positiveValues = [...standardValues].filter(value => value > 0).sort((a, b) => a - b) const qcValues = positiveValues.length === 0 ? [] : positiveValues[0] === positiveValues[positiveValues.length - 1] ? [positiveValues[0]] : [positiveValues[0], positiveValues[positiveValues.length - 1]] for (const [index, concentration] of qcValues.entries()) { const level = index === 0 ? 'QC low' : 'QC high' points.push({ id: idFromName(level, `qc-${index + 1}`), order, role: 'qc', level, concentration, unit, replicate: 1, include: true, status: 'planned', metadata: {}, }) order += 1 } } const data: CalibrationCurveTemplateData = { analyte: options.analyte ?? 'Analyte', model: options.model ?? 'linear', xUnit: unit, responseUnit: options.responseUnit ?? 'response', points, acceptance: normalizeCalibrationAcceptance(options.acceptance, options.includeBlank !== false), metadata: options.metadata ?? {}, } validateCalibrationCurveData(data) return createTemplateEnvelope('calibration-curve', data, options.metadata ?? {}) }