about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gn/data/strains.scm54
-rwxr-xr-xscripts/precompute/list-traits-to-compute.scm27
2 files changed, 46 insertions, 35 deletions
diff --git a/gn/data/strains.scm b/gn/data/strains.scm
index 4a251d4..7854cfe 100644
--- a/gn/data/strains.scm
+++ b/gn/data/strains.scm
@@ -1,20 +1,23 @@
 (define-module (gn data strains)
-  #:use-module (json)
-  #: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 (gn db sparql)
   #:use-module (dbi dbi)
+  #:use-module (gn cache memoize)
   #:use-module (gn data group)
   #:use-module (gn db mysql)
   #:use-module (gn util convert)
+  #:use-module (ice-9 format)
+  #:use-module (ice-9 iconv)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 receive)
+  #:use-module (ice-9 string-fun)
+  #:use-module (json)
   #:use-module (web gn-uri)
 
   #:export (
             strain-id-names
+            is-a-bxd?
+            has-bxd?
             bxd-strain-id-names
+            memo-bxd-strain-id-names
             ))
 
 (define* (strain-id-names inbred-set #:key (used-for-mapping? #t))
@@ -27,20 +30,41 @@ used-for-mapping? will say whether the strains/individuals are used for mapping.
    (lambda (db)
      (dbi-query db (string-append "SELECT StrainId,Strain.Name FROM Strain, StrainXRef WHERE StrainXRef.StrainId = Strain.Id AND StrainXRef.InbredSetId = " (int-to-string inbred-set)
                                   (if used-for-mapping?
-                                      ;; " AND Used_for_mapping='Y'"
+                                      " AND Used_for_mapping='Y'"
                                       "")
                                   " ORDER BY StrainId;"))
       (get-rows-apply db (lambda (r) `(,(assoc-ref r "StrainId") . ,(assoc-ref r "Name"))) '()))))
 
+
+
 (define* (bxd-strain-id-names #:key (used-for-mapping? #f))
   "Return assoc list of tuples of strain id + names. Same as strain-id-names, but just for the BXD
 
 used-for-mapping? will say whether the strains/individuals are used for mapping. Always True, FIXME"
   (filter (lambda (l) l)
-  (map (lambda (l)
-         (let [(id (car l))
-               (name (cdr l))]
-           (if (or (< id 42) (string-contains name "BXD"))
-               l
-               #f))
-         ) (strain-id-names 1 #:used-for-mapping? used-for-mapping?))))
+            (map (lambda (l)
+                   (let [(id (car l))
+                         (name (cdr l))]
+                     (if (or (< id 42) (string-contains name "BXD"))
+                         l
+                         #f))
+                   ) (strain-id-names 1 #:used-for-mapping? used-for-mapping?))))
+
+(define memo-bxd-strain-id-names
+  (memoize bxd-strain-id-names))
+
+(define (is-a-bxd? strain-id)
+  "Is a strain a member of the BXD? For speed we memoize tuples from the DB. Note that we check the DB list, as
+well as the name. This won't work for the parents. We do it this way because the GN table is wrong."
+  (match (assoc strain-id (memo-bxd-strain-id-names))
+    [(id . name) (string-contains name "BXD")]
+    ))
+
+(define (has-bxd? trait-values)
+  "Walk tuples of trait strain-id and value. Check we have at least one BXD. Stops at the first match"
+  (match trait-values
+    [(trait . rest) (match trait
+                      [(strain-id . value) (if (is-a-bxd? strain-id)
+                                               #t
+                                               (has-bxd? rest))])]
+    [() #f]))
diff --git a/scripts/precompute/list-traits-to-compute.scm b/scripts/precompute/list-traits-to-compute.scm
index 1fadb4a..e954b14 100755
--- a/scripts/precompute/list-traits-to-compute.scm
+++ b/scripts/precompute/list-traits-to-compute.scm
@@ -70,25 +70,11 @@ When that is the case we might as well write the phenotype file because we have
              (srfi srfi-1)
              )
 
-(define (is-bxd? trait-values)
-  (display "HEY")
-  (display trait-values)
-  (newline)
-  (match trait-values
-    [(trait . rest) (begin
-                      (display "PARSE")
-                      (display trait)
-                      (match trait
-                        [(strain . value) (if (= strain 5)
-                                              #f
-                                              (is-bxd? rest))])
-                      (newline))]
-    [() #f]))
 
 (call-with-db
  (lambda (db)
    (begin
-     (let [(bxd-strains (bxd-strain-id-names #:used-for-mapping? #t))]
+     (let [(bxd-strains (memo-bxd-strain-id-names #:used-for-mapping? #t))]
        (define (run-list-traits-to-compute db prev-id count)
          (let* [(hits (get-precompute-hits db prev-id count))
                 (data-ids (map (lambda (hit)
@@ -101,7 +87,7 @@ When that is the case we might as well write the phenotype file because we have
                 (data-ids-query (string-join data-str-ids " OR "))
                 (query (string-append "SELECT Id,StrainId,value FROM ProbeSetData WHERE " data-ids-query))
                 ]
-           (display query)
+           ;; (display query)
            (dbi-query db query)
            (let [(id-traits (get-rows db '()))
                  (nrecs '())]
@@ -114,15 +100,16 @@ When that is the case we might as well write the phenotype file because we have
                                    (acons strain-id value has-lst)
                                    '())
                                )]
-                      ;; (display lst)
                       (set! nrecs (assoc-set! nrecs data-id lst))))
                        id-traits)
              (for-each (lambda (r)
-                         (if (is-bxd? (cdr r))
-                             (display r)
+                         (if (has-bxd? (cdr r))
+                             (begin
+                               (display (car r))
+                               (newline))
                          )) nrecs)
              ; (display nrecs)
            )))
-       (run-list-traits-to-compute db 0 5) ;; start precompute
+       (run-list-traits-to-compute db 0 1000) ;; start precompute
        ;; (write bxd-strains)
        ))))