1 #ifndef __PLINK_FAMILY_H__ 2 #define __PLINK_FAMILY_H__ 3 4 // This file is part of PLINK 1.90, copyright (C) 2005-2020 Shaun Purcell, 5 // Christopher Chang. 6 // 7 // This program is free software: you can redistribute it and/or modify 8 // it under the terms of the GNU General Public License as published by 9 // the Free Software Foundation, either version 3 of the License, or 10 // (at your option) any later version. 11 // 12 // This program is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 // 17 // You should have received a copy of the GNU General Public License 18 // along with this program. If not, see <http://www.gnu.org/licenses/>. 19 20 21 #include "plink_set.h" 22 23 #define TDT_EXACT 1 24 #define TDT_MIDP 2 25 #define TDT_POO 4 26 #define TDT_PERM 8 27 #define TDT_MPERM 0x10 28 #define TDT_PERM_COUNT 0x20 29 #define TDT_PARENPERM1 0x40 30 #define TDT_PARENPERM2 0x80 31 #define TDT_POOPERM_PAT 0x100 32 #define TDT_POOPERM_MAT 0x200 33 #define TDT_SET_TEST 0x400 34 35 #define DFAM_NO_UNRELATEDS 1 36 #define DFAM_PERM 2 37 #define DFAM_MPERM 4 38 #define DFAM_PERM_COUNT 8 39 #define DFAM_SET_TEST 0x10 40 41 #define QFAM_WITHIN1 1 42 #define QFAM_WITHIN2 2 43 #define QFAM_BETWEEN 4 44 #define QFAM_TOTAL 8 45 #define QFAM_TEST 15 46 #define QFAM_PERM 0x10 47 #define QFAM_MPERM 0x20 48 #define QFAM_PERM_COUNT 0x40 49 #define QFAM_EMP_SE 0x80 50 51 extern const uint32_t mendel_error_table[]; 52 extern const uint32_t mendel_error_table_x[]; 53 54 typedef struct { 55 double mendel_max_trio_error; 56 double mendel_max_var_error; 57 double mendel_exclude_one_ratio; 58 uint32_t mendel_modifier; 59 uint32_t tdt_modifier; 60 uint32_t tdt_mperm_val; 61 uint32_t dfam_modifier; 62 uint32_t dfam_mperm_val; 63 uint32_t qfam_modifier; 64 uint32_t qfam_mperm_val; 65 uint32_t tucc_bed; 66 } Family_info; 67 68 void family_init(Family_info* fam_ip); 69 70 int32_t get_trios_and_families(uintptr_t unfiltered_sample_ct, uintptr_t* sample_exclude, uintptr_t sample_ct, uintptr_t* founder_info, uintptr_t* sex_nm, uintptr_t* sex_male, char* sample_ids, uintptr_t max_sample_id_len, char* paternal_ids, uintptr_t max_paternal_id_len, char* maternal_ids, uintptr_t max_maternal_id_len, char** fids_ptr, uintptr_t* max_fid_len_ptr, char** iids_ptr, uintptr_t* max_iid_len_ptr, uint64_t** family_list_ptr, uint32_t* family_ct_ptr, uint64_t** trio_list_ptr, uintptr_t* trio_ct_ptr, uint32_t** trio_lookup_ptr, uint32_t include_duos, uint32_t toposort); 71 72 uint32_t erase_mendel_errors(uintptr_t unfiltered_sample_ct, uintptr_t* loadbuf, uintptr_t* workbuf, uintptr_t* sex_male, uint32_t* trio_lookup, uint32_t trio_ct, uint32_t is_x, uint32_t multigen); 73 74 int32_t mendel_error_scan(Family_info* fam_ip, FILE* bedfile, uintptr_t bed_offset, char* outname, char* outname_end, uint32_t plink_maxfid, uint32_t plink_maxiid, uint32_t plink_maxsnp, uint32_t allow_no_variants, uintptr_t unfiltered_marker_ct, uintptr_t* marker_exclude, uintptr_t* marker_exclude_ct_ptr, uintptr_t* marker_reverse, char* marker_ids, uintptr_t max_marker_id_len, char** marker_allele_ptrs, uintptr_t max_marker_allele_len, uintptr_t unfiltered_sample_ct, uintptr_t* sample_exclude, uintptr_t* sample_exclude_ct_ptr, uintptr_t* founder_info, uintptr_t* sex_nm, uintptr_t* sex_male, char* sample_ids, uintptr_t max_sample_id_len, char* paternal_ids, uintptr_t max_paternal_id_len, char* maternal_ids, uintptr_t max_maternal_id_len, uint32_t hh_exists, Chrom_info* chrom_info_ptr, uint32_t calc_mendel); 75 76 typedef struct { 77 char* family_ids; 78 uintptr_t max_family_id_len; // includes trailing null 79 uint32_t* family_sizes; 80 81 uintptr_t* family_rel_space_offsets; // offset for rel_space lookup 82 uint32_t* family_founder_cts; 83 // direct sample uidx -> family idx lookup, to reduce number of bsearches 84 uint32_t* family_idxs; 85 86 // truncated triangular arrays of pedigree coefficient of relationship 87 double* rel_space; 88 89 // direct sample idx -> rel_space idx lookup 90 uint32_t* family_rel_nf_idxs; 91 92 // following three variables are technically unnecessary for --genome, but we 93 // get them for "free" in the process of calculating everything else, and 94 // they'll be nice to use if we ever need to iterate by family in the future. 95 uint32_t family_id_ct; 96 // list of idxs of all samples in first family, then second family, etc. 97 uint32_t* family_info_space; 98 uint32_t* family_info_offsets; // offset in family_info_space 99 } Pedigree_rel_info; 100 101 int32_t populate_pedigree_rel_info(Pedigree_rel_info* pri_ptr, uintptr_t unfiltered_sample_ct, char* sample_ids, uintptr_t max_sample_id_len, char* paternal_ids, uintptr_t max_paternal_id_len, char* maternal_ids, uintptr_t max_maternal_id_len, uintptr_t* founder_info); 102 103 int32_t tdt(pthread_t* threads, FILE* bedfile, uintptr_t bed_offset, char* outname, char* outname_end, double ci_size, double ci_zt, double pfilter, double output_min_p, uint32_t mtest_adjust, double adjust_lambda, uintptr_t unfiltered_marker_ct, uintptr_t* marker_exclude, uintptr_t marker_ct, char* marker_ids, uintptr_t max_marker_id_len, uint32_t plink_maxsnp, uint32_t* marker_pos, char** marker_allele_ptrs, uintptr_t max_marker_allele_len, uintptr_t* marker_reverse, uintptr_t unfiltered_sample_ct, uintptr_t* sample_exclude, uintptr_t sample_ct, Aperm_info* apip, uint32_t mperm_save, uintptr_t* pheno_nm, uintptr_t* pheno_c, uintptr_t* founder_info, uintptr_t* sex_nm, uintptr_t* sex_male, char* sample_ids, uintptr_t max_sample_id_len, char* paternal_ids, uintptr_t max_paternal_id_len, char* maternal_ids, uintptr_t max_maternal_id_len, Chrom_info* chrom_info_ptr, uint32_t hh_exists, Family_info* fam_ip); 104 105 int32_t dfam(pthread_t* threads, FILE* bedfile, uintptr_t bed_offset, char* outname, char* outname_end, double pfilter, double output_min_p, uint32_t mtest_adjust, double adjust_lambda, uintptr_t unfiltered_marker_ct, uintptr_t* marker_exclude_orig, uintptr_t marker_ct, char* marker_ids, uintptr_t max_marker_id_len, uint32_t plink_maxsnp, char** marker_allele_ptrs, uintptr_t max_marker_allele_len, uintptr_t* marker_reverse, uintptr_t unfiltered_sample_ct, uintptr_t* sample_exclude, uintptr_t sample_ct, uint32_t cluster_ct, uint32_t* cluster_map, uint32_t* cluster_starts, Aperm_info* apip, uint32_t mperm_save, uintptr_t* pheno_c, uintptr_t* founder_info, uintptr_t* sex_nm, uintptr_t* sex_male, char* sample_ids, uintptr_t max_sample_id_len, char* paternal_ids, uintptr_t max_paternal_id_len, char* maternal_ids, uintptr_t max_maternal_id_len, Chrom_info* chrom_info_ptr, uint32_t hh_exists, uint32_t within_cmdflag, uint32_t perm_batch_size, Family_info* fam_ip, Set_info* sip); 106 107 int32_t qfam(pthread_t* threads, FILE* bedfile, uintptr_t bed_offset, char* outname, char* outname_end, uintptr_t unfiltered_marker_ct, uintptr_t* marker_exclude, uintptr_t marker_ct, char* marker_ids, uintptr_t max_marker_id_len, uint32_t plink_maxsnp, uint32_t* marker_pos, char** marker_allele_ptrs, uintptr_t* marker_reverse, uintptr_t unfiltered_sample_ct, uintptr_t* sample_exclude, uintptr_t sample_ct, Aperm_info* apip, uintptr_t* pheno_nm, double* pheno_d, uintptr_t* founder_info, uintptr_t* sex_nm, uintptr_t* sex_male, char* sample_ids, uintptr_t max_sample_id_len, char* paternal_ids, uintptr_t max_paternal_id_len, char* maternal_ids, uintptr_t max_maternal_id_len, Chrom_info* chrom_info_ptr, uint32_t hh_exists, uint32_t perm_batch_size, Family_info* fam_ip); 108 109 int32_t make_pseudocontrols(FILE* bedfile, uintptr_t bed_offset, char* outname, char* outname_end, uintptr_t unfiltered_marker_ct, uintptr_t* marker_exclude, uintptr_t marker_ct, char* marker_ids, uintptr_t max_marker_id_blen, double* marker_cms, uint32_t* marker_pos, char** marker_allele_ptrs, uintptr_t max_marker_allele_blen, uintptr_t* marker_reverse, uintptr_t unfiltered_sample_ct, uintptr_t* sample_exclude, uintptr_t sample_ct, uintptr_t* founder_info, uintptr_t* sex_nm, uintptr_t* sex_male, char* sample_ids, uintptr_t max_sample_id_blen, char* paternal_ids, uintptr_t max_paternal_id_blen, char* maternal_ids, uintptr_t max_maternal_id_blen, Chrom_info* chrom_info_ptr, Family_info* fam_ip); 110 111 #endif // __PLINK_FAMILY_H__ 112