// ============================================================ // Function : calculateE() // ------------------------------------------------------------ // // ============================================================ double amberTorsion::calculateE(int k) { energy = 0.0; double *xyz = pAmber->getCoords(); int nTorsions = 0; int *torsions = 0; double *torsionParams = 0; if (k == 0) { nTorsions = pAmber->getNumTorsions(); torsions = pAmber->getTorsions(); torsionParams = pAmber->getTorsionParams(); } else { nTorsions = pAmber->getNumImpropers(); torsions = pAmber->getImpropers(); torsionParams = pAmber->getImproperParams(); } /* torsionParams[j] = pTorsionParam->Vn / pTorsionParam->npth; torsionParams[j+1] = pTorsionParam->Nt; torsionParams[j+2] = pTorsionParam->gamma; */ double tor = 0.0; int j = 0; for (int i = 0; i <= nTorsions*4-4; i+=4) { tor = torsion(xyz[torsions[i ]*3], xyz[torsions[i ]*3+1], xyz[torsions[i ]*3+2], xyz[torsions[i+1]*3], xyz[torsions[i+1]*3+1], xyz[torsions[i+1]*3+2], xyz[torsions[i+2]*3], xyz[torsions[i+2]*3+1], xyz[torsions[i+2]*3+2], xyz[torsions[i+3]*3], xyz[torsions[i+3]*3+1], xyz[torsions[i+3]*3+2]); energy += ( torsionParams[j] * (1 + cos(torsionParams[j+1] * tor - torsionParams[j+2]) )); j+=3; } return energy; }
void protein_from_pdb(char * file_name, LinusProtein *p) { Atom3d * atoms; // array of Atoms char atm[5]; char aname[6]; char rname[4]; //replaced res_name int anum; //replaced serial int rnum; //replaced res_seq int num_atoms=0; // number of lines in .pdb file //replaced count int num_res = 0; double x; double y; double z; double occupancy; double tempFactor; char buff[BUFSIZ]; char *aname_seen; // atom names seen array //int res_start_end[2]; // array containing start/end info for residue in .pdb //replaced numres int start, end, res_size; int i, j; // loop variables int current_res = -1; int na = 0; // atom indices int nr = -1; // residue indices int *fai; // na array // replaced f int *rnum_arr; // replaced respdbnum strcpy(p->name, "PROT"); // name protein PROT strcpy(p->filename, file_name); // protein filename is first command line argument //printf("Name %s, Filename %s\n", p->name, p->filename); FILE *file = fopen(p->filename, "r"); // Get file line count to allocate matrices p->num_chi_atoms=0; while (fgets(buff, sizeof buff, file) != NULL) { if (sscanf(buff, "%s %d %s %s %d %lf %lf %lf %lf %lf \n", atm, &anum, aname, rname, &rnum, &x, &y, &z, &occupancy, &tempFactor) == 10) { //printf("%s\n",rname); if(rnum != current_res) { num_res++; num_atoms+=get_res_size(rname); //printf("Res %s res size %d\n", rname, get_res_size(rname)); p->num_chi_atoms += get_chi_res_size(rname); current_res = rnum; } } } //printf("Num of chi atoms %d\n", p->num_chi_atoms); //printf("Num of atoms is %d & Num_residues is %d\n", num_atoms,num_res); // Dynamic allocations based on # lines in .pdb file & residue information p->res_names = (char **)malloc(num_res * sizeof(char *)); p->mesostates = (char **)malloc(num_res * sizeof(char *)); for (i = 0; i < num_res; i++) { p->res_names[i] = (char *)malloc(sizeof(char)*4); p->mesostates[i] = (char *)malloc(sizeof(char)*3); strcpy(p->mesostates[i],"--"); } p->atoms = malloc(num_atoms * sizeof(Atom3d)); //printf("Start phi psi ome chi allocation\n"); p->phi_atoms = malloc(num_res * sizeof(int)); p->psi_atoms = malloc(num_res * sizeof(int)); p->omega_atoms = malloc(num_res * sizeof(int)); //printf("Finished phi psi \nStart chi allocation\n"); p->chi_atoms = malloc(p->num_chi_atoms * sizeof(int)); //printf("Success allocating phi psi ome chi\n"); p->res_num = malloc(num_atoms * sizeof(int)); p->res_fai = malloc((num_res+1) * sizeof(int)); p->res_helix_wt = malloc((num_res) * sizeof(double)); p->res_strand_wt = malloc((num_res) * sizeof(double)); p->res_turn1_wt = malloc((num_res) * sizeof(double)); p->res_turn2_wt = malloc((num_res) * sizeof(double)); p->res_coil_wt = malloc((num_res) * sizeof(double)); p->res_PII_wt = malloc((num_res) * sizeof(double)); p->orig_fp_distance = malloc((num_res) * sizeof(double)); p->orig_sp_angle = malloc((num_res) * sizeof(double)); p->orig_tp_torsion = malloc((num_res) * sizeof(double)); p->res_f_mean = malloc((num_res) * sizeof(double)); p->res_f_sd = malloc((num_res) * sizeof(double)); p->res_y_mean = malloc((num_res) * sizeof(double)); p->res_y_sd = malloc((num_res) * sizeof(double)); p->res_acprat = malloc((num_res) * sizeof(double)); p->pmeso_wt = (double **) malloc((num_res-1) * sizeof(double *)); for(i=0; i<num_res-1; i++) { p->pmeso_wt[i] = (double *) malloc(144 * sizeof(double)); } //printf("Finished allocating memory\n"); // Fill up LinusProtein i = 0; rewind(file); while (fgets(buff, sizeof buff, file) != NULL) { if (sscanf(buff, "%s %d%*c%4[ 0-9A-Z]%*c%s %d %lf %lf %lf %lf %lf \n", atm, &anum, aname, rname, &rnum, &x, &y, &z, &occupancy, &tempFactor) == 10) { if (!strcmp(atm, "ATOM")) { //printf("-%s-%d-%s-%s-%d-%lf-%lf-%lf-%lf-%lf-\n", atm,anum,aname,rname,rnum,x,y, z,occupancy,tempFactor); //na = na + 1; if (rnum != current_res) // handles atoms up to max(rnum)-1 { nr = nr + 1; j = nr; p->res_fai[j] = na; na += get_res_size(rname); strcpy(p->res_names[j], rname); p->res_num[j] = rnum; current_res = rnum; // New use of start/end //start = na; //end = get_res_size(rname); // this may be case specific } if (!strcmp(aname, "OXT")) { na = na - 1; continue; } i++; } // end atm if-loop } // end sscanf if-loop } // end while loop //fclose(file); //printf("Checking 2\n"); p->num_atoms = num_atoms;; p->num_res = num_res; p->res_fai[num_res] = num_atoms; int atm_ctr=0; int s=0; for (i=0; i<num_res; i++) { int start, end; get_res_range(p->res_names[i],&start,&end); for(j=start; j<end; j++) { strcpy(p->atoms[atm_ctr].name,atm_name_arr[j]); p->atoms[atm_ctr].resnum = i; //printf("%d %s %s %d\n",atm_ctr,p->atoms[atm_ctr].name,p->res_names[i],i); atm_ctr++; } } j=-1; rewind(file); while (fgets(buff, sizeof buff, file) != NULL) { if (sscanf(buff, "%s %d%*c%4[ 0-9A-Z]%*c%s %d %lf %lf %lf %lf %lf \n", atm, &anum, aname, rname, &rnum, &x, &y, &z, &occupancy, &tempFactor) == 10) { if (!strcmp(atm, "ATOM")) { //printf("-%s-%d-%s-%s-%d-%lf-%lf-%lf-%lf-%lf-\n", atm,anum,aname,rname,rnum,x,y, z,occupancy,tempFactor); if (rnum != current_res) // handles atoms up to max(rnum)-1 { j = j + 1; current_res = rnum; } int idx = get_linusRes_index(rname,aname); // get index for linusRes arrays if(idx == -1) { //printf("Error unknown atom name!"); exit(1); } //strcpy(p->atoms[i].name,aname); int atm_ind = get_atom_ind_with_name(p->atoms,p->res_fai[j],p->res_fai[j+1],aname); //printf("%d %s pdb %s atoms %s fai %d fai+1 %d atm_ind %d\n",j,p->res_names[j],aname,p->atoms[atm_ind].name,p->res_fai[j],p->res_fai[j+1],atm_ind); p->atoms[atm_ind].radius = vdw_radius_arr[idx]; p->atoms[atm_ind].bsep0 = bsep0_arr[idx]; p->atoms[atm_ind].bsep1 = bsep1_arr[idx]; strcpy(p->atoms[atm_ind].first_name,first_name_arr[idx]); p->atoms[atm_ind].fp = first_offset_arr[idx]; strcpy(p->atoms[atm_ind].second_name,second_name_arr[idx]); p->atoms[atm_ind].sp = second_offset_arr[idx]; strcpy(p->atoms[atm_ind].third_name, third_name_arr[idx]); p->atoms[atm_ind].tp = third_offset_arr[idx]; p->atoms[atm_ind].sasa = 0.0; p->atoms[atm_ind].sasarad = 0.0; //printf("First %s Second %s Third %s\n", first_name_arr[idx], second_name_arr[idx],third_name_arr[idx]); //printf("Res %s Resnum %d Atom %s Atomnum %d First %s Second %s Third %s\n",rname,rnum, aname, i,p->atoms[i].first_name, p->atoms[i].second_name, p->atoms[i].third_name); p->atoms[atm_ind].x = x; p->atoms[atm_ind].y = y; p->atoms[atm_ind].z = z; //printf("X %lf Y %lf Z %lf\n",p->atoms[atm_ind].x,p->atoms[atm_ind].y,p->atoms[atm_ind].z); } // end atm if-loop } // end sscanf if-loop } // end while loop fclose(file); // Finish filling atoms array info //From LinusMol init int r; for(r=0; r<num_res; r++) { p->res_helix_wt[r] = 0.1; p->res_strand_wt[r] = 0.4; p->res_turn1_wt[r] = 0.05; p->res_turn2_wt[r] = 0.05; p->res_coil_wt[r] = 0.20; p->res_PII_wt[r] = 0.10; p->res_f_mean[r] = 0.0; p->res_f_sd[r] = 99.0; p->res_y_mean[r] = 0.0; p->res_y_sd[r] = 99.0; p->res_acprat[r] = 0.0; } for(r=0; r<144; r++) { p->pmeso_grid[r] = 0.0; } p->pmeso_grid[35] = 1.0; //set Ck as probability 1.0 int q; for(r=0; r<num_res-2; r++) // subtract 2 because ACE and NME don't have pmeso_weights { for(q=0; q<144; q++) { p->pmeso_wt[r][q] = p->pmeso_grid[q]; } } /* int g; for (g=0;g<num_res;g++) { printf("Testing residues %s\n",p->res_names[g]); } */ // Create and initilaize Z matrix int n; for (n=0; n < num_atoms; n++) { // printf("Atom name %s Fp %d %s Resnum %d resnum %d\n",p->atoms[n].name, p->atoms[n].fp,p->atoms[n].first_name, p->atoms[n].resnum, num_res); //printf("Atom name %s %d\n",p->atoms[n].name, p->atoms[n].resnum); int fp = p->atoms[n].fp + p->atoms[n].resnum; if(fp >= 0 && fp < num_res) { int m = get_atom_ind_with_name(p->atoms, p->res_fai[fp],p->res_fai[fp+1],p->atoms[n].first_name); p->atoms[n].fp_distance = distance(&p->atoms[n],&p->atoms[m]); p->atoms[n].fp_ind = m; //printf(" 1 parent %d %s %lf\n",p->atoms[n].fp_ind,p->atoms[p->atoms[n].fp_ind].name,p->atoms[n].fp_distance); } else { p->atoms[n].fp_ind = -1; p->atoms[n].fp_distance = 0.0; } //printf("1 second_parent %s\n",p->atoms[n].second_parent->name); //printf("1 third_parent %s\n",p->atoms[n].third_parent->name); int sp = p->atoms[n].sp + p->atoms[n].resnum; if(sp >= 0 && sp < num_res) { //atoms[n].sp_ind = get_atom_ind_with_name(p->atoms, p->res_fai[sp],p->res_fai[sp+1],p->atoms[n].second_name); int m = get_atom_ind_with_name(p->atoms, p->res_fai[sp],p->res_fai[sp+1],p->atoms[n].second_name); p->atoms[n].sp_angle = angle(&p->atoms[n],&p->atoms[p->atoms[n].fp_ind],&p->atoms[m]); p->atoms[n].sp_ind = m; //printf(" 2 parent %s %lf\n",p->atoms[m].name,p->atoms[n].sp_angle); } else { p->atoms[n].sp_ind = -1; p->atoms[n].sp_angle = 0.0; } int tp = p->atoms[n].tp + p->atoms[n].resnum; if(tp >= 0 && tp < num_res) { p->atoms[n].tp_ind = get_atom_ind_with_name(p->atoms, p->res_fai[tp],p->res_fai[tp+1],p->atoms[n].third_name); p->atoms[n].tp_torsion = torsion(&p->atoms[n],&p->atoms[p->atoms[n].fp_ind],&p->atoms[p->atoms[n].sp_ind],&p->atoms[p->atoms[n].tp_ind]); //printf(" 3 parent %s %lf\n",p->atoms[p->atoms[n].tp_ind].name,p->atoms[n].tp_torsion); } else { p->atoms[n].tp_ind = -1; p->atoms[n].tp_torsion = 0.0; } } /* for(i=0;i<p->num_atoms;i++) { printf(" Atom %s fp %s sp %s tp %s\n",p->atoms[i].name, p->atoms[p->atoms[i].fp_ind].name, p->atoms[p->atoms[i].sp_ind].name,p->atoms[p->atoms[i].tp_ind].name); } */ commit_coords_range(p->atoms, 0,num_atoms); // Fill up Phiatoms, Psiatoms, Omeatoms & Chiatoms int k; int chi_num=0; for(k=0; k<num_res; k++) { p->phi_atoms[k] = get_atom_ind_with_name(p->atoms, p->res_fai[k],p->res_fai[k+1]," C "); p->psi_atoms[k] = get_atom_ind_with_name(p->atoms, p->res_fai[k],p->res_fai[k+1]," O "); p->omega_atoms[k] = get_atom_ind_with_name(p->atoms, p->res_fai[k],p->res_fai[k+1]," CA "); //printf("Phi atom name %s res %d %lf %lf %lf tor %lf\n",p->atoms[p->phi_atoms[k]].name, p->atoms[p->phi_atoms[k]].resnum,p->atoms[p->phi_atoms[k]].x,p->atoms[p->phi_atoms[k]].y,p->atoms[p->phi_atoms[k]].z,p->atoms[p->phi_atoms[k]].tp_torsion); // printf("psi atom name %s res %d %lf %lf %lf tor %lf\n",p->atoms[p->psi_atoms[k]].name, p->atoms[p->psi_atoms[k]].resnum,p->atoms[p->psi_atoms[k]].x,p->atoms[p->psi_atoms[k]].y,p->atoms[p->psi_atoms[k]].z,p->atoms[p->psi_atoms[k]].tp_torsion); //printf("omega atom name %s res %d %lf %lf %lf tor %lf\n",p->atoms[p->omega_atoms[k]].name, p->atoms[p->omega_atoms[k]].resnum,p->atoms[p->omega_atoms[k]].x,p->atoms[p->omega_atoms[k]].y,p->atoms[p->omega_atoms[k]].z,p->atoms[p->omega_atoms[k]].tp_torsion); // Fill up chi atoms int chi_idx = get_chi_res_index(p->res_names[k]); //printf("Chi idx %d\n",chi_idx); // printf("Residue %s %d\n",p->res_names[k],k); //printf("Residue %s %d\n",p->res_names[k],k); if(chi_idx != -1) { int u; int num_chi = chi_size[chi_idx]/2; //printf("Num chi %d\n", num_chi); for(u=0; u<num_chi; u++) { //get_atom_with_name(p->chi_atoms[chi_num],p->atoms,p->res_fai[k],p->res_fai[k+1],chi_atoms[chi_idx][u]); int m = get_atom_ind_with_name(p->atoms,p->res_fai[k],p->res_fai[k+1],chi_atoms[chi_idx][u]); //printf("Chi atoms for res %s : %s\n", p->res_names[k],p->atoms[p->chi_atoms[chi_num]].name); if(m > -1) { p->chi_atoms[chi_num] = m; chi_num++; } } } } p->num_chi_atoms = chi_num; /* free(atm); free(aname); free(rname); free(p->atoms); free(p->res_names); free(p->res_fai); for (i = 0; i < num_res; i++) { free(p->res_names[i]); } free(p->res_num); */ }