(define-module (gn data dataset) #:use-module (ice-9 match) #:use-module (ice-9 format) #:use-module (ice-9 iconv) #:use-module (ice-9 receive) #:use-module (ice-9 string-fun) #:use-module (srfi srfi-1) #:use-module (dbi dbi) #:use-module (gn db mysql) #:use-module (gn data genotype) #:use-module (gn data group) #:use-module (gn util convert) #:use-module (web gn-uri) #:use-module (rnrs base) ; for assert #:export ( dataset-name get-bxd-publish-list get-bxd-publish-values-list get-bxd-publish-name-value-dict get-bxd-publish-dataid-name-value-dict )) (define (get-dataset db probesetfreeze-id) (dbi-query db (string-append "select Name,Name2,FullName from ProbeSetFreeze where Id=" (int-to-string probesetfreeze-id) " limit 1;")) (get-row db)) (define (dataset-name db probesetfreeze-id) (assoc-ref (get-dataset db probesetfreeze-id) "Name")) (define (get-dataid-from-publishxrefid id) "Get the internal dataid from publishxref - which is the same as used in the GN2 web interface" (call-with-db (lambda (db) (let [(query (string-append "SELECT Id,PhenotypeId,DataId FROM PublishXRef WHERE Id=" id " AND InbredSetId=1 LIMIT 1"))] (dbi-query db query) (pk (int-to-string (assoc-ref (get-row db) "DataId"))))))) (define (get-bxd-publish-list) (call-with-db (lambda (db) (let [(query "SELECT Id,PhenotypeId,DataId FROM PublishXRef WHERE InbredSetId=1")] (dbi-query db query) (get-rows db '()))))) (define* (get-bxd-publish-values-list dataid #:optional used-for-mapping?) "Returns dict of name values , e.g. [{\"Name\":\"C57BL/6J\",\"value\":9.136},{\"Name\":\"DBA/2J\",\"value\":4.401},{\"Name\":\"BXD9\",\"value\":4.36}, ... used-for-mapping? skips the founders and maybe other unmappable inds. Note, currently unused." (call-with-db (lambda (db) (let [(query (string-append "SELECT Strain.Name, PublishData.value FROM Strain, PublishData WHERE PublishData.Id=" dataid " and Strain.Id=StrainID;"))] (dbi-query db query) (if used-for-mapping? (remove null? (pk (get-rows-apply db (lambda (r) (if (string-contains (assoc-ref r "Name") "BXD") `(("Name" . ,(assoc-ref r "Name")) ("value" . ,(assoc-ref r "value"))) '() ) ;; return empty on no match ) '()))) (get-rows db '()) ))))) (define* (get-bxd-publish-dataid-name-value-dict dataid #:optional used-for-mapping?) "Returns dict of name values, e.g. (((\"C57BL/6J\" . 9.136) (\"DBA/2J\" . 4.401) (\"BXD9\" . 4.36) ... used-for-mapping? skips the founders and maybe other unmappable inds." (call-with-db (lambda (db) (let [(query (string-append "SELECT Strain.Name, PublishData.value FROM Strain, PublishData WHERE PublishData.Id=" dataid " and Strain.Id=StrainID;"))] (dbi-query db query) (if used-for-mapping? (remove null? (pk (get-rows-apply db (lambda (r) (if (string-contains (assoc-ref r "Name") "BXD") `(,(assoc-ref r "Name") . ,(assoc-ref r "value")) '() ) ;; return empty on no match ) '()))) (remove null? (pk (get-rows-apply db (lambda (r) `(,(assoc-ref r "Name") . ,(assoc-ref r "value")) ) '()))) ))))) (define* (get-bxd-publish-name-value-dict id #:optional used-for-mapping?) "Same as above function, but starting from data id" (get-bxd-publish-dataid-name-value-dict (get-dataid-from-publishxrefid id) used-for-mapping?))