📄 codeml.c
字号:
}
else if(com.model==0 && com.NSsites==0 && !com.fix_omega)
k++;
}
FOR(j,com.nalpha) {
if (!com.fix_alpha)
fprintf(fout,"\nalpha (gamma) = %8.5f",(com.alpha=x[k++]));
if(com.nalpha>1)
DiscreteGamma(com.freqK,com.rK,com.alpha,com.alpha,com.ncatG,0);
fprintf (fout, "\nr (%2d):",com.ncatG);
FOR (i,com.ncatG) fprintf (fout, " %8.5f", com.rK[i]);
fprintf (fout, "\nf: ");
FOR (i,com.ncatG) fprintf (fout, " %8.5f", com.freqK[i]);
FPN (fout);
}
if (com.rho) {
if (!com.fix_rho) fprintf (fout, "rho (correlation) = %8.5f\n", x[k]);
fprintf (fout, "transition probabilities between rate categories:\n");
for(i=0;i<com.ncatG;i++,FPN(fout)) FOR(j,com.ncatG)
fprintf(fout," %8.5f",com.MK[i*com.ncatG+j]);
}
#if 0
/* phi1 & phi2 for NSsites models */
/* NSgamma (2): alpha, beta
NS2gamma (4): p0, alpha1, beta1, alpha2 (=beta2)
NSbeta (2): p_beta, q_beta
NSbetaw (4): p0, p_beta, q_beta, w (if !com.fix_omega, not used here)
NSbetagamma (5): p0, p_beta, q_beta, alpha, beta
NSbeta1gamma (5): p0, p_beta, q_beta, alpha, beta (1+gamma)
NSbeta1normal (5): p0, p_beta, q_beta, mu, s (normal>1)
NS02normal (5): p0, p1, mu2, s1, s2 (s are sigma's)
NS3normal (6): p0, p1, mu2, s0, s1, s2 (s are sigma's)
*/
if(com.seqtype==CODONseq && com.NSsites>=NSgamma) {
puts("\nCalculting phi1 & phi2 from NSsites model.\n");
k=com.ntime+com.nrgene+(com.hkyREV?5:!com.fix_kappa);
if(com.NSsites!=NSbetaw && com.NSsites!=NSbeta&&com.NSsites!=NS02normal)
phi1=1-CDFdN_dS(1,x+k);
switch(com.NSsites) {
case(NSgamma):
phi2=x[k]/x[k+1]*(1-CDFGamma(1,x[k]+1,x[k+1])); break;
case(NS2gamma):
phi2=x[k]*x[k+1]/x[k+2]*(1-CDFGamma(1,x[k+1]+1,x[k+2]))
+ (1-x[k])*(1-CDFGamma(1,x[k+3]+1,x[k+3]));
break;
case(NSbetaw):
if(x[k+3]>1) { phi1=1-x[k]; phi2=(1-x[k])*x[k+3]; }
break;
case(NSbetagamma):
phi2=(1-x[k])*x[k+3]/x[k+4]*(1-CDFGamma(1,x[k+3]+1,x[k+4]));
break;
case(NSbeta1gamma): phi2=(1-x[k])*(1+x[k+3]/x[k+4]); break;
case(NSbeta1normal):
phi2=(1-x[k])*E1N(x[k+3],x[k+4])/(1-CDFNormal((1-x[k+3])/x[k+4]));
break;
case(NS02normal):
phi1=(1-x[k])*(1-CDFdN_dS(1,x+k));
mu[2]=x[k+2]; sig[1]=x[k+3]; sig[2]=x[k+4];
phi2=(1-x[k])*x[k+1]* (sig[1]/sqrt(PI*2)+.5)/CDFNormal(1/sig[1])
+(1-x[k])*(1-x[k+1])*E1N(mu[2],sig[2])/CDFNormal(mu[2]/sig[2]);
break;
case(NS3normal):
mu[2]=x[k+2]; sig[0]=x[k+3]; sig[1]=x[k+4]; sig[2]=x[k+5];
phi2=x[k]*2*(sig[0]/sqrt(PI*2)*exp(-.5/square(sig[0]))
+x[k+1]* (sig[1]/sqrt(PI*2)+.5)/CDFNormal(1/sig[1])
+(1-x[k]-x[k+1])* E1N(mu[2],sig[2]))/CDFNormal(mu[2]/sig[2]);
break;
}
printf("phi1=P(w>1) = %9.4f\tphi2=E(w|w>1) = %7.4f\n",phi1,phi2);
fprintf(fout,"\nphi1=P(w>1) = %9.4f\nphi2=E(w|w>1)= %7.4f\n",phi1,phi2);
fprintf(frst1," phi1&2:%9.4f%9.4f",phi1,phi2);
}
#endif
if (com.model==AAClasses) {
fprintf (fout, "\nw (dN/dS) classes for amino acid pairs:\n");
FOR (k,N_OMEGA) {
fprintf (fout, "%9.5f:", x[com.ntime+com.nrgene+com.nkappa+k]);
FOR (i,20) FOR(j,i)
if (OmegaAA[i*(i-1)/2+j]==k) fprintf(fout," %c%c", AAs[i],AAs[j]);
if (k==0) fprintf(fout, " (background ratio)");
FPN(fout);
}
if (com.nrate>65) { /* estimating all acceptance rates */
for(i=0,k=com.ntime+com.nrgene+com.nkappa; i<20; i++) FOR(j,i) {
om=0;
if (AA1STEP[i*(i-1)/2+j]) {
om=x[k]*100;
if (com.seqtype!=CODONseq && i*(i-1)/2+j==ijAAref) om=100;
else k++;
}
fprintf(frst,"\t%d\t%d\t%.2f\n", i+1,j+1,om*AA1STEP[i*(i-1)/2+j]);
}
}
}
/* dN and dS for each branch in the tree */
if(com.seqtype==CODONseq && com.ngene==1 && (com.model==0 || com.NSsites==0)
/*||com.model==FromCodon||com.model==AAClasses */){
if(com.model) {
dSdNb=(double*)malloc(tree.nnode*2*sizeof(double));
if(dSdNb==NULL) error2("oom DetailOutput");
}
fputs("\ndN & dS for each branch\n\n",fout);
fprintf(fout,"%7s%12s%9s%9s%9s%9s%9s %6s %6s\n\n",
"branch","t","S","N","dN/dS","dN","dS","S*dS","N*dN");
FOR (i,tree.nbranch) {
fprintf(fout,"%4d..%-3d ",tree.branches[i][0]+1,tree.branches[i][1]+1);
k=com.ntime+com.nrgene+com.nkappa;
t=nodes[tree.branches[i][1]].branch;
if(!com.NSsites) {
if (com.model==AAClasses || com.aaDist) om=-1;
else if (com.model==0 || com.model==FromCodon)
om=(com.fix_omega?com.omega:x[k]);
else if (com.model==NSbranchB) om=x[k+i];
else if (com.model==NSbranch2) om=nodes[tree.branches[i][1]].omega;
/*
else if (!com.fix_omega || OmegaBranch[i]<N_OMEGA-1)
om=x[k+=OmegaBranch[i]];
else om=OMEGA_FIX;
*/
if(com.aaDist) POMEGA=x+com.ntime+com.nrgene+!com.fix_kappa;
EigenQc(1,t,&S,&dS,&dN, NULL,NULL,NULL,
(com.hkyREV?x+com.ntime+com.nrgene:&com.kappa),om,PMat); /* */
if(dS<.01/com.ls) om=-1;
else if(om==-1) om=dN/dS;
if(com.model==0) om=com.omega;
N=com.ls*3-S;
if(com.model) { dSdNb[i]=dS; dSdNb[tree.nnode+i]=dN; }
/* om not used in AAClasses model */
if(com.getSE>1&&com.fix_blength<2&&!com.clock&&com.model!=AAClasses){
vtw[0]=var[i*np+i]; vtw[3]=var[k*np+k];
vtw[1]=vtw[2]=var[i*np+k];
VariancedSdN(t, com.omega, vtw, vSN);
fprintf(fout,"dN = %7.5f +- %.5f dS = %7.5f +- %.5f",
dN,(vSN[3]>0?sqrt(vSN[3]):-0),dS,(vSN[0]>0?sqrt(vSN[0]):-0));
fprintf(fout," (by method 2)\n");
}
fprintf(fout,"%9.3f%9.1f%9.1f%9.4f%9.4f%9.4f %6.1f %6.1f\n",
t,S,N,om,dN,dS,S*dS,N*dN);
/* fprintf(frst,"%8.1f%8.1f %9.5f%9.4f%9.4f",N,S,om,dN,dS); */
}
else if(com.model==0) { /* NSsites & other site-class models */
fprintf(fout,"%9.3f%9.1f%9.1f%9.4f%9.4f%9.4f %6.1f %6.1f\n",
t,S,N,om,dN*t,dS*t, S*dS*t,N*dN*t);
/* fprintf(frst,"%8.1f%8.1f %9.5f%9.4f%9.4f",N,S,om,dN*t,dS*t); */
}
else { /* NSbranchsites models */
;
/*
Qfactor_NS=Qfactor_NS_branch[(int)nodes[i].label];
EigenQc(1,t,&S,&dS,&dN,NULL,NULL,NULL,
(com.hkyREV?x+com.ntime+com.nrgene:&com.kappa),om,PMat);
fprintf(fout,"%9.3f%9.1f%9.1f%9.4f%9.4f%9.4f %6.1f %6.1f\n",
t,S,N,om,dN*t,dS*t, S*dS*t,N*dN*t);
*/
}
} /* for (i) */
if(com.model &&!com.NSsites) {
FOR(i,tree.nbranch) nodes[tree.branches[i][1]].branch=dSdNb[i];
fprintf(fout,"\ndS tree:\n"); OutaTreeN(fout,1,1);
FOR(i,tree.nbranch) nodes[tree.branches[i][1]].branch=dSdNb[tree.nnode+i];
fprintf(fout,"\ndN tree:\n"); OutaTreeN(fout,1,1); FPN(fout);
free(dSdNb);
}
} /* if codonseqs */
FPN(fout);
}
void GetNSsitesModels(char *line)
{
char *pline;
int pre_space=1;
if ((pline=strstr(line, "="))==NULL) error2(".ctl file error NSsites");
pline++;
for (nnsmodels=0; nnsmodels<14; nnsmodels++,pre_space=1) {
if(sscanf(pline, "%d", &nsmodels[nnsmodels]) != 1) break;
for(; (pre_space&&isspace(*pline)) || isdigit(*pline); ) {
if (pre_space&&isspace(*pline)) pre_space=0;
pline++;
}
if(nsmodels[nnsmodels]<0 || nsmodels[nnsmodels]>13)
error2("NSsites model");
}
com.NSsites=nsmodels[0];
}
int GetOptions (char *ctlf)
{
int i,j, nopt=34, lline=255;
char line[255], *pline, opt[99], comment='*';
char *optstr[] = {"seqfile", "outfile", "treefile", "seqtype", "noisy",
"cleandata", "runmode", "method",
"clock", "getSE", "RateAncestor", "CodonFreq", "verbose",
"model", "hkyREV", "aaDist","aaRatefile",
"NSsites", "NShmm", "icode", "Mgene", "fix_kappa", "kappa",
"fix_omega", "omega", "fix_alpha", "alpha","Malpha", "ncatG",
"fix_rho", "rho", "ndata", "Small_Diff", "fix_blength"};
double t;
FILE *fctl;
char *daafiles[]={"", "grantham.dat", "miyata.dat",
"g1974c.dat","g1974p.dat","g1974v.dat","g1974a.dat"};
fctl=gfopen(ctlf,"r");
if (noisy) printf ("\n\nReading options from %s..\n", ctlf);
for (;;) {
if (fgets (line, lline, fctl) == NULL) break;
for (i=0,t=0,pline=line; i<lline&&line[i]; i++)
if (isalnum(line[i])) { t=1; break; }
else if (line[i]==comment) break;
if (t==0) continue;
sscanf (line, "%s%*s%lf", opt,&t);
if ((pline=strstr(line, "="))==NULL)
error2("err: option file. add space around the equal sign?");
for (i=0; i<nopt; i++) {
if (strncmp(opt, optstr[i], 8)==0) {
if (noisy>=9)
printf ("\n%3d %15s | %-20s %6.2f", i+1,optstr[i],opt,t);
switch (i) {
case ( 0): sscanf(pline+1, "%s", com.seqf); break;
case ( 1): sscanf(pline+1, "%s", com.outf); break;
case ( 2): sscanf(pline+1, "%s", com.treef); break;
case ( 3): com.seqtype=(int)t; break;
case ( 4): noisy=(int)t; break;
case ( 5): com.cleandata=(char)t; break;
case ( 6): com.runmode=(int)t; break;
case ( 7): com.method=(int)t; break;
case ( 8): com.clock=(int)t; break;
case ( 9): com.getSE=(int)t; break;
case (10): com.print=(int)t; break;
case (11): com.codonf=(int)t; break;
case (12): com.verbose=(int)t; break;
case (13): com.model=(int)t; break;
case (14): com.hkyREV=(int)t; break;
case (15): com.aaDist=(int)t; break;
case (16): sscanf(pline+2,"%s",com.daafile); break;
case (17): GetNSsitesModels(line); break;
case (18): com.nparK=(int)t; break;
case (19): com.icode=(int)t; break;
case (20): com.Mgene=(int)t; break;
case (21): com.fix_kappa=(int)t; break;
case (22): com.kappa=t; break;
case (23): com.fix_omega=(int)t; break;
case (24): com.omega=t; break;
case (25): com.fix_alpha=(int)t; break;
case (26): com.alpha=t; break;
case (27): com.nalpha=(int)t; break;
case (28): com.ncatG=(int)t; break;
case (29): com.fix_rho=(int)t; break;
case (30): com.rho=t; break;
case (31): com.ndata=(int)t; break;
case (32): Small_Diff=t; break;
case (33): com.fix_blength=(int)t; break;
}
break;
}
}
if (i==nopt)
{ printf ("\noption %s in %s not recognised\n", opt,ctlf); exit(-1); }
}
fclose (fctl);
if (noisy) FPN(F0);
setmark_61_64 ();
if (com.ngene==1) com.Mgene=0;
if (com.seqtype==AAseq || com.seqtype==CODON2AAseq) {
if(com.NSsites) error2("use NSsites=0 for amino acids?");
if(com.hkyREV) error2("use hkyREV=0 for amino acids?");
com.ncode=20;
switch (com.model) {
case (Poisson): case (EqualInput): case (Empirical): case (Empirical_F):
com.fix_kappa=1; com.kappa=0; com.nrate=0; break;
case (FromCodon):
com.nrate=com.nkappa=(com.hkyREV ? 5 : !com.fix_kappa);
if(com.aaDist) com.nrate++;
if(com.fix_omega) error2("fix_omega = 1");
break;
case (AAClasses):
if(com.aaDist) error2("aaDist & AAClasses");
com.nrate=com.nkappa=(com.hkyREV ? 5 : !com.fix_kappa);
break;
case (REVaa_0): com.fix_kappa=0; com.kappa=0; break;
case (REVaa): com.fix_kappa=0; com.kappa=0; com.nrate=189; break;
default: error2("model unavailable");
}
if (com.Mgene>2 || (com.Mgene==2 && (com.model==Fequal||com.model==2)))
error2 ("Mgene && model");
}
else if(com.seqtype==CODONseq) {
if(com.nparK)
if (com.model||com.aaDist||com.NSsites!=NSdiscrete||com.alpha||com.rho)
error2("HMM model option");
if(com.Mgene && com.model) error2("Mgene & model?");
if(com.hkyREV && com.fix_kappa) error2("hkyREV & fix_kappa?");
if(com.hkyREV && (com.aaDist || com.Mgene))
error2("hkyREV to do: check options?");
if (com.model==AAClasses && com.aaDist) error2("model & aaDist");
if(com.aaDist && (com.model || com.NSsites)) error2("aaDist model");
com.ncode=Nsensecodon[com.icode];
com.nrate=com.nkappa=(com.hkyREV ? 5 : !com.fix_kappa);
if (com.model!=AAClasses) {
if(com.fix_kappa>1) error2("fix_kappa>1, not tested."); /** ???? */
if (com.model>0 && (com.alpha || !com.fix_alpha))
error2("dN/dS ratios among branches not implemented for gamma");
if (com.fix_omega) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -