mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1047 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Beef
		
	
	
	
	
	
			
		
		
	
	
			1047 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Beef
		
	
	
	
	
	
/* 
 | 
						|
	This file takes a nucleotide data set and a tree (either from the data file or from a separate 	file) and computes maximum likelihood estimates for every possible 4x4 reversible model on that data and tree.
 | 
						|
 | 
						|
		We use the string (v1,v2,v3,v4,v5,v6), where and v1..6 = 0..5
 | 
						|
   to encode a 4x4 symmetric transition matrix with entries
 | 
						|
   [*  v1  v2  v3]
 | 
						|
   [-  *   v4  v5]
 | 
						|
   [-  -   *   v6]
 | 
						|
   [-  -   -   * ]
 | 
						|
   
 | 
						|
   		For instance: (010010) encodes HKY85.
 | 
						|
   		
 | 
						|
   		For each model the following information is reported:
 | 
						|
   		- Model string. (e.g. (012345) for the GRM)
 | 
						|
   		- Number of model parameters
 | 
						|
   		- Max ln-likelihood for the model
 | 
						|
   		- Likelihood ratio statistic (as a sub-model of the GRM)
 | 
						|
   		- AIC
 | 
						|
   		- P-Value for the Likelihood Ratio Test.
 | 
						|
   		
 | 
						|
   
 | 
						|
   Sergei L. Kosakovsky Pond, Summer 2002.
 | 
						|
   
 | 
						|
*/ 
 | 
						|
 | 
						|
