summaryrefslogtreecommitdiff
path: root/api/asn2gnb2.c
diff options
context:
space:
mode:
authorAaron M. Ucko <ucko@debian.org>2010-08-30 01:08:10 -0400
committerAaron M. Ucko <ucko@debian.org>2010-08-30 01:08:10 -0400
commiteb0fe75837f0b1ffd48822a16cf8cad5d056b911 (patch)
tree6f8696aaa90980b40dd2253289c858c1405a3d3b /api/asn2gnb2.c
parentb4be7afc96f6bd0604ad7e6070c4baf8be8d808f (diff)
Imported Upstream version 6.1.20100808
Diffstat (limited to 'api/asn2gnb2.c')
-rw-r--r--api/asn2gnb2.c537
1 files changed, 488 insertions, 49 deletions
diff --git a/api/asn2gnb2.c b/api/asn2gnb2.c
index 94851438..e435d2bc 100644
--- a/api/asn2gnb2.c
+++ b/api/asn2gnb2.c
@@ -30,7 +30,7 @@
*
* Version Creation Date: 10/21/98
*
-* $Revision: 1.125 $
+* $Revision: 1.147 $
*
* File Description: New GenBank flatfile generator - work in progress
*
@@ -65,7 +65,14 @@
static CharPtr link_projid = "http://www.ncbi.nlm.nih.gov/sites/entrez?db=genomeprj&cmd=Retrieve&dopt=Overview&list_uids=";
-static CharPtr link_wgs = "http://www.ncbi.nlm.nih.gov/sites/entrez?";
+static CharPtr link_srr = "http://www.ncbi.nlm.nih.gov/sites/entrez?db=sra&term=";
+
+static CharPtr link_accn = "http://www.ncbi.nlm.nih.gov/sites/entrez?";
+
+static CharPtr link_wgs = "http://www.ncbi.nlm.nih.gov/Traces/wgs?";
+static CharPtr link_wgsscaf = "http://www.ncbi.nlm.nih.gov/nuccore?";
+
+static CharPtr link_cage = "http://www.ncbi.nlm.nih.gov/sites/entrez?";
static CharPtr link_sp = "http://www.uniprot.org/uniprot/";
@@ -92,8 +99,8 @@ static CharPtr strd [4] = {
};
static CharPtr gnbk_mol [16] = {
- " ", "DNA ", "RNA ", "mRNA", "rRNA", "tRNA", "snRNA", "scRNA",
- " AA ", "DNA ", "DNA ", "cRNA ", "snoRNA", "RNA ", "RNA ", "tmRNA "
+ " ", "DNA ", "RNA ", "mRNA", "rRNA", "tRNA", /* "snRNA" */ "RNA", /* "scRNA" */ "RNA",
+ " AA ", "DNA ", "DNA ", "cRNA ", /* "snoRNA" */ "RNA", "RNA ", "RNA ", "tmRNA "
};
/* EMBL_FMT in RELEASE_MODE or ENTREZ_MODE, otherwise use gnbk_mol */
@@ -117,8 +124,8 @@ static CharPtr gbseq_strd [4] = {
};
static CharPtr gbseq_mol [16] = {
- "?", "DNA", "RNA", "mRNA", "rRNA", "tRNA", "snRNA", "scRNA",
- "AA", "DNA", "DNA", "cRNA", "snoRNA", "RNA", "ncRNA", "tmRNA "
+ "?", "DNA", "RNA", "mRNA", "rRNA", "tRNA", /* "snRNA" */ "RNA", /* "scRNA" */ "RNA",
+ "AA", "DNA", "DNA", "cRNA", /* "snoRNA" */ "RNA", "RNA", /* "ncRNA" */ "RNA", "tmRNA "
};
static CharPtr gbseq_top [3] = {
@@ -385,7 +392,7 @@ static Boolean LocusHasBadChars (
ptr = locus;
ch = *ptr;
while (ch != '\0') {
- if (! IS_ALPHANUM (ch)) {
+ if (! (IS_ALPHA(ch) || IS_DIGIT(ch) || ch == '_')) {
return TRUE;
}
ptr++;
@@ -424,6 +431,7 @@ static void LookupAccnForNavLink (
NLM_EXTERN void AddLocusBlock (
Asn2gbWorkPtr awp,
Boolean willshowwgs,
+ Boolean willshowcage,
Boolean willshowgenome,
Boolean willshowcontig,
Boolean willshowsequence
@@ -439,6 +447,7 @@ NLM_EXTERN void AddLocusBlock (
Int2 bmol = 0;
BioseqPtr bsp;
Char buf [1024];
+ Boolean cagemaster = FALSE;
SeqFeatPtr cds;
Int4 currGi;
Char dataclass [10];
@@ -716,6 +725,31 @@ NLM_EXTERN void AddLocusBlock (
}
}
}
+
+ if (tech == MI_TECH_other && willshowcage && bsp->repr == Seq_repr_virtual) {
+
+ /* check for TAG master record */
+
+ for (sip = bsp->id; sip != NULL; sip = sip->next) {
+ switch (sip->choice) {
+ case SEQID_GENBANK :
+ case SEQID_EMBL :
+ case SEQID_DDBJ :
+ tsip = (TextSeqIdPtr) sip->data.ptrvalue;
+ if (tsip != NULL && tsip->accession != NULL) {
+ acclen = StringLen (tsip->accession);
+ if (acclen == 12) {
+ if (StringCmp (tsip->accession + 5, "0000000") == 0) {
+ cagemaster = TRUE;
+ }
+ }
+ }
+ break;
+ default :
+ break;
+ }
+ }
+ }
}
}
@@ -765,6 +799,8 @@ NLM_EXTERN void AddLocusBlock (
if (wgsmaster && (! is_nz)) {
sprintf (len, "%ld rc", (long) length);
+ } else if (cagemaster) {
+ sprintf (len, "%ld rc", (long) length);
} else {
sprintf (len, "%ld bp", (long) length);
}
@@ -1676,9 +1712,11 @@ static ValNodePtr GetSecondaryAccessions(ValNodePtr extra_access)
if (!IsSuccessor(curr, prev)) {
bin = ValNodeAdd(&bins);
}
- temp = (ValNodePtr)bin->data.ptrvalue;
- ValNodeAddStr(&temp, 0, curr);
- bin->data.ptrvalue = temp;
+ if (bin != NULL) {
+ temp = (ValNodePtr)bin->data.ptrvalue;
+ ValNodeAddStr(&temp, 0, curr);
+ bin->data.ptrvalue = temp;
+ }
prev = curr;
}
@@ -1770,6 +1808,9 @@ NLM_EXTERN void AddAccessionBlock (
case SEQID_GENBANK :
case SEQID_EMBL :
case SEQID_DDBJ :
+ case SEQID_TPG :
+ case SEQID_TPE :
+ case SEQID_TPD :
accn = sip;
tsip = (TextSeqIdPtr) sip->data.ptrvalue;
if (tsip != NULL) {
@@ -1799,11 +1840,6 @@ NLM_EXTERN void AddAccessionBlock (
case SEQID_PDB :
accn = sip;
break;
- case SEQID_TPG :
- case SEQID_TPE :
- case SEQID_TPD :
- accn = sip;
- break;
case SEQID_GPIPE :
/* should not override better accession */
gpp = sip;
@@ -1860,7 +1896,7 @@ NLM_EXTERN void AddAccessionBlock (
} else if (ajp->ajp.slp != NULL) {
FF_www_accession (ajp, ffstring, buf, is_na);
- flatloc = FFFlatLoc (ajp, bsp, ajp->ajp.slp, ajp->masterStyle);
+ flatloc = FFFlatLoc (ajp, bsp, ajp->ajp.slp, ajp->masterStyle, FALSE);
FFAddTextToString (ffstring, " REGION: ", flatloc, NULL, FALSE, FALSE, TILDE_TO_SPACES);
MemFree (flatloc);
} else {
@@ -1927,7 +1963,7 @@ NLM_EXTERN void AddAccessionBlock (
if (! StringHasNoText (buf)) {
if ( GetWWW(ajp) ) {
FFAddTextToString(ffstring, separator, "<a href=\"", NULL, FALSE, FALSE, TILDE_IGNORE);
- FF_Add_NCBI_Base_URL (ffstring, link_wgs);
+ FF_Add_NCBI_Base_URL (ffstring, link_accn);
FFAddTextToString(ffstring, "db=Nucleotide&cmd=Search&term=", buf, "\">", FALSE, FALSE, TILDE_IGNORE);
FFAddOneString (ffstring, buf, FALSE, FALSE, TILDE_TO_SPACES);
FFAddOneString (ffstring, "</a>", FALSE, FALSE, TILDE_TO_SPACES);
@@ -2220,14 +2256,59 @@ static void FF_asn2gb_www_projID (
FFAddOneString(ffstring, "</a>", FALSE, FALSE, TILDE_IGNORE);
}
+static void FF_asn2gb_www_SRR (
+ IntAsn2gbJobPtr ajp,
+ CharPtr buf,
+ CharPtr str
+)
+
+{
+ Char ch;
+ StringItemPtr ffstring;
+ CharPtr ptr;
+ CharPtr tmp;
+
+ if (ajp == NULL || buf == NULL || StringHasNoText (str)) return;
+
+ ffstring = FFGetString (ajp);
+ if (ffstring == NULL) return;
+
+ FFAddOneString (ffstring, "<a href=\"", FALSE, FALSE, TILDE_IGNORE);
+ FF_Add_NCBI_Base_URL (ffstring, link_srr);
+ FFAddOneString (ffstring, str, FALSE, FALSE, TILDE_IGNORE);
+ FFAddOneString(ffstring, "\">", FALSE, FALSE, TILDE_IGNORE);
+ FFAddOneString (ffstring, str, FALSE, FALSE, TILDE_IGNORE);
+ FFAddOneString(ffstring, "</a>", FALSE, FALSE, TILDE_IGNORE);
+
+ tmp = FFEndPrint (ajp, ffstring, ajp->format, 21, 21, 21, 21, NULL);
+ FFRecycleString (ajp, ffstring);
+
+ if (tmp != NULL) {
+ ptr = tmp;
+ ch = *ptr;
+ while (ch != '\0') {
+ if (ch == '\n' || ch == '\r' || ch == '\t') {
+ *ptr = ' ';
+ }
+ ptr++;
+ ch = *ptr;
+ }
+ TrimSpacesAroundString (tmp);
+ StringCat (buf, tmp);
+ MemFree (tmp);
+ }
+}
+
static CharPtr GetDBLinkString (
+ IntAsn2gbJobPtr ajp,
UserObjectPtr uop
)
{
- Char buf1 [256];
- Char buf2 [256];
- Char buf3 [256];
+ Char buf1 [512];
+ Char buf2 [512];
+ Char buf3 [512];
+ Char buf4 [1024];
CharPtr PNTR cpp;
Int4 i;
Int4Ptr ip;
@@ -2235,7 +2316,7 @@ static CharPtr GetDBLinkString (
ObjectIdPtr oip;
CharPtr prefix;
CharPtr str;
- Char tmp [32];
+ Char tmp [256];
UserFieldPtr ufp;
Int4 val;
@@ -2244,6 +2325,7 @@ static CharPtr GetDBLinkString (
buf1 [0] = '\0';
buf2 [0] = '\0';
buf3 [0] = '\0';
+ buf4 [0] = '\0';
for (ufp = uop->data; ufp != NULL; ufp = ufp->next) {
oip = ufp->label;
@@ -2253,11 +2335,11 @@ static CharPtr GetDBLinkString (
if (ufp->num > 0 && ip != NULL) {
val = ip [0];
if (val > 0) {
- sprintf (buf1, "Trace Assembly Archive:%ld", (long) val);
+ sprintf (buf1, "Trace Assembly Archive: %ld", (long) val);
for (i = 1; i < ufp->num; i++) {
val = ip [i];
if (val > 0) {
- sprintf (tmp, ",%ld", (long) val);
+ sprintf (tmp, ", %ld", (long) val);
StringCat (buf1, tmp);
}
}
@@ -2269,11 +2351,11 @@ static CharPtr GetDBLinkString (
if (ufp->num > 0 && cpp != NULL) {
str = cpp [0];
if (StringDoesHaveText (str)) {
- sprintf (buf2, "Bio Sample:%s", str);
+ sprintf (buf2, "Bio Sample: %s", str);
for (i = 1; i < ufp->num; i++) {
str = cpp [i];
if (StringDoesHaveText (str)) {
- sprintf (tmp, ",%s", str);
+ sprintf (tmp, ", %s", str);
StringCat (buf2, tmp);
}
}
@@ -2285,22 +2367,50 @@ static CharPtr GetDBLinkString (
if (ufp->num > 0 && cpp != NULL) {
str = cpp [0];
if (StringDoesHaveText (str)) {
- sprintf (buf3, "ProbeDB:%s", str);
+ sprintf (buf3, "ProbeDB: %s", str);
for (i = 1; i < ufp->num; i++) {
str = cpp [i];
if (StringDoesHaveText (str)) {
- sprintf (tmp, ",%s", str);
+ sprintf (tmp, ", %s", str);
StringCat (buf3, tmp);
}
}
}
}
}
+ if (StringICmp (oip->str, "Sequence Read Archive") == 0 && ufp->choice == 7) {
+ cpp = (CharPtr PNTR) ufp->data.ptrvalue;
+ if (ufp->num > 0 && cpp != NULL) {
+ str = cpp [0];
+ if (StringDoesHaveText (str)) {
+ tmp [0] = '\0';
+ if (ajp != NULL && GetWWW (ajp)) {
+ FF_asn2gb_www_SRR (ajp, tmp, str);
+ } else {
+ StringCpy (tmp, str);
+ }
+ sprintf (buf4, "Sequence Read Archive: %s", tmp);
+ for (i = 1; i < ufp->num; i++) {
+ str = cpp [i];
+ if (StringDoesHaveText (str)) {
+ tmp [0] = '\0';
+ if (ajp != NULL && GetWWW (ajp)) {
+ FF_asn2gb_www_SRR (ajp, tmp, str);
+ } else {
+ StringCpy (tmp, str);
+ }
+ StringCat (buf4, ", ");
+ StringCat (buf4, tmp);
+ }
+ }
+ }
+ }
+ }
}
- if (StringHasNoText (buf1) && StringHasNoText (buf2) && StringHasNoText (buf3)) return NULL;
+ if (StringHasNoText (buf1) && StringHasNoText (buf2) && StringHasNoText (buf3) && StringHasNoText (buf4)) return NULL;
- len = StringLen (buf1) + StringLen (buf2) + StringLen (buf3);
+ len = StringLen (buf1) + StringLen (buf2) + StringLen (buf3) + StringLen (buf4);
str = (CharPtr) MemNew (sizeof (Char) * (len + 2));
if (str == NULL) return NULL;
@@ -2323,6 +2433,12 @@ static CharPtr GetDBLinkString (
prefix = "\n";
}
+ if (StringDoesHaveText (buf4)) {
+ StringCat (str, prefix);
+ StringCat (str, buf4);
+ prefix = "\n";
+ }
+
return str;
}
@@ -2413,7 +2529,7 @@ NLM_EXTERN void AddDblinkBlock (
}
first = FALSE;
- prefix = "Project:";
+ prefix = "Project: ";
projectID = 0;
parentID = 0;
for (curr = gpuop->data; curr != NULL; curr = curr->next) {
@@ -2441,7 +2557,7 @@ NLM_EXTERN void AddDblinkBlock (
}
ValNodeCopyStr (&head, 0, buf);
}
- prefix = ",";
+ prefix = ", ";
parentID = 0;
}
projectID = val;
@@ -2484,7 +2600,7 @@ NLM_EXTERN void AddDblinkBlock (
}
if (dbuop != NULL) {
- str = GetDBLinkString (dbuop);
+ str = GetDBLinkString (ajp, dbuop);
if (StringDoesHaveText (str)) {
bbp = Asn2gbAddBlock (awp, PROJECT_BLOCK, sizeof (BaseBlock));
if (bbp == NULL) return;
@@ -3544,21 +3660,23 @@ NLM_EXTERN void AddDbsourceBlock (
break;
}
- switch (sip->choice) {
- case SEQID_PIR :
- AddPIRBlock (ajp, ffstring, bsp);
- break;
- case SEQID_SWISSPROT :
- AddSPBlock (ajp, ffstring, bsp);
- break;
- case SEQID_PRF :
- AddPRFBlock (ajp, ffstring, bsp);
- break;
- case SEQID_PDB :
- AddPDBBlock (ajp, ffstring, bsp);
- break;
- default :
- break;
+ if (sip != NULL) {
+ switch (sip->choice) {
+ case SEQID_PIR :
+ AddPIRBlock (ajp, ffstring, bsp);
+ break;
+ case SEQID_SWISSPROT :
+ AddSPBlock (ajp, ffstring, bsp);
+ break;
+ case SEQID_PRF :
+ AddPRFBlock (ajp, ffstring, bsp);
+ break;
+ case SEQID_PDB :
+ AddPDBBlock (ajp, ffstring, bsp);
+ break;
+ default :
+ break;
+ }
}
}
@@ -3745,6 +3863,54 @@ static Boolean KeywordAlreadyInList (
return FALSE;
}
+typedef struct finstatdata {
+ CharPtr inuserobj;
+ CharPtr inkeyword;
+} FinStatData, PNTR FinStatPtr;
+
+static FinStatData finStatKywds [] = {
+ {"Standard-Draft", "STANDARD_DRAFT"},
+ {"High-quality-draft", "HIGH_QUALITY_DRAFT"},
+ {"Improved-high-quality-draft", "IMPROVED_HIGH_QUALITY_DRAFT"},
+ {"Annotation-grade", "ANNOTATION_GRADE"},
+ {"Non-contiguous-finished", "NON_CONTIGUOUS_FINISHED"},
+ /*
+ {"Finished", "FINISHED"},
+ */
+ {NULL, NULL}
+};
+
+static CharPtr GetFinishingStatus (
+ CharPtr str
+)
+
+{
+ Char buf [64];
+ Char ch;
+ Int2 i;
+ CharPtr ptr;
+
+ if (StringHasNoText (str)) return NULL;
+
+ StringNCpy_0 (buf, str, sizeof (buf));
+ ptr = buf;
+ ch = *ptr;
+ while (ch != '\0') {
+ if (ch == ' ') {
+ *ptr = '-';
+ }
+ ptr++;
+ ch = *ptr;
+ }
+
+ for (i = 0; finStatKywds [i].inuserobj != NULL; i++) {
+ if (StringICmp (buf, finStatKywds [i].inuserobj) == 0) {
+ return finStatKywds [i].inkeyword;
+ }
+ }
+
+ return NULL;
+}
NLM_EXTERN void AddKeywordsBlock (
Asn2gbWorkPtr awp
@@ -3757,8 +3923,11 @@ NLM_EXTERN void AddKeywordsBlock (
BaseBlockPtr bbp;
BioseqPtr bsp;
BioSourcePtr biop;
+ UserFieldPtr curr;
SeqMgrDescContext dcontext;
EMBLBlockPtr ebp;
+ CharPtr field;
+ CharPtr finishing_status = NULL;
GBBlockPtr gbp;
GBSeqPtr gbseq;
ValNodePtr head = NULL;
@@ -3767,6 +3936,7 @@ NLM_EXTERN void AddKeywordsBlock (
Boolean is_gss = FALSE;
Boolean is_sts = FALSE;
Boolean is_env_sample = FALSE;
+ Boolean is_genome_assembly = FALSE;
ValNodePtr keywords;
CharPtr kwd;
MolInfoPtr mip;
@@ -3938,6 +4108,22 @@ NLM_EXTERN void AddKeywordsBlock (
oip = uop->type;
if (oip != NULL && StringICmp (oip->str, "ENCODE") == 0) {
add_encode = TRUE;
+ } else if (oip != NULL && StringICmp (oip->str, "StructuredComment") == 0) {
+ for (curr = uop->data; curr != NULL; curr = curr->next) {
+ if (curr->choice != 1) continue;
+ oip = curr->label;
+ if (oip == NULL) continue;
+ field = oip->str;
+ if (StringHasNoText (field)) continue;
+ if (StringCmp (field, "StructuredCommentPrefix") == 0) {
+ if (StringCmp ((CharPtr) curr->data.ptrvalue, "##Genome-Assembly-Data-START##") == 0) {
+ is_genome_assembly = TRUE;
+ }
+ }
+ if (StringCmp (field, "Current Finishing Status") == 0) {
+ finishing_status = GetFinishingStatus ((CharPtr) curr->data.ptrvalue);
+ }
+ }
}
}
sdp = SeqMgrGetNextDescriptor (bsp, sdp, Seq_descr_user, &dcontext);
@@ -3948,6 +4134,12 @@ NLM_EXTERN void AddKeywordsBlock (
}
ValNodeCopyStr (&head, 0, "ENCODE");
}
+ if (is_genome_assembly && StringDoesHaveText (finishing_status)) {
+ if (head != NULL) {
+ ValNodeCopyStr (&head, 0, "; ");
+ }
+ ValNodeCopyStr (&head, 0, finishing_status);
+ }
for (sip = bsp->id; sip != NULL; sip = sip->next) {
if (sip->choice == SEQID_TPG || sip->choice == SEQID_TPE || sip->choice == SEQID_TPD) {
@@ -5050,7 +5242,7 @@ static void GetRefsOnBioseq (
}
}
if (awp->format == FTABLE_FMT) {
- pdp = (PubdescPtr) sdp->data.ptrvalue;
+ pdp = (PubdescPtr) sfp->data.value.ptrvalue;
if (HasNoPmidOrMuid (pdp)) {
takeIt = FALSE;
}
@@ -5593,11 +5785,15 @@ NLM_EXTERN void AddWGSBlock (
{
IntAsn2gbJobPtr ajp;
+ Asn2gbSectPtr asp;
BaseBlockPtr bbp;
BioseqPtr bsp;
Char buf [80];
SeqMgrDescContext dcontext;
CharPtr first;
+ GBAltSeqItemPtr gbaip;
+ GBAltSeqDataPtr gbasp, asphead = NULL, asplast = NULL;
+ GBSeqPtr gbseq;
CharPtr last;
ObjectIdPtr oip;
SeqDescrPtr sdp;
@@ -5611,6 +5807,8 @@ NLM_EXTERN void AddWGSBlock (
if ( ajp == NULL ) return;
bsp = awp->bsp;
if (bsp == NULL) return;
+ asp = awp->asp;
+ if (asp == NULL) return;
if (awp->format == EMBL_FMT || awp->format == EMBLPEPT_FMT) return;
@@ -5620,6 +5818,12 @@ NLM_EXTERN void AddWGSBlock (
DoQuickLinkFormat (awp->afp, buf);
}
+ if (ajp->gbseq) {
+ gbseq = &asp->gbseq;
+ } else {
+ gbseq = NULL;
+ }
+
sdp = SeqMgrGetNextDescriptor (bsp, NULL, Seq_descr_user, &dcontext);
while (sdp != NULL) {
uop = (UserObjectPtr) sdp->data.ptrvalue;
@@ -5651,6 +5855,33 @@ NLM_EXTERN void AddWGSBlock (
}
}
if (first != NULL && last != NULL) {
+ if (gbseq != NULL) {
+ gbasp = (GBAltSeqDataPtr) MemNew (sizeof (GBAltSeqData));
+ if (gbasp != NULL) {
+ if (asphead == NULL) {
+ asphead = gbasp;
+ }
+ if (asplast != NULL) {
+ asplast->next = gbasp;
+ }
+ asplast = gbasp;
+ if (wgstype == 1) {
+ gbasp->name = StringSave ("WGS");
+ } else if (wgstype == 2) {
+ gbasp->name = StringSave ("WGS_SCAFLD");
+ } else if (wgstype == 3) {
+ gbasp->name = StringSave ("WGS_CONTIG");
+ }
+ gbaip = GBAltSeqItemNew ();
+ if (gbaip != NULL) {
+ gbaip->first_accn = StringSave (first);
+ if (StringCmp (first, last) != 0) {
+ gbaip->last_accn = StringSave (last);
+ }
+ gbasp->items = gbaip;
+ }
+ }
+ }
bbp = Asn2gbAddBlock (awp, WGS_BLOCK, sizeof (BaseBlock));
if (bbp != NULL) {
ffstring = FFGetString (ajp);
@@ -5665,8 +5896,172 @@ NLM_EXTERN void AddWGSBlock (
if ( GetWWW(ajp) ) {
if (StringCmp (first, last) != 0) {
+ if (wgstype == 1) {
+ FFAddOneString (ffstring, "<a href=\"", FALSE, FALSE, TILDE_IGNORE);
+ FF_Add_NCBI_Base_URL (ffstring, link_wgs);
+ StringCpy (buf, first);
+ if (buf [2] == '_') {
+ buf [9] = '\0';
+ } else {
+ buf [6] = '\0';
+ }
+ FFAddTextToString(ffstring, "val=", buf, "\">", FALSE, FALSE, TILDE_IGNORE);
+ sprintf (buf, "%s-%s", first, last);
+ FFAddOneString (ffstring, buf, FALSE, FALSE, TILDE_TO_SPACES);
+ FFAddOneString (ffstring, "</a>", FALSE, FALSE, TILDE_TO_SPACES);
+ } else {
+ FFAddOneString (ffstring, "<a href=\"", FALSE, FALSE, TILDE_IGNORE);
+ FF_Add_NCBI_Base_URL (ffstring, link_wgsscaf);
+ sprintf (buf, "%s:%s", first, last);
+ FFAddTextToString(ffstring, "term=", buf, "[PACC]\">", FALSE, FALSE, TILDE_IGNORE);
+ sprintf (buf, "%s-%s", first, last);
+ FFAddOneString (ffstring, buf, FALSE, FALSE, TILDE_TO_SPACES);
+ FFAddOneString (ffstring, "</a>", FALSE, FALSE, TILDE_TO_SPACES);
+ }
+ } else {
+ FFAddOneString (ffstring, "<a href=\"", FALSE, FALSE, TILDE_IGNORE);
+ FF_Add_NCBI_Base_URL (ffstring, link_seqn);
+ FFAddTextToString(ffstring, /* "val=" */ NULL, first, "\">", FALSE, FALSE, TILDE_IGNORE);
+ sprintf (buf, "%s", first);
+ FFAddOneString (ffstring, buf, FALSE, FALSE, TILDE_TO_SPACES);
+ FFAddOneString (ffstring, "</a>", FALSE, FALSE, TILDE_TO_SPACES);
+ }
+ } else {
+ if (StringCmp (first, last) != 0) {
+ sprintf (buf, "%s-%s", first, last);
+ FFAddOneString (ffstring, buf, FALSE, FALSE, TILDE_TO_SPACES);
+ } else {
+ sprintf (buf, "%s", first);
+ FFAddOneString (ffstring, buf, FALSE, FALSE, TILDE_TO_SPACES);
+ }
+ }
+
+ bbp->string = FFEndPrint(ajp, ffstring, awp->format, 12, 12, 0, 0, NULL);
+ FFRecycleString(ajp, ffstring);
+ }
+
+ bbp->entityID = dcontext.entityID;
+ bbp->itemtype = OBJ_SEQDESC;
+ bbp->itemID = dcontext.itemID;
+ if (awp->afp != NULL) {
+ DoImmediateFormat (awp->afp, bbp);
+ }
+ }
+ }
+ }
+ }
+ }
+ sdp = SeqMgrGetNextDescriptor (bsp, sdp, Seq_descr_user, &dcontext);
+ }
+
+ if (gbseq != NULL) {
+ gbseq->alt_seq = asphead;
+ }
+}
+
+NLM_EXTERN void AddCAGEBlock (
+ Asn2gbWorkPtr awp
+)
+
+{
+ IntAsn2gbJobPtr ajp;
+ Asn2gbSectPtr asp;
+ BaseBlockPtr bbp;
+ BioseqPtr bsp;
+ Char buf [80];
+ Int2 cagetype;
+ SeqMgrDescContext dcontext;
+ CharPtr first;
+ GBAltSeqItemPtr gbaip;
+ GBAltSeqDataPtr gbasp, asphead = NULL, asplast = NULL;
+ GBSeqPtr gbseq;
+ CharPtr last;
+ ObjectIdPtr oip;
+ SeqDescrPtr sdp;
+ UserFieldPtr ufp;
+ UserObjectPtr uop;
+ StringItemPtr ffstring;
+
+ if (awp == NULL) return;
+ ajp = awp->ajp;
+ if ( ajp == NULL ) return;
+ bsp = awp->bsp;
+ if (bsp == NULL) return;
+ asp = awp->asp;
+ if (asp == NULL) return;
+
+ if (awp->format == EMBL_FMT || awp->format == EMBLPEPT_FMT) return;
+
+ if (GetWWW (ajp) && awp->mode == ENTREZ_MODE && awp->afp != NULL &&
+ (awp->format == GENBANK_FMT || awp->format == GENPEPT_FMT)) {
+ sprintf (buf, "<a name=\"wgs_%ld\"></a>", (long) awp->currGi);
+ DoQuickLinkFormat (awp->afp, buf);
+ }
+
+ if (ajp->gbseq) {
+ gbseq = &asp->gbseq;
+ } else {
+ gbseq = NULL;
+ }
+
+ sdp = SeqMgrGetNextDescriptor (bsp, NULL, Seq_descr_user, &dcontext);
+ while (sdp != NULL) {
+ uop = (UserObjectPtr) sdp->data.ptrvalue;
+ if (uop != NULL) {
+ oip = uop->type;
+ first = NULL;
+ last = NULL;
+ cagetype = 0;
+ if (oip != NULL) {
+ if (StringICmp (oip->str, "CAGE-Tag-List") == 0) {
+ cagetype = 1;
+ }
+ if (cagetype != 0) {
+ for (ufp = uop->data; ufp != NULL; ufp = ufp->next) {
+ oip = ufp->label;
+ if (oip == NULL || oip->str == NULL || ufp->choice != 1) continue;
+ if (StringICmp (oip->str, "CAGE_accession_first") == 0) {
+ first = (CharPtr) ufp->data.ptrvalue;
+ } else if (StringICmp (oip->str, "CAGE_accession_last") == 0) {
+ last = (CharPtr) ufp->data.ptrvalue;
+ }
+ }
+ if (first != NULL && last != NULL) {
+ if (gbseq != NULL) {
+ gbasp = (GBAltSeqDataPtr) MemNew (sizeof (GBAltSeqData));
+ if (gbasp != NULL) {
+ if (asphead == NULL) {
+ asphead = gbasp;
+ }
+ if (asplast != NULL) {
+ asplast->next = gbasp;
+ }
+ asplast = gbasp;
+ if (cagetype == 1) {
+ gbasp->name = StringSave ("TAG");
+ }
+ gbaip = GBAltSeqItemNew ();
+ if (gbaip != NULL) {
+ gbaip->first_accn = StringSave (first);
+ if (StringCmp (first, last) != 0) {
+ gbaip->last_accn = StringSave (last);
+ }
+ gbasp->items = gbaip;
+ }
+ }
+ }
+ bbp = Asn2gbAddBlock (awp, WGS_BLOCK, sizeof (BaseBlock));
+ if (bbp != NULL) {
+ ffstring = FFGetString (ajp);
+ if (ffstring != NULL) {
+ if (cagetype == 1) {
+ FFStartPrint (ffstring, awp->format, 0, 12, "TAG", 12, 0, 0, NULL, FALSE);
+ }
+
+ if ( GetWWW(ajp) ) {
+ if (StringCmp (first, last) != 0) {
FFAddOneString (ffstring, "<a href=\"", FALSE, FALSE, TILDE_IGNORE);
- FF_Add_NCBI_Base_URL (ffstring, link_wgs);
+ FF_Add_NCBI_Base_URL (ffstring, link_cage);
FFAddTextToString(ffstring, "db=Nucleotide&cmd=Search&term=", first, NULL, FALSE, FALSE, TILDE_IGNORE);
FFAddTextToString(ffstring, ":", last, "[PACC]\">", FALSE, FALSE, TILDE_IGNORE);
sprintf (buf, "%s-%s", first, last);
@@ -5707,6 +6102,10 @@ NLM_EXTERN void AddWGSBlock (
}
sdp = SeqMgrGetNextDescriptor (bsp, sdp, Seq_descr_user, &dcontext);
}
+
+ if (gbseq != NULL) {
+ gbseq->alt_seq = asphead;
+ }
}
NLM_EXTERN void AddGenomeBlock (
@@ -5716,11 +6115,15 @@ NLM_EXTERN void AddGenomeBlock (
{
CharPtr accn;
IntAsn2gbJobPtr ajp;
+ Asn2gbSectPtr asp;
BaseBlockPtr bbp;
BioseqPtr bsp;
Char buf [128];
SeqMgrDescContext dcontext;
Boolean first = TRUE;
+ GBAltSeqItemPtr gbaip;
+ GBAltSeqDataPtr gbasp, asphead = NULL, asplast = NULL;
+ GBSeqPtr gbseq;
CharPtr moltype;
ObjectIdPtr oip;
SeqDescrPtr sdp;
@@ -5734,6 +6137,8 @@ NLM_EXTERN void AddGenomeBlock (
if ( ajp == NULL ) return;
bsp = awp->bsp;
if (bsp == NULL) return;
+ asp = awp->asp;
+ if (asp == NULL) return;
if (awp->format == EMBL_FMT || awp->format == EMBLPEPT_FMT) return;
@@ -5743,6 +6148,12 @@ NLM_EXTERN void AddGenomeBlock (
DoQuickLinkFormat (awp->afp, buf);
}
+ if (ajp->gbseq) {
+ gbseq = &asp->gbseq;
+ } else {
+ gbseq = NULL;
+ }
+
bbp = Asn2gbAddBlock (awp, GENOME_BLOCK, sizeof (BaseBlock));
if (bbp == NULL) return;
@@ -5773,6 +6184,30 @@ NLM_EXTERN void AddGenomeBlock (
}
}
if (! StringHasNoText (accn)) {
+ if (gbseq != NULL) {
+ gbasp = (GBAltSeqDataPtr) MemNew (sizeof (GBAltSeqData));
+ if (gbasp != NULL) {
+ if (asphead == NULL) {
+ asphead = gbasp;
+ }
+ if (asplast != NULL) {
+ asplast->next = gbasp;
+ }
+ asplast = gbasp;
+ gbasp->name = StringSave ("GENOME");
+ gbaip = GBAltSeqItemNew ();
+ if (gbaip != NULL) {
+ if (! StringHasNoText (moltype)) {
+ sprintf (buf, "%s (%s)", accn, moltype);
+ gbaip->value = StringSave (buf);
+ } else {
+ sprintf (buf, "%s", accn);
+ gbaip->value = StringSave (buf);
+ }
+ gbasp->items = gbaip;
+ }
+ }
+ }
if (! first) {
FFAddNewLine(ffstring);
}
@@ -5794,6 +6229,10 @@ NLM_EXTERN void AddGenomeBlock (
if (awp->afp != NULL) {
DoImmediateFormat (awp->afp, bbp);
}
+
+ if (gbseq != NULL) {
+ gbseq->alt_seq = asphead;
+ }
}
NLM_EXTERN void AddBasecountBlock (