#include "MakeNewAtom.h" atom_record * MakeNewAtom(char * string) { if (string == NULL) return NULL ; else if (strlen(string) < 6) return NULL ; else { int ii ; int type = find_record_type(string) ; if (RECORD_ATOM > type) { STDERR("MakeNewAtom(): Barf! I only eat real atoms for dinner."); } else { char t12 = string[12] ; char t13= string[13] ; if (t12 == ' ' || isdigit(t12)) t12 = t13 ; { atom_record * newrec = (atom_record *) malloc(sizeof(atom_record)); char *name = newrec->name ; int flags = 0 ; newrec->atomtype = type ; strncpy(newrec->ident,string, 6) ; newrec->ident[6] = 0 ; sscanf (string +6 ,"%5d" , &newrec->number) ; strncpy(newrec->resname,string+17, 3) ; if (string[12] == ' ') { strncpy(name,string+13, 3) ; name[3] = '\0'; if(name[0] == 'S') { if ( name[1] == 'G' && name[2] == ' ' &&name[3] == '\0' && newrec->resname[0] == 'C' && newrec->resname[1] == 'Y' && newrec->resname[2] == 'S') /* record_sg_atom(newrec) */ ; } else if(type == RECORD_ATOM && ((name[0] == 'C' && name[1] == ' ') || (name[0] == 'C' && name[1] == 'A' && name[2] == ' ')|| (name[0] == 'O' && name[1] == ' ') || (name[0] == 'N' && name[1] == ' ') )) flags |= MAIN_CHAIN_ATOM ; } else strncpy(name,string+12, 4) ; newrec->extraflag= string[16] ; if (newrec->extraflag != ' ' && newrec->extraflag != 'A') flags |= IGNORE_ATOM ; newrec->resname[3] = 0 ; { char chain = string[21] ; if (newrec->atomtype != RECORD_ATOM) chain = tolower(chain) ; newrec->chain = chain; } newrec->x_char = string[26] ; sscanf(string+22, "%4d", &newrec->resnum); sscanf(string+30, LF_STRING_07, &newrec->x,&newrec->y,&newrec->z, &newrec->occ,&newrec->b); newrec->restype = find_residue_type(newrec->resname) ; newrec->definition = find_atom_definition(newrec->restype,newrec->name) ; sscanf(string+67, LF_STRING_08,&newrec->surface, &newrec->volume) ; newrec->flags = flags ; return newrec; } } } } file_records *ConstructNDummyAtoms(char * string, int n) { file_records * f = (file_records *) calloc(1,sizeof(file_records)) ; int ii; f->atomnum = n; f->atoms =(atom_record **) malloc (n*sizeof(atom_record *)) ; for (ii=0; iiatoms[ii] = MakeNewAtom(string); } make_residues(f) ; f->name = NULL ; LinkUp_Residues_Atoms(f); return f ; } void FreeFileRecordsWithOutFreeingAtoms(file_records *f) { if (f!=NULL) { if (f->atoms != NULL && f->atomnum > 0) { free (f->atoms); if (f->flag && f->residue_count > 0) { free_file_residues(f) ; } } free(f); } } file_records *JoinFileRecords_1then2 (file_records *f1,file_records *f2) { int ii, n1 = f1->atomnum, n2 = f2->atomnum, nj = n1 + n2; file_records * Join = (file_records *) calloc(1,sizeof(file_records)) ; Join->atomnum = nj; Join->atoms =(atom_record **) malloc(nj*sizeof(atom_record *)) ; for (ii=0; iiatoms[ii] = f1->atoms[ii]; } for(ii=n1; iiatoms[ii] = f2->atoms[ii-n1]; } Join->flag = 0; Join->LinkUpResiduesFlag =0; make_residues(Join) ; Join->name = NULL ; LinkUp_Residues_Atoms(Join); return Join ; } file_records *MoveSelectedToDerivedFileRecord(file_records *f, int flag) { int ii,nn,jj, n = f->atomnum; for (ii=0; iiatomnum; ii++) { atom_record * a = f->atoms[ii] ; if (IS_SELECTED_WRT(a,flag) ) nn++; } { file_records * New = (file_records *) calloc(1,sizeof(file_records)) ; New->atomnum = nn; New->atoms =(atom_record **) calloc(nn,sizeof(atom_record *)) ; for (ii=0, jj=0; iiatomnum; ii++) { atom_record * a = f->atoms[ii] ; if (IS_SELECTED_WRT(a,flag) ) { New->atoms[jj] = f->atoms[ii]; jj++ ; } } New->flag = 0; New->LinkUpResiduesFlag =0; make_residues(New) ; New->name = NULL ; LinkUp_Residues_Atoms(New); return New ; } } file_records *NewFileRecWithOutWaterOrSymChain(file_records *f) { int ii; for (ii=0; iiatomnum; ii++) { atom_record * a = f->atoms[ii] ; if (a->name[0] == 'H' || a->name[0] == 'D' || a->extraflag == 'B' || a->chain == '_' || a->chain == 'X' || a->chain == 'Y' || a->chain == 'Z' || a->chain == 'W' || WATER_ATOM_P(a)) SWITCH_ON(a,FLAG_1_DESELECT); else SWITCH_OFF(a,FLAG_1_DESELECT); } return MoveSelectedToDerivedFileRecord(f, FLAG_1_DESELECT) ; } file_records *NewFileRecWithOutWater(file_records *f) { int ii; for (ii=0; iiatomnum; ii++) { atom_record * a = f->atoms[ii] ; if (a->name[0] == 'H' || a->name[0] == 'D' || a->extraflag == 'B' || WATER_ATOM_P(a)) SWITCH_ON(a,FLAG_1_DESELECT); else SWITCH_OFF(a,FLAG_1_DESELECT); } return MoveSelectedToDerivedFileRecord(f, FLAG_1_DESELECT) ; }