415
417
CheckSeqLocForPartial (sfp->location, &partial5, &partial3);
416
418
if (partial5 && extend5)
418
start_diff = ExtendSeqLocToEnd (sfp->location, bsp, TRUE);
421
start_diff = ExtendSeqLocToEndOrGap (sfp->location, bsp, TRUE);
423
start_diff = ExtendSeqLocToEnd (sfp->location, bsp, TRUE);
419
425
if (start_diff > 0 && sfp->data.choice == SEQFEAT_CDREGION) {
420
426
crp = (CdRegionPtr) sfp->data.value.ptrvalue;
421
427
if (crp != NULL) {
429
435
if (partial3 && extend3)
431
ExtendSeqLocToEnd (sfp->location, bsp, FALSE);
438
ExtendSeqLocToEndOrGap (sfp->location, bsp, FALSE);
440
ExtendSeqLocToEnd (sfp->location, bsp, FALSE);
446
static void ExtendOnePartialFeatureEx (SeqFeatPtr sfp, Boolean extend5, Boolean extend3)
448
ExtendOnePartialFeatureExEx (sfp, extend5, extend3, FALSE);
452
static void ExtendOnePartialFeatureToEndOrGap (SeqFeatPtr sfp, Pointer userdata)
454
ExtendOnePartialFeatureExEx (sfp, TRUE, TRUE, TRUE);
435
458
static void ExtendOnePartialFeature (SeqFeatPtr sfp, Pointer userdata)
437
460
ExtendOnePartialFeatureEx (sfp, TRUE, TRUE);
538
562
extend5 = GetStatus (f->extend5);
539
563
extend3 = GetStatus (f->extend3);
564
stop_at_gaps = GetStatus (f->stop_at_gaps);
540
565
for (vnp = object_list; vnp != NULL; vnp = vnp->next) {
541
566
if (vnp->choice == OBJ_SEQFEAT && vnp->data.ptrvalue != NULL) {
542
ExtendOnePartialFeatureEx (vnp->data.ptrvalue, extend5, extend3);
567
ExtendOnePartialFeatureExEx (vnp->data.ptrvalue, extend5, extend3, stop_at_gaps);
545
570
object_list = ValNodeFree (object_list);
600
625
SetStatus (f->extend5, TRUE);
601
626
f->extend3 = CheckBox (g, "Extend partial 3'", NULL);
602
627
SetStatus (f->extend3, TRUE);
629
f->stop_at_gaps = CheckBox (h, "Stop at gaps", NULL);
630
SetStatus (f->stop_at_gaps, TRUE);
604
632
p2 = StaticPrompt (h, "Optional Constraint", 0, dialogTextHeight, programFont, 'c');
605
633
f->string_constraint = StringConstraintDialog (h, "Where feature text", FALSE, NULL, NULL);
4487
4518
if (head != NULL) {
4488
4519
PointerToDialog (ddp->biosample, (Pointer) head);
4490
ValNodeFreeData (head);
4521
head = ValNodeFreeData (head);
4524
} else if (StringICmp (oip->str, "ProbeDB") == 0) {
4525
if (curr->choice == 7) {
4527
cpp = (CharPtr PNTR) curr->data.ptrvalue;
4528
if (num > 0 && cpp != NULL) {
4530
for (i = 0; i < num; i++) {
4532
if (StringDoesHaveText (str)) {
4533
ValNodeCopyStr (&head, 0, str);
4537
PointerToDialog (ddp->probedb, (Pointer) head);
4539
head = ValNodeFreeData (head);
4572
4621
ValNodeFreeData (head);
4623
head = (ValNodePtr) DialogToPointer (ddp->probedb);
4626
for (vnp = head; vnp != NULL; vnp = vnp->next) {
4627
str = (CharPtr) vnp->data.ptrvalue;
4628
if (StringHasNoText (str)) continue;
4632
cpp = (CharPtr PNTR) MemNew (sizeof (CharPtr) * num);
4635
for (vnp = head; vnp != NULL; vnp = vnp->next) {
4636
str = (CharPtr) vnp->data.ptrvalue;
4637
if (StringHasNoText (str)) continue;
4642
AddProbeDBIDsToDBLinkUserObject (uop, i, cpp);
4648
ValNodeFreeData (head);
4575
4651
uop = UserObjectFree (uop);
4605
4681
StaticPrompt (x, "Bio Sample", 10 * stdCharWidth, 0, programFont, 'c');
4606
4682
ddp->biosample = CreateVisibleStringDialog (x, 3, -1, 15);
4684
StaticPrompt (x, "ProbeDB", 10 * stdCharWidth, 0, programFont, 'c');
4685
ddp->probedb = CreateVisibleStringDialog (x, 3, -1, 15);
4608
4687
return (DialoG) p;
4817
4897
{"SpliceVar", REFGENE_SPLICEVAR},
4818
4898
{"RelatedDrek", REFGENE_RELDREK},
4819
4899
{"Reject", REFGENE_REJECT},
4900
{"Identical", REFGENE_IDENTICAL},
4820
4901
{"Unknown", REFGENE_UNKNOWN},
4835
4916
static CharPtr refgene_labels [] = {
4836
"", "Assembly", "Related", "SpliceVar", "RelatedDrek", "Reject", "Unknown", NULL
4917
"", "Assembly", "Related", "SpliceVar", "RelatedDrek", "Reject", "IdenticalTo", "Unknown", NULL
4839
4920
static CharPtr refgene_fields [] = {
5704
5785
return (DialoG) p;
5789
static Boolean ExportStructuredCommentForm (ForM f, CharPtr filename)
5791
StruCommUserFormPtr sfp;
5792
Char path [PATH_MAX];
5795
Boolean rval = FALSE;
5800
sfp = (StruCommUserFormPtr) GetObjectExtra (f);
5805
uop = DialogToPointer (sfp->data);
5807
Message (MSG_ERROR, "Don't have a valid structured comment yet!");
5812
StringNCpy_0 (path, filename, sizeof (path));
5813
if (path [0] != '\0' || GetOutputFileName (path, sizeof (path), NULL)) {
5815
fp = FileOpen (path, "r");
5819
FileCreate (path, "TEXT", "ttxt");
5823
aip = AsnIoOpen (path, "w");
5825
Message (MSG_ERROR, "Unable to create file %s", path);
5827
UserObjectAsnWrite (uop, aip, NULL);
5831
uop = UserObjectFree (uop);
5836
static Boolean ImportStructuredCommentForm (ForM f, CharPtr filename)
5838
StruCommUserFormPtr sfp;
5839
Char path [PATH_MAX];
5842
Boolean rval = FALSE;
5844
sfp = (StruCommUserFormPtr) GetObjectExtra (f);
5850
StringNCpy_0 (path, filename, sizeof (path));
5851
if (path [0] == '\0') {
5852
if (!GetInputFileName (path, sizeof (path), "", "TEXT")) {
5857
aip = AsnIoOpen (path, "r");
5859
Message (MSG_ERROR, "Unable to read file %s", path);
5861
uop = UserObjectAsnRead (aip, NULL);
5863
Message (MSG_ERROR, "Unable to read structured comment ASN.1 from file");
5865
PointerToDialog (sfp->data, uop);
5866
uop = UserObjectFree (uop);
5707
5875
static void StruCommUserFormMessage (ForM f, Int2 mssg)
5914
typedef struct replacestruccmt {
5915
UserObjectPtr deleteThis;
5916
UserObjectPtr replaceWith;
5917
} ReplaceStrucCmtData, PNTR ReplaceStrucCmtPtr;
5920
static void ReplaceAllStructuredCommentsCallback (SeqDescrPtr sdp, Pointer data)
5923
ReplaceStrucCmtPtr rp;
5925
if ((rp = (ReplaceStrucCmtPtr) data) == NULL || sdp == NULL || sdp->choice != Seq_descr_user) {
5929
if (AsnIoMemComp (sdp->data.ptrvalue, rp->deleteThis, (AsnWriteFunc) UserObjectAsnWrite)) {
5930
sdp->data.ptrvalue = UserObjectFree (sdp->data.ptrvalue);
5931
sdp->data.ptrvalue = AsnIoMemCopy (rp->replaceWith, (AsnReadFunc) UserObjectAsnRead, (AsnWriteFunc) UserObjectAsnWrite);
5936
static void ReplaceAllStructuredCommentsButtonProc (ButtoN b)
5938
StruCommUserFormPtr sfp;
5940
ReplaceStrucCmtData rd;
5941
SeqDescrPtr sdp_orig;
5942
SeqMgrDescContext context;
5944
sfp = (StruCommUserFormPtr) GetObjectExtra (b);
5949
rd.replaceWith = DialogToPointer (sfp->data);
5950
if (rd.replaceWith == NULL) {
5951
Message (MSG_ERROR, "Must supply text!");
5952
rd.replaceWith = UserObjectFree (rd.replaceWith);
5956
sdp_orig = SeqMgrGetDesiredDescriptor (sfp->input_entityID, NULL, sfp->input_itemID, 0, NULL, &context);
5957
if (sdp_orig == NULL || sdp_orig->choice != Seq_descr_user) {
5958
Message (MSG_ERROR, "Unable to find original descriptor!");
5960
rd.replaceWith = UserObjectFree (rd.replaceWith);
5963
rd.deleteThis = AsnIoMemCopy (sdp_orig->data.ptrvalue, (AsnReadFunc)UserObjectAsnRead, (AsnWriteFunc) UserObjectAsnWrite);
5965
sep = GetTopSeqEntryForEntityID (sfp->input_entityID);
5966
VisitDescriptorsInSep (sep, &rd, ReplaceAllStructuredCommentsCallback);
5968
rd.deleteThis = UserObjectFree (rd.deleteThis);
5969
rd.replaceWith = UserObjectFree (rd.replaceWith);
5971
ObjMgrSetDirtyFlag (sfp->input_entityID, TRUE);
5972
ObjMgrSendMsg (OM_MSG_UPDATE, sfp->input_entityID,
5973
sfp->input_itemID, sfp->input_itemtype);
5739
5978
static ForM CreateStruCommDescForm (Int2 left, Int2 top, Int2 width,
5740
5979
Int2 height, CharPtr title, ValNodePtr sdp,
5741
5980
SeqEntryPtr sep, FormActnFunc actproc)
5771
6011
g = HiddenGroup (w, -1, 0, NULL);
5772
6012
sfp->data = CreateStruCommDialog (g);
5774
c = HiddenGroup (w, 2, 0, NULL);
5775
b = DefaultButton (c, "Accept", StdAcceptFormButtonProc);
5776
SetObjectExtra (b, sfp, NULL);
6014
c = HiddenGroup (w, 3, 0, NULL);
6016
b = DefaultButton (c, "Accept", StdAcceptFormButtonProc);
6017
SetObjectExtra (b, sfp, NULL);
6019
b = DefaultButton (c, "Replace This", StdAcceptFormButtonProc);
6020
SetObjectExtra (b, sfp, NULL);
6021
b = PushButton (c, "Replace All", ReplaceAllStructuredCommentsButtonProc);
6022
SetObjectExtra (b, sfp, NULL);
5777
6025
PushButton (c, "Cancel", StdCancelButtonProc);
5778
6027
AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) c, NULL);
5779
6028
RealizeWindow (w);
6657
6925
s = (SeqAlignSortPtr) MemNew (sizeof (SeqAlignSortData));
6660
AlnMgr2IndexSingleChildSeqAlign(salp);
6662
s->row1 = SeqAlignRowNew (SeqAlignStart (salp, 0), SeqAlignStop (salp, 0), SeqAlignStrand (salp, 0));
6663
s->row2 = SeqAlignRowNew (SeqAlignStart (salp, 1), SeqAlignStop (salp, 1), SeqAlignStrand (salp, 1));
6926
s->salp = SeqAlignDup (salp);
6928
AlnMgr2IndexSingleChildSeqAlign(s->salp);
6930
s->row1 = SeqAlignRowNew (SeqAlignStart (s->salp, 0), SeqAlignStop (s->salp, 0), SeqAlignStrand (s->salp, 0));
6931
s->row2 = SeqAlignRowNew (SeqAlignStart (s->salp, 1), SeqAlignStop (s->salp, 1), SeqAlignStrand (s->salp, 1));
6671
6939
if (s != NULL) {
6672
6940
s->row1 = SeqAlignRowFree (s->row1);
6673
6941
s->row2 = SeqAlignRowFree (s->row2);
6942
s->salp = SeqAlignFree (s->salp);
6674
6943
s = MemFree (s);
6949
static SeqAlignSortPtr SeqAlignSortCopy (SeqAlignSortPtr s)
6951
SeqAlignSortPtr copy = NULL;
6954
copy = (SeqAlignSortPtr) MemNew (sizeof (SeqAlignSortData));
6955
copy->salp = SeqAlignDup (s->salp);
6956
AlnMgr2IndexSingleChildSeqAlign(copy->salp);
6957
copy->row1 = SeqAlignRowCopy (s->row1);
6958
copy->row2 = SeqAlignRowCopy (s->row2);
6680
6964
static ValNodePtr SeqAlignSortListNew (SeqAlignPtr salp)
6682
6966
ValNodePtr list = NULL;
6994
static Boolean SeqAlignSortConflict (SeqAlignSortPtr s1, SeqAlignSortPtr s2)
6996
if (s1 == NULL || s2 == NULL) {
6998
} else if (SeqAlignRowConflict (s1->row1, s2->row1)) {
7000
} else if (SeqAlignRowConflict (s1->row2, s2->row2)) {
7008
static Int4 SeqAlignSortListLongestInterval (ValNodePtr list)
7014
for (vnp = list; vnp != NULL; vnp = vnp->next) {
7015
s = vnp->data.ptrvalue;
7016
if (s != NULL && s->row1 != NULL) {
7017
len = SeqAlignRowLen (s->row1);
6710
7027
static SeqAlignRowPtr SeqAlignRowFromSeqAlignSort (SeqAlignSortPtr s, Int4 row)
6712
7029
if (s == NULL) {
6735
7052
static Uint1 SeqAlignSortListFindBestStrand (ValNodePtr vnp, Int4 row)
6737
Int4 num_plus = 0, num_minus = 0;
7054
Int4 num_plus = 0, num_minus = 0, num_align, num = 0;
6738
7055
SeqAlignSortPtr s;
6740
while (vnp != NULL) {
7057
/* count the alignments */
7058
num_align = ValNodeLen (vnp);
7060
/* only look at strands from the first half of the alignments */
7061
num_align = num_align / 2;
7063
while (vnp != NULL && num < num_align) {
6741
7064
s = (SeqAlignSortPtr) vnp->data.ptrvalue;
6742
7065
if (s != NULL) {
6743
7066
if (SeqAlignSortRowStrand(s, row) == Seq_strand_minus) {
6939
static ValNodePtr SeqAlignSortListExtractRepeats (ValNodePtr PNTR list, Int4 row, Int4 fuzz)
7247
static ValNodePtr SeqAlignSortListMarkRepeats (ValNodePtr PNTR list, Int4 row, Int4 fuzz)
6941
ValNodePtr repeat_start, repeat_prev = NULL, vnp_prev = NULL, vnp;
6942
ValNodePtr repeat_list = NULL;
7249
ValNodePtr repeat_start, vnp, vnp_mark;
7250
ValNodePtr repeat_list = NULL, tmp_list;
6943
7251
SeqAlignSortPtr s1, s2;
6944
7252
SeqAlignRowPtr interval, r2;
6982
7288
interval->stop = r2->stop;
6985
if (repeat_start->next == vnp) {
6986
repeat_prev = vnp_prev;
6989
if (repeat_prev == NULL) {
6992
repeat_prev->next = vnp;
6994
if (vnp_prev != NULL) {
6995
vnp_prev->next = NULL;
6997
ValNodeAddPointer (&repeat_list, 0, repeat_start);
7291
if (repeat_start->next != vnp) {
7293
for (vnp_mark = repeat_start; vnp_mark != vnp; vnp_mark = vnp_mark->next) {
7294
/* add copy to list of repeats */
7295
ValNodeAddPointer (&tmp_list, 0, SeqAlignSortCopy (vnp_mark->data.ptrvalue));
7296
/* mark as repeat for this row */
7297
vnp_mark->choice = row;
7299
ValNodeAddPointer (&repeat_list, 0, tmp_list);
7000
7301
repeat_start = vnp;
7001
7302
s1 = vnp->data.ptrvalue;
7007
7308
if (repeat_start->next != NULL) {
7008
if (repeat_prev == NULL) {
7011
repeat_prev->next = NULL;
7310
for (vnp_mark = repeat_start; vnp_mark != vnp; vnp_mark = vnp_mark->next) {
7311
/* add copy to list of repeats */
7312
ValNodeAddPointer (&tmp_list, 0, SeqAlignSortCopy (vnp_mark->data.ptrvalue));
7313
/* mark as repeat for this row */
7314
vnp_mark->choice = row;
7013
ValNodeAddPointer (&repeat_list, 0, repeat_start);
7316
ValNodeAddPointer (&repeat_list, 0, tmp_list);
7016
7319
interval = SeqAlignRowFree (interval);
7305
7608
/* find first entry that is after this repeat, and insert before that */
7306
7609
while (vnp != NULL && !found) {
7610
if (SeqAlignSortConflict (s_repeat, vnp->data.ptrvalue)) {
7307
7615
s = vnp->data.ptrvalue;
7308
7616
r1 = SeqAlignRowFromSeqAlignSort (s, row);
7309
7617
r2 = SeqAlignRowFromSeqAlignSort (s_repeat, row);
7619
if (r1->start == r2->start && r1->stop == r2->stop) {
7620
/* this is a duplicate. throw it away. */
7311
7625
if (r1->start > r2->start || r2->start - r1->start < fuzz) {
7312
7626
while (repeat_list != NULL) {
7313
7627
/* extract best repeat */
7314
7628
vnp_new = FindBestRepeat (&repeat_list, s_before, vnp->data.ptrvalue, other_row, fuzz);
7315
7629
if (vnp_new == NULL) {
7316
repeat_list = SeqAlignSortListRemoveAll (repeat_list);
7630
repeat_list = SeqAlignSortListFree (repeat_list);
7318
7632
RemoveRepeatsCoincidingWithBest (&repeat_list, vnp_new, row, fuzz);
7319
7633
vnp_new->next = vnp;
7677
static Int4 FindLongestRepeatInterval (ValNodePtr repeat_list)
7680
ValNodePtr vnp_r, vnp;
7683
for (vnp_r = repeat_list; vnp_r != NULL; vnp_r = vnp_r->next) {
7684
for (vnp = vnp_r->data.ptrvalue; vnp != NULL; vnp = vnp->next) {
7685
s = vnp->data.ptrvalue;
7686
if (s != NULL && s->row1 != NULL) {
7687
len = SeqAlignRowLen (s->row1);
7698
/* note - we want to sort from highest to lowest */
7699
static int LIBCALLBACK SortVnpByRepeatList (VoidPtr ptr1, VoidPtr ptr2)
7707
if (ptr1 != NULL && ptr2 != NULL) {
7708
vnp1 = *((ValNodePtr PNTR) ptr1);
7709
vnp2 = *((ValNodePtr PNTR) ptr2);
7710
if (vnp1 != NULL && vnp2 != NULL) {
7711
len1 = SeqAlignSortListLongestInterval (vnp1->data.ptrvalue);
7712
len2 = SeqAlignSortListLongestInterval (vnp2->data.ptrvalue);
7715
} else if (len2 < len1) {
7363
7726
static void SelectBestRepeatsFromList (SeqAlignPtr PNTR salp)
7365
7728
ValNodePtr list, vnp;
7387
7750
FindSeqAlignSortWithPoint (list, missing, 1);
7389
7752
if (list != NULL && list->next != NULL) {
7390
row1_repeats = SeqAlignSortListExtractRepeats (&list, 1, fuzz);
7391
row2_repeats = SeqAlignSortListExtractRepeats (&list, 2, fuzz);
7753
row1_repeats = SeqAlignSortListMarkRepeats (&list, 1, fuzz);
7754
row1_repeats = ValNodeSort (row1_repeats, SortVnpByRepeatList);
7755
row2_repeats = SeqAlignSortListMarkRepeats (&list, 2, fuzz);
7756
row2_repeats = ValNodeSort (row2_repeats, SortVnpByRepeatList);
7757
vnp = ValNodeExtractList (&list, 1);
7758
vnp = SeqAlignSortListFree (vnp);
7759
vnp = ValNodeExtractList (&list, 2);
7760
vnp = SeqAlignSortListFree (vnp);
7393
7762
FindSeqAlignSortWithPoint (list, missing, 1);
7410
7779
FindSeqAlignSortWithPoint (list, missing, 1);
7412
/* for each repeat on row 1, we want to pick the most consistent interval for row 2 */
7413
list = ValNodeSort (list, SortVnpBySeqAlignSortRow1);
7414
for (vnp = row1_repeats; vnp != NULL; vnp = vnp->next) {
7415
InsertBestRepeat (vnp->data.ptrvalue, &list, 1, fuzz);
7417
row1_repeats = ValNodeFree (row1_repeats);
7419
/* for each repeat on row 2, we want to pick the most consistent interval for row 1 */
7420
list = ValNodeSort (list, SortVnpBySeqAlignSortRow2);
7421
for (vnp = row2_repeats; vnp != NULL; vnp = vnp->next) {
7422
InsertBestRepeat (vnp->data.ptrvalue, &list, 2, fuzz);
7424
row2_repeats = ValNodeFree (row2_repeats);
7781
len1 = FindLongestRepeatInterval (row1_repeats);
7782
len2 = FindLongestRepeatInterval (row2_repeats);
7785
/* for each repeat on row 1, we want to pick the most consistent interval for row 2 */
7786
list = ValNodeSort (list, SortVnpBySeqAlignSortRow1);
7787
for (vnp = row1_repeats; vnp != NULL; vnp = vnp->next) {
7788
InsertBestRepeat (vnp->data.ptrvalue, &list, 1, fuzz);
7790
row1_repeats = ValNodeFree (row1_repeats);
7792
/* for each repeat on row 2, we want to pick the most consistent interval for row 1 */
7793
list = ValNodeSort (list, SortVnpBySeqAlignSortRow2);
7794
for (vnp = row2_repeats; vnp != NULL; vnp = vnp->next) {
7795
InsertBestRepeat (vnp->data.ptrvalue, &list, 2, fuzz);
7797
row2_repeats = ValNodeFree (row2_repeats);
7799
/* for each repeat on row 2, we want to pick the most consistent interval for row 1 */
7800
list = ValNodeSort (list, SortVnpBySeqAlignSortRow2);
7801
for (vnp = row2_repeats; vnp != NULL; vnp = vnp->next) {
7802
InsertBestRepeat (vnp->data.ptrvalue, &list, 2, fuzz);
7804
row2_repeats = ValNodeFree (row2_repeats);
7806
/* for each repeat on row 1, we want to pick the most consistent interval for row 2 */
7807
list = ValNodeSort (list, SortVnpBySeqAlignSortRow1);
7808
for (vnp = row1_repeats; vnp != NULL; vnp = vnp->next) {
7809
InsertBestRepeat (vnp->data.ptrvalue, &list, 1, fuzz);
7811
row1_repeats = ValNodeFree (row1_repeats);
7427
7815
list = ValNodeSort (list, SortVnpBySeqAlignSortRow1);
11904
12298
ValNodeLink (&coverage_report, err_list);
11905
12299
err_list = coverage_report;
12301
lip = OpenLog ("TSA Table Problems");
11907
12302
if (err_list != NULL) {
11908
lip = OpenLog ("TSA Table Problems");
11909
12303
for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
11910
12304
fprintf (lip->fp, "%s\n", vnp->data.ptrvalue);
11912
12306
lip->data_in_log = TRUE;
11914
lip = FreeLog (lip);
11915
12307
err_list = ValNodeFreeData (err_list);
12309
sep = GetTopSeqEntryForEntityID (frm->input_entityID);
12310
VisitBioseqsInSep (sep, lip, ReportNonTSABioseqs);
12312
lip = FreeLog (lip);
11919
12315
ObjMgrSetDirtyFlag (frm->input_entityID, TRUE);
14310
GatherProcLaunch (OMPROC_EDIT, FALSE, sfp->idx.entityID, sfp->idx.itemID,
14311
OBJ_SEQFEAT, 0, 0, OBJ_SEQFEAT, 0);
14730
if (special_flag && sfp->data.choice == SEQFEAT_PUB) {
14731
w = EditCitFeatDirectly (sfp);
14734
GatherProcLaunch (OMPROC_EDIT, FALSE, sfp->idx.entityID, sfp->idx.itemID,
14735
OBJ_SEQFEAT, 0, 0, OBJ_SEQFEAT, 0);
14314
else if (vnp->choice == OBJ_BIOSEQ)
14739
else if (data_choice == OBJ_BIOSEQ)
14316
14741
bsp = (BioseqPtr) vnp->data.ptrvalue;
14317
14742
if (bsp != NULL)
14320
14745
OBJ_BIOSEQ, 0, 0, OBJ_BIOSEQ, 0);
14323
else if (vnp->choice == OBJ_SEQDESC)
14748
else if (data_choice == OBJ_SEQDESC)
14325
14750
sdp = (SeqDescrPtr) (vnp->data.ptrvalue);
14326
14751
if (sdp != NULL && sdp->extended != 0)
14328
14753
ovp = (ObjValNodePtr) sdp;
14329
GatherProcLaunch (OMPROC_EDIT, FALSE, ovp->idx.entityID, ovp->idx.itemID,
14330
OBJ_SEQDESC, 0, 0, OBJ_SEQDESC, 0);
14754
if (special_flag && sdp->choice == Seq_descr_pub) {
14755
w = EditCitDescDirectly (sdp);
14758
GatherProcLaunch (OMPROC_EDIT, FALSE, ovp->idx.entityID, ovp->idx.itemID,
14759
OBJ_SEQDESC, 0, 0, OBJ_SEQDESC, 0);
14763
else if (data_choice == OBJ_SEQSUB)
14765
ssp = (SeqSubmitPtr) (vnp->data.ptrvalue);
14766
procid = GetProcIdForItemEditor (ssp->idx.entityID, ssp->idx.itemID, OBJ_SEQSUB_CIT, 0);
14767
omudp = ItemAlreadyHasEditor (ssp->idx.entityID, ssp->idx.itemID,
14768
OBJ_SUBMIT_BLOCK, procid);
14769
if (omudp == NULL) {
14770
GatherProcLaunch (OMPROC_EDIT, FALSE, ssp->idx.entityID, ssp->idx.itemID,
14771
OBJ_SEQSUB_CIT, 0, 0, OBJ_SEQSUB_CIT, 0);
14772
omudp = ItemAlreadyHasEditor (ssp->idx.entityID, ssp->idx.itemID,
14773
OBJ_SUBMIT_BLOCK, procid);
14775
if (omudp != NULL) {
14776
bfp = (BaseFormPtr) omudp->userdata.ptrvalue;
14778
Select (bfp->form);
14779
SendMessageToForm (bfp->form, NUM_VIB_MSG + 1);
14427
14876
WatchCursor();
14429
14878
lip = OpenLog ("Extended Features");
14430
for (vnp = list; vnp != NULL; vnp = vnp->next) {
14431
if (vnp->choice == OBJ_SEQFEAT && (sfp = vnp->data.ptrvalue) != NULL) {
14432
orig_location = SeqLocPrintUseBestID (sfp->location);
14433
if (ExtendPartialsToEndOrGap (sfp)) {
14434
ValNodeAddInt (&entityID_list, 0, sfp->idx.entityID);
14435
new_location = SeqLocPrintUseBestID (sfp->location);
14436
fprintf (lip->fp, "Extended %s to %s\n", orig_location, new_location);
14437
new_location = MemFree (new_location);
14438
lip->data_in_log = TRUE;
14440
orig_location = MemFree (orig_location);
14443
entityID_list = ValNodeSort (entityID_list, SortByIntvalue);
14444
ValNodeUnique (&entityID_list, SortByIntvalue, ValNodeFree);
14445
for (vnp = entityID_list; vnp != NULL; vnp = vnp->next) {
14446
ObjMgrSetDirtyFlag (vnp->data.intvalue, TRUE);
14447
ObjMgrSendMsg (OM_MSG_UPDATE, vnp->data.intvalue, 0, 0);
14880
FixBacterialExtendablePartials (list, userdata, lip);
14882
sep_list = GetViewedSeqEntryList ();
14883
for (vnp = sep_list; vnp != NULL; vnp = vnp->next) {
14884
entityID = ObjMgrGetEntityIDForChoice (vnp->data.ptrvalue);
14885
ObjMgrSetDirtyFlag (entityID, TRUE);
14886
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
14888
sep_list = ValNodeFree (sep_list);
14893
lip = FreeLog (lip);
14897
static void AddNonExtendableExceptionsCallback (ValNodePtr list, Pointer userdata)
14899
ValNodePtr vnp, sep_list = NULL;
14903
if (Message (MSG_OKC, "Add Non-extendable exception to non-extendable partial features?") == ANS_CANCEL) {
14908
lip = OpenLog ("Added Exceptions to Features");
14909
FixBacterialNonExtendablePartials (list, userdata, lip);
14911
sep_list = GetViewedSeqEntryList ();
14912
for (vnp = sep_list; vnp != NULL; vnp = vnp->next) {
14913
entityID = ObjMgrGetEntityIDForChoice (vnp->data.ptrvalue);
14914
ObjMgrSetDirtyFlag (entityID, TRUE);
14915
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
14917
sep_list = ValNodeFree (sep_list);
14922
lip = FreeLog (lip);
14926
static void MarkOverlappingCDSCallback (ValNodePtr list, Pointer userdata)
14928
ValNodePtr vnp, sep_list = NULL;
14932
if (Message (MSG_OKC, "Add comment to overlapping coding regions?") == ANS_CANCEL) {
14937
lip = OpenLog ("Added Comments to Overlapping Coding Regions");
14938
MarkOverlappingCDSs (list, userdata, lip);
14940
sep_list = GetViewedSeqEntryList ();
14941
for (vnp = sep_list; vnp != NULL; vnp = vnp->next) {
14942
entityID = ObjMgrGetEntityIDForChoice (vnp->data.ptrvalue);
14943
ObjMgrSetDirtyFlag (entityID, TRUE);
14944
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
14946
sep_list = ValNodeFree (sep_list);
14449
14948
ArrowCursor();
14451
14950
CloseLog (lip);
14646
15154
cip->callback_func = ApplyTagToCodingRegionsCallback;
14647
15155
} else if (cip->clickable_item_type == DISC_BACTERIAL_PARTIAL_PROBLEMS) {
14648
15156
cip->callback_func = ExtendPartialsToEndOrGapCallback;
15157
} else if (cip->clickable_item_type == DISC_BACTERIAL_PARTIAL_NONEXTENDABLE_PROBLEMS) {
15158
cip->callback_func = AddNonExtendableExceptionsCallback;
15159
} else if (cip->clickable_item_type == DISC_OVERLAPPING_CDS) {
15160
cip->callback_func = MarkOverlappingCDSCallback;
14650
15162
subtype = GetSubtypeForBulkEdit (cip->item_list);
14651
15163
/* Note - using FEATDEF_rRNA to represent all editable RNA features */
14662
15174
static void RecheckDiscrepancyProc (ButtoN b)
14664
15176
DiscrepancyReportFormPtr drfp;
14665
ValNodePtr sep_list;
14667
drfp = (DiscrepancyReportFormPtr) GetObjectExtra (b);
14672
drfp->clickable_list_data = FreeClickableList (drfp->clickable_list_data);
14674
sep_list = GetViewedSeqEntryList ();
14675
drfp->clickable_list_data = CollectDiscrepancies (drfp->dcp, sep_list, CheckTaxNamesAgainstTaxDatabase);
15177
ValNodePtr sep_list, vnp;
15180
drfp = (DiscrepancyReportFormPtr) GetObjectExtra (b);
15185
drfp->clickable_list_data = FreeClickableList (drfp->clickable_list_data);
15187
sep_list = GetViewedSeqEntryList ();
15188
for (vnp = sep_list; vnp != NULL; vnp = vnp->next) {
15189
entityID = ObjMgrGetEntityIDForChoice (vnp->data.ptrvalue);
15190
SeqMgrClearFeatureIndexes (entityID, NULL);
15191
SeqMgrIndexFeatures (entityID, NULL);
15194
drfp->clickable_list_data = CollectDiscrepancies (drfp->dcp, sep_list, CheckTaxNamesAgainstTaxDatabase);
15196
/* add bulk editing where appropriate */
15197
AddBulkEditing (drfp->clickable_list_data);
15199
PointerToDialog (drfp->clickable_list_dlg, drfp->clickable_list_data);
15206
static void AddNewEntityDiscrepancyProc (ButtoN b, Uint2 new_entityID )
15208
DiscrepancyReportFormPtr drfp;
15209
ValNodePtr sep_list, vnp;
15211
Boolean found = FALSE;
15213
drfp = (DiscrepancyReportFormPtr) GetObjectExtra (b);
15218
drfp->clickable_list_data = FreeClickableList (drfp->clickable_list_data);
15220
sep_list = GetViewedSeqEntryList ();
15221
for (vnp = sep_list; vnp != NULL; vnp = vnp->next) {
15222
entityID = ObjMgrGetEntityIDForChoice (vnp->data.ptrvalue);
15223
SeqMgrClearFeatureIndexes (entityID, NULL);
15224
SeqMgrIndexFeatures (entityID, NULL);
15225
if (entityID == new_entityID) {
15230
ValNodeAddPointer (&sep_list, 0, GetTopSeqEntryForEntityID (new_entityID));
15231
SeqMgrClearFeatureIndexes (new_entityID, NULL);
15232
SeqMgrIndexFeatures (new_entityID, NULL);
15235
drfp->clickable_list_data = CollectDiscrepancies (drfp->dcp, sep_list, CheckTaxNamesAgainstTaxDatabase);
15236
sep_list = ValNodeFree (sep_list);
14677
15238
/* add bulk editing where appropriate */
14678
15239
AddBulkEditing (drfp->clickable_list_data);
15516
static void FixMarkedDiscrepanciesBtn (ButtoN b)
15518
DiscrepancyReportFormPtr d;
15519
ValNodePtr vnp, sep_list;
15521
LogInfoPtr lip = NULL;
15523
d = (DiscrepancyReportFormPtr) GetObjectExtra (b);
15529
if (d->log_name != NULL) {
15530
lip = OpenLog (d->log_name);
15532
AutofixDiscrepancies (d->clickable_list_data, FALSE, lip);
15534
lip = FreeLog (lip);
15536
sep_list = GetViewedSeqEntryList ();
15537
for (vnp = sep_list; vnp != NULL; vnp = vnp->next) {
15538
entityID = ObjMgrGetEntityIDForChoice (vnp->data.ptrvalue);
15539
ObjMgrSetDirtyFlag (entityID, TRUE);
15540
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
15542
d->clickable_list_data = FreeClickableList (d->clickable_list_data);
15543
d->clickable_list_data = CollectDiscrepancies (d->dcp, sep_list, CheckTaxNamesAgainstTaxDatabase);
15544
sep_list = ValNodeFree (sep_list);
15546
/* add bulk editing where appropriate */
15547
AddBulkEditing (d->clickable_list_data);
15549
PointerToDialog (d->clickable_list_dlg, d->clickable_list_data);
15557
static void MarkFixableDiscrepancies (ButtoN b)
15559
DiscrepancyReportFormPtr d;
15561
d = (DiscrepancyReportFormPtr) GetObjectExtra (b);
15565
ChooseFixableDiscrepancies (d->clickable_list_data);
15566
PointerToDialog (d->clickable_list_dlg, d->clickable_list_data);
14955
15570
extern void CreateReportWindow (EDiscrepancyReportType report_type)
14957
15572
DiscrepancyReportFormPtr drfp;
15015
15635
b = PushButton (c1, "Contract All", ContractAllDiscReportItems);
15016
15636
SetObjectExtra (b, drfp, NULL);
15018
c = HiddenGroup (h, 4, 0, NULL);
15638
c = HiddenGroup (h, 6, 0, NULL);
15019
15639
SetGroupSpacing (c, 10, 10);
15020
15640
b = PushButton (c, "Generate Report", GenerateDiscrepancyReport);
15021
15641
SetObjectExtra (b, drfp, NULL);
15022
15642
drfp->recheck_btn = PushButton (c, "Recheck", RecheckDiscrepancyProc);
15023
15643
SetObjectExtra (drfp->recheck_btn, drfp, NULL);
15644
if (report_type == eReportTypeOnCaller) {
15645
drfp->add_entity_proc = AddNewEntityDiscrepancyProc;
15647
b = PushButton (c, "Mark Fixable", MarkFixableDiscrepancies);
15648
SetObjectExtra (b, drfp, NULL);
15650
b = PushButton (c, "Fix Marked", FixMarkedDiscrepanciesBtn);
15651
SetObjectExtra (b, drfp, NULL);
15025
15653
b = PushButton (c, "Configure", GetReportEditButtonProc (report_type));
15026
15654
SetObjectExtra (b, drfp, NULL);