39
39
* ------- ---------- -----------------------------------------------------
41
41
* $Log: seqmgr.c,v $
42
* Revision 6.263 2006/04/13 20:02:15 kans
43
* LookupFarSeqIDs takes inference parameter
45
* Revision 6.262 2006/04/05 17:18:23 kans
46
* IndexSegmentedParts uses Int4 for numsegs to avoid overflow to negative number, failure to MemNew
48
* Revision 6.261 2006/03/21 15:32:13 kans
49
* set ignore flag on generated gaps in IndexRecordedFeatures, not as side effect of sorting callback
51
* Revision 6.260 2006/03/20 22:53:44 kans
52
* sort flatfile-generated gap feature last, set ignore flag
54
* Revision 6.259 2006/02/17 19:05:05 kans
55
* special case coded_by only for CDS feature on isolated protein bioseq
57
* Revision 6.258 2006/02/17 18:46:20 kans
58
* get gene overlapping coded_by CDS on isolated protein bioseq within flatfile generator, not feature indexer
60
* Revision 6.257 2006/02/17 17:24:24 kans
61
* changes to index CDS feature (with ignore flag) on isolated protein bioseq, xref gene feature
63
* Revision 6.256 2006/02/16 22:00:55 kans
64
* always pass FALSE for circular to CheckForTransSplice for more stringency
66
* Revision 6.255 2006/02/16 21:09:20 kans
67
* SeqMgrGetBestOverlappingFeat takes new parameter from get best gene by overlap, uses LOCATION_SUBSET if gene candidate is bad_order or mixed_strand
69
* Revision 6.254 2006/02/16 20:24:32 kans
70
* added bad_order and mixed_strand fields to feature index - to be used for get best gene overlap function in cases of trans-splicing
72
* Revision 6.253 2006/01/20 20:12:21 kans
73
* in LockAllSegments, bail if BioseqLockById returns NULL
42
75
* Revision 6.252 2005/09/21 19:20:45 kans
43
76
* SeqMgrGetNextAnnotDesc sets context->index properly
6203
static void CheckForTransSplice (
6206
BoolPtr mixed_strandP,
6211
Boolean mixed_strand = FALSE, ordered = TRUE;
6213
SeqLocPtr prev, tmp;
6214
SeqIntPtr sip1, sip2, prevsip;
6215
Uint1 strand1, strand2;
6217
if (sfp == NULL || sfp->location == NULL) return;
6224
strand1 = Seq_strand_other;
6226
while ((tmp = SeqLocFindNext (sfp->location, tmp)) != NULL) {
6228
/* just check seqloc_interval */
6230
if (tmp->choice == SEQLOC_INT) {
6232
sip2 = (SeqIntPtr) (tmp->data.ptrvalue);
6233
strand2 = sip2->strand;
6235
if ((sip1 != NULL) && (ordered) && (! circular)) {
6236
if (SeqIdForSameBioseq (sip1->id, sip2->id)) {
6237
if (strand2 == Seq_strand_minus) {
6238
if (sip1->to < sip2->to) {
6242
if (sip1->to > sip2->to) {
6249
if ((strand1 != Seq_strand_other) && (strand2 != Seq_strand_other)) {
6250
if (SeqIdForSameBioseq (id1, id2)) {
6251
if (strand1 != strand2) {
6252
if (strand1 == Seq_strand_plus && strand2 == Seq_strand_unknown) {
6253
/* unmarked_strand = TRUE; */
6254
} else if (strand1 == Seq_strand_unknown && strand2 == Seq_strand_plus) {
6255
/* unmarked_strand = TRUE; */
6257
mixed_strand = TRUE;
6268
/* Publication intervals ordering does not matter */
6270
if (sfp->idx.subtype == FEATDEF_PUB) {
6274
/* ignore ordering of heterogen bonds */
6276
if (sfp->data.choice == SEQFEAT_HET) {
6280
/* misc_recomb intervals SHOULD be in reverse order */
6282
if (sfp->idx.subtype == FEATDEF_misc_recomb) {
6286
/* primer_bind intervals MAY be in on opposite strands */
6288
if (sfp->idx.subtype == FEATDEF_primer_bind) {
6289
mixed_strand = FALSE;
6297
*mixed_strandP = TRUE;
6162
6301
typedef struct adpbspdata {
6163
6302
AnnotDescPtr adp;
6677
mixed_strand = FALSE;
6678
CheckForTransSplice (sfp, &bad_order, &mixed_strand, /* (Boolean) (bsp->topology == TOPOLOGY_CIRCULAR) */ FALSE);
6520
6680
RecordOneFeature (bspextra, omdp, bsp, exindx, sfp, left,
6521
right, gop->itemID, gop->subtype, usingLocalBsp, FALSE);
6681
right, gop->itemID, gop->subtype, usingLocalBsp,
6682
bad_order, mixed_strand, special_case);
6523
6684
/* record gene, publication, and biosource features twice if spanning the origin */
8265
8468
AssignIDsInEntityEx (entityID, 0, NULL, extra);
8470
/* get first feature itemID in remote feature tables (including generated gaps) */
8472
for (vnp = extra; vnp != NULL && baseItemID == 0; vnp = vnp->next) {
8473
bsp = (BioseqPtr) vnp->data.ptrvalue;
8474
if (bsp == NULL) continue;
8475
for (sap = bsp->annot; sap != NULL && baseItemID == 0; sap = sap->next) {
8476
if (sap->type != 1) continue;
8477
for (sfp = (SeqFeatPtr) sap->data; sfp != NULL && baseItemID == 0; sfp = sfp->next) {
8478
baseItemID = sfp->idx.itemID;
8267
8483
/* set scope for FindAppropriateBioseq, FindFirstLocalBioseq */
8269
8485
oldscope = SeqEntrySetScope (sep);
8271
8487
/* gather all segmented locations */
8273
8490
exind.lastbsp = NULL;
8274
8491
exind.lastsap = NULL;
8275
8492
exind.lastbssp = NULL;
9029
9256
/* requires feature to be contained within gene, etc. */
9031
diff = TestForOverlap (feat, slp, left, right, overlapType, numivals, ivals);
9258
if (special && (feat->bad_order || feat->mixed_strand)) {
9259
diff = TestForOverlap (feat, slp, left, right, LOCATION_SUBSET, numivals, ivals);
9261
diff = TestForOverlap (feat, slp, left, right, overlapType, numivals, ivals);
9032
9263
if (diff >= 0) {
9034
9265
if (StrandsMatch (feat->strand, strand)) {
9063
9294
feat = array [hier];
9064
9295
if (feat != NULL && ((! feat->ignore) || userfunc == NULL)) {
9066
diff = TestForOverlap (feat, slp, left, right, overlapType, numivals, ivals);
9297
if (special && (feat->bad_order || feat->mixed_strand)) {
9298
diff = TestForOverlap (feat, slp, left, right, LOCATION_SUBSET, numivals, ivals);
9300
diff = TestForOverlap (feat, slp, left, right, overlapType, numivals, ivals);
9067
9302
if (diff >= 0) {
9069
9304
if (StrandsMatch (feat->strand, strand)) {
9134
9369
NLM_EXTERN SeqFeatPtr LIBCALL SeqMgrGetOverlappingGene (SeqLocPtr slp, SeqMgrFeatContext PNTR context)
9137
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_GENE, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL);
9372
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_GENE, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL, TRUE);
9140
9375
NLM_EXTERN SeqFeatPtr LIBCALL SeqMgrGetOverlappingmRNA (SeqLocPtr slp, SeqMgrFeatContext PNTR context)
9143
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_mRNA, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL);
9378
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_mRNA, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL, FALSE);
9146
9381
NLM_EXTERN SeqFeatPtr LIBCALL SeqMgrGetLocationSupersetmRNA (SeqLocPtr slp, SeqMgrFeatContext PNTR context)
9149
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_mRNA, NULL, 0, NULL, LOCATION_SUBSET, context, NULL, NULL, NULL);
9384
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_mRNA, NULL, 0, NULL, LOCATION_SUBSET, context, NULL, NULL, NULL, FALSE);
9152
9387
NLM_EXTERN SeqFeatPtr LIBCALL SeqMgrGetOverlappingCDS (SeqLocPtr slp, SeqMgrFeatContext PNTR context)
9155
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_CDS, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL);
9390
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_CDS, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL, FALSE);
9158
9393
NLM_EXTERN SeqFeatPtr LIBCALL SeqMgrGetOverlappingPub (SeqLocPtr slp, SeqMgrFeatContext PNTR context)
9161
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_PUB, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL);
9396
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_PUB, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL, FALSE);
9164
9399
NLM_EXTERN SeqFeatPtr LIBCALL SeqMgrGetOverlappingSource (SeqLocPtr slp, SeqMgrFeatContext PNTR context)
9167
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_BIOSRC, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL);
9402
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_BIOSRC, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL, FALSE);
9170
9405
NLM_EXTERN SeqFeatPtr LIBCALL SeqMgrGetOverlappingOperon (SeqLocPtr slp, SeqMgrFeatContext PNTR context)
9173
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_operon, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL);
9408
return SeqMgrGetBestOverlappingFeat (slp, FEATDEF_operon, NULL, 0, NULL, CONTAINED_WITHIN, context, NULL, NULL, NULL, FALSE);
9176
9411
/*****************************************************************************