#include #include #include #include /**************************************************************/ /* */ /* This program will perform calculations for the methods and */ /* formulas presented in: */ /* Weir BS, Triggs CM, Starling L, Stowell LI, Walsh KAJ, */ /* Buckleton J. Interpreting DNA Mixtures. J Forensic Sci */ /* 1997; 42(2):213-222. */ /* */ /* Questions and/or comments ahould be sent to: */ /* storey@statgen.ncsu.edu */ /* */ /**************************************************************/ #define MAX 12 #define MAX2 924 int max(int a, int b) { if(a>b) return a; return b; } int min(int a, int b) { if(aus[j+1]) { tmp=us[j]; us[j]=us[j+1]; us[j+1]=tmp; } for(i=0;ij-1;k--) freq[k+1][i]=freq[k][i]; freq[j][i]=temp; } } void comb(int n, int k, int **cm, int *c) /********************************************************************* * Computes all possible combinations of unknown alleles to be * included in the various partial sums *********************************************************************/ { int arr[MAX]; int m, j, l; *c=1; for(m=0;m=1;j--) { arr[j-1]++; if(arr[j-1]<=j+n-k) break; } if(arr[0]>n-k+1) break; for(l=j;l<=k;l++) arr[l]=arr[l-1]+1; } } void calc(double f[][MAX], int allele, int unk_al, int x, double *s, int nbas) /********************************************************************* * Performs the calculations for the "p^2" method *********************************************************************/ { double sum, ext, par; int **cm, c, n; int i,j,k,l,m; cm=(int **)malloc(MAX2*sizeof(int *)); for(i=0;i=1;k--) { comb(unk_al, k, cm, &c); for(l=0;l=1;k--) { comb(unk_al, k, cm, &c); for(l=0;lMAX||allele<1) printf("Not a valid entry!\n"); }while(allele>MAX||allele<1); while((ch = getchar()) != '\n'); printf("\n"); for(i=0;iMAX||nbas<1) { printf("\nEnter the number of databases to be used (max. 12): "); scanf("%d",&nbas); if(nbas>MAX||nbas<1) printf("Not a valid entry!\n"); } while((ch = getchar()) != '\n'); for(j=0;j1005) printf("\nWarning: The sum of the allele frequencies may be greater than 1.\n"); while((ch = getchar()) != '\n'); } do { printf("\nDo you want to use the p^2 formulae or the 2p modification? (p^2=0, 2p=1): "); scanf("%d",&form); if(form!=0&&form!=1) printf("Not a valid entry!\n"); }while(form!=0&&form!=1); do { printf("\nDo you want a summary file? (No=0, Yes=1): "); scanf("%d",&smry); if(smry!=0&&smry!=1) printf("Not a valid entry!\n"); }while(smry!=0&&smry!=1); if(smry==1) { printf("\nEnter the name of the file: "); scanf("%s", temp); copy(temp, fil); fp=fopen(fil,"w"); printf("\nEnter a title for the summary (such as a locus name): "); scanf("%s", temp); copy(temp, locus); } /*********************************************************************/ /* Gets the alleles whose sources are unknown and the possible number*/ /* of unknown contributors for the numerator of the likelihood ratio */ /*********************************************************************/ do { printf("\n\n************************************************************************"); printf("\n THE FOLLOWING IS INPUT FOR THE NUMERATOR OF THE LIKELIHOOD RATIO"); printf("\n************************************************************************"); printf("\n"); do { printf("\nEnter the number of alleles whose sources are unknown: "); scanf("%d",&unk_al); if(unk_al>allele||unk_al<0) printf("Not a valid entry!\n"); }while(unk_al>allele||unk_al<0); for(i=0;iallele||us[i]<1) printf("Not a valid entry!\n"); for(j=0;j<=i-1;j++) { if(us[i]==us[j]) { printf("This allele has already been entered!\n"); us[i]=-1; } } } while(us[i]>allele||us[i]<1); } for(i=0;icont_l*2||cont_l>MAX) printf("Not a valid entry!\n"); }while(cont_l<0||unk_al>cont_l*2||cont_l>MAX); do { printf("\nEnter the upper bound on the number of unknown contributors"); printf(" (maximum of 12): "); scanf("%d",&cont_u); if(cont_uMAX) printf("Not a valid entry!\n"); }while(cont_uMAX); printf("\n"); for(j=cont_l;j<=cont_u;j++) { printf("\nUnknown Contributors: %d\n", j); printf("Database Numerator Probability\n"); printf("------------------------------------\n"); for(i=0;i1000) lkh_nm[i][j]=1; printf("%s", base[i]); for(k=15; k>strlen(base[i]); k--) printf(" "); printf("%16.6E\n", lkh_nm[i][j]); } printf("\n"); } /********************************************************************* * Gets the alleles whose sources are unknown and the possible number * of unknown contributors for the denominator of the likelihood ratio *********************************************************************/ printf("\n************************************************************************"); printf("\n THE FOLLOWING IS INPUT FOR THE DENOMINATOR OF THE LIKELIHOOD RATIO"); printf("\n************************************************************************"); printf("\n"); do { printf("\nEnter the number of alleles whose sources are unknown: "); scanf("%d",&unk_al2); if(unk_al2>allele||unk_al2<0) printf("Not a valid entry!\n"); }while(unk_al2>allele||unk_al2<0); for(i=0;iallele||us1[i]<1) printf("Not a valid entry!\n"); for(j=0;j<=i-1;j++) { if(us1[i]==us1[j]) { printf("This allele has already been entered!\n"); us1[i]=-1; } } } while(us1[i]>allele||us1[i]<1); } for(i=0;icont_l2*2||cont_l2>MAX) printf("Not a valid entry!\n"); }while(cont_l2<0||unk_al2>cont_l2*2||cont_l2>MAX); do { printf("\nEnter the upper bound on the number of unknown contributors"); printf(" (maximum of 12): "); scanf("%d",&cont_u2); if(cont_u2MAX) printf("Not a valid entry!\n"); }while(cont_u2MAX); printf("\n"); for(j=cont_l2;j<=cont_u2;j++) { printf("\nUnknown Contributors: %d\n", j); printf("Database Denominator Probability\n"); printf("------------------------------------\n"); for(i=0;i1000) lkh_dn[i][j]=1; printf("%s", base[i]); for(k=15; k>strlen(base[i]); k--) printf(" "); printf("%16.6E\n", lkh_dn[i][j]); } printf("\n"); } /********************************************************************* * Displays the likelihood ratios according to databases and number of * unknown contributors in the numerator and denominator *********************************************************************/ printf("\n************************************************************************"); printf("\n THE FOLLOWING ARE THE LIKELIHOOD RATIOS FOR EACH DATABASE"); printf("\n************************************************************************"); printf("\n\n(Press return after each database)"); while((ch = getchar()) != '\n'); printf("\n"); printf("\n\n Numerator Unknown Denominator Unknown"); printf("\nDatabase Contributors Contributors Likelihood Ratio"); printf("\n------------------------------------------------------------------------\n"); for(i=0;istrlen(base[i]); a--) printf(" "); printf("%8d %20d %30.2lf\n", j, k, lkh_nm[i][j]/lkh_dn[i][k]); } while((ch = getchar()) != '\n'); } /********************************************************************* * Writes a summary of all the input and output performed so far *********************************************************************/ if(smry==1) { if(ans==0) { fprintf(fp,"\nTitle: %s\n", locus); if(form==0) fprintf(fp,"Form : p^2\n\n"); else fprintf(fp,"Form : 2p\n\n"); for(l=0;lstrlen(base[j]);k--) fprintf(fp, " "); } fprintf(fp,"\n"); for(i=l;i<=min(l+2,nbas-1);i++) fprintf(fp,"Allele Freq "); fprintf(fp,"\n"); for(k=l;k<=min(l+2,nbas-1);k++) fprintf(fp,"------------------ "); fprintf(fp,"\n"); for(a=0; astrlen(name[a]);k--) fprintf(fp, " "); fprintf(fp, "%9.6lf ",fq[a][i]); } fprintf(fp,"\n"); } for(k=l;k<=min(l+2,nbas-1);k++) fprintf(fp,"------------------ "); fprintf(fp, "\n\n"); } fprintf(fp,"****************************************************************************\n"); } fprintf(fp,"\nUnknown Alleles in the Numerator:\n"); for(a=1;a<=unk_al;a++) fprintf(fp,"%s \n",name[us[a-1]-1]); if(unk_al==0) fprintf(fp,"None\n"); for(j=cont_l;j<=cont_u;j++) { fprintf(fp,"\nUnknown Contributors: %d\n", j); fprintf(fp,"Database Numerator Probability\n"); fprintf(fp,"------------------------------------\n"); for(i=1;i<=nbas;i++) { fprintf(fp,"%s", base[i-1]); for(a=15;a>strlen(base[i-1]);a--) fprintf(fp, " "); fprintf(fp,"%16.6E\n",lkh_nm[i-1][j]); } } fprintf(fp,"\n"); fprintf(fp,"\nUnknown Alleles in the Denominator:\n"); for(a=1;a<=unk_al2;a++) fprintf(fp,"%s\n",name[us1[a-1]-1]); if(unk_al2==0) fprintf(fp,"None\n"); for(j=cont_l2;j<=cont_u2;j++) { fprintf(fp,"\nUnknown Contributors: %d\n", j); fprintf(fp,"Database Denominator Probability\n"); fprintf(fp,"------------------------------------\n"); for(i=1;i<=nbas;i++) { fprintf(fp,"%s", base[i-1]); for(a=15;a>strlen(base[i-1]);a--) fprintf(fp, " "); fprintf(fp,"%16.6E\n",lkh_dn[i-1][j]); } } fprintf(fp,"\n"); fprintf(fp,"\n Numerator Unknown Denominator Unknown"); fprintf(fp,"\nDatabase Contributors Contributors Likelihood Ratio"); fprintf(fp,"\n------------------------------------------------------------------------\n"); for(i=0;istrlen(base[i]); a--) fprintf(fp," "); fprintf(fp,"%8d %20d %30.2lf\n", j, k, lkh_nm[i][j]/lkh_dn[i][k]); } fprintf(fp,"\n"); } fprintf(fp,"\n****************************************************************************\n"); } do { printf("\nDo you want to compute another likelihood ratio? (No=0, Yes=1): "); scanf("%d", &ans); if (ans != 0 && ans != 1) printf("Not a valid entry!\n"); }while(ans != 0 && ans != 1); }while(ans != 0); printf("\n\n Program written by John Storey on July 7, 1997.\n"); printf(" Questions and/or comments should be sent to: \n"); printf(" storey@statgen.ncsu.edu \n\n"); }