aboutsummaryrefslogtreecommitdiff
path: root/src/param.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/param.h')
-rw-r--r--src/param.h616
1 files changed, 314 insertions, 302 deletions
diff --git a/src/param.h b/src/param.h
index f58da53..45d8c0f 100644
--- a/src/param.h
+++ b/src/param.h
@@ -19,340 +19,352 @@
#ifndef __PARAM_H__
#define __PARAM_H__
-#include <vector>
+#include "debug.h"
+#include "gsl/gsl_matrix.h"
+#include "gsl/gsl_vector.h"
#include <map>
#include <set>
-#include "gsl/gsl_vector.h"
-#include "gsl/gsl_matrix.h"
+#include <vector>
+
+#define K_BATCH_SIZE 10000 // #snps used for batched K
using namespace std;
class SNPINFO {
public:
- string chr;
- string rs_number;
- double cM;
- long int base_position;
- string a_minor;
- string a_major;
- size_t n_miss;
- double missingness;
- double maf;
- size_t n_idv; // Number of non-missing individuals.
- size_t n_nb; // Number of neighbours on the right hand side.
- size_t file_position; // SNP location in file.
+ string chr;
+ string rs_number;
+ double cM;
+ long int base_position;
+ string a_minor;
+ string a_major;
+ size_t n_miss;
+ double missingness;
+ double maf;
+ size_t n_idv; // Number of non-missing individuals.
+ size_t n_nb; // Number of neighbours on the right hand side.
+ size_t file_position; // SNP location in file.
};
// Results for LMM.
class SUMSTAT {
public:
- double beta; // REML estimator for beta.
- double se; // SE for beta.
- double lambda_remle; // REML estimator for lambda.
- double lambda_mle; // MLE estimator for lambda.
- double p_wald; // p value from a Wald test.
- double p_lrt; // p value from a likelihood ratio test.
- double p_score; // p value from a score test.
+ double beta; // REML estimator for beta.
+ double se; // SE for beta.
+ double lambda_remle; // REML estimator for lambda.
+ double lambda_mle; // MLE estimator for lambda.
+ double p_wald; // p value from a Wald test.
+ double p_lrt; // p value from a likelihood ratio test.
+ double p_score; // p value from a score test.
};
// Results for mvLMM.
class MPHSUMSTAT {
public:
- vector<double> v_beta; // REML estimator for beta.
- double p_wald; // p value from a Wald test.
- double p_lrt; // p value from a likelihood ratio test.
- double p_score; // p value from a score test.
- vector<double> v_Vg; // Estimator for Vg, right half.
- vector<double> v_Ve; // Estimator for Ve, right half.
- vector<double> v_Vbeta; // Estimator for Vbeta, right half.
+ vector<double> v_beta; // REML estimator for beta.
+ double p_wald; // p value from a Wald test.
+ double p_lrt; // p value from a likelihood ratio test.
+ double p_score; // p value from a score test.
+ vector<double> v_Vg; // Estimator for Vg, right half.
+ vector<double> v_Ve; // Estimator for Ve, right half.
+ vector<double> v_Vbeta; // Estimator for Vbeta, right half.
};
// Hyper-parameters for BSLMM.
class HYPBSLMM {
public:
- double h;
- double pve;
- double rho;
- double pge;
- double logp;
- size_t n_gamma;
+ double h;
+ double pve;
+ double rho;
+ double pge;
+ double logp;
+ size_t n_gamma;
};
// Header class.
class HEADER {
public:
- size_t rs_col;
- size_t chr_col;
- size_t pos_col;
- size_t cm_col;
- size_t a1_col;
- size_t a0_col;
- size_t z_col;
- size_t beta_col;
- size_t sebeta_col;
- size_t chisq_col;
- size_t p_col;
- size_t n_col;
- size_t nmis_col;
- size_t nobs_col;
- size_t ncase_col;
- size_t ncontrol_col;
- size_t af_col;
- size_t var_col;
- size_t ws_col;
- size_t cor_col;
- size_t coln; // Number of columns.
- set<size_t> catc_col;
- set<size_t> catd_col;
+ size_t rs_col;
+ size_t chr_col;
+ size_t pos_col;
+ size_t cm_col;
+ size_t a1_col;
+ size_t a0_col;
+ size_t z_col;
+ size_t beta_col;
+ size_t sebeta_col;
+ size_t chisq_col;
+ size_t p_col;
+ size_t n_col;
+ size_t nmis_col;
+ size_t nobs_col;
+ size_t ncase_col;
+ size_t ncontrol_col;
+ size_t af_col;
+ size_t var_col;
+ size_t ws_col;
+ size_t cor_col;
+ size_t coln; // Number of columns.
+ set<size_t> catc_col;
+ set<size_t> catd_col;
};
class PARAM {
public:
- // IO-related parameters.
- bool mode_silence;
- int a_mode; // Analysis mode, 1/2/3/4 for Frequentist tests
- int k_mode; // Kinship read mode: 1: n by n matrix, 2: id/id/k_value;
- vector<size_t> p_column; // Which phenotype column needs analysis.
- size_t d_pace; // Display pace
-
- string file_bfile, file_mbfile;
- string file_geno, file_mgeno;
- string file_pheno;
- string file_anno; // Optional.
- string file_gxe; // Optional.
- string file_cvt; // Optional.
- string file_cat, file_mcat;
- string file_catc, file_mcatc;
- string file_var;
- string file_beta;
- string file_cor;
- string file_kin, file_mk;
- string file_ku, file_kd;
- string file_study, file_mstudy;
- string file_ref, file_mref;
- string file_weight, file_wsnp, file_wcat;
- string file_out;
- string file_bf, file_hyp;
- string path_out;
-
- string file_epm; // Estimated parameter file.
- string file_ebv; // Estimated breeding value file.
- string file_log; // Log file containing mean estimate.
- string file_read; // File containing total number of reads.
- string file_gene; // Gene expression file.
- string file_snps; // File containing analyzed SNPs or genes.
-
- // WJA added.
- string file_oxford;
-
- // QC-related parameters.
- double miss_level;
- double maf_level;
- double hwe_level;
- double r2_level;
-
- // LMM-related parameters.
- double l_min;
- double l_max;
- size_t n_region;
- double l_mle_null, l_remle_null;
- double logl_mle_H0, logl_remle_H0;
- double pve_null, pve_se_null, pve_total, se_pve_total;
- double vg_remle_null, ve_remle_null, vg_mle_null, ve_mle_null;
- vector<double> Vg_remle_null, Ve_remle_null, Vg_mle_null, Ve_mle_null;
- vector<double> VVg_remle_null, VVe_remle_null, VVg_mle_null;
- vector<double> VVe_mle_null;
- vector<double> beta_remle_null, se_beta_remle_null, beta_mle_null;
- vector<double> se_beta_mle_null;
- double p_nr;
- double em_prec, nr_prec;
- size_t em_iter, nr_iter;
- size_t crt;
- double pheno_mean; // Phenotype mean from BSLMM fitting or prediction.
-
- // For fitting multiple variance components.
- // The first 3 are of size (n_vc), and the next 2 are of size n_vc+1.
- bool noconstrain;
- vector<double> v_traceG;
- vector<double> v_pve;
- vector<double> v_se_pve;
-
- vector<double> v_sigma2;
- vector<double> v_se_sigma2;
- vector<double> v_enrich;
- vector<double> v_se_enrich;
- vector<double> v_beta;
- vector<double> v_se_beta;
-
- // BSLMM/MCMC-related parameters.
- double h_min, h_max, h_scale; // Priors for h.
- double rho_min, rho_max, rho_scale; // Priors for rho.
- double logp_min, logp_max, logp_scale; // Priors for log(pi).
- size_t h_ngrid, rho_ngrid;
- size_t s_min, s_max; // Min & max. number of gammas.
- size_t w_step; // # warm up/burn in iter.
- size_t s_step; // # sampling iterations.
- size_t r_pace; // Record pace.
- size_t w_pace; // Write pace.
- size_t n_accept; // Number of acceptance.
- size_t n_mh; // # MH steps in each iter.
- double geo_mean; // Mean of geometric dist.
- long int randseed;
- double trace_G;
-
- HYPBSLMM cHyp_initial;
-
- // VARCOV-related parameters.
- double window_cm;
- size_t window_bp;
- size_t window_ns;
-
- // vc-related parameters.
- size_t n_block;
-
- // Summary statistics.
- bool error;
-
- // Number of individuals.
- size_t ni_total, ni_test, ni_cvt, ni_study, ni_ref;
-
- // Number of observed and missing phenotypes.
- size_t np_obs, np_miss;
-
- // Number of SNPs.
- size_t ns_total, ns_test, ns_study, ns_ref;
-
- size_t ng_total, ng_test; // Number of genes.
- size_t ni_control, ni_case; // Number of controls and number of cases.
- size_t ni_subsample; // Number of subsampled individuals.
- size_t n_cvt; // Number of covariates.
- size_t n_cat; // Number of continuous categories.
- size_t n_ph; // Number of phenotypes.
- size_t n_vc; // Number of variance components
- // (including the diagonal matrix).
- double time_total; // Record total time.
- double time_G; // Time spent on reading files the
- // second time and calculate K.
- double time_eigen; // Time spent on eigen-decomposition.
- double time_UtX; // Time spent on calculating UX and Uy.
- double time_UtZ; // Time calculating UtZ for probit BSLMM.
- double time_opt; // Time on optimization iterations/MCMC.
- double time_Omega; // Time spent on calculating Omega.
- double time_hyp; // Time sampling hyperparameters in PMM.
- double time_Proposal; // Time spent on constructing the
- // proposal distribution (i.e. the
- // initial LMM or LM analysis).
-
- // Data.
- // Vector recording all phenotypes (NA replaced with -9).
- vector<vector<double> > pheno;
-
- // Vector recording all covariates (NA replaced with -9).
- vector<vector<double> > cvt;
-
- // Vector recording all covariates (NA replaced with -9).
- vector<double> gxe;
-
- // Vector recording weights for the individuals, which is
- // useful for animal breeding studies.
- vector<double> weight;
-
- // Matrix recording when a phenotype is missing for an
- // individual; 0 missing, 1 available.
- vector<vector<int> > indicator_pheno;
-
- // Indicator for individuals (phenotypes): 0 missing, 1
- // available for analysis
- vector<int> indicator_idv;
-
- // Sequence indicator for SNPs: 0 ignored because of (a) maf,
- // (b) miss, (c) non-poly; 1 available for analysis.
- vector<int> indicator_snp;
-
- // Sequence indicator for SNPs: 0 ignored because of (a) maf,
- // (b) miss, (c) non-poly; 1 available for analysis.
- vector< vector<int> > mindicator_snp;
-
- // Indicator for covariates: 0 missing, 1 available for
- // analysis.
- vector<int> indicator_cvt;
-
- // Indicator for gxe: 0 missing, 1 available for analysis.
- vector<int> indicator_gxe;
-
- // Indicator for weight: 0 missing, 1 available for analysis.
- vector<int> indicator_weight;
-
- // Indicator for estimated breeding value file: 0 missing, 1
- // available for analysis.
- vector<int> indicator_bv;
-
- // Indicator for read file: 0 missing, 1 available for analysis.
- vector<int> indicator_read;
- vector<double> vec_read; // Total number of reads.
- vector<double> vec_bv; // Breeding values.
- vector<size_t> est_column;
-
- map<string, int> mapID2num; // Map small ID to number, 0 to n-1.
- map<string, string> mapRS2chr; // Map rs# to chromosome location.
- map<string, long int> mapRS2bp; // Map rs# to base position.
- map<string, double> mapRS2cM; // Map rs# to cM.
- map<string, double> mapRS2est; // Map rs# to parameters.
- map<string, size_t> mapRS2cat; // Map rs# to category number.
- map<string, vector<double> > mapRS2catc; // Map rs# to cont. cat's.
- map<string, double> mapRS2wsnp; // Map rs# to SNP weights.
- map<string, vector<double> > mapRS2wcat; // Map rs# to SNP cat weights.
-
- vector<SNPINFO> snpInfo; // Record SNP information.
- vector< vector<SNPINFO> > msnpInfo; // Record SNP information.
- set<string> setSnps; // Set of snps for analysis.
-
- // Constructor.
- PARAM();
-
- // Functions.
- void ReadFiles ();
- void CheckParam ();
- void CheckData ();
- void PrintSummary ();
- void ReadGenotypes (gsl_matrix *UtX, gsl_matrix *K,
- const bool calc_K);
- void ReadGenotypes (vector<vector<unsigned char> > &Xt,
- gsl_matrix *K, const bool calc_K);
- void CheckCvt ();
- void CopyCvt (gsl_matrix *W);
- void CopyA (size_t flag, gsl_matrix *A);
- void CopyGxe (gsl_vector *gxe);
- void CopyWeight (gsl_vector *w);
- void ProcessCvtPhen();
- void CopyCvtPhen (gsl_matrix *W, gsl_vector *y, size_t flag);
- void CopyCvtPhen (gsl_matrix *W, gsl_matrix *Y, size_t flag);
- void CalcKin (gsl_matrix *matrix_kin);
- void CalcS (const map<string, double> &mapRS2wA,
- const map<string, double> &mapRS2wK,
- const gsl_matrix *W, gsl_matrix *A, gsl_matrix *K,
- gsl_matrix *S, gsl_matrix *Svar, gsl_vector *ns);
- void WriteVector (const gsl_vector *q, const gsl_vector *s,
- const size_t n_total, const string suffix);
- void WriteVar (const string suffix);
- void WriteMatrix (const gsl_matrix *matrix_U, const string suffix);
- void WriteVector (const gsl_vector *vector_D, const string suffix);
- void CopyRead (gsl_vector *log_N);
- void ObtainWeight (const set<string> &setSnps_beta, map<string,
- double> &mapRS2wK);
- void UpdateWeight (const size_t pve_flag,
- const map<string,double> &mapRS2wK,
- const size_t ni_test, const gsl_vector *ns,
- map<string, double> &mapRS2wA);
- void UpdateSNPnZ (const map<string, double> &mapRS2wA,
- const map<string, string> &mapRS2A1,
- const map<string, double> &mapRS2z,
- gsl_vector *w, gsl_vector *z,
- vector<size_t> &vec_cat);
- void UpdateSNP (const map<string, double> &mapRS2wA);
+ // IO-related parameters.
+ bool mode_silence;
+ bool mode_debug = false;
+ int a_mode; // Analysis mode, 1/2/3/4 for Frequentist tests
+ int k_mode; // Kinship read mode: 1: n by n matrix, 2: id/id/k_value;
+ vector<size_t> p_column; // Which phenotype column needs analysis.
+ size_t d_pace; // Display pace
+
+ string file_bfile, file_mbfile;
+ string file_geno, file_mgeno;
+ string file_pheno;
+ string file_anno; // Optional.
+ string file_gxe; // Optional.
+ string file_cvt; // Optional.
+ string file_cat, file_mcat;
+ string file_catc, file_mcatc;
+ string file_var;
+ string file_beta;
+ string file_cor;
+ string file_kin, file_mk;
+ string file_ku, file_kd;
+ string file_study, file_mstudy;
+ string file_ref, file_mref;
+ string file_weight, file_wsnp, file_wcat;
+ string file_out;
+ string file_bf, file_hyp;
+ string path_out;
+
+ string file_epm; // Estimated parameter file.
+ string file_ebv; // Estimated breeding value file.
+ string file_log; // Log file containing mean estimate.
+ string file_read; // File containing total number of reads.
+ string file_gene; // Gene expression file.
+ string file_snps; // File containing analyzed SNPs or genes.
+ string file_ksnps; // File SNPs for computing K
+ string file_gwasnps; // File SNPs for computing GWAS
+
+ // WJA added.
+ string file_oxford;
+
+ // QC-related parameters.
+ double miss_level;
+ double maf_level;
+ double hwe_level;
+ double r2_level;
+
+ // LMM-related parameters.
+ string loco;
+ double l_min;
+ double l_max;
+ size_t n_region;
+ double l_mle_null, l_remle_null;
+ double logl_mle_H0, logl_remle_H0;
+ double pve_null, pve_se_null, pve_total, se_pve_total;
+ double vg_remle_null, ve_remle_null, vg_mle_null, ve_mle_null;
+ vector<double> Vg_remle_null, Ve_remle_null, Vg_mle_null, Ve_mle_null;
+ vector<double> VVg_remle_null, VVe_remle_null, VVg_mle_null;
+ vector<double> VVe_mle_null;
+ vector<double> beta_remle_null, se_beta_remle_null, beta_mle_null;
+ vector<double> se_beta_mle_null;
+ double p_nr;
+ double em_prec, nr_prec;
+ size_t em_iter, nr_iter;
+ size_t crt;
+ double pheno_mean; // Phenotype mean from BSLMM fitting or prediction.
+
+ // For fitting multiple variance components.
+ // The first 3 are of size (n_vc), and the next 2 are of size n_vc+1.
+ bool noconstrain;
+ vector<double> v_traceG;
+ vector<double> v_pve;
+ vector<double> v_se_pve;
+
+ vector<double> v_sigma2;
+ vector<double> v_se_sigma2;
+ vector<double> v_enrich;
+ vector<double> v_se_enrich;
+ vector<double> v_beta;
+ vector<double> v_se_beta;
+
+ // BSLMM/MCMC-related parameters.
+ double h_min, h_max, h_scale; // Priors for h.
+ double rho_min, rho_max, rho_scale; // Priors for rho.
+ double logp_min, logp_max, logp_scale; // Priors for log(pi).
+ size_t h_ngrid, rho_ngrid;
+ size_t s_min, s_max; // Min & max. number of gammas.
+ size_t w_step; // # warm up/burn in iter.
+ size_t s_step; // # sampling iterations.
+ size_t r_pace; // Record pace.
+ size_t w_pace; // Write pace.
+ size_t n_accept; // Number of acceptance.
+ size_t n_mh; // # MH steps in each iter.
+ double geo_mean; // Mean of geometric dist.
+ long int randseed;
+ double trace_G;
+
+ HYPBSLMM cHyp_initial;
+
+ // VARCOV-related parameters.
+ double window_cm;
+ size_t window_bp;
+ size_t window_ns;
+
+ // vc-related parameters.
+ size_t n_block;
+
+ // Summary statistics.
+ bool error;
+
+ // Number of individuals.
+ size_t ni_total, ni_test, ni_cvt, ni_study, ni_ref;
+ size_t ni_max = 0; // -nind switch for testing purposes
+
+ // Number of observed and missing phenotypes.
+ size_t np_obs, np_miss;
+
+ // Number of SNPs.
+ size_t ns_total, ns_test, ns_study, ns_ref;
+
+ size_t ng_total, ng_test; // Number of genes.
+ size_t ni_control, ni_case; // Number of controls and number of cases.
+ size_t ni_subsample; // Number of subsampled individuals.
+ size_t n_cvt; // Number of covariates.
+ size_t n_cat; // Number of continuous categories.
+ size_t n_ph; // Number of phenotypes.
+ size_t n_vc; // Number of variance components
+ // (including the diagonal matrix).
+ double time_total; // Record total time.
+ double time_G; // Time spent on reading files the
+ // second time and calculate K.
+ double time_eigen; // Time spent on eigen-decomposition.
+ double time_UtX; // Time spent on calculating UX and Uy.
+ double time_UtZ; // Time calculating UtZ for probit BSLMM.
+ double time_opt; // Time on optimization iterations/MCMC.
+ double time_Omega; // Time spent on calculating Omega.
+ double time_hyp; // Time sampling hyperparameters in PMM.
+ double time_Proposal; // Time spent on constructing the
+ // proposal distribution (i.e. the
+ // initial LMM or LM analysis).
+
+ // Data.
+ // Vector recording all phenotypes (NA replaced with -9).
+ vector<vector<double>> pheno;
+
+ // Vector recording all covariates (NA replaced with -9).
+ vector<vector<double>> cvt;
+
+ // Vector recording all covariates (NA replaced with -9).
+ vector<double> gxe;
+
+ // Vector recording weights for the individuals, which is
+ // useful for animal breeding studies.
+ vector<double> weight;
+
+ // Matrix recording when a phenotype is missing for an
+ // individual; 0 missing, 1 available.
+ vector<vector<int>> indicator_pheno;
+
+ // Indicator for individuals (phenotypes): 0 missing, 1
+ // available for analysis
+ vector<int> indicator_idv;
+
+ // Sequence indicator for SNPs: 0 ignored because of (a) maf,
+ // (b) miss, (c) non-poly; 1 available for analysis.
+ vector<int> indicator_snp;
+
+ // Sequence indicator for SNPs: 0 ignored because of (a) maf,
+ // (b) miss, (c) non-poly; 1 available for analysis.
+ vector<vector<int>> mindicator_snp;
+
+ // Indicator for covariates: 0 missing, 1 available for
+ // analysis.
+ vector<int> indicator_cvt;
+
+ // Indicator for gxe: 0 missing, 1 available for analysis.
+ vector<int> indicator_gxe;
+
+ // Indicator for weight: 0 missing, 1 available for analysis.
+ vector<int> indicator_weight;
+
+ // Indicator for estimated breeding value file: 0 missing, 1
+ // available for analysis.
+ vector<int> indicator_bv;
+
+ // Indicator for read file: 0 missing, 1 available for analysis.
+ vector<int> indicator_read;
+ vector<double> vec_read; // Total number of reads.
+ vector<double> vec_bv; // Breeding values.
+ vector<size_t> est_column;
+
+ map<string, int> mapID2num; // Map small ID to number, 0 to n-1.
+ map<string, string> mapRS2chr; // Map rs# to chromosome location.
+ map<string, long int> mapRS2bp; // Map rs# to base position.
+ map<string, double> mapRS2cM; // Map rs# to cM.
+ map<string, double> mapRS2est; // Map rs# to parameters.
+ map<string, size_t> mapRS2cat; // Map rs# to category number.
+ map<string, vector<double>> mapRS2catc; // Map rs# to cont. cat's.
+ map<string, double> mapRS2wsnp; // Map rs# to SNP weights.
+ map<string, vector<double>> mapRS2wcat; // Map rs# to SNP cat weights.
+
+ vector<SNPINFO> snpInfo; // Record SNP information.
+ vector<vector<SNPINFO>> msnpInfo; // Record SNP information.
+ set<string> setSnps; // Set of snps for analysis (-snps).
+ set<string> setKSnps; // Set of snps for K (-ksnps and LOCO)
+ set<string> setGWASnps; // Set of snps for GWA (-gwasnps and LOCO)
+
+ // Constructor.
+ PARAM();
+
+ // Functions.
+ void ReadFiles();
+ void CheckParam();
+ void CheckData();
+ void PrintSummary();
+ void ReadGenotypes(gsl_matrix *UtX, gsl_matrix *K, const bool calc_K);
+ void ReadGenotypes(vector<vector<unsigned char>> &Xt, gsl_matrix *K,
+ const bool calc_K);
+ void CheckCvt();
+ void CopyCvt(gsl_matrix *W);
+ void CopyA(size_t flag, gsl_matrix *A);
+ void CopyGxe(gsl_vector *gxe);
+ void CopyWeight(gsl_vector *w);
+ void ProcessCvtPhen();
+ void CopyCvtPhen(gsl_matrix *W, gsl_vector *y, size_t flag);
+ void CopyCvtPhen(gsl_matrix *W, gsl_matrix *Y, size_t flag);
+ void CalcKin(gsl_matrix *matrix_kin);
+ void CalcS(const map<string, double> &mapRS2wA,
+ const map<string, double> &mapRS2wK, const gsl_matrix *W,
+ gsl_matrix *A, gsl_matrix *K, gsl_matrix *S, gsl_matrix *Svar,
+ gsl_vector *ns);
+ void WriteVector(const gsl_vector *q, const gsl_vector *s,
+ const size_t n_total, const string suffix);
+ void WriteVar(const string suffix);
+ void WriteMatrix(const gsl_matrix *matrix_U, const string suffix);
+ void WriteVector(const gsl_vector *vector_D, const string suffix);
+ void CopyRead(gsl_vector *log_N);
+ void ObtainWeight(const set<string> &setSnps_beta,
+ map<string, double> &mapRS2wK);
+ void UpdateWeight(const size_t pve_flag, const map<string, double> &mapRS2wK,
+ const size_t ni_test, const gsl_vector *ns,
+ map<string, double> &mapRS2wA);
+ void UpdateSNPnZ(const map<string, double> &mapRS2wA,
+ const map<string, string> &mapRS2A1,
+ const map<string, double> &mapRS2z, gsl_vector *w,
+ gsl_vector *z, vector<size_t> &vec_cat);
+ void UpdateSNP(const map<string, double> &mapRS2wA);
};
-size_t GetabIndex (const size_t a, const size_t b, const size_t n_cvt);
+size_t GetabIndex(const size_t a, const size_t b, const size_t n_cvt);
-#endif
+// Helpers for checking parameters
+#define enforce_fexists(fn, msg) \
+ if (!fn.empty()) \
+ enforce_msg(stat(fn.c_str(), &fileInfo) == 0, \
+ ((std::string(__STRING(fn)) + ": " + msg).c_str()));
+#endif