7081
7172
gap_locations = ValNodeFreeData (gap_locations);
7176
CalculateGapCoverage
7179
SeqMgrFeatContext context,
7180
Boolean include_terminal_gaps)
7185
Int4 seq_offset = 0;
7187
Int4 k, start, stop;
7190
|| bsp == NULL || !ISA_na (bsp->mol)
7191
|| bsp->repr != Seq_repr_delta || bsp->seq_ext_type != 4)
7196
dsp = (DeltaSeqPtr) bsp->seq_ext;
7197
while (dsp != NULL && seq_offset < context.right)
7199
if (dsp->choice == 1)
7201
loc = (SeqLocPtr) dsp->data.ptrvalue;
7204
seq_offset += SeqLocLen (loc);
7207
else if (dsp->choice == 2)
7209
slip = (SeqLitPtr) dsp->data.ptrvalue;
7212
if (slip->seq_data == NULL
7213
&& slip->fuzz == NULL)
7215
if (seq_offset <= context.left && seq_offset + slip->length >= context.right)
7217
/* gap covers entire location */
7218
return SeqLocLen (slp);
7220
else if (include_terminal_gaps ||
7221
(seq_offset > context.left
7222
&& seq_offset + slip->length < context.right))
7224
/* we only count internal gaps */
7225
for (k = 0; k < context.numivals; k += 2)
7227
start = context.ivals [k];
7228
stop = context.ivals [k + 1];
7229
if (seq_offset <= start && seq_offset + slip->length > stop)
7231
/* gap covers entire interval */
7232
covered += stop - start;
7234
else if (seq_offset > start && seq_offset + slip->length < stop)
7236
/* interval covers entire gap */
7237
covered += slip->length;
7239
else if (seq_offset < start && seq_offset + slip->length < stop)
7241
/* gap covers left end of interval */
7242
covered += seq_offset + slip->length - start;
7244
else if (seq_offset > start && seq_offset + slip->length > stop)
7246
/* gap covers right end of interval */
7247
covered += stop - seq_offset;
7252
seq_offset += slip->length;
7263
RemoveTerminalGapsFromLocation
7266
SeqMgrFeatContext context)
7269
SeqLocPtr loc, slp_copy;
7271
Int4 seq_offset = 0;
7273
Boolean changed = FALSE, partial5, partial3;
7280
CheckSeqLocForPartial (slp, &partial5, &partial3);
7282
slp_copy = (SeqLocPtr) AsnIoMemCopy (slp,
7283
(AsnReadFunc) SeqLocAsnRead,
7284
(AsnWriteFunc) SeqLocAsnWrite);
7285
if (bsp == NULL || !ISA_na (bsp->mol)
7286
|| bsp->repr != Seq_repr_delta || bsp->seq_ext_type != 4)
7291
dsp = (DeltaSeqPtr) bsp->seq_ext;
7292
while (dsp != NULL && seq_offset < context.right && slp_copy != NULL)
7294
if (dsp->choice == 1)
7296
loc = (SeqLocPtr) dsp->data.ptrvalue;
7299
seq_offset += SeqLocLen (loc);
7302
else if (dsp->choice == 2)
7304
slip = (SeqLitPtr) dsp->data.ptrvalue;
7307
if (slip->seq_data == NULL
7308
&& slip->fuzz == NULL)
7310
if (seq_offset <= context.left && seq_offset + slip->length >= context.right)
7312
slp_copy = SeqLocFree (slp_copy);
7314
else if (seq_offset <= context.left && seq_offset + slip->length >= context.left)
7316
sip = SeqIdDup (SeqLocId (slp_copy));
7317
slp_copy = SeqLocDeleteEx (slp_copy, sip,
7318
context.left, seq_offset + slip->length - 1,
7319
FALSE, &changed, &partial5, &partial3);
7320
sip = SeqIdFree (sip);
7324
if (seq_offset <= context.right && seq_offset + slip->length >= context.right)
7326
sip = SeqIdDup (SeqLocId (slp_copy));
7327
slp_copy = SeqLocDeleteEx (slp_copy, sip,
7328
seq_offset, context.right,
7329
FALSE, &changed, &partial5, &partial3);
7330
sip = SeqIdFree (sip);
7333
seq_offset += slip->length;
7339
if (slp_copy != NULL)
7341
SetSeqLocPartial (slp_copy, partial5, partial3);
7348
AdjustOneCodingRegionWithTerminalGapsOnBioseq
7351
SeqMgrFeatContext context)
7353
SeqLocPtr adjusted_loc;
7354
Int4 seq_offset = 0;
7355
Int4 loc_len, adjusted_len;
7356
Boolean partial5, partial3;
7358
SeqFeatPtr gene_sfp;
7359
SeqMgrFeatContext gene_context;
7361
if (bsp == NULL || !ISA_na (bsp->mol)
7362
|| bsp->repr != Seq_repr_delta || bsp->seq_ext_type != 4
7364
|| (sfp->data.choice != SEQFEAT_CDREGION && sfp->idx.subtype != FEATDEF_mRNA))
7369
loc_len = SeqLocLen (sfp->location);
7371
adjusted_loc = RemoveTerminalGapsFromLocation (bsp, sfp->location, context);
7372
adjusted_len = SeqLocLen (adjusted_loc);
7373
if (adjusted_loc != NULL && adjusted_len < loc_len)
7375
gene_sfp = SeqMgrGetOverlappingGene (sfp->location, &gene_context);
7376
if (gene_sfp != NULL
7377
&& SeqLocCompare (gene_sfp->location, sfp->location) == SLC_A_EQ_B)
7379
gene_sfp->location = SeqLocFree (gene_sfp->location);
7380
gene_sfp->location = (SeqLocPtr) AsnIoMemCopy (adjusted_loc,
7381
(AsnReadFunc) SeqLocAsnRead,
7382
(AsnWriteFunc) SeqLocAsnWrite);
7385
sfp->location = SeqLocFree (sfp->location);
7386
sfp->location = adjusted_loc;
7387
adjusted_loc = NULL;
7388
CheckSeqLocForPartial (sfp->location, &partial5, &partial3);
7389
sfp->partial = partial5 || partial3;
7391
protbsp = BioseqFindFromSeqLoc (sfp->product);
7393
if (sfp->data.choice == SEQFEAT_CDREGION)
7396
AdjustFrame (sfp, protbsp);
7398
/* retranslate coding region */
7399
SeqEdTranslateOneCDS (sfp, bsp, sfp->idx.entityID);
7401
/* set partials on product */
7402
SetProductSequencePartials (protbsp, partial5, partial3);
7406
adjusted_loc = SeqLocFree (adjusted_loc);
7410
static void AdjustCodingRegionsEndingInGapOnBioseq (BioseqPtr bsp, Pointer userdata)
7412
SeqMgrFeatContext context;
7415
if (bsp == NULL || !ISA_na (bsp->mol)
7416
|| bsp->repr != Seq_repr_delta || bsp->seq_ext_type != 4)
7421
for (sfp = SeqMgrGetNextFeature (bsp, NULL, SEQFEAT_CDREGION, 0, &context);
7423
sfp = SeqMgrGetNextFeature (bsp, sfp, SEQFEAT_CDREGION, 0, &context))
7425
AdjustOneCodingRegionWithTerminalGapsOnBioseq (bsp, sfp, context);
7427
for (sfp = SeqMgrGetNextFeature (bsp, NULL, SEQFEAT_RNA, FEATDEF_mRNA, &context);
7429
sfp = SeqMgrGetNextFeature (bsp, sfp, SEQFEAT_RNA, FEATDEF_mRNA, &context))
7431
AdjustOneCodingRegionWithTerminalGapsOnBioseq (bsp, sfp, context);
7435
extern void AdjustCodingRegionsEndingInGap (IteM i)
7441
bfp = currentFormDataPtr;
7443
bfp = GetObjectExtra (i);
7445
if (bfp == NULL) return;
7446
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
7447
if (sep == NULL) return;
7449
VisitBioseqsInSep (sep, NULL, AdjustCodingRegionsEndingInGapOnBioseq);
7450
DeleteMarkedObjects (bfp->input_entityID, 0, NULL);
7451
ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
7452
ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
7455
typedef struct cdstomiscfeatform
7459
GrouP all_or_percent_grp;
7460
DialoG string_constraint_dlg;
7462
Boolean convert_all;
7464
StringConstraintPtr scp;
7466
} CDSToMiscFeatFormData, PNTR CDSToMiscFeatFormPtr;
7468
static void ConvertCDSToMiscFeatFeatureCallback (SeqFeatPtr sfp, Pointer userdata, FilterSetPtr fsp)
7470
CDSToMiscFeatFormPtr cmffp;
7471
Int4 orig_len, covered_len;
7472
SeqMgrFeatContext context;
7473
SeqEntryPtr oldscope;
7475
cmffp = (CDSToMiscFeatFormPtr) userdata;
7477
if (sfp == NULL || cmffp == NULL || cmffp->bsp == NULL)
7482
sfp = SeqMgrGetDesiredFeature (sfp->idx.entityID, cmffp->bsp, sfp->idx.itemID, 0, sfp, &context);
7488
oldscope = SeqEntrySetScope (NULL);
7490
orig_len = SeqLocLen (sfp->location);
7491
covered_len = CalculateGapCoverage (cmffp->bsp, sfp->location, context, cmffp->convert_all);
7492
if (covered_len >= orig_len / 2 || (cmffp->convert_all && covered_len > 0))
7494
ConvertCDSToMiscFeat (sfp);
7497
SeqEntrySetScope (oldscope);
7500
static void ConvertGappedCodingRegionsToMiscFeatBioseqCallback (BioseqPtr bsp, Pointer userdata)
7502
CDSToMiscFeatFormPtr cmffp;
7505
if (bsp == NULL || !ISA_na (bsp->mol)
7506
|| bsp->repr != Seq_repr_delta || bsp->seq_ext_type != 4
7507
|| userdata == NULL)
7512
sep = SeqMgrGetSeqEntryForData (bsp);
7514
cmffp = (CDSToMiscFeatFormPtr) userdata;
7517
OperateOnSeqEntryConstrainedObjects (sep, cmffp->fsp,
7518
ConvertCDSToMiscFeatFeatureCallback,
7519
NULL, SEQFEAT_CDREGION, FEATDEF_CDS, 0, cmffp);
7523
static void AcceptCDSToMiscFeat (ButtoN b)
7525
CDSToMiscFeatFormPtr cmffp;
7528
cmffp = (CDSToMiscFeatFormPtr) GetObjectExtra (b);
7534
if (GetValue (cmffp->all_or_percent_grp) == 2)
7536
cmffp->convert_all = TRUE;
7540
cmffp->convert_all = FALSE;
7543
cmffp->fsp = FilterSetNew();
7544
cmffp->fsp->scp = DialogToPointer (cmffp->string_constraint_dlg);
7546
sep = GetTopSeqEntryForEntityID (cmffp->input_entityID);
7547
if (sep == NULL) return;
7549
VisitBioseqsInSep (sep, cmffp, ConvertGappedCodingRegionsToMiscFeatBioseqCallback);
7550
DeleteMarkedObjects (cmffp->input_entityID, 0, NULL);
7551
ObjMgrSetDirtyFlag (cmffp->input_entityID, TRUE);
7552
ObjMgrSendMsg (OM_MSG_UPDATE, cmffp->input_entityID, 0, 0);
7553
Remove (cmffp->form);
7556
extern void ConvertCodingRegionsWithInternalKnownGapToMiscFeat (IteM i)
7559
CDSToMiscFeatFormPtr cmffp;
7565
bfp = currentFormDataPtr;
7567
bfp = GetObjectExtra (i);
7569
if (bfp == NULL) return;
7571
cmffp = (CDSToMiscFeatFormPtr) MemNew (sizeof (CDSToMiscFeatFormData));
7572
if (cmffp == NULL) return;
7574
w = FixedWindow (-50, -33, -10, -10, "Convert Coding Regions With Gaps to Misc_Feat", StdCloseWindowProc);
7575
SetObjectExtra (w, cmffp, StdCleanupFormProc);
7576
cmffp->form = (ForM) w;
7577
cmffp->input_entityID = bfp->input_entityID;
7578
h = HiddenGroup (w, -1, 0, NULL);
7579
SetGroupSpacing (h, 10, 10);
7581
cmffp->all_or_percent_grp = HiddenGroup (h, 0, 2, NULL);
7582
SetGroupSpacing (cmffp->all_or_percent_grp, 10, 10);
7583
RadioButton (cmffp->all_or_percent_grp, "Convert only when internal gap covers 50% or more of the coding region");
7584
RadioButton (cmffp->all_or_percent_grp, "Convert all coding regions with gaps (both terminal and internal)");
7585
SetValue (cmffp->all_or_percent_grp, 1);
7587
cmffp->string_constraint_dlg = StringConstraintDialog (h, "Where feature text", FALSE);
7589
c = HiddenGroup (h, 2, 0, NULL);
7590
SetGroupSpacing (c, 10, 10);
7591
b = PushButton (c, "Accept", AcceptCDSToMiscFeat);
7592
SetObjectExtra (b, cmffp, NULL);
7593
PushButton (c, "Cancel", StdCancelButtonProc);
7594
AlignObjects (ALIGN_CENTER, (HANDLE) cmffp->all_or_percent_grp,
7595
(HANDLE) cmffp->string_constraint_dlg,
7084
7604
/*---------------------------------------------------------------------*/
7086
7606
/* Apply_AddCDS () -- */