From a34a0067fb73625c224b5635297ca1e4c79b9bc0 Mon Sep 17 00:00:00 2001 From: nspope Date: Sat, 14 Mar 2020 18:31:58 -0700 Subject: [PATCH 1/3] max heterozygote filter --- abcHWE.cpp | 29 ++++++++++++++++++++++++----- abcHWE.h | 3 +++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/abcHWE.cpp b/abcHWE.cpp index 2944867..f803142 100644 --- a/abcHWE.cpp +++ b/abcHWE.cpp @@ -25,6 +25,7 @@ void abcHWE::printArg(FILE *argFile){ fprintf(argFile,"\t-doHWE\t%d\n",doHWE); fprintf(argFile,"\t-minHWEpval\t%f\n",minHWEpval); fprintf(argFile,"\t-maxHWEpval\t%f\n",maxHWEpval); + fprintf(argFile,"\t-maxHetFreq\t%f\n",maxHetFreq);//nspope;hetFilter fprintf(argFile,"\n"); } @@ -37,6 +38,7 @@ void abcHWE::getOptions(argStruct *arguments){ minHWEpval = angsd::getArg("-minHWEpval",minHWEpval,arguments); maxHWEpval = angsd::getArg("-maxHWEpval",maxHWEpval,arguments); + maxHetFreq = angsd::getArg("-maxHetFreq",maxHetFreq,arguments);//nspope;hetFilter if(arguments->inputtype==INPUT_BEAGLE||arguments->inputtype==INPUT_VCF_GP){ @@ -55,6 +57,7 @@ abcHWE::abcHWE(const char *outfiles,argStruct *arguments,int inputtype){ doHWE = 0; maxHWEpval = -1; minHWEpval = -1; + minHetFreq = -1;//nspope;hetFilter testMe=0; tolStop = 0.00001; bufstr.s=NULL;bufstr.l=bufstr.m=0; @@ -77,8 +80,14 @@ abcHWE::abcHWE(const char *outfiles,argStruct *arguments,int inputtype){ outfileZ = aio::openFileBG(outfiles,postfix); //print header - const char *str = "Chromo\tPosition\tMajor\tMinor\thweFreq\tFreq\tF\tLRT\tp-value\n"; - aio::bgzf_write(outfileZ,str,strlen(str)); + if (maxHetFreq != -1) //nspope;maxHetFilter + { + const char *str = "Chromo\tPosition\tMajor\tMinor\thweFreq\tFreq\tF\tLRT\tp-value\thetFreq\n"; + aio::bgzf_write(outfileZ,str,strlen(str)); + } else { + const char *str = "Chromo\tPosition\tMajor\tMinor\thweFreq\tFreq\tF\tLRT\tp-value\n"; + aio::bgzf_write(outfileZ,str,strlen(str)); + } } @@ -98,6 +107,7 @@ void abcHWE::clean(funkyPars *pars){ funkyHWE *hweStruct =(funkyHWE *) pars->extras[index]; delete[] hweStruct->freq; delete[] hweStruct->freqHWE; + delete[] hweStruct->hetfreq;//nspope;hetFilter delete[] hweStruct->F; delete[] hweStruct->like0; delete[] hweStruct->pval; @@ -118,7 +128,11 @@ void abcHWE::print(funkyPars *pars){ float lrt= 2*hweStruct->like0[s]-2*hweStruct->likeF[s]; - ksprintf(&bufstr,"%s\t%d\t%c\t%c\t%f\t%f\t%f\t%e\t%e\n",header->target_name[pars->refId],pars->posi[s]+1,intToRef[pars->major[s]],intToRef[pars->minor[s]],hweStruct->freqHWE[s],hweStruct->freq[s],hweStruct->F[s],lrt,hweStruct->pval[s]); + if (maxHetFreq!=-1){//nspope;hetFilter + ksprintf(&bufstr,"%s\t%d\t%c\t%c\t%f\t%f\t%f\t%e\t%e\t%f\n",header->target_name[pars->refId],pars->posi[s]+1,intToRef[pars->major[s]],intToRef[pars->minor[s]],hweStruct->freqHWE[s],hweStruct->freq[s],hweStruct->F[s],lrt,hweStruct->pval[s],hweStruct->hetfreq[s]); + } else { + ksprintf(&bufstr,"%s\t%d\t%c\t%c\t%f\t%f\t%f\t%e\t%e\n",header->target_name[pars->refId],pars->posi[s]+1,intToRef[pars->major[s]],intToRef[pars->minor[s]],hweStruct->freqHWE[s],hweStruct->freq[s],hweStruct->F[s],lrt,hweStruct->pval[s]); + } } aio::bgzf_write(outfileZ,bufstr.s,bufstr.l);bufstr.l=0; @@ -134,6 +148,7 @@ void abcHWE::run(funkyPars *pars){ double *freq = new double[pars->numSites]; double *freqHWE = new double[pars->numSites]; + double *hetfreq = new double[pars->numSites];//nspope;hetFilter double *F = new double[pars->numSites]; double *like0 = new double[pars->numSites]; double *likeF = new double[pars->numSites]; @@ -188,15 +203,19 @@ void abcHWE::run(funkyPars *pars){ if(minHWEpval!=-1 && pval[s] < minHWEpval) pars->keepSites[s] = 0; - - + //nspope;hetFilter + //filter by maximum heterozygote frequency + hetfreq[s] = -2.*(1.-x[1])*x[0]*(1.-x[0]); + if(maxHetFreq!=-1 && hetfreq[s] > maxHetFreq) + pars->keepSites[s] = 0; } hweStruct->freq=freq; hweStruct->freqHWE=freqHWE; + hweStruct->hetfreq=hetfreq;//nspope;hetFilter hweStruct->F=F; hweStruct->like0=like0; hweStruct->pval=pval; diff --git a/abcHWE.h b/abcHWE.h index f99fc9b..cbf97e5 100644 --- a/abcHWE.h +++ b/abcHWE.h @@ -10,6 +10,8 @@ typedef struct { double *pval; double *F; + + double *hetfreq;//nspope;hetFilter }funkyHWE; @@ -26,6 +28,7 @@ class abcHWE:public abc{ int doHWE; double minHWEpval; double maxHWEpval; + double maxHetFreq;//nspope;hetFilter int testMe; double tolStop; double differ(double *x,double *y); From 6786964a43c1fdbf854e746e34023570b8da5e93 Mon Sep 17 00:00:00 2001 From: nspope Date: Sat, 14 Mar 2020 21:40:34 -0700 Subject: [PATCH 2/3] heterozygote freq filter works --- abcHWE.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/abcHWE.cpp b/abcHWE.cpp index f803142..944b09c 100644 --- a/abcHWE.cpp +++ b/abcHWE.cpp @@ -57,7 +57,7 @@ abcHWE::abcHWE(const char *outfiles,argStruct *arguments,int inputtype){ doHWE = 0; maxHWEpval = -1; minHWEpval = -1; - minHetFreq = -1;//nspope;hetFilter + maxHetFreq = -1;//nspope;hetFilter testMe=0; tolStop = 0.00001; bufstr.s=NULL;bufstr.l=bufstr.m=0; @@ -206,7 +206,7 @@ void abcHWE::run(funkyPars *pars){ //nspope;hetFilter //filter by maximum heterozygote frequency - hetfreq[s] = -2.*(1.-x[1])*x[0]*(1.-x[0]); + hetfreq[s] = 2.*(1.-x[1])*x[0]*(1.-x[0]); if(maxHetFreq!=-1 && hetfreq[s] > maxHetFreq) pars->keepSites[s] = 0; From 8ec13ae31a70ffea00a3bf3a290525a76748f197 Mon Sep 17 00:00:00 2001 From: nspope Date: Sat, 14 Mar 2020 21:53:49 -0700 Subject: [PATCH 3/3] added minHetFreq --- abcHWE.cpp | 11 +++++++---- abcHWE.h | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/abcHWE.cpp b/abcHWE.cpp index 944b09c..c4bbdfb 100644 --- a/abcHWE.cpp +++ b/abcHWE.cpp @@ -26,6 +26,7 @@ void abcHWE::printArg(FILE *argFile){ fprintf(argFile,"\t-minHWEpval\t%f\n",minHWEpval); fprintf(argFile,"\t-maxHWEpval\t%f\n",maxHWEpval); fprintf(argFile,"\t-maxHetFreq\t%f\n",maxHetFreq);//nspope;hetFilter + fprintf(argFile,"\t-minHetFreq\t%f\n",minHetFreq);//nspope;hetFilter fprintf(argFile,"\n"); } @@ -39,6 +40,7 @@ void abcHWE::getOptions(argStruct *arguments){ minHWEpval = angsd::getArg("-minHWEpval",minHWEpval,arguments); maxHWEpval = angsd::getArg("-maxHWEpval",maxHWEpval,arguments); maxHetFreq = angsd::getArg("-maxHetFreq",maxHetFreq,arguments);//nspope;hetFilter + minHetFreq = angsd::getArg("-minHetFreq",minHetFreq,arguments);//nspope;hetFilter if(arguments->inputtype==INPUT_BEAGLE||arguments->inputtype==INPUT_VCF_GP){ @@ -58,6 +60,7 @@ abcHWE::abcHWE(const char *outfiles,argStruct *arguments,int inputtype){ maxHWEpval = -1; minHWEpval = -1; maxHetFreq = -1;//nspope;hetFilter + minHetFreq = -1;//nspope;hetFilter testMe=0; tolStop = 0.00001; bufstr.s=NULL;bufstr.l=bufstr.m=0; @@ -80,7 +83,7 @@ abcHWE::abcHWE(const char *outfiles,argStruct *arguments,int inputtype){ outfileZ = aio::openFileBG(outfiles,postfix); //print header - if (maxHetFreq != -1) //nspope;maxHetFilter + if (maxHetFreq != -1 || minHetFreq != -1) //nspope;maxHetFilter { const char *str = "Chromo\tPosition\tMajor\tMinor\thweFreq\tFreq\tF\tLRT\tp-value\thetFreq\n"; aio::bgzf_write(outfileZ,str,strlen(str)); @@ -128,7 +131,7 @@ void abcHWE::print(funkyPars *pars){ float lrt= 2*hweStruct->like0[s]-2*hweStruct->likeF[s]; - if (maxHetFreq!=-1){//nspope;hetFilter + if (maxHetFreq!=-1 || minHetFreq!=-1){//nspope;hetFilter ksprintf(&bufstr,"%s\t%d\t%c\t%c\t%f\t%f\t%f\t%e\t%e\t%f\n",header->target_name[pars->refId],pars->posi[s]+1,intToRef[pars->major[s]],intToRef[pars->minor[s]],hweStruct->freqHWE[s],hweStruct->freq[s],hweStruct->F[s],lrt,hweStruct->pval[s],hweStruct->hetfreq[s]); } else { ksprintf(&bufstr,"%s\t%d\t%c\t%c\t%f\t%f\t%f\t%e\t%e\n",header->target_name[pars->refId],pars->posi[s]+1,intToRef[pars->major[s]],intToRef[pars->minor[s]],hweStruct->freqHWE[s],hweStruct->freq[s],hweStruct->F[s],lrt,hweStruct->pval[s]); @@ -205,9 +208,9 @@ void abcHWE::run(funkyPars *pars){ pars->keepSites[s] = 0; //nspope;hetFilter - //filter by maximum heterozygote frequency hetfreq[s] = 2.*(1.-x[1])*x[0]*(1.-x[0]); - if(maxHetFreq!=-1 && hetfreq[s] > maxHetFreq) + if( (maxHetFreq!=-1 && hetfreq[s] > maxHetFreq) || + (minHetFreq!=-1 && hetfreq[s] < minHetFreq) ) pars->keepSites[s] = 0; } diff --git a/abcHWE.h b/abcHWE.h index cbf97e5..1607844 100644 --- a/abcHWE.h +++ b/abcHWE.h @@ -29,6 +29,7 @@ class abcHWE:public abc{ double minHWEpval; double maxHWEpval; double maxHetFreq;//nspope;hetFilter + double minHetFreq;//nspope;hetFilter int testMe; double tolStop; double differ(double *x,double *y);