1 /* mkbioseqB.c
2 *
3 * ===========================================================================
4 *
5 * PUBLIC DOMAIN NOTICE
6 * National Center for Biotechnology Information (NCBI)
7 *
8 * This software/database is a "United States Government Work" under the
9 * terms of the United States Copyright Act. It was written as part of
10 * the author's official duties as a United States Government employee and
11 * thus cannot be copyrighted. This software/database is freely available
12 * to the public for use. The National Library of Medicine and the U.S.
13 * Government do not place any restriction on its use or reproduction.
14 * We would, however, appreciate having the NCBI and the author cited in
15 * any work or product based on this material
16 *
17 * Although all reasonable efforts have been taken to ensure the accuracy
18 * and reliability of the software and data, the NLM and the U.S.
19 * Government do not and cannot warrant the performance or results that
20 * may be obtained by using this software or data. The NLM and the U.S.
21 * Government disclaim all warranties, express or implied, including
22 * warranties of performance, merchantability or fitness for any particular
23 * purpose.
24 *
25 * ===========================================================================
26 *
27 * File Name: mkbioseqB.c
28 *
29 * Author: Ken Addess
30 *
31 * $Log: mkbioseqB.c,v $
32 * Revision 6.3 1999/05/07 14:03:21 zimmerma
33 * Moved LIBCALL isBiopoly() and LIBCALL isHet() into mmdbapi1.c
34 *
35 * Revision 6.2 1998/12/01 15:13:36 addess
36 * cleaned up code to remove memory leaks
37 *
38 * Revision 6.1 1998/07/17 18:54:37 madej
39 * Created by Ken Addess.
40 *
41 */
42
43 /************************************************************
44 /* */
45 /* readBiostruc() */
46 /* */
47 /* Opens a file, reads data for a PDB entry from it, */
48 /* and closes it. */
49 /* */
50 /************************************************************/
51
52 #include "mkbioseq.h"
53 #include <mmdbapi.h>
54
readBiostruc(CharPtr filename,Int2 mode,Int4 mdlLvl)55 BiostrucPtr LIBCALL readBiostruc(CharPtr filename, Int2 mode, Int4 mdlLvl)
56 {
57 BiostrucPtr lbsp;
58
59 if (filename == NULL) {
60 return NULL;
61 }
62
63 /* Read in a Biostruc object. */
64
65 /* lbsp = BiostrucAsnRead(aipr, NULL); */
66
67 lbsp = FetchBS(filename, mode, mdlLvl, 1000, POWER_VIEW);
68
69 return lbsp;
70 }
71
getHetIdx(Int4 molecule_id,MoleculeGraphPtr currenthet)72 Int4 LIBCALL getHetIdx(Int4 molecule_id, MoleculeGraphPtr currenthet)
73 {
74 Int4 i;
75
76 for (i = 0; currenthet; i++, currenthet = currenthet->next)
77 {
78 if (currenthet->id == molecule_id)
79 {
80 return i;
81 }
82 }
83
84 return -1;
85 }
86
87 /************************************************************/
88 /* */
89 /* getStdOlcode() */
90 /* */
91 /* Returns a one-letter iupac code for a standard */
92 /* residue. */
93 /* */
94 /************************************************************/
95
96 CharPtr LIBCALL
getStdOlcode(Int4 standard_graphs_id,Int4 residue_graph_id,BiostrucResidueGraphSetPtr std)97 getStdOlcode(Int4 standard_graphs_id, Int4 residue_graph_id, BiostrucResidueGraphSetPtr std)
98 {
99 ResidueGraphPtr rg;
100
101 rg = std->residue_graphs;
102
103 while (rg)
104 {
105 if (rg->id == residue_graph_id)
106 {
107 return(rg->iupac_code->data.ptrvalue);
108 }
109
110 rg = rg->next;
111 }
112
113 return NULL;
114 }
115
116 /************************************************************/
117 /* */
118 /* getNstdOlcode() */
119 /* */
120 /* Returns a one-letter iupac code for a non-standard */
121 /* residue. */
122 /* */
123 /************************************************************/
124
getNstdOlcode(ResidueGraphPtr nrg)125 CharPtr LIBCALL getNstdOlcode(ResidueGraphPtr nrg)
126 {
127 return(nrg->iupac_code->data.ptrvalue);
128 }
129
130 /************************************************************/
131 /* */
132 /* getNstdResGraph() */
133 /* */
134 /* Given a graph id, returns a corresponding residue */
135 /* graph. */
136 /* */
137 /************************************************************/
138
getNstdResGraph(Int4 rgid,BiostrucGraphPtr bsgp)139 ResidueGraphPtr LIBCALL getNstdResGraph(Int4 rgid, BiostrucGraphPtr bsgp)
140 {
141 ResidueGraphPtr rgp, new;
142
143 rgp = bsgp->residue_graphs;
144
145 while (rgp)
146 {
147 if (rgp->id == rgid)
148 {
149 new = ResidueGraphNew();
150 new->id = rgp->id;
151 new->descr = rgp->descr;
152 new->residue_type = rgp->residue_type;
153 new->iupac_code = rgp->iupac_code;
154 new->atoms = rgp->atoms;
155 new->bonds = rgp->bonds;
156 new->chiral_centers = rgp->chiral_centers;
157
158 return new;
159 }
160
161 rgp = rgp->next;
162 }
163
164 return NULL;
165 }
166
167 /************************************************************/
168 /* */
169 /* rmvSpace() */
170 /* */
171 /* Removes white space from a give string. */
172 /* */
173 /************************************************************/
174
rmvSpace(CharPtr str)175 CharPtr LIBCALL rmvSpace(CharPtr str)
176 {
177 CharPtr newstr = NULL;
178 Int4 len, i, j;
179 Boolean allBlank = TRUE;
180
181 len = strlen(str);
182 for (i=0; i<len; i++)
183 {
184 if (str[i] != ' ')
185 {
186 allBlank = FALSE;
187 break;
188 }
189 }
190
191 if (!allBlank)
192 {
193 newstr = (CharPtr)MemNew((len+1) * sizeof(CharPtr));
194
195 for (i=0, j=0; i<len; i++)
196 {
197 if (str[i] != ' ')
198 newstr[j++] = str[i];
199 }
200 newstr[j] = '\0';
201
202 return newstr;
203 }
204
205 MemFree(newstr);
206 return StringSave(" ");
207 }
208
isNstd(ResidueGraphPtr rgp)209 Boolean LIBCALL isNstd(ResidueGraphPtr rgp)
210 {
211 ValNodePtr vnp;
212 CharPtr rname;
213
214 vnp = rgp->descr;
215
216 while (vnp)
217 {
218 if (vnp->choice == BiomolDescr_name)
219 {
220 rname = vnp->data.ptrvalue;
221 break;
222 }
223
224 vnp = vnp->next;
225 }
226
227 if (!StringICmp(rname, "ALA"))
228 return(FALSE);
229 else if (!StringICmp(rname, "ARG"))
230 return(FALSE);
231 else if (!StringICmp(rname, "ASN"))
232 return(FALSE);
233 else if (!StringICmp(rname, "ASP"))
234 return(FALSE);
235 else if (!StringICmp(rname, "CYS"))
236 return(FALSE);
237 else if (!StringICmp(rname, "GLN"))
238 return(FALSE);
239 else if (!StringICmp(rname, "GLU"))
240 return(FALSE);
241 else if (!StringICmp(rname, "GLY"))
242 return(FALSE);
243 else if (!StringICmp(rname, "HIS"))
244 return(FALSE);
245 else if (!StringICmp(rname, "ILE"))
246 return(FALSE);
247 else if (!StringICmp(rname, "LEU"))
248 return(FALSE);
249 else if (!StringICmp(rname, "LYS"))
250 return(FALSE);
251 else if (!StringICmp(rname, "MET"))
252 return(FALSE);
253 else if (!StringICmp(rname, "PHE"))
254 return(FALSE);
255 else if (!StringICmp(rname, "PRO"))
256 return(FALSE);
257 else if (!StringICmp(rname, "SER"))
258 return(FALSE);
259 else if (!StringICmp(rname, "THR"))
260 return(FALSE);
261 else if (!StringICmp(rname, "TRP"))
262 return(FALSE);
263 else if (!StringICmp(rname, "TYR"))
264 return(FALSE);
265 else if (!StringICmp(rname, "VAL"))
266 return(FALSE);
267 else if (!StringICmp(rname, "DNA A"))
268 return(FALSE);
269 else if (!StringICmp(rname, "DNA C"))
270 return(FALSE);
271 else if (!StringICmp(rname, "DNA G"))
272 return(FALSE);
273 else if (!StringICmp(rname, "DNA T"))
274 return(FALSE);
275 else if (!StringICmp(rname, "RNA A"))
276 return(FALSE);
277 else if (!StringICmp(rname, "RNA C"))
278 return(FALSE);
279 else if (!StringICmp(rname, "RNA G"))
280 return(FALSE);
281 else if (!StringICmp(rname, "RNA U"))
282 return(FALSE);
283 else
284 return(TRUE);
285 }
286
findChnidx(Int4 mol_id,Int4 nbp,MoleculeGraphPtr bp)287 Int4 LIBCALL findChnidx(Int4 mol_id, Int4 nbp, MoleculeGraphPtr bp)
288 {
289 Int4 i;
290 MoleculeGraphPtr currentbp;
291
292 currentbp = bp;
293
294 for (i=1; i<=nbp; i++)
295 {
296 if (currentbp->id == mol_id)
297 {
298 return i;
299 }
300
301 currentbp = currentbp->next;
302 }
303
304 return -1;
305 }
306
307 /************************************************************/
308 /* */
309 /* getResNam() */
310 /* */
311 /* Given a graph id, returns a name of corresponding */
312 /* residue. */
313 /* */
314 /************************************************************/
315
getResNam(ResidueGraphPntrPtr rgpp,BiostrucResidueGraphSetPtr stdDictionary,ResidueGraphPtr rg)316 CharPtr LIBCALL getResNam(ResidueGraphPntrPtr rgpp, BiostrucResidueGraphSetPtr stdDictionary, ResidueGraphPtr rg)
317 {
318 BiostrucResidueGraphSetPntrPtr brgsp;
319 ValNodePtr vnp;
320 ResidueGraphPtr rgStd;
321
322 switch(rgpp->choice)
323 {
324 case ResidueGraphPntr_local:
325
326 while (rg)
327 {
328 if (rg->id == rgpp->data.intvalue)
329 {
330 vnp = rg->descr;
331
332 while (vnp)
333 {
334 if (vnp->choice == BiomolDescr_name)
335 {
336 return vnp->data.ptrvalue;
337 }
338 }
339 }
340
341 rg = rg->next;
342 }
343 break;
344 case ResidueGraphPntr_standard:
345 rgStd = stdDictionary->residue_graphs;
346 brgsp = (BiostrucResidueGraphSetPntrPtr)rgpp->data.ptrvalue;
347
348 while (rgStd)
349 {
350 if (rgStd->id == brgsp->residue_graph_id)
351 {
352 vnp = rgStd->descr;
353
354 while (vnp)
355 {
356 if (vnp->choice == BiomolDescr_name)
357 {
358 return vnp->data.ptrvalue;
359 }
360 }
361 }
362
363 rgStd = rgStd->next;
364 }
365 break;
366 }
367
368 return NULL;
369 }
370
371 /************************************************************/
372 /* */
373 /* getResComm() */
374 /* */
375 /* Given a residue graph pointer, returns its comment. */
376 /* */
377 /************************************************************/
378
getResComm(ResidueGraphPntrPtr rgpp,BiostrucResidueGraphSetPtr stdDictionary,ResidueGraphPtr rg)379 CharPtr LIBCALL getResComm(ResidueGraphPntrPtr rgpp, BiostrucResidueGraphSetPtr stdDictionary, ResidueGraphPtr rg)
380 {
381
382 BiostrucResidueGraphSetPntrPtr brgsp;
383 ValNodePtr vnp;
384 ResidueGraphPtr rgStd;
385
386 switch(rgpp->choice)
387 {
388 case ResidueGraphPntr_local:
389 while (rg)
390 {
391 if (rg->id == rgpp->data.intvalue)
392 {
393 vnp = rg->descr;
394
395 while (vnp)
396 {
397 if (vnp->choice == BiomolDescr_pdb_comment)
398 {
399 return vnp->data.ptrvalue;
400 }
401
402 vnp = vnp->next;
403 }
404 }
405
406 rg = rg->next;
407 }
408 break;
409 case ResidueGraphPntr_standard:
410 rgStd = stdDictionary->residue_graphs;
411 brgsp = (BiostrucResidueGraphSetPntrPtr)rgpp->data.ptrvalue;
412
413 while (rgStd)
414 {
415 if (rgStd->id == brgsp->residue_graph_id)
416 {
417 vnp = rgStd->descr;
418
419 while (vnp)
420 {
421 if (vnp->choice == BiomolDescr_name)
422 {
423 /* Standard residue graph dictionary doesn't have
424 pdb comments as for nonstandard cases - return a name. */
425
426 return vnp->data.ptrvalue;
427 }
428
429 vnp = vnp->next;
430 }
431 }
432
433 rgStd = rgStd->next;
434 }
435 break;
436 }
437
438 return NULL;
439 }
440
441 Int4 LIBCALL
getAtomElementIdx(Int4 molecule_id,Int4 residue_id,Int4 atom_id,BiostrucGraphPtr bsgp,BiostrucResidueGraphSetPtr stdDictionary)442 getAtomElementIdx(Int4 molecule_id, Int4 residue_id, Int4 atom_id, BiostrucGraphPtr bsgp, BiostrucResidueGraphSetPtr stdDictionary)
443 {
444 MoleculeGraphPtr mgp;
445 ResiduePtr rs;
446 ResidueGraphPtr rgp;
447 AtomPtr atmp;
448 BiostrucResidueGraphSetPntrPtr brgsp;
449
450 mgp = bsgp->molecule_graphs;
451
452 while (mgp)
453 {
454 if (mgp->id == molecule_id)
455 break;
456
457 mgp = mgp->next;
458 }
459
460 rs = mgp->residue_sequence;
461
462 while (rs)
463 {
464 if (rs->id == residue_id)
465 break;
466
467 rs = rs->next;
468 }
469
470 if (rs->residue_graph->choice == ResidueGraphPntr_local)
471 {
472 rgp = bsgp->residue_graphs;
473
474 while (rgp)
475 {
476 if (rgp->id == rs->residue_graph->data.intvalue)
477 {
478 atmp = rgp->atoms;
479
480 while (atmp != NULL)
481 {
482 if (atmp->id == atom_id)
483 {
484 return atmp->element;
485 }
486
487 atmp = atmp->next;
488 }
489 }
490
491 rgp = rgp->next;
492 }
493 }
494 else if (rs->residue_graph->choice == ResidueGraphPntr_standard)
495 {
496 rgp = stdDictionary->residue_graphs;
497 brgsp = (BiostrucResidueGraphSetPntrPtr)rs->residue_graph->data.ptrvalue;
498
499 while (rgp)
500 {
501 if (rgp->id == brgsp->residue_graph_id)
502 {
503 atmp = rgp->atoms;
504
505 while (atmp != NULL)
506 {
507 if (atmp->id == atom_id)
508 {
509 return atmp->element;
510 }
511
512 atmp = atmp->next;
513 }
514
515 }
516
517 rgp = rgp->next;
518 }
519 }
520
521 return(255);
522 }
523
524 /************************************************************/
525 /* */
526 /* getResGraph() */
527 /* */
528 /* Given a graph id, returns corresponding residue */
529 /* graph. */
530 /* */
531 /************************************************************/
532
getResGraph(ResidueGraphPntrPtr rgpp,BiostrucGraphPtr bsgp,BiostrucResidueGraphSetPtr stdDictionary)533 ResidueGraphPtr LIBCALL getResGraph(ResidueGraphPntrPtr rgpp, BiostrucGraphPtr bsgp, BiostrucResidueGraphSetPtr stdDictionary)
534 {
535 ResidueGraphPtr rg;
536 BiostrucResidueGraphSetPntrPtr brgsp;
537
538 switch(rgpp->choice)
539 {
540 case ResidueGraphPntr_local:
541 rg = bsgp->residue_graphs;
542
543 while (rg)
544 {
545 if (rg->id == rgpp->data.intvalue)
546 {
547 return rg;
548 }
549
550 rg = rg->next;
551 }
552 break;
553 case ResidueGraphPntr_standard:
554 rg = stdDictionary->residue_graphs;
555 brgsp = (BiostrucResidueGraphSetPntrPtr)rgpp->data.ptrvalue;
556
557 while (rg)
558 {
559 if (rg->id == brgsp->residue_graph_id)
560 {
561 return rg;
562 }
563
564 rg = rg->next;
565 }
566 break;
567 }
568
569 return NULL;
570 }
571