about summary refs log tree commit diff
path: root/src/gemma.cpp
diff options
context:
space:
mode:
authorPjotr Prins2017-08-20 09:20:06 +0000
committerPjotr Prins2017-08-20 09:20:06 +0000
commitd564a6f16613985340040cc7ab0ffc371cbce3d1 (patch)
treef1f66a528d48dcdf0b216322b1910f3c575429a9 /src/gemma.cpp
parent85797beb24da3d591a79fddcff4ab48d702b465f (diff)
downloadpangemma-d564a6f16613985340040cc7ab0ffc371cbce3d1.tar.gz
Added checks for K
Diffstat (limited to 'src/gemma.cpp')
-rw-r--r--src/gemma.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/gemma.cpp b/src/gemma.cpp
index c82bf4a..7749bc9 100644
--- a/src/gemma.cpp
+++ b/src/gemma.cpp
@@ -44,11 +44,20 @@
 #include "prdt.h"
 #include "varcov.h"
 #include "vc.h"
+#include "debug.h"
 
 using namespace std;
 
 GEMMA::GEMMA(void) : version("0.97.1"), date("08/07/2017"), year("2017") {}
 
+void gemma_gsl_error_handler (const char * reason,
+                              const char * file,
+                              int line, int gsl_errno) {
+  cerr << "GSL ERROR: " << reason << " in " << file
+       << " at line " << line << " errno " << gsl_errno <<endl;
+  exit(22);
+}
+
 void GEMMA::PrintHeader(void) {
   cout << endl;
   cout << "*********************************************************" << endl;
@@ -247,10 +256,10 @@ void GEMMA::PrintHelp(size_t option) {
          << endl;
     cout << " to fit a multivariate linear mixed model: " << endl;
     cout << "         ./gemma -bfile [prefix] -k [filename] -lmm [num] -n "
-            "[num1] [num2] -o [prefix]"
+            "[pheno cols...] -o [prefix]"
          << endl;
     cout << "         ./gemma -g [filename] -p [filename] -a [filename] -k "
-            "[filename] -lmm [num] -n [num1] [num2] -o [prefix]"
+            "[filename] -lmm [num] -n [pheno cols...] -o [prefix]"
          << endl;
     cout << " to fit a Bayesian sparse linear mixed model: " << endl;
     cout << "         ./gemma -bfile [prefix] -bslmm [num] -o [prefix]" << endl;
@@ -536,6 +545,7 @@ void GEMMA::PrintHelp(size_t option) {
 
   if (option == 9) {
     cout << " MULTIVARIATE LINEAR MIXED MODEL OPTIONS" << endl;
+    cout << " -n [pheno cols...] - range of phenotypes" << endl;
     cout << " -pnr				     "
          << " specify the pvalue threshold to use the Newton-Raphson's method "
             "(default 0.001)"
@@ -694,6 +704,7 @@ void GEMMA::PrintHelp(size_t option) {
 
   if (option == 14) {
     cout << " DEBUG OPTIONS" << endl;
+    cout << " -no-checks               disable checks" << endl;
     cout << " -silence                 silent terminal display" << endl;
     cout << " -debug                   debug output" << endl;
     cout << " -nind       [num]        read up to num individuals" << endl;
@@ -1578,6 +1589,8 @@ void GEMMA::Assign(int argc, char **argv, PARAM &cPar) {
       cPar.window_ns = atoi(str.c_str());
     } else if (strcmp(argv[i], "-debug") == 0) {
       cPar.mode_debug = true;
+    } else if (strcmp(argv[i], "-no-checks") == 0) {
+      cPar.mode_check = false;
     } else {
       cout << "error! unrecognized option: " << argv[i] << endl;
       cPar.error = true;
@@ -1713,6 +1726,7 @@ void GEMMA::BatchRun(PARAM &cPar) {
       cout << "error! fail to read kinship/relatedness file. " << endl;
       return;
     }
+    // FIXME: this is strange, why read twice?
     ReadFile_kin(cPar.file_kin, cPar.indicator_cvt, cPar.mapID2num, cPar.k_mode,
                  cPar.error, G_full);
     if (cPar.error == true) {
@@ -1723,6 +1737,7 @@ void GEMMA::BatchRun(PARAM &cPar) {
     // center matrix G
     CenterMatrix(G);
     CenterMatrix(G_full);
+    validate_K(G,cPar.mode_check);
 
     // eigen-decomposition and calculate trace_G
     cout << "Start Eigen-Decomposition..." << endl;
@@ -1869,6 +1884,9 @@ void GEMMA::BatchRun(PARAM &cPar) {
       return;
     }
 
+    // Now we have the Kinship matrix test it
+    validate_K(G,cPar.mode_check);
+
     if (cPar.a_mode == 21) {
       cPar.WriteMatrix(G, "cXX");
     } else {
@@ -2146,6 +2164,8 @@ void GEMMA::BatchRun(PARAM &cPar) {
                cPar.se_pve_total, cPar.v_sigma2, cPar.v_se_sigma2,
                cPar.v_enrich, cPar.v_se_enrich);
 
+      assert(!has_nan(cPar.v_se_pve));
+
       // if LDSC weights, then compute the weights and run the above steps again
       if (cPar.a_mode == 62) {
         // compute the weights and normalize the weights for A
@@ -2175,8 +2195,10 @@ void GEMMA::BatchRun(PARAM &cPar) {
                  cPar.ni_study, cPar.v_pve, cPar.v_se_pve, cPar.pve_total,
                  cPar.se_pve_total, cPar.v_sigma2, cPar.v_se_sigma2,
                  cPar.v_enrich, cPar.v_se_enrich);
+        assert(!has_nan(cPar.v_se_pve));
       }
 
+
       gsl_vector_set(s, cPar.n_vc, cPar.ni_test);
 
       cPar.WriteMatrix(S, "S");
@@ -2265,6 +2287,7 @@ void GEMMA::BatchRun(PARAM &cPar) {
                cPar.v_pve, cPar.v_se_pve, cPar.pve_total, cPar.se_pve_total,
                cPar.v_sigma2, cPar.v_se_sigma2, cPar.v_enrich,
                cPar.v_se_enrich);
+      assert(!has_nan(cPar.v_se_pve));
 
       gsl_vector_view s_sub = gsl_vector_subvector(s, 0, cPar.n_vc);
       gsl_vector_memcpy(&s_sub.vector, s_ref);
@@ -2325,6 +2348,7 @@ void GEMMA::BatchRun(PARAM &cPar) {
 
         // center matrix G
         CenterMatrix(G);
+        validate_K(G,cPar.mode_check);
 
         (cPar.v_traceG).clear();
         double d = 0;
@@ -2636,6 +2660,7 @@ return;}
     CalcCIss(Xz, XWz, XtXWz, S, Svar, w, z, s_vec, vec_cat, cPar.v_pve,
              cPar.v_se_pve, cPar.pve_total, cPar.se_pve_total, cPar.v_sigma2,
              cPar.v_se_sigma2, cPar.v_enrich, cPar.v_se_enrich);
+      assert(!has_nan(cPar.v_se_pve));
 
     // write files
     // cPar.WriteMatrix (XWz, "XWz");
@@ -2692,6 +2717,7 @@ return;}
 
       // center matrix G
       CenterMatrix(G);
+      validate_K(G,cPar.mode_check);
 
       // is residual weights are provided, then
       if (!cPar.file_weight.empty()) {
@@ -3007,6 +3033,7 @@ return;}
 
         // center matrix G
         CenterMatrix(G);
+        validate_K(G,cPar.mode_check);
       } else {
         cPar.ReadGenotypes(UtX, G, true);
       }
@@ -3123,6 +3150,8 @@ return;}
 
           // center matrix G
           CenterMatrix(G);
+          validate_K(G,cPar.mode_check);
+
         } else {
           cPar.ReadGenotypes(UtX, G, true);
         }
@@ -3329,6 +3358,7 @@ void GEMMA::WriteLog(int argc, char **argv, PARAM &cPar) {
       outfile << "  " << cPar.v_se_pve[i];
     }
     outfile << endl;
+    assert(!has_nan(cPar.v_se_pve));
 
     if (cPar.n_vc > 1) {
       outfile << "## total pve = " << cPar.pve_total << endl;