1 #include <prtgene.h>
2 
3 /*functions to print everything between two genes */
4 #include <tofile.h>
5 
6 
7 #define GENE_MARKER	1
8 #define SEQ_SEGMENT	2
9 typedef struct print_gene {
10 	GeneDataPtr g_data;
11 	FILE *fp;
12 	Boolean html;
13 	Boolean found;
14 	Uint1 print_loc;
15 	NumberingPtr np;
16 	Uint1 prev_type;	/*the type of the previously recorded marker*/
17 }PrintGene, PNTR PrintGenePtr;
18 
19 
20 static 	ColData prt_col = {0, 0, 0, 'l', TRUE, TRUE, FALSE};
21 static  ParData prt_par = {FALSE};
22 
23 #define MAX_HTML_SIZE 1000
24 static Char HTML_buffer[MAX_HTML_SIZE];
25 
26 static void print_store_for_html PROTO((CharPtr temp, CharPtr html_buf, Int4Ptr c_pos, Int4 width, FILE *fp));
27 
print_store_buf(CharPtr temp,CharPtr buf,Int4 buf_size,Int4Ptr cur_len,FILE * fp)28 static void print_store_buf(CharPtr temp, CharPtr buf, Int4 buf_size, Int4Ptr cur_len,
29 							FILE *fp)
30 {
31 	Int4 len;
32 
33 	len = StringLen(temp);
34 	if(len + (*cur_len) > buf_size)
35 	{
36 		StringCat(buf, "\n");
37 		SendTextToFile (fp, buf, &prt_par, &prt_col);
38 		*cur_len = 0;
39 		StringCpy(buf, temp);
40 	}
41 	else
42 	{
43 		if(*cur_len == 0)
44 			StringCpy(buf, temp);
45 		else
46 			StringCat(buf, temp);
47 	}
48 	*cur_len += len;
49 }
50 
51 
52 
53 /**********************************************************
54 *
55 *	functions to print a feature to a FILE
56 *
57 **********************************************************/
PrintQual(GBQualPtr qdata,FILE * fp,CharPtr buf,Int4 buf_size)58 static Boolean PrintQual(GBQualPtr qdata, FILE *fp, CharPtr buf, Int4 buf_size)
59 {
60 	Int4 len;
61 	Char temp[101];
62 
63 
64 	if(qdata == NULL)
65 		return FALSE;
66 	sprintf(buf, "Qualifier ");
67 	len = StringLen(buf);
68 	while(qdata)
69 	{
70 		sprintf (temp, "%s=%s ", qdata->qual, qdata->val);
71 		print_store_buf(temp, buf, buf_size, &len, fp);
72 	    qdata = qdata->next;
73 	}
74 
75 	if(len > 0)
76 	{
77 		StringCat(buf, "\n");
78 		SendTextToFile (fp, buf, &prt_par, &prt_col);
79 	}
80 
81 	return TRUE;
82 }
83 
print_sfp_ext(SeqFeatPtr sfp,FILE * fp,CharPtr buf,Int4 buf_size)84 static Boolean print_sfp_ext (SeqFeatPtr sfp, FILE *fp, CharPtr buf, Int4 buf_size)
85 {
86 	ObjectIdPtr oip;
87 	UserObjectPtr uop;
88 	UserFieldPtr ufp;
89 	Char temp[101];
90 	Int4 len;
91 
92 	if(sfp->ext == NULL)
93 		return FALSE;
94 	uop = sfp->ext;
95 	len = 0;
96 	buf[0] = '\0';
97 	while(uop)
98 	{
99 		oip = uop->type;
100 		if(StringCmp(oip->str, "MapMarkerInfo") == 0)
101 		{
102 			ufp = uop->data;
103 			while (ufp)
104 			{
105 				oip = ufp->label;
106 				if(StringCmp(oip->str, "Bin Order") == 0)
107 				{	/* the order of the 1000:1 bin */
108 					if(ufp->choice == 2)	/*integer */
109 						sprintf(temp, "Bin Order is %ld\n", (long) ufp->data.intvalue);
110 						print_store_buf(temp, buf, buf_size, &len, fp);
111 				}
112 				else if(StringCmp(oip->str, "Marker Type" ) == 0)
113 				{
114 					if(ufp->choice == 2)
115 					{
116 						switch (ufp->data.intvalue)
117 						{
118 						case 1:
119 							sprintf(temp, "Framework Marker\n");
120 							break;
121 						case 2:
122 							sprintf(temp, "Recombination Mimimum Marker\n");
123 							break;
124 						case 3:
125 							sprintf(temp, "Likely Loci Marker\n");
126 							break;
127 						case 4:
128 							sprintf(temp, "Duplicated Marker\n");
129 							break;
130 						case 5:
131 							sprintf(temp, "Multiple Duplicated Marker\n");
132 							break;
133 						case 6:
134 							sprintf(temp, "STS Marker on YAC Contig\n");
135 							break;
136 						default:
137 							break;
138 						}
139 						print_store_buf(temp, buf, buf_size, &len, fp);
140 					}
141 				}
142 
143 				else if(StringCmp(oip->str, "Marker Category" ) == 0)
144 				{
145 					if(ufp->choice == 2)
146 					{
147 						switch (ufp->data.intvalue)
148 						{
149 						case 1:
150 							sprintf(temp, "This is a YAC End\n");
151 							break;
152 						case 2:
153 							sprintf(temp, "This is a Random Marker\n");
154 							break;
155 						case 3:
156 							sprintf(temp, "This is a Genetic Marker\n");
157 							break;
158 						case 4:
159 							sprintf(temp, "This is a Gene Marker\n");
160 							break;
161 						case 5:
162 							sprintf(temp, "This is a EST Marker\n");
163 							break;
164 						case 6:
165 							sprintf(temp, "This is a Misc Marker\n");
166 							break;
167 						default:
168 							break;
169 						}
170 					}
171 					print_store_buf(temp, buf, buf_size, &len, fp);
172 				}
173 				ufp = ufp->next;
174 			}
175 		}
176 		if(StringCmp(oip->str, "MIT RH map") == 0)
177 		{
178 			ufp = uop->data;
179 			while(ufp)
180 			{
181 				oip = ufp->label;
182 				if(oip && StringCmp(oip->str, "STS probability") == 0)
183 				{
184 					if(ufp->choice == 1)
185 						sprintf(temp, "STS probability is %s \n",
186 						(CharPtr)(ufp->data.ptrvalue));
187 					print_store_buf(temp, buf, buf_size, &len, fp);
188 				}
189 				ufp = ufp->next;
190 			}
191 		}
192 
193 		if(StringCmp(oip->str, "Marker Category" ) == 0)
194 		{
195 			ufp = uop->data;
196 			if(ufp->choice == 2)
197 			{
198 				switch (ufp->data.intvalue)
199 				{
200 				case 1:
201 					sprintf(temp, "This is a YAC End\n");
202 					break;
203 				case 2:
204 					sprintf(temp, "This is a Random Marker\n");
205 					break;
206 				case 3:
207 					sprintf(temp, "This is a Genetic Marker\n");
208 					break;
209 				case 4:
210 					sprintf(temp, "This is a Gene Marker\n");
211 					break;
212 				case 5:
213 					sprintf(temp, "This is a EST Marker\n");
214 					break;
215 				case 6:
216 					sprintf(temp, "This is a Misc Marker\n");
217 					break;
218 				default:
219 					break;
220 				}
221 			}
222 			print_store_buf(temp, buf, buf_size, &len, fp);
223 		}
224 		uop = uop->next;
225 	}
226 	if(len > 0)
227 		SendTextToFile (fp, buf, &prt_par, &prt_col);
228 
229 	return TRUE;
230 }
231 
232 
233 
PrintCommonFeature(SeqFeatPtr sfp,FILE * fp,CharPtr buf,Int4 buf_size)234 static Boolean PrintCommonFeature(SeqFeatPtr sfp, FILE *fp, CharPtr buf, Int4 buf_size)
235 {
236 	if(sfp->title)
237 	{
238 		sprintf(buf, "Title: %s\n", sfp->title);
239 		SendTextToFile (fp, buf, &prt_par, &prt_col);
240 	}
241 
242 	if(sfp->partial)
243 	{
244 		sprintf(buf, "Partial\n");
245 		SendTextToFile (fp, buf, &prt_par, &prt_col);
246 	}
247 
248 	if(sfp->excpt)
249 	{
250 		sprintf(buf, "Exception\n");
251 		SendTextToFile (fp, buf, &prt_par, &prt_col);
252 	}
253 
254 	if(sfp->comment)
255 	{
256 		sprintf(buf, "Comment: %s\n", sfp->comment);
257 		SendTextToFile (fp, buf, &prt_par, &prt_col);
258 	}
259 
260 
261 	PrintQual(sfp->qual, fp, buf, buf_size);
262 
263 	if(sfp->exp_ev ==1)
264 	{
265 		sprintf(buf, "Experimental Result\n");
266 		SendTextToFile (fp, buf, &prt_par, &prt_col);
267 	}
268 
269 	if(sfp->exp_ev ==2)
270 	{
271 		sprintf(buf, "Not-Experimental\n");
272 		SendTextToFile (fp, buf, &prt_par, &prt_col);
273 	}
274 
275 
276 	return TRUE;
277 
278 }
279 
print_citation(SeqFeatPtr sfp,FILE * fp,CharPtr buf,Int4 buf_size,Boolean is_html)280 static Boolean print_citation (SeqFeatPtr sfp, FILE *fp, CharPtr buf, Int4 buf_size, Boolean is_html)
281 {
282 	ValNodePtr cit, pub;
283 	Char temp[101];
284 	Boolean found;
285 	Int4 muid;
286 	Int4 len;
287 	Int4 index;
288 
289 	if(sfp->cit == NULL)
290 		return FALSE;
291 	cit = sfp->cit;
292 	found = FALSE;
293 	len = 0;
294 	index = 0;
295 	while(cit)
296 	{
297 		if(cit->choice == 3)
298 		{
299 			muid = cit->data.intvalue;
300 			if(muid != 0)
301 			{
302 				if(found == FALSE)
303 				{
304 					StringCpy(buf, "MEDLINE: ");
305 					found = TRUE;
306 					len = StringLen(buf);
307 					if(is_html)
308 						print_store_for_html(buf, NULL, &index, prt_col.width, fp);
309 				}
310 				if(is_html)
311 				{
312 					sprintf(temp, "%ld", (long) muid);
313 					sprintf(HTML_buffer, "<a href=\"http://www.ncbi.nlm.nih.gov:80/htbin-post/Entrez/query?-guid=%ld&form=6&db=m&Dopt=r\">", (long) muid);
314 					print_store_for_html(temp, HTML_buffer, &index, prt_col.width, fp);
315 					print_store_for_html(" ", NULL, &index, prt_col.width, fp);
316 				}
317 				else
318 				{
319 					sprintf(temp, "%ld ", (long) muid);
320 					print_store_buf(temp, buf, buf_size, &len, fp);
321 				}
322 			}
323 		}
324 		else if(cit->choice == 1)
325 		{
326 			pub = (ValNodePtr)(cit->data.ptrvalue);
327 			while(pub)
328 			{
329 				if(pub->choice == PUB_Muid)
330 				{
331 					muid = pub->data.intvalue;
332 					if(muid != 0)
333 					{
334 						if(found == FALSE)
335 						{
336 							StringCpy(buf, "MEDLINE: ");
337 							found = TRUE;
338 							len = StringLen(buf);
339 							if(is_html)
340 								print_store_for_html(buf, NULL, &index, prt_col.width, fp);
341 						}
342 						if(is_html)
343 						{
344 							sprintf(temp, "%ld", (long) muid);
345 							sprintf(HTML_buffer, "<a href=\"http://www.ncbi.nlm.nih.gov:80/htbin-post/Entrez/query?-guid=%ld&form=6&db=m&Dopt=r\">", (long) muid);
346 							print_store_for_html(temp, HTML_buffer, &index, prt_col.width, fp);
347 							print_store_for_html(" ", NULL, &index, prt_col.width, fp);
348 						}
349 						else
350 						{
351 							sprintf(temp, "%ld ", (long) muid);
352 							print_store_buf(temp, buf, buf_size, &len, fp);
353 						}
354 					}
355 				}
356 				pub = pub->next;
357 			}
358 		}
359 		cit = cit->next;
360 	}
361 
362 	if(found)
363 	{
364 		if(is_html)
365 		{
366 			if(index > 0)
367 				fprintf(fp, "\n");
368 		}
369 		else if(len > 0)
370 		{
371 			StringCat(buf, "\n");
372 			SendTextToFile (fp, buf, &prt_par, &prt_col);
373 		}
374 	}
375 	return found;
376 }
377 
378 
379 /*************************************************************
380 *
381 *	creating the html pages to the other genome mapping center
382 *
383 **************************************************************/
find_db_html_pointer(CharPtr db,CharPtr str)384 static CharPtr find_db_html_pointer (CharPtr db, CharPtr str)
385 {
386 	Char temp[101];
387 
388 	if(db == NULL || str == NULL)
389 		return NULL;
390 
391 	if(StringNCmp(db, "JAX", 3) == 0)
392 	{
393 		sprintf(HTML_buffer, "<a href=\"http://www.informatics.jax.org/bin/get_marker_by_symbol?%s\">", str);
394 		return HTML_buffer;
395 	}
396 
397 	if(StringCmp(db, "Stanford") == 0 || StringCmp(db, "SHGC") == 0)
398 	{
399 		if(StringNCmp(str, "SHGC", 4) == 0)
400 		{
401 			sprintf(HTML_buffer, "<a href=\"http://www-shgc.stanford.edu/cgi-bin/getSTSinfo?%s\">", str);
402 			return HTML_buffer;
403 		}
404 		if(StringNCmp(str, "STSG-", 5) == 0)
405 		{	/*old name format for the STSG*/
406 			StringCpy(temp, "SHGC-");
407 			StringCat(temp, str+5);
408 			sprintf(HTML_buffer, "<a href=\"http://www-shgc.stanford.edu/cgi-bin/getSTSinfo?%s\">", temp);
409 			return HTML_buffer;
410 		}
411 
412 		return NULL;
413 	}
414 
415 	if(StringCmp(db, "MIT") == 0 )
416 	{
417 		if(StringNCmp(str, "WI-", 3) == 0)
418 		{
419 			sprintf(HTML_buffer, "<a href=\"http://www-genome.wi.mit.edu/cgi-bin/"
420 			"contig/sts_info?sts=%s&database=release\">", str);
421 			return HTML_buffer;
422 		}
423 		return NULL;
424 	}
425 
426 	if(StringCmp(db, "CHLC") == 0)
427 	{
428 		if(StringNCmp(str, "GATA", 4) == 0)
429 		{
430 			sprintf(HTML_buffer, "<a href=\"http://www.chlc.org/cgi-bin/"
431 			"MarkerSearch?%s\">", str);
432 			return HTML_buffer;
433 		}
434 		return NULL;
435 	}
436 
437 
438 	return NULL;
439 }
440 
441 
print_gene_dblst(ValNodePtr db,FILE * fp,CharPtr buf,Int4 buf_size,Uint1 match_type,Boolean is_html)442 static Boolean print_gene_dblst(ValNodePtr db, FILE *fp, CharPtr buf, Int4 buf_size, Uint1 match_type, Boolean is_html)
443 {
444 	DbtagPtr dbtag;
445 	ObjectIdPtr oip;
446 	ValNodePtr curr;
447 	Int4 len;
448 	Char temp[101];
449 	Char separator[3];
450 	CharPtr html_buf;
451 	Int4 index;
452 	SeqIdPtr t_sip;
453 	Int4 gi;
454 
455 	if(db == NULL)
456 		return FALSE;
457 
458 	StringCpy(buf, "Other Databases: ");
459 	len = StringLen(buf);
460 	if(is_html)
461 	{
462 		fprintf(fp, "%s", buf);
463 		index = len;
464 	}
465 
466 
467 	for(curr = db; curr != NULL; curr = curr->next)
468 	{
469 		html_buf = NULL;
470 		dbtag = curr->data.ptrvalue;
471 		oip = dbtag->tag;
472 		if(is_html)
473 		{
474 			if(StringICmp(dbtag->db, "GDB") == 0 && oip->id > 0)
475 			{
476 				sprintf(HTML_buffer, "<a href=\"http://gdbwww.gdb.org/"
477 				"gdb-bin/genera/genera/hgd/DBObject/"
478 				"GDB:%ld\">", (long) oip->id);
479 
480 				html_buf = HTML_buffer;
481 			}
482 			else if(StringICmp(dbtag->db, "MIM") == 0 && oip->id > 0)
483 			{
484 				sprintf(HTML_buffer, "<a href=\"http://www.ncbi.nlm.nih.gov/htbin-post/Omim/dispmim?"
485 				"%ld\">",(long) oip->id);
486 				html_buf = HTML_buffer;
487 			}
488 			else if(StringICmp(dbtag->db, "GenBank") == 0 && oip->str != NULL)
489 			{
490 				t_sip = gb_id_make(NULL, oip->str);
491 				gi = GetGIForSeqId (t_sip);
492 				if(gi > 0)
493 				{
494 					sprintf(HTML_buffer, "<a href=\"http://www.ncbi.nlm.nih.gov/"
495                 				"htbin-post/Entrez/query?form=6&dopt=g&db=n&"
496                  				"uid=%08ld\">",(long) gi);
497 					html_buf = HTML_buffer;
498 				}
499 				SeqIdFree(t_sip);
500 			}
501 			else if(oip->str != NULL)
502 				html_buf = find_db_html_pointer (dbtag->db, oip->str);
503 		}
504 		if(curr->next == NULL)
505 			separator[0] = '\0';
506 		else
507 			StringCpy(separator, " ");
508 		if(oip->str)
509 		{
510 			if(StringICmp(dbtag->db, "GenBank") == 0 ||
511 				match_type == MATCH_NONE)
512 				sprintf(temp, "%s %s%s", dbtag->db, oip->str, separator);
513 			else
514 			{
515 				if(match_type == MATCH_QUERY)
516 					sprintf(temp, "%s [%s]%s", dbtag->db, oip->str, separator);
517 				else if(match_type == MATCH_ALIGN)
518 					sprintf(temp, "%s (%s)%s", dbtag->db, oip->str, separator);
519 			}
520 		}
521 		else
522 			sprintf(temp, "%s %ld%s", dbtag->db, (long) oip->id, separator);
523 		if(is_html)
524 		{
525 			if(curr->next == NULL)
526 				StringCat(temp, "\n");
527 			print_store_for_html(temp, html_buf, &index, prt_col.width, fp);
528 			print_store_for_html(" ", NULL, &index, prt_col.width, fp);
529 		}
530 		else
531 			print_store_buf(temp, buf, buf_size, &len, fp);
532 	}
533 	if(len > 0 && !is_html)
534 	{
535 		StringCat(buf, "\n");
536 		SendTextToFile (fp, buf, &prt_par, &prt_col);
537 	}
538 	return TRUE;
539 }
540 
print_gene_synonym(ValNodePtr syn,FILE * fp,CharPtr buf,Int4 buf_size,Uint1 match_type)541 static Boolean print_gene_synonym(ValNodePtr syn, FILE *fp, CharPtr buf, Int4 buf_size, Uint1 match_type)
542 {
543 	ValNodePtr curr;
544 	CharPtr str;
545 	Char temp[101];
546 	Int4 len;
547 
548 	if(syn == NULL)
549 		return FALSE;
550 	StringCpy(buf, "Synonym: ");
551 	len = StringLen(buf);
552 	for(curr = syn; curr != NULL; curr = curr->next)
553 	{
554 		str = curr->data.ptrvalue;
555 		if(match_type == MATCH_QUERY)
556 			sprintf(temp, "[%s] ", str);
557 		else if(match_type == MATCH_ALIGN)
558 			sprintf(temp, "(%s) ", str);
559 		else
560 			sprintf(temp, "%s ", str);
561 		print_store_buf(temp, buf, buf_size, &len, fp);
562 	}
563 	if(len > 0)
564 	{
565 		StringCat(buf, "\n");
566 		SendTextToFile(fp, buf, &prt_par, &prt_col);
567 	}
568 	return TRUE;
569 }
570 
571 
572 /************************************************************
573 *
574 * PrintGeneRefToFile(sfp, fp, match_type, print_loc, np)
575 *	print all the data associated with sfp to a file
576 *	sfp: the Seqfeat of type Gene-ref
577 *	fp: the FILE
578 *	match_type: the marker matches any query gene. If
579 *	it matches directly (MATCH_QUERY), will be shown as [marker],
580 *	if it matches via alignment (MATCH_ALIGN), will be shown
581 *	as (marker). Otherwise,nothing will be shown
582 *	print_loc: print the location of the marker. PRINT_LOC_BOGO
583 *	directly print out the bogo base pair. PRINT_LOC_NUM,
584 *	print out the location as the Numbering system
585 *	np the numbering system
586 *
587 ***********************************************************/
PrintGeneRefToFile(SeqFeatPtr sfp,FILE * fp,Uint1 match_type,Uint1 print_loc,NumberingPtr np,Boolean is_html)588 static Boolean PrintGeneRefToFile(SeqFeatPtr sfp, FILE *fp, Uint1 match_type, Uint1 print_loc, NumberingPtr np, Boolean is_html)
589 {
590 	GeneRefPtr grp;
591 	Char buf[1001];
592 	SeqIdPtr sip;
593 	DbtagPtr db_tag;
594 	CharPtr html_buf;
595 
596 	PrintCommonFeature(sfp, fp, buf, 1000);
597 	grp = sfp->data.value.ptrvalue;
598 	if(grp)
599 	{
600 		/* print out the locus name */
601 		if(grp->locus)
602 		{
603 			html_buf = NULL;
604 			if(is_html)
605 			{
606 				html_buf = NULL;
607 				sip = SeqLocId(sfp->location);
608 				if(sip->choice == SEQID_GENERAL)
609 				{
610 					db_tag = sip->data.ptrvalue;
611 					if(db_tag->db != NULL)
612 						html_buf = find_db_html_pointer (db_tag->db, grp->locus);
613 				}
614 			}
615 
616 
617 			if(match_type == MATCH_QUERY)
618 			{
619 				if(is_html)
620 				{
621 					if(html_buf != NULL)
622 						fprintf(fp, "Locus: %s<B>%s</B></a>\n", html_buf, grp->locus);
623 					else
624 						fprintf(fp, "Locus: <B>%s</B>\n", grp->locus);
625 				}
626 				else
627 					fprintf(fp, "Locus: [%s]\n", grp->locus);
628 			}
629 			else
630 			{
631 				if(is_html && html_buf != NULL)
632 					fprintf(fp, "Locus: %s%s</a>\n", html_buf, grp->locus);
633 				else
634 					fprintf(fp, "Locus: %s\n",  grp->locus);
635 			}
636 		}
637 		if(grp->desc)
638 		{
639 			sprintf(buf, "Description: %s\n", grp->desc);
640 			SendTextToFile (fp, buf, &prt_par, &prt_col);
641 		}
642 
643 		if(grp->syn)
644 			print_gene_synonym(grp->syn, fp, buf, 1000, match_type);
645 
646 		if(grp->db)
647 			print_gene_dblst(grp->db, fp, buf, 1000, match_type, is_html);
648 		if(grp->allele)
649 			fprintf(fp, "Allele: %s\n", grp->allele);
650 		if(grp->maploc)
651 			fprintf(fp, "MapLoc: %s\n", grp->maploc);
652 
653 		if(grp->pseudo)
654 			fprintf(fp, "Pseudo Gene\n");
655 
656 	}
657 	print_citation (sfp, fp, buf, 1000, is_html);
658 	print_sfp_ext (sfp, fp, buf, 1000);
659 
660 	if(print_loc == PRINT_LOC_BOGO || np == NULL)
661 	{
662 		fprintf(fp, "Region %ld-%ld\n", (long) SeqLocStart(sfp->location),
663 			(long) SeqLocStop(sfp->location));
664 	}
665 	else if(print_loc == PRINT_LOC_NUM)
666 	{
667 		if(np != NULL)
668 		{
669 			map_unit_label(SeqLocStart(sfp->location), np, buf, FALSE);
670 			fprintf(fp, "Region %s\n", buf);
671 		}
672 	}
673 	fprintf(fp, "\n");
674 	return TRUE;
675 
676 }
677 
WWW_PrintGeneRef(SeqFeatPtr sfp,Uint1 match_type,Uint1 print_loc,NumberingPtr np,Boolean is_html)678 CharPtr WWW_PrintGeneRef(SeqFeatPtr sfp, Uint1 match_type, Uint1 print_loc, NumberingPtr np, Boolean is_html)
679 {
680 	GeneRefPtr grp = NULL;
681 	SeqIdPtr sip;
682 	DbtagPtr db_tag;
683 	CharPtr html_buf, text = NULL;
684 
685 	if (sfp == NULL) {
686 		return NULL;
687 	}
688 	if (sfp->data.choice == SEQFEAT_GENE) {
689 		grp = sfp->data.value.ptrvalue;
690 	}
691 	if(grp == NULL) {
692 		return NULL;
693 	}
694 	if(grp->locus)
695 	{
696 		html_buf = NULL;
697 		if(is_html)
698 		{
699 			html_buf = NULL;
700 			sip = SeqLocId(sfp->location);
701 			if(sip->choice == SEQID_GENERAL)
702 			{
703 				db_tag = sip->data.ptrvalue;
704 				if(db_tag->db != NULL)
705 					html_buf = find_db_html_pointer (db_tag->db, grp->locus);
706 			}
707 		}
708 
709 
710 		if(match_type == MATCH_QUERY)
711 		{
712 			if(is_html)
713 			{
714 				if(html_buf != NULL) {
715 					text = MemNew(StringLen(html_buf) + StringLen(grp->locus) + 20);
716 					sprintf(text, "Locus: %s<B>%s</B></a>\n", html_buf, grp->locus);
717 				} else {
718 					text = MemNew(StringLen(grp->locus) + 20);
719 					sprintf(text, "Locus: <B>%s</B>", grp->locus);
720 				}
721 			} else {
722 				text = MemNew(StringLen(grp->locus) + 20);
723 				sprintf(text, "Locus: [%s]\n", grp->locus);
724 			}
725 		} else {
726 			if(is_html && html_buf != NULL) {
727 				text = MemNew(StringLen(html_buf) + StringLen(grp->locus) + 20);
728 				sprintf(text, "Locus: %s%s</a>\n", html_buf, grp->locus);
729 			} else {
730 				text = MemNew(StringLen(grp->locus) + 20);
731 				sprintf(text, "Locus: %s",  grp->locus);
732 			}
733 		}
734 	}
735 	if(grp->desc)
736 	{
737 		text = MemNew(StringLen(grp->desc) + 30);
738 		sprintf(text, "Description: %s", grp->desc);
739 	}
740 	return text;
741 
742 }
743 
print_store_for_html(CharPtr temp,CharPtr html_buf,Int4Ptr c_pos,Int4 width,FILE * fp)744 static void print_store_for_html(CharPtr temp, CharPtr html_buf, Int4Ptr c_pos, Int4 width, FILE *fp)
745 {
746 	Int4 t_len;
747 	CharPtr str;
748 	Int4 from, to;
749 	Char white_sp;
750 	Char str_val[201];
751 
752 	t_len = StringLen(temp);
753 	if(t_len + (*c_pos) <= width)
754 	{
755 		if(html_buf != NULL)
756 			fprintf(fp, "%s", html_buf);
757 		fprintf(fp, "%s", temp);
758 		if(html_buf != NULL)
759 			fprintf(fp, "</a>");
760 
761 		*c_pos += t_len;
762 		if(*c_pos == width)
763 		{
764 			fprintf(fp, "<br>");
765 			fprintf(fp, "\n");
766 			*c_pos = 0;
767 		}
768 	}
769 	else
770 	{
771 		if(html_buf != NULL)
772 			fprintf(fp, "%s", html_buf);
773 		white_sp = '\0';
774 		t_len = 0;
775 		from = 0;
776 		to = -1;
777 		for(str = temp; str != NULL && *str !='\0'; ++str)
778 		{
779 			if(IS_WHITESP(*str))
780 			{
781 				if(t_len > 0)
782 				{
783 					if((to - from +1) + t_len + *c_pos > width)
784 					{
785 						StringNCpy(str_val, temp+from, to-from+1);
786 						str_val[to-from+1] = '\0';
787 						fprintf(fp, "%s\n", str_val);
788 						*c_pos = 0;
789 						from = to+1;
790 					}
791 					to += (t_len +1);
792 					if(*str == '\n')
793 					{
794 						StringNCpy(str_val, temp+from, to-from+1);
795 						str_val[to-from+1] = '\0';
796 						fprintf(fp, "%s", str_val);
797 						*c_pos = 0;
798 						from = to +1;
799 					}
800 
801 				}
802 				else
803 				{
804 					to += 1;
805 				}
806 				t_len = 0;
807 				white_sp = *str;
808 
809 			}
810 			else
811 				++t_len;
812 		}
813 
814 		if(to - from +1 > 0)
815 		{
816 			*c_pos += to - from +1;
817 			StringNCpy(str_val, temp+from, to-from+1);
818 			str_val[to-from+1] = '\0';
819 			fprintf(fp, "%s", str_val);
820 			if(html_buf != NULL)
821 				fprintf(fp, "</a>");
822 
823 			if(*c_pos == width)
824 			{
825 				fprintf(fp, "<br>");
826 				fprintf(fp, "\n");
827 				*c_pos =0;
828 			}
829 		}
830 		if(html_buf != NULL)
831 			fprintf(fp, "</a>");
832 	}
833 }
834 
835 
836 
837 static void print_seqid PROTO((SeqIdPtr sip, CharPtr buf, Int2 buf_size));
838 
print_store_seqid(SeqIdPtr sip,CharPtr buf,Int4 buf_size,Int4Ptr len,FILE * fp,Boolean is_html,Int4Ptr index,Boolean first)839 static Boolean print_store_seqid(SeqIdPtr sip, CharPtr buf, Int4 buf_size, Int4Ptr len, FILE *fp, Boolean is_html, Int4Ptr index, Boolean first)
840 {
841 	Char temp[101];
842 	CharPtr html_buf;
843 	DbtagPtr db_tag;
844 	ObjectIdPtr oip;
845 
846 	if(sip == NULL)
847 		return FALSE;
848 	if(!first)
849 	{
850 		StringCpy(temp, " ");
851 		if(is_html)
852 			print_store_for_html(temp, NULL, index, (Int4)(prt_col.width), fp);
853 		else
854 			print_store_buf(temp, buf, buf_size, len, fp);
855 	}
856 	html_buf = NULL;
857 
858 	if(sip->choice == SEQID_GI)
859 	{
860 		MuskSeqIdWrite(sip, temp, 100, PRINTID_TEXTID_ACCESSION, TRUE, TRUE);
861 		if(is_html)
862 		{
863 			sprintf(HTML_buffer, "<a href=\"http://www.ncbi.nlm.nih.gov/"
864                 "htbin-post/Entrez/query?form=6&dopt=g&db=n&"
865                  "uid=%08ld\">", (long) sip->data.intvalue);
866 			html_buf = HTML_buffer;
867 		}
868 	}
869 	else
870 	{
871 		if(sip->choice == SEQID_GENERAL)
872 		{
873 			db_tag = sip->data.ptrvalue;
874 			if(is_html && StringICmp(db_tag->db, "UNIGENE") == 0)
875 			{
876 				oip = db_tag->tag;
877 				sprintf(HTML_buffer, "<a href=\"http://www.ncbi.nlm.nih.gov/"
878                 "cgi-bin/Schuler/clust2html?Homo+sapiens+%ld\">",(long) oip->id);
879 				html_buf = HTML_buffer;
880 			}
881 			print_seqid (sip, temp, 100);
882 		}
883 		else
884 			MuskSeqIdWrite(sip, temp, 100, PRINTID_TEXTID_ACCESSION, FALSE, FALSE);
885 	}
886 
887 	if(is_html)
888 		print_store_for_html(temp, html_buf, index, (Int4)(prt_col.width), fp);
889 	else
890 		print_store_buf(temp, buf, buf_size, len, fp);
891 	return TRUE;
892 }
893 
fetch_this_bioseq(SeqIdPtr sip)894 static Boolean fetch_this_bioseq(SeqIdPtr sip)
895 {
896 	ObjectIdPtr oip;
897 	DbtagPtr db_tag;
898 
899 	if(sip->choice == SEQID_LOCAL)
900 	{
901 		oip = sip->data.ptrvalue;
902 		if(oip->str)
903 			return (StringNCmp(oip->str, "HGM", 3) == 0);
904 	}
905 	else if(sip->choice == SEQID_GENERAL)
906 	{
907 		db_tag = sip->data.ptrvalue;
908 		if(StringCmp(db_tag->db, "HUMGEN") == 0)
909 		{
910 			oip = db_tag->tag;
911 			return (oip->id > 0);
912 		}
913 	}
914 
915 	return FALSE;
916 }
917 
PrintSequenceToFile(SeqLocPtr slp,FILE * fp,Uint1 print_loc,NumberingPtr np,GatherRangePtr grp,Boolean is_html)918 static Boolean PrintSequenceToFile(SeqLocPtr slp, FILE *fp, Uint1 print_loc, NumberingPtr np, GatherRangePtr grp, Boolean is_html)
919 {
920 	SeqIdPtr sip;
921 	BioseqPtr bsp;
922 	SeqAlignPtr align;
923 	Int4 len;
924 	Char temp[101];
925 	Char temp_1[41], temp_2[41];
926 	DenseSegPtr dsp;
927 	Char buf[1001];
928 	Int4 buf_size = 1000;
929 	Int4 index = 0;
930 	Boolean first;
931 	SeqLocPtr t_slp;
932 
933 	if(slp == NULL)
934 		return FALSE;
935 	sip = SeqLocId(slp);
936 	len = 0;
937 	print_store_seqid(sip, buf, buf_size, &len, fp, is_html, &index, TRUE);
938 
939 
940 	if(print_loc != PRINT_LOC_NONE)
941 	{	/*print out the location on the genome */
942 		if(print_loc == PRINT_LOC_BOGO || np == NULL)
943 			sprintf(temp, ": %ld - %ld (bp)", (long) grp->left, (long) grp->right);
944 		else
945 		{
946 
947 			map_unit_label(grp->left, np, temp_1, FALSE);
948 			map_unit_label(grp->right, np, temp_2, FALSE);
949 
950 			sprintf(temp, ": %s - %s (bp) on the genome", temp_1, temp_2);
951 		}
952 		if(is_html)
953 		{
954 			StringCat(temp, "<br>");
955 			StringCat(temp, "\n");
956 			print_store_for_html(temp, NULL, &index, (Int4)prt_col.width, fp);
957 		}
958 		else
959 			print_store_buf(temp, buf, buf_size, &len, fp);
960 	}
961 	if(len > 0)
962 	{
963 		StringCat(buf, "\n");
964 		SendTextToFile (fp, buf, &prt_par, &prt_col);
965 	}
966 
967 	if(fetch_this_bioseq(sip))
968 	{	/* fetch the hum-gen record */
969 		bsp = BioseqLockById(sip);
970 		if(bsp != NULL)
971 		{
972 			if(bsp->hist != NULL)
973 			{
974 				len = 0;
975 				index = 0;
976 				align = bsp->hist->assembly;
977 				first = TRUE;
978 				while(align)
979 				{
980 					if(align->segtype == 2)
981 					{
982 						dsp = align->segs;
983 						sip = dsp->ids->next;
984 						print_store_seqid(sip, buf, buf_size, &len, fp, is_html, &index, first);
985 						first = FALSE;
986 					}
987 					align = align->next;
988 				}
989 				if(!is_html)
990 				{
991 					if(len > 0)
992 					{
993 						StringCat(buf, "\n");
994 						SendTextToFile (fp, buf, &prt_par, &prt_col);
995 					}
996 				}
997 				else if(index > 0) {
998 					fprintf(fp, "<br>");
999 					fprintf(fp, "\n");
1000 				}
1001 			}
1002 			else if(bsp->repr == Seq_repr_seg && bsp->seq_ext_type == 1)
1003 			{
1004 				t_slp = bsp->seq_ext;
1005 				len = 0;
1006 				index = 0;
1007 				first = TRUE;
1008 				while(t_slp)
1009 				{
1010 					if(SeqLocId(t_slp) != NULL)
1011 						print_store_seqid(SeqLocId(t_slp), buf, buf_size, &len, fp, is_html, &index, first);
1012 					first = FALSE;
1013 					t_slp = t_slp->next;
1014 				}
1015 
1016 				if(!is_html)
1017 				{
1018 					if(len > 0)
1019 					{
1020 						StringCat(buf, "\n");
1021 						SendTextToFile (fp, buf, &prt_par, &prt_col);
1022 					}
1023 				}
1024 				else if(index > 0) {
1025 					fprintf(fp, "<br>");
1026 					fprintf(fp, "\n");
1027 				}
1028 			}
1029 			BioseqUnlock(bsp);
1030 		}
1031 	}
1032 	if(is_html)
1033 		fprintf(fp, "<br>");
1034 	fprintf(fp, "\n");
1035 
1036 	return TRUE;
1037 }
1038 
1039 
1040 
1041 
1042 
1043 
1044 
1045 
1046 
1047 
is_sfp_query_gene(GeneDataPtr gdata,Uint4 itemID,Uint2 entityID,Uint2 itemType)1048 static Boolean is_sfp_query_gene (GeneDataPtr gdata, Uint4 itemID,
1049 								  Uint2 entityID, Uint2 itemType)
1050 {
1051 	while(gdata)
1052 	{
1053 		if(gdata->entityID == entityID && gdata->itemID == itemID &&
1054 			gdata->itemType == itemType)
1055 			return TRUE;
1056 		gdata = gdata->next;
1057 	}
1058 
1059 	return FALSE;
1060 }
1061 
is_loc_match_align(GeneDataPtr gdata,SeqFeatPtr sfp)1062 static Boolean is_loc_match_align (GeneDataPtr gdata, SeqFeatPtr sfp)
1063 {
1064 	StdSegPtr ssp;
1065 	SeqLocPtr slp;
1066 
1067 	while(gdata)
1068 	{
1069 		if(gdata->align_seg != NULL)
1070 		{
1071 			ssp = gdata->align_seg->data.ptrvalue;
1072 			for(slp = ssp->loc; slp != NULL; slp = slp->next)
1073 			{
1074 				if(SeqLocCompare (slp, sfp->location) == SLC_A_EQ_B)
1075 					return TRUE;
1076 			}
1077 		}
1078 		gdata = gdata->next;
1079 	}
1080 
1081 	return FALSE;
1082 }
1083 
1084 
1085 
print_seqid(SeqIdPtr sip,CharPtr buf,Int2 buf_size)1086 static void print_seqid (SeqIdPtr sip, CharPtr buf, Int2 buf_size)
1087 {
1088 	DbtagPtr db_tag;
1089 	ObjectIdPtr oip;
1090 
1091 	if(sip->choice == SEQID_GENERAL)
1092 	{
1093 		db_tag = sip->data.ptrvalue;
1094 		oip = db_tag->tag;
1095 		if(oip->str != NULL)
1096 			sprintf(buf, "%s %s", db_tag->db, oip->str);
1097 		else
1098 			sprintf(buf, "%s %ld", db_tag->db, (long) oip->id);
1099 	}
1100 	else
1101 		SeqIdWrite(sip, buf, PRINTID_TEXTID_ACCESSION, buf_size);
1102 }
1103 
1104 
print_bioseq_descriptor(BioseqPtr bsp,SeqLocPtr slp,FILE * fp,Int2 line_len)1105 static void print_bioseq_descriptor (BioseqPtr bsp, SeqLocPtr slp, FILE *fp, Int2 line_len)
1106 {
1107 	Int2 i;
1108 	Char buf[1001];
1109 	ValNodePtr descr;
1110 
1111 	for(i =0; i<line_len; ++i)
1112 		fprintf(fp, "*");
1113 	fprintf(fp, "\n");
1114 	print_seqid (bsp->id, buf, 1000);
1115 	fprintf(fp, "%s\n", buf);
1116 
1117 	for(descr = bsp->descr; descr != NULL; descr = descr->next)
1118 	{
1119 		if(descr->choice == Seq_descr_title || descr->choice == Seq_descr_name)
1120 		{
1121 			sprintf(buf, "%s\n", (CharPtr)(descr->data.ptrvalue));
1122 			SendTextToFile(fp, buf, &prt_par, &prt_col);
1123 		}
1124 	}
1125 	sprintf (buf, "Region: %ld-%ld(bp) on the Chromosome\n", (long) SeqLocStart(slp), (long) SeqLocStop(slp));
1126 	SendTextToFile(fp, buf, &prt_par, &prt_col);
1127 	for(i =0; i<line_len; ++i)
1128 		fprintf(fp, "*");
1129 	fprintf(fp, "\n");
1130 
1131 }
1132 
1133 
prtgenefunc(GatherContextPtr gcp)1134 static Boolean prtgenefunc(GatherContextPtr gcp)
1135 {
1136 
1137 	PrintGenePtr pgp;
1138 	SeqFeatPtr sfp;
1139 	Uint1 match_type;
1140 	SeqLocPtr slp;
1141 
1142 	if(gcp == NULL)
1143 		return FALSE;
1144 
1145 	pgp = (PrintGenePtr)(gcp->userdata);
1146 	if(pgp == NULL)
1147 		return FALSE;
1148 
1149 	switch(gcp->thistype)
1150 	{
1151 	case OBJ_SEQFEAT:
1152 	case OBJ_BIOSEQ_MAPFEAT:
1153 
1154 		sfp = (SeqFeatPtr)(gcp->thisitem);
1155 		if(sfp == NULL || sfp->data.choice != 1)
1156 			return TRUE;
1157 
1158 		match_type = MATCH_NONE;
1159 		if(is_sfp_query_gene (pgp->g_data, gcp->itemID,
1160 			gcp->entityID, gcp->thistype))
1161 			match_type = MATCH_QUERY;
1162 		else if (is_loc_match_align (pgp->g_data, sfp))
1163 			match_type = MATCH_ALIGN;
1164 		if(pgp->prev_type != GENE_MARKER)
1165 		{
1166 			pgp->prev_type = GENE_MARKER;
1167 			fprintf(pgp->fp, "\nSTS Markers\n\n");
1168 		}
1169 
1170 		PrintGeneRefToFile(sfp, pgp->fp, match_type, pgp->print_loc, pgp->np, pgp->html);
1171 		pgp->found = TRUE;
1172 		break;
1173 
1174 	case OBJ_BIOSEQ_SEG:	/*segments of a segmented sequence*/
1175 		slp = (SeqLocPtr)(gcp->thisitem);
1176 		if(!is_map_segment(slp))
1177 		{
1178 			if(pgp->prev_type != SEQ_SEGMENT)
1179 			{
1180 				pgp->prev_type = SEQ_SEGMENT;
1181 				fprintf(pgp->fp, "\nSequence Data\n\n");
1182 			}
1183 
1184 			PrintSequenceToFile(slp, pgp->fp, pgp->print_loc, pgp->np, &(gcp->extremes), pgp->html);
1185 			pgp->found = TRUE;
1186 		}
1187 		break;
1188 	default:
1189 		break;
1190 	}
1191 	return TRUE;
1192 }
1193 
1194 
1195 /******************************************************************
1196 *
1197 *	print the everything in the interval slp to a text file
1198 *	slp: the interval
1199 *	g_data: the query gene
1200 *	is_html: make it a html page
1201 *	line_len; the length of the file
1202 *	fp: the output file
1203 *
1204 ********************************************************************/
print_genome_interval(SeqLocPtr slp,GeneDataPtr g_data,Boolean is_html,Int2 line_len,FILE * fp)1205 Boolean print_genome_interval(SeqLocPtr slp, GeneDataPtr g_data, Boolean is_html, Int2 line_len, FILE *fp)
1206 {
1207 	GatherScope gs;
1208 	PrintGene pg;
1209 	SeqEntryPtr sep;
1210 	BioseqPtr bsp;
1211 
1212 	if(slp == NULL || fp == NULL)
1213 		return FALSE;
1214 	sep = SeqEntryFind(SeqLocId(slp));
1215 	if(sep == NULL)
1216 		return FALSE;
1217 	bsp = BioseqFind(SeqLocId(slp));
1218 	if(bsp == NULL)
1219 		return FALSE;
1220 
1221 	pg.g_data = g_data;
1222 	pg.html = is_html;
1223 	pg.fp = fp;
1224 	pg.found = FALSE;
1225 	pg.print_loc = PRINT_LOC_NUM;
1226 	pg.np = getBioseqNumbering(bsp);
1227 	pg.prev_type = 0;
1228 
1229 	prt_col.width = line_len;
1230 	print_bioseq_descriptor (bsp, slp, fp, line_len);
1231 
1232 
1233 	MemSet((Pointer)(&gs), 0, sizeof(GatherScope));
1234 	MemSet((Pointer)(gs.ignore), (int)(TRUE), (size_t)OBJ_MAX * sizeof(Boolean));
1235 	gs.ignore[OBJ_SEQFEAT] = FALSE;
1236 	gs.ignore[OBJ_SEQANNOT] = FALSE;
1237 	gs.ignore[OBJ_BIOSEQ_MAPFEAT] = FALSE;
1238 	gs.ignore[OBJ_BIOSEQ] = FALSE;
1239 	if(bsp->repr == Seq_repr_seg && bsp->seq_ext_type == 1)
1240 		gs.ignore[OBJ_BIOSEQ_SEG] = FALSE;
1241 	gs.nointervals = TRUE;
1242 	gs.target = slp;
1243 	gs.offset = SeqLocStart(slp);
1244 	gs.get_feats_location = TRUE;
1245 	GatherSeqEntry(sep, (Pointer)(&pg), prtgenefunc, &gs);
1246 
1247 	if(pg.found == FALSE)
1248 		fprintf(fp, "None\n");
1249 	return (pg.found);
1250 }
1251 
1252