;; sample-generator - Clarity 4
;; Mock sample data generator for testing genomic platform
(define-constant ERR-NOT-FOUND (err u100))
(define-constant ERR-INVALID-PARAMS (err u101))
(define-map generated-samples uint
{
sample-type: (string-ascii 50),
data-hash: (buff 64),
generator: principal,
generated-at: uint,
sample-size: uint,
quality-score: uint
}
)
(define-map sample-metadata uint
{
sample-id: uint,
description: (string-utf8 200),
format: (string-ascii 20),
version: uint,
is-validated: bool
}
)
(define-map sample-statistics uint
{
sample-id: uint,
mean-value: uint,
std-deviation: uint,
min-value: uint,
max-value: uint
}
)
(define-map generation-templates uint
{
template-name: (string-utf8 100),
sample-type: (string-ascii 50),
default-size: uint,
parameters: (string-utf8 500),
created-by: principal
}
)
(define-data-var sample-counter uint u0)
(define-data-var template-counter uint u0)
(define-public (generate-sample
(sample-type (string-ascii 50))
(data-hash (buff 64))
(sample-size uint)
(quality-score uint))
(let ((sample-id (+ (var-get sample-counter) u1)))
(asserts! (> sample-size u0) ERR-INVALID-PARAMS)
(asserts! (<= quality-score u100) ERR-INVALID-PARAMS)
(map-set generated-samples sample-id
{
sample-type: sample-type,
data-hash: data-hash,
generator: tx-sender,
generated-at: stacks-block-time,
sample-size: sample-size,
quality-score: quality-score
})
(var-set sample-counter sample-id)
(ok sample-id)))
(define-public (add-sample-metadata
(sample-id uint)
(description (string-utf8 200))
(format (string-ascii 20))
(version uint))
(let ((sample (unwrap! (map-get? generated-samples sample-id) ERR-NOT-FOUND)))
(ok (map-set sample-metadata sample-id
{
sample-id: sample-id,
description: description,
format: format,
version: version,
is-validated: false
}))))
(define-public (record-statistics
(sample-id uint)
(mean-value uint)
(std-deviation uint)
(min-value uint)
(max-value uint))
(let ((sample (unwrap! (map-get? generated-samples sample-id) ERR-NOT-FOUND)))
(ok (map-set sample-statistics sample-id
{
sample-id: sample-id,
mean-value: mean-value,
std-deviation: std-deviation,
min-value: min-value,
max-value: max-value
}))))
(define-public (create-template
(template-name (string-utf8 100))
(sample-type (string-ascii 50))
(default-size uint)
(parameters (string-utf8 500)))
(let ((template-id (+ (var-get template-counter) u1)))
(map-set generation-templates template-id
{
template-name: template-name,
sample-type: sample-type,
default-size: default-size,
parameters: parameters,
created-by: tx-sender
})
(var-set template-counter template-id)
(ok template-id)))
(define-public (validate-sample (sample-id uint))
(let ((metadata (unwrap! (map-get? sample-metadata sample-id) ERR-NOT-FOUND)))
(ok (map-set sample-metadata sample-id
(merge metadata { is-validated: true })))))
(define-read-only (get-sample (sample-id uint))
(ok (map-get? generated-samples sample-id)))
(define-read-only (get-sample-metadata (sample-id uint))
(ok (map-get? sample-metadata sample-id)))
(define-read-only (get-statistics (sample-id uint))
(ok (map-get? sample-statistics sample-id)))
(define-read-only (get-template (template-id uint))
(ok (map-get? generation-templates template-id)))
(define-read-only (validate-principal (p principal))
(principal-destruct? p))
(define-read-only (format-sample-id (sample-id uint))
(ok (int-to-ascii sample-id)))
(define-read-only (parse-sample-id (id-str (string-ascii 20)))
(string-to-uint? id-str))
(define-read-only (get-bitcoin-block)
(ok burn-block-height))