/* * $Id: mmdbuti.c,v 1.3 2003/01/15 16:13:42 chenj Exp $ * * * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * * Author: Jie Chen * * * $Log: mmdbuti.c,v $ * Revision 1.3 2003/01/15 16:13:42 chenj * add uid as an argument to ChainScaleMapOrImg() * * Revision 1.2 2002/12/26 21:21:20 chenj * use Dart_CdNum() to get all Cds in database * * Revision 1.1.1.1 2002/12/04 21:12:08 chenj * Imported sources * * * *============================================================================= */ #include "mmdbuti.h" extern double pix_per_res; extern ENTREZurl[PATH_MAX], VASTurl[PATH_MAX], CDDurl[PATH_MAX]; extern Int4 *ColorIdx, white, black, blue, red, gray, maxseqlen; extern Uint1 cycle1[10][3]; extern Dart_Connect *dartcon; #define EntrezLink "href=\"%s?cmd=Retrieve&db=%s&list_uids=%d&dopt=%s\"" Int2 ChainNameMapOrImg(Boolean ismap, gdImagePtr im, Int2 x, Int2 y, PMSD pmsd, PMMD pmmd, Int2 protein, FILE *File) { Int2 x1, x2, y2; char tmpchain[20], tmpstr[20], db[20], dopt[20], *PDBid, *chain; char str[MAX_TBUFF]; Int4 iGi; PDBid = pmsd->pcPDBName; chain = pmmd->pcMolName; /* what if pmmd->pcMolName[0] == ' ');*/ iGi = pmmd->iGi; if (protein) { sprintf(tmpchain, "Protein"); sprintf(db, "protein"); sprintf(dopt, "GenPept"); } else { sprintf(tmpchain, "Nucleotide"); sprintf(db, "nucleotide"); sprintf(dopt, "GenBank"); } x1 = x+10; x2 = x1 + StrLen(tmpchain)*FontBW; y2 = y+FontBH; if (ismap == TRUE) { strcpy(str, PDBid); if (chain[0] != ' ') { StringCat(str, "_"); StringCat(str, chain); } sprintf(tmpstr, ", gi %d, ", iGi); StringCat(str, tmpstr); StringCat(str, "click for Entrez sequence summary."); fprintf(File, "\"%s\"",\n"); } else { gdImageString(im, gdFont7X13b, x1, y, tmpchain, blue); gdImageLine(im, x1, y2, x2, y2, blue); } return(x2); } #define VastLink "href=\"%s?sdid=%d\"" void ChainScaleMapOrImg(Boolean ismap, gdImagePtr im, Int2 x, Int2 y, PMMD pmmd, Int4 uid, Int4 sdid, Int4 color, Int4 labelcol, FILE *File) { Char cTmp[MAX_TBUFF], *chain; Int2 x0, x1, y1, x2, y2, right, seqlen; Int4 i, len, tick, ntick, dont; static Int4 ticksteps[14] ={5, 10, 20, 25, 50, 100, 200, 150, 500, 1000, 2000, 2500, 5000, 10000}; seqlen = pmmd->iResCount; chain = pmmd->pcMolName; right = x2 = (Int4)(x+ (seqlen-1)*pix_per_res); y2 = y + FontBH + 2; if (ismap ==TRUE) { sprintf(cTmp, "residues, click to see its structure neighbors."); if (!sdid) { Int4 maxuid = constructMaxMmdbId(); if (uid <= maxuid) sdid=-1; } fprintf(File, "\"%d\n", seqlen, cTmp); } else { gdImageFilledRectangle(im, x, y, x2, y2, color); sprintf(cTmp, "Chain %s", chain); if ((right - x) >= StrLen(cTmp)*FontBW) { x1 = (x + right - StrLen(cTmp)*FontBW)/2; gdImageString(im, gdFont7X13b, x1, y+1, cTmp, labelcol); } else if ((right-x) >= StrLen(cTmp)*FontMW) { x1 = (x + right - StrLen(cTmp)*FontMW)/2; gdImageString(im, gdFont6X12, x1, y+1, cTmp, labelcol); } else if ((right-x) >= StrLen(chain)*FontBW) { x1 = (x + right - StrLen(chain)*FontBW)/2; gdImageString(im, gdFont7X13b, x1, y+1, chain, labelcol); } else if ((right-x) >= StrLen(chain)*FontMW) { x1 = (x + right - StrLen(chain)*FontMW)/2; gdImageString(im, gdFont6X12, x1, y+1, chain, labelcol); } /* add ticks */ gdImageLine(im, x, y, x, y-5, red); /* for "1" */ gdImageLine(im, x2, y, x2, y-5, red); /* for "len" */ y1= y- (5 + FontMH); gdImageString(im, gdFont6X12, x-2, y1, "1", red); /* "1" */ x0 = x+FontMW; cTmp[0] = '\0'; sprintf(cTmp, "%d", seqlen); x2 -= (StrLen(cTmp)-1)*FontMW; if (x2 > x) gdImageString(im, gdFont6X12, x2, y1, cTmp, red); /* "len" */ if ((float)(seqlen-1)/(float)(maxseqlen-1)< 0.05) return; dont = x2 - FontMW; for (i=0; i< 14; i++) { ntick = seqlen/ticksteps[i]; if (ntick < 10) { tick = ticksteps[i]; break; } } for (i=1; i<= ntick; i++) { x1 = (Int4)(x + ((float)(i*tick)-1.0)*pix_per_res); if (x1 > right-FontMW) continue; y1 = y; y2 = y-5; gdImageLine(im, x1, y1, x1, y2, red); cTmp[0] = '\0'; sprintf(cTmp, "%d", i*tick); len = StrLen(cTmp) * FontMW/2; x2 = x1 + len; x1 -= len; y1 -= (5+ FontMH); if (x2 < dont && ((x2-x0) > len)) { gdImageString(im, gdFont6X12, x1, y1, cTmp, red); x0 = x2+FontMW; } } } return; } /* end of ChainScaleMapOrImg */ #define DomOpt "db=structure&cmd=Display&dopt=structure_domains&from_uid=" Int2 ChainDomMapOrImg(Boolean ismap, gdImagePtr im, Int2 x, Int2 y, Int4 uid, PMMD pmmd, Int4Ptr DomIdx, IntervalHead **DomHead, FILE *File) { Char cTom[MAX_TBUFF]; Int4 x1, x2, y1, y2, ytmp = 0, idx, chnNo; Int4 colidx, from, to, seqlen, color=0; Int4 right, labelcol=0, chndom0; ResidueIntervalPntrPtr ripp; IntervalHead *tmp_head; chnNo = pmmd->iChainId; idx = DomIdx[chnNo]; chndom0 = 10000*uid + 100 * chnNo; seqlen = pmmd->iResCount; right = (Int4)(x + (float)(seqlen-1)*pix_per_res); if (DomHead[idx] == NULL) { /* no 3d domain */ if (ismap == FALSE) { colidx = ColorIdx[idx]; color = gdImageColorAllocate(im, cycle1[colidx][0], cycle1[colidx][1], cycle1[colidx][2]); labelcol = white; if (colidx==3 || colidx==4 || colidx==5 || colidx==7 || colidx==8 || colidx==9) labelcol = black; } ChainScaleMapOrImg(ismap, im, x, y, pmmd, uid, LongDomId2Sdi(chndom0), color, labelcol, File); ytmp = y+FontBH+4; } else { /* has 3d domain */ Int4 i; x1 = 10; x2 = x1 + StrLen("3d Domains")*FontBW; y1 = y + FontBH + 6; y2 = y1+ FontBH; if (ismap == TRUE) { sprintf(cTom, "Click to learn about 3d Domains."); fprintf(File, "\"%s\"",ENTREZurl,DomOpt,uid,cTom);\n", cTom); } else { gdImageLine(im, x1, y2, x2, y2, blue); gdImageString(im, gdFont7X13b, x1, y1, "3d Domains", blue); } for (tmp_head = DomHead[idx], i=1; tmp_head != NULL; tmp_head = tmp_head->next, i++) { colidx = tmp_head->colidx; ripp = tmp_head->ripp; if (i == 1) { Int4 lablecol; if (ismap == TRUE) color = lablecol = 0; else { color=gray; lablecol = white; } ChainScaleMapOrImg(ismap, im, x, y, pmmd, uid, LongDomId2Sdi(chndom0), color, lablecol, File); } y1 = y + FontBH + 6; y2 = y1 + FontBH + 2; ytmp = y2; for (; ripp != NULL; ripp = ripp->next) { from = ripp->from; /* domain range */ to = ripp->to; CalCoor(&x1, &x2, x, from, to, pix_per_res, MaxSeqImgSize); x1 = MAX(x1, x); x2 = MIN(x2, right); if (ismap == TRUE) { sprintf(cTom, "Residues %d to %d, click for structure neighbors", from, to); fprintf(File, "domid)); fprintf(File, "alt=\"%s\"", cTom); fprintf(File, " ONMOUSEOVER=\"self.status=\'%s\'; return true\"", cTom); fprintf(File, ">\n"); } else { gdImageFilledRectangle(im, x1, y1, x2, y2, gdImageColorAllocate(im, cycle1[colidx][0], cycle1[colidx][1], cycle1[colidx][2])); sprintf(cTom, "%d", tmp_head->thisdomain); if ((x2 - x1 - 4) > StrLen(cTom)*FontBW) { Int4 x3; x3=(x1+x2 - StrLen(cTom)*FontBW)/2; if (colidx==3 || colidx==4 || colidx==5 || colidx==7 || colidx==8 || colidx==9) color = black; else color = white; gdImageString(im, gdFont7X13b, x3, y1+1,cTom,color); } } } /* ; ripp != NULL */ } /* tmp_head */ } return(ytmp); } #define CDDsrv "href=\"%s?ascbin=2&maxaln=10&seltype=3&uid=%s&aln=%s&querygi=%d&querynm=%s&version=%s\"" #define CDDOpt "db=cdd&term=" Int2 ConsDomMapOrImg(Boolean ismap, gdImagePtr im, Int4 x, Int4 y, PMSD pmsd, PMMD pmmd, FILE *File) { Char cTmp[MAX_TBUFF], *PDBid,*Chain,**CddName,str[MAX_TBUFF]; OverLoc *end, *head; Int4 right, i, j, dy=0, y0, x1, x2, y1, y2, gi, seqlen; Int4 numseg, from, to, len1, len2, alinumseg, index; Int4Ptr starts, lens; SeqAnnotPtr sap = NULL; SeqAlignPtr salp = NULL; DenseSegPtr *dsp; /*---------------------------------------------------------------------------*/ /* DART color scheme */ /*---------------------------------------------------------------------------*/ static Int4 iNcolors = 13; static Int4 iDartCol[13][3] = {{153,204,255}, /* sky b */ { 0, 0,255}, /* blue */ { 0,255, 0}, /* green */ {204,102, 0}, /* orange */ {204,204, 0}, /* yeller */ {255, 0, 0}, /* red */ {102,153, 0}, /* spring */ {204,102,153}, /* lavender */ { 0,204,204}, /* cyan */ {153,153, 0}, /* brown */ {153, 51,255}, /* violet */ { 0,153,153}, /* blue-green */ { 0,204,102}, /* teal */ }; gi = pmmd->iGi; if (!gi) return (y); PDBid = pmsd->pcPDBName; Chain = pmmd->pcMolName; seqlen = pmmd->iResCount; cTmp[0] = '\0'; right = (Int4)(x + (float)(seqlen-1)*pix_per_res); if (Dart_Gi2Sap(dartcon, gi, &sap, NULL) && (sap != NULL)) { unsigned *Pssmlist, *PssmId, count; Int2 *iColor, CdNum, thisColor=0, *iClus; Int4 NumRows; Char querynm[MAX_TBUFF], shortname[MAX_TBUFF]; Char defline[MAX_TBUFF], definition[MAX_TBUFF]; Char def2[MAX_TBUFF], *chtmp, cdalign[MAX_TBUFF]; Char CDDdb[1024], Version[1024]; Dart_Version(dartcon, CDDdb, 100, Version, 1024); if (StrLen(CDDdb)) StrCut(Version, Version, StrLen(CDDdb)+2, StrLen(Version)); if (!Dart_CdNum(dartcon, &count)) PrtMes("chenj@ncbi.nlm.nih.gov", "MmdbSrv", "Can't do Dart_CdNum()", NULL, FALSE); Pssmlist = (unsigned *) MemNew (count * sizeof (unsigned)); end = head = NewOverLoc(seqlen); head->y = y0 = y+5; for (salp = (SeqAlignPtr)sap->data, CdNum=0; salp!=NULL; salp=salp->next, CdNum++); iColor = (Int2Ptr) MemNew (CdNum * sizeof(Int2)); PssmId = (unsigned *) MemNew (CdNum * sizeof(unsigned)); dsp = (DenseSegPtr *) MemNew (CdNum * sizeof(DenseSegPtr)); CddName = (CharPtr *) MemNew (CdNum * sizeof(CharPtr)); for (j=0; j< CdNum; j++) CddName[j] = (CharPtr) MemNew (30); iClus = (Int2Ptr) MemNew (CdNum * sizeof(Int2)); for (salp = (SeqAlignPtr)sap->data, i=0; salp!=NULL; salp=salp->next, i++) { dsp[i] = (DenseSegPtr)salp->segs; PssmId[i] = GetPSSMID(dsp[i]); iClus[i] = -1; if (PssmId[i]) Dart_CDGi2Acc(dartcon, PssmId[i], CddName[i], 30); else { CharPtr strtmp; strtmp = GetCDDName(dsp[i]); sprintf(CddName[i], strtmp); } } for (i=0; i< CdNum; i++) { if (iClus[i] >= 0) continue; if (ismap == FALSE) iColor[i] = (thisColor++) % iNcolors; iClus[i] = i; if (Dart_Related(dartcon, CddName[i],Pssmlist,count,&NumRows,NULL)){ Int2 k; if (NumRows > count) PrtMes("chenj@ncbi.nlm.nih.gov", "MMDBSRV", "Dart_Related(): NumRows > MaxPssm", NULL, FALSE); for (j=0; j< NumRows; j++) { for (k=i+1; k< CdNum; k++) if (PssmId[k] == Pssmlist[j]) { if (ismap == FALSE) iColor[k] = iColor[i]; iClus[k] = i; } } } } sprintf(querynm, "%s%s(query)", PDBid, Chain); for (i=0; i< StrLen(querynm); i++) if (isalpha(querynm[i])) querynm[i] = tolower(querynm[i]); if (querynm[4] == ' ') querynm[4] = '+'; for (i=0; i< CdNum; i++) { numseg = (dsp[i])->numseg; starts = (dsp[i])->starts; lens = (dsp[i])->lens; from = starts[0] + 1; to = starts[(numseg-1)*2] + lens[numseg-1]; CalCoor(&x1, &x2, x, from, to, pix_per_res, MaxSeqImgSize); x1 = MAX(x, x1); x2 = MIN(x2, right); y1= GetY1(head, &end, from, to, seqlen, iClus[i], 7); if (y1 < 0) continue; y2 = y1+FontBH+4; Dart_Acc2Info(dartcon, CddName[i], shortname, MAX_TBUFF, defline, MAX_TBUFF, definition, MAX_TBUFF); if (ismap == TRUE) { if (StrLen(defline) == 254) strcpy((defline+StrLen(defline)-3), "..."); if (defline[StrLen(defline)-1] != '.') StringCat(defline, "."); chtmp = strchr(defline, ';'); sprintf(def2, defline); if (chtmp) { strncpy(def2, def2, (chtmp-defline-1)); def2[chtmp-defline]='.'; def2[chtmp-defline+1]='\0'; } else { chtmp = strchr(defline, '.'); if (chtmp) { strncpy(def2, def2, (chtmp-defline)); def2[chtmp-defline+1]='\0'; } else StringCat(def2, "."); } sprintf(str, "%s:%s Click for the CD alignment.", CddName[i], def2); sprintf(def2, str); alinumseg = 0; cdalign[0] = '\0'; for (j=0; j< numseg; j++) { index = 2*j; if (starts[index]!= -1 && starts[index+1] != -1) { sprintf(str, ",%d,%d,%d", starts[index+1], starts[index], lens[j]); StringCat(cdalign, str); alinumseg++; } } sprintf(str, "%d", alinumseg); StringCat(str, cdalign); fprintf(File, "\n", def2); StringCat(cTmp, "+OR+"); StringCat(cTmp, CddName[i]); StringCat(cTmp, "[ACCN]"); } else { /* ismap == FALSE */ Int4 r, g, b, color; r = iDartCol[iColor[i]][0]; g = iDartCol[iColor[i]][1]; b = iDartCol[iColor[i]][2]; gdImageRoundRectangle(im, x1, y1, x2, y2, 8, 5, gdImageColorAllocate(im, r, g, b), 1); len1 = StrLen(shortname)*FontBW; len2 = StrLen(shortname)*FontMW; color = white; if (iColor[i] == 2 || iColor[i] == 4 || iColor[i] == 0) color=black; if ((x2-x1-4)> len1) gdImageString(im, gdFont7X13b, (x1+x2-len1)/2, y1+2, shortname, color); else if ((x2-x1-4) > len2) gdImageString(im, gdFont6X12, (x1+x2-len2)/2, y1+2, shortname, color); else { Int4 char_num; char_num = (x2-x1-4)/FontBW; if (char_num >= 3) strcpy(&(shortname[char_num-3]), "..."); else switch (char_num) { case 1: strcpy(shortname, "."); break; case 2: strcpy(shortname, ".."); } gdImageString(im,gdFont7X13b,x1+4, y1+2, shortname, color); } } if (!dy) { dy = y0-y1; y0 = y1; } } /* for */ y0 = y2; if (!dy) dy=6; else dy = 15; x1 = 10; x2 = x1+ StrLen("CDs") * FontBW; y1 = y+dy; y2 = y1+FontBH; if (ismap == FALSE) { gdImageLine(im, x1, y2, x2, y2, blue); gdImageString(im, gdFont7X13b, x1, y1, "CDs", blue); } else { sprintf(str, "Click to see Entrez Conserved Domains."); fprintf(File, "y+dy, x+StrLen("CDs")*FontBW, head->y+dy+FontBH);*/ fprintf(File, "href=\"%s?%s%s\" alt=\"%s\" ", ENTREZurl, CDDOpt, cTmp+4, str); fprintf(File,"ONMOUSEOVER=\"self.status=\'%s\'; return true\">\n",str); } y2 = y0; FreeOverLoc(head); MemFree(iColor); MemFree(PssmId); MemFree(dsp); for (i=0; i< CdNum; i++) MemFree(CddName[i]); MemFree(CddName); MemFree(iClus); MemFree(Pssmlist); } else y2 = y; return(y2); } /* end of ConsDomMapOrImg */ Int4 MaxSeqLenProOrDRna(PMSD pmsd, Int2 protein) { Int4 maxseqlen = 0; PMMD pmmd; PDNMM pdnmm; maxseqlen = 0; for (pdnmm = pmsd->pdnmmHead; pdnmm != NULL; pdnmm = pdnmm->next) { pmmd = (PMMD) pdnmm->data.ptrvalue; if ((protein && (pmmd->bWhat & AM_PROT)) || (!protein && (pmmd->bWhat & (AM_DNA | AM_RNA)))) { if (maxseqlen < pmmd->iResCount) maxseqlen = pmmd->iResCount; } } return(maxseqlen); } /* end MaxSeqLen */ PDNMM PdnmmforChainX(PDNMM pdnmm, Int2 chainx) { Int2 i = 1; PDNMM pdnmmtmp; PMMD pmmd; pdnmmtmp = pdnmm; while (i <= chainx) { pmmd = (PMMD)(pdnmmtmp->data.ptrvalue); if ((pmmd->bWhat & (AM_PROT |AM_DNA | AM_RNA)) && pdnmm) i++; if (i <= chainx) pdnmmtmp = pdnmmtmp->next; } return(pdnmmtmp); } /* end PdnmmforChainX */ void GetDomFeaPtr(BiostrucPtr bsp, Boolean *hasDomain, BiostrucFeaturePtr *domain_bfp) { BiostrucFeatureSetPtr bfsp = NULL; ValNodePtr vnp = NULL; *domain_bfp = NULL; *hasDomain = FALSE; for (bfsp = bsp->features; bfsp != NULL; bfsp = bfsp->next) { for (vnp = bfsp->descr; vnp != NULL; vnp = vnp->next) if (vnp->choice == BiostrucFeatureSetDescr_name && !StringCmp(vnp->data.ptrvalue, "NCBI Domains")) { *hasDomain = TRUE; *domain_bfp = bfsp->features; break; } } } /* end of GetDomFeaPtr */ Int2 ChainCount(PMSD pmsd) { Int2 cnt; PMMD pmmd; PDNMM pdnmm; for (pdnmm = pmsd->pdnmmHead, cnt=0; pdnmm != NULL; pdnmm =pdnmm->next) { pmmd = (PMMD) pdnmm->data.ptrvalue; if ((pmmd->bWhat) & (AM_PROT |AM_DNA | AM_RNA)) cnt++; } return(cnt); } /* end ChainCount */ void GroupingChains(PMSD pmsd) { Int2 i, cnt; PDNMM prohead, proend, nuhead, nuend, pdnmm, pdnmmnext; PDNMM elsehead, elseend; PMMD pmmd; prohead = proend = nuhead = nuend = elsehead = elseend = NULL; pdnmm = pmsd->pdnmmHead; cnt = ChainCount(pmsd); for (i=0, pdnmm = pmsd->pdnmmHead; i< cnt; i++) { pmmd = (PMMD) pdnmm->data.ptrvalue; pdnmmnext = pdnmm->next; if (pmmd->bWhat & AM_PROT) { if (!prohead) prohead = proend = pdnmm; else { proend->next = pdnmm; proend = pdnmm; } } else if (pmmd->bWhat & (AM_DNA | AM_RNA)) { if (!nuhead) nuhead = nuend = pdnmm; else { nuend->next = pdnmm; nuend = pdnmm; } } else i--; pdnmm->next = NULL; pdnmm = pdnmmnext; } if (!pdnmm) if (!elsehead) elsehead = pdnmm; else elseend->next = pdnmm; elsehead = elseend = NULL; /* remove non_PROT,non_DNA and non_RNA */ /* ??? */ if (!prohead) { if (!nuhead) pmsd->pdnmmHead = elsehead; else { pmsd->pdnmmHead = nuhead; nuend->next = elsehead; } } else { pmsd->pdnmmHead = prohead; if (!nuhead) proend->next = elsehead; else { proend->next = nuhead; nuend->next = elsehead; } } ((PDNMM)pmsd->pdnmmHead)->last = NULL; } /* end GroupingChains */ void CalDomIdx(PDNMM pdnmm, Int4Ptr *DomIdx) { int cnt, chnNo, maxchnNo=0; PMMD pmmd; PDNMM tmp_pdnmm; for (tmp_pdnmm = pdnmm; tmp_pdnmm != NULL; tmp_pdnmm = tmp_pdnmm->next) { pmmd = tmp_pdnmm->data.ptrvalue; if (pmmd->bWhat & (AM_PROT | AM_DNA |AM_RNA)) { chnNo = pmmd->iChainId; if (maxchnNo < chnNo) maxchnNo = chnNo; } } *DomIdx = (Int4Ptr) MemNew (++maxchnNo * sizeof(Int4)); for (tmp_pdnmm = pdnmm, cnt=0; tmp_pdnmm != NULL; tmp_pdnmm = tmp_pdnmm->next, cnt++) { pmmd = tmp_pdnmm->data.ptrvalue; if (pmmd->bWhat & (AM_PROT | AM_DNA |AM_RNA)) (*DomIdx)[pmmd->iChainId] = cnt; } } /* CalDomIdx */ void CheckDomColIdx(BiostrucFeaturePtr bfp, PDNMM pdnmm, IntervalHead **DomHead, Int4Ptr DomIdx, Int4Ptr ColorIdx, Boolean hasDomain, Boolean forImg) { BiostrucFeaturePtr tmp_bfp; Int2 colidx = 0, thisdomain; Int4 chnNo; IntervalHead *tmp_head; PDNMM tmp_pdnmm; PMMD pmmd; ResidueIntervalPntrPtr ripp; ValNodePtr vnp, vnp1, vnp2; if (hasDomain) { for (tmp_bfp = bfp; tmp_bfp != NULL; tmp_bfp = tmp_bfp->next) { Int4 idx; vnp = tmp_bfp->Location_location; vnp1 = (ValNodePtr) vnp->data.ptrvalue; vnp2 = (ValNodePtr) vnp1->data.ptrvalue; ripp = (ResidueIntervalPntrPtr) vnp2->data.ptrvalue; chnNo = ripp->molecule_id; colidx %= ncycle; idx = DomIdx[chnNo]; if (DomHead[idx] == NULL) { thisdomain = 1; if (forImg == TRUE) ColorIdx[idx] = -11; /*just a label */ } else thisdomain++; tmp_head = (IntervalHead *) MemNew (sizeof(IntervalHead)); tmp_head->colidx = colidx; tmp_head->ripp = ripp; tmp_head->next = DomHead[idx]; tmp_head->thisdomain = thisdomain; tmp_head->domid = tmp_bfp->id; DomHead[idx] = tmp_head; colidx++; } /* tmp_bfp */ } /* if (hasDomain) */ for (tmp_pdnmm = pdnmm; tmp_pdnmm != NULL; tmp_pdnmm = tmp_pdnmm->next) { Int4 idx; pmmd = tmp_pdnmm->data.ptrvalue; if (pmmd->bWhat & (AM_PROT | AM_DNA |AM_RNA)) { chnNo = pmmd->iChainId; idx = DomIdx[chnNo]; if (DomHead[idx] == NULL) { colidx %= ncycle; if (forImg==TRUE) ColorIdx[idx] = colidx; colidx++; } } } /* for (tmp_pdnmm) */ /* MemFree(DomIdx); */ } /* CheckDomColIdx */