/*Use the Abate-Whitt for numerical inversion of the Laplace transform*/ static double SumAW(double expiry, double sg, double r, double aa, int terms, int totterms, int nummoment) { int k; double h=sg*sg*expiry/4.0; double Eulero; dcomplex term; dcomplex sum; double *sum_r; sum_r = malloc((totterms-terms+2)*sizeof(double)); sum =Complex(0.0, 0.0); Eulero = 0.0; sum =RCmul(1.0/2.0,dermellin(Complex(aa/(2.0*h),0), sg, r,nummoment)); for (k=1;k<=totterms;k++) { term = RCmul(PNL_ALTERNATE(k) ,dermellin(Complex(aa/(2.0*h) , k*M_PI/h),sg, r,nummoment )); sum = Cadd(term, sum); if(terms<= k) sum_r[k-terms+1]= sum.r; } for (k=0;k<=totterms-terms;k++) { Eulero = Eulero + bico(totterms-terms,k) * pow( 2.0, -(totterms-terms) ) * sum_r[k+1]; } free(sum_r); return exp(aa/2.0)*Eulero/h; }
void newmomentsAM(int model, double rf, double dt, int maxmoment, int ndates, double parameters[], double **momtable) { int i,ii,k; double sum; for(i = 1; i < maxmoment + 1; i++) {momtable[1][i] = Creal(cfrn(model,rf, dt, Complex(0,-i), parameters)); } for(ii = 2;ii < ndates + 1; ii++) {for(i = 1; i < maxmoment + 1; i++) { sum=0; for(k=1;k<=i;k++) {sum=sum+momtable[ii - 1][ k]*bico(i, i-k); } momtable[ii][ i] = momtable[1][ i]*(1 + sum); } } }
/************************************************************************************************************* Procedure: getIsoDist ************************************************************************************************************/ double getIsoDist(int ii, ISOTAB *element, int num, double *peptide, ISODIST *dist) { double mult, power, probj, probk, probl, probm; double probjk, probkl, probjkl, probklm, probjklm; int i, j, k, l, m; /* get monoisotopic mass and it's probabilty */ dist[ii].mass[0] = 0.0; dist[ii].prob[0] = 100.0; for (i = 0; i < num; i++) { power = peptide[i]; dist[ii].mass[0] = dist[ii].mass[0] + peptide[i]*element[i].isotope[0]; dist[ii].prob[0] = dist[ii].prob[0] * pow(element[i].abundance[0], power); } /* get probabilty of monoisotopic mass plus 1 */ dist[ii].prob[1] = 0.0; for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]; for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[1] = dist[ii].prob[1] + probj; } dist[ii].prob[1] = dist[ii].prob[1]*100.0; /* get probabilty of monoisotopic mass plus 2 */ dist[ii].prob[2] = 0.0; for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[2]; for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[2] = dist[ii].prob[2] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = bico(peptide[j], 2); probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]*element[j].abundance[1]; for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[2] = dist[ii].prob[2] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]; for (k = 0; k < num; k++) { probk = 0.0; if (k > j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[2] = dist[ii].prob[2] + probjk; } } dist[ii].prob[2] = dist[ii].prob[2]*100.0; /* get probabilty of monoisotopic mass plus 3 */ dist[ii].prob[3] = 0.0; for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[3]; for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[3] = dist[ii].prob[3] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = peptide[j]*(peptide[j]-1); probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]*element[j].abundance[2]; for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[3] = dist[ii].prob[3] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 3.0; mult = bico(peptide[j], 3); probj = mult * pow(element[j].abundance[0], power)*pow(element[j].abundance[1],3); for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[3] = dist[ii].prob[3] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[2]; for (k = 0; k < num; k++) { probk = 0.0; if (k != j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[3] = dist[ii].prob[3] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = bico(peptide[j], 2); probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]*element[j].abundance[1]; for (k = 0; k < num; k++) { probk = 0.0; if (k != j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[3] = dist[ii].prob[3] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]; for (k = 0; k < num; k++) { probk = 0.0; if (k > j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (l = 0; l < num; l++) { probl = 0.0; if (l > k) { power = peptide[l] - 1.0; mult = peptide[l]; probl = mult * pow(element[l].abundance[0], power)*element[l].abundance[1]; } probkl = probk*probl; for (i = 0; i < num; i++) { if ((i != j) && (i != k) && (i != l)) { power = peptide[i]; probkl = probkl * pow(element[i].abundance[0], power); } } probjkl = probj*probkl; dist[ii].prob[3] = dist[ii].prob[3] + probjkl; } } } dist[ii].prob[3] = dist[ii].prob[3]*100.0; /* get probabilty of monoisotopic mass plus 4 */ dist[ii].prob[4] = 0.0; /* note there is no abundance for iso 4 or more */ for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = peptide[j]*(peptide[j]-1); probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]*element[j].abundance[3]; for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[4] = dist[ii].prob[4] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = bico(peptide[j], 2); probj = mult * pow(element[j].abundance[0], power)*pow(element[j].abundance[2],2); for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[4] = dist[ii].prob[4] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 3.0; mult = peptide[j]*bico(peptide[j]-1, 2); probj = mult * pow(element[j].abundance[0], power)*pow(element[j].abundance[1],2)*element[j].abundance[2]; for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[4] = dist[ii].prob[4] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 4; mult = bico(peptide[j], 4); probj = mult * pow(element[j].abundance[0], power)*pow(element[j].abundance[1],4); for (i = 0; i < num; i++) { if (i != j) { power = peptide[i]; probj = probj * pow(element[i].abundance[0], power); } } dist[ii].prob[4] = dist[ii].prob[4] + probj; } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[3]; for (k = 0; k < num; k++) { probk = 0.0; if (k != j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[4] = dist[ii].prob[4] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[2]; for (k = 0; k < num; k++) { probk = 0.0; if (k > j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[2]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[4] = dist[ii].prob[4] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = peptide[j]*(peptide[j]-1); probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[2]*element[j].abundance[1]; for (k = 0; k < num; k++) { probk = 0.0; if (k != j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[4] = dist[ii].prob[4] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[2]; for (k = 0; k < num; k++) { probk = 0.0; if (k > j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (l = 0; l < num; l++) { probl = 0.0; if (l > k) { power = peptide[l] - 1.0; mult = peptide[l]; probl = mult * pow(element[l].abundance[0], power)*element[l].abundance[1]; } probkl = probk*probl; for (i = 0; i < num; i++) { if ((i != j) && (i != k) && (i != l)) { power = peptide[i]; probkl = probkl * pow(element[i].abundance[0], power); } } probjkl = probj*probkl; dist[ii].prob[4] = dist[ii].prob[4] + probjkl; } } } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[2]; for (k = 0; k < num; k++) { probk = 0.0; if (k != j) { power = peptide[k] - 2.0; mult = bico(peptide[k], 2); probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[4] = dist[ii].prob[4] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 3.0; mult = bico(peptide[j],3); probj = mult * pow(element[j].abundance[0], power)*pow(element[j].abundance[1],3); for (k = 0; k < num; k++) { probk = 0.0; if (k != j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[4] = dist[ii].prob[4] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = bico(peptide[j], 2); probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]*element[j].abundance[1]; for (k = 0; k < num; k++) { probk = 0.0; if (k > j) { power = peptide[k] - 2.0; mult = bico(peptide[k], 2); probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]*element[k].abundance[1]; } for (i = 0; i < num; i++) { if ((i != j) && (i != k)) { power = peptide[i]; probk = probk * pow(element[i].abundance[0], power); } } probjk = probj*probk; dist[ii].prob[4] = dist[ii].prob[4] + probjk; } } for (j = 0; j < num; j++) { power = peptide[j] - 2.0; mult = bico(peptide[j], 2); probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]*element[j].abundance[1]; for (k = 0; k < num; k++) { probk = 0.0; if (k != j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (l = 0; l < num; l++) { probl = 0.0; if ((l != j) && (l > k)) { power = peptide[l] - 1.0; mult = peptide[l]; probl = mult * pow(element[l].abundance[0], power)*element[l].abundance[1]; } probkl = probk*probl; for (i = 0; i < num; i++) { if ((i != j) && (i != k) && (i != l)) { power = peptide[i]; probkl = probkl * pow(element[i].abundance[0], power); } } probjkl = probj*probkl; dist[ii].prob[4] = dist[ii].prob[4] + probjkl; } } } for (j = 0; j < num; j++) { power = peptide[j] - 1.0; mult = peptide[j]; probj = mult * pow(element[j].abundance[0], power)*element[j].abundance[1]; for (k = 0; k < num; k++) { probk = 0.0; if (k > j) { power = peptide[k] - 1.0; mult = peptide[k]; probk = mult * pow(element[k].abundance[0], power)*element[k].abundance[1]; } for (l = 0; l < num; l++) { probl = 0.0; if (l > k) { power = peptide[l] - 1.0; mult = peptide[l]; probl = mult * pow(element[l].abundance[0], power)*element[l].abundance[1]; } probkl = probk*probl; for (m = 0; m < num; m++) { probm = 0.0; if (m > l) { power = peptide[m] - 1.0; mult = peptide[m]; probm = mult * pow(element[m].abundance[0], power)*element[m].abundance[1]; } probklm = probkl*probm; for (i = 0; i < num; i++) { if ((i != j) && (i != k) && (i != l) && (i != m)) { power = peptide[i]; probklm = probklm * pow(element[i].abundance[0], power); } } probjklm = probj*probklm; dist[ii].prob[4] = dist[ii].prob[4] + probjklm; } } } } dist[ii].prob[4] = dist[ii].prob[4]*100.0; double max = 0.0; for (i = 0; i < 5; i++) { if (dist[ii].prob[i] > max) max = dist[ii].prob[i]; } for (i = 0; i < 5; i++) { dist[ii].prob[i] = dist[ii].prob[i]/max; } return(dist[ii].mass[0]); }