📄 codeml.c
字号:
j=ming2(noisy>2?frub:NULL,&lnL,com.plfun,NULL,x,xb, com.space,e,np);
if (j==-1 || lnL<=0 || lnL>1e7) status=-1; else status=0;
if(j) fprintf(fout,"\ncheck convergence..");
}
printf("Out..\nlnL = %12.6f\n",-lnL);
printf("%d lfun, %d eigenQc, %d P(t)\n",NFunCall, NEigenQ, NPMatUVRoot);
if (itree==0)
{ lnL0=lnL; FOR(i,np-com.ntime) xcom[i]=x[com.ntime+i]; }
else if (!j)
for (i=0; i<np-com.ntime; i++) xcom[i]=xcom[i]*.2+x[com.ntime+i]*0.8;
if(!LASTROUND && (com.NSsites==NSselection||com.NSsites==NSdiscrete
||com.NSsites==NSfreqs||com.NSsites==NS3normal)) {
/* transform back to p0, p1,... */
k=com.ntime+com.nrgene+com.nkappa;
if(com.nparK) { /* HMM model for w */
k+=com.ncatG;
for(i=0; i<com.ncatG; i++,k+=com.ncatG-1)
f_and_x(x+k,x+k,com.ncatG,0,0);
}
else {
j = (com.NSsites==NS3normal ? 3 : com.ncatG);
if(com.model && com.model<=NSbranch2) j=3;
f_and_x(x+k,x+k,j,0,0);
}
}
LASTROUND=1;
if(com.NSsites==NSdiscrete && com.aaDist==0 && com.model==0)
sortwM3(x);
if(com.clock) { /* this applies to all clock models (clock=1,2,3) */
for(i=com.ns; i<tree.nnode; i++)
if(i!=tree.root) x[i-com.ns]=nodes[i].divtime;
}
fprintf (fout,"\nlnL(ntime:%3d np:%3d):%14.6f%+14.6f\n",
com.ntime, np, -lnL, -lnL+lnL0);
if(com.fix_blength<2) { OutaTreeB(fout); FPN(fout); }
FOR (i,np) fprintf(fout," %8.5f",x[i]); FPN(fout); fflush(fout);
if (com.getSE) {
if(np>20) puts("Calculating SE's");
if(com.sspace<np*(np+1)*(int)sizeof(double)) {
com.sspace=np*(np+1)*sizeof(double);
if((com.space=(double*)realloc(com.space,com.sspace))==NULL)
error2("oom space for SE");
}
var=com.space+np;
Hessian (np, x, lnL, com.space, var, com.plfun, var+np*np);
matinv (var, np, np, var+np*np);
fprintf(fout,"SEs for parameters:\n");
FOR(i,np) fprintf(fout," %8.5f",(var[i*np+i]>0.?sqrt(var[i*np+i]):-1));
FPN(fout);
if (com.getSE==2) matout2(fout, var, np, np, 15, 10);
}
if(com.seqtype==1 && com.ntime)
fprintf(fout,"Note: Branch length is defined as number of nucleotide substitutions per codon (not per neucleotide site).\n");
if(com.NSsites==NSselection && x[com.ntime+com.nrgene+com.nkappa+2]<1)
fputs("\nNote: This model may have multiple optima. See doc.\n",fout);
/* if (com.clock) SetBranch (x); */
for(i=0,tl=0;i<tree.nnode;i++) if(i!=tree.root) tl+=nodes[i].branch;
fprintf(fout,"\ntree length = %9.5f%s\n",tl,com.ngene>1?" (1st gene)":"");
/*
if(com.NSsites) {
fprintf(frst1,"\n%-15s%4d %9.3f%9.2f ",
NSsitesmodels[com.NSsites],com.ls,tl,-lnL);
if(itree) fprintf(frst,"\t%.6f",x[0]);
fprintf(frst,"\t%.3f",-lnL);
}
fprintf(frst1,"\t%d\t%d\t%d",com.ns,com.ls,com.npatt);
for(i=com.ntime; i<com.np; i++) fprintf(frst1,"\t%.3f",x[i]);
fprintf(frst1,"\t%.3f\n",-lnL);
fflush(frst1);
*/
FPN(fout); OutaTreeN(fout,0,1); FPN(fout);
FPN(fout); OutaTreeN(fout,1,1); FPN(fout);
if(com.np-com.ntime||com.clock) DetailOutput(fout,x,var);
if (com.seqtype==AAseq && com.model>=2 /* AAClasses */)
EigenQaa(fout, Root, U, V, x+com.ntime+com.nrgene); /* S & PAM */
if (com.NSsites) lfunNSsites_rate(frst,x,np);
if (com.print) {
if(com.rho==0 && com.nparK==0)
AncestralSeqs(frst,x);
if(!com.NSsites && com.plfun!=lfun)
lfunRates(frate,x,np);
}
com.print-=9; com.plfun(x,np); com.print+=9;
/*if(noisy)
printf("%d eigenQc calls, %d lfun calls\n",N_eigenQc,NFunCall);*/
} /* for (itree) */
fclose(ftree);
if(frate) fclose(frate);
if (com.aaDist && com.aaDist<10
&& (com.seqtype==CODONseq||com.model==FromCodon))
printf("\n%s, %s.\n",com.daafile,(com.aaDist>0?"geometric":"linear"));
if(com.seqtype==1 && com.aaDist>=FIT1) free(pcodonClass);
if(ntree==-1) {
ntree=itree;
rewind(flnf);
fprintf(flnf,"%6d", ntree);
}
if(noisy && ntree>1) {
rewind(flnf);
rell(flnf,fout,ntree);
}
fclose(flnf);
return (0);
}
int sortwM3(double x[])
{
/* sort the w values for NSsites=NSdiscrete
This assumes that com.freqK[] and com.rK[] have been initialized.
*/
int i, k=com.ntime+com.nrgene+com.nkappa, rank[NCATG];
double space[NCATG];
if(com.NSsites!=NSdiscrete) error2("sortwM3");
if(fabs(1-sum(com.freqK,com.ncatG))>1e-6) error2("sortwM3: freqK");
if(com.nparK) { puts("\asortwM3 for HMM not implemented yet.."); return(-1); }
sort1(com.rK, com.ncatG, rank, 0, (int*)space);
xtoy(com.rK,space,com.ncatG);
FOR(i,com.ncatG) com.rK[i]=space[rank[i]];
xtoy(com.freqK,space,com.ncatG);
FOR(i,com.ncatG) com.freqK[i]=space[rank[i]];
FOR(i,com.ncatG-1) x[k+i]=com.freqK[i];
FOR(i,com.ncatG) x[k+com.ncatG-1+i]=com.rK[i];
return(0);
}
static int ijAAref=19*20+9;
/* reference aa pair: VI (for REVaa, REVaa_0, AAClasses to estimate Grantham)
The rate for this pair is set to 1, and other rates are relative to it.
*/
#define E1N(m,s) (s/sqrt(PI*2)*exp(-square((1-m)/s)/2)+m*(1-CDFNormal((1-m)/s)))
void DetailOutput (FILE *fout, double x[], double var[])
{
/* var[] is used for codon models if com.getSE=1 to calculate the variances
of dS and dN.
*/
int i,j,k=com.ntime, np=com.np,npclass;
double om=-1,N=-1,S=0,dN=0,dS=0,dSt,dNt, vtw[4],vSN[4], omclass[NCATG];
double phi1=0,phi2=0, tnode,t, *dSdNb=NULL;
double mu[3]={0,1,2},sig[3]={-1}; /* 3normal: mu0=0 fixed. mu2 estimated */
/* date estimation under molecular clocks */
if((com.clock==1 || com.clock==2) && noisy>=9) {
/* SetBranch() called before this. */
fputs("\nNode & distance to present\n",fout);
for(i=0; i<tree.nnode-com.ns;i++) {
printf("Node %3d distance %9.5f",com.ns+i+1,x[i]);
if(com.getSE) printf(" +- %9.5f",var[i*com.np+i]);
FPN(F0);
}
for (; ;) {
printf("\nreference node & node time (-1 -1 to quit)? ");
scanf("%d%lf", &j,&tnode);
if(j<com.ns) break;
FPN(F0);
fprintf(fout,"\n\nNode %d Time %.3f\n\n",j,tnode);
if(--j>=com.ns && tnode>0) {
for(i=com.ns, tnode/=nodes[j].divtime; i<tree.nnode;i++) {
printf("Node %3d Time %6.2f",i+1,nodes[i].divtime*tnode);
fprintf(fout,"Node %3d Time %6.2f",i+1,nodes[i].divtime*tnode);
if(com.getSE) {
printf(" +- %6.2f",var[(i-com.ns)*com.np+(i-com.ns)]*tnode);
fprintf(fout," +- %6.2f",var[(i-com.ns)*com.np+(i-com.ns)]*tnode);
}
FPN(F0); FPN(fout);
}
}
}
}
fprintf(fout,"\nDetailed output identifying parameters\n");
if(com.clock==2) {
fprintf (fout,"rates for branches: 1");
for(k=tree.nnode-com.ns; k<com.ntime; k++) fprintf(fout," %8.5f",x[k]);
}
else if(com.clock==3) {
fprintf(fout,"\nMutation rate = %.2e",x[com.ntime-1]/ScaleTimes_clock3);
if(com.getSE) fprintf(fout," +- %.2e", var[(com.ntime-1)*com.np+(com.ntime-1)]/ScaleTimes_clock3);
FPN(fout); FPN(fout);
for(i=0; i<tree.nnode; i++) {
fprintf(fout,"Node %3d Time %6.2f",
i+1,YoungDate-nodes[i].divtime*ScaleTimes_clock3);
if(com.getSE && i>=com.ns)
fprintf(fout," +- %6.2f\n", var[(i-com.ns)*com.np+(i-com.ns)]*ScaleTimes_clock3);
else FPN(fout);
}
}
if (com.nrgene) {
fprintf (fout, "\nrates for %d genes:%6.0f", com.ngene, 1.);
FOR (i,com.nrgene) fprintf (fout, " %8.5f", x[k++]);
FPN(fout);
}
if (com.seqtype==CODONseq || com.model==FromCodon) {
if(com.NSsites && com.model==0) { /* dN/dS by averaged over classes */
for(j=0,Qfactor_NS=0,dS=dN=0; j<com.ncatG; j++) {
freqK_NS=com.freqK[j];
if(com.aaDist) {
k=com.ntime+com.nrgene+com.nkappa;
if(com.aaDist<10) POMEGA=x+k+com.ncatG-1+2*j;
else if(com.aaDist>=FIT1) {
POMEGA=x+k+com.ncatG-1+j*(4+(com.aaDist==FIT2));
xtoy(pcodonClass+j*64, com.pi, com.ncode);
}
}
EigenQc(1,1,&S,&dSt,&dNt,NULL,NULL,NULL,
(com.hkyREV?x+com.ntime+com.nrgene:&com.kappa),com.rK[j],PMat);
/* t=1 used here, and dS & dN used later for each branch */
dS+=freqK_NS*dSt; dN+=freqK_NS*dNt;
omclass[j]=dNt/dSt;
}
Qfactor_NS=1/Qfactor_NS;
om=dN/dS; dS*=Qfactor_NS; dN*=Qfactor_NS; N=com.ls*3-S;
}
k=com.ntime+com.nrgene;
if (com.hkyREV) {
fprintf(fout,"a (TC) & b (TA) & c (TG) & d (CA) & e (CG): ");
FOR(i,5) fprintf(fout,"%8.5f ", x[k++]); FPN(fout);
}
else if (!com.fix_kappa)
fprintf(fout,"kappa (ts/tv) = %8.5f\n", x[k++]);
/* dN/dS rate ratios for classes */
if (com.NSsites>=NSgamma) {
fprintf(fout,"\nParameters in %s:\n ",NSsitesmodels[com.NSsites]);
if(com.NSsites==NSgamma)
fprintf(fout," a=%9.5f b=%9.5f\n",x[k],x[k+1]);
else if(com.NSsites==NS2gamma)
fprintf(fout," p0=%9.5f a0=%9.5f b0=%9.5f\n(p1=%9.5f) a1=%9.5f (b1=%9.5f)\n",
x[k],x[k+1],x[k+2], 1-x[k], x[k+3],x[k+3]);
else if(com.NSsites==NSbeta)
fprintf(fout,"p=%9.5f q=%9.5f\n",x[k],x[k+1]);
else if(com.NSsites==NSbetaw)
fprintf(fout," p0=%9.5f p=%9.5f q=%9.5f\n (p1=%9.5f) w=%9.5f\n",
x[k],x[k+1],x[k+2], 1-x[k], (com.fix_omega?com.omega:x[k+3]));
else if(com.NSsites==NSbetagamma)
fprintf(fout," p0=%9.5f p=%9.5f q=%9.5f\n(p1=%9.5f) a=%9.5f b=%9.5f\n",
x[k],x[k+1],x[k+2], 1-x[k], x[k+3],x[k+4]);
else if(com.NSsites==NSbeta1gamma)
fprintf(fout," p0=%9.5f p=%9.5f q=%9.5f\n(p1=%9.5f) a=%9.5f b=%9.5f\n",
x[k],x[k+1],x[k+2], 1-x[k], x[k+3],x[k+4]);
else if(com.NSsites==NSbeta1normal)
fprintf(fout," p0=%9.5f p=%9.5f q=%9.5f\n(p1=%9.5f) u=%9.5f s=%9.5f\n",
x[k],x[k+1],x[k+2], 1-x[k], x[k+3],x[k+4]);
else if(com.NSsites==NS02normal)
fprintf(fout,"p0=%9.5f p1=%9.5f u2=%9.5f s1=%9.5f s2=%9.5f\n",
x[k],x[k+1],x[k+2],x[k+3],x[k+4]);
else if(com.NSsites==NS3normal)
fprintf(fout,"p0=%9.5f p1=%9.5f (p2=%9.5f)\n u2=%9.5f s1=%9.5f s2=%9.5f s3=%9.5f\n",
x[k],x[k+1], 1-x[k]-x[k+1], x[k+2],x[k+3],x[k+4],x[k+5]);
}
if (com.NSsites==NSdiscrete && com.aaDist) { /* structural site classes */
npclass=(com.aaDist<10 ? 2 : (com.aaDist==FIT1?4:5));
fprintf(fout,"\nParameters in each class (%d)",npclass);
fprintf(fout,"%s:\n\n",
(com.aaDist<10 ? "(b, a)" : "(a_p, p*, a_v, v*, b)"));
for(j=0,k+=com.ncatG-1; j<com.ncatG; j++,FPN(fout)) {
fprintf(fout,"%d: f=%8.5f, ",j+1,com.freqK[j]);
FOR(i,npclass) fprintf(fout,"%9.5f",x[k++]);
fprintf(fout," dN/dS =%8.5f",omclass[j]);
}
}
else if (com.NSsites && com.model) {
fprintf(fout,"\n\ndN/dS for site classes (K=%d)\np: ",com.ncatG);
FOR(i,com.ncatG) fprintf(fout,"%9.5f",com.freqK[i]);
fputs("\nw: ",fout);
if(com.model<=NSbranch2) {
FOR(i,com.ncatG-2) fprintf(fout,"%9.5f",com.rK[i]);
fprintf(fout, " * *\nw2 = %.5f\n", (com.fix_omega?OMEGA_FIX:x[com.np-1]));
}
else if (com.model==NSbranch3) {
FOR(i,com.ncatG+1) fprintf(fout,"%9.5f",x[k+com.ncatG-1+i]);
FPN(fout);
}
}
else if (com.NSsites && com.aaDist==0) {
fprintf(fout,"\n\ndN/dS for site classes (K=%d)\np: ",com.ncatG);
FOR(i,com.ncatG) fprintf(fout,"%9.5f",com.freqK[i]);
fputs("\nw: ",fout);
FOR(i,com.ncatG) fprintf(fout,"%9.5f",com.rK[i]); FPN(fout);
if (com.nparK) {
fprintf(fout,"\nTransition matrix M in HMM: M_ij=Prob(i->j):\n");
matout(fout, com.MK, com.ncatG, com.ncatG);
}
}
else if(com.aaDist && com.aaDist<=6) { /* one class (YNH98, Genetics) */
k=com.ntime+com.nrgene+com.nkappa;
fprintf (fout,"\nb = %9.5f", x[k++]);
if (com.seqtype==CODONseq) fprintf (fout,"\na = %9.5f\n", x[k++]);
}
else if(com.aaDist && com.aaDist>=11) { /* fitness, one class */
fprintf (fout,"\nfitness model (a_p, p*, a_v, v*, (and w0 for FIT2):\n");
k=com.ntime+com.nrgene+(com.hkyREV?5:!com.fix_kappa);
FOR(i,4+(com.aaDist==FIT2)) fprintf(fout," %9.5f",x[k++]); FPN(fout);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -