Commit f1257bee authored by Dylan Aïssi's avatar Dylan Aïssi
Browse files

New upstream version 1.90~b6.12-191028

parent 801326a8
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@
static const char ver_str[] =
#ifdef STABLE_BUILD
  "PLINK v1.90b6.11"
  "PLINK v1.90b6.12"
#else
  "PLINK v1.90p"
#endif
@@ -105,7 +105,7 @@ static const char ver_str[] =
#else
  " 32-bit"
#endif
  " (24 Oct 2019)";
  " (28 Oct 2019)";
static const char ver_str2[] =
  // include leading space if day < 10, so character length stays the same
  ""
@@ -3167,6 +3167,7 @@ int32_t main(int32_t argc, char** argv) {
  char* metaanal_a1field_search_order = nullptr;
  char* metaanal_a2field_search_order = nullptr;
  char* metaanal_pfield_search_order = nullptr;
  char* metaanal_sefield_search_order = nullptr;
  char* metaanal_essfield_search_order = nullptr;
  char* rplugin_fname = nullptr;
  char* rplugin_host_or_socket = nullptr;
@@ -9480,6 +9481,18 @@ int32_t main(int32_t argc, char** argv) {
	if (retval) {
	  goto main_ret_NOMEM;
	}
      } else if (!memcmp(argptr2, "eta-analysis-se-field", 22)) {
        if (!metaanal_fnames) {
	  logerrprint("Error: --meta-analysis-se-field must be used with --meta-analysis.\n");
          goto main_ret_INVALID_CMDLINE;
	}
	if (enforce_param_ct_range(param_ct, argv[cur_arg], 1, 0x10000000)) {
	  goto main_ret_INVALID_CMDLINE_2A;
	}
        retval = alloc_and_flatten(&metaanal_sefield_search_order, &(argv[cur_arg + 1]), param_ct);
	if (retval) {
	  goto main_ret_NOMEM;
	}
      } else if (!memcmp(argptr2, "eta-analysis-ess-field", 23)) {
        if ((!metaanal_fnames) || (!(metaanal_flags & METAANAL_WEIGHTED_Z))) {
	  logerrprint("Error: --meta-analysis-ess-field must be used with --meta-analysis + weighted-z.\n");
@@ -13369,7 +13382,7 @@ int32_t main(int32_t argc, char** argv) {
  if (metaanal_fnames) {
    // possible todo: make this support --aec (takes a bit of work since
    // chromosome byte in data structure must be widened)
    retval = meta_analysis(metaanal_fnames, metaanal_snpfield_search_order, metaanal_a1field_search_order, metaanal_a2field_search_order, metaanal_pfield_search_order, metaanal_essfield_search_order, metaanal_flags, (misc_flags & MISC_EXTRACT_RANGE)? nullptr : extractname, outname, outname_end, output_min_p, &chrom_info);
    retval = meta_analysis(metaanal_fnames, metaanal_snpfield_search_order, metaanal_a1field_search_order, metaanal_a2field_search_order, metaanal_pfield_search_order, metaanal_sefield_search_order, metaanal_essfield_search_order, metaanal_flags, (misc_flags & MISC_EXTRACT_RANGE)? nullptr : extractname, outname, outname_end, output_min_p, &chrom_info);
    if (retval) {
      goto main_ret_1;
    }
@@ -13634,6 +13647,7 @@ int32_t main(int32_t argc, char** argv) {
  free_cond(metaanal_a1field_search_order);
  free_cond(metaanal_a2field_search_order);
  free_cond(metaanal_pfield_search_order);
  free_cond(metaanal_sefield_search_order);
  free_cond(metaanal_essfield_search_order);
  free_cond(rplugin_fname);
  free_cond(rplugin_host_or_socket);
+8 −7
Original line number Diff line number Diff line
@@ -2064,14 +2064,15 @@ int32_t disp_help(uint32_t param_ct, char** argv) {
    help_print("clump-best\tclump", &help_ctrl, 0,
"  --clump-best              : Report best proxy for each --clump index var.\n"
	       );
    help_print("meta-analysis-snp-field\tmeta-analysis-a1-field\tmeta-analysis-a2-field\tmeta-analysis-p-field\tmeta-analysis-ess-field\tmeta-analysis", &help_ctrl, 0,
    help_print("meta-analysis-snp-field\tmeta-analysis-a1-field\tmeta-analysis-a2-field\tmeta-analysis-p-field\tmeta-analysis-se-field\tmeta-analysis-ess-field\tmeta-analysis", &help_ctrl, 0,
"  --meta-analysis-snp-field <n...> : Set --meta-analysis variant ID, A1/A2\n"
"  --meta-analysis-a1-field <n...>    allele, p-value, and/or effective sample\n"
"  --meta-analysis-a2-field <n...>    size field names.  Defauls are 'SNP',\n"
"  --meta-analysis-p-field <n...>     'A1', 'A2', 'P', and 'NMISS',\n"
"  --meta-analysis-ess-field <n...>   respectively.  When multiple parameters\n"
"                                     are given to these flags, earlier names\n"
"                                     take precedence over later ones.\n"
"  --meta-analysis-a1-field <n...>    allele, p-value, standard error, and/or\n"
"  --meta-analysis-a2-field <n...>    effective sample size field names.\n"
"  --meta-analysis-p-field <n...>     Defaults are 'SNP', 'A1', 'A2', 'P', 'SE',\n"
"  --meta-analysis-se-field <n...>    and 'NMISS', respectively.  When multiple\n"
"  --meta-analysis-ess-field <n...>   parameters are given to these flags,\n"
"                                     earlier names take precedence over later\n"
"                                     ones.\n"
"                                     Note that, if the numbers of cases and\n"
"                                     controls are unequal, effective sample\n"
"                                     size should be\n"
+41 −15
Original line number Diff line number Diff line
@@ -4930,6 +4930,7 @@ int32_t meta_analysis_open_and_read_header(const char* fname, char* loadbuf, uin
  uint32_t token_ct = *token_ct_ptr;
  uint32_t best_var_id = 0x7fffffff;
  uint32_t best_p_id = 0x7fffffff;
  uint32_t best_se_id = 0x7fffffff;
  uint32_t best_ess_id = 0x7fffffff;
  uint32_t best_a1_id = 0x7fffffff;
  uint32_t best_a2_id = 0x7fffffff;
@@ -4999,6 +5000,15 @@ int32_t meta_analysis_open_and_read_header(const char* fname, char* loadbuf, uin
	}
	break;
      case 2:
	// SE
	if (uii < best_se_id) {
	  best_p_id = uii;
	  parse_table[2] = (colnum * 16) | 2;
	} else if (uii == best_se_id) {
	  goto meta_analysis_open_and_read_header_ret_DUPLICATE_HEADER_COL;
	}
	break;
      case 3:
	// P
	if (uii < best_p_id) {
	  best_p_id = uii;
@@ -5007,7 +5017,7 @@ int32_t meta_analysis_open_and_read_header(const char* fname, char* loadbuf, uin
	  goto meta_analysis_open_and_read_header_ret_DUPLICATE_HEADER_COL;
	}
	break;
      case 3:
      case 4:
	// effective sample size
	if (uii < best_ess_id) {
	  best_ess_id = uii;
@@ -5016,7 +5026,7 @@ int32_t meta_analysis_open_and_read_header(const char* fname, char* loadbuf, uin
	  goto meta_analysis_open_and_read_header_ret_DUPLICATE_HEADER_COL;
	}
	break;
      case 4:
      case 5:
	// A1
	if (uii < best_a1_id) {
	  best_a1_id = uii;
@@ -5025,7 +5035,7 @@ int32_t meta_analysis_open_and_read_header(const char* fname, char* loadbuf, uin
	  goto meta_analysis_open_and_read_header_ret_DUPLICATE_HEADER_COL;
	}
	break;
      case 5:
      case 6:
	// A2
	if (uii < best_a2_id) {
	  best_a2_id = uii;
@@ -5152,7 +5162,7 @@ static inline uint32_t uint32_decode_5_hi_uchar(const char* start) {
  return uii;
}

int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1field_search_order, char* a2field_search_order, char* pfield_search_order, char* essfield_search_order, uint32_t flags, char* extractname, char* outname, char* outname_end, double output_min_p, Chrom_info* chrom_info_ptr) {
int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1field_search_order, char* a2field_search_order, char* pfield_search_order, char* sefield_search_order, char* essfield_search_order, uint32_t flags, char* extractname, char* outname, char* outname_end, double output_min_p, Chrom_info* chrom_info_ptr) {
  unsigned char* bigstack_mark = g_bigstack_base;
  unsigned char* bigstack_end_mark = g_bigstack_end;
  gzFile gz_infile = nullptr;
@@ -5162,7 +5172,7 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
  char* sorted_extract_ids = nullptr;
  uintptr_t* duplicate_id_bitfield = nullptr;
  Ll_str** duplicate_id_htable = nullptr;
  uintptr_t header_dict_ct = 2; // 'SE', BETA/OR
  uintptr_t header_dict_ct = 1; // BETA/OR
  uintptr_t max_header_len = 3;
  uintptr_t extract_ct = 0;
  uintptr_t max_extract_id_len = 0;
@@ -5289,6 +5299,11 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
      max_header_len = 4; // 'SNP' + null terminator
      header_dict_ct++;
    }
    if (sefield_search_order) {
      header_dict_ct += count_and_measure_multistr(sefield_search_order, &max_header_len);
    } else {
      header_dict_ct++;
    }
    if (input_beta && (max_header_len < 5)) {
      max_header_len = 5;
    }
@@ -5354,12 +5369,23 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
      memcpy(&(sorted_header_dict[ulii * max_header_len]), "BETA", 5);
    }
    header_id_map[ulii++] = 1;
    if (sefield_search_order) {
      bufptr = sefield_search_order;
      uii = 0x20000000;
      do {
	slen = strlen(bufptr) + 1;
	memcpy(&(sorted_header_dict[ulii * max_header_len]), bufptr, slen);
	header_id_map[ulii++] = uii++;
	bufptr = &(bufptr[slen]);
      } while (*bufptr);
    } else {
      memcpyl3(&(sorted_header_dict[ulii * max_header_len]), "SE");
    header_id_map[ulii++] = 2;
      header_id_map[ulii++] = 0x20000000;
    }
    if (weighted_z) {
      if (pfield_search_order) {
	bufptr = pfield_search_order;
	uii = 0x20000000;
	uii = 0x30000000;
	do {
	  slen = strlen(bufptr) + 1;
	  memcpy(&(sorted_header_dict[ulii * max_header_len]), bufptr, slen);
@@ -5368,12 +5394,12 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
	} while (*bufptr);
      } else {
	memcpy(&(sorted_header_dict[ulii * max_header_len]), "P", 2);
	header_id_map[ulii++] = 0x20000000;
	header_id_map[ulii++] = 0x30000000;
      }
      if (essfield_search_order) {
        // bugfix (3 Nov 2017): had pfield_search_order here
	bufptr = essfield_search_order;
	uii = 0x30000000;
	uii = 0x40000000;
	do {
	  slen = strlen(bufptr) + 1;
	  memcpy(&(sorted_header_dict[ulii * max_header_len]), bufptr, slen);
@@ -5382,7 +5408,7 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
	} while (*bufptr);
      } else {
	memcpy(&(sorted_header_dict[ulii * max_header_len]), "NMISS", 6);
	header_id_map[ulii++] = 0x30000000;
	header_id_map[ulii++] = 0x40000000;
      }
    }
    if (use_map) {
@@ -5393,7 +5419,7 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
      if (!no_allele) {
	if (a1field_search_order) {
	  bufptr = a1field_search_order;
	  uii = 0x40000000;
	  uii = 0x50000000;
	  do {
	    slen = strlen(bufptr) + 1;
	    memcpy(&(sorted_header_dict[ulii * max_header_len]), bufptr, slen);
@@ -5402,11 +5428,11 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
	  } while (*bufptr);
	} else {
	  memcpyl3(&(sorted_header_dict[ulii * max_header_len]), "A1");
	  header_id_map[ulii++] = 0x40000000;
	  header_id_map[ulii++] = 0x50000000;
	}
	if (a2field_search_order) {
	  bufptr = a2field_search_order;
	  uii = 0x50000000;
	  uii = 0x60000000;
	  do {
	    slen = strlen(bufptr) + 1;
	    memcpy(&(sorted_header_dict[ulii * max_header_len]), bufptr, slen);
@@ -5415,7 +5441,7 @@ int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1f
	  } while (*bufptr);
	} else {
	  memcpyl3(&(sorted_header_dict[ulii * max_header_len]), "A2");
	  header_id_map[ulii] = 0x50000000;
	  header_id_map[ulii] = 0x60000000;
	}
      }
    }
+1 −1
Original line number Diff line number Diff line
@@ -105,6 +105,6 @@ int32_t fst_report(FILE* bedfile, uintptr_t bed_offset, char* outname, char* out

int32_t score_report(Score_info* sc_ip, FILE* bedfile, uintptr_t bed_offset, uintptr_t marker_ct, uintptr_t unfiltered_marker_ct, uintptr_t* marker_exclude_orig, uintptr_t* marker_reverse, char* marker_ids, uintptr_t max_marker_id_len, char** marker_allele_ptrs, double* set_allele_freqs, uintptr_t sample_ct, uintptr_t unfiltered_sample_ct, uintptr_t* sample_exclude, char* sample_ids, uint32_t plink_maxfid, uint32_t plink_maxiid, uintptr_t max_sample_id_len, uintptr_t* sex_male, uintptr_t* pheno_nm, uintptr_t* pheno_c, double* pheno_d, char* output_missing_pheno, uint32_t hh_exists, Chrom_info* chrom_info_ptr, char* outname, char* outname_end);

int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1field_search_order, char* a2field_search_order, char* pfield_search_order, char* essfield_search_order, uint32_t flags, char* extractname, char* outname, char* outname_end, double output_min_p, Chrom_info* chrom_info_ptr);
int32_t meta_analysis(char* input_fnames, char* snpfield_search_order, char* a1field_search_order, char* a2field_search_order, char* pfield_search_order, char* sefield_search_order, char* essfield_search_order, uint32_t flags, char* extractname, char* outname, char* outname_end, double output_min_p, Chrom_info* chrom_info_ptr);

#endif // __PLINK_MISC_H__