1 /* mmdbapi1.c
2 * ===========================================================================
3 *
4 * PUBLIC DOMAIN NOTICE
5 * National Center for Biotechnology Information (NCBI)
6 *
7 * This software/database is a "United States Government Work" under the
8 * terms of the United States Copyright Act. It was written as part of
9 * the author's official duties as a United States Government employee and
10 * thus cannot be copyrighted. This software/database is freely available
11 * to the public for use. The National Library of Medicine and the U.S.
12 * Government do not place any restriction on its use or reproduction.
13 * We would, however, appreciate having the NCBI and the author cited in
14 * any work or product based on this material
15 *
16 * Although all reasonable efforts have been taken to ensure the accuracy
17 * and reliability of the software and data, the NLM and the U.S.
18 * Government do not and cannot warrant the performance or results that
19 * may be obtained by using this software or data. The NLM and the U.S.
20 * Government disclaim all warranties, express or implied, including
21 * warranties of performance, merchantability or fitness for any particular
22 * purpose.
23 *
24 * ===========================================================================
25 *
26 * File Name: mmdbapi1.c
27 *
28 * Author: Christopher Hogue, Hitomi Ohkawa
29 *
30 * Version Creation Date: 03/14/95
31 *
32 * $Revision: 6.47 $
33 *
34 * File Description:
35 *
36 * Modifications:
37 * --------------------------------------------------------------------------
38 * Date Name Description of modification
39 * ------- ---------- -----------------------------------------------------
40 * 95/08/28 C. Hogue Major change to new Biostruc ASN.1 v4.0,
41 * Addition of Features, Secondary Structure, Ensembles,
42 * Model nodes and Dictionaries altered...
43 * 95/08/28 C. Hogue Put model id into its DValnode choice as it should be.
44 * 95/08/30 C. Hogue Minor changes.
45 *
46 * $Log: mmdbapi1.c,v $
47 * Revision 6.47 2005/01/25 15:39:07 thiessen
48 * tweak LoadDict again
49 *
50 * Revision 6.46 2005/01/24 20:42:58 thiessen
51 * fix memory leak; check current dir for dictionary if ProgramPath returns empty string
52 *
53 * Revision 6.45 2004/05/06 19:31:09 chenj
54 * fixed the bug in fnPBSFtoPSA() to use 2 chars for domain id
55 *
56 * Revision 6.44 2003/12/03 02:11:28 kans
57 * added defines missing from Mac OS 10.3 headers
58 *
59 * Revision 6.43 2002/05/10 16:33:18 chenj
60 * fix bugs in fnPBSFtoPSA
61 *
62 * Revision 6.41 2001/01/26 15:06:39 lewisg
63 * use entrez2 to retrieve structures
64 *
65 * Revision 6.40 2000/12/05 22:13:06 ywang
66 * fix bugs for MakePDBSeqId2
67 *
68 * Revision 6.39 2000/07/21 18:56:41 thiessen
69 * allow dynamic slave->master transformation
70 *
71 * Revision 6.38 2000/06/09 14:35:16 lewisg
72 * fix freeing bugs
73 *
74 * Revision 6.37 2000/04/20 23:27:44 lewisg
75 * misc bug fixes
76 *
77 * Revision 6.36 2000/03/13 15:51:25 thiessen
78 * added storage for PARS to each residue for Cn3D; removed unused fields
79 *
80 * Revision 6.35 2000/03/09 17:52:56 thiessen
81 * changes to MSD, MGD for feature implementation in Cn3D
82 *
83 * Revision 6.34 2000/03/08 21:46:12 lewisg
84 * cn3d saves viewport, misc bugs
85 *
86 * Revision 6.33 2000/02/14 19:31:03 lewisg
87 * fix occupancy bug when temperature factors present
88 *
89 * Revision 6.32 1999/11/02 23:06:08 lewisg
90 * fix cn3d to launch correctly if there is no seqentry associated with bioseq
91 *
92 * Revision 6.31 1999/10/05 23:18:17 lewisg
93 * add ddv and udv to cn3d with memory management
94 *
95 * Revision 6.30 1999/06/07 21:23:36 ywang
96 * add iUserDefinedFeatureOld, FeatureOnOld to MGD
97 *
98 * Revision 6.29 1999/05/07 20:48:59 kans
99 * including new name of prunebsc.h
100 *
101 * Revision 6.28 1999/05/07 14:07:07 zimmerma
102 * new code to call prunebiostruc (lines starting at 3807)
103 *
104 * InstBSAnnotSet - added params: Boolean Chain, CharPtr Path and
105 * modified to call PruneBiostruc (KA)
106 *
107 * InstallAlignedSlave - added params: Boolean Chain, CharPtr Path and
108 * modified to call PruneBiostruc (KA)
109 *
110 * InstallStrucFeature - added params: Boolean Chain, CharPtr Path and
111 * propagate to InstallAlignedSlave (KA)
112 *
113 * BiostrucAddFeature - added params: Boolean Chain, CharPtr Path and
114 * propagate to InstallStrucFeature (KA)
115 *
116 * Moved isBiopoly and isHet from mkbioseqB.c - DZ
117 *
118 * Revision 6.27 1999/04/26 20:49:59 lewisg
119 * changed arguments named list to fix visual c++ bug
120 *
121 * Revision 6.26 1999/03/18 21:04:29 lewisg
122 * reverse transform for saving
123 *
124 * Revision 6.25 1999/03/01 20:22:10 ywang
125 * add bTurnedOff flag on MGD
126 *
127 * Revision 6.24 1999/02/25 23:11:32 ywang
128 * keep ASN.1 features intact
129 *
130 * Revision 6.23 1999/02/24 22:58:09 ywang
131 * add iMimeType to MSD node and other minor name change
132 *
133 * Revision 6.22 1999/02/02 22:27:00 ywang
134 * add bJustHighlighted flag to MGD for feature edit
135 *
136 * Revision 6.21 1998/12/16 19:30:12 ywang
137 * add flag for highlight status to MGD
138 *
139 * Revision 6.20 1998/11/06 23:02:01 ywang
140 * add FeatureOn to MGD for feature on/off control
141 *
142 * Revision 6.19 1998/11/04 00:53:39 ywang
143 * add iFeature to MGD for modeling control
144 *
145 * Revision 6.18 1998/10/21 15:43:21 ywang
146 * attach the whole vast alignment data to master structure
147 *
148 * Revision 6.17 1998/10/01 21:56:33 ywang
149 * set display flag for object
150 *
151 * Revision 6.16 1998/09/22 17:52:20 ywang
152 * add flag for display control on MM and MG level
153 *
154 * Revision 6.15 1998/08/26 18:02:39 kans
155 * fixed -v -fd warnings
156 *
157 * Revision 6.14 1998/08/14 20:24:05 lewisg
158 * fix fault when retrieving structure by PDB name and database is unavailable
159 *
160 * Revision 6.13 1998/07/01 22:22:08 ywang
161 * set getgi flag as FALSE in function fnPBSFtoPSA when mastersip and slavesip is made by MakePDBSeqId2
162 *
163 * Revision 6.12 1998/05/12 21:46:16 lewisg
164 * stricter conservation coloring
165 *
166 * Revision 6.11 1998/05/08 21:19:30 ywang
167 * make salp->segs as DenseDiag
168 *
169 * Revision 6.9 1998/04/28 22:51:13 lewisg
170 * created separate pointer to master in MGD
171 *
172 * Revision 6.8 1998/04/21 22:58:46 lewisg
173 * eliminate dead code
174 *
175 * Revision 6.7 1998/04/10 22:41:42 lewisg
176 * eliminated dead code and added a visible bit to MSD
177 *
178 * Revision 6.6 1998/04/04 06:01:24 lewisg
179 * got rid of dos line breaks
180 *
181 * Revision 6.5 1998/04/04 00:56:46 lewisg
182 * corrected freeing of MSD
183 *
184 * Revision 6.4 1998/03/10 04:30:59 lewisg
185 * change name of MakePDBSeqId to MakePDBSeqId2 to avoid name conflict
186 *
187 * Revision 6.3 1998/03/06 23:17:15 lewisg
188 * codewarrior fixes
189 *
190 * Revision 6.2 1998/03/06 01:15:43 lewisg
191 * merge
192 *
193 * Revision 6.0 1997/08/25 18:10:56 madden
194 * Revision changed to 6.0
195 *
196 * Revision 5.3 1997/04/18 19:18:56 hogue
197 * Int2 counters for atoms upgraded to Int4's, made ppAsnOrder alloc optional.
198 *
199 * Revision 5.2 1997/01/15 18:15:04 hogue
200 * Changed to abstraction of Entrez calls requiring mmdbentr or equivalent. This abstracts the Entrez (CD/Network) calls from MMDB-API,
201 * in preparation to fetching MMDB records in alternate ways
202 * (local filesystem or http GET with MIME-typed Biostrucs) and for
203 * providing a slot for an MMDB-API caching system.
204 *
205 * Revision 5.1 1996/11/18 19:58:51 hogue
206 * eliminate ALLSIMPLEMDL to obtain performance improvement, Update
207 * of MMDB data makes ALLSIMPLEMDL obsolete as vectors now stored in
208 * the ONECOORDATOM model.
209 *
210 * Revision 5.0 1996/05/28 14:02:09 ostell
211 * Set to revision 5.0
212 *
213 * Revision 1.25 1996/05/15 17:01:53 hogue
214 * Fixed compiler warnings
215 *
216 * Revision 1.24 1996/05/01 14:39:12 hogue
217 * Enhanced feature handling, added MakeChemGraphNodeList, added support for domains.
218 *
219 * Revision 1.23 1996/04/18 17:40:05 hogue
220 * Added FETCH_ENTREZ bExtent test to FetchBS to mask EntrezInit/Fini; added mdlLvl BSEVERYTHING support, added a freeer call for pdnmsSlaves.
221 *
222 * Revision 1.22 1996/03/29 19:28:02 hogue
223 * Added pExtra pointer to MSD, fixed PMOD parent pointer
224 *
225 * Revision 1.21 1996/01/31 21:35:00 hogue
226 * Changes to accomodate the free-ing of models, most dramatically is the
227 * encapuslation of interim free-ers to FreeSurfaceModelAsnList and
228 * FreeAtomicModelAsnLists. KEEP_ASN no longer supported. PDNSM and its
229 * kin renamed to PDNML.
230 *
231 * Revision 1.20 1995/12/12 23:51:26 kans
232 * removed include vibrant.h
233 *
234 * Revision 1.19 1995/11/30 20:31:24 hogue
235 * Asn order vector in PMLD contains PALD not PMAD's.
236 *
237 * Revision 1.18 1995/11/15 19:15:59 hogue
238 * Traversers now handle solids on a per-model basis.
239 *
240 * Revision 1.17 1995/11/09 22:53:15 hogue
241 * Links between models and locations added, some new free-ers
242 *
243 * Revision 1.16 1995/10/05 17:41:52 hogue
244 * Added rot/translation matrix free-ers
245 *
246 * Revision 1.15 1995/09/21 20:27:00 hogue
247 * Took out call to StrToLong - inserted it longhand for non-vibrant apps
248 *
249 * Revision 1.14 1995/09/19 21:07:22 hogue
250 * Added to FetchBS() Entrez access via PDB or GI
251 *
252 * Revision 1.13 1995/09/18 21:24:37 hogue
253 * Het names added, and ProgMon calls
254 *
255 * Revision 1.12 1995/09/14 14:21:48 hogue
256 * Fix for Element No's 254 (other) and 255 (unk) put into Int1
257 *
258 * Revision 1.11 1995/09/05 19:09:32 hogue
259 * Changed error severity in conversion routine to SEV_ERROR
260 *
261 * Revision 1.10 1995/08/30 19:36:44 kans
262 * numerous changes
263 *
264 * Revision 1.9 1995/08/29 20:03:06 kans
265 * Entrez-like loading now enabled, models fixed
266 *
267 * Revision 1.6 1995/08/28 22:46:40 kans
268 * moved BiostrucAvail to mmdbapi1.[ch]
269 *
270 * Revision 1.5 1995/08/28 20:06:37 kans
271 * *** empty log message ***
272 *
273 * Revision 1.3 1995/08/28 19:31:53 kans
274 * version 4.1
275 *
276 * Revision 1.1 1995/08/02 17:07:15 kans
277 * Initial revision
278 *
279 *
280 * ==========================================================================
281 */
282
283 /*****************************************************************************
284 *
285 * mmdbapi1.c
286 *
287 * UNDER CONSTRUCTION NOTICE.
288 * SUBJECT TO RADICAL CHANGES...
289 *
290 * programmer C.W.V. Hogue
291 * created: 14 Mar 95
292 * last mod: 28 AUGUST 95
293 *****************************************************************************/
294 #include <ncbi.h>
295 #include <mmdbdata.h>
296 #include <sequtil.h>
297 NLM_EXTERN void VnpHeapSort PROTO ((ValNodePtr PNTR vnp, int (LIBCALLBACK *compar )PROTO ((Nlm_VoidPtr, Nlm_VoidPtr ))));
298 /* this should be #include <utilpub.h> but this conflicts with mmdbdata.h. fix this. lyg */
299 #include <mmdbapi.h>
300 #include <mmdbapi1.h>
301 #include <matrix.h>
302 #include "prunebsc.h"
303
304 /* Missing from /usr/include/gcc/darwin/3.3/machine/limits.h */
305 #ifdef __MWERKS__
306 #ifdef OS_UNIX_DARWIN
307 #ifndef __SCHAR_MAX__
308 #define __SCHAR_MAX__ 127
309 #endif
310 #endif
311 #endif
312 /* End missing from /usr/include/gcc/darwin/3.3/machine/limits.h */
313
NewMBD(void)314 PMBD LIBCALL NewMBD(void)
315 {
316 PMBD pmbdNew = NULL;
317 pmbdNew = (PMBD)MemNew((size_t)(sizeof(MBD)));
318 if (pmbdNew)
319 {
320 pmbdNew->bMe = (Byte) AM_MBD;
321 pmbdNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME);
322 }
323 return pmbdNew;
324 }
325
326
NewMOD(void)327 PMOD LIBCALL NewMOD(void)
328 {
329 PMOD pmodNew = NULL;
330 pmodNew = (PMOD)MemNew((size_t)(sizeof(MOD)));
331 if (pmodNew)
332 {
333 pmodNew->bMe = (Byte) AM_MOD;
334 pmodNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME );
335 pmodNew->bVisible = 1;
336 /* turn on object by default -- Yanli */
337 }
338 return pmodNew;
339 }
340
341
NewMDD(void)342 PMDD LIBCALL NewMDD(void)
343 {
344 PMDD pmddNew = NULL;
345 pmddNew = (PMDD)MemNew((size_t)(sizeof(MDD)));
346 if (pmddNew)
347 {
348 pmddNew->bMe = (Byte) AM_MDD;
349 pmddNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME );
350 }
351 return pmddNew;
352 }
353
NewMAD(void)354 PMAD LIBCALL NewMAD(void)
355 {
356 PMAD pmadNew = NULL;
357 pmadNew = (PMAD)MemNew((size_t)(sizeof(MAD)));
358 if (pmadNew)
359 {
360 pmadNew->bMe = (Byte) AM_MAD;
361 pmadNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME );
362 }
363 return pmadNew;
364 }
365
NewALD(void)366 PALD LIBCALL NewALD(void)
367 {
368 PALD paldNew = NULL;
369 paldNew = (PALD)MemNew((size_t)(sizeof(ALD)));
370 if (paldNew)
371 {
372 paldNew->cAltConf = ' ';
373 paldNew->bMe = (Byte) AM_ALD;
374 paldNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME );
375 }
376 return paldNew;
377 }
378
NewMLD(void)379 PMLD LIBCALL NewMLD(void)
380 {
381 PMLD pmldNew = NULL;
382 pmldNew = (PMLD)MemNew((size_t)(sizeof(MLD)));
383 return pmldNew;
384 }
385
386
387
NewMGD(void)388 PMGD LIBCALL NewMGD(void)
389 {
390 PMGD pmgdNew = NULL;
391 pmgdNew = (PMGD)MemNew((size_t)(sizeof(MGD)));
392 if (pmgdNew)
393 {
394 pmgdNew->bMe = (Byte) AM_MGD;
395 pmgdNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME );
396 pmgdNew->bReserved = 0;
397 pmgdNew->bVisible = 1; /* be displayed by default */
398 pmgdNew->bHighlighted = 0;
399 pmgdNew->pbMasterReserved = NULL;
400 pmgdNew->pvnPARSList = NULL;
401 }
402 return pmgdNew;
403 }
404
NewMMD(void)405 PMMD LIBCALL NewMMD(void)
406 {
407 PMMD pmmdNew = NULL;
408 pmmdNew = (PMMD)MemNew((size_t)(sizeof(MMD)));
409 if (pmmdNew)
410 {
411 pmmdNew->bMe = (Byte) AM_MMD;
412 pmmdNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME );
413 pmmdNew->bVisible = 1;
414 pmmdNew->iTargetRow = -1;
415 }
416 return pmmdNew;
417 }
418
NewMSD(void)419 PMSD LIBCALL NewMSD(void)
420 {
421 PMSD pmsdNew = NULL;
422 pmsdNew = (PMSD)MemNew((size_t)(sizeof(MSD)));
423 if (pmsdNew)
424 {
425 pmsdNew->bMe = (Byte) AM_MSD;
426 pmsdNew->bUpdate = (Byte) (REG_STYLE | SHOW_ME );
427 pmsdNew->pfbParent = NULL;
428 pmsdNew->pGlobalPARS = NULL;
429 pmsdNew->pdnSlaveToMasterTransforms = NULL;
430 }
431 return pmsdNew;
432 }
433
434
435
NewSFF(void)436 PSFF LIBCALL NewSFF(void)
437 {
438 PSFF psffNew = NULL;
439 psffNew = (PSFF) MemNew((size_t)(sizeof(SFF)));
440 return psffNew;
441 }
442
NewSFD(void)443 PSFD LIBCALL NewSFD(void)
444 {
445 PSFD psfdNew = NULL;
446 psfdNew = (PSFD) MemNew((size_t)(sizeof(SFD)));
447 return psfdNew;
448 }
449
450
NewSFS(void)451 PSFS LIBCALL NewSFS(void)
452 {
453 PSFS psfsNew = NULL;
454 psfsNew = (PSFS)MemNew((size_t)(sizeof(SFS)));
455 return psfsNew;
456 }
457
NewDNSFS(PDNSFS PNTR ppdnsfsList,Int2 choice)458 PDNSFS LIBCALL NewDNSFS(PDNSFS PNTR ppdnsfsList, Int2 choice)
459 {
460 PDNSFS pdnsfsNew = NULL;
461 PSFS psfsNew = NULL;
462 psfsNew = NewSFS();
463 if (!psfsNew) return NULL;
464 pdnsfsNew = DValNodeAddPointer(ppdnsfsList, choice, (Nlm_VoidPtr) psfsNew);
465 psfsNew->pdnsfsSet = pdnsfsNew; /* link to parent */
466 return pdnsfsNew;
467 }
468
FreeSFS(PSFS psfsThis)469 void LIBCALL FreeSFS(PSFS psfsThis)
470 {
471
472 if (psfsThis)
473 {
474 if (psfsThis->pcName) MemFree(psfsThis->pcName);
475 if (psfsThis->psfdFeats) FreeSFD(psfsThis->psfdFeats);
476 if (psfsThis->pvnDescr) BiostrucFeatureSetDescrFree(psfsThis->pvnDescr);
477 if (psfsThis->pbsfsFeatSet)
478 MsgAlert(KEY_NONE,SEV_ERROR, "Dangling Feature Set",
479 "\nMemory leaking at FeatureSet\n.");
480 BiostrucFeatureSetFree(psfsThis->pbsfsFeatSet);
481 MemFree(psfsThis);
482 }
483 return;
484 }
485
486
487
NewVNSFF(PVNSFF PNTR ppvnsffList,Int2 choice)488 PVNSFF LIBCALL NewVNSFF(PVNSFF PNTR ppvnsffList, Int2 choice)
489 {
490 PVNSFF pvnsffNew = NULL;
491 PSFF psffNew = NULL;
492
493 psffNew = NewSFF();
494 if (!psffNew) return NULL;
495 pvnsffNew = ValNodeAddPointer(ppvnsffList, choice, (Nlm_VoidPtr) psffNew);
496 return pvnsffNew;
497 }
498
499
FreeListVNSFF(PVNSFF pvnsffList)500 void LIBCALL FreeListVNSFF(PVNSFF pvnsffList)
501 {
502 FreeVNDataFn(pvnsffList, (pFreeFunc)FreeSFF);
503 return;
504 }
505
506
FreeSFF(PSFF psffThis)507 void LIBCALL FreeSFF(PSFF psffThis)
508 {
509 if (psffThis)
510 {
511 MemFree(psffThis);
512 }
513 return;
514 }
515
FreeSFD(PSFD psfdThis)516 void LIBCALL FreeSFD(PSFD psfdThis)
517 {
518 PSFD psfdNext = NULL;
519 PSFF psffThis = NULL;
520 ValNodePtr vnp = NULL;
521
522 if (psfdThis)
523 {
524 if (psfdThis->next) psfdNext = psfdThis->next;
525 if (psfdThis->pcName) MemFree(psfdThis->pcName);
526 if (psfdThis->pData)
527 {
528 psffThis = DoesFeatureTypeHaveFuncs(psfdThis->iType);
529 if (psffThis)
530 { /* this uses the installed function to free pData */
531 (*(psffThis->pFeatToCFn)) ( (Pointer PNTR) &(psfdThis->pData), NULL);
532 }
533 else
534 switch (psfdThis->iType)
535 {
536 case Feature_type_transform:
537 FreeDNTRN((PDNTRN) vnp->data.ptrvalue);
538 break;
539 case Feature_type_camera:
540 vnp = (ValNodePtr) psfdThis->pData;
541 CameraFree((CameraPtr) vnp->data.ptrvalue);
542 ValNodeFree(vnp);
543 break;
544 case Feature_type_script:
545 /* lygmerge vnp = (ValNodePtr) psfdThis->pData;
546 BiostrucScriptFree((BiostrucScriptPtr) vnp->data.ptrvalue);
547 ValNodeFree(vnp); */
548 break;
549
550 case Feature_type_multalign:
551 case Feature_type_alignment:
552
553 ChemGraphAlignmentFree((ChemGraphAlignmentPtr) psfdThis->pData);
554 ValNodeFree(vnp);
555 break;
556 case Feature_type_similarity:
557 vnp = (ValNodePtr) psfdThis->pData;
558 RegionSimilarityFree((RegionSimilarityPtr) vnp->data.ptrvalue);
559 ValNodeFree(vnp);
560 break;
561 case Feature_type_region:
562 vnp = (ValNodePtr) psfdThis->pData;
563 RegionPntrsFree((RegionPntrsPtr) vnp->data.ptrvalue);
564 ValNodeFree(vnp);
565 break;
566
567 /* these don't have sub-alloced parts hanging off pData */
568 /* case Feature_type_indirect:
569 case Feature_type_color:
570 case Feature_type_render:
571 case Feature_type_helix:
572 case Feature_type_strand:
573 case Feature_type_sheet:
574 case Feature_type_turn:
575 case Feature_type_site:
576 case Feature_type_footnote:
577 case Feature_type_subgraph:
578 case Feature_type_core:
579 case Feature_type_supercore:
580 case Feature_type_other: */
581
582 default: ;
583
584 } /* switch type */
585 psfdThis->pData = NULL;
586 } /* if pData */
587
588 if (psfdThis->pbsfFeat)
589 {
590 MsgAlert(KEY_NONE,SEV_ERROR, "Dangling Feature",
591 "\nMemory leaks at Feature\n.");
592 BiostrucFeatureFree(psfdThis->pbsfFeat);
593 }
594
595 MemFree(psfdThis);
596 FreeSFD(psfdNext);
597 }
598 }
599
600
601
FreeMBD(PMBD pmbdThis)602 void LIBCALL FreeMBD(PMBD pmbdThis)
603 {
604 #ifdef _DEBUG_2
605 printf("in FreeMBD ");
606 #endif
607 if (pmbdThis)
608 MemFree(pmbdThis);
609 }
610
FreeMOD(PMOD pmodThis)611 void LIBCALL FreeMOD(PMOD pmodThis)
612 {
613 #ifdef _DEBUG_2
614 printf("in FreeMOD ");
615 #endif
616 if (pmodThis->pvnContains) ValNodeFree(pmodThis->pvnContains);
617 if (pmodThis->ppflObject) FLMatrixFree(pmodThis->ppflObject, 0, 0);
618 if (pmodThis->pucSwap) UCVectorFree(pmodThis->pucSwap, 0);
619 if (pmodThis->ppi4Triangles) I4MatrixFree(pmodThis->ppi4Triangles, 0, 0);
620 if (pmodThis->pi2vColor) I2VectorFree(pmodThis->pi2vColor,0);
621 if (pmodThis) MemFree(pmodThis);
622 }
623
FreeMDD(PMDD pmddThis)624 void LIBCALL FreeMDD(PMDD pmddThis)
625 {
626 #ifdef _DEBUG_2
627 printf("in FreeMDD ");
628 #endif
629 if (pmddThis->pvnContains) ValNodeFree(pmddThis->pvnContains);
630 if (pmddThis)
631 MemFree(pmddThis);
632 }
633
634
FreeMAD(PMAD pmadThis)635 void LIBCALL FreeMAD(PMAD pmadThis)
636 {
637 #ifdef _DEBUG_2
638 printf("in FreeMAD ");
639 #endif
640 if (pmadThis)
641 {
642 if (pmadThis->pvnContainedBy) ValNodeFree(pmadThis->pvnContainedBy);
643 if (pmadThis->pvnBonds) ValNodeFree(pmadThis->pvnBonds);
644 if (pmadThis->pvnalLocate) FreeListVNAL(pmadThis->pvnalLocate);
645 MemFree(pmadThis);
646 }
647
648 }
649
FreeALD(PALD paldThis)650 void LIBCALL FreeALD(PALD paldThis)
651 {
652 PALD paldNext;
653 #ifdef _DEBUG_2
654 printf("in FreeALD ");
655 #endif
656 while (paldThis)
657 {
658 paldNext = paldThis->next;
659 if ((paldThis->iFloatNo) && (paldThis->pflvData))
660 FLVectorFree(paldThis->pflvData, 0);
661 MemFree(paldThis);
662 paldThis = paldNext;
663 }
664 }
665
FreeMLD(PMLD pmldThis)666 void LIBCALL FreeMLD(PMLD pmldThis)
667 {
668 PMLD pmldNext;
669 #ifdef _DEBUG_2
670 printf("in FreeMLD ");
671 #endif
672 while (pmldThis)
673 {
674 pmldNext = pmldThis->next;
675 /* models are owned by the Biostruc ptr in pmsd->pbsBS */
676 if (pmldThis->ppAsnOrder) PTRVectorFree(pmldThis->ppAsnOrder, 0);
677 if (pmldThis->pcAltConf) MemFree(pmldThis->pcAltConf);
678 if (pmldThis->pcModelName) MemFree(pmldThis->pcModelName);
679 MemFree(pmldThis);
680 pmldThis = pmldNext;
681 }
682 }
683
684
685
FreeKeptFeature(BiostrucFeatureSetPtr pbsfsThis)686 void LIBCALL FreeKeptFeature(BiostrucFeatureSetPtr pbsfsThis)
687 {
688 #ifdef _DEBUG_2
689 printf("in FreeKeptFeature ");
690 #endif
691 if (pbsfsThis) BiostrucFeatureSetFree(pbsfsThis);
692 }
693
694
FreeMGD(PMGD pmgdThis)695 void LIBCALL FreeMGD(PMGD pmgdThis)
696 {
697 #ifdef _DEBUG_2
698 printf("in FreeMGD ");
699 #endif
700 if (pmgdThis)
701 {
702 if (pmgdThis->pvnContainedBy) ValNodeFree(pmgdThis->pvnContainedBy);
703 if (pmgdThis->pcGraphName) MemFree(pmgdThis->pcGraphName);
704 if (pmgdThis->pcPDBComment) MemFree(pmgdThis->pcPDBComment);
705 if (pmgdThis->pvnmaAHead) FreeListVNMA(pmgdThis->pvnmaAHead);
706 if (pmgdThis->pvnmbBHead) FreeListVNMB(pmgdThis->pvnmbBHead);
707 if (pmgdThis->ppflBoundBox) FLMatrixFree(pmgdThis->ppflBoundBox,0,0);
708 if (pmgdThis->pcIUPAC) MemFree(pmgdThis->pcIUPAC);
709 if (pmgdThis->pcGraphNum) MemFree(pmgdThis->pcGraphNum);
710 MemFree(pmgdThis);
711 }
712 }
713
FreeMMD(PMMD pmmdThis)714 void LIBCALL FreeMMD(PMMD pmmdThis)
715 {
716 #ifdef _DEBUG_2
717 printf("in FreeMMD ");
718 #endif
719 if (pmmdThis)
720 {
721 if (pmmdThis->pvnContainedBy) ValNodeFree(pmmdThis->pvnContainedBy);
722 if (pmmdThis->pcMolName) MemFree(pmmdThis->pcMolName);
723 if (pmmdThis->pcSeqId) MemFree(pmmdThis->pcSeqId);
724 if (pmmdThis->pcSequence) MemFree(pmmdThis->pcSequence);
725 if (pmmdThis->pdnmgHead) FreeListDNMG(pmmdThis->pdnmgHead);
726 if (pmmdThis->pvnmbIRBHead) FreeListVNMB(pmmdThis->pvnmbIRBHead);
727 if (pmmdThis->ppflBoundBox) FLMatrixFree(pmmdThis->ppflBoundBox,0,0);
728 if (pmmdThis->pMolDescr)
729 AsnGenericChoiceSeqOfFree(pmmdThis->pMolDescr,(AsnOptFreeFunc)BiomolDescrFree);
730 if (pmmdThis->pSeqId) SeqIdFree(pmmdThis->pSeqId);
731 MemFree(pmmdThis);
732 }
733 }
734
FreeMSD(PMSD pmsdThis)735 void LIBCALL FreeMSD(PMSD pmsdThis)
736 {
737 #ifdef _DEBUG_2
738 printf("in FreeMSD ");
739 #endif
740 if (pmsdThis)
741 {
742 /* ASN.1 parts */
743 if (pmsdThis->pbsBS) BiostrucFree(pmsdThis->pbsBS);
744 /* BiostrucFree kills models, features % saved ASN.1 parts ... */
745 if (pmsdThis->pGraphDescr)
746 AsnGenericChoiceSeqOfFree(pmsdThis->pGraphDescr,(AsnOptFreeFunc)BiomolDescrFree);
747 if (pmsdThis->pDictLocal)
748 AsnGenericUserSeqOfFree(pmsdThis->pDictLocal,(AsnOptFreeFunc)ResidueGraphFree);
749 /* Structure Strings */
750 if (pmsdThis->pcSName) MemFree(pmsdThis->pcSName);
751 if (pmsdThis->pcPDBName) MemFree(pmsdThis->pcPDBName);
752 if (pmsdThis->pcChemName) MemFree(pmsdThis->pcChemName);
753 if (pmsdThis->pcPdbClass) MemFree(pmsdThis->pcPdbClass);
754 if (pmsdThis->pcPdbSource) MemFree(pmsdThis->pcPdbSource);
755 /* Modelstruc parts */
756 if (pmsdThis->pdnmmHead) FreeListDNMM(pmsdThis->pdnmmHead);
757 if (pmsdThis->pvnmbIMBHead) FreeListVNMB(pmsdThis->pvnmbIMBHead);
758 if (pmsdThis->pdnmlModels) FreeListDNML(pmsdThis->pdnmlModels);
759 if (pmsdThis->pvnmoHead) FreeListVNMO(pmsdThis->pvnmoHead);
760 if (pmsdThis->pvnmdHead) FreeListVNMD(pmsdThis->pvnmdHead);
761 /* if (pmsdThis->pdnsfFeatures) FreeListDNSF(pmsdThis->pdnsfFeatures); */
762 if (pmsdThis->psaStrucAlignment) BiostrucAnnotSetFree(pmsdThis->psaStrucAlignment);
763 if (pmsdThis->ppflRotate) FLMatrixFree(pmsdThis->ppflRotate,0,0);
764 if (pmsdThis->pdnsfsHead) FreeListDNSFS(pmsdThis->pdnsfsHead);
765 if (pmsdThis->pflTranslate) FLVectorFree(pmsdThis->pflTranslate,0);
766 if (pmsdThis->ppflBoundBox) FLMatrixFree(pmsdThis->ppflBoundBox,0,0);
767 if (pmsdThis->pdnmsSlaves) FreeListDNMS(pmsdThis->pdnmsSlaves);
768 MemFree(pmsdThis);
769
770 }
771 }
772
773 /* adds after last node in list if *head not NULL
774 * otherwise head is new node
775 */
776
NewVNMB(PVNMB PNTR ppvnmbList,Int2 choice)777 PVNMB LIBCALL NewVNMB(PVNMB PNTR ppvnmbList, Int2 choice)
778 {
779 PVNMB pvnmbNew = NULL;
780 PMBD pmbdNew = NULL;
781 pmbdNew = NewMBD();
782 if (!pmbdNew) return NULL;
783 pvnmbNew = ValNodeAddPointer(ppvnmbList, choice, (Nlm_VoidPtr) pmbdNew);
784 pmbdNew->pvnmbLink = pvnmbNew; /* back link */
785 return pvnmbNew;
786 }
787
NewVNMO(PVNMO PNTR ppvnmoList,Int2 choice)788 PVNMO LIBCALL NewVNMO(PVNMO PNTR ppvnmoList, Int2 choice)
789 {
790 PVNMO pvnmoNew = NULL;
791 PMOD pmodNew = NULL;
792 pmodNew = NewMOD();
793 if (!pmodNew) return NULL;
794 pvnmoNew = ValNodeAddPointer(ppvnmoList, choice, (Nlm_VoidPtr) pmodNew);
795 pmodNew->pvnmoLink = pvnmoNew; /* back link */
796 return pvnmoNew;
797 }
798
799
NewVNMD(PVNMD PNTR ppvnmdList,Int2 choice)800 PVNMD LIBCALL NewVNMD(PVNMD PNTR ppvnmdList, Int2 choice)
801 {
802 PVNMD pvnmdNew = NULL;
803 PMDD pmddNew = NULL;
804 pmddNew = NewMDD();
805 if (!pmddNew) return NULL;
806 pvnmdNew = ValNodeAddPointer(ppvnmdList, choice, (Nlm_VoidPtr) pmddNew);
807 pmddNew->pvnmdLink = pvnmdNew; /* back link */
808 return pvnmdNew;
809 }
810
811
NewVNMA(PVNMA PNTR ppvnmaList,Int2 choice)812 PVNMA LIBCALL NewVNMA(PVNMA PNTR ppvnmaList, Int2 choice)
813 {
814 PVNMA pvnmaNew = NULL;
815 PMAD pmadNew = NULL;
816 pmadNew = NewMAD();
817 if (!pmadNew) return NULL;
818 pvnmaNew = ValNodeAddPointer(ppvnmaList, choice, (Nlm_VoidPtr) pmadNew);
819 pmadNew->pvnmaLink = pvnmaNew;
820 return pvnmaNew;
821 }
822
NewVNAL(PVNAL PNTR ppvnalList,Int2 choice)823 PVNAL LIBCALL NewVNAL(PVNAL PNTR ppvnalList, Int2 choice)
824 {
825 /* picks either paldlNew or paldNew as data node */
826 /* choice is model number - which will end up as a Uint1 */
827 PVNAL pvnalNew = NULL;
828 PALD paldNew = NULL;
829 paldNew = NewALD();
830 if (!paldNew) return NULL;
831 pvnalNew = ValNodeAddPointer(ppvnalList, choice, (Nlm_VoidPtr) paldNew);
832 paldNew->pvnalLink = pvnalNew; /* link to ValNode */
833 return pvnalNew;
834 }
835
NewDNMG(PDNMG PNTR ppdnmgList,Int2 choice)836 PDNMG LIBCALL NewDNMG(PDNMG PNTR ppdnmgList, Int2 choice)
837 {
838 PDNMG pdnmgNew = NULL;
839 PMGD pmgdNew = NULL;
840 pmgdNew = NewMGD();
841 if (!pmgdNew) return NULL;
842 pdnmgNew = DValNodeAddPointer(ppdnmgList, choice, (Nlm_VoidPtr) pmgdNew);
843 pmgdNew->pdnmgLink = pdnmgNew;
844 return pdnmgNew;
845 }
846
NewDNMM(PDNMM PNTR ppdnmmList,Int2 choice)847 PDNMM LIBCALL NewDNMM(PDNMM PNTR ppdnmmList, Int2 choice)
848 {
849 PDNMM pdnmmNew = NULL;
850 PMMD pmmdNew = NULL;
851 pmmdNew = NewMMD();
852 if (!pmmdNew) return NULL;
853 pdnmmNew = DValNodeAddPointer(ppdnmmList, choice, (Nlm_VoidPtr) pmmdNew);
854 pmmdNew->pdnmmLink = pdnmmNew;
855 return pdnmmNew;
856 }
857
NewDNMS(PDNMS PNTR ppdnmsList,Int2 choice)858 PDNMS LIBCALL NewDNMS(PDNMS PNTR ppdnmsList, Int2 choice)
859 {
860 PDNMS pdnmsNew = NULL;
861 PMSD pmsdNew = NULL;
862 pmsdNew = NewMSD();
863 if (!pmsdNew) return NULL;
864 pdnmsNew = DValNodeAddPointer(ppdnmsList, choice, (Nlm_VoidPtr) pmsdNew);
865 pmsdNew->pdnmsLink = pdnmsNew;
866 return pdnmsNew;
867 }
868
869
870
871 /* need to make equivalent function ptr call in a ValNodeFreeDataFn */
FreeVNDataFn(ValNodePtr vnp,pFreeFunc freefn)872 ValNodePtr LIBCALL FreeVNDataFn (ValNodePtr vnp, pFreeFunc freefn)
873 {
874 ValNodePtr next;
875
876 while (vnp)
877 {
878 if (freefn)
879 (*freefn)(vnp->data.ptrvalue);
880 else
881 Nlm_MemFree(vnp->data.ptrvalue);
882 next = vnp->next;
883 Nlm_MemFree(vnp);
884 vnp = next;
885 }
886 return NULL;
887 }
888
FreeListVNAL(PVNAL pvnalList)889 void LIBCALL FreeListVNAL(PVNAL pvnalList)
890 {
891 #ifdef _DEBUG_2
892 printf("in FreeListVNAL ");
893 #endif
894 FreeVNDataFn(pvnalList, (pFreeFunc)FreeALD);
895 }
896
FreeListDNML(PDNML pdnmlList)897 void LIBCALL FreeListDNML(PDNML pdnmlList)
898 {
899 #ifdef _DEBUG_2
900 printf("in FreeListDNML ");
901 #endif
902 DValNodeFreeData(pdnmlList, (pFreeFunc)FreeMLD);
903 }
904
FreeListDNSFS(PDNSFS pdnsfsList)905 void LIBCALL FreeListDNSFS(PDNSFS pdnsfsList)
906 {
907 #ifdef _DEBUG_2
908 printf("in FreeListDNSF ");
909 #endif
910 DValNodeFreeData(pdnsfsList, (pFreeFunc)FreeSFS); /* don't free Biostruc-dependent features */
911
912 }
913
FreeListDNSF(PDNSF pdnsfList)914 void LIBCALL FreeListDNSF(PDNSF pdnsfList)
915 {
916 #ifdef _DEBUG_2
917 printf("in FreeListDNSF ");
918 #endif
919 DValNodeFree(pdnsfList); /* don't free Biostruc-dependent features */
920
921 }
922
FreeListVNMB(PVNMB pvnmbList)923 void LIBCALL FreeListVNMB(PVNMB pvnmbList) /* takes out the whole singly-linked list */
924 {
925 #ifdef _DEBUG_2
926 printf("in FreeListVNMB ");
927 #endif
928 FreeVNDataFn(pvnmbList, (pFreeFunc)FreeMBD);
929 }
930
931
FreeListVNMO(PVNMO pvnmoList)932 void LIBCALL FreeListVNMO(PVNMO pvnmoList) /* takes out the whole singly-linked list */
933 {
934 #ifdef _DEBUG_2
935 printf("in FreeListVNMO ");
936 #endif
937 FreeVNDataFn(pvnmoList, (pFreeFunc)FreeMOD);
938 }
939
940
FreeListVNMD(PVNMD pvnmdList)941 void LIBCALL FreeListVNMD(PVNMD pvnmdList) /* takes out the whole singly-linked list */
942 {
943 #ifdef _DEBUG_2
944 printf("in FreeListVNMD ");
945 #endif
946 FreeVNDataFn(pvnmdList, (pFreeFunc)FreeMDD);
947 }
948
FreeListVNMA(PVNMA pvnmaList)949 void LIBCALL FreeListVNMA(PVNMA pvnmaList) /* takes out the whole singly-linked list */
950 {
951 #ifdef _DEBUG_2
952 printf("in FreeListVNMA ");
953 #endif
954 FreeVNDataFn(pvnmaList, (pFreeFunc)FreeMAD);
955 }
956
957 /* takes out one - at a time ! */
FreeDNMG(PDNMG pdnmgList,PDNMG pdnmgThis)958 PDNMG LIBCALL FreeDNMG(PDNMG pdnmgList, PDNMG pdnmgThis)
959 {
960 #ifdef _DEBUG_2
961 printf("in FreeDNMG ");
962 #endif
963 return DValNodeListDelNode(pdnmgList, pdnmgThis, (pFreeFunc)FreeMGD);
964 }
965
966
FreeListDNMG(PDNMG pdnmgList)967 void LIBCALL FreeListDNMG(PDNMG pdnmgList)
968 {
969 PDNMG pdnmgTemp;
970 #ifdef _DEBUG_2
971 printf("in FreeListDNMG ");
972 #endif
973
974 pdnmgTemp = pdnmgList;
975 while (pdnmgTemp)
976 {
977 pdnmgList = FreeDNMG(pdnmgTemp, pdnmgTemp);
978 pdnmgTemp = pdnmgList;
979 }
980 }
981
982
FreeDNMM(PDNMM pdnmmList,PDNMM pdnmmThis)983 PDNMM LIBCALL FreeDNMM(PDNMM pdnmmList, PDNMM pdnmmThis)
984 {
985 #ifdef _DEBUG_2
986 printf("in FreeDNMM ");
987 #endif
988 return DValNodeListDelNode(pdnmmList, pdnmmThis, (pFreeFunc)FreeMMD);
989 }
990
FreeListDNMM(PDNMM pdnmmList)991 void LIBCALL FreeListDNMM(PDNMM pdnmmList)
992 {
993 PDNMM pdnmmTemp;
994 #ifdef _DEBUG_2
995 printf("in FreeListDNMM ");
996 #endif
997 pdnmmTemp = pdnmmList;
998 while (pdnmmTemp)
999 {
1000 pdnmmList = FreeDNMM(pdnmmTemp, pdnmmTemp);
1001 pdnmmTemp = pdnmmList;
1002 }
1003 }
1004
FreeDNMS(PDNMS pdnmsList,PDNMS pdnmsThis)1005 PDNMS LIBCALL FreeDNMS(PDNMS pdnmsList, PDNMS pdnmsThis)
1006 {
1007 #ifdef _DEBUG_2
1008 printf("in FreeDNMS ");
1009 #endif
1010 return DValNodeListDelNode(pdnmsList, pdnmsThis, (pFreeFunc)FreeMSD);
1011 }
1012
1013
FreeListDNMS(PDNMS pdnmsList)1014 void LIBCALL FreeListDNMS(PDNMS pdnmsList)
1015 {
1016 PDNMS pdnmsTemp;
1017 pdnmsTemp = pdnmsList;
1018 #ifdef _DEBUG_2
1019 printf("in FreeListDNMS ");
1020 #endif
1021 while (pdnmsTemp)
1022 {
1023 pdnmsList = FreeDNMS(pdnmsTemp, pdnmsTemp);
1024 pdnmsTemp = pdnmsList;
1025 }
1026 }
1027
1028
FreeAtomicModelAsnLists(AtomicCoordinatesPtr pacThis)1029 void LIBCALL FreeAtomicModelAsnLists(AtomicCoordinatesPtr pacThis)
1030 {
1031 AlternateConformationIdsPtr paciThis = NULL;
1032 IsotropicTemperatureFactorsPtr pitfThis = NULL;
1033 AnisotropicTemperatureFactorsPtr patfThis = NULL;
1034 AtomicOccupanciesPtr pocThis = NULL;
1035 ModelSpacePointsPtr pmspThis = NULL;
1036 AtomPntrsPtr pappThis = NULL;
1037 CoordinatesPtr pcoThis = NULL;
1038
1039 /* Free data off AtomicCoordinatesPtr pacThis */
1040
1041 if (!pacThis) return;
1042 #ifdef _DEBUG_1
1043 printf("in FreeAtomicModelAsnList\n");
1044 #endif
1045 pappThis = pacThis->atoms; /* AtomPntrsPtr */
1046 pmspThis = pacThis->sites; /* ModelSpacePointsPtr */
1047 pocThis = pacThis->occupancies; /* AtomicOccupanciesPtr */
1048 paciThis = pacThis->alternate_conf_ids; /* AlternateConformationIdsPtr */
1049 if (pacThis->temperature_factors) /* choice of temp factor types */
1050 {
1051 if (pacThis->temperature_factors->choice == AtomicTemperatureFactors_isotropic)
1052 {
1053 pitfThis = (IsotropicTemperatureFactorsPtr) pacThis->temperature_factors->data.ptrvalue;
1054 }
1055 if (pacThis->temperature_factors->choice == AtomicTemperatureFactors_anisotropic)
1056 {
1057 patfThis = (AnisotropicTemperatureFactorsPtr) pacThis->temperature_factors->data.ptrvalue;
1058 }
1059 }
1060 if (pappThis)
1061 {
1062 AtomPntrsFree(pappThis);
1063 pacThis->atoms = NULL;
1064 }
1065 if (pmspThis)
1066 {
1067 ModelSpacePointsFree(pmspThis);
1068 pacThis->sites = NULL;
1069 }
1070 if (pocThis)
1071 {
1072 AtomicOccupanciesFree(pocThis);
1073 pacThis->occupancies = NULL;
1074 }
1075 if (paciThis)
1076 {
1077 AlternateConformationIdsFree(paciThis);
1078 pacThis->alternate_conf_ids = NULL;
1079 }
1080 if (pitfThis)
1081 {
1082 IsotropicTemperatureFactorsFree (pitfThis);
1083 pacThis->temperature_factors->data.ptrvalue = NULL;
1084 }
1085 if (patfThis)
1086 {
1087 AnisotropicTemperatureFactorsFree(patfThis);
1088 pacThis->temperature_factors->data.ptrvalue = NULL;
1089 }
1090 if (pacThis->temperature_factors)
1091 {
1092 ValNodeFree(pacThis->temperature_factors);
1093 pacThis->temperature_factors = NULL;
1094 }
1095 return;
1096 }
1097
1098
1099
1100
1101
AtomFromMMDBIndex(PDNMS pdnmsList,Int2 iStru,Int2 iMol,Int2 iGraph,Int4 iAtom)1102 PMAD LIBCALL AtomFromMMDBIndex(PDNMS pdnmsList, Int2 iStru, Int2 iMol, Int2 iGraph, Int4 iAtom)
1103 {
1104 PDNMS pdnmsThis;
1105 PMSD pmsdThis;
1106 PDNMM pdnmmThis;
1107 PMMD pmmdThis;
1108 PDNMG pdnmgThis;
1109 PMGD pmgdThis;
1110 PVNMA pvnmaThis;
1111 PMAD pmadThis;
1112
1113 pdnmsThis = (PDNMS) DValNodeFindNext((DValNodePtr)pdnmsList, NULL, iStru);
1114 if (pdnmsThis) pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
1115 else return NULL;
1116 pdnmmThis = (PDNMM) DValNodeFindNext((DValNodePtr)pmsdThis->pdnmmHead, NULL, iMol);
1117 if (pdnmmThis) pmmdThis = (PMMD) pdnmmThis->data.ptrvalue;
1118 else return NULL;
1119 pdnmgThis = (PDNMG) DValNodeFindNext((DValNodePtr)pmmdThis->pdnmgHead, NULL, iGraph);
1120 if (pdnmgThis) pmgdThis = (PMGD) pdnmgThis->data.ptrvalue;
1121 else return NULL;
1122 pvnmaThis = (PVNMA) pmgdThis->pvnmaAHead;
1123 if (pvnmaThis) pmadThis = (PMAD) pvnmaThis->data.ptrvalue;
1124 else return NULL;
1125 while (pvnmaThis)
1126 {
1127 if (pmadThis->iIndex == iAtom)
1128 {
1129 return pmadThis;
1130 }
1131 pvnmaThis = pvnmaThis->next;
1132 if (pvnmaThis) pmadThis = (PMAD) pvnmaThis->data.ptrvalue;
1133 }
1134 return NULL;
1135 }
1136
1137
1138
GraphFromMMDBIndex(PDNMS pdnmsList,Int2 iStru,Int2 iMol,Int2 iGraph)1139 PMGD LIBCALL GraphFromMMDBIndex(PDNMS pdnmsList, Int2 iStru, Int2 iMol, Int2 iGraph )
1140 {
1141 PDNMS pdnmsThis;
1142 PMSD pmsdThis;
1143 PDNMM pdnmmThis;
1144 PMMD pmmdThis;
1145 PDNMG pdnmgThis;
1146 PMGD pmgdThis;
1147
1148
1149 pdnmsThis = (PDNMS) DValNodeFindNext((DValNodePtr)pdnmsList, NULL, iStru);
1150 if (pdnmsThis) pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
1151 else return NULL;
1152 pdnmmThis = (PDNMM) DValNodeFindNext((DValNodePtr)pmsdThis->pdnmmHead, NULL, iMol);
1153 if (pdnmmThis) pmmdThis = (PMMD) pdnmmThis->data.ptrvalue;
1154 else return NULL;
1155 pdnmgThis = (PDNMG) DValNodeFindNext((DValNodePtr)pmmdThis->pdnmgHead, NULL, iGraph);
1156 if (pdnmgThis)
1157 {
1158 pmgdThis = (PMGD) pdnmgThis->data.ptrvalue;
1159 return pmgdThis;
1160 }
1161 else return NULL;
1162 }
1163
1164
MolFromMMDBIndex(PDNMS pdnmsList,Int2 iStru,Int2 iMol)1165 PMMD LIBCALL MolFromMMDBIndex(PDNMS pdnmsList, Int2 iStru, Int2 iMol)
1166 {
1167 PDNMS pdnmsThis;
1168 PMSD pmsdThis;
1169 PDNMM pdnmmThis;
1170 PMMD pmmdThis;
1171
1172
1173 pdnmsThis = (PDNMS) DValNodeFindNext((DValNodePtr)pdnmsList, NULL, iStru);
1174 if (pdnmsThis) pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
1175 else return NULL;
1176 pdnmmThis = (PDNMM) DValNodeFindNext((DValNodePtr)pmsdThis->pdnmmHead, NULL, iMol);
1177 if (pdnmmThis)
1178 {
1179 pmmdThis = (PMMD) pdnmmThis->data.ptrvalue;
1180 return pmmdThis;
1181 }
1182 else return NULL;
1183 }
1184
LoadDict(CharPtr pcDictName)1185 PRGD LIBCALL LoadDict(CharPtr pcDictName)
1186 {
1187
1188 AsnIoPtr aipr=NULL;
1189 FILE *f;
1190 Char fullpath [PATH_MAX];
1191 CharPtr ptr;
1192 PRGD rgdp;
1193
1194 aipr = NULL;
1195 rgdp = NULL;
1196
1197 ProgramPath (fullpath, sizeof (fullpath) - 1);
1198 ptr = StringRChr (fullpath, DIRDELIMCHR);
1199 if (ptr != NULL) {
1200 *ptr = '\0';
1201 } else {
1202 StrCpy(fullpath, ".");
1203 }
1204 FileBuildPath (fullpath, NULL, pcDictName);
1205
1206 if ((f = FileOpen (fullpath, "rb")) == NULL) {
1207 if (FindPath ("NCBI", "NCBI", "DATA", fullpath, sizeof (fullpath) - 1)) {
1208 FileBuildPath (fullpath, NULL, pcDictName);
1209 aipr = AsnIoOpen (fullpath, "rb");
1210 if (aipr == NULL) {
1211 ErrPost(CTX_NCBIOBJ, 1, "Couldn't open [%s] in LoadDict", fullpath);
1212 return NULL;
1213 }
1214 } else {
1215 ErrPost(CTX_NCBIOBJ, 1, "FindPath failed in LoadDict");
1216 return NULL;
1217 }
1218 } else {
1219 FileClose (f);
1220 aipr = AsnIoOpen(fullpath, "rb");
1221 if (aipr == NULL) {
1222 ErrPost(CTX_NCBIOBJ, 1, "Couldn't open [%s] in LoadDict", fullpath);
1223 return NULL;
1224 }
1225 }
1226
1227 rgdp = BiostrucResidueGraphSetAsnRead(aipr, NULL);
1228
1229 AsnIoFlush(aipr);
1230 aipr = AsnIoClose(aipr);
1231
1232 return rgdp;
1233 }
1234
1235
1236
FetchBS(CharPtr pcFetch,Int2 iType,Int4 mdlLvl,Int4 maxModels,Byte bExtent)1237 BiostrucPtr LIBCALL FetchBS(CharPtr pcFetch, Int2 iType, Int4 mdlLvl,
1238 Int4 maxModels, Byte bExtent)
1239 { /* mdlLvl = BSEVERYTHING used to denote fetch everything! */
1240 AsnIoPtr paioAIP = NULL; /* aip */
1241 BiostrucPtr pbsThe = NULL;
1242 Boolean bIsNetwork = FALSE;
1243 /* LinkSetPtr plsLink = NULL; */
1244 DocUid duUID = 0;
1245 /* StrToLong stuff */
1246 Nlm_Char ch;
1247 Nlm_Int2 i;
1248 Nlm_Int2 len;
1249 Nlm_Char local [64];
1250 Nlm_Boolean nodigits;
1251 Nlm_Boolean rsult;
1252 long int val;
1253
1254
1255 #ifdef _DEBUG_0
1256 printf("MaxModels=%d ModelLevel=%d\n",(int) maxModels,(int) mdlLvl);
1257 #endif
1258 /* load the parse trees */
1259 if (! (objmmdb1AsnLoad() && objmmdb2AsnLoad() && objmmdb3AsnLoad() ))
1260 {
1261 ErrPostEx(SEV_FATAL,0,0, "Internal - objmmdbNAsnLoad() Failure");
1262 return NULL;
1263 } /* DON'T load any more than necessary */
1264
1265 /* handle the different types of input data */
1266 switch (iType)
1267 {
1268 case INP_ASCII_FILE:
1269 /* open the ASN.1 input file in the right mode */
1270 if ((paioAIP = AsnIoOpen (pcFetch, "r")) == NULL)
1271 {
1272 ErrClear(); /* toolkit fatal */
1273 ErrPostEx(SEV_ERROR,0,0, "Unable to open ASCII ASN.1 input file:\n %s\n Check if it exists."
1274 ,pcFetch);
1275 ErrShow();
1276 return NULL;
1277 }
1278 /* get the pointer to the seq entry */
1279
1280 if (mdlLvl == BSEVERYTHING)
1281 {
1282 if ((pbsThe = BiostrucAsnRead(paioAIP, NULL)) == NULL)
1283 {
1284 ErrClear(); /* toolkit fatal */
1285 ErrPostEx(SEV_ERROR,0,0, "Unable to read Biostruc in:\n%s\nConfused Binary/ASCII or Wrong File Type!"
1286 ,pcFetch);
1287 ErrShow();
1288 return NULL;
1289 }}
1290 else
1291 { if ((pbsThe = BiostrucAsnGet(paioAIP, NULL, mdlLvl, maxModels)) == NULL)
1292 {
1293 ErrClear(); /* toolkit fatal */
1294 ErrPostEx(SEV_ERROR,0,0, "Unable to read Biostruc in:\n%s\nConfused Binary/ASCII or Wrong File Type!"
1295 ,pcFetch);
1296 ErrShow();
1297 return NULL;
1298 }}
1299 AsnIoClose(paioAIP);
1300 /* printf("Got the ascii biostruc\n"); */
1301 break;
1302 case INP_BINARY_FILE:
1303 /* printf("in Binary input\n"); */
1304
1305 /* open the ASN.1 input file in the right mode */
1306 if ((paioAIP = AsnIoOpen (pcFetch, "rb")) == NULL)
1307 {
1308 ErrClear(); /* toolkit fatal */
1309 ErrPostEx(SEV_ERROR,0,0, "Unable to open BINARY ASN.1 input file:\n %s\n Check if it exists.",pcFetch);
1310 ErrShow();
1311 return NULL;
1312 }
1313 /* get the pointer to the seq entry */
1314 if (mdlLvl == BSEVERYTHING)
1315 {
1316 if ((pbsThe = BiostrucAsnRead(paioAIP, NULL)) == NULL)
1317 {
1318 ErrClear(); /* toolkit fatal */
1319 ErrPostEx(SEV_ERROR,0,0, "Unable to read Biostruc in:\n%s\nConfused Binary/ASCII or Wrong File Type!"
1320 ,pcFetch);
1321 ErrShow();
1322 return NULL;
1323 }}
1324 else
1325 { if ((pbsThe = BiostrucAsnGet(paioAIP, NULL, mdlLvl, maxModels)) == NULL)
1326 {
1327 ErrClear(); /* toolkit fatal */
1328 ErrPostEx(SEV_ERROR,0,0, "Unable to read Biostruc in:\n%s\nConfused Binary/ASCII or Wrong File Type!"
1329 ,pcFetch);
1330 ErrShow();
1331 return NULL;
1332 }}
1333
1334 AsnIoClose(paioAIP);
1335 /* printf("Got the binary biostruc\n"); */
1336 break;
1337 case INP_GI:
1338 if (bExtent & (Byte) FETCH_ENTREZ)
1339 if (!MMDBInit())
1340 {
1341 ErrClear(); /* toolkit fatal */
1342 ErrPostEx(SEV_ERROR,0,0, "Unable to open MMDB input.");
1343 ErrShow();
1344 return NULL;
1345 }
1346
1347 /* this is code from Nlm StrToLong */
1348 rsult = FALSE;
1349 len = (Nlm_Int2) Nlm_StringLen (pcFetch);
1350 if (len != 0) {
1351 rsult = TRUE;
1352 nodigits = TRUE;
1353 for (i = 0; i < len; i++) {
1354 ch = pcFetch [i];
1355 if (ch == ' ' || ch == '+' || ch == '-') {
1356 } else if (ch < '0' || ch > '9') {
1357 rsult = FALSE;
1358 } else {
1359 nodigits = FALSE;
1360 }
1361 }
1362 if (nodigits) {
1363 rsult = FALSE;
1364 }
1365 if (rsult) {
1366 Nlm_StringNCpy (local, pcFetch, sizeof (local));
1367 if (sscanf (local, "%ld", &val) == 1) {
1368 duUID = val;
1369 }
1370 }
1371 }
1372 if (duUID == 0)
1373 {
1374 ErrClear(); /* toolkit fatal */
1375 ErrPostEx(SEV_ERROR,0,0, "UID - %s - not in structure database, \n Check your input.", pcFetch);
1376 ErrShow();
1377 if (bExtent & (Byte) FETCH_ENTREZ) MMDBFini();
1378 return NULL;
1379 }
1380 if ((pbsThe = MMDBBiostrucGet(duUID, mdlLvl, maxModels)) == NULL)
1381 {
1382 ErrClear(); /* toolkit fatal */
1383 ErrPostEx(SEV_ERROR,0,0, "Unable to find UID = %ld \nin database.", (long)duUID);
1384 ErrShow();
1385 if (bExtent & (Byte) FETCH_ENTREZ) MMDBFini();
1386 return NULL;
1387 }
1388 if (bExtent & (Byte) FETCH_ENTREZ) MMDBFini();
1389 break;
1390 case INP_PDB_ACCESSION:
1391 if (bExtent & (Byte) FETCH_ENTREZ)
1392 if (!MMDBInit())
1393 {
1394 ErrClear(); /* toolkit fatal */
1395 ErrPostEx(SEV_ERROR,0,0, "Unable to open MMDB input.");
1396 ErrShow();
1397 return NULL;
1398 }
1399 duUID = MMDBEvalPDB(pcFetch);
1400 if (duUID != 0)
1401 {
1402 if ((pbsThe = MMDBBiostrucGet(duUID, mdlLvl, maxModels)) == NULL)
1403 {
1404 ErrClear(); /* toolkit fatal */
1405 ErrPostEx(SEV_ERROR,0,0, "Unable to find UID = %ld \nin database.", (long)duUID);
1406 ErrShow();
1407 /* LinkSetFree(plsLink); */
1408 if (bExtent & (Byte) FETCH_ENTREZ) MMDBFini();
1409 return NULL;
1410 }
1411 }
1412 else
1413 {
1414 ErrClear(); /* toolkit fatal */
1415 ErrPostEx(SEV_ERROR,0,0, "Accession - %s - not in structure database, \n Check your input.", pcFetch);
1416 ErrShow();
1417 if (bExtent & (Byte) FETCH_ENTREZ) MMDBFini();
1418 return NULL;
1419 }
1420 if (bExtent & (Byte) FETCH_ENTREZ) MMDBFini();
1421 break;
1422
1423 default:
1424 return NULL;
1425 } /* switch iTYPE */
1426 /* here pbsThe should be valid in-memory Biostruc */
1427 return pbsThe;
1428 }
1429
1430
1431
1432
1433
1434
1435
1436
1437 /* make a GetBSRefictiona */
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448 /**************************/
1449 /*version 4.1 ASN.1 code **/
1450 /**************************/
1451
1452
1453 /* makes ValNode list on MAD, MGD, MDD pvnContainedBy
1454 * and ValNode list on MOD MDD pvnContains.
1455 * ranges are explicitly instantiated,
1456 * but not children.
1457 */
1458
AssignSurfaceContents(PDNMS pdnmsList,Int2 iModel,PFB pfbThis,ChemGraphPntrsPtr pcgpContents)1459 Boolean LIBCALL AssignSurfaceContents(PDNMS pdnmsList, Int2 iModel, PFB pfbThis, ChemGraphPntrsPtr pcgpContents)
1460 {
1461
1462 AtomPntrsPtr ppaThis = NULL;
1463 ResiduePntrsPtr pprThis = NULL;
1464 ResidueExplicitPntrsPtr ppreThis = NULL;
1465 ResidueIntervalPntrPtr ppriThis = NULL;
1466 MoleculePntrsPtr ppmThis = NULL;
1467 ValNodePtr pvnAtoms = NULL;
1468 ValNodePtr pvnMol = NULL;
1469 ValNodePtr pvnRes = NULL;
1470 ValNodePtr pvnThis = NULL;
1471 PMAD pmadThis = NULL;
1472 PMGD pmgdThis = NULL;
1473 PMMD pmmdThis = NULL;
1474 PMOD pmodThis = NULL;
1475 PMDD pmddThis = NULL;
1476 Int4 iStart = 0;
1477 Int4 iEnd = 0;
1478 #ifdef _DEBUG_1
1479 printf("in AssignSurfaceContents\n ");
1480 #endif
1481 switch (pcgpContents->choice)
1482 {
1483 case ChemGraphPntrs_atoms:
1484 ppaThis = (AtomPntrsPtr) pcgpContents->data.ptrvalue;
1485 pvnMol = ppaThis->molecule_ids;
1486 pvnRes = ppaThis->residue_ids;
1487 pvnAtoms = ppaThis->atom_ids;
1488 while (pvnAtoms)
1489 {
1490 pmadThis = AtomFromMMDBIndex(pdnmsList, (Int2) pdnmsList->choice,
1491 (Int2) pvnMol->data.intvalue, (Int2) pvnRes->data.intvalue,
1492 (Int4) pvnAtoms->data.intvalue);
1493 if (pmadThis)
1494 {
1495 pvnThis = ValNodeAddPointer(&pmadThis->pvnContainedBy, iModel, (Pointer) pfbThis);
1496 if (!pvnThis) return FALSE;
1497 }
1498 else return FALSE;
1499 if (pfbThis->bMe == AM_MOD)
1500 {
1501 pmodThis = (PMOD) pfbThis;
1502 pvnThis = ValNodeAddPointer(&pmodThis->pvnContains, ChemGraphPntrs_atoms, (Pointer) pmadThis);
1503 }
1504 if (pfbThis->bMe == AM_MDD)
1505 {
1506 pmddThis = (PMDD) pfbThis;
1507 pvnThis = ValNodeAddPointer(&pmddThis->pvnContains, ChemGraphPntrs_atoms, (Pointer) pmadThis);
1508 }
1509 pvnAtoms = pvnAtoms->next;
1510 pvnMol = pvnMol->next;
1511 pvnRes = pvnRes->next;
1512 }
1513 return TRUE;
1514 case ChemGraphPntrs_residues:
1515 pprThis = (ResiduePntrsPtr) pcgpContents->data.ptrvalue;
1516 if (pprThis->choice == ResiduePntrs_explicit)
1517 {
1518
1519 ppreThis = (ResidueExplicitPntrsPtr) pprThis->data.ptrvalue;
1520 pvnMol = ppreThis->molecule_ids;
1521 pvnRes = ppreThis->residue_ids;
1522
1523 while (pvnRes)
1524 {
1525 pmgdThis = GraphFromMMDBIndex(pdnmsList, (Int2) pdnmsList->choice,
1526 (Int2) pvnMol->data.intvalue, (Int2) pvnRes->data.intvalue);
1527 if (pmgdThis)
1528 {
1529 pvnThis = ValNodeAddPointer(&pmgdThis->pvnContainedBy, iModel, (Pointer) pfbThis);
1530 if (!pvnThis) return FALSE;
1531 }
1532 else return FALSE;
1533 if (pfbThis->bMe == AM_MOD)
1534 {
1535 pmodThis = (PMOD) pfbThis;
1536 pvnThis = ValNodeAddPointer(&pmodThis->pvnContains, ChemGraphPntrs_residues, (Pointer) pmgdThis);
1537 }
1538 if (pfbThis->bMe == AM_MDD)
1539 {
1540 pmddThis = (PMDD) pfbThis;
1541 pvnThis = ValNodeAddPointer(&pmddThis->pvnContains, ChemGraphPntrs_residues, (Pointer) pmgdThis);
1542 }
1543 pvnMol = pvnMol->next;
1544 pvnRes = pvnRes->next;
1545 }
1546
1547 return TRUE;
1548 }
1549 if (pprThis->choice == ResiduePntrs_interval)
1550 {
1551 ppriThis = (ResidueIntervalPntrPtr) pprThis->data.ptrvalue;
1552 while (ppriThis)
1553 {
1554 iStart = ppriThis->from;
1555 iEnd = ppriThis->to;
1556 if (iStart > ppriThis->to)
1557 {
1558 iStart = ppriThis->to;
1559 iEnd = ppriThis->from;
1560 }
1561 for (;iStart <= iEnd; iStart++)
1562 {
1563 pmgdThis = GraphFromMMDBIndex(pdnmsList, (Int2) pdnmsList->choice,
1564 (Int2) ppriThis->molecule_id, (Int2) iStart);
1565 if (pmgdThis)
1566 {
1567 pvnThis = ValNodeAddPointer(&pmgdThis->pvnContainedBy, iModel, (Pointer) pfbThis);
1568 if (!pvnThis) return FALSE;
1569 }
1570 else return FALSE;
1571 if (pfbThis->bMe == AM_MOD)
1572 {
1573 pmodThis = (PMOD) pfbThis;
1574 pvnThis = ValNodeAddPointer(&pmodThis->pvnContains, ChemGraphPntrs_residues, (Pointer) pmgdThis);
1575 }
1576 if (pfbThis->bMe == AM_MDD)
1577 {
1578 pmddThis = (PMDD) pfbThis;
1579 pvnThis = ValNodeAddPointer(&pmddThis->pvnContains, ChemGraphPntrs_residues, (Pointer) pmgdThis);
1580 }
1581 } /* for start to end of interval */
1582
1583 ppriThis = ppriThis->next;
1584 } /* while intervals */
1585 return TRUE;
1586 }
1587 return FALSE;
1588 case ChemGraphPntrs_molecules:
1589 ppmThis = (MoleculePntrsPtr) pcgpContents->data.ptrvalue;
1590 pvnMol = ppmThis->molecule_ids;
1591 while (pvnMol)
1592 {
1593 pmmdThis = MolFromMMDBIndex(pdnmsList, (Int2) pdnmsList->choice,
1594 (Int2) pvnMol->data.intvalue);
1595 if (pmmdThis)
1596 {
1597 pvnThis = ValNodeAddPointer(&pmmdThis->pvnContainedBy, iModel, (Pointer) pfbThis);
1598 if (!pvnThis) return FALSE;
1599 }
1600 else return FALSE;
1601 if (pfbThis->bMe == AM_MOD)
1602 {
1603 pmodThis = (PMOD) pfbThis;
1604 pvnThis = ValNodeAddPointer(&pmodThis->pvnContains, ChemGraphPntrs_molecules, (Pointer) pmmdThis);
1605 }
1606 if (pfbThis->bMe == AM_MDD)
1607 {
1608 pmddThis = (PMDD) pfbThis;
1609 pvnThis = ValNodeAddPointer(&pmddThis->pvnContains, ChemGraphPntrs_molecules, (Pointer) pmmdThis);
1610 }
1611 pvnMol = pvnMol->next;
1612 }
1613 return TRUE;
1614 }
1615 return FALSE;
1616 }
1617
1618
1619
1620
1621
FreeSurfaceModelAsnList(SurfaceCoordinatesPtr pscThis)1622 void LIBCALL FreeSurfaceModelAsnList(SurfaceCoordinatesPtr pscThis)
1623 {
1624
1625 TMeshPtr ptmshThis = NULL;
1626 TrianglesPtr ptriThis = NULL;
1627 ValNodePtr pvnX = NULL;
1628
1629 if (!pscThis) return;
1630 if (!pscThis->Surface_surface) return;
1631 #ifdef _DEBUG_1
1632 printf("in FreeSurfaceModelAsnList\n");
1633 #endif
1634 switch (pscThis->Surface_surface->choice)
1635 {
1636 case Surface_surface_cylinder:
1637 case Surface_surface_brick:
1638 case Surface_surface_sphere:
1639 case Surface_surface_cone:
1640 return; /* nothing to free */
1641 case Surface_surface_tmesh:
1642 ptmshThis = (TMeshPtr) pscThis->Surface_surface->data.ptrvalue;
1643 pvnX = ValNodeFree(ptmshThis->x);
1644 ptmshThis->x = NULL;
1645 pvnX = ValNodeFree(ptmshThis->y);
1646 ptmshThis->y = NULL;
1647 pvnX = ValNodeFree(ptmshThis->z);
1648 ptmshThis->z = NULL;
1649 pvnX = ValNodeFree(ptmshThis->swap);
1650 ptmshThis->swap = NULL;
1651 return;
1652 case Surface_surface_triangles:
1653 ptriThis = (TrianglesPtr) pscThis->Surface_surface->data.ptrvalue;
1654 pvnX = ValNodeFree(ptriThis->x);
1655 ptriThis->x = NULL;
1656 pvnX = ValNodeFree(ptriThis->y);
1657 ptriThis->y = NULL;
1658 pvnX = ValNodeFree(ptriThis->z);
1659 ptriThis->z = NULL;
1660 pvnX = ValNodeFree(ptriThis->v1);
1661 ptriThis->v1 = NULL;
1662 pvnX = ValNodeFree(ptriThis->v2);
1663 ptriThis->v2 = NULL;
1664 pvnX = ValNodeFree(ptriThis->v3);
1665 ptriThis->v3 = NULL;
1666 return;
1667 default:
1668 return;
1669 }
1670 }
1671
1672
FillSurface(SurfaceCoordinatesPtr pscThis,PMOD pmodThis)1673 Boolean LIBCALL FillSurface(SurfaceCoordinatesPtr pscThis, PMOD pmodThis)
1674 {
1675
1676 CylinderPtr pcylThis = NULL;
1677 BrickPtr pbrkThis = NULL;
1678 ConePtr pconThis = NULL;
1679 TMeshPtr ptmshThis = NULL;
1680 TrianglesPtr ptriThis = NULL;
1681 SpherePtr psphThis = NULL;
1682 ModelSpacePointPtr pmspTop = NULL;
1683 ModelSpacePointPtr pmspBottom = NULL;
1684 ModelSpacePointPtr pmspTemp = NULL;
1685 RealValuePtr prvRadius = NULL;
1686 ValNodePtr pvnSwap = NULL;
1687 ValNodePtr pvnX = NULL;
1688 ValNodePtr pvnY = NULL;
1689 ValNodePtr pvnZ = NULL;
1690 Int4 iCount = 0;
1691 Boolean rsult = FALSE;
1692
1693 #ifdef _DEBUG_1
1694 printf("in FillSurface=");
1695 #endif
1696 if (!pscThis) return FALSE;
1697 if (!pscThis->Surface_surface) return FALSE;
1698
1699 ProgMon("Instantiating Surface");
1700 switch (pscThis->Surface_surface->choice)
1701 {
1702 case Surface_surface_cylinder:
1703 #ifdef _DEBUG_2
1704 printf("cylinder\n ");
1705 #endif
1706 pmodThis->bWhat = (Byte)(pmodThis->bWhat | (Byte) OBJ_CYLINDER);
1707 pcylThis = (CylinderPtr) pscThis->Surface_surface->data.ptrvalue;
1708 pmodThis->ppflObject = FLMatrix(0, 1, 0, 2); /* 2 by 3 matrix */
1709 if (!pmodThis->ppflObject) return FALSE;
1710 pmodThis->iCoordNo = 2;
1711 pmspTop = pcylThis->axis_top;
1712 pmspBottom = pcylThis->axis_bottom;
1713 prvRadius = pcylThis->radius;
1714 pmodThis->ppflObject[0][0] = (FloatLo)((FloatLo)pmspTop->x/pmspTop->scale_factor);
1715 pmodThis->ppflObject[0][1] = (FloatLo)((FloatLo)pmspTop->y/pmspTop->scale_factor);
1716 pmodThis->ppflObject[0][2] = (FloatLo)((FloatLo)pmspTop->z/pmspTop->scale_factor);
1717 pmodThis->ppflObject[1][0] = (FloatLo)((FloatLo)pmspBottom->x/pmspBottom->scale_factor);
1718 pmodThis->ppflObject[1][1] = (FloatLo)((FloatLo)pmspBottom->y/pmspBottom->scale_factor);
1719 pmodThis->ppflObject[1][2] = (FloatLo)((FloatLo)pmspBottom->z/pmspBottom->scale_factor);
1720 pmodThis->flRadius = (FloatLo)((FloatLo)prvRadius->scaled_integer_value/prvRadius->scale_factor);
1721 return TRUE;
1722 case Surface_surface_brick:
1723 #ifdef _DEBUG_2
1724 printf("brick\n ");
1725 #endif
1726 pmodThis->bWhat = (Byte)(pmodThis->bWhat | (Byte) OBJ_BRICK);
1727 pbrkThis = (BrickPtr) pscThis->Surface_surface->data.ptrvalue;
1728 pmodThis->ppflObject = FLMatrix(0, 7, 0, 2); /* 8 by 3 matrix */
1729 if (!pmodThis->ppflObject) return FALSE;
1730 pmodThis->iCoordNo = 8;
1731 pmspTemp = pbrkThis->corner_000;
1732 pmodThis->ppflObject[0][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1733 pmodThis->ppflObject[0][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1734 pmodThis->ppflObject[0][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1735 pmspTemp = pbrkThis->corner_001;
1736 pmodThis->ppflObject[1][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1737 pmodThis->ppflObject[1][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1738 pmodThis->ppflObject[1][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1739 pmspTemp = pbrkThis->corner_010;
1740 pmodThis->ppflObject[2][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1741 pmodThis->ppflObject[2][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1742 pmodThis->ppflObject[2][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1743 pmspTemp = pbrkThis->corner_011;
1744 pmodThis->ppflObject[3][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1745 pmodThis->ppflObject[3][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1746 pmodThis->ppflObject[3][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1747 pmspTemp = pbrkThis->corner_100;
1748 pmodThis->ppflObject[4][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1749 pmodThis->ppflObject[4][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1750 pmodThis->ppflObject[4][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1751 pmspTemp = pbrkThis->corner_101;
1752 pmodThis->ppflObject[5][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1753 pmodThis->ppflObject[5][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1754 pmodThis->ppflObject[5][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1755 pmspTemp = pbrkThis->corner_110;
1756 pmodThis->ppflObject[6][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1757 pmodThis->ppflObject[6][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1758 pmodThis->ppflObject[6][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1759 pmspTemp = pbrkThis->corner_111;
1760 pmodThis->ppflObject[7][0] = (FloatLo)((FloatLo)pmspTemp->x/pmspTemp->scale_factor);
1761 pmodThis->ppflObject[7][1] = (FloatLo)((FloatLo)pmspTemp->y/pmspTemp->scale_factor);
1762 pmodThis->ppflObject[7][2] = (FloatLo)((FloatLo)pmspTemp->z/pmspTemp->scale_factor);
1763 return TRUE;
1764 case Surface_surface_sphere:
1765 #ifdef _DEBUG_2
1766 printf("sphere\n ");
1767 #endif
1768 pmodThis->bWhat = (Byte)(pmodThis->bWhat | (Byte) OBJ_SPHERE);
1769 psphThis = (SpherePtr) pscThis->Surface_surface->data.ptrvalue;
1770 pmodThis->ppflObject = FLMatrix(0, 1, 0, 1); /* 1 by 3 matrix */
1771 if (!pmodThis->ppflObject) return FALSE;
1772 pmodThis->iCoordNo = 1;
1773 pmspTop = psphThis->center;
1774 prvRadius = psphThis->radius;
1775 pmodThis->ppflObject[0][0] = (FloatLo)((FloatLo)pmspTop->x/pmspTop->scale_factor);
1776 pmodThis->ppflObject[0][1] = (FloatLo)((FloatLo)pmspTop->y/pmspTop->scale_factor);
1777 pmodThis->ppflObject[0][2] = (FloatLo)((FloatLo)pmspTop->z/pmspTop->scale_factor);
1778 pmodThis->flRadius = (FloatLo)((FloatLo)prvRadius->scaled_integer_value/prvRadius->scale_factor);
1779 return TRUE;
1780 case Surface_surface_cone:
1781 #ifdef _DEBUG_2
1782 printf("cone\n ");
1783 #endif
1784 pmodThis->bWhat = (Byte)(pmodThis->bWhat | (Byte) OBJ_CONE);
1785 pconThis = (ConePtr) pscThis->Surface_surface->data.ptrvalue;
1786 pmodThis->ppflObject = FLMatrix(0, 1, 0, 2); /* 2 by 3 matrix */
1787 if (!pmodThis->ppflObject) return FALSE;
1788 pmodThis->iCoordNo = 2;
1789 pmspTop = pconThis->axis_top;
1790 pmspBottom = pconThis->axis_bottom;
1791 prvRadius = pconThis->radius_bottom;
1792 pmodThis->ppflObject[0][0] = (FloatLo)((FloatLo)pmspTop->x/pmspTop->scale_factor);
1793 pmodThis->ppflObject[0][1] = (FloatLo)((FloatLo)pmspTop->y/pmspTop->scale_factor);
1794 pmodThis->ppflObject[0][2] = (FloatLo)((FloatLo)pmspTop->z/pmspTop->scale_factor);
1795 pmodThis->ppflObject[1][0] = (FloatLo)((FloatLo)pmspBottom->x/pmspBottom->scale_factor);
1796 pmodThis->ppflObject[1][1] = (FloatLo)((FloatLo)pmspBottom->y/pmspBottom->scale_factor);
1797 pmodThis->ppflObject[1][2] = (FloatLo)((FloatLo)pmspBottom->z/pmspBottom->scale_factor);
1798 pmodThis->flRadius = (FloatLo)((FloatLo)prvRadius->scaled_integer_value/prvRadius->scale_factor);
1799 return TRUE;
1800 case Surface_surface_tmesh:
1801 #ifdef _DEBUG_2
1802 printf("tmesh\n ");
1803 #endif
1804 pmodThis->bWhat = (Byte)(pmodThis->bWhat | (Byte) OBJ_TMESH);
1805 ptmshThis = (TMeshPtr) pscThis->Surface_surface->data.ptrvalue;
1806 pmodThis->ppflObject = FLMatrix(0, ptmshThis->number_of_points, 0, 2); /* N by 3 matrix */
1807 if (!pmodThis->ppflObject) return FALSE;
1808 pmodThis->pucSwap = UCVector(0, ptmshThis->number_of_points); /* N vector for swap flags */
1809 if (!pmodThis->pucSwap) return FALSE;
1810 pvnX = ptmshThis->x;
1811 pvnY = ptmshThis->y;
1812 pvnZ = ptmshThis->z;
1813 pvnSwap = ptmshThis->swap;
1814 iCount = 0;
1815 while (pvnX)
1816 {
1817 ProgMon("Instantiating TMesh");
1818 pmodThis->ppflObject[iCount][0] = (FloatLo)
1819 ((FloatLo)pvnX->data.intvalue/ptmshThis->scale_factor);
1820 pmodThis->ppflObject[iCount][1] = (FloatLo)
1821 ((FloatLo)pvnY->data.intvalue/ptmshThis->scale_factor);
1822 pmodThis->ppflObject[iCount][2] = (FloatLo)
1823 ((FloatLo)pvnZ->data.intvalue/ptmshThis->scale_factor);
1824 if (pvnSwap->data.boolvalue) pmodThis->pucSwap[iCount] = (Uchar) 1;
1825 iCount++;
1826 pvnX = pvnX->next;
1827 pvnY = pvnY->next;
1828 pvnZ = pvnZ->next;
1829 pvnSwap = pvnSwap->next;
1830 }
1831 pmodThis->iCoordNo = iCount;
1832 FreeSurfaceModelAsnList(pscThis);
1833 return TRUE;
1834 case Surface_surface_triangles:
1835 #ifdef _DEBUG_2
1836 printf("triangles\n ");
1837 #endif
1838 pmodThis->bWhat = (Byte)(pmodThis->bWhat | (Byte) OBJ_TRIANGLES);
1839 ptriThis = (TrianglesPtr) pscThis->Surface_surface->data.ptrvalue;
1840 pmodThis->ppflObject = FLMatrix(0, ptriThis->number_of_points, 0, 2); /* N by 3 matrix */
1841 if (!pmodThis->ppflObject) return FALSE;
1842 pmodThis->ppi4Triangles = I4Matrix(0, ptriThis->number_of_triangles,0,2); /* N by 3 matrix */
1843 if (!pmodThis->ppi4Triangles) return FALSE;
1844 pvnX = ptriThis->x;
1845 pvnY = ptriThis->y;
1846 pvnZ = ptriThis->z;
1847 iCount = 0;
1848 while (pvnX)
1849 {
1850 ProgMon("Instantiating Triangles");
1851 pmodThis->ppflObject[iCount][0] = (FloatLo)
1852 ((FloatLo)pvnX->data.intvalue/ptriThis->scale_factor);
1853 pmodThis->ppflObject[iCount][1] = (FloatLo)
1854 ((FloatLo)pvnY->data.intvalue/ptriThis->scale_factor);
1855 pmodThis->ppflObject[iCount][2] = (FloatLo)
1856 ((FloatLo)pvnZ->data.intvalue/ptriThis->scale_factor);
1857 iCount++;
1858 pvnX = pvnX->next;
1859 pvnY = pvnY->next;
1860 pvnZ = pvnZ->next;
1861 }
1862 pmodThis->iCoordNo = iCount;
1863 iCount = 0;
1864 pvnX = ptriThis->v1;
1865 pvnY = ptriThis->v2;
1866 pvnZ = ptriThis->v3;
1867 while (pvnX)
1868 {
1869 pmodThis->ppi4Triangles[iCount][0] = (Int4) pvnX->data.intvalue;
1870 pmodThis->ppi4Triangles[iCount][1] = (Int4) pvnY->data.intvalue;
1871 pmodThis->ppi4Triangles[iCount][2] = (Int4) pvnZ->data.intvalue;
1872 iCount++;
1873 pvnX = pvnX->next;
1874 pvnY = pvnY->next;
1875 pvnZ = pvnZ->next;
1876 }
1877 pmodThis->iTriNo = iCount;
1878 FreeSurfaceModelAsnList(pscThis);
1879 return TRUE;
1880
1881 default:
1882 rsult = FALSE;
1883 }
1884 return rsult;
1885 }
1886
1887
1888
1889
1890
1891
BiostrucModel2ModelStruc(BiostrucModelPtr pbsmThis,PDNMS pdnmsThis,Int2 iChoice,Int2 iModelCount,Byte bExtent)1892 Int2 LIBCALL BiostrucModel2ModelStruc(BiostrucModelPtr pbsmThis, PDNMS pdnmsThis,
1893 Int2 iChoice, Int2 iModelCount, Byte bExtent)
1894 {
1895 PMAD pmadThis = NULL;
1896 PVNMO pvnmoThis = NULL;
1897 PVNMD pvnmdThis = NULL;
1898 PVNAL pvnalThis = NULL;
1899 PVNAL pvnalTemp = NULL;
1900 PALD paldThis = NULL;
1901 PALD paldTemp = NULL;
1902 PMOD pmodThis = NULL;
1903 PMDD pmddThis = NULL;
1904 PMLD pmldThis = NULL;
1905 PMLD pmldFirst = NULL;
1906 PDNML pdnmlModel = NULL;
1907 PMSD pmsdThis = NULL;
1908
1909
1910
1911 IsotropicTemperatureFactorsPtr pitfThis = NULL;
1912 AnisotropicTemperatureFactorsPtr patfThis = NULL;
1913 AlternateConformationIdsPtr paciThis = NULL;
1914 AtomicOccupanciesPtr pocThis = NULL;
1915 ModelSpacePointsPtr pmspThis = NULL;
1916
1917 AtomicCoordinatesPtr pacThis = NULL;
1918 AtomPntrsPtr pappThis = NULL;
1919 CoordinatesPtr pcoThis = NULL;
1920 ModelCoordinateSetPtr pmcsThis = NULL;
1921 SurfaceCoordinatesPtr pscThis = NULL;
1922 DensityCoordinatesPtr pdcThis = NULL;
1923
1924 CharPtr pcThis = NULL;
1925 CharPtr pcTemp = NULL;
1926 ValNodePtr pvnX = NULL;
1927 ValNodePtr pvnY = NULL;
1928 ValNodePtr pvnZ = NULL;
1929 ValNodePtr pvnB11 = NULL;
1930 ValNodePtr pvnB12 = NULL;
1931 ValNodePtr pvnB13 = NULL;
1932 ValNodePtr pvnB22 = NULL;
1933 ValNodePtr pvnB23 = NULL;
1934 ValNodePtr pvnB33 = NULL;
1935 ValNodePtr pvnOcc = NULL;
1936 ValNodePtr pvnAlt = NULL;
1937 ValNodePtr pvnMid = NULL;
1938 ValNodePtr pvnRid = NULL;
1939 ValNodePtr pvnAid = NULL;
1940 ValNodePtr pmdrThis = NULL;
1941 Int4 iCountAtoms = 0;
1942 Int4 iCounter = 0;
1943 Int4 iVectLen = 0;
1944 Int4 iCoordScale = 0;
1945 Int4 iCoordSets = 0;
1946 Int4 iOccScale = 0;
1947 Int4 iTempScale = 0;
1948 CharPtr pcTest = NULL;
1949 Byte bAnisotropy = FALSE;
1950 Byte bAltConf = FALSE;
1951 Boolean bFirstCoordSet = TRUE;
1952
1953 #ifdef _DEBUG_1
1954 printf("Making Model #%d %d \n",iModelCount, (Int2)bExtent);
1955 #endif
1956 pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
1957 pmldFirst = NewMLD();
1958 if (!pmldFirst) goto allocerr;
1959 pmldFirst->iType = pbsmThis->type;
1960 pmldFirst->iId = pbsmThis->id;
1961 pmldFirst->bSelected = (Byte) 0x01; /* for saving/conversion */
1962 pmldFirst->pbsmModel = pbsmThis; /* point to the entire model */
1963 pmldFirst->pmsdParent = (PMSD) pdnmsThis->data.ptrvalue;
1964 pmdrThis = ValNodeFindNext(pbsmThis->descr, NULL, ModelDescr_name);
1965 if (pmdrThis)
1966 {
1967 pmldFirst->pcModelName = StringSave((CharPtr) pmdrThis->data.ptrvalue);
1968 }
1969
1970 pmcsThis = pbsmThis->model_coordinates;
1971 while (pmcsThis) /* walk the model-coordinate sets - flattened and instantiated */
1972 {
1973 bAnisotropy = FALSE;
1974 bAltConf = FALSE;
1975 iCoordSets++;
1976 #ifdef _DEBUG_1
1977 printf("Model coord set %d\n ", iCoordSets);
1978 #endif
1979 if (!bFirstCoordSet)
1980 {
1981 pmldThis->next = NewMLD();
1982 if (!pmldThis->next) goto allocerr;
1983 pmldThis = pmldThis->next;
1984 pmldThis->iType = pbsmThis->type;
1985 pmldThis->iId = pbsmThis->id;
1986 pmldThis->pbsmModel = pbsmThis; /* point to the entire model */
1987 pmldThis->iNoCoordSet = pmcsThis->id;
1988 pmldThis->pmsdParent = (PMSD) pdnmsThis->data.ptrvalue;
1989
1990 }
1991 else
1992 {
1993 pmldThis = pmldFirst;
1994 pmldThis->iNoCoordSet = pmcsThis->id;
1995 }
1996 #ifdef _DEBUG_1
1997 printf("Model Type %d\n ", pmldThis->iType);
1998 #endif
1999 bFirstCoordSet = FALSE;
2000 /* NOT BY REFERENCE YET */
2001 if (pmcsThis->Coordinates_coordinates->choice == Coordinates_coordinates_reference) goto skipnext;
2002 /* rest are literals */
2003
2004 pcoThis = (CoordinatesPtr) pmcsThis->Coordinates_coordinates->data.ptrvalue;
2005
2006 /* read in Surface coordinate sets MOD */
2007 if (pcoThis->choice == Coordinates_surface)
2008 {
2009 #ifdef _DEBUG_3
2010 printf("surface\n");
2011 #endif
2012 pmsdThis->iObjCount += 1;
2013 pvnmoThis = NewVNMO(NULL, iModelCount);
2014 if (!pvnmoThis) goto allocerr;
2015 pmodThis = (PMOD) pvnmoThis->data.ptrvalue;
2016 pmodThis->pfbParent = (PFB) pmsdThis;
2017 pscThis = (SurfaceCoordinatesPtr) pcoThis->data.ptrvalue;
2018 if (!(FillSurface(pscThis, pmodThis))) goto allocerr;
2019 if (!(AssignSurfaceContents(pdnmsThis, iModelCount, (PFB) pmodThis, pscThis->contents))) goto allocerr;
2020 if (pmsdThis->pvnmoHead == NULL)
2021 {
2022 pmsdThis->pvnmoHead = pvnmoThis;
2023 }
2024 else
2025 ValNodeListCat(pmsdThis->pvnmoHead, pvnmoThis);
2026 pmodThis->pmldCoordSet = pmldThis;
2027 pmldThis->pmodObject = pmodThis;
2028 goto skipnext;
2029 }
2030
2031
2032 /* read in DENSITY coordinate sets MDD */
2033
2034 if (pcoThis->choice == Coordinates_density)
2035 {
2036 #ifdef _DEBUG_3
2037 printf("density\n");
2038 #endif
2039 pmsdThis->iDensCount += 1;
2040 pvnmdThis = NewVNMD(NULL, iModelCount);
2041 if (!pvnmdThis) goto allocerr;
2042 pmddThis = (PMDD) pvnmdThis->data.ptrvalue;
2043 pdcThis = (DensityCoordinatesPtr) pcoThis->data.ptrvalue;
2044 /* @@@@@@@@@@@@@@@@@@@@@@@convert the density object */
2045 if (!(AssignSurfaceContents(pdnmsThis, iModelCount, (PFB) pmddThis, pdcThis->contents))) goto allocerr;
2046 if (pmsdThis->pvnmdHead == NULL)
2047 {
2048 pmsdThis->pvnmdHead = pvnmdThis;
2049 }
2050 else
2051 ValNodeListCat(pmsdThis->pvnmdHead, pvnmdThis);
2052 pmddThis->pmldCoordSet = pmldThis;
2053 pmldThis->pmddDensity = pmddThis;
2054
2055 goto skipnext;
2056 }
2057
2058
2059 /* NOTE that coordinates by REFERENCE are not yet supported */
2060
2061 pacThis = NULL;
2062 pappThis = NULL;
2063 pmspThis = NULL;
2064 pocThis = NULL;
2065 paciThis = NULL;
2066 if ((pcoThis->choice == Coordinates_atomic) && (bExtent & (Byte) COORDS_DATA))
2067 {
2068 pacThis = (AtomicCoordinatesPtr) pcoThis->data.ptrvalue;
2069 pappThis = pacThis->atoms; /* AtomPntrsPtr */
2070 pmspThis = pacThis->sites; /* ModelSpacePointsPtr */
2071 pocThis = pacThis->occupancies; /* MolOccPtr */
2072 paciThis = pacThis->alternate_conf_ids; /* AlternateConformationIdsPtr */
2073 if ((pacThis->temperature_factors) && (bExtent & (Byte) TEMP_DATA))
2074 {
2075 #ifdef _DEBUG_2
2076 printf("Isotropic Temperature factors \n");
2077 #endif
2078 if (pacThis->temperature_factors->choice == AtomicTemperatureFactors_isotropic)
2079 {
2080 pitfThis = (IsotropicTemperatureFactorsPtr) pacThis->temperature_factors->data.ptrvalue;
2081 if (pitfThis) iTempScale = pitfThis->scale_factor;
2082 pvnB11 = pitfThis->b;
2083 }
2084 if (pacThis->temperature_factors->choice == AtomicTemperatureFactors_anisotropic)
2085 {
2086 patfThis = (AnisotropicTemperatureFactorsPtr) pacThis->temperature_factors->data.ptrvalue;
2087 bAnisotropy = TRUE;
2088 if (patfThis)
2089 {
2090 #ifdef _DEBUG_2
2091 printf("Anisotropic Temperature factors \n");
2092 #endif
2093 iTempScale = patfThis->scale_factor;
2094 pvnB11 = patfThis->b_11;
2095 pvnB12 = patfThis->b_12;
2096 pvnB13 = patfThis->b_13;
2097 pvnB22 = patfThis->b_22;
2098 pvnB23 = patfThis->b_23;
2099 pvnB33 = patfThis->b_33;
2100 }
2101 }
2102 }
2103 /* else deal with anisotropic ones */
2104 } /* if pcoThis */
2105 else
2106 {
2107 goto skipnext;
2108 }
2109
2110
2111 if (pmspThis)
2112 {
2113 pvnX = pmspThis->x;
2114 pvnY = pmspThis->y;
2115 pvnZ = pmspThis->z;
2116 iCoordScale = pmspThis->scale_factor;
2117 #ifdef _DEBUG_2
2118 printf("Coordinates / = %d\n", iCoordScale);
2119 #endif
2120 } else goto erret;
2121 if (pappThis)
2122 {
2123 pvnMid = pappThis->molecule_ids;
2124 pvnRid = pappThis->residue_ids;
2125 pvnAid = pappThis->atom_ids;
2126 iCountAtoms = pappThis->number_of_ptrs;
2127
2128
2129 #ifdef _DEBUG_2
2130 printf("%d ATOMS In Model\n", iCountAtoms);
2131 #endif
2132 } else goto erret;
2133 if ((pocThis) && (bExtent & (Byte) OCC_DATA))
2134 {
2135 pvnOcc = pocThis->o;
2136 iOccScale = pocThis->scale_factor;
2137 #ifdef _DEBUG_2
2138 printf("Occupancies / %d\n", iOccScale);
2139 #endif
2140 }
2141 if ((paciThis) && (bExtent & (Byte) ALTCNF_DATA))
2142 {
2143 pvnAlt = paciThis;
2144 bAltConf = TRUE;
2145 #ifdef _DEBUG_3
2146 printf("Alt conformations found \n");
2147 #endif
2148 }
2149 if (iCoordScale) iVectLen = 2; /* 3 elements 0=X,1=Y,2=Z */
2150 if (iOccScale) iVectLen = 3;
2151 if (iTempScale) iVectLen = 4;
2152 if ((iTempScale) && bAnisotropy) iVectLen = 9;
2153 #ifdef _DEBUG_2
2154 printf("iVectLen = %d\n", iVectLen);
2155 #endif
2156 if ((iCoordScale) && (pappThis && pmspThis)) /* minimum to do the atomic locations */
2157 {
2158 /* do all data collect in one walk-through the vectors to preserve atom loc data */
2159 /* the vector pmdlThis->ppAsnOrder has PALD pointers in it, which begin at */
2160 /* ppAsnOrder[1] and end at ppAsnOrder[iCountAtoms], so ASN.1 indexing is not */
2161 /* shifted by (-1) to match C indexing */
2162 /* ppAsnOrder[iCountAtoms+1] is set to NULL as an end-of matrix indicator */
2163 pmldThis->ppAsnOrder = PTRVector(0, iCountAtoms + 1);
2164 if (pmldThis->ppAsnOrder) /* this should not be fatal - only affects features */
2165 pmldThis->ppAsnOrder[iCountAtoms+1] = NULL;
2166 while (iCounter < iCountAtoms)
2167 {
2168 iCounter++;
2169 ProgMon("Instantiating Atom Locations");
2170 #ifdef _DEBUG_3
2171 printf("[%d] ",iCounter);
2172 #endif
2173 pmadThis = AtomFromMMDBIndex(pdnmsThis, iChoice, (Int2) pvnMid->data.intvalue,
2174 (Int2) pvnRid->data.intvalue, (Int4) pvnAid->data.intvalue);
2175 if (!pmadThis) goto erret;
2176 pvnalThis = NewVNAL(NULL, iModelCount);
2177 if (!pvnalThis) goto allocerr;
2178 paldThis = (PALD) pvnalThis->data.ptrvalue;
2179 paldThis->pfbParent = (PFB) pmadThis; /* back-link to pmad */
2180 paldThis->pflvData = FLVector(0,(Int4) iVectLen); /* alloc the data vector */
2181 if (!paldThis->pflvData) goto allocerr;
2182 paldThis->iCoordSet = (Int1) pmcsThis->id;
2183 paldThis->iFloatNo = (Int1) iVectLen;
2184 if (pmldThis->ppAsnOrder) pmldThis->ppAsnOrder[iCounter] = (Pointer) paldThis; /* add to order array */
2185 if (pmadThis->pvnalLocate)
2186 { /* the case where models are already present */
2187 #ifdef _DEBUG_3
2188 printf("{%d}", iModelCount);
2189 #endif
2190 pvnalTemp = (PVNAL) ValNodeFindNext(pmadThis->pvnalLocate,NULL,iModelCount);
2191 if (pvnalTemp)
2192 { /* the case where THIS model has a location already */
2193 #ifdef _DEBUG_3
2194 printf("DISORDER!!\n");
2195 #endif
2196 paldTemp = (PALD) pvnalTemp->data.ptrvalue;
2197 while (paldTemp->next)
2198 { /* find end of pald list */
2199 paldTemp = paldTemp->next;
2200 }
2201 paldTemp->next = (PALD)pvnalThis->data.ptrvalue; /* attach the new location */
2202 pvnalThis->data.ptrvalue = NULL;
2203 pvnalThis = ValNodeFree(pvnalThis); /* lose the ValNode baggage */
2204 }
2205 else
2206 ValNodeListCat(pmadThis->pvnalLocate, pvnalThis); /* attach to pmadThis */
2207 }
2208 else
2209 pmadThis->pvnalLocate = pvnalThis;
2210
2211 paldThis->pflvData[0] = (FloatLo)((FloatLo)pvnX->data.intvalue/iCoordScale);
2212 paldThis->pflvData[1] = (FloatLo)((FloatLo)pvnY->data.intvalue/iCoordScale);
2213 paldThis->pflvData[2] = (FloatLo)((FloatLo)pvnZ->data.intvalue/iCoordScale);
2214 #ifdef _DEBUG_3
2215 printf("%s X= %f, Y= %f, Z= %f ", pmadThis->pcAName, paldThis->pflvData[0],
2216 paldThis->pflvData[1], paldThis->pflvData[2]);
2217 #endif
2218
2219 if (iOccScale)
2220 {
2221 paldThis->pflvData[3] = (FloatLo)((FloatLo)pvnOcc->data.intvalue/iOccScale) ;
2222 pvnOcc = pvnOcc->next;
2223 #ifdef _DEBUG_3
2224 printf(" Occ = %f ", paldThis->pflvData[3]);
2225 #endif
2226
2227 }
2228 else if(iVectLen >=3 ) paldThis->pflvData[3] = 1.0;
2229 if (bAltConf)
2230 {
2231 pcThis = (CharPtr) pvnAlt->data.ptrvalue;
2232 if (pcThis)
2233 {
2234 paldThis->cAltConf = (Char) pcThis[0];
2235 if (!pmldThis->pcAltConf)
2236 {
2237 pmldThis->pcAltConf = StringSave(pcThis);
2238 }
2239 else
2240 { /* no alt conf string yet */
2241 pcTest = NULL;
2242 pcTest = StringChr(pmldThis->pcAltConf,(Char) pcThis[0]);
2243 if (!(pcTest))
2244 { /* char not yet in pmldThis->pcAltConf */
2245 #ifdef _DEBUG_3
2246 printf("\nNEW STRING\n");
2247 #endif
2248 pcTemp = (CharPtr) MemNew((size_t)(StringLen(pmldThis->pcAltConf)+2)); /* more room */
2249 StringCpy(pcTemp, pmldThis->pcAltConf); /* copy old string */
2250 StringCat(pcTemp, pcThis); /* new letter added */
2251 MemFree(pmldThis->pcAltConf); /* lose old string */
2252 pmldThis->pcAltConf = pcTemp; /* new string */
2253 }
2254 }
2255 }
2256 #ifdef _DEBUG_3
2257 printf(" <%s>pmldThis \n",pmldThis->pcAltConf);
2258 printf("%s-\n",pcThis);
2259 printf(" <%c>paldThis \n",(char) paldThis->cAltConf );
2260 #endif
2261 pvnAlt = pvnAlt->next;
2262 }
2263 if (iTempScale)
2264 {
2265 if (bAnisotropy)
2266 {
2267 #ifdef _DEBUG_3
2268 printf("%d %d %d %d %d %d", pvnB11->data.intvalue, pvnB12->data.intvalue,
2269 pvnB13->data.intvalue, pvnB22->data.intvalue,
2270 pvnB23->data.intvalue, pvnB33->data.intvalue);
2271 #endif
2272 paldThis->pflvData[5] = (FloatLo)((FloatLo)pvnB12->data.intvalue/iTempScale);
2273 paldThis->pflvData[6] = (FloatLo)((FloatLo)pvnB13->data.intvalue/iTempScale);
2274 paldThis->pflvData[7] = (FloatLo)((FloatLo)pvnB22->data.intvalue/iTempScale);
2275 paldThis->pflvData[8] = (FloatLo)((FloatLo)pvnB23->data.intvalue/iTempScale);
2276 paldThis->pflvData[9] = (FloatLo)((FloatLo)pvnB33->data.intvalue/iTempScale);
2277 #ifdef _DEBUG_3
2278 printf("B12=%f, B13=%f, B22=%f, B23=%f, B33=%f ",
2279 paldThis->pflvData[5], paldThis->pflvData[6], paldThis->pflvData[7],
2280 paldThis->pflvData[8], paldThis->pflvData[9] );
2281 #endif
2282 pvnB12 = pvnB12->next;
2283 pvnB13 = pvnB13->next;
2284 pvnB22 = pvnB22->next;
2285 pvnB23 = pvnB23->next;
2286 pvnB33 = pvnB33->next;
2287 }
2288 paldThis->pflvData[4] = (FloatLo)((FloatLo)pvnB11->data.intvalue/iTempScale);
2289 #ifdef _DEBUG_3
2290 printf("B11=%f ", paldThis->pflvData[4]);
2291 #endif
2292 pvnB11 = pvnB11->next;
2293 } /* if iTempScale */
2294 #ifdef _DEBUG_3
2295 printf("\n");
2296 #endif
2297 pvnX = pvnX->next;
2298 pvnY = pvnY->next;
2299 pvnZ = pvnZ->next;
2300 pvnMid = pvnMid->next;
2301 pvnRid = pvnRid->next;
2302 pvnAid = pvnAid->next;
2303 } /* while (iCounter < iCountAtoms) */
2304
2305 } /* if pmspThis && pappThis */
2306
2307 skipnext:
2308 #ifdef _DEBUG_3
2309 printf("skipnext");
2310 #endif
2311
2312 /* free the model data leaving the ASN.1 stub */
2313 if (pacThis) FreeAtomicModelAsnLists(pacThis);
2314
2315 pmcsThis = pmcsThis->next;
2316 } /* while pmcsThis - do next coordinate set*/
2317
2318 pdnmlModel = DValNodeAddPointer(&pmsdThis->pdnmlModels, iModelCount, (Nlm_VoidPtr) pmldFirst);
2319 if (!pdnmlModel) goto allocerr;
2320
2321 return 1;
2322
2323 allocerr:
2324 ErrClear();
2325 ErrPostEx(SEV_ERROR,0,0, "Out Of Memory While Loading Model\nTry loading smaller or fewer Models");
2326 ErrShow();
2327 FreeMLD(pmldFirst);
2328 return 0;
2329
2330 erret:
2331 ErrClear();
2332 ErrPostEx(SEV_ERROR,0,0, "Internal Indexing Failure in ASN.1\nCheck ASN.1 Input for integrity");
2333 ErrShow();
2334 FreeMLD(pmldFirst);
2335 return -1;
2336 }
2337
2338
2339
MakeChemGraphNodeList(PDNMS pdnmsThis,ChemGraphPntrsPtr pcgpThis)2340 ValNodePtr LIBCALL MakeChemGraphNodeList(PDNMS pdnmsThis, ChemGraphPntrsPtr pcgpThis)
2341 {
2342
2343 ValNodePtr pvnThis = NULL;
2344 ValNodePtr pvnLocList = NULL;
2345 PFB pfbThis = NULL;
2346 ResiduePntrsPtr prpsThis = NULL;
2347 ResidueExplicitPntrsPtr prepThis = NULL;
2348 ResidueIntervalPntrPtr pripThis = NULL;
2349 AtomPntrsPtr pAtoms = NULL;
2350 MoleculePntrsPtr pMolecules = NULL;
2351 ValNodePtr pvnAtom = NULL;
2352 ValNodePtr pvnMol = NULL;
2353 ValNodePtr pvnRes = NULL;
2354 Int4 iCountPtrs = 0;
2355 Int4 iStart = 0;
2356 Int4 iEnd = 0;
2357
2358 if (!pdnmsThis) return NULL;
2359 if (!pcgpThis) return NULL;
2360 if (pcgpThis && pdnmsThis)
2361 {
2362 switch (pcgpThis->choice)
2363 {
2364 case ChemGraphPntrs_atoms:
2365 pAtoms = (AtomPntrsPtr) pcgpThis->data.ptrvalue;
2366 if (!pAtoms) return NULL;
2367 pvnMol = pAtoms->molecule_ids;
2368 pvnRes = pAtoms->residue_ids;
2369 pvnAtom = pAtoms->atom_ids;
2370 if (pAtoms->number_of_ptrs == 0) return NULL;
2371 for (iCountPtrs = 0; iCountPtrs < pAtoms->number_of_ptrs; iCountPtrs++)
2372 {
2373 pfbThis = NULL;
2374 pfbThis = (PFB) AtomFromMMDBIndex(pdnmsThis, (Int2) pdnmsThis->choice,
2375 (Int2) pvnMol->data.intvalue,
2376 (Int2) pvnRes->data.intvalue,
2377 (Int4) pvnAtom->data.intvalue);
2378 if (pfbThis)
2379 {
2380 pvnThis = ValNodeAddPointer(&pvnLocList,
2381 0, (Nlm_VoidPtr) pfbThis);
2382 }
2383 pvnMol = pvnMol->next;
2384 pvnRes = pvnRes->next;
2385 pvnAtom = pvnAtom->next;
2386 }
2387 break;
2388
2389 case ChemGraphPntrs_residues:
2390 prpsThis = (ResiduePntrsPtr) pcgpThis->data.ptrvalue;
2391 if (!prpsThis) return NULL;
2392 if (prpsThis->choice == ResiduePntrs_explicit)
2393 {
2394 prepThis = (ResidueExplicitPntrsPtr) prpsThis->data.ptrvalue;
2395 pvnMol = prepThis->molecule_ids;
2396 pvnRes = prepThis->residue_ids;
2397 while (pvnRes)
2398 {
2399 pfbThis = NULL;
2400 pfbThis = (PFB) GraphFromMMDBIndex(pdnmsThis, (Int2) pdnmsThis->choice,
2401 (Int2) pvnMol->data.intvalue, (Int2) pvnRes->data.intvalue);
2402 if (pfbThis)
2403 {
2404 pvnThis = ValNodeAddPointer(&pvnLocList,
2405 0, (Nlm_VoidPtr) pfbThis);
2406 }
2407 else return NULL;
2408 pvnMol = pvnMol->next;
2409 pvnRes = pvnRes->next;
2410 }
2411 } /* explicit */
2412 if (prpsThis->choice == ResiduePntrs_interval)
2413 {
2414 pripThis = (ResidueIntervalPntrPtr) prpsThis->data.ptrvalue;
2415 while (pripThis)
2416 {
2417 iStart = pripThis->from;
2418 iEnd = pripThis->to;
2419 if (iStart > pripThis->to)
2420 {
2421 iStart = pripThis->to;
2422 iEnd = pripThis->from;
2423 }
2424 for (;iStart <= iEnd; iStart++)
2425 {
2426 pfbThis = NULL;
2427 pfbThis = (PFB) GraphFromMMDBIndex(pdnmsThis, (Int2) pdnmsThis->choice,
2428 (Int2) pripThis->molecule_id, (Int2) iStart);
2429 if (pfbThis)
2430 {
2431 pvnThis = ValNodeAddPointer(&pvnLocList,
2432 0, (Nlm_VoidPtr) pfbThis);
2433 }
2434 else return NULL;
2435 }
2436 pripThis = pripThis->next;
2437 } /* while pripThis */
2438 } /* interval */
2439 break;
2440
2441 case ChemGraphPntrs_molecules:
2442 pMolecules = (MoleculePntrsPtr) pcgpThis->data.ptrvalue;
2443 if (!pMolecules) return NULL;
2444 pvnMol = pMolecules->molecule_ids;
2445 if (pMolecules->number_of_ptrs == 0) return NULL;
2446 for (iCountPtrs = 0; iCountPtrs < pMolecules->number_of_ptrs; iCountPtrs++)
2447 {
2448 pfbThis = NULL;
2449 pfbThis = (PFB) MolFromMMDBIndex(pdnmsThis, (Int2) pdnmsThis->choice,
2450 (Int2) pvnMol->data.intvalue);
2451 if (pfbThis)
2452 {
2453 pvnThis = ValNodeAddPointer(&pvnLocList,
2454 0, (Nlm_VoidPtr) pfbThis);
2455 }
2456 pvnMol = pvnMol->next;
2457 }
2458 break;
2459
2460 default: return NULL;
2461 }
2462
2463 } /* if pcgpThis && pmsdThis*/
2464
2465 return pvnLocList;
2466
2467 }
2468
2469
2470
2471 Int2 SortOn=0;
2472
NewDNTRN(PDNTRN PNTR ppdntrnList,Int2 choice)2473 PDNTRN LIBCALL NewDNTRN(PDNTRN PNTR ppdntrnList, Int2 choice)
2474 {
2475 PDNTRN pdntrnNew = NULL;
2476 FloatLoPtr pflvNew = NULL;
2477 FloatLoPtrPtr ppflmNew = NULL;
2478
2479 if (!choice) return NULL;
2480 if ((int) choice == Move_translate)
2481 {
2482 pflvNew = FLVector(0, 2);
2483 if (!pflvNew) return NULL;
2484 pdntrnNew = DValNodeAddPointer(ppdntrnList, choice, (Nlm_VoidPtr) pflvNew);
2485 }
2486 if ((int) choice == Move_rotate)
2487 {
2488 ppflmNew = FLMatrix(0, 2, 0, 2);
2489 if (!ppflmNew) return NULL;
2490 pdntrnNew = DValNodeAddPointer(ppdntrnList, choice, (Nlm_VoidPtr) ppflmNew);
2491 }
2492 return pdntrnNew;
2493 }
2494
2495
FreeDNTRN(PDNTRN pdntrnList)2496 void LIBCALL FreeDNTRN(PDNTRN pdntrnList)
2497 {
2498 PDNTRN pdntrnThis;
2499 PDNTRN pdntrnNext;
2500 FloatLoPtr pflv = NULL;
2501 FloatLoPtrPtr ppflm = NULL;
2502
2503 pdntrnThis = pdntrnList;
2504 while(pdntrnThis)
2505 {
2506 pdntrnNext = pdntrnThis->next;
2507 switch(pdntrnThis->choice)
2508 {
2509 case Move_rotate:
2510 ppflm = (FloatLoPtrPtr) pdntrnThis->data.ptrvalue;
2511 FLMatrixFree(ppflm, 0, 0);
2512 break;
2513 case Move_translate:
2514 pflv = (FloatLoPtr) pdntrnThis->data.ptrvalue;
2515 FLVectorFree(pflv, 0);
2516 break;
2517 }
2518 pdntrnThis->next = NULL;
2519 DValNodeFree(pdntrnThis);
2520 pdntrnThis = pdntrnNext;
2521 }
2522 }
2523
TransformToDNTRN(PDNTRN PNTR pplist,TransformPtr transform)2524 void LIBCALL TransformToDNTRN(PDNTRN PNTR pplist, TransformPtr transform)
2525 {
2526 PDNTRN pdntrnThis = NULL;
2527 PDNTRN pdntrnFirst = NULL;
2528 MovePtr pm = NULL;
2529 RotMatrixPtr prm = NULL;
2530 TransMatrixPtr ptm = NULL;
2531 FloatLoPtr pflv = NULL;
2532 FloatLoPtrPtr ppflm = NULL;
2533
2534 if (!transform) return;
2535
2536 pm = transform->moves;
2537 while (pm)
2538 {
2539 pdntrnThis = NewDNTRN(pplist, (Int2) pm->choice);
2540 if (!pdntrnThis) return ;
2541 if (!pdntrnFirst) pdntrnFirst = pdntrnThis;
2542 if ((int) pm->choice == Move_rotate)
2543 { /* copy * scale from RotMatrix */
2544 ppflm = (FloatLoPtrPtr) pdntrnThis->data.ptrvalue;
2545 prm = (RotMatrixPtr) pm->data.ptrvalue;
2546 ppflm[0][0] = (FloatLo) ((FloatLo)prm->rot_11 / prm->scale_factor);
2547 ppflm[0][1] = (FloatLo) ((FloatLo)prm->rot_12 / prm->scale_factor);
2548 ppflm[0][2] = (FloatLo) ((FloatLo)prm->rot_13 / prm->scale_factor);
2549 ppflm[1][0] = (FloatLo) ((FloatLo)prm->rot_21 / prm->scale_factor);
2550 ppflm[1][1] = (FloatLo) ((FloatLo)prm->rot_22 / prm->scale_factor);
2551 ppflm[1][2] = (FloatLo) ((FloatLo)prm->rot_23 / prm->scale_factor);
2552 ppflm[2][0] = (FloatLo) ((FloatLo)prm->rot_31 / prm->scale_factor);
2553 ppflm[2][1] = (FloatLo) ((FloatLo)prm->rot_32 / prm->scale_factor);
2554 ppflm[2][2] = (FloatLo) ((FloatLo)prm->rot_33 / prm->scale_factor);
2555 }
2556 if ((int) pm->choice == Move_translate)
2557 {
2558 pflv = (FloatLoPtr) pdntrnThis->data.ptrvalue;
2559 ptm = (TransMatrixPtr) pm->data.ptrvalue;
2560 pflv[0] = (FloatLo) ((FloatLo)ptm->tran_1 / ptm->scale_factor);
2561 pflv[1] = (FloatLo) ((FloatLo)ptm->tran_2 / ptm->scale_factor);
2562 pflv[2] = (FloatLo) ((FloatLo)ptm->tran_3 / ptm->scale_factor);
2563 }
2564 pm = pm->next;
2565 }
2566 }
2567
DoApplyTransform(PFB pfbThis,Int4 iModel,Int4 iIndex,Pointer ptr)2568 void LIBCALLBACK DoApplyTransform(PFB pfbThis, Int4 iModel, Int4 iIndex, Pointer ptr)
2569 {
2570 PMAD pmadAtom = NULL;
2571 PMOD pmodThis = NULL;
2572 PALD paldLoc = NULL;
2573 PMSD pmsdThis = NULL;
2574 PDNTRN pdntrnThis = NULL;
2575 FloatLoPtr pflv = NULL;
2576 FloatLoPtr pflvData = NULL;
2577 FloatLoPtrPtr ppflmData = NULL;
2578 FloatLoPtrPtr ppflm = NULL;
2579 FloatLo flX, flY, flZ;
2580 Int2 i, j;
2581
2582 if (!ptr) return;
2583
2584 if (IsAtomNode(pfbThis))
2585 {
2586 pmadAtom = (PMAD) pfbThis;
2587 paldLoc = GetAtomLocs(pmadAtom, iModel);
2588 pmsdThis = (PMSD) ptr;
2589 /* go through each location for this particular atom and model */
2590 while (paldLoc)
2591 {
2592 pdntrnThis = (PDNTRN) ptr; /* reset to head of transformations */
2593 pflvData = paldLoc->pflvData;
2594 while (pdntrnThis)
2595 {
2596 if (pdntrnThis->choice == Move_translate)
2597 {
2598 pflv = (FloatLoPtr) pdntrnThis->data.ptrvalue;
2599 pflvData[0] = pflvData[0] + pflv[0];
2600 pflvData[1] = pflvData[1] + pflv[1];
2601 pflvData[2] = pflvData[2] + pflv[2];
2602 }
2603 if (pdntrnThis->choice == Move_rotate)
2604 {
2605 ppflm = (FloatLoPtrPtr) pdntrnThis->data.ptrvalue;
2606 flX =(pflvData[0] * ppflm[0][0] +
2607 pflvData[1] * ppflm[1][0] +
2608 pflvData[2] * ppflm[2][0]);
2609 flY =(pflvData[0] * ppflm[0][1] +
2610 pflvData[1] * ppflm[1][1] +
2611 pflvData[2] * ppflm[2][1]);
2612 flZ = (pflvData[0] * ppflm[0][2] +
2613 pflvData[1]* ppflm[1][2] +
2614 pflvData[2] * ppflm[2][2]);
2615 pflvData[0] = flX;
2616 pflvData[1] = flY;
2617 pflvData[2] = flZ;
2618 }
2619 pdntrnThis = pdntrnThis->next; /* get next transform */
2620 }
2621 paldLoc = paldLoc->next; /* get next location */
2622 } /* while paldLoc */
2623 } /* if IsAtomNode */
2624
2625 if (IsObjectNode(pfbThis))
2626 {
2627 /* deal with the objects too */
2628 pmodThis = (PMOD) pfbThis;
2629 pdntrnThis = (PDNTRN) ptr; /* reset to head of transformations */
2630 ppflmData = pmodThis->ppflObject;
2631 while (pdntrnThis)
2632 {
2633 switch (pmodThis->bWhat)
2634 {
2635
2636 case OBJ_CYLINDER:
2637 i = 2;
2638 break;
2639 case OBJ_BRICK:
2640 i = 8;
2641 break;
2642 default: i=0;
2643 }
2644
2645 if (pdntrnThis->choice == Move_translate)
2646 {
2647 pflv = (FloatLoPtr) pdntrnThis->data.ptrvalue;
2648 for (j = 0; j<i; j++)
2649 {
2650 pflvData = ppflmData[j];
2651 pflvData[0] = pflvData[0] + pflv[0];
2652 pflvData[1] = pflvData[1] + pflv[1];
2653 pflvData[2] = pflvData[2] + pflv[2];
2654 }
2655 }
2656 if (pdntrnThis->choice == Move_rotate)
2657 {
2658 ppflm = (FloatLoPtrPtr) pdntrnThis->data.ptrvalue;
2659 for (j = 0; j<i; j++)
2660 {
2661 flX =(ppflmData[j][0] * ppflm[0][0] +
2662 ppflmData[j][1] * ppflm[1][0] +
2663 ppflmData[j][2] * ppflm[2][0]);
2664 flY =(ppflmData[j][0] * ppflm[0][1] +
2665 ppflmData[j][1] * ppflm[1][1] +
2666 ppflmData[j][2] * ppflm[2][1]);
2667 flZ = (ppflmData[j][0] * ppflm[0][2] +
2668 ppflmData[j][1]* ppflm[1][2] +
2669 ppflmData[j][2] * ppflm[2][2]);
2670 ppflmData[j][0] = flX;
2671 ppflmData[j][1] = flY;
2672 ppflmData[j][2] = flZ;
2673
2674 }
2675 }
2676 pdntrnThis = pdntrnThis->next; /* get next transform */
2677 } /* while pdntrnThis */
2678 } /* if IsObjectNode */
2679 }
2680
2681
TransformMultiply(FloatLoPtr pflvData,FloatLoPtrPtr ppflm)2682 static void TransformMultiply(FloatLoPtr pflvData, FloatLoPtrPtr ppflm)
2683 {
2684 Nlm_Matrix Matrix, Vector, Result, Invert;
2685 Nlm_Uint4 m, n; /* matrix indices */
2686
2687 Matrix = Nlm_MatrixNew(3, 3);
2688 if (!Matrix) return;
2689 Vector = Nlm_MatrixNew(1, 3);
2690 if (!Vector) return;
2691
2692 for(m = 0; m < 3; m++) {
2693 for(n = 0; n < 3; n++) {
2694 Nlm_MatrixSetNode(Matrix, m, n, (Nlm_FloatHi) ppflm[m][n]);
2695 }
2696 }
2697 for(m = 0; m < 3; m++) Nlm_MatrixSetNode(Vector, 0, m, (Nlm_FloatHi) pflvData[m]);
2698 Invert = Nlm_MatrixInvert(Matrix);
2699 Result = Nlm_MatrixMultiply(Vector, Invert);
2700 for(m = 0; m < 3; m++) pflvData[m] = (Nlm_FloatLo) Nlm_MatrixNode(Result, 0, m);
2701 Nlm_MatrixDelete(Matrix);
2702 Nlm_MatrixDelete(Vector);
2703 Nlm_MatrixDelete(Result);
2704 Nlm_MatrixDelete(Invert);
2705 }
2706
2707
DoReverseTransform(PFB pfbThis,Int4 iModel,Int4 iIndex,Pointer ptr)2708 void LIBCALLBACK DoReverseTransform(PFB pfbThis, Int4 iModel, Int4 iIndex, Pointer ptr)
2709 {
2710 PMAD pmadAtom = NULL;
2711 PMOD pmodThis = NULL;
2712 PALD paldLoc = NULL;
2713 PMSD pmsdThis = NULL;
2714 PDNTRN pdntrnThis = NULL;
2715 FloatLoPtr pflv = NULL;
2716 FloatLoPtr pflvData = NULL;
2717 FloatLoPtrPtr ppflmData = NULL;
2718 FloatLoPtrPtr ppflm = NULL;
2719 /* FloatLo flX, flY, flZ; */
2720 Int2 i, j;
2721
2722 if (IsAtomNode(pfbThis))
2723 {
2724 pmadAtom = (PMAD) pfbThis;
2725 paldLoc = GetAtomLocs(pmadAtom, iModel);
2726 pmsdThis = (PMSD) ptr;
2727 /* go through each location for this particular atom and model */
2728 while (paldLoc)
2729 {
2730 pdntrnThis = (PDNTRN) ptr; /* reset to head of transformations */
2731 /* then go to the end */
2732 while (pdntrnThis->next) pdntrnThis = pdntrnThis->next;
2733 pflvData = paldLoc->pflvData;
2734 while (pdntrnThis)
2735 {
2736 if (pdntrnThis->choice == Move_translate)
2737 {
2738 pflv = (FloatLoPtr) pdntrnThis->data.ptrvalue;
2739 pflvData[0] = pflvData[0] - pflv[0];
2740 pflvData[1] = pflvData[1] - pflv[1];
2741 pflvData[2] = pflvData[2] - pflv[2];
2742 }
2743 if (pdntrnThis->choice == Move_rotate)
2744 {
2745 ppflm = (FloatLoPtrPtr) pdntrnThis->data.ptrvalue;
2746 TransformMultiply(pflvData, ppflm);
2747 /*
2748 flX =(pflvData[0] * ppflm[0][0] +
2749 pflvData[1] * ppflm[1][0] +
2750 pflvData[2] * ppflm[2][0]);
2751 flY =(pflvData[0] * ppflm[0][1] +
2752 pflvData[1] * ppflm[1][1] +
2753 pflvData[2] * ppflm[2][1]);
2754 flZ = (pflvData[0] * ppflm[0][2] +
2755 pflvData[1]* ppflm[1][2] +
2756 pflvData[2] * ppflm[2][2]);
2757 pflvData[0] = flX;
2758 pflvData[1] = flY;
2759 pflvData[2] = flZ;
2760 */
2761 }
2762 pdntrnThis = pdntrnThis->last; /* get previous transform */
2763 }
2764 paldLoc = paldLoc->next; /* get next location */
2765 } /* while paldLoc */
2766 } /* if IsAtomNode */
2767
2768 if (IsObjectNode(pfbThis))
2769 {
2770 /* deal with the objects too */
2771 pmodThis = (PMOD) pfbThis;
2772 pdntrnThis = (PDNTRN) ptr; /* reset to head of transformations */
2773 /* then go to the end */
2774 while (pdntrnThis->next) pdntrnThis = pdntrnThis->next;
2775 ppflmData = pmodThis->ppflObject;
2776 while (pdntrnThis)
2777 {
2778 switch (pmodThis->bWhat)
2779 {
2780
2781 case OBJ_CYLINDER:
2782 i = 2;
2783 break;
2784 case OBJ_BRICK:
2785 i = 8;
2786 break;
2787 default: i=0;
2788 }
2789
2790 if (pdntrnThis->choice == Move_translate)
2791 {
2792 pflv = (FloatLoPtr) pdntrnThis->data.ptrvalue;
2793 for (j = 0; j<i; j++)
2794 {
2795 pflvData = ppflmData[j];
2796 pflvData[0] = pflvData[0] - pflv[0];
2797 pflvData[1] = pflvData[1] - pflv[1];
2798 pflvData[2] = pflvData[2] - pflv[2];
2799 }
2800 }
2801 if (pdntrnThis->choice == Move_rotate)
2802 {
2803 ppflm = (FloatLoPtrPtr) pdntrnThis->data.ptrvalue;
2804 for (j = 0; j<i; j++)
2805 {
2806 TransformMultiply(ppflmData[j], ppflm);
2807 /*
2808 flX =(ppflmData[j][0] * ppflm[0][0] +
2809 ppflmData[j][1] * ppflm[1][0] +
2810 ppflmData[j][2] * ppflm[2][0]);
2811 flY =(ppflmData[j][0] * ppflm[0][1] +
2812 ppflmData[j][1] * ppflm[1][1] +
2813 ppflmData[j][2] * ppflm[2][1]);
2814 flZ = (ppflmData[j][0] * ppflm[0][2] +
2815 ppflmData[j][1]* ppflm[1][2] +
2816 ppflmData[j][2] * ppflm[2][2]);
2817 ppflmData[j][0] = flX;
2818 ppflmData[j][1] = flY;
2819 ppflmData[j][2] = flZ;
2820 */
2821
2822 }
2823 }
2824 pdntrnThis = pdntrnThis->last; /* get next transform */
2825 } /* while pdntrnThis */
2826 } /* if IsObjectNode */
2827 }
2828
2829
2830
FindLoadedBiostruc(CharPtr pcPDBID,Int4 iId)2831 PDNMS LIBCALL FindLoadedBiostruc(CharPtr pcPDBID, Int4 iId)
2832 {
2833 /* replace this with caching mechanism */
2834 PDNMS pdnmsThis = NULL;
2835 PMSD pmsdThis = NULL;
2836
2837 if ((pcPDBID == NULL) && (iId == 0)) return NULL;
2838
2839 pdnmsThis = GetFirstModelstruc( );
2840 while (pdnmsThis)
2841 {
2842 pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
2843 if (pmsdThis->iMMDBid == iId) return pdnmsThis;
2844 if (!(StringCmp(pcPDBID,pmsdThis->pcPDBName))) return pdnmsThis;
2845 pdnmsThis = pdnmsThis->next;
2846 }
2847 return NULL;
2848 }
2849
InstBSAnnotSet(BiostrucAnnotSetPtr pbsasThis,CharPtr JobID,Boolean Chain,CharPtr Path)2850 Boolean InstBSAnnotSet(BiostrucAnnotSetPtr pbsasThis, CharPtr JobID,
2851 Boolean Chain, CharPtr Path) {
2852 Int2 iTest;
2853 Int4 iMMDBId;
2854 PDNMS pdnmsThis = NULL;
2855 PMSD pmsdThis = NULL;
2856 BiostrucPtr pbsThis = NULL, pbsTemp = NULL;
2857 BiostrucIdPtr pbsidThis = NULL;
2858 BiostrucFeatureSetPtr pbsfsThis = NULL;
2859 BiostrucFeaturePtr pbsfThis = NULL;
2860 PSFS psfsThis = NULL;
2861
2862 CharPtr szTemp; /* NEW - K.A. 5/4/99 for pruning master/slave */
2863 Char szName[5];
2864 Char AsnPath[PATH_MAX];
2865 Char AsnName[10];
2866 Char MasterChain[2];
2867 Char SlaveChain[2];
2868
2869 /* the Feature set either attaches to an in-memory Modelstruc */
2870 /* or, if it specifies a new Modelstruc - attempts a retrieval */
2871
2872 if (pbsasThis == NULL) return FALSE;
2873 MasterChain[0] = '\0';
2874 SlaveChain[0] = '\0';
2875
2876 /* grab the id out of the Biostruc-descr */
2877
2878 pbsidThis = ValNodeFindNext(pbsasThis->id,NULL,BiostrucId_mmdb_id);
2879 if (pbsidThis) /* only deal with the first one */
2880 {
2881 iMMDBId = (Int4) pbsidThis->data.intvalue;
2882 /*printf("iMMDBID=%ld\n", iMMDBId);*//*master MMDB_ID*/
2883 }
2884
2885 pdnmsThis = FindLoadedBiostruc(NULL, iMMDBId);
2886
2887 if (!pdnmsThis) {
2888 szTemp = pbsasThis->features->features->name;
2889 szName[0] = szTemp[0];
2890 szName[1] = szTemp[1];
2891 szName[2] = szTemp[2];
2892 szName[3] = szTemp[3];
2893 szName[4] = '\0';
2894 /* try to load it using all NCBI models */
2895 /* JobID points to dir containing biostruc of a query protein from VAST Search */
2896
2897 /* First get the structure using MMDBBiostrucGet or FetchBS, then prune if needed */
2898
2899 if (JobID == NULL)
2900 pbsThis = MMDBBiostrucGet(iMMDBId, ALLSIMPLEMDL, 3);
2901 else {
2902 AsnName[0]='\0';
2903 StringCpy(AsnName, "/b");
2904 StringCat(AsnName, szName);
2905 AsnPath[0]='\0';
2906 StringCpy(AsnPath, Path);
2907 StringCat(AsnPath, JobID);
2908 StringCat(AsnPath, AsnName);
2909 pbsThis = FetchBS(AsnPath, 0, ALLSIMPLEMDL, 3, POWER_VIEW);
2910 }
2911
2912 if (Chain) {
2913 if (szTemp[4] != ' ') {
2914 MasterChain[0] = szTemp[4];
2915 MasterChain[1] = '\0';
2916 pbsTemp = (BiostrucPtr)PruneBiostruc(pbsThis, MasterChain);
2917 pbsThis = NULL;
2918 pbsThis = pbsTemp;
2919 }
2920 SlaveChain[0] = szTemp[11];
2921 SlaveChain[1] = '\0';
2922 }
2923
2924 if (!pbsThis) goto nogomem;
2925 pdnmsThis = MakeAModelstruc(pbsThis);
2926 /* side effect is that this is now the selected modelstruc too */
2927 if (!pdnmsThis) goto nogomem;
2928 }
2929 pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
2930
2931 /****** WARNING: fix this if this code is ever used to recognize Neighbor mode *********/
2932 SetSelectedModelstruc(pdnmsThis); /* set it to selected one */
2933 /* at this point we have annot-set, and its associated Modelstruc */
2934
2935 pbsfsThis = pbsasThis->features;
2936
2937 while (pbsfsThis) /* walk through each feature-set */
2938 {
2939 iTest = BiostrucAddFeature(pbsfsThis,pdnmsThis, Chain, SlaveChain); /* new slave args passed */
2940 if (iTest < 0) goto nogomem; /* a malloc error */
2941 if (!iTest) goto nogo; /* bad feature table error - fatal */
2942 pbsfsThis = pbsfsThis->next;
2943 }
2944 /* given a sucessfully registered Biostruc-annot-set
2945 we can now free it */
2946 BiostrucAnnotSetFree(pbsasThis);
2947 return TRUE;
2948
2949 nogomem:
2950 nogo:
2951 BiostrucAnnotSetFree(pbsasThis);
2952 return FALSE;
2953 }
2954
2955 /************************************************************
2956 produce a sequence alignment from a structure-alignment
2957 :)bug fixed: need two loops to go through master and slave selection with
2958 BiostrucAnnotSetPtr->features (master selection), and
2959 BiostrucAnnotSetPtr->features->features (slave selection)
2960 in order to pick both master and slave with defination
2961 of molecule name, chain, and domain
2962 ***********************************************************/
BiosToSeq(BiostrucAnnotSetPtr set,Boolean usePValue,Char * pdbname_master,Char * pdbname_slave)2963 SeqAnnotPtr LIBCALL BiosToSeq (BiostrucAnnotSetPtr set, Boolean usePValue,
2964 Char* pdbname_master, Char* pdbname_slave)
2965 {
2966 BiostrucFeatureSetPtr pbsfs=NULL;
2967 BiostrucFeaturePtr pbsf=NULL;
2968 SeqAnnotPtr sap = NULL;
2969 SeqAlignPtr salp;
2970 ScorePtr scp;
2971 Int2 count;
2972 ObjectIdPtr oid;
2973 DenseSegPtr dsp;
2974 SeqIdPtr mastersip = NULL, slavesip;
2975 SeqIdPtr pdbsip = NULL;
2976 BiostrucFeaturePtr feature;
2977 ChemGraphAlignmentPtr pcga1 = NULL;
2978 ValNodePtr loc1 = NULL;
2979 ValNodePtr vnp = NULL;
2980 SeqAlignPtr tail = NULL;
2981 ChemGraphPntrsPtr cgpp;
2982 ResidueIntervalPntrPtr master;
2983 ResidueIntervalPntrPtr slave;
2984 ResidueIntervalPntrPtr masterseg;
2985 ResidueIntervalPntrPtr slaveseg;
2986 CharPtr pcPDB;
2987 int iDomain;
2988 ValNodePtr pvn;
2989 Char cChain;
2990 Char buf[100];
2991 Char buf2[50];
2992 Int4 nextmasterstart, nextslavestart;
2993
2994 if (set == NULL || set->features == NULL || set->features->features == NULL)
2995 return NULL;
2996 pbsfs=set->features;
2997 while(pbsfs)
2998 {
2999 feature=pbsfs->features;
3000 /*if master name matched*/
3001 if(strcmp((CharPtr)(pbsfs->descr->data.ptrvalue), pdbname_master) == 0)
3002 {
3003 while(feature)
3004 {
3005
3006 /* construct the master SeqId if it hasn't already been constructed */
3007 if (mastersip == NULL) {
3008 pcPDB = StringSave (PDBNAME_DEFAULT);
3009 iDomain = 0;
3010 cChain = ' ';
3011 pcPDB[0] = feature->name[0];
3012 pcPDB[1] = feature->name[1];
3013 pcPDB[2] = feature->name[2];
3014 pcPDB[3] = feature->name[3];
3015 cChain = feature->name[4];
3016 iDomain = atoi ((char *) &feature->name[5]);
3017 mastersip = MakePDBSeqId2 (pcPDB, cChain, iDomain, TRUE);
3018 pdbsip = MakePDBSeqId2 (pcPDB, cChain, iDomain, FALSE);
3019
3020 MemFree (pcPDB);
3021 }
3022 /* get the embedded PDB code of the hit */
3023 pcPDB = StringSave (PDBNAME_DEFAULT);
3024 iDomain = 0;
3025 cChain = '-';
3026
3027 if (StringLen (feature->name) >= 13) {
3028 pcPDB[0] = feature->name[7];
3029 pcPDB[1] = feature->name[8];
3030 pcPDB[2] = feature->name[9];
3031 pcPDB[3] = feature->name[10];
3032 cChain = feature->name[11];
3033 iDomain = atoi ((char *) &feature->name[12]);
3034 slavesip = MakePDBSeqId2 (pcPDB, cChain, iDomain, TRUE);
3035
3036 MemFree (pcPDB);
3037 }
3038
3039 pcPDB[4] = feature->name[11];
3040 pcPDB[5] = feature->name[12];
3041 pcPDB[6]='\0';
3042
3043 if (strcmp(pcPDB, pdbname_slave) == 0)
3044 {
3045 pvn = ValNodeFindNext (feature->Location_location, NULL, Location_location_alignment);
3046 if (pvn)
3047 pcga1 = (ChemGraphAlignmentPtr) pvn->data.ptrvalue;
3048
3049 vnp = pcga1->alignment;
3050
3051 if (vnp->choice != ChemGraphPntrs_residues)
3052 continue;
3053
3054 cgpp = (ChemGraphPntrsPtr) vnp->data.ptrvalue;
3055
3056 if (cgpp->choice != ResiduePntrs_interval)
3057 continue;
3058 master = (ResidueIntervalPntrPtr) cgpp->data.ptrvalue;
3059 cgpp = (ChemGraphPntrsPtr) vnp->next->data.ptrvalue;
3060 slave = (ResidueIntervalPntrPtr) cgpp->data.ptrvalue;
3061
3062 for (nextmasterstart = 1, nextslavestart = 1, count = 0, masterseg = master,
3063 slaveseg = slave; masterseg != NULL && slaveseg != NULL; masterseg = masterseg->next,
3064 slaveseg = slaveseg->next) {
3065 if (count > 0 && nextmasterstart < masterseg->from)
3066 count++;
3067 if (count > 0 && nextslavestart < slaveseg->from)
3068 count++;
3069 count++;
3070 nextmasterstart = masterseg->to + 1;
3071 nextslavestart = slaveseg->to + 1;
3072 }
3073
3074
3075 salp = SeqAlignNew ();
3076 if (sap == NULL) {
3077 sap = SeqAnnotNew ();
3078 sap->type = 2; /* align */
3079 sap->data = salp;
3080 sap->desc = ValNodeNew(NULL);
3081 sap->desc->choice = 2; /* title */
3082 SeqIdWrite (pdbsip, buf2, PRINTID_FASTA_LONG, sizeof(buf2));
3083 sprintf (buf, "VAST structural alignment for %s, mapped to sequence alignment", buf2);
3084 sap->desc->data.ptrvalue = StringSave(buf);
3085 } else {
3086 tail->next = salp;
3087 }
3088 tail = salp;
3089 salp->type = 3 /* partial */ ;
3090 salp->dim = 2;
3091
3092 scp = ScoreNew ();
3093 salp->score = scp;
3094 salp->segtype = 2 /* denseg */ ;
3095 scp->choice = 2; /* real */
3096 scp->value.realvalue = ((FloatHi) pcga1->aligndata->vast_score) / pcga1->aligndata->scale_factor;
3097 oid = ObjectIdNew ();
3098 scp->id = oid;
3099 oid->str = StringSave ("VAST score");
3100 scp->next = ScoreNew ();
3101 scp = scp->next;
3102 scp->choice = 2; /* real */
3103 scp->value.realvalue = ((FloatHi) pcga1->aligndata->vast_mlogp) / pcga1->aligndata->scale_factor;
3104 oid = ObjectIdNew ();
3105 scp->id = oid;
3106 oid->str = StringSave ("VAST p-value");
3107 scp->next = ScoreNew ();
3108 scp = scp->next;
3109 scp->choice = 2; /* real */
3110 scp->value.realvalue = ((FloatHi) pcga1->aligndata->rmsd) / pcga1->aligndata->scale_factor;
3111 oid = ObjectIdNew ();
3112 scp->id = oid;
3113 oid->str = StringSave ("VAST root mean square deviation, measured in angstroms");
3114 scp->next = ScoreNew ();
3115 scp = scp->next;
3116 scp->choice = 1; /* int */
3117 scp->value.intvalue = pcga1->aligndata->align_res;
3118 oid = ObjectIdNew ();
3119 scp->id = oid;
3120 oid->str = StringSave ("VAST aligned residue count");
3121
3122 dsp = DenseSegNew ();
3123 salp->segs = (Pointer) dsp;
3124 dsp->dim = 2;
3125 dsp->numseg = count;
3126 dsp->ids = SeqIdDup (mastersip);
3127 dsp->ids->next = slavesip;
3128 dsp->starts = (Int4Ptr) MemNew (count * sizeof (Int4) * 2);
3129 dsp->lens = (Int4Ptr) MemNew (count * sizeof (Int4));
3130
3131 for (nextmasterstart = 1, nextslavestart = 1, count = 0, masterseg = master, slaveseg = slave; masterseg != NULL && slaveseg != NULL; masterseg = masterseg->next, slaveseg = slaveseg->next) {
3132 if (count > 0 && nextmasterstart < masterseg->from)
3133 { /* add a gap */
3134 dsp->starts[count * 2] = nextmasterstart - 1;
3135 dsp->starts[count * 2 + 1] = -1;
3136 dsp->lens[count] = masterseg->from - nextmasterstart;
3137 count++;
3138 }
3139 if (count > 0 && nextslavestart < slaveseg->from)
3140 { /* add a gap */
3141 dsp->starts[count * 2 + 1] = nextslavestart - 1;
3142 dsp->starts[count * 2] = -1;
3143 dsp->lens[count] = slaveseg->from - nextslavestart;
3144 count++;
3145 }
3146 dsp->starts[count * 2] = masterseg->from-1;
3147 dsp->starts[count * 2 + 1] = slaveseg->from-1;
3148 dsp->lens[count] = masterseg->to - masterseg->from + 1;
3149 count++;
3150 nextmasterstart = masterseg->to + 1;
3151 nextslavestart = slaveseg->to + 1;
3152 }
3153 } /*if pdbname matched*/
3154 feature=feature->next;
3155 }/*while feature (pbsf)*/
3156 }/*if pcMaster matches pdbname_master*/
3157 pbsfs=pbsfs->next;
3158 }/*while pbsfs*/
3159 SeqIdFree (mastersip);
3160 SeqIdFree (pdbsip);
3161 return sap;
3162 }
3163
3164
3165
fnPBSFtoPSA(BiostrucFeaturePtr pbsfSelected)3166 SeqAnnotPtr LIBCALL fnPBSFtoPSA (BiostrucFeaturePtr pbsfSelected)
3167 {
3168 SeqAnnotPtr sap = NULL;
3169 SeqAlignPtr salp;
3170 ScorePtr scp;
3171 Int2 count;
3172 ObjectIdPtr oid;
3173 DenseSegPtr dsp;
3174 ValNodePtr loc1 = NULL;
3175 SeqAlignPtr tail = NULL;
3176 ChemGraphPntrsPtr cgpp;
3177 ResidueIntervalPntrPtr master;
3178 ResidueIntervalPntrPtr slave;
3179 ResidueIntervalPntrPtr masterseg;
3180 ResidueIntervalPntrPtr slaveseg;
3181 Char buf[100];
3182 Char buf2[50];
3183 Int4 nextmasterstart, nextslavestart;
3184 SeqIdPtr mastersip = NULL, slavesip;
3185 SeqIdPtr pdbsip = NULL;
3186 int iDomain;
3187 CharPtr pcPDB;
3188 Char cChain;
3189 ValNodePtr pvnAlignment;
3190 ChemGraphAlignmentPtr pcga1;
3191
3192 Boolean choose_densediag = TRUE;
3193
3194 pvnAlignment = ValNodeFindNext(pbsfSelected->Location_location,NULL,
3195 Location_location_alignment);
3196 pcga1 = (ChemGraphAlignmentPtr) pvnAlignment->data.ptrvalue;
3197
3198 if (pcga1->alignment->choice != ChemGraphPntrs_residues)
3199 return NULL;
3200
3201 cgpp = (ChemGraphPntrsPtr) pcga1->alignment->data.ptrvalue;
3202
3203 pcPDB = StringSave (PDBNAME_DEFAULT);
3204 iDomain = 0;
3205 cChain = '-';
3206 pcPDB[0] = pbsfSelected->name[0];
3207 pcPDB[1] = pbsfSelected->name[1];
3208 pcPDB[2] = pbsfSelected->name[2];
3209 pcPDB[3] = pbsfSelected->name[3];
3210 cChain = pbsfSelected->name[4];
3211 iDomain = atoi ((char *) &pbsfSelected->name[5]);
3212 /*mastersip = MakePDBSeqId2 (pcPDB, cChain, iDomain, TRUE); */
3213 mastersip = MakePDBSeqId2 (pcPDB, cChain, iDomain, FALSE);
3214 pdbsip = MakePDBSeqId2 (pcPDB, cChain, iDomain, FALSE);
3215
3216 MemFree (pcPDB);
3217
3218 /* get the embedded PDB code of the hit */
3219 if (iDomain < 10) {
3220 pcPDB = StringSave (PDBNAME_DEFAULT);
3221 iDomain = 0;
3222 cChain = '-';
3223
3224 pcPDB[0] = pbsfSelected->name[7];
3225 pcPDB[1] = pbsfSelected->name[8];
3226 pcPDB[2] = pbsfSelected->name[9];
3227 pcPDB[3] = pbsfSelected->name[10];
3228 cChain = pbsfSelected->name[11];
3229 iDomain = atoi ((char *) &pbsfSelected->name[12]);
3230 }
3231 else { /* have at least 10 domains in 1 str., added by J. Chen */
3232 pcPDB = StringSave (PDBNAME_DEFAULT);
3233 iDomain = 0;
3234 cChain = '-';
3235
3236 pcPDB[0] = pbsfSelected->name[8];
3237 pcPDB[1] = pbsfSelected->name[9];
3238 pcPDB[2] = pbsfSelected->name[10];
3239 pcPDB[3] = pbsfSelected->name[11];
3240 cChain = pbsfSelected->name[12];
3241 iDomain = atoi ((char *) &pbsfSelected->name[13]);
3242 }
3243
3244 /*slavesip = MakePDBSeqId2 (pcPDB, cChain, iDomain, TRUE); */
3245 slavesip = MakePDBSeqId2 (pcPDB, cChain, iDomain, FALSE);
3246
3247 MemFree (pcPDB);
3248
3249 if (cgpp->choice != ResiduePntrs_interval)
3250 return NULL;
3251 master = (ResidueIntervalPntrPtr) cgpp->data.ptrvalue;
3252 cgpp = (ChemGraphPntrsPtr) pcga1->alignment->next->data.ptrvalue;
3253 slave = (ResidueIntervalPntrPtr) cgpp->data.ptrvalue;
3254
3255 for (nextmasterstart = 1, nextslavestart = 1, count = 0, masterseg = master,
3256 slaveseg = slave; masterseg != NULL && slaveseg != NULL; masterseg = masterseg->next,
3257 slaveseg = slaveseg->next) {
3258 if (count > 0 && nextmasterstart < masterseg->from)
3259 count++;
3260 if (count > 0 && nextslavestart < slaveseg->from)
3261 count++;
3262 count++;
3263 nextmasterstart = masterseg->to + 1;
3264 nextslavestart = slaveseg->to + 1;
3265 }
3266
3267 salp = SeqAlignNew ();
3268 if (sap == NULL) {
3269 sap = SeqAnnotNew ();
3270 sap->type = 2; /* align */
3271 sap->data = salp;
3272 sap->desc = ValNodeNew(NULL);
3273 sap->desc->choice = 2; /* title */
3274 SeqIdWrite (pdbsip, buf2, PRINTID_FASTA_LONG, sizeof(buf2));
3275 sprintf (buf, "VAST structural alignment for %s, mapped to sequence alignment", buf2);
3276 sap->desc->data.ptrvalue = StringSave(buf);
3277 } else {
3278 tail->next = salp;
3279 }
3280 tail = salp;
3281 salp->type = 3 /* partial */ ;
3282 salp->dim = 2;
3283
3284 scp = ScoreNew ();
3285 salp->score = scp;
3286 salp->segtype = 2 /* denseg */ ;
3287 scp->choice = 2; /* real */
3288 scp->value.realvalue = ((FloatHi) pcga1->aligndata->vast_score) / pcga1->aligndata->scale_factor;
3289 oid = ObjectIdNew ();
3290 scp->id = oid;
3291 oid->str = StringSave ("VAST score");
3292 scp->next = ScoreNew ();
3293 scp = scp->next;
3294 scp->choice = 2; /* real */
3295 scp->value.realvalue = ((FloatHi) pcga1->aligndata->vast_mlogp) / pcga1->aligndata->scale_factor;
3296 oid = ObjectIdNew ();
3297 scp->id = oid;
3298 oid->str = StringSave ("VAST p-value");
3299 scp->next = ScoreNew ();
3300 scp = scp->next;
3301 scp->choice = 2; /* real */
3302 scp->value.realvalue = ((FloatHi) pcga1->aligndata->rmsd) / pcga1->aligndata->scale_factor;
3303 oid = ObjectIdNew ();
3304 scp->id = oid;
3305 oid->str = StringSave ("VAST root mean square deviation, measured in angstroms");
3306 scp->next = ScoreNew ();
3307 scp = scp->next;
3308 scp->choice = 1; /* int */
3309 scp->value.intvalue = pcga1->aligndata->align_res;
3310 oid = ObjectIdNew ();
3311 scp->id = oid;
3312 oid->str = StringSave ("VAST aligned residue count");
3313
3314 if(!choose_densediag){
3315 dsp = DenseSegNew ();
3316 salp->segs = (Pointer) dsp;
3317 dsp->dim = 2;
3318 dsp->numseg = count;
3319 dsp->ids = SeqIdDup (mastersip);
3320 /* dsp->ids->next = slavesip; could be a bug, J. Chen */
3321 dsp->ids->next = SeqIdDup(slavesip);
3322 dsp->starts = (Int4Ptr) MemNew (count * sizeof (Int4) * 2);
3323 dsp->lens = (Int4Ptr) MemNew (count * sizeof (Int4));
3324
3325 for (nextmasterstart = 1, nextslavestart = 1, count = 0, masterseg = master, slaveseg = slave; masterseg != NULL && slaveseg != NULL; masterseg = masterseg->next, slaveseg = slaveseg->next) {
3326 if (count > 0 && nextmasterstart < masterseg->from)
3327 { /* add a gap */
3328 dsp->starts[count * 2] = nextmasterstart - 1;
3329 dsp->starts[count * 2 + 1] = -1;
3330 dsp->lens[count] = masterseg->from - nextmasterstart;
3331 count++;
3332 }
3333 if (count > 0 && nextslavestart < slaveseg->from)
3334 { /* add a gap */
3335 dsp->starts[count * 2 + 1] = nextslavestart - 1;
3336 dsp->starts[count * 2] = -1;
3337 dsp->lens[count] = slaveseg->from - nextslavestart;
3338 count++;
3339 }
3340 dsp->starts[count * 2] = masterseg->from-1;
3341 dsp->starts[count * 2 + 1] = slaveseg->from-1;
3342 dsp->lens[count] = masterseg->to - masterseg->from + 1;
3343 count++;
3344 nextmasterstart = masterseg->to + 1;
3345 nextslavestart = slaveseg->to + 1;
3346 }
3347 }
3348 else {
3349 DenseDiagPtr ddp, ddp_tmp;
3350
3351 salp->segs = NULL;
3352 salp->type = 3;
3353 salp->segtype = 1 /* densediag */ ;
3354
3355 for(count = 0, masterseg = master, slaveseg = slave; masterseg != NULL && slaveseg != NULL; masterseg = masterseg->next, slaveseg = slaveseg->next) {
3356 ddp = DenseDiagNew();
3357 ddp->dim = 2;
3358
3359 ddp->id = SeqIdDup (mastersip);
3360 /* ddp->id->next = slavesip; bug! fixed by J.Chen */
3361 ddp->id->next = SeqIdDup(slavesip);
3362
3363 ddp->starts = (Int4Ptr) MemNew ((size_t) 4 * sizeof (Int4));
3364 ddp->starts[0] = masterseg->from-1;
3365 ddp->starts[1] = slaveseg->from -1 ;
3366 ddp->len = masterseg->to - masterseg->from + 1;
3367 count++;
3368 if(salp->segs == NULL) salp->segs = (Pointer) ddp;
3369 else {
3370 ddp_tmp = (DenseDiagPtr) salp->segs;
3371 while(ddp_tmp->next) ddp_tmp = ddp_tmp->next;
3372 ddp_tmp->next = ddp;
3373 }
3374 }
3375
3376 }
3377
3378
3379 SeqIdFree (mastersip);
3380 SeqIdFree (pdbsip);
3381 slavesip->next = NULL;
3382
3383 return sap;
3384 }
3385
3386 /************************************************************
3387 Produce sequence annotation set of a master (name, chain, domain)
3388 with all its slaves according to structure alignments.
3389 ************************************************************/
3390
3391 /* please don't use this function, use the function above */
3392
BiostrToSeqAnnotSet(BiostrucAnnotSetPtr set,Boolean usePValue,Char * pdbname_master)3393 SeqAnnotPtr LIBCALL BiostrToSeqAnnotSet (BiostrucAnnotSetPtr set,
3394 Boolean usePValue, Char* pdbname_master)
3395 {
3396 BiostrucFeatureSetPtr pbsfs=NULL;
3397 BiostrucFeaturePtr pbsf=NULL;
3398 SeqAnnotPtr sap = NULL;
3399 SeqAlignPtr salp;
3400 ScorePtr scp;
3401 Int2 count;
3402 ObjectIdPtr oid;
3403 DenseSegPtr dsp;
3404 SeqIdPtr mastersip = NULL, slavesip;
3405 SeqIdPtr pdbsip = NULL;
3406 BiostrucFeaturePtr feature;
3407 ChemGraphAlignmentPtr pcga1 = NULL;
3408 ValNodePtr loc1 = NULL;
3409 ValNodePtr vnp = NULL;
3410 SeqAlignPtr tail = NULL;
3411 ChemGraphPntrsPtr cgpp;
3412 ResidueIntervalPntrPtr master;
3413 ResidueIntervalPntrPtr slave;
3414 ResidueIntervalPntrPtr masterseg;
3415 ResidueIntervalPntrPtr slaveseg;
3416 CharPtr pcPDB;
3417 Char pcMaster[10]; /* fixed lyg */
3418 int iDomain;
3419 ValNodePtr pvn;
3420 Char cChain;
3421 Char buf[100];
3422 Char buf2[50];
3423 Int4 nextmasterstart, nextslavestart;
3424
3425 if (set == NULL || set->features == NULL || set->features->features == NULL)
3426 return NULL;
3427 pbsfs=set->features;
3428 while(pbsfs)
3429 {
3430 feature=pbsfs->features;
3431 strcpy(pcMaster, (char *)pbsfs->descr->data.ptrvalue);
3432 /*if master name matched*/
3433 if(strcmp(pcMaster, pdbname_master) == 0) /* I had this commented out */
3434 {
3435 while(feature)
3436 {
3437
3438 /* construct the master SeqId if it hasn't already been constructed */
3439 if (mastersip == NULL) {
3440 pcPDB = StringSave (PDBNAME_DEFAULT);
3441 iDomain = 0;
3442 cChain = '-';
3443 pcPDB[0] = feature->name[0];
3444 pcPDB[1] = feature->name[1];
3445 pcPDB[2] = feature->name[2];
3446 pcPDB[3] = feature->name[3];
3447 cChain = feature->name[4];
3448 iDomain = atoi ((char *) &feature->name[5]);
3449 mastersip = MakePDBSeqId2 (pcPDB, cChain, iDomain, TRUE);
3450 pdbsip = MakePDBSeqId2 (pcPDB, cChain, iDomain, FALSE);
3451
3452 MemFree (pcPDB);
3453 }
3454 /* get the embedded PDB code of the hit */
3455 pcPDB = StringSave (PDBNAME_DEFAULT);
3456 iDomain = 0;
3457 cChain = '-';
3458
3459 if (StringLen (feature->name) >= 13) {
3460 pcPDB[0] = feature->name[7];
3461 pcPDB[1] = feature->name[8];
3462 pcPDB[2] = feature->name[9];
3463 pcPDB[3] = feature->name[10];
3464 cChain = feature->name[11];
3465 iDomain = atoi ((char *) &feature->name[12]);
3466 slavesip = MakePDBSeqId2 (pcPDB, cChain, iDomain, TRUE);
3467
3468 MemFree (pcPDB);
3469 }
3470
3471 pcPDB[4] = feature->name[11];
3472 pcPDB[5] = feature->name[12];
3473 pcPDB[6]='\0';
3474
3475 pvn = ValNodeFindNext (feature->Location_location, NULL, Location_location_alignment);
3476 if (pvn)
3477 pcga1 = (ChemGraphAlignmentPtr) pvn->data.ptrvalue;
3478
3479 vnp = pcga1->alignment;
3480
3481 if (vnp->choice != ChemGraphPntrs_residues)
3482 continue;
3483
3484 cgpp = (ChemGraphPntrsPtr) vnp->data.ptrvalue;
3485
3486 if (cgpp->choice != ResiduePntrs_interval)
3487 continue;
3488 master = (ResidueIntervalPntrPtr) cgpp->data.ptrvalue;
3489 cgpp = (ChemGraphPntrsPtr) vnp->next->data.ptrvalue;
3490 slave = (ResidueIntervalPntrPtr) cgpp->data.ptrvalue;
3491
3492 for (nextmasterstart = 1, nextslavestart = 1, count = 0, masterseg = master,
3493 slaveseg = slave; masterseg != NULL && slaveseg != NULL; masterseg = masterseg->next,
3494 slaveseg = slaveseg->next) {
3495 if (count > 0 && nextmasterstart < masterseg->from)
3496 count++;
3497 if (count > 0 && nextslavestart < slaveseg->from)
3498 count++;
3499 count++;
3500 nextmasterstart = masterseg->to + 1;
3501 nextslavestart = slaveseg->to + 1;
3502 }
3503
3504
3505 salp = SeqAlignNew ();
3506 if (sap == NULL) {
3507 sap = SeqAnnotNew ();
3508 sap->type = 2; /* align */
3509 sap->data = salp;
3510 sap->desc = ValNodeNew(NULL);
3511 sap->desc->choice = 2; /* title */
3512 SeqIdWrite (pdbsip, buf2, PRINTID_FASTA_LONG, sizeof(buf2));
3513 buf2[10]=pdbname_master[5];
3514 buf2[11]='\0';
3515 sprintf (buf, "VAST structural alignment for %s, mapped to sequence alignment", buf2);
3516 sap->desc->data.ptrvalue = StringSave(buf);
3517 } else {
3518 tail->next = salp;
3519 }
3520 tail = salp;
3521 salp->type = 3 /* partial */ ;
3522 salp->dim = 2;
3523
3524 scp = ScoreNew ();
3525 salp->score = scp;
3526 salp->segtype = 2 /* denseg */ ;
3527 scp->choice = 2; /* real */
3528 scp->value.realvalue = ((FloatHi) pcga1->aligndata->vast_score) / pcga1->aligndata->scale_factor;
3529 oid = ObjectIdNew ();
3530 scp->id = oid;
3531 oid->str = StringSave ("VAST score");
3532 scp->next = ScoreNew ();
3533 scp = scp->next;
3534 scp->choice = 2; /* real */
3535 scp->value.realvalue = ((FloatHi) pcga1->aligndata->vast_mlogp) / pcga1->aligndata->scale_factor;
3536 oid = ObjectIdNew ();
3537 scp->id = oid;
3538 oid->str = StringSave ("VAST p-value");
3539 scp->next = ScoreNew ();
3540 scp = scp->next;
3541 scp->choice = 2; /* real */
3542 scp->value.realvalue = ((FloatHi) pcga1->aligndata->rmsd) / pcga1->aligndata->scale_factor;
3543 oid = ObjectIdNew ();
3544 scp->id = oid;
3545 oid->str = StringSave ("VAST root mean square deviation, measured in angstroms");
3546 scp->next = ScoreNew ();
3547 scp = scp->next;
3548 scp->choice = 1; /* int */
3549 scp->value.intvalue = pcga1->aligndata->align_res;
3550 oid = ObjectIdNew ();
3551 scp->id = oid;
3552 oid->str = StringSave ("VAST aligned residue count");
3553
3554 dsp = DenseSegNew ();
3555 salp->segs = (Pointer) dsp;
3556 dsp->dim = 2;
3557 dsp->numseg = count;
3558 dsp->ids = SeqIdDup (mastersip);
3559 dsp->ids->next = slavesip;
3560 dsp->starts = (Int4Ptr) MemNew (count * sizeof (Int4) * 2);
3561 dsp->lens = (Int4Ptr) MemNew (count * sizeof (Int4));
3562
3563 for (nextmasterstart = 1, nextslavestart = 1, count = 0, masterseg = master, slaveseg = slave; masterseg != NULL && slaveseg != NULL; masterseg = masterseg->next, slaveseg = slaveseg->next) {
3564 if (count > 0 && nextmasterstart < masterseg->from)
3565 { /* add a gap */
3566 dsp->starts[count * 2] = nextmasterstart - 1;
3567 dsp->starts[count * 2 + 1] = -1;
3568 dsp->lens[count] = masterseg->from - nextmasterstart;
3569 count++;
3570 }
3571 if (count > 0 && nextslavestart < slaveseg->from)
3572 { /* add a gap */
3573 dsp->starts[count * 2 + 1] = nextslavestart - 1;
3574 dsp->starts[count * 2] = -1;
3575 dsp->lens[count] = slaveseg->from - nextslavestart;
3576 count++;
3577 }
3578 dsp->starts[count * 2] = masterseg->from-1;
3579 dsp->starts[count * 2 + 1] = slaveseg->from-1;
3580 dsp->lens[count] = masterseg->to - masterseg->from + 1;
3581 count++;
3582 nextmasterstart = masterseg->to + 1;
3583 nextslavestart = slaveseg->to + 1;
3584 }
3585 feature=feature->next;
3586 }/*while feature (pbsf)*/
3587 }/*if pcMaster matches pdbname_master*/
3588 pbsfs=pbsfs->next;
3589 }/*while pbsfs*/
3590 SeqIdFree (mastersip);
3591 SeqIdFree (pdbsip);
3592 return sap;
3593 }
3594
ResolveAlignChain(PDNMS pdnmsThis)3595 void LIBCALL ResolveAlignChain(PDNMS pdnmsThis)
3596 { /* moves the reserved byte value up to pmmd to indicate
3597 chain is in alignment */
3598 PMSD pmsdThis = NULL;
3599 PDNMM pdnmmThis = NULL;
3600 PMMD pmmdThis = NULL;
3601 PDNMG pdnmgThis = NULL;
3602 PMGD pmgdThis = NULL;
3603 int i, j;
3604
3605 if (!pdnmsThis) return;
3606 pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
3607
3608 pdnmmThis = pmsdThis->pdnmmHead;
3609 /*printf("iMMDBid=%ld, iModels=%i\n", pmsdThis->iMMDBid, pmsdThis->iModels);*/
3610 i=1;
3611 while (pdnmmThis)
3612 {
3613 pmmdThis = (PMMD) pdnmmThis->data.ptrvalue;
3614 /*printf("I am at #358, pmmdThis->bReserved=%x\n", pmmdThis->bReserved);*/
3615 pdnmgThis = pmmdThis->pdnmgHead;
3616 j=1;
3617 while(pdnmgThis)
3618 {
3619 /*printf("loop pdnmg=%i, loop pdnmm=%i\n", j, i);*/
3620 pmgdThis = (PMGD) pdnmgThis->data.ptrvalue;
3621 /* printf("I am at #360, %x\n", pmgdThis->bReserved);*/
3622 if (pmgdThis->bReserved)
3623 pmmdThis->bReserved = pmgdThis->bReserved;
3624 /*I added the following two lines
3625
3626 pmmdThis->bReserved = 1;
3627 pmgdThis->bReserved = 1;
3628 */
3629
3630 pdnmgThis = pdnmgThis->next;
3631 j++;
3632 }
3633 pdnmmThis = pdnmmThis->next;
3634 i++;
3635 }
3636 }
3637
3638
CompareScores(VoidPtr vp1,VoidPtr vp2)3639 int LIBCALLBACK CompareScores(VoidPtr vp1, VoidPtr vp2)
3640 {
3641 BiostrucFeaturePtr pbf1, pbf2;
3642 ChemGraphAlignmentPtr pcga1 = NULL;
3643 ChemGraphAlignmentPtr pcga2 = NULL;
3644 ValNodePtr loc1 = NULL;
3645 ValNodePtr loc2 = NULL;
3646 ValNodePtr vnp1, vnp2;
3647 ValNodePtr PNTR vnpp1;
3648 ValNodePtr PNTR vnpp2;
3649
3650 vnpp1 = (ValNodePtr PNTR) vp1;
3651 vnpp2 = (ValNodePtr PNTR) vp2;
3652 vnp1 = *vnpp1;
3653 vnp2 = *vnpp2;
3654
3655 pbf1 = (BiostrucFeaturePtr) vnp1->data.ptrvalue;
3656 pbf2 = (BiostrucFeaturePtr) vnp2->data.ptrvalue;
3657
3658 /* First, three cases that should not be, need to be checked for. */
3659 if (pbf1 == NULL && pbf2 != NULL)
3660 return -1;
3661 if (pbf1 != NULL && pbf2 == NULL)
3662 return 1;
3663 if (pbf1 == NULL && pbf2 == NULL)
3664 return 0;
3665
3666
3667 /* get at the appropriate data element */
3668
3669 loc1 = pbf1->Location_location;
3670 loc2 = pbf2->Location_location;
3671 if ((loc1) && (loc1->choice == Location_location_alignment))
3672 pcga1 = (ChemGraphAlignmentPtr) loc1->data.ptrvalue;
3673 if ((loc2) && (loc2->choice == Location_location_alignment))
3674 pcga2 = (ChemGraphAlignmentPtr) loc2->data.ptrvalue;
3675
3676 if (pcga1 == NULL && pcga2 != NULL)
3677 return -1;
3678 if (pcga1 != NULL && pcga2 == NULL)
3679 return 1;
3680 if (pcga1 == NULL && pcga2 == NULL)
3681 return 0;
3682
3683 if (pcga1->aligndata == NULL && pcga2->aligndata != NULL)
3684 return -1;
3685 if (pcga1->aligndata != NULL && pcga2->aligndata == NULL)
3686 return 1;
3687 if (pcga1->aligndata == NULL && pcga2->aligndata == NULL)
3688 return 0;
3689 switch(SortOn)
3690 {
3691 case 0:
3692 case 1: /* Score */
3693 if (pcga1->aligndata->vast_score > pcga2->aligndata->vast_score)
3694 return -1;
3695 else if (pcga1->aligndata->vast_score < pcga2->aligndata->vast_score)
3696 return 1;
3697 else
3698 return 0;
3699 case 2: /* P value (inverse sorting) */
3700 if (pcga1->aligndata->vast_mlogp > pcga2->aligndata->vast_mlogp)
3701 return -1;
3702 else if (pcga1->aligndata->vast_mlogp < pcga2->aligndata->vast_mlogp)
3703 return 1;
3704 else
3705 return 0;
3706 case 3: /* RMSD */
3707 if (pcga1->aligndata->rmsd < pcga2->aligndata->rmsd)
3708 return -1;
3709 else if (pcga1->aligndata->rmsd > pcga2->aligndata->rmsd)
3710 return 1;
3711 else
3712 return 0;
3713 case 4: /* Aligned residues */
3714 if (pcga1->aligndata->align_res > pcga2->aligndata->align_res)
3715 return -1;
3716 else if (pcga1->aligndata->align_res < pcga2->aligndata->align_res)
3717 return 1;
3718 else
3719 return 0;
3720 case 5: /* Identity */
3721 if (pcga1->aligndata->other_score > pcga2->aligndata->other_score)
3722 return -1;
3723 else if (pcga1->aligndata->other_score < pcga2->aligndata->other_score)
3724 return 1;
3725 else
3726 return 0;
3727 default:
3728 return 0;
3729 }
3730 }
3731
VastTableSort(BiostrucFeatureSetPtr pbsfs,Int2 iSort)3732 void LIBCALL VastTableSort(BiostrucFeatureSetPtr pbsfs, Int2 iSort)
3733 {
3734 ValNodePtr pvnSort = NULL;
3735 ValNodePtr pvnList = NULL;
3736 BiostrucFeaturePtr pbsf = NULL;
3737 BiostrucFeaturePtr pbsfThis = NULL;
3738
3739 if ((!pbsfs)) return;
3740
3741 pbsf = pbsfs->features;
3742 while(pbsf)
3743 { /* chop out features into a ValNode list */
3744 pvnSort = ValNodeAddPointer(&pvnList, 0, (VoidPtr) pbsf);
3745 pbsfThis = pbsf;
3746 pbsf = pbsf->next;
3747 pbsfThis->next = NULL; /* detach feature */
3748 }
3749 SortOn = iSort;
3750
3751 VnpHeapSort(&pvnList, CompareScores);
3752
3753 /* reassemble in sorted order */
3754 pbsfs->features = (BiostrucFeaturePtr) pvnList->data.ptrvalue;
3755 pbsf = pbsfs->features;
3756 pvnSort = pvnList->next;
3757 while (pvnSort)
3758 {
3759 pbsf->next = (BiostrucFeaturePtr) pvnSort->data.ptrvalue;
3760 pbsf = pbsf->next;
3761 pvnSort = pvnSort->next;
3762 }
3763 ValNodeFree(pvnList);
3764 return;
3765 }
3766
3767
3768
3769
SetNodeFeatureData(PFB pfbThis,PSFD psfdThis)3770 Boolean LIBCALL SetNodeFeatureData(PFB pfbThis, PSFD psfdThis)
3771 {
3772 Int4Ptr pI4vFeat = NULL;
3773 PointerPtr ppvOld = NULL;
3774 int iNum, i;
3775
3776 /* Broadcasts the feature into the node that maps to it.
3777 * This sets the indicator in the PFB that there is a feature
3778 * associated with it. The variable pI4vFeatID in the pfb is
3779 * a vector of pairs of id's where the first id is the feature-set
3780 * ordinal (not its true id), and the second id is the
3781 * true feature-id.
3782 *
3783 * If there is ->pData associated with the node, that pointer
3784 * is put into a parallel vector of pointers
3785 * to the pairs of id's (feature-set, feature),
3786 * ppFeatData. This should be NULL for every feature
3787 * that has no associated data structures.
3788 *
3789 */
3790
3791 if (!pfbThis) return FALSE;
3792 if (!psfdThis) return FALSE;
3793
3794 iNum = (int) pfbThis->iNumFeats;
3795 if ((pfbThis->pI4vFeatID) &&(iNum > 0))
3796 pI4vFeat = pfbThis->pI4vFeatID;
3797 pfbThis->pI4vFeatID = NULL;
3798 pfbThis->pI4vFeatID = (Int4Ptr) MemNew((size_t) (iNum+1)*2*sizeof(Int4));
3799 if (!pfbThis->pI4vFeatID)
3800 {
3801 pfbThis->pI4vFeatID = pI4vFeat;
3802 return FALSE;
3803 }
3804 if (pI4vFeat)
3805 { /* copy other id's and destroy */
3806 for (i = 0; i<(iNum*2); i++)
3807 {
3808 pfbThis->pI4vFeatID[i] = pI4vFeat[i];
3809 }
3810 MemFree(pI4vFeat);
3811 }
3812 pfbThis->pI4vFeatID[iNum*2] = (Int4) psfdThis->pdnsfsSet->choice;
3813 pfbThis->pI4vFeatID[(iNum*2)+1] = psfdThis->iId;
3814
3815
3816 if (psfdThis->pData)
3817 {
3818 if (pfbThis->ppvFeatData)
3819 ppvOld = pfbThis->ppvFeatData;
3820 pfbThis->ppvFeatData = NULL;
3821 pfbThis->ppvFeatData = (PointerPtr) MemNew((size_t) (iNum+1)*sizeof(Pointer));
3822 if (!pfbThis->ppvFeatData)
3823 {
3824 pfbThis->ppvFeatData = ppvOld;
3825 return FALSE;
3826 }
3827 if (ppvOld)
3828 { /* copy other pointers, and free old vector */
3829 for (i = 0; i < (iNum); i++)
3830 pfbThis->ppvFeatData[i] = ppvOld[i];
3831 MemFree(ppvOld);
3832 }
3833 /* assign the data pointer */
3834 pfbThis->ppvFeatData[iNum] = psfdThis->pData;
3835 }
3836
3837 pfbThis->iNumFeats++;
3838 return TRUE;
3839 }
3840
MakeRegionNodeList(PDNMS pdnmsThis,RegionPntrsPtr prgpThis)3841 ValNodePtr LIBCALL MakeRegionNodeList(PDNMS pdnmsThis, RegionPntrsPtr prgpThis)
3842 {
3843
3844
3845 /*
3846
3847 This traverses the ASN.1 RegionPntrs list and makes a list of PFB's
3848 prgpThis->model_id;
3849 ValNodeFindNext(prgpThis->region ... );
3850
3851 RegionCoordinates ... (model coord set, - does the lookup )
3852
3853
3854
3855 RegionBoundary... (sphere, cone, cylinder, brick - does the bounding calc
3856 and returns entities within )
3857 */
3858
3859 return NULL;
3860 }
3861
InstallAlignedSlave(PDNMS pdnmsMaster,ChemGraphAlignmentPtr pcgaAlign,PSFD psfdThis,Boolean Chain,CharPtr SlaveChain)3862 void LIBCALL InstallAlignedSlave(PDNMS pdnmsMaster, ChemGraphAlignmentPtr pcgaAlign,
3863 PSFD psfdThis, Boolean Chain, CharPtr SlaveChain) {
3864 Int4 iId = 0;
3865 BiostrucPtr pbsSlave = NULL, pbsTemp = NULL;
3866 PDNMS pdnmsSlave = NULL;
3867 PMSD pmsdSlave = NULL;
3868 PFB pfbThis = NULL;
3869 ValNodePtr pvnThis = NULL;
3870 ValNodePtr pvnList = NULL;
3871 ValNodePtr pvnLoc = NULL;
3872 BiostrucIdPtr pbsidThis = NULL;
3873 ChemGraphPntrsPtr pcgpThis = NULL;
3874 PSFS psfsThis = NULL;
3875 Pointer ptr = NULL;
3876 Boolean bTest;
3877 Int2 iTest;
3878
3879 #ifdef _DEBUG_9
3880 printf("in InstallAlignedSlave \n");
3881 #endif
3882
3883 if (!pcgaAlign) return;
3884 if (!pdnmsMaster) return;
3885
3886 SetSlaveModelstruc(NULL);
3887 SetSelectedModelstruc(pdnmsMaster);
3888 SetNeighborOn(); /* sets master to selected */
3889 /* sets slave to first on master's list if slave is null */
3890
3891 if (pcgaAlign->dimension != 2) return;
3892
3893 #ifdef _DEBUG_9
3894 printf("still in InstallAlignedSlave \n");
3895 #endif
3896
3897 /* the second id is the slave */
3898 pbsidThis = ValNodeFindNext(pcgaAlign->biostruc_ids,NULL,BiostrucId_mmdb_id);
3899 if (pbsidThis)
3900 {
3901 pbsidThis = ValNodeFindNext(pcgaAlign->biostruc_ids,pbsidThis,BiostrucId_mmdb_id);
3902 if (pbsidThis) iId = (Int4) pbsidThis->data.intvalue;
3903 }
3904
3905 if (iId == 0)
3906 {
3907 #ifdef _DEBUG_9
3908 printf("Biostruc Slave Fetch failed %d \n", (int) iId);
3909 #endif
3910 return;
3911 }
3912
3913 pbsSlave = MMDBBiostrucGet(iId, ALLSIMPLEMDL, 3);
3914 /*****************************************************************************/
3915 /* This is code added by KA so that we only have to call one MMDBBiostrucGet */
3916 /*****************************************************************************/
3917 if (Chain == TRUE) {
3918 if (SlaveChain[0] != ' ') {
3919 pbsTemp = (BiostrucPtr)PruneBiostruc(pbsSlave, SlaveChain);
3920 pbsSlave = NULL;
3921 pbsSlave = pbsTemp;
3922 }
3923 }
3924 /*****************************************************************************/
3925 if (!pbsSlave) {
3926 SetNeighborOff();
3927
3928 #ifdef _DEBUG_9
3929 printf("Biostruc Slave Fetch failed %d \n", (int) iId);
3930 #endif
3931 return; }
3932 else
3933 {
3934 #ifdef _DEBUG_9
3935 printf("Biostruc Slave Fetched! %d \n", (int) iId);
3936 #endif
3937 }
3938 pdnmsSlave = MakeAModelstruc(pbsSlave);
3939 /* hangs off of master and sets slave and sets selected=master */
3940 SetNeighborOff();
3941 /* resets selected to master only */
3942 if (!pdnmsSlave) {
3943 #ifdef _DEBUG_9
3944 printf("Biostruc Slave Convert failed %d \n", (int) iId);
3945 #endif
3946 return;
3947 }
3948
3949 SetSlaveModelstruc(pdnmsSlave); /* defaults *on* next time SetNeighborOn called */
3950
3951 /* get the master data - > apply alignment CGP to master structure */
3952 /* using SetNodeFeatureData */
3953
3954 pvnThis = NULL;
3955 pvnThis = pcgaAlign->alignment;
3956 if (pvnThis)
3957 {
3958 /********TEMPORARY******/
3959 pcgpThis = ( ChemGraphPntrsPtr ) pvnThis;
3960 pvnList = MakeChemGraphNodeList(pdnmsMaster, pcgpThis);
3961 if (!pvnList) {
3962 #ifdef _DEBUG_9
3963 printf("Master MakeChemGraphNodeList failed \n");
3964 #endif
3965 return; }
3966 pvnLoc = pvnList;
3967 while (pvnLoc)
3968 {
3969 pfbThis = (PFB) pvnLoc->data.ptrvalue;
3970 pfbThis->bReserved++;
3971 pvnLoc = pvnLoc->next;
3972 } /* while pvnLoc */
3973 ValNodeFree(pvnList);
3974 pvnList = NULL;
3975
3976 pcgpThis = ( ChemGraphPntrsPtr ) pvnThis->next;
3977 pvnList = MakeChemGraphNodeList(pdnmsSlave, pcgpThis);
3978 if (!pvnList) {
3979 #ifdef _DEBUG_9
3980 printf("Master MakeChemGraphNodeList failed \n");
3981 #endif
3982 return; }
3983 pvnLoc = pvnList;
3984 while (pvnLoc)
3985 {
3986 pfbThis = (PFB) pvnLoc->data.ptrvalue;
3987 /* register feature in each location */
3988 bTest = SetNodeFeatureData( pfbThis, psfdThis);
3989 psfdThis->bPFBtype = (psfdThis->bPFBtype | pfbThis->bMe);
3990 /********TEMPORARY******/
3991 pfbThis->bReserved++;
3992 if (bTest == FALSE) {
3993 #ifdef _DEBUG_9
3994 printf("Master SetNodeFeatureData failed \n");
3995 #endif
3996 return; }
3997 pvnLoc = pvnLoc->next;
3998 } /* while pvnLoc */
3999 ValNodeFree(pvnList);
4000 pvnList = NULL;
4001 } /* if pvnThis */
4002
4003
4004 TransformToDNTRN((PDNTRN PNTR) &ptr, pcgaAlign->transform );
4005
4006 /* apply the transform to the slave */
4007
4008 iTest = TraverseModels( pdnmsSlave,
4009 TRAVERSE_ATOM,
4010 0, ptr,
4011 (pNodeFunc)(DoApplyTransform));
4012 iTest = TraverseModels( pdnmsSlave,
4013 TRAVERSE_SOLID,
4014 0, ptr,
4015 (pNodeFunc)(DoApplyTransform));
4016 #ifdef _DEBUG_9
4017 printf("Transformed Models \n");
4018 #endif
4019
4020 /* free the transform data */
4021
4022 FreeDNTRN((PDNTRN) ptr);
4023
4024
4025 /* set dirty bit */
4026 pmsdSlave = (PMSD) pdnmsSlave->data.ptrvalue;
4027 pmsdSlave->bUpdate = (Byte) (pmsdSlave->bUpdate | (Byte) AM_CHANGED);
4028 /* enforce an MMDB-ID change */
4029 pmsdSlave->iHashChange = MakeHashChange(pdnmsSlave);
4030
4031 /* Do nothing with the domain data... */
4032 /* that's all folks, now just use SetNeighborOn()... */
4033 /* selected = master after this is through */
4034 return;
4035 }
4036
4037
InstallStrucFeature(PDNMS pdnmsThis,PDNSFS pdnsfsThis,BiostrucFeaturePtr pbsfThis,Boolean Chain,CharPtr SlaveChain)4038 PSFD LIBCALL InstallStrucFeature(PDNMS pdnmsThis, PDNSFS pdnsfsThis, BiostrucFeaturePtr pbsfThis,
4039 Boolean Chain, CharPtr SlaveChain)
4040 {
4041
4042 /* This procedure adds a new Feature to the Feature-Set registry
4043 * specified. If there is "global" data to be kept (e.g. color,
4044 * render, transform values, camera values, label values
4045 */
4046 PSFF psffFunc = NULL;
4047 PSFS psfsThis = NULL;
4048 PSFD psfdTemp = NULL;
4049 Uint1 iColor = 0;
4050 ColorPropPtr pcpThis = NULL;
4051
4052
4053 if (!(pdnsfsThis || pbsfThis)) return NULL;
4054
4055 #ifdef _DEBUG_9
4056 printf("in InstallStrucFeature \n");
4057 #endif
4058
4059 psfsThis = (PSFS) pdnsfsThis->data.ptrvalue;
4060 psfdTemp = psfsThis->psfdFeats;
4061 psfsThis->psfdFeats = NewSFD(); /* insert new feature at head LIFO */
4062 if (!psfsThis->psfdFeats)
4063 {
4064 psfsThis->psfdFeats = psfdTemp;
4065 return NULL;
4066 }
4067 psfsThis->psfdFeats->next = psfdTemp; /* attach rest of features */
4068 psfsThis->psfdFeats->iType = pbsfThis->type;
4069 psfsThis->psfdFeats->pdnsfsSet = pdnsfsThis;
4070 psfsThis->psfdFeats->iId = pbsfThis->id;
4071 if (pbsfThis->name) psfsThis->psfdFeats->pcName = StringSave(pbsfThis->name);
4072
4073
4074 psffFunc = DoesFeatureTypeHaveFuncs(pbsfThis->type);
4075 if (psffFunc)
4076 { /* this uses the installed functions associated with the feature type */
4077 /* to copy from the User-object into a newly-allocated data object */
4078 /* which is owned by psfsThis->psfdFeats */
4079
4080 (*(psffFunc->pFeatToCFn)) ( (Pointer PNTR) &(psfsThis->psfdFeats->pData),
4081 (UserObjectPtr PNTR) &pbsfThis->Property_property->data.ptrvalue);
4082 }
4083
4084
4085 /* this is to instantiate the property data */
4086 switch(pbsfThis->type)
4087 {
4088 case Feature_type_color:
4089 /* register color - gets back index into palette */
4090 pcpThis = (ColorPropPtr) pbsfThis->Property_property->data.ptrvalue;
4091 iColor = Call3DColorProc(pcpThis);
4092 psfsThis->psfdFeats->iColor = iColor;
4093 break;
4094
4095 case Feature_type_render:
4096 /* register render code */
4097 psfsThis->psfdFeats->iRender = (Int4) pbsfThis->Property_property->data.intvalue;
4098 break;
4099
4100 case Feature_type_transform:
4101 TransformToDNTRN((PDNTRN PNTR) &psfsThis->psfdFeats->pData,
4102 (TransformPtr) pbsfThis->Property_property->data.ptrvalue);
4103 break;
4104
4105 case Feature_type_camera:
4106 case Feature_type_script:
4107 /* detach & save the property data in ASN.1 format */
4108 /* psfsThis->psfdFeats->pData = (Pointer) pbsfThis->Property_property; */
4109 /* pbsfThis->Property_property = NULL;*/
4110 break;
4111
4112 case Feature_type_cn3dstate:
4113 case Feature_type_comment:
4114 case Feature_type_label:
4115 /* globally applied user-object in use */
4116 /* the ASN.1 has been converted to the C by registered function */
4117 break;
4118
4119 case Feature_type_other:
4120 break; /* other not allowed to have data... */
4121
4122 case Feature_type_multalign:
4123 case Feature_type_alignment:
4124
4125 #ifdef _DEBUG_9
4126 printf("in alignment case \n");
4127 #endif
4128 /* cast property to alignment ASN.1 type */
4129 /* detach location & save it in ASN.1 format */
4130 psfsThis->psfdFeats->pData = (Pointer) pbsfThis->Location_location->data.ptrvalue;
4131 pbsfThis->Location_location = NULL;
4132 InstallAlignedSlave(pdnmsThis,
4133 (ChemGraphAlignmentPtr) psfsThis->psfdFeats->pData,
4134 psfsThis->psfdFeats, Chain, SlaveChain);
4135 break;
4136 case Feature_type_similarity:
4137 case Feature_type_region:
4138 break;
4139 case Feature_type_indirect:
4140 /* deal with mapping the chem-graph-ptrs and "prototypes" */
4141 break;
4142
4143 /* these don't get put into flag bytes */
4144 /* but they all have subgraph locations */
4145 /* case Feature_type_helix:
4146 case Feature_type_strand:
4147 case Feature_type_sheet:
4148 case Feature_type_turn:
4149 case Feature_type_site:
4150 case Feature_type_footnote:
4151 case Feature_type_subgraph:
4152 case Feature_type_core:
4153 case Feature_type_supercore: */
4154 default: ;
4155 /* these have no special indication other than Type */
4156 } /* switch generic feature-type */
4157
4158 return psfsThis->psfdFeats;
4159 }
4160
BiostrucAddFeature(BiostrucFeatureSetPtr pbsfsThis,PDNMS pdnmsThis,Boolean Chain,CharPtr SlaveChain)4161 Int2 LIBCALL BiostrucAddFeature(BiostrucFeatureSetPtr pbsfsThis, PDNMS pdnmsThis,
4162 Boolean Chain, CharPtr SlaveChain)
4163 {
4164 BiostrucFeaturePtr pbsfThis = NULL;
4165 PDNSFS pdnsfsThis = NULL;
4166 PSFS psfsThis = NULL;
4167 PSFD psfdThis = NULL;
4168 PMSD pmsdThis = NULL;
4169 PMGD pmgdThis = NULL;
4170 PFB pfbThis = NULL;
4171 ValNodePtr pvnThis = NULL;
4172 DValNodePtr pdvnThis = NULL;
4173 ChemGraphPntrsPtr pcgpThis = NULL;
4174 RegionPntrsPtr prgpThis = NULL;
4175 CharPtr pcThis = NULL;
4176 ValNodePtr pvnList = NULL;
4177 ValNodePtr pvnLoc = NULL;
4178 Byte bSet = 0;
4179 Boolean ncbiSS = FALSE;
4180 Boolean pdbSS = FALSE;
4181 Boolean pdbSite = FALSE;
4182 Boolean pdbFootnote = FALSE;
4183 Boolean ncbiDomain = FALSE;
4184 Boolean ncbiVast = FALSE;
4185 Boolean bTest = FALSE;
4186
4187
4188 #ifdef _DEBUG_9
4189 printf("in BiostrucAddFeature \n");
4190 #endif
4191 if (!pbsfsThis) return 0;
4192 if (!pdnmsThis) return 0;
4193
4194 pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
4195
4196 /* first chore is to make a new feature-set node off this structure */
4197
4198 pdnsfsThis = NewDNSFS(&pmsdThis->pdnsfsHead, pmsdThis->iFeatures+1);
4199 if (!pdnsfsThis) return 0;
4200 pmsdThis->iFeatures++;
4201 psfsThis = (PSFS) pdnsfsThis->data.ptrvalue;
4202 psfsThis->iId = pbsfsThis->id;
4203
4204 /*psfsThis->pvnDescr = (ValNodePtr) pbsfsThis->descr; */ /* link stub for descr */
4205 /*pbsfsThis->descr = NULL; */ /* detach and save from free-ing descr */
4206 /* yanli comment the above two line out, instead do the following */
4207 psfsThis->pvnDescr = (ValNodePtr)AsnIoMemCopy((ValNodePtr) pbsfsThis->descr, (AsnReadFunc)BiostrucFeatureSetDescrAsnRead, (AsnWriteFunc)BiostrucFeatureSetDescrAsnWrite);
4208
4209 pvnThis = NULL;
4210 pvnThis = ValNodeFindNext(psfsThis->pvnDescr, NULL, BiostrucFeatureSetDescr_name);
4211 if (pvnThis)
4212 {
4213 pcThis = (CharPtr) pvnThis->data.ptrvalue;
4214 psfsThis->pcName = StringSave(pcThis);
4215
4216 /* these strings categorize known feature sets that come bundled
4217 with MMDB data */
4218
4219 if (!(StringCmp(pcThis, STRING_NCBI_SS)))
4220 {
4221 ncbiSS = TRUE;
4222 }
4223 if (!(StringCmp(pcThis, STRING_PDB_SS)))
4224 {
4225 pdbSS = TRUE;
4226 }
4227 if (!(StringCmp(pcThis, STRING_PDB_SITE)))
4228 {
4229 pdbSite = TRUE;
4230 }
4231 if (!(StringCmp(pcThis, STRING_PDB_FOOTNOTE)))
4232 {
4233 pdbFootnote = TRUE;
4234 }
4235 if (!(StringCmp(pcThis, STRING_NCBI_DOMAIN)))
4236 {
4237 ncbiDomain = TRUE;
4238 }
4239 if (!(StringCmp(pcThis, STRING_NCBI_VAST)))
4240 {
4241 /* lyg: this no longer works. The id is simply the mmdb # hash of the 2 proteins */
4242 ncbiVast = TRUE;
4243 }
4244 }
4245
4246
4247 pbsfThis = pbsfsThis->features;
4248 while (pbsfThis)
4249 { /* walk through each feature */
4250
4251 if (ncbiSS || pdbSS)
4252 { /* set bytes for secondary strucutre flags */
4253 switch (pbsfThis->type)
4254 {
4255 case Feature_type_helix:
4256 bSet = (Byte) SS_HELIX;
4257 break;
4258 case Feature_type_strand:
4259 bSet = (Byte) SS_STRAND;
4260 break;
4261 case Feature_type_sheet:
4262 bSet = (Byte) (SS_STRAND | SS_SHEET);
4263 break;
4264 case Feature_type_turn:
4265 bSet = (Byte) SS_TURN;
4266 break;
4267 default:
4268 return -1;
4269 }
4270 } /* if bSet - Sec stru to set */
4271
4272 /* Installs feature entry in feature registry */
4273 /* any data is attached and owned by the psfdThis node */
4274
4275 psfdThis = InstallStrucFeature(pdnmsThis, pdnsfsThis, pbsfThis, Chain, SlaveChain);
4276
4277 if (!psfdThis) return 0;
4278
4279 /* this registers the installed feature into the appropriate PFB node(s) */
4280 switch(psfdThis->iType)
4281 {
4282
4283 case Feature_type_alignment:
4284 case Feature_type_multalign:
4285 /* these are already registered */
4286 break;
4287 case Feature_type_similarity:
4288 case Feature_type_region:
4289 case Feature_type_cn3dstate:
4290 case Feature_type_camera:
4291 case Feature_type_script:
4292 /* locations are assumed MSD */
4293 bTest = SetNodeFeatureData((PFB) pmsdThis, psfdThis );
4294 psfdThis->bPFBtype = pmsdThis->bMe; /* set to AM_MSD */
4295
4296 break;
4297 /*
4298 case Feature_type_helix:
4299 case Feature_type_strand:
4300 case Feature_type_sheet:
4301 case Feature_type_turn:
4302 case Feature_type_site:
4303 case Feature_type_footnote:
4304 case Feature_type_subgraph:
4305 case Feature_type_color:
4306 case Feature_type_render:
4307 case Feature_type_comment:
4308 case Feature_type_label:
4309 case Feature_type_transform:
4310 case Feature_type_core:
4311 case Feature_type_supercore:
4312 case Feature_type_other:
4313 */
4314 default:
4315 /* do chem-graph-pointers */
4316 pvnThis = NULL;
4317 pvnThis = ValNodeFindNext(pbsfThis->Location_location, NULL, Location_location_subgraph);
4318 if (pvnThis)
4319 {
4320 pcgpThis = (ChemGraphPntrsPtr) pvnThis->data.ptrvalue;
4321 pvnList = MakeChemGraphNodeList(pdnmsThis, pcgpThis);
4322 if (!pvnList) return -1;
4323 pvnLoc = pvnList;
4324 while (pvnLoc)
4325 {
4326 pfbThis = (PFB) pvnLoc->data.ptrvalue;
4327
4328 /* register feature in each location node */
4329 bTest = SetNodeFeatureData( pfbThis, psfdThis );
4330 if (bTest == FALSE) return 0;
4331 psfdThis->bPFBtype = (psfdThis->bPFBtype | pfbThis->bMe);
4332 /* special case for Sec Stru - set flag bits & strings */
4333 if (ncbiSS || pdbSS || ncbiDomain)
4334 {
4335 pmgdThis = (PMGD) pfbThis;
4336 if (pmgdThis->bMe != AM_MGD) return -1;
4337 if (ncbiSS)
4338 {
4339 pmgdThis->pcNCBISS = psfdThis->pcName;
4340 pmgdThis->bNCBISecStru = pmgdThis->bNCBISecStru | bSet;
4341 }
4342 if (pdbSS)
4343 {
4344 pmgdThis->pcPDBSS = psfdThis->pcName;
4345 pmgdThis->bPDBSecStru = pmgdThis->bPDBSecStru | bSet;
4346 }
4347 if (ncbiDomain)
4348 {
4349 pmgdThis->iDomain = pbsfThis->id;
4350 }
4351 } /* special cases */
4352 pvnLoc = pvnLoc->next;
4353 } /* while pvnLoc */
4354 ValNodeFree(pvnList);
4355 pvnList = NULL;
4356 } /* if pvnThis */
4357
4358
4359 /* do regions */
4360
4361 pvnThis = NULL;
4362 pvnThis = ValNodeFindNext(pbsfThis->Location_location, NULL, Location_location_region);
4363 if (pvnThis)
4364 {
4365 prgpThis = (RegionPntrsPtr) pvnThis->data.ptrvalue;
4366 pvnList = MakeRegionNodeList(pdnmsThis, prgpThis);
4367 if (!pvnList) return -1;
4368 pvnLoc = pvnList;
4369 while (pvnLoc)
4370 {
4371 pfbThis = (PFB) pvnLoc->data.ptrvalue;
4372 /* register feature in each location */
4373 bTest = SetNodeFeatureData( pfbThis, psfdThis);
4374 psfdThis->bPFBtype = (psfdThis->bPFBtype | pfbThis->bMe);
4375 if (bTest == FALSE) return 0;
4376 pvnLoc = pvnLoc->next;
4377 } /* while pvnLoc */
4378 ValNodeFree(pvnList);
4379 pvnList = NULL;
4380 } /* if pvnThis */
4381
4382 } /* switch generic feature-type */
4383
4384 pbsfThis = pbsfThis->next;
4385 } /* while pbsfThis : next feature in feature-set */
4386
4387 /* now that they are instantiated - the caller can delete the ASN.1 forms */
4388 /* of the features - we have kept the descr and other non-volatile elements */
4389 /* like camera's and tranforms, and null-ed out their pointers */
4390
4391 return TRUE;
4392 }
4393
4394
FindGiSeq(ValNodePtr pvnSeqId)4395 static Int4 FindGiSeq(ValNodePtr pvnSeqId)
4396 {
4397 ValNodePtr pvn;
4398 pvn = ValNodeFindNext(pvnSeqId, NULL, SEQID_GI);
4399 if (pvn)
4400 return (Int4) pvn->data.intvalue;
4401 else
4402 return 0;
4403 }
4404
4405
4406
4407
SetBondOrder(Byte bThis,Int2 iType)4408 Byte LIBCALL SetBondOrder(Byte bThis, Int2 iType)
4409 {
4410 switch (iType)
4411 {
4412 case Bond_order_partial_double:
4413 return (Byte)(bThis | BOND_PDOUBLE);
4414 case Bond_order_aromatic:
4415 return (Byte)(bThis | BOND_PDOUBLE | BOND_DOUBLE);
4416 case Bond_order_double:
4417 return (Byte)(bThis | BOND_DOUBLE);
4418 case Bond_order_triple:
4419 return (Byte)(bThis | BOND_TRIPLE);
4420 case Bond_order_other:
4421 case Bond_order_unknown:
4422 return bThis;
4423 case Bond_order_single:
4424 default:
4425 bThis = (Byte)(bThis | BOND_SINGLE);
4426 }
4427 return bThis;
4428 }
4429
4430
4431 /*
4432 * Biostruc2Modelstruc is the main routine to fetch and convert a
4433 * Biostruc into Modelstruc form - which is a hybrid ASN.1 / hand
4434 * made data structure.
4435 *
4436 */
4437
4438
4439
4440
4441
Biostruc2Modelstruc(PDNMS PNTR ppdnmsList,BiostrucPtr pbsBS,PRGD prgdDict,Byte bExtent,Int2 iChoice,CharPtr pcFetch,Int2 iType)4442 PDNMS LIBCALL Biostruc2Modelstruc(PDNMS PNTR ppdnmsList, BiostrucPtr pbsBS, PRGD prgdDict,
4443 Byte bExtent, Int2 iChoice,
4444 CharPtr pcFetch, Int2 iType)
4445 /* pdnmsList is the master list of structures or NULL for first */
4446 /* if pbsBS = NULL - use the pcFetch functions.. */
4447 {
4448 BiostrucModelPtr pbsmThis = NULL;
4449 IntraResidueBondPtr pirbThis = NULL;
4450 InterResidueBondPtr pierbThis = NULL;
4451 ValNodePtr pvnThis = NULL;
4452 AtomPntrPtr papIndex = NULL;
4453
4454 PDNMS pdnmsThis = NULL;
4455 PMSD pmsdThis = NULL;
4456 PDNMM pdnmmThis = NULL;
4457 PDNMM pdnmmPrev = NULL;
4458 PMMD pmmdThis = NULL;
4459 PDNMG pdnmgThis = NULL;
4460 PDNMG pdnmgPrev = NULL;
4461 PMGD pmgdThis = NULL;
4462 PVNMA pvnmaThis = NULL;
4463 PVNMA pvnmaPrev = NULL;
4464 PMAD pmadThis = NULL;
4465 PVNMB pvnmbThis = NULL;
4466 PVNMB pvnmbPrev = NULL;
4467 PMBD pmbdThis = NULL;
4468 Int2 iTest = TRUE;
4469 Int4 iGraphId = 0;
4470
4471
4472 Int4 iMolCount = 0;
4473 Int4 iResCount = 0;
4474 Int4 iAtomCount = 0;
4475 Int4 iBondCount = 0;
4476 Int4 iModelCount = 0;
4477
4478 /* version 4.0 additions */
4479 BiostrucIdPtr pbsidThis = NULL;
4480 BiostrucDescrPtr pbsdrThis = NULL;
4481 BiomolDescrPtr pbmdrThis = NULL;
4482 MoleculeGraphPtr pmgThis = NULL;
4483 ResiduePtr prThis = NULL;
4484 ValNodePtr pvnrgThis = NULL; /* a ValNodePtr */
4485 ResidueGraphPtr prgDict = NULL; /* a ValNodePtr */
4486 ValNodePtr pvnStrings = NULL;
4487 AtomPtr pAtom;
4488 BiostrucFeatureSetPtr pbsfsThis = NULL;
4489 BiostrucResidueGraphSetPntrPtr ppdDict = NULL;
4490
4491 Int4 iMolGraphType = 0;
4492
4493
4494 /* ErrSetFatalLevel - allow malloc failure to return */
4495 #ifdef _DEBUG_0
4496 printf("Biostruc2Modelstruc\n");
4497 #endif
4498 if (!pbsBS) pbsBS = FetchBS(pcFetch,iType, ALLMDL,3000,bExtent);
4499
4500
4501 /* traverse the chemical graph to make C memory
4502 * strucures */
4503
4504 if (pbsBS)
4505 {
4506
4507 pdnmsThis = NewDNMS(ppdnmsList, iChoice);
4508 if (!pdnmsThis) goto allocerror;
4509 pmsdThis = (PMSD) pdnmsThis->data.ptrvalue; /*set the pointer to the data */
4510
4511 pmsdThis->pdnmsSlaves = NULL;
4512 pmsdThis->bAligned = 0; /* nothing aligned to it */
4513 pmsdThis->pbAligned = NULL;
4514 pmsdThis->bMaster = TRUE; /* default to being a master structure */
4515 pmsdThis->iMimeType = 0;
4516
4517 /* non-MMDB dependent info */
4518 pmsdThis->pcSName = StringSave(pcFetch);
4519 pmsdThis->iType = iType; /* copy iType also used in fetch for future ref */
4520
4521 /* MMDB dependent stuff */
4522
4523
4524 pbsidThis = ValNodeFindNext(pbsBS->id,NULL,BiostrucId_mmdb_id);
4525 if (pbsidThis)
4526 {
4527 pmsdThis->iMMDBid = (Int4) pbsidThis->data.intvalue; /* Get MMDB id no (only the first one) */
4528 }
4529 else
4530 {
4531 ; /* assign it a hashed ID number based on iChoice?? */
4532 }
4533 pbsdrThis = ValNodeFindNext(pbsBS->descr,NULL,BiostrucDescr_name);
4534 /* just want the first one */
4535 pmsdThis->pcPDBName = StringSave(PDBNAME_DEFAULT);
4536 if (pbsdrThis)
4537 {
4538 StringNCpy(pmsdThis->pcPDBName,(CharPtr) pbsdrThis->data.ptrvalue, sizeof(pmsdThis->pcPDBName));
4539 }
4540 #ifdef _DEBUG_0
4541 printf("[%d]id [%s] pdb\n",pmsdThis->iMMDBid,pmsdThis->pcPDBName);
4542 printf("<%s>\n",pmsdThis->pcSName);
4543 #endif
4544 /* ATTACH THE ENTIRE Biostruc */
4545 pmsdThis->pbsBS = pbsBS;
4546
4547 /* the chemical_graph and model_structure portions are erased at the end */
4548
4549 pmsdThis->pGraphDescr = pbsBS->chemical_graph->descr; /* save the chem-graph descr (ValNode) */
4550 pmsdThis->bVisible = 1; /* can be seen */
4551 pbmdrThis = ValNodeFindNext(pbsBS->chemical_graph->descr, NULL, BiomolDescr_name);
4552 if (pbmdrThis)
4553 {
4554 pmsdThis->pcChemName = StringSave((CharPtr)pbmdrThis->data.ptrvalue);
4555 }
4556 else
4557 {
4558 pmsdThis->pcChemName = StringSave(STRING_UNK_PDB);
4559 }
4560
4561 pbmdrThis = ValNodeFindNext(pbsBS->chemical_graph->descr, NULL, BiomolDescr_pdb_class);
4562 if (pbmdrThis)
4563 {
4564 pmsdThis->pcPdbClass = StringSave((CharPtr)pbmdrThis->data.ptrvalue);
4565 }
4566 else
4567 {
4568 pmsdThis->pcPdbClass = StringSave(STRING_UNK_PDB);
4569 }
4570
4571 pbmdrThis = ValNodeFindNext(pbsBS->chemical_graph->descr, NULL, BiomolDescr_pdb_source);
4572 if (pbmdrThis)
4573 {
4574 pmsdThis->pcPdbSource = StringSave((CharPtr)pbmdrThis->data.ptrvalue);
4575 }
4576 else
4577 {
4578 pmsdThis->pcPdbSource = StringSave(STRING_UNK_PDB);
4579 }
4580
4581 pbmdrThis = ValNodeFindNext(pbsBS->chemical_graph->descr, NULL, BiomolDescr_assembly_type);
4582 if (pbmdrThis)
4583 {
4584 pmsdThis->iPDBType = (Int2) pbmdrThis->data.intvalue;
4585 }
4586 else
4587 {
4588 pmsdThis->iPDBType = Assembly_Type_Other;
4589 }
4590
4591 pbsBS->chemical_graph->descr = NULL; /* stops the free-er from killing it prematurely */
4592
4593
4594 #ifdef _DEBUG_0
4595 printf("{%s} pcChemName \n", pmsdThis->pcChemName);
4596 printf("{%s} pcPdbClass \n", pmsdThis->pcPdbClass);
4597 printf("{%s} pcPdbSource\n", pmsdThis->pcPdbSource);
4598 #endif
4599
4600 /* flesh-out the chemical graph */
4601 pmgThis = pbsBS->chemical_graph->molecule_graphs;
4602 ProgMon("Instantiating Chemical Graph");
4603 while (pmgThis) /* walk up the molecule_graphs */
4604 {
4605 iMolCount++;
4606 iResCount = 0;
4607 pdnmmPrev = pdnmmThis;
4608 pdnmmThis = NewDNMM(NULL, (Int2) pmgThis->id);
4609 if (!pdnmmThis) goto allocerror;
4610 pmmdThis = (PMMD) pdnmmThis->data.ptrvalue; /*set the pointer to the data */
4611 pmmdThis->pfbParent = (PFB) pmsdThis;
4612
4613 /* turn off the selection. lyg */
4614 pmmdThis->pdnmgStartSelect = NULL;
4615 pmmdThis->pdnmgEndSelect = NULL;
4616
4617 /* get the sequence for each one */
4618 pmmdThis->iChainId = pmgThis->id;
4619 #ifdef _DEBUG_0
4620 printf("\n<%d> ChainId ", pmmdThis->iChainId);
4621 #endif
4622 /* this gets chain names, like A,B etc... */
4623
4624 pbmdrThis = ValNodeFindNext(pmgThis->descr, NULL, BiomolDescr_name);
4625 if (pbmdrThis)
4626 {
4627 pmmdThis->pcMolName = StringSave((CharPtr)pbmdrThis->data.ptrvalue);
4628 }
4629 else
4630 {
4631 pmmdThis->pcMolName = StringSave(STRING_UNK_MOL);
4632 }
4633
4634 #ifdef _DEBUG_0
4635 printf("'%s' name \n", pmmdThis->pcMolName);
4636 #endif
4637
4638
4639 pbmdrThis = ValNodeFindNext(pmgThis->descr, NULL, BiomolDescr_molecule_type);
4640 if (pbmdrThis)
4641 {
4642 iMolGraphType = (Int4) pbmdrThis->data.intvalue;
4643 }
4644 else
4645 {
4646 iMolGraphType = Molecule_type_other;
4647 }
4648
4649 pmmdThis->pMolDescr = pmgThis->descr; /* save molecule descr */
4650 pmgThis->descr = NULL; /* stops from premature free-ing when chem-graph turfed */
4651
4652 switch (iMolGraphType)
4653 {
4654 case Molecule_type_dna:
4655 #ifdef _DEBUG_2
4656 printf("dna ");
4657 #endif
4658 pmmdThis->bWhat = (Byte) AM_DNA;
4659 pmsdThis->bWhat = (Byte) (pmsdThis->bWhat | (Byte) AM_DNA);
4660 pmmdThis->iGi = FindGiSeq(pmgThis->seq_id);
4661 break;
4662 case Molecule_type_rna:
4663 #ifdef _DEBUG_2
4664 printf("rna ");
4665 #endif
4666 pmmdThis->bWhat = (Byte) AM_RNA;
4667 pmsdThis->bWhat = (Byte) (pmsdThis->bWhat | (Byte) AM_RNA);
4668 pmmdThis->iGi = FindGiSeq(pmgThis->seq_id);
4669
4670 break;
4671 case Molecule_type_protein:
4672 #ifdef _DEBUG_2
4673 printf("protein ");
4674 #endif
4675
4676 pmmdThis->bWhat = (Byte) AM_PROT;
4677 pmsdThis->bWhat = (Byte) (pmsdThis->bWhat | (Byte) AM_PROT);
4678 pmmdThis->iGi = FindGiSeq(pmgThis->seq_id);
4679
4680 break;
4681 case Molecule_type_other_biopolymer:
4682 #ifdef _DEBUG_2
4683 printf("other biopolymer ");
4684 #endif
4685 pmmdThis->bWhat = (Byte) AM_POLY;
4686 pmsdThis->bWhat = (Byte) (pmsdThis->bWhat | (Byte)AM_POLY);
4687 break;
4688 case Molecule_type_solvent:
4689 #ifdef _DEBUG_2
4690 printf("solvent ");
4691 #endif
4692 pmmdThis->bWhat = (Byte) AM_SOL;
4693 pmsdThis->bWhat = (pmsdThis->bWhat | (Byte) AM_SOL);
4694 break;
4695 case Molecule_type_other_nonpolymer:
4696 #ifdef _DEBUG_2
4697 printf("other ");
4698 #endif
4699 pmmdThis->bWhat = (Byte) AM_HET;
4700 pmsdThis->bWhat = (pmsdThis->bWhat | (Byte) AM_HET);
4701 break;
4702 case Molecule_type_other:
4703 default:
4704 #ifdef _DEBUG_2
4705 printf("unknown ");
4706 #endif
4707 pmmdThis->bWhat = (Byte) AM_UNK;
4708 pmsdThis->bWhat = (pmsdThis->bWhat | (Byte) AM_UNK);
4709 } /*switch*/
4710
4711 pmmdThis->pSeqId = pmgThis->seq_id;
4712 pmgThis->seq_id = NULL; /* copies & protects the ASN.1 seq_id */
4713
4714
4715
4716 prThis = pmgThis->residue_sequence;
4717
4718 while (prThis)
4719 { /* flesh - out the molecule graphs residue-by-residue */
4720 ProgMon("Instantiating Chemical Graph");
4721 iResCount++;
4722 iAtomCount = 0;
4723 iBondCount = 0;
4724 pdnmgPrev = pdnmgThis;
4725 pdnmgThis = NewDNMG(NULL,(Int2) prThis->id);
4726 if (!pdnmgThis) goto allocerror;
4727 pmgdThis = (PMGD) pdnmgThis->data.ptrvalue; /*set the pointer to the data */
4728 pmgdThis->pfbParent = (PFB) pmmdThis;
4729 pmgdThis->pcGraphNum = StringSave(prThis->name);
4730 #ifdef _DEBUG_1
4731 printf(":%s: PDB No ", pmgdThis->pcGraphNum);
4732 #endif
4733
4734
4735 pvnrgThis = prThis->residue_graph;
4736 /* USE ENTREZ-FETCH TO GET REF-ED BIOSTRUCS */
4737 switch (pvnrgThis->choice)
4738 {
4739 case ResidueGraphPntr_local:
4740 prgDict = pbsBS->chemical_graph->residue_graphs;
4741 iGraphId = (Int4) pvnrgThis->data.intvalue;
4742 pmsdThis->pDictLocal = prgDict;
4743 pmgdThis->bWhat = (Byte) (pmgdThis->bWhat | (Byte) DICT_LOCAL);
4744 break;
4745 case ResidueGraphPntr_standard:
4746 /* get the id of the graph to lookup */
4747 ppdDict = (BiostrucResidueGraphSetPntrPtr) pvnrgThis->data.ptrvalue;
4748 iGraphId = (Int4) ppdDict->residue_graph_id;
4749 pmgdThis->bWhat = (Byte) (pmgdThis->bWhat | (Byte) DICT_GLOBAL);
4750 /* ****use the dictionary id to get the right global dictionary */
4751 prgDict = prgdDict->residue_graphs; /* the one passed as a parameter */
4752 break;
4753 case ResidueGraphPntr_biostruc:
4754 default:
4755 prgDict = NULL;
4756 pmgdThis->bWhat = (Byte) (pmgdThis->bWhat | (Byte) DICT_REF);
4757
4758 }
4759 while (prgDict)
4760 {
4761
4762 if (prgDict->id == iGraphId)
4763 {
4764 /* found the right dictionary entry */
4765 pbmdrThis = ValNodeFindNext(prgDict->descr, NULL, BiomolDescr_name);
4766 if (pbmdrThis)
4767 {
4768 pmgdThis->pcGraphName = StringSave((CharPtr)pbmdrThis->data.ptrvalue);
4769 }
4770 else
4771 {
4772 pmgdThis->pcGraphName = StringSave(STRING_UNK_RES);
4773 }
4774 pbmdrThis = ValNodeFindNext(prgDict->descr, NULL, BiomolDescr_pdb_comment);
4775 if (pbmdrThis)
4776 {
4777 pmgdThis->pcPDBComment = StringSave((CharPtr) pbmdrThis->data.ptrvalue);
4778 }
4779 pvnStrings = prgDict->iupac_code;
4780 if (pvnStrings) /* only interpret the first one!!! */
4781 {
4782 pmgdThis->pcIUPAC = StringSave((CharPtr)pvnStrings->data.ptrvalue);
4783 }
4784
4785 #ifdef _DEBUG_1
4786 printf("@%s@%s@",pmgdThis->pcIUPAC, pmgdThis->pcGraphName);
4787 #endif
4788
4789 switch(prgDict->residue_type)
4790 {
4791 case Residue_deoxyribonucleotide:
4792 pmgdThis->bWhat = (Byte) (pmgdThis->bWhat | (Byte) RES_DNA);
4793 break;
4794 case Residue_ribonucleotide:
4795 pmgdThis->bWhat = (Byte) (pmgdThis->bWhat | (Byte) RES_RNA);
4796 break;
4797 case Residue_amino_acid:
4798 pmgdThis->bWhat = (Byte) (pmgdThis->bWhat | (Byte) RES_AA);
4799 break;
4800 case Residue_other:
4801 default:
4802 ;
4803 }
4804 pmgdThis->iIDict = iGraphId;
4805 pAtom = prgDict->atoms;
4806 while (pAtom)
4807 {
4808 iAtomCount++;
4809 pvnmaPrev = pvnmaThis;
4810 if (pAtom->element < 254)
4811 pvnmaThis = NewVNMA(NULL, (Int2) pAtom->element);
4812 else
4813 {
4814 if (pAtom->element == 254)
4815 pvnmaThis = NewVNMA(NULL, 0);
4816 else /* bigger usually is 255 */
4817 pvnmaThis = NewVNMA(NULL, (Int2) INT1_MAX);
4818 }
4819 if (!pvnmaThis) goto allocerror;
4820 pmadThis = (PMAD) pvnmaThis->data.ptrvalue;
4821 pmadThis->pfbParent = (PFB) pmgdThis;
4822 pmadThis->iIndex = (Int2) pAtom->id;
4823 /**/ pmadThis->pcAName = pAtom->name;
4824 /* note the name is still in the dictionary !!*/
4825 /* no link back to dictionary source and
4826 * no link back to the iupac_code valnode list
4827 * as this is redundant with the element lookup table
4828 * and more compact to save an Int1 element number
4829 * for each atom
4830 */
4831 #ifdef _DEBUG_1
4832 printf(" ^%s^ ", pmadThis->pcAName);
4833 #endif
4834
4835 pAtom = pAtom->next;
4836 if (iAtomCount == 1) pmgdThis->pvnmaAHead = pvnmaThis; /* first case */
4837 else ValNodeListCat(pvnmaPrev, pvnmaThis);
4838 /* faster linking with pvnmaPrev - dosen't have to walk the chain... */
4839 }
4840
4841
4842
4843 /* do intra-residue bonds here */
4844 pirbThis = prgDict->bonds;
4845 while (pirbThis)
4846 {
4847 iBondCount++;
4848 pvnmbPrev = pvnmbThis;
4849 pvnmbThis = NewVNMB(NULL, (Int2) pirbThis->bond_order);
4850
4851 if (!pvnmbThis) goto allocerror;
4852 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
4853 pmbdThis->pfbParent = (PFB) pmgdThis;
4854 pmbdThis->bWhat = SetBondOrder(pmbdThis->bWhat,
4855 (Int2)pirbThis->bond_order);
4856 /* register the bond in both the MBD and MAD */
4857 pvnmaThis = pmgdThis->pvnmaAHead;
4858
4859 while (pvnmaThis)
4860 {
4861 pmadThis = (PMAD) pvnmaThis->data.ptrvalue;
4862 if (pmadThis->iIndex == (Int2) pirbThis->atom_id_1)
4863 {
4864 pmbdThis->pmadFrom = pmadThis;
4865 pvnThis = ValNodeAddPointer(&pmadThis->pvnBonds,
4866 (Int2) pirbThis->bond_order, (Nlm_VoidPtr) pmbdThis);
4867 if (!pvnThis) goto allocerror;
4868
4869 }
4870 if (pmadThis->iIndex == (Int2) pirbThis->atom_id_2)
4871 {
4872 pmbdThis->pmadTo = pmadThis;
4873 pvnThis = ValNodeAddPointer(&pmadThis->pvnBonds,
4874 (Int2) pirbThis->bond_order, (Nlm_VoidPtr) pmbdThis);
4875 if (!pvnThis) goto allocerror;
4876 }
4877 pvnmaThis = pvnmaThis->next;
4878
4879 } /* while (pvnmaThis) */
4880 /* check that pmadFrom and pmadTo are filled */
4881 #ifdef _DEBUG_1
4882 printf("\nbond from %s to %s ", pmbdThis->pmadFrom->pcAName,
4883 pmbdThis->pmadTo->pcAName);
4884 #endif
4885 pirbThis = pirbThis->next;
4886 if (iBondCount == 1) pmgdThis->pvnmbBHead = pvnmbThis; /* first case */
4887 else ValNodeListCat(pvnmbPrev, pvnmbThis);
4888 /* faster linking with pvnmbPrev - dosen't have to walk the chain... */
4889 } /* while (pirbThis) */
4890 break; /* out of while (prgDict) */
4891 }
4892 prgDict = prgDict->next;
4893 } /* while (prgDict) */
4894 if (!pmgdThis->iIDict) goto erret; /* dictionary failed to resolve an ID */
4895 pmgdThis->iAtomCount = iAtomCount;
4896 pmgdThis->iBondCount = iBondCount;
4897 if (iResCount == 1) pmmdThis->pdnmgHead = pdnmgThis; /* link first case */
4898 else DValNodeListCat(pdnmgPrev, pdnmgThis); /* link it on */
4899 prThis = prThis->next;
4900 } /* while (prThis) */
4901 /* put in error messages when not got sequence
4902 */
4903 pmmdThis->iResCount = iResCount;
4904 if (iMolCount == 1) pmsdThis->pdnmmHead = pdnmmThis;
4905 /* link first case */
4906 else DValNodeListCat(pdnmmPrev,pdnmmThis); /* link it on */
4907 /* the molecule must be linked onto the structure
4908 * or the AtomFromMMDBIndex won't find it...
4909 */
4910 iBondCount = 0;
4911 pvnmbPrev = NULL;
4912 pierbThis = pmgThis->inter_residue_bonds;
4913 while (pierbThis)
4914 { /* ... fill in the inter_residue_bonds list... */
4915 iBondCount++;
4916 pvnmbPrev = pvnmbThis;
4917 pvnmbThis = NewVNMB(NULL, (Int2) pierbThis->bond_order);
4918
4919 if (!pvnmbThis) goto allocerror;
4920 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
4921 pmbdThis->pfbParent = (PFB) pmmdThis;
4922 pmbdThis->bWhat = SetBondOrder(pmbdThis->bWhat,
4923 (Int2)pierbThis->bond_order);
4924 /* register the bond in both the MBD and MAD */
4925
4926 papIndex = pierbThis->atom_id_1;
4927 pmadThis = AtomFromMMDBIndex(pdnmsThis, iChoice, papIndex->molecule_id,
4928 papIndex->residue_id, papIndex->atom_id);
4929 if (pmadThis) pmbdThis->pmadFrom = pmadThis;
4930 else goto erret;
4931 pvnThis = ValNodeAddPointer(&pmadThis->pvnBonds,
4932 (Int2) pierbThis->bond_order, (Nlm_VoidPtr) pmbdThis);
4933 if (!pvnThis) goto allocerror;
4934
4935 papIndex = pierbThis->atom_id_2;
4936 pmadThis = AtomFromMMDBIndex(pdnmsThis, iChoice, papIndex->molecule_id,
4937 papIndex->residue_id, papIndex->atom_id);
4938 if (pmadThis) pmbdThis->pmadTo = pmadThis;
4939 else goto erret;
4940 pvnThis = ValNodeAddPointer(&pmadThis->pvnBonds,
4941 (Int2) pierbThis->bond_order, (Nlm_VoidPtr) pmbdThis);
4942 if (!pvnThis) goto allocerror;
4943
4944 /* check that pmadFrom and pmadTo are filled */
4945 #ifdef _DEBUG_1
4946 printf("\nINTER-RES bond from %s to %s ", pmbdThis->pmadFrom->pcAName,
4947 pmbdThis->pmadTo->pcAName);
4948 #endif
4949 if (iBondCount == 1) pmmdThis->pvnmbIRBHead = pvnmbThis; /* first case */
4950 else ValNodeListCat(pvnmbPrev, pvnmbThis);
4951 pierbThis = pierbThis->next;
4952 } /* while (pierbThis) */
4953 pmgThis = pmgThis->next;
4954 pmmdThis->iIRBCount = iBondCount;
4955 } /*while (pmgThis) */
4956 pierbThis = pbsBS->chemical_graph->inter_molecule_bonds;
4957 iBondCount = 0;
4958 pvnmbPrev = NULL;
4959 while (pierbThis)
4960 { /* ... fill in the inter_molecule_bonds list... */
4961 iBondCount++;
4962 pvnmbPrev = pvnmbThis;
4963 pvnmbThis = NewVNMB(NULL, (Int2) pierbThis->bond_order);
4964
4965 if (!pvnmbThis) goto allocerror;
4966 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
4967 pmbdThis->pfbParent = (PFB) pmsdThis;
4968 pmbdThis->bWhat = SetBondOrder(pmbdThis->bWhat,
4969 (Int2)pierbThis->bond_order);
4970 /* register the bond in both the MBD and MAD */
4971
4972 papIndex = pierbThis->atom_id_1;
4973 pmadThis = AtomFromMMDBIndex(pdnmsThis, iChoice, papIndex->molecule_id,
4974 papIndex->residue_id, papIndex->atom_id);
4975 if (pmadThis) pmbdThis->pmadFrom = pmadThis;
4976 else goto erret;
4977 pvnThis = ValNodeAddPointer(&pmadThis->pvnBonds,
4978 (Int2) pierbThis->bond_order, (Nlm_VoidPtr) pmbdThis);
4979 if (!pvnThis) goto allocerror;
4980
4981 papIndex = pierbThis->atom_id_2;
4982 pmadThis = AtomFromMMDBIndex(pdnmsThis, iChoice, papIndex->molecule_id,
4983 papIndex->residue_id, papIndex->atom_id);
4984 if (pmadThis) pmbdThis->pmadTo = pmadThis;
4985 else goto erret;
4986 pvnThis = ValNodeAddPointer(&pmadThis->pvnBonds,
4987 (Int2) pierbThis->bond_order, (Nlm_VoidPtr) pmbdThis);
4988 if (!pvnThis) goto allocerror;
4989
4990 /* check that pmadFrom and pmadTo are filled */
4991 #ifdef _DEBUG_1
4992 printf("\nINTER-MOL bond from %s to %s ", pmbdThis->pmadFrom->pcAName,
4993 pmbdThis->pmadTo->pcAName);
4994 #endif
4995
4996 if (iBondCount == 1) pmsdThis->pvnmbIMBHead = pvnmbThis; /* first case */
4997 else ValNodeListCat(pvnmbPrev, pvnmbThis);
4998 pierbThis = pierbThis->next;
4999 } /* while (pierbThis) */
5000
5001
5002 pmsdThis->iMolCount = iMolCount;
5003 pmsdThis->iIMBCount = iBondCount;
5004
5005 /* REMOVE ALL BUT THE {id, descr, history} PART OF pbsBS */
5006 /* TURF THE CHEMICAL GRAPH (NOT A SEQUENCE) */
5007 /* keep Local Dict from destruction when I turf the chem graph */
5008 if (pbsBS->chemical_graph->residue_graphs)
5009 pbsBS->chemical_graph->residue_graphs = NULL;
5010 BiostrucGraphFree(pbsBS->chemical_graph);
5011 pbsBS->chemical_graph = NULL;
5012
5013 /* Set up the Internal Feature Set */
5014 pbsfsThis = pbsBS->features;
5015 while (pbsfsThis)
5016 {
5017 iTest = BiostrucAddFeature(pbsfsThis, pdnmsThis, FALSE, NULL);
5018 if (iTest < 0) goto erret;
5019 if (!iTest) goto allocerror;
5020 pbsfsThis=pbsfsThis->next;
5021 }
5022 /* blow away the internal Feature Set ASN.1 */
5023 /* BiostrucFeatureSetFree(pbsfsThis);
5024 pbsBS->features = NULL; */
5025 /* stubs to reconstruc Feature-set descr fields remain */
5026 /* as well as feature-contents */
5027
5028 /* CONVERT all Models one at a time */
5029 pbsmThis = pbsBS->model;
5030 while (pbsmThis)
5031 {
5032 iModelCount++;
5033 iTest = BiostrucModel2ModelStruc(pbsmThis,pdnmsThis,iChoice, iModelCount, bExtent);
5034 if (iTest < 0) goto erret;
5035 if (iTest == 0) goto allocerror;
5036 pmsdThis->iModels++;
5037 pbsmThis = pbsmThis->next;
5038 }
5039 /* The Biostruc owns the models - they are always kept and are always freed at pbsBS level */
5040 /* if not keeping ASN.1 the coordinates are all stripped out in the next routine */
5041 /* but the model stubs still remain */
5042 } /* if pbsBS */
5043
5044
5045 return pdnmsThis;
5046
5047 allocerror:
5048 ErrClear();
5049 ErrPostEx(SEV_ERROR,0,0, "Not enough memory to handle Biostruc\nFreeing Biostruc");
5050 ErrShow();
5051 FreeListDNMS(pdnmsThis);
5052 MsgAlert(KEY_NONE,SEV_ERROR, "Biostruc to Modelstruc Failed",
5053 "\nBiostruc was removed from memory.\nTry again with smaller or fewer Models.");
5054 return NULL;
5055
5056 erret:
5057 ErrClear();
5058 ErrPostEx(SEV_ERROR,0,0, "Biostruc ASN.1 Internal Indexing Failure\nFreeing Biostruc");
5059 ErrShow();
5060 FreeListDNMS(pdnmsThis);
5061 return NULL;
5062
5063 }
5064
5065
5066 /* TraverseAll
5067 *
5068 * Arguments:
5069 * pdnModel = a DValNode pointer USED for MSD, MMD, MGD.
5070 * You cannot begin traversal at terminal nodes
5071 * MAD,MBD,MOD,MDD.
5072 * iIndex = any index to be passed to pfnCallme
5073 *
5074 * ptr = any pointer to be passed to pfnCallme
5075 * pfnCallMe = The callback to be performed at every node.
5076 *
5077 */
5078
5079
TraverseAll(DValNodePtr pdnModel,Int4 iModel,Int4 iIndex,Pointer ptr,pNodeFunc pfnCallMe)5080 Int2 LIBCALL TraverseAll( DValNodePtr pdnModel, Int4 iModel, Int4 iIndex,
5081 Pointer ptr, pNodeFunc pfnCallMe)
5082 /* Walks the structure children from the current pointer. Performs
5083 (*pfnCallMe)((PFB) pxxxxThis, Int4 iMode, Int4 iIndex, Pointer ptr) at each data node
5084 (as Flags Block). callbacks are void return types.
5085
5086 */
5087 {
5088 PFB pfbThis;
5089 PDNMS pdnmsThis = NULL;
5090 PMSD pmsdThis = NULL;
5091 PDNMM pdnmmThis = NULL;
5092 PMMD pmmdThis = NULL;
5093 PDNMG pdnmgThis = NULL;
5094 PMGD pmgdThis = NULL;
5095 PVNMA pvnmaThis = NULL;
5096 PMAD pmadThis = NULL;
5097 PVNMB pvnmbThis = NULL;
5098 PMBD pmbdThis = NULL;
5099 PVNMO pvnmoThis = NULL;
5100 PMOD pmodThis = NULL;
5101 PVNMD pvnmdThis = NULL;
5102 PMDD pmddThis = NULL;
5103 if (pdnModel)
5104 pfbThis = (PFB) pdnModel->data.ptrvalue; /* get the data block */
5105 else return FALSE;
5106 switch ((int)pfbThis->bMe) /* set the proper type */
5107 {
5108 case AM_MSD:
5109 pdnmsThis = (PDNMS) pdnModel;
5110 break;
5111 case AM_MMD:
5112 pdnmmThis = (PDNMM) pdnModel;
5113 break;
5114 case AM_MGD:
5115 pdnmgThis = (PDNMM) pdnModel;
5116 break;
5117 default:
5118 return FALSE;
5119 }
5120
5121 if (pdnmgThis)
5122 {
5123 while(pdnmgThis)
5124 { /*graph*/
5125 pmgdThis = (PMGD) pdnmgThis->data.ptrvalue;
5126 (*pfnCallMe)((PFB) pmgdThis, iModel, iIndex, ptr); /* do the callback */
5127 pvnmaThis = pmgdThis->pvnmaAHead;
5128 while (pvnmaThis)
5129 { /*atom*/
5130 pmadThis = (PMAD) pvnmaThis->data.ptrvalue;
5131 (*pfnCallMe)((PFB) pmadThis, iModel, iIndex, ptr); /* do the callback */
5132
5133 pvnmaThis = pvnmaThis->next;
5134 } /*atom*/
5135 pvnmbThis = pmgdThis->pvnmbBHead;
5136 while (pvnmbThis)
5137 { /*bond*/
5138 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
5139 (*pfnCallMe)((PFB) pmbdThis, iModel, iIndex, ptr); /* do the callback */
5140
5141
5142 pvnmbThis = pvnmbThis->next;
5143 } /*bond*/
5144
5145 pdnmgThis = pdnmgThis->next;
5146 }/*graph*/
5147 return TRUE;
5148 } /* if pdnmgThis */
5149 if (pdnmmThis)
5150 {
5151 while(pdnmmThis)
5152 { /*molecule*/
5153 pmmdThis = (PMMD) pdnmmThis->data.ptrvalue;
5154 (*pfnCallMe)((PFB) pmmdThis, iModel, iIndex, ptr); /* do the callback */
5155 pdnmgThis = pmmdThis->pdnmgHead;
5156 while(pdnmgThis)
5157 { /*graph*/
5158 pmgdThis = (PMGD) pdnmgThis->data.ptrvalue;
5159 (*pfnCallMe)((PFB) pmgdThis, iModel, iIndex, ptr); /* do the callback */
5160 pvnmaThis = pmgdThis->pvnmaAHead;
5161 while (pvnmaThis)
5162 { /*atom*/
5163 pmadThis = (PMAD) pvnmaThis->data.ptrvalue;
5164 (*pfnCallMe)((PFB) pmadThis, iModel, iIndex, ptr); /* do the callback */
5165
5166 pvnmaThis = pvnmaThis->next;
5167 } /*atom*/
5168 pvnmbThis = pmgdThis->pvnmbBHead;
5169 while (pvnmbThis)
5170 { /*bond*/
5171 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
5172 (*pfnCallMe)((PFB) pmbdThis, iModel, iIndex, ptr); /* do the callback */
5173
5174
5175 pvnmbThis = pvnmbThis->next;
5176 } /*bond*/
5177
5178 pdnmgThis = pdnmgThis->next;
5179 }/*graph*/
5180 /* traverse inter-residue bonds */
5181 pvnmbThis = pmmdThis->pvnmbIRBHead;
5182 while (pvnmbThis)
5183 { /* inter-residue bonds */
5184 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
5185 (*pfnCallMe)((PFB) pmbdThis, iModel, iIndex, ptr); /* do the callback */
5186
5187 pvnmbThis = pvnmbThis->next;
5188 }
5189 pdnmmThis = pdnmmThis->next;
5190 } /*molecule*/
5191 return TRUE;
5192 } /* if pdnmmThis */
5193 if (pdnmsThis)
5194 {
5195 pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
5196 (*pfnCallMe)((PFB) pmsdThis, iModel, iIndex, ptr); /* do the callback */
5197 pdnmmThis = pmsdThis->pdnmmHead;
5198 while(pdnmmThis)
5199 { /*molecule*/
5200 pmmdThis = (PMMD) pdnmmThis->data.ptrvalue;
5201 (*pfnCallMe)((PFB) pmmdThis, iModel, iIndex, ptr); /* do the callback */
5202 pdnmgThis = pmmdThis->pdnmgHead;
5203 while(pdnmgThis)
5204 { /*graph*/
5205 pmgdThis = (PMGD) pdnmgThis->data.ptrvalue;
5206 (*pfnCallMe)((PFB) pmgdThis, iModel, iIndex, ptr); /* do the callback */
5207 pvnmaThis = pmgdThis->pvnmaAHead;
5208 while (pvnmaThis)
5209 { /*atom*/
5210 pmadThis = (PMAD) pvnmaThis->data.ptrvalue;
5211 (*pfnCallMe)((PFB) pmadThis, iModel, iIndex, ptr); /* do the callback */
5212
5213 pvnmaThis = pvnmaThis->next;
5214 } /*atom*/
5215 pvnmbThis = pmgdThis->pvnmbBHead;
5216 while (pvnmbThis)
5217 { /*bond*/
5218 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
5219 (*pfnCallMe)((PFB) pmbdThis, iModel, iIndex, ptr); /* do the callback */
5220
5221
5222 pvnmbThis = pvnmbThis->next;
5223 } /*bond*/
5224
5225 pdnmgThis = pdnmgThis->next;
5226 }/*graph*/
5227 /* traverse inter-residue bonds */
5228 pvnmbThis = pmmdThis->pvnmbIRBHead;
5229 while (pvnmbThis)
5230 { /* inter-residue bonds */
5231 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
5232 (*pfnCallMe)((PFB) pmbdThis, iModel, iIndex, ptr); /* do the callback */
5233
5234 pvnmbThis = pvnmbThis->next;
5235 }
5236 pdnmmThis = pdnmmThis->next;
5237 } /*molecule*/
5238 /* traverse inter-molecule bonds */
5239 pvnmbThis = pmsdThis->pvnmbIMBHead;
5240 while (pvnmbThis)
5241 { /* inter-molecule bonds */
5242 pmbdThis = (PMBD) pvnmbThis->data.ptrvalue;
5243 (*pfnCallMe)((PFB) pmbdThis, iModel, iIndex, ptr); /* do the callback */
5244
5245 pvnmbThis = pvnmbThis->next;
5246 }
5247 /* traverse Objects */
5248 pvnmoThis = pmsdThis->pvnmoHead;
5249 while (pvnmoThis)
5250 {
5251 if (pvnmoThis->choice == iModel)
5252 { /* only those models stated */
5253 pmodThis = (PMOD) pvnmoThis->data.ptrvalue;
5254 (*pfnCallMe)((PFB) pmodThis, iModel, iIndex, ptr);
5255 }
5256 pvnmoThis = pvnmoThis->next;
5257 }
5258
5259 /* traverse Densities */
5260 pvnmdThis = pmsdThis->pvnmdHead;
5261 while (pvnmdThis)
5262 {
5263 if (pvnmdThis->choice == iModel)
5264 { /* only those models stated */
5265 pmddThis = (PMDD) pvnmdThis->data.ptrvalue;
5266 (*pfnCallMe)((PFB) pmddThis, iModel, iIndex, ptr);
5267 }
5268 pvnmdThis = pvnmdThis->next;
5269 }
5270 return TRUE;
5271 }
5272 return FALSE;
5273 }
5274
5275 /* Function to retrieve Biostrucs from ASN.1 files */
5276 /************************************************************/
5277 /* */
5278 /* BiostrucAsnGet() */
5279 /* */
5280 /* Retrieves Biostruc with a structure model of */
5281 /* choice by ignoring portions of the I/O stream */
5282 /* */
5283 /************************************************************/
5284
BiostrucAsnGet(AsnIoPtr aip,AsnTypePtr atp,Int4 mdlLvl,Int4 maxModels)5285 BiostrucPtr LIBCALL BiostrucAsnGet(AsnIoPtr aip, AsnTypePtr atp, Int4 mdlLvl, Int4 maxModels)
5286 {
5287 BiostrucPtr retval;
5288 DataVal av;
5289 AsnOptionPtr aop;
5290
5291
5292 av.intvalue = mdlLvl;
5293 aop = AsnIoOptionNew(aip, OP_NCBIOBJSTR, BIOSTRUC_CHECK_MODEL, av, NULL);
5294 av.intvalue = maxModels;
5295 aop = AsnIoOptionNew(aip, OP_NCBIOBJSTR, BIOSTRUC_MAX_MODELS, av, NULL);
5296
5297 if (mdlLvl == ALLSIMPLEMDL)
5298 { /* this is a reaction to an earlier kludge, when ONECOORDATOM didn't
5299 contain all of the models. Now they do contain all the models, so
5300 by forcing this value here we avoid the unnecessary fetching of
5301 multiple models. J. Epstein per C. Hogue, 11/18/96 */
5302 mdlLvl = ONECOORDATOM;
5303 }
5304
5305 retval = BiostrucAsnRead(aip, atp);
5306
5307 AsnIoOptionFree(aip, OP_NCBIOBJSTR, BIOSTRUC_CHECK_MODEL);
5308 AsnIoOptionFree(aip, OP_NCBIOBJSTR, BIOSTRUC_MAX_MODELS);
5309 if (mdlLvl == ONECOORDATOM || mdlLvl == ONECOORDRES || mdlLvl == VECMODEL)
5310 { /* we have left AsnIoStream in a hopelessly messed-up state, so reset it */
5311 AsnIoReset(aip);
5312 }
5313
5314 return retval;
5315 }
5316
5317 /* The accmmdbs.c stub has BiostrucAvail returning FALSE,
5318 and empty BiostrucAsn Read and Write functions.
5319 It should not be added to project libraries (Mac), or
5320 will be be overridden on linking (PC or UNIX). */
5321
BiostrucAvail(void)5322 Boolean LIBCALL BiostrucAvail (void)
5323
5324 {
5325 return TRUE;
5326 }
5327
5328 /* These 2 Bool funs were moved from mkbioseqB.c - DZ 4/27/99 */
5329
5330 /***********************************************************************/
5331 /* isBiopoly() */
5332 /* */
5333 /* Given a molecule id, checks whether the corresponding molecule is */
5334 /* either protein, DNA, or RNA and has coordinates. */
5335 /* */
5336 /***********************************************************************/
5337
isBiopoly(Int4 molecule_id,MoleculeGraphPtr currentbp)5338 Boolean LIBCALL isBiopoly(Int4 molecule_id, MoleculeGraphPtr currentbp)
5339 {
5340 Boolean ret=FALSE;
5341 while (currentbp) {
5342 if (currentbp->id == molecule_id) {
5343 ret = TRUE;
5344 break;
5345 }
5346 currentbp = currentbp->next;
5347 }
5348 return ret;
5349 }
5350 /*************************************************************************/
5351 /* isHet() */
5352 /* */
5353 /* Given a molecule id, checks whether the corresponding molecule is */
5354 /* a heterogen but not solvent or of unknown type, and has coordinates. */
5355 /* */
5356 /*************************************************************************/
5357
isHet(Int4 molecule_id,MoleculeGraphPtr currenthet)5358 Boolean LIBCALL isHet(Int4 molecule_id, MoleculeGraphPtr currenthet)
5359 {
5360 Boolean ret=FALSE;
5361 while (currenthet) {
5362 if (currenthet->id == molecule_id) {
5363 ret = TRUE;
5364 break;
5365 }
5366 currenthet = currenthet->next;
5367 }
5368 return ret;
5369 }
5370