function ReceiveJobs (sendOrNot)
 | 
						|
{
 | 
						|
	if (MPI_NODE_COUNT>1)
 | 
						|
	{
 | 
						|
		MPIReceive (-1, fromNode, result_String);
 | 
						|
		jobModelNum = MPINodeState[fromNode-1][1];
 | 
						|
		vv1 = MPINodeState[fromNode-1][2];
 | 
						|
		vv2 = MPINodeState[fromNode-1][3];
 | 
						|
		vv3 = MPINodeState[fromNode-1][4];
 | 
						|
		vv4 = MPINodeState[fromNode-1][5];
 | 
						|
		vv5 = MPINodeState[fromNode-1][6];
 | 
						|
		vv6 = MPINodeState[fromNode-1][7];
 | 
						|
		if (sendOrNot)
 | 
						|
		{
 | 
						|
			MPISend (fromNode,lf);
 | 
						|
			MPINodeState[fromNode-1][1] = modelNum;		
 | 
						|
			MPINodeState[fromNode-1][2] = v1;
 | 
						|
			MPINodeState[fromNode-1][3] = v2;
 | 
						|
			MPINodeState[fromNode-1][4] = v3;
 | 
						|
			MPINodeState[fromNode-1][5] = v4;
 | 
						|
			MPINodeState[fromNode-1][6] = v5;
 | 
						|
			MPINodeState[fromNode-1][7] = v6;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			MPINodeState[fromNode-1][0] = 0;
 | 
						|
			MPINodeState[fromNode-1][1] = -1;		
 | 
						|
		}
 | 
						|
		
 | 
						|
		ExecuteCommands (result_String);
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		jobModelNum = modelNum;
 | 
						|
	}
 | 
						|
	
 | 
						|
	if (jobModelNum == 0)
 | 
						|
	{
 | 
						|
		stdl = lf_MLES[1][0];
 | 
						|
		fullnp = lf_MLES[1][1]+addOn;
 | 
						|
		fprintf(stdout,"\n(012345) Full Model ln-lik =  ",stdl,". Parameter Count=",Format(fullnp,0,0)," AIC = ", 2*(fullnp-stdl),"\n\n");
 | 
						|
 | 
						|
 | 
						|
		resultCache [0][0] = 1;
 | 
						|
		resultCache [0][1] = 2;
 | 
						|
		resultCache [0][2] = 3;
 | 
						|
		resultCache [0][3] = 4;
 | 
						|
		resultCache [0][4] = 5;
 | 
						|
		resultCache [0][5] = lf_MLES[1][0];
 | 
						|
		resultCache [0][6] = lf_MLES[1][1]+addOn;
 | 
						|
		resultCache [0][7] = 0;
 | 
						|
		resultCache [0][8] = 0;
 | 
						|
		
 | 
						|
		fprintf (stdout,"\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
 | 
						|
		fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|");   
 | 
						|
 | 
						|
		if (MPI_NODE_COUNT>1)
 | 
						|
		{
 | 
						|
			for (h=1; h<203; h=h+1)
 | 
						|
			{
 | 
						|
				lnL = resultCache[h][5];
 | 
						|
				
 | 
						|
				if (lnL<0)
 | 
						|
				{
 | 
						|
					np = resultCache[h][6];
 | 
						|
					LRT = -2*(lnL-stdl);
 | 
						|
					if (LRT<0)
 | 
						|
					{
 | 
						|
						LRT = 0;
 | 
						|
					}
 | 
						|
					AIC = -2*lnL+2*np;
 | 
						|
					PRINT_DIGITS = 3;
 | 
						|
					fprintf (stdout,"\n",h);
 | 
						|
					PRINT_DIGITS = 1;
 | 
						|
					fprintf (stdout," | (",0, resultCache[h][0], resultCache[h][1], resultCache[h][2], resultCache[h][3], resultCache[h][4],") | ");
 | 
						|
					fprintf (stdout,Format (np,5,0));
 | 
						|
					PRINT_DIGITS = 8;
 | 
						|
					fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
 | 
						|
					
 | 
						|
					PRINT_DIGITS = 15;
 | 
						|
					if (LRT==0)
 | 
						|
					{
 | 
						|
						pValue = 1;					
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						pValue = 1-CChi2(LRT,fullnp-np);
 | 
						|
					}
 | 
						|
					fprintf (stdout,pValue," |");
 | 
						|
					resultCache [jobModelNum][7] = pValue;
 | 
						|
					if (pValue<rejectAt)
 | 
						|
					{
 | 
						|
						rejectCount = rejectCount+1;
 | 
						|
						resultCache [jobModelNum][8] = 0;
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						resultCache [jobModelNum][8] = 1;					
 | 
						|
					}
 | 
						|
					
 | 
						|
					if (pValue<rejectAt)
 | 
						|
					{
 | 
						|
						fprintf (stdout,"(*)");
 | 
						|
					}				
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		return fromNode-1;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		if ((MPI_NODE_COUNT>1)&&(resultCache[0][5]>=0))
 | 
						|
		{
 | 
						|
			resultCache [jobModelNum][0] = vv2;
 | 
						|
			resultCache [jobModelNum][1] = vv3;
 | 
						|
			resultCache [jobModelNum][2] = vv4;
 | 
						|
			resultCache [jobModelNum][3] = vv5;
 | 
						|
			resultCache [jobModelNum][4] = vv6;
 | 
						|
			resultCache [jobModelNum][5] = lf_MLES[1][0];
 | 
						|
			resultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;
 | 
						|
			return fromNode - 1;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	np = lf_MLES[1][1]+addOn;
 | 
						|
	lnL = lf_MLES[1][0];
 | 
						|
	LRT = -2*(lnL-stdl);
 | 
						|
	if (LRT<0)
 | 
						|
	{
 | 
						|
		LRT = 0;
 | 
						|
	}
 | 
						|
	AIC = -2*lnL+2*np;
 | 
						|
	PRINT_DIGITS = 3;
 | 
						|
	fprintf (stdout,"\n",jobModelNum);
 | 
						|
	PRINT_DIGITS = 1;
 | 
						|
	fprintf (stdout," | (",vv1,vv2,vv3,vv4,vv5,vv6,") | ");
 | 
						|
	fprintf (stdout,Format (np,5,0));
 | 
						|
	PRINT_DIGITS = 8;
 | 
						|
	fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
 | 
						|
	
 | 
						|
	
 | 
						|
	PRINT_DIGITS = 15;
 | 
						|
	if (LRT==0)
 | 
						|
	{
 | 
						|
		pValue = 1;					
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		pValue = 1-CChi2(LRT,fullnp-np);
 | 
						|
	}
 | 
						|
	fprintf (stdout,pValue," |");
 | 
						|
	
 | 
						|
	resultCache [jobModelNum][0] = vv2;
 | 
						|
	resultCache [jobModelNum][1] = vv3;
 | 
						|
	resultCache [jobModelNum][2] = vv4;
 | 
						|
	resultCache [jobModelNum][3] = vv5;
 | 
						|
	resultCache [jobModelNum][4] = vv6;
 | 
						|
	resultCache [jobModelNum][5] = lf_MLES[1][0];
 | 
						|
	resultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;
 | 
						|
	resultCache [jobModelNum][7] = pValue;
 | 
						|
	if (pValue<rejectAt)
 | 
						|
	{
 | 
						|
		rejectCount = rejectCount+1;
 | 
						|
		resultCache [jobModelNum][8] = 0;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		resultCache [jobModelNum][8] = 1;					
 | 
						|
	}
 | 
						|
	
 | 
						|
	if (pValue<rejectAt)
 | 
						|
	{
 | 
						|
		fprintf (stdout,"(*)");
 | 
						|
	}
 | 
						|
			
 | 
						|
	return fromNode-1;
 | 
						|
}
 | 
						|
 | 
						|
function PopulateModelMatrix (ModelMatrixName&, EFV)
 | 
						|
{
 | 
						|
	if (!ModelMatrixDimension)
 | 
						|
	{
 | 
						|
		ModelMatrixDimension = 64;
 | 
						|
		for (h = 0 ;h<64; h=h+1)
 | 
						|
		{
 | 
						|
			if (_Genetic_Code[h]==10)
 | 
						|
			{
 | 
						|
				ModelMatrixDimension = ModelMatrixDimension-1;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	
 | 
						|
	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
 | 
						|
 | 
						|
	hshift = 0;
 | 
						|
 | 
						|
	if (modelType == 0)
 | 
						|
	{
 | 
						|
		for (h=0; h<64; h=h+1)
 | 
						|
		{
 | 
						|
			if (_Genetic_Code[h]==10) 
 | 
						|
			{
 | 
						|
				hshift = hshift+1;
 | 
						|
				continue; 
 | 
						|
			}
 | 
						|
			vshift = hshift;
 | 
						|
			for (v = h+1; v<64; v=v+1)
 | 
						|
			{
 | 
						|
				diff = v-h;
 | 
						|
				if (_Genetic_Code[v]==10) 
 | 
						|
				{
 | 
						|
					vshift = vshift+1;
 | 
						|
					continue; 
 | 
						|
				}
 | 
						|
				nucPosInCodon = 2;
 | 
						|
			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
 | 
						|
			  	{
 | 
						|
			  		if (h$4==v$4)
 | 
						|
			  		{
 | 
						|
			  			transition = v%4;
 | 
						|
			  			transition2= h%4;
 | 
						|
			  		}
 | 
						|
			  		else
 | 
						|
			  		{
 | 
						|
			  			if(diff%16==0)
 | 
						|
			  			{
 | 
						|
			  				transition = v$16;
 | 
						|
			  				transition2= h$16;
 | 
						|
							nucPosInCodon = 0;
 | 
						|
			  			}
 | 
						|
			  			else
 | 
						|
			  			{
 | 
						|
			  				transition = v%16$4;
 | 
						|
			  				transition2= h%16$4;
 | 
						|
							nucPosInCodon = 1;
 | 
						|
			  			}
 | 
						|
			  		}
 | 
						|
			  		
 | 
						|
			  		rateType = mSpecMatrix[transition][transition2];
 | 
						|
			  		
 | 
						|
			  		if (rateType == 1)
 | 
						|
			  		{
 | 
						|
				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
				  		{
 | 
						|
				  			ModelMatrixName[h-hshift][v-vshift] := AC*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
				  			ModelMatrixName[v-vshift][h-hshift] := AC*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
					  	}
 | 
						|
				  		else
 | 
						|
				  		{
 | 
						|
					  		ModelMatrixName[h-hshift][v-vshift] := AC*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
				  			ModelMatrixName[v-vshift][h-hshift] := AC*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
			  			}
 | 
						|
			  		}
 | 
						|
			  		else
 | 
						|
			  		{
 | 
						|
				  		if (rateType == 2)
 | 
						|
				  		{
 | 
						|
					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
					  		{
 | 
						|
					  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
					  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
						  	}
 | 
						|
					  		else
 | 
						|
					  		{
 | 
						|
						  		ModelMatrixName[h-hshift][v-vshift] := R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
					  			ModelMatrixName[v-vshift][h-hshift] := R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
				  			}
 | 
						|
				  		}
 | 
						|
				  		else
 | 
						|
				  		{
 | 
						|
					  		if (rateType == 3)
 | 
						|
					  		{
 | 
						|
						  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
						  		{
 | 
						|
						  			ModelMatrixName[h-hshift][v-vshift] := AT*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
						  			ModelMatrixName[v-vshift][h-hshift] := AT*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
							  	}
 | 
						|
						  		else
 | 
						|
						  		{
 | 
						|
							  		ModelMatrixName[h-hshift][v-vshift] := AT*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
						  			ModelMatrixName[v-vshift][h-hshift] := AT*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
					  			}
 | 
						|
					  		}
 | 
						|
					  		else
 | 
						|
					  		{
 | 
						|
						  		if (rateType == 4)
 | 
						|
						  		{
 | 
						|
							  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
							  		{
 | 
						|
							  			ModelMatrixName[h-hshift][v-vshift] := CG*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
							  			ModelMatrixName[v-vshift][h-hshift] := CG*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
								  	}
 | 
						|
							  		else
 | 
						|
							  		{
 | 
						|
								  		ModelMatrixName[h-hshift][v-vshift] := CG*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
							  			ModelMatrixName[v-vshift][h-hshift] := CG*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
						  			}
 | 
						|
						  		}
 | 
						|
						  		else
 | 
						|
						  		{
 | 
						|
							  		if (rateType == 5)
 | 
						|
							  		{
 | 
						|
								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
								  		{
 | 
						|
								  			ModelMatrixName[h-hshift][v-vshift] := CT*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := CT*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
									  	}
 | 
						|
								  		else
 | 
						|
								  		{
 | 
						|
									  		ModelMatrixName[h-hshift][v-vshift] := CT*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := CT*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
							  			}
 | 
						|
							  		}
 | 
						|
							  		else
 | 
						|
							  		{
 | 
						|
								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
								  		{
 | 
						|
								  			ModelMatrixName[h-hshift][v-vshift] := GT*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := GT*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
									  	}
 | 
						|
								  		else
 | 
						|
								  		{
 | 
						|
									  		ModelMatrixName[h-hshift][v-vshift] := GT*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := GT*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
							  			}
 | 
						|
							  		}
 | 
						|
							  	}
 | 
						|
						  	}
 | 
						|
					  	}
 | 
						|
				  	}
 | 
						|
			  	}
 | 
						|
			}
 | 
						|
		}	
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		for (h=0; h<64; h=h+1)
 | 
						|
		{
 | 
						|
			if (_Genetic_Code[h]==10) 
 | 
						|
			{
 | 
						|
				hshift = hshift+1;
 | 
						|
				continue; 
 | 
						|
			}
 | 
						|
			vshift = hshift;
 | 
						|
			for (v = h+1; v<64; v=v+1)
 | 
						|
			{
 | 
						|
				diff = v-h;
 | 
						|
				if (_Genetic_Code[v]==10) 
 | 
						|
				{
 | 
						|
					vshift = vshift+1;
 | 
						|
					continue; 
 | 
						|
				}
 | 
						|
				nucPosInCodon = 2;
 | 
						|
			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
 | 
						|
			  	{
 | 
						|
			  		if (h$4==v$4)
 | 
						|
			  		{
 | 
						|
			  			transition = v%4;
 | 
						|
			  			transition2= h%4;
 | 
						|
			  		}
 | 
						|
			  		else
 | 
						|
			  		{
 | 
						|
			  			if(diff%16==0)
 | 
						|
			  			{
 | 
						|
			  				transition = v$16;
 | 
						|
			  				transition2= h$16;
 | 
						|
							nucPosInCodon = 0;
 | 
						|
			  			}
 | 
						|
			  			else
 | 
						|
			  			{
 | 
						|
			  				transition = v%16$4;
 | 
						|
			  				transition2= h%16$4;
 | 
						|
							nucPosInCodon = 1;
 | 
						|
			  			}
 | 
						|
			  		}
 | 
						|
			  		
 | 
						|
			  		rateType = mSpecMatrix[transition][transition2];
 | 
						|
			  		
 | 
						|
					if (rateType == 1)
 | 
						|
			  		{
 | 
						|
				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
				  		{
 | 
						|
				  			ModelMatrixName[h-hshift][v-vshift] := c*AC*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
				  			ModelMatrixName[v-vshift][h-hshift] := c*AC*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
					  	}
 | 
						|
				  		else
 | 
						|
				  		{
 | 
						|
					  		ModelMatrixName[h-hshift][v-vshift] := c*AC*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
				  			ModelMatrixName[v-vshift][h-hshift] := c*AC*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
			  			}
 | 
						|
			  		}
 | 
						|
			  		else
 | 
						|
			  		{
 | 
						|
				  		if (rateType == 2)
 | 
						|
				  		{
 | 
						|
					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
					  		{
 | 
						|
					  			ModelMatrixName[h-hshift][v-vshift] := c*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
					  			ModelMatrixName[v-vshift][h-hshift] := c*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
						  	}
 | 
						|
					  		else
 | 
						|
					  		{
 | 
						|
						  		ModelMatrixName[h-hshift][v-vshift] := c*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
					  			ModelMatrixName[v-vshift][h-hshift] := c*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
				  			}
 | 
						|
				  		}
 | 
						|
				  		else
 | 
						|
				  		{
 | 
						|
					  		if (rateType == 3)
 | 
						|
					  		{
 | 
						|
						  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
						  		{
 | 
						|
						  			ModelMatrixName[h-hshift][v-vshift] := c*AT*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
						  			ModelMatrixName[v-vshift][h-hshift] := c*AT*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
							  	}
 | 
						|
						  		else
 | 
						|
						  		{
 | 
						|
							  		ModelMatrixName[h-hshift][v-vshift] := c*AT*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
						  			ModelMatrixName[v-vshift][h-hshift] := c*AT*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
					  			}
 | 
						|
					  		}
 | 
						|
					  		else
 | 
						|
					  		{
 | 
						|
						  		if (rateType == 4)
 | 
						|
						  		{
 | 
						|
							  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
							  		{
 | 
						|
							  			ModelMatrixName[h-hshift][v-vshift] := c*CG*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
							  			ModelMatrixName[v-vshift][h-hshift] := c*CG*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
								  	}
 | 
						|
							  		else
 | 
						|
							  		{
 | 
						|
								  		ModelMatrixName[h-hshift][v-vshift] := c*CG*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
							  			ModelMatrixName[v-vshift][h-hshift] := c*CG*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
						  			}
 | 
						|
						  		}
 | 
						|
						  		else
 | 
						|
						  		{
 | 
						|
							  		if (rateType == 5)
 | 
						|
							  		{
 | 
						|
								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
								  		{
 | 
						|
								  			ModelMatrixName[h-hshift][v-vshift] := c*CT*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := c*CT*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
									  	}
 | 
						|
								  		else
 | 
						|
								  		{
 | 
						|
									  		ModelMatrixName[h-hshift][v-vshift] := c*CT*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := c*CT*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
							  			}
 | 
						|
							  		}
 | 
						|
							  		else
 | 
						|
							  		{
 | 
						|
								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
 | 
						|
								  		{
 | 
						|
								  			ModelMatrixName[h-hshift][v-vshift] := c*GT*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := c*GT*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
									  	}
 | 
						|
								  		else
 | 
						|
								  		{
 | 
						|
									  		ModelMatrixName[h-hshift][v-vshift] := c*GT*R*synRate*EFV__[transition__][nucPosInCodon__];
 | 
						|
								  			ModelMatrixName[v-vshift][h-hshift] := c*GT*R*synRate*EFV__[transition2__][nucPosInCodon__];
 | 
						|
							  			}
 | 
						|
							  		}
 | 
						|
							  	}
 | 
						|
						  	}
 | 
						|
					  	}
 | 
						|
				  	}				  	
 | 
						|
				  }
 | 
						|
			}
 | 
						|
		}	
 | 
						|
	}	
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function BuildCodonFrequencies (obsF)
 | 
						|
{
 | 
						|
	PIStop = 1.0;
 | 
						|
	result = {ModelMatrixDimension,1};
 | 
						|
	hshift = 0;
 | 
						|
 | 
						|
	for (h=0; h<64; h=h+1)
 | 
						|
	{
 | 
						|
		first = h$16;
 | 
						|
		second = h%16$4;
 | 
						|
		third = h%4;
 | 
						|
		if (_Genetic_Code[h]==10) 
 | 
						|
		{
 | 
						|
			hshift = hshift+1;
 | 
						|
			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
 | 
						|
			continue; 
 | 
						|
		}
 | 
						|
		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
 | 
						|
	}
 | 
						|
	return result*(1.0/PIStop);
 | 
						|
}
 | 
						|
 | 
						|
function  setElement (h,v,cc)
 | 
						|
{	
 | 
						|
	mSpecMatrix[h][v]=cc+1;
 | 
						|
	mSpecMatrix[v][h]=cc+1;
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function printModelMatrix (modelString)
 | 
						|
{
 | 
						|
	
 | 
						|
	mstrConv = "1";
 | 
						|
	for (v2 = 1; v2 < 6; v2 = v2+1)
 | 
						|
	{
 | 
						|
		if (modelString[v2]=="0")
 | 
						|
		{
 | 
						|
			mstrConv = mstrConv+"1";
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			if (modelString[v2]=="1")
 | 
						|
			{
 | 
						|
				mstrConv = mstrConv+"B";
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				if (modelString[v2]=="2")
 | 
						|
				{
 | 
						|
					mstrConv = mstrConv+"C";
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					if (modelString[v2]=="3")
 | 
						|
					{
 | 
						|
						mstrConv = mstrConv+"D";
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						if (modelString[v2]=="4")
 | 
						|
						{
 | 
						|
							mstrConv = mstrConv+"E";
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							mstrConv = mstrConv+"F";
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	sep = "+---+-----+-----+-----+-----+\n";
 | 
						|
	fprintf (stdout, sep,
 | 
						|
					 "|   |  A  |  C  |  G  |  T  |\n",
 | 
						|
					 sep,
 | 
						|
					 "| A |  *  | ", mstrConv[0], "*t | ", mstrConv[1], "*t | ", mstrConv[2], "*t |\n",
 | 
						|
					 sep,
 | 
						|
					 "| C | ", mstrConv[0], "*t |  *  | ", mstrConv[3], "*t | ", mstrConv[4], "*t |\n",
 | 
						|
					 sep,
 | 
						|
					 "| G | ", mstrConv[1], "*t | " , mstrConv[3], "*t |  *  | ", mstrConv[5], "*t |\n",
 | 
						|
					 sep,
 | 
						|
					 "| T | ", mstrConv[2], "*t | " , mstrConv[4], "*t | ", mstrConv[5], "*t |  *  |\n",
 | 
						|
					 sep, "\nt = synRate for synonymous substitutions, and t=R*synRate for non-synonumous ones.\n");
 | 
						|
						 
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
#include 				   "TemplateModels/chooseGeneticCode.def";
 | 
						|
SetDialogPrompt 		   ("Please specify a codon data file:");
 | 
						|
 | 
						|
DataSet 				   ds 			= ReadDataFile (PROMPT_FOR_FILE);
 | 
						|
DataSetFilter 			   filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
 | 
						|
 | 
						|
fprintf 				   (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
 | 
						|
 | 
						|
 | 
						|
HarvestFrequencies         (observedFreq,filteredData,3,1,1);
 | 
						|
 | 
						|
mSpecMatrix 			   = {{*,1,1,1}{1,*,1,1}{1,1,*,1}{1,1,1,*}};
 | 
						|
ModelMatrixDimension       = 0;
 | 
						|
 | 
						|
_DO_TREE_REBALANCE_ = 1;
 | 
						|
 | 
						|
#include "queryTree.bf";
 | 
						|
#include "TemplateModels/modelParameters5.mdl";
 | 
						|
 | 
						|
if (modelType > 0)
 | 
						|
{
 | 
						|
	#include "TemplateModels/defineGamma.mdl";
 | 
						|
}
 | 
						|
 | 
						|
ChoiceList (branchLengths,"Estimate Branch Lengths",1,SKIP_NONE,
 | 
						|
			"Every Time","Branch lengths are reestimated for every model.",
 | 
						|
			"Once","Branch lenghts obtained from the nucleotide GTR model and reused for subsequent models."
 | 
						|
	       );
 | 
						|
 | 
						|
if (branchLengths<0)
 | 
						|
{
 | 
						|
	return;
 | 
						|
}
 | 
						|
 | 
						|
rejectAt = 0;
 | 
						|
 | 
						|
while ((rejectAt<=0)||(rejectAt>=1))
 | 
						|
{
 | 
						|
	fprintf (stdout, "\nModel rejection level (e.g. 0.05):");
 | 
						|
	fscanf  (stdin,"Number", rejectAt);
 | 
						|
}
 | 
						|
 | 
						|
SetDialogPrompt ("Save results to:"); 
 | 
						|
 
 | 
						|
fprintf (PROMPT_FOR_FILE, CLEAR_FILE); 
 | 
						|
BASE_PATH = LAST_FILE_PATH; 
 | 
						|
 | 
						|
KEEP_OPTIMAL_ORDER = 1;
 | 
						|
MESSAGE_LOGGING = 0;
 | 
						|
 | 
						|
global AC=1;
 | 
						|
global AT=1;
 | 
						|
global CG=1;
 | 
						|
global CT=1;
 | 
						|
global GT=1;
 | 
						|
global R=1;
 | 
						|
 | 
						|
 | 
						|
r = setElement (0,2,1);
 | 
						|
r = setElement (0,3,2);
 | 
						|
r = setElement (1,2,3);
 | 
						|
r = setElement (1,3,4);
 | 
						|
r = setElement (2,3,5);
 | 
						|
 | 
						|
MG94custom = 0;
 | 
						|
MULTIPLY_BY_FREQS     = PopulateModelMatrix ("MG94custom", observedFreq);
 | 
						|
vectorOfFrequencies   = BuildCodonFrequencies (observedFreq);
 | 
						|
Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
 | 
						|
 | 
						|
USE_POSITION_SPECIFIC_FREQS = 1;
 | 
						|
Tree tr = treeString;
 | 
						|
 | 
						|
addOn = 0;
 | 
						|
 | 
						|
if (branchLengths)
 | 
						|
{
 | 
						|
	global TreeScaler = 1;
 | 
						|
	GTRMatrix = {{*,AC*nt,nt,AT*nt}{AC*nt,*,CG*nt,CT*nt}{nt,CG*nt,*,GT*nt}{AT*nt,CT*nt,GT*nt,*}};
 | 
						|
	DataSetFilter 	nucFilter = CreateFilter (filteredData,1);
 | 
						|
	HarvestFrequencies         (nucFreq,nucFilter,1,1,1);
 | 
						|
	Model GTRModel = (GTRMatrix,nucFreq,1);
 | 
						|
	givenTreeString = Format (tr,0,0);
 | 
						|
	Tree nucTree = givenTreeString;
 | 
						|
	LikelihoodFunction lfn = (nucFilter, nucTree);
 | 
						|
	Optimize (nres,lfn);
 | 
						|
	ReplicateConstraint ("this1.?.synRate:=this2.?.nt__/TreeScaler",tr,nucTree);
 | 
						|
	addOn = nres[1][1]-nres[1][2]-1;
 | 
						|
}
 | 
						|
 | 
						|
LikelihoodFunction lf = (filteredData, tr);
 | 
						|
 | 
						|
resultCache = {203,9};
 | 
						|
 | 
						|
modelNum	= 0;
 | 
						|
rejectCount = 0;
 | 
						|
 | 
						|
if (MPI_NODE_COUNT>1)
 | 
						|
{
 | 
						|
	MPINodeState = {MPI_NODE_COUNT-1,8};
 | 
						|
	OPTIMIZE_SUMMATION_ORDER = 0;
 | 
						|
	MPISend (1,lf);
 | 
						|
	MPINodeState[0][0] = 1;
 | 
						|
	MPINodeState[0][1] = modelNum;
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
	Optimize (lf_MLES,lf);
 | 
						|
	vv1 = 0;
 | 
						|
	vv2 = 0;
 | 
						|
	vv3 = 0;
 | 
						|
	vv4 = 0;
 | 
						|
	vv5 = 0;
 | 
						|
	vv6 = 0;
 | 
						|
	dummy = ReceiveJobs (0);
 | 
						|
}
 | 
						|
 | 
						|
rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
 | 
						|
 | 
						|
for (v2=0; v2<=1; v2=v2+1)
 | 
						|
{
 | 
						|
	for (v3=0; v3<=v2+1; v3=v3+1)
 | 
						|
	{
 | 
						|
		if (v3>v2)
 | 
						|
		{
 | 
						|
			ub4 = v3;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			ub4 = v2;
 | 
						|
		}
 | 
						|
		for (v4=0; v4<=ub4+1; v4=v4+1)
 | 
						|
		{
 | 
						|
			if (v4>=ub4)
 | 
						|
			{
 | 
						|
				ub5 = v4;
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				ub5 = ub4;
 | 
						|
			}
 | 
						|
			for (v5=0; v5<=ub5+1; v5=v5+1)
 | 
						|
			{
 | 
						|
				if (v5>ub5)
 | 
						|
				{
 | 
						|
					ub6 = v5;
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					ub6 = ub5;
 | 
						|
				}
 | 
						|
				for (v6=0; v6<=ub6+1; v6=v6+1)
 | 
						|
				{
 | 
						|
					if (v6==5)
 | 
						|
					{
 | 
						|
						break;
 | 
						|
					}
 | 
						|
 | 
						|
					R = 1;
 | 
						|
 | 
						|
					paramCount	  = 0;
 | 
						|
 | 
						|
					modelDesc = "0"+Format(v2,1,0);
 | 
						|
					modelDesc = modelDesc+Format(v3,1,0);
 | 
						|
					modelDesc = modelDesc+Format(v4,1,0);
 | 
						|
					modelDesc = modelDesc+Format(v5,1,0);
 | 
						|
					modelDesc = modelDesc+Format(v6,1,0);
 | 
						|
					
 | 
						|
					modelConstraintString = "";
 | 
						|
					
 | 
						|
					AC = 1;
 | 
						|
					AT = 1;
 | 
						|
					CG = 1;
 | 
						|
					CT = 1;
 | 
						|
					GT = 1;
 | 
						|
 | 
						|
					for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
 | 
						|
					{
 | 
						|
						for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
 | 
						|
						{
 | 
						|
							if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
 | 
						|
							{
 | 
						|
								if (rateBiasTerms[customLoopCounter2] == "1")
 | 
						|
								{
 | 
						|
									modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
 | 
						|
								}
 | 
						|
								else
 | 
						|
								{
 | 
						|
									modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
 | 
						|
								}
 | 
						|
								break;
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}	
 | 
						|
 | 
						|
					if (Abs(modelConstraintString))
 | 
						|
					{
 | 
						|
						ExecuteCommands (modelConstraintString);
 | 
						|
					}					
 | 
						|
										
 | 
						|
 | 
						|
					modelNum = modelNum+1;
 | 
						|
					if (MPI_NODE_COUNT>1)
 | 
						|
					{
 | 
						|
						for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
 | 
						|
						{
 | 
						|
							if (MPINodeState[mpiNode][0]==0)
 | 
						|
							{
 | 
						|
								break;	
 | 
						|
							}
 | 
						|
						}
 | 
						|
						
 | 
						|
						if (mpiNode==MPI_NODE_COUNT-1)
 | 
						|
						/* all nodes busy */
 | 
						|
						{
 | 
						|
							mpiNode = ReceiveJobs (1);
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							MPISend (mpiNode+1,lf);
 | 
						|
							MPINodeState[mpiNode][0] = 1;
 | 
						|
							MPINodeState[mpiNode][1] = modelNum;
 | 
						|
							MPINodeState[mpiNode][2] = v1;
 | 
						|
							MPINodeState[mpiNode][3] = v2;
 | 
						|
							MPINodeState[mpiNode][4] = v3;
 | 
						|
							MPINodeState[mpiNode][5] = v4;
 | 
						|
							MPINodeState[mpiNode][6] = v5;
 | 
						|
							MPINodeState[mpiNode][7] = v6;
 | 
						|
						}
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
						Optimize (lf_MLES,lf);
 | 
						|
						vv1 = v1;
 | 
						|
						vv2 = v2;
 | 
						|
						vv3 = v3;
 | 
						|
						vv4 = v4;
 | 
						|
						vv5 = v5;
 | 
						|
						vv6 = v6;
 | 
						|
						dummy = ReceiveJobs (0);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
if (MPI_NODE_COUNT>1)
 | 
						|
{
 | 
						|
	while (1)
 | 
						|
	{
 | 
						|
		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
 | 
						|
		{
 | 
						|
			if (MPINodeState[nodeCounter][0]==1)
 | 
						|
			{
 | 
						|
				fromNode = ReceiveJobs (0);
 | 
						|
				break;	
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if (nodeCounter == MPI_NODE_COUNT-1)
 | 
						|
		{
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}	
 | 
						|
	OPTIMIZE_SUMMATION_ORDER = 1;
 | 
						|
}
 | 
						|
 | 
						|
function checkEmbedding (_m1, _m2)
 | 
						|
{
 | 
						|
	for (r=0; r<6; r=r+1)
 | 
						|
	{
 | 
						|
		if (_m2[r]<_m1[r])
 | 
						|
		{
 | 
						|
			/*fprintf (stdout,_m1," ", _m2, " Reject 1 at position ",r,"\n");*/
 | 
						|
			return 0;
 | 
						|
		}
 | 
						|
		if (_m2[r]>_m1[r])
 | 
						|
		{
 | 
						|
			for (r2 = 0; r2 < 6; r2 = r2+1)
 | 
						|
			{
 | 
						|
				if ((_m2[r2]==_m2[r])&&(_m1[r2]!=_m1[r]))
 | 
						|
				{
 | 
						|
					/*fprintf (stdout,_m1," ", _m2, " Reject 2 at positions ",r,r2,"\n");*/
 | 
						|
					return 0;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
PRINT_DIGITS = 0;
 | 
						|
 | 
						|
fprintf (stdout, "\n\n--------------------------\n   (*) => p-Value < ", rejectAt, "\nRejected ", rejectCount, " models.\n");
 | 
						|
 | 
						|
 | 
						|
if (rejectCount<202)
 | 
						|
{
 | 
						|
 | 
						|
	fprintf (stdout, "\nPerforming nested tests on the remaining models...\n");
 | 
						|
 | 
						|
	done = 0;
 | 
						|
	while (!done)
 | 
						|
	{
 | 
						|
		done = 1;
 | 
						|
		for (v2=1; v2<203; v2=v2+1)
 | 
						|
		{
 | 
						|
			if (resultCache[v2][8])
 | 
						|
			{
 | 
						|
				modelString = "0";
 | 
						|
				for (v3 = 0; v3<5; v3=v3+1)
 | 
						|
				{
 | 
						|
					modelString = modelString + resultCache [v2][v3];
 | 
						|
				}
 | 
						|
				for (v3 = v2+1; v3<203; v3 = v3+1)
 | 
						|
				{
 | 
						|
					if (resultCache[v3][8])
 | 
						|
					{
 | 
						|
						modelString2 = "0";
 | 
						|
						for (v4 = 0; v4<5; v4=v4+1)
 | 
						|
						{
 | 
						|
							modelString2 = modelString2 + resultCache [v3][v4];
 | 
						|
						}	
 | 
						|
						if (checkEmbedding (modelString, modelString2))
 | 
						|
						{
 | 
						|
							fprintf (stdout,"H: (", modelString,") A: (", modelString2, "). ");
 | 
						|
							done = 0;
 | 
						|
							LRT = 2*(resultCache[v3][5]-resultCache[v2][5]);
 | 
						|
							npd = resultCache[v3][6]-resultCache[v2][6];
 | 
						|
							if (LRT<0)
 | 
						|
							{
 | 
						|
								pValue = 1;
 | 
						|
							}
 | 
						|
							else
 | 
						|
							{
 | 
						|
								pValue = 1-CChi2(LRT,npd);
 | 
						|
							}
 | 
						|
							fprintf (stdout," P-Value=", Format (pValue,10,3));
 | 
						|
							if (pValue<rejectAt)
 | 
						|
							{
 | 
						|
								fprintf (stdout,". Rejected H.\n");
 | 
						|
								resultCache[v2][8] = 0;
 | 
						|
								break;
 | 
						|
							}
 | 
						|
							else
 | 
						|
							{
 | 
						|
								fprintf (stdout,". Failed to reject H. Discarding A.\n");
 | 
						|
								resultCache[v3][8] = 0;
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	fprintf (stdout,"\n\nRemaining models:\n\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
 | 
						|
	fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|"); 
 | 
						|
	fprintf (BASE_PATH,"\n\nRemaining models:\n\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
 | 
						|
	fprintf (BASE_PATH,"\n----|----------|-------|-----------|----------------|------------|------------------|"); 
 | 
						|
	
 | 
						|
	modelNum = 0;  
 | 
						|
	v5 = 1e10;
 | 
						|
	v4 = 0;
 | 
						|
 | 
						|
	for (v2=1; v2<203; v2=v2+1)
 | 
						|
	{
 | 
						|
		if (resultCache[v2][8])
 | 
						|
		{
 | 
						|
			modelNum = 0;
 | 
						|
			modelString = "0";
 | 
						|
			for (v3 = 0; v3<5; v3=v3+1)
 | 
						|
			{
 | 
						|
				modelString = modelString + resultCache [v2][v3];
 | 
						|
			}
 | 
						|
			np  = resultCache[v2][6];
 | 
						|
			lnL = resultCache[v2][5];
 | 
						|
			LRT = -2*(lnL-stdl);
 | 
						|
			if (LRT<0)
 | 
						|
			{
 | 
						|
				LRT = 0;
 | 
						|
			}
 | 
						|
			AIC = -2*lnL+2*np;
 | 
						|
			modelNum = modelNum + 1;
 | 
						|
			PRINT_DIGITS = 3;
 | 
						|
			fprintf (stdout,"\n",v2);
 | 
						|
			fprintf (BASE_PATH,"\n",v2);
 | 
						|
			PRINT_DIGITS = 1;
 | 
						|
			fprintf (stdout," | (",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],") | ");
 | 
						|
			fprintf (stdout,Format (np,5,0));
 | 
						|
			fprintf (BASE_PATH," | (",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],") | ");
 | 
						|
			fprintf (BASE_PATH,Format (np,5,0));
 | 
						|
			PRINT_DIGITS = 8;
 | 
						|
			fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
 | 
						|
			fprintf (BASE_PATH, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
 | 
						|
			PRINT_DIGITS = 15;
 | 
						|
			if (LRT==0)
 | 
						|
			{
 | 
						|
				pValue = 1;					
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				pValue = 1-CChi2(LRT,fullnp-np);
 | 
						|
			}
 | 
						|
			if (AIC<v5)
 | 
						|
			{
 | 
						|
				v5 = AIC;
 | 
						|
				v4 = v2;
 | 
						|
			}
 | 
						|
			fprintf (stdout,pValue," |");
 | 
						|
			fprintf (BASE_PATH,pValue," |");
 | 
						|
			
 | 
						|
		}
 | 
						|
	}
 | 
						|
	
 | 
						|
	PRINT_DIGITS = 0;
 | 
						|
	modelString = "0";
 | 
						|
	for (v3 = 0; v3<5; v3=v3+1)
 | 
						|
	{
 | 
						|
		modelString = modelString + Format(resultCache [v4][v3],0,0);
 | 
						|
	}
 | 
						|
	
 | 
						|
	fprintf (stdout, "\n\nAIC based winner: (", modelString, ") with AIC = ", v5, "\n\n");
 | 
						|
	fprintf (BASE_PATH, "\n\nAIC based winner: (", modelString, ") with AIC = ", v5, "\n\n");
 | 
						|
	
 | 
						|
	dummy = printModelMatrix (modelString);
 | 
						|
	
 | 
						|
	modelString2 = "";
 | 
						|
	if (modelString == "000000")
 | 
						|
	{
 | 
						|
		modelString2 = "F81";
 | 
						|
	}
 | 
						|
	if (modelString == "010010")
 | 
						|
	{
 | 
						|
		modelString2 = "HKY85";
 | 
						|
	}
 | 
						|
	if (modelString == "010020")
 | 
						|
	{
 | 
						|
		modelString2 = "TrN";
 | 
						|
	}
 | 
						|
	if (Abs(modelString2))
 | 
						|
	{
 | 
						|
		fprintf (stdout, "\nThis model is better known as:", modelString2, "\n");
 | 
						|
		fprintf (BASE_PATH, "\nThis model is better known as:", modelString2, "\n");
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
	fprintf (stdout, "\nGeneral Reversible Model is the winner!\n");
 | 
						|
	fprintf (BASE_PATH, "\nGeneral Reversible Model is the winner!\n");
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 |