5260
static void WantBarcodeAdjustmentCallback (BioseqPtr bsp, Pointer data)
5262
if (bsp != NULL && data != NULL && HasBARCODETech(bsp)) {
5263
*((BoolPtr)data) = TRUE;
5268
static Boolean WantBarcodeAdjustment (SeqEntryPtr sep)
5270
Boolean want_adjustment = FALSE;
5271
Char path [PATH_MAX];
5274
if (!GetSequinAppParam ("BARCODE", "LIVELIST", NULL, path, sizeof (path))) {
5277
if (StringHasNoText (path)) {
5281
fp = FileOpen (path, "r");
5287
VisitBioseqsInSep (sep, &want_adjustment, WantBarcodeAdjustmentCallback);
5289
return want_adjustment;
5293
static TwoStringHashPtr sBarcodeLiveListAccBin = NULL;
5294
static TwoStringHashPtr sBarcodeLiveListAccId = NULL;
5295
static TwoStringHashPtr sBarcodeLiveListIdBin = NULL;
5296
static Boolean sAttemptedToReadBarcodeLiveList = FALSE;
5298
static void FixBarcodeLiveListIds (ValNodePtr table)
5300
ValNodePtr row, col;
5303
for (row = table; row != NULL; row = row->next) {
5304
col = row->data.ptrvalue;
5305
if (col != NULL && col->next != NULL && (cp = StringChr (col->next->data.ptrvalue, '.')) != NULL) {
5312
static Boolean ReadBarcodeLiveList (void)
5314
ValNodePtr table, col, vnp;
5315
Char path [PATH_MAX];
5319
if (sAttemptedToReadBarcodeLiveList) {
5320
if (sBarcodeLiveListAccBin == NULL) {
5326
if (!GetSequinAppParam ("BARCODE", "LIVELIST", NULL, path, sizeof (path))) {
5329
if (StringHasNoText (path)) {
5333
fp = FileOpen (path, "r");
5337
table = ReadTabTableFromFile (fp);
5340
if (table == NULL) {
5344
/* process IDs in second column are actually just the part before the first period */
5345
FixBarcodeLiveListIds (table);
5346
table = SortTableRowByAnyColumn (table, 1);
5347
len = ValNodeLen (table);
5348
sBarcodeLiveListAccBin = (TwoStringHashPtr) MemNew (sizeof (TwoStringHashData));
5349
sBarcodeLiveListAccBin->table = (CharPtr PNTR) MemNew (sizeof (CharPtr) * len * 2);
5350
sBarcodeLiveListAccBin->num_lines = 0;
5351
sBarcodeLiveListAccId = (TwoStringHashPtr) MemNew (sizeof (TwoStringHashData));
5352
sBarcodeLiveListAccId->table = (CharPtr PNTR) MemNew (sizeof (CharPtr) * len * 2);
5353
sBarcodeLiveListAccId->num_lines = 0;
5354
for (vnp = table; vnp != NULL; vnp = vnp->next) {
5355
col = vnp->data.ptrvalue;
5356
if (col != NULL && !StringHasNoText (col->data.ptrvalue)) {
5357
if (col->next != NULL && !StringHasNoText (col->next->data.ptrvalue)) {
5358
i = sBarcodeLiveListAccId->num_lines;
5359
sBarcodeLiveListAccId->table[2 * i] = StringSave (col->data.ptrvalue);
5360
sBarcodeLiveListAccId->table[2 * i + 1] = StringSave (col->next->data.ptrvalue);
5361
sBarcodeLiveListAccId->num_lines++;
5363
if (col->next != NULL && col->next->next != NULL && col->next->next->next != NULL && !StringHasNoText (col->next->next->next->data.ptrvalue)) {
5364
i = sBarcodeLiveListAccBin->num_lines;
5365
sBarcodeLiveListAccBin->table[2 * i] = StringSave (col->data.ptrvalue);
5366
sBarcodeLiveListAccBin->table[2 * i + 1] = StringSave (col->next->next->next->data.ptrvalue);
5367
sBarcodeLiveListAccBin->num_lines++;
5371
table = SortTableRowByAnyColumn (table, 2);
5372
sBarcodeLiveListIdBin = (TwoStringHashPtr) MemNew (sizeof (TwoStringHashData));
5373
sBarcodeLiveListIdBin->table = (CharPtr PNTR) MemNew (sizeof (CharPtr) * len * 2);
5374
sBarcodeLiveListIdBin->num_lines = 0;
5375
for (vnp = table; vnp != NULL; vnp = vnp->next) {
5376
col = vnp->data.ptrvalue;
5377
if (col != NULL && col->next != NULL && !StringHasNoText (col->next->data.ptrvalue)
5378
&& col->next->next != NULL && col->next->next->next != NULL && !StringHasNoText (col->next->next->next->data.ptrvalue)) {
5379
i = sBarcodeLiveListIdBin->num_lines;
5380
sBarcodeLiveListIdBin->table[2 * i] = StringSave (col->next->data.ptrvalue);
5381
sBarcodeLiveListIdBin->table[2 * i + 1] = StringSave (col->next->next->next->data.ptrvalue);
5382
sBarcodeLiveListIdBin->num_lines++;
5386
table = FreeTabTable (table);
5388
sAttemptedToReadBarcodeLiveList = TRUE;
5393
static const CharPtr sBarcodeSpecialWords[] = {
5394
" sp.", " aff.", " cf.", " group", " complex", " nr.", " near", NULL };
5397
static Boolean IsJustOneWord (CharPtr organism)
5399
if (StringChr (organism, ' ') == NULL) {
5407
static Boolean OrganismWantsBarcodeAdjustment (CharPtr organism)
5409
Boolean rval = FALSE;
5411
/* TODO - only if contains one of the special words, or is just one word */
5412
if (IsJustOneWord (organism)) {
5415
for (i = 0; sBarcodeSpecialWords[i] != NULL && !rval; i++) {
5416
if (StringSearch (organism, sBarcodeSpecialWords[i]) != NULL) {
5426
static ValNodePtr GetNthValNode (ValNodePtr list, Int4 nth);
5428
static Boolean FieldTypeIsTaxname (ValNodePtr field)
5432
&& field->choice == FieldType_source_qual
5433
&& (srcq = field->data.ptrvalue) != NULL
5434
&& srcq->choice == SourceQualChoice_textqual
5435
&& srcq->data.intvalue == Source_qual_taxname) {
5443
static ValNodePtr AdjustTableForBarcodeLiveList (ValNodePtr table, QualLoadFormPtr form_data)
5445
ValNodePtr new_table;
5446
ValNodePtr columns = NULL, vnp, org_vnp, acc_vnp;
5447
TabColumnConfigPtr t;
5448
Int4 accession_column = -1;
5449
Int4 organism_column = -1;
5451
CharPtr uniquer, id, tmp_name;
5453
new_table = CopyTabTable (table);
5455
if (form_data->list_dlg == NULL) {
5456
for (i = 0; i < form_data->num_columns; i++) {
5457
t = DialogToPointer (form_data->column_list[i]);
5458
if (t != NULL && t->match_type != NULL && t->match_type->choice == eTableMatchNucID) {
5459
accession_column = i + 1;
5460
} else if (t != NULL && FieldTypeIsTaxname(t->field)) {
5461
organism_column = i + 1;
5463
t = TabColumnConfigFree (t);
5466
columns = DialogToPointer (form_data->list_dlg);
5467
for (vnp = columns, i = 0; vnp != NULL; vnp = vnp->next, i++) {
5468
t = (TabColumnConfigPtr) vnp->data.ptrvalue;
5469
if (t != NULL && t->match_type != NULL && t->match_type->choice == eTableMatchNucID) {
5470
accession_column = i;
5471
} else if (t != NULL && FieldTypeIsTaxname(t->field)) {
5472
organism_column = i;
5475
columns = TabColumnConfigListFree (columns);
5478
if (accession_column > -1 && organism_column > -1) {
5479
/* do replacements */
5480
for (vnp = new_table; vnp != NULL; vnp = vnp->next) {
5481
org_vnp = GetNthValNode(vnp->data.ptrvalue, organism_column);
5482
if (org_vnp != NULL && OrganismWantsBarcodeAdjustment (org_vnp->data.ptrvalue)) {
5483
acc_vnp = GetNthValNode(vnp->data.ptrvalue, accession_column);
5484
if (acc_vnp != NULL) {
5485
uniquer = GetValueFromTwoStringHash(acc_vnp->data.ptrvalue, sBarcodeLiveListAccBin);
5486
if (uniquer == NULL) {
5487
id = GetValueFromTwoStringHash(acc_vnp->data.ptrvalue, sBarcodeLiveListAccId);
5489
uniquer = GetValueFromTwoStringHash(acc_vnp->data.ptrvalue, sBarcodeLiveListIdBin);
5490
if (uniquer == NULL) {
5495
if (uniquer != NULL) {
5496
/* make sure it's not already in the organism name */
5497
tmp_name = org_vnp->data.ptrvalue;
5498
if (StringSearch (tmp_name, uniquer) == NULL) {
5499
if (IsJustOneWord(tmp_name)) {
5500
SetStringValue (&tmp_name, "sp.", ExistingTextOption_append_space);
5502
SetStringValue (&tmp_name, uniquer, ExistingTextOption_append_space);
5503
org_vnp->data.ptrvalue = tmp_name;
5142
5515
static void SpecialMailReport (ButtoN b)
5144
5517
QualLoadFormPtr form_data;
5518
ValNodePtr adjusted_table = NULL, tmp_table = NULL;
5145
5519
ValNodePtr list = NULL, vnp;
5146
ValNodePtr columns = NULL;
5147
5520
SeqEntryPtr sep;
5148
5521
LogInfoPtr lip;
5149
5522
MailReportPtr m;
13717
14303
ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
14309
static ValNodePtr BioseqListFromString(CharPtr str, SeqEntryPtr sep)
14311
ValNodePtr list = NULL;
14317
ValNodePtr errors = NULL;
14322
len = StringSpn (str, " \t\r\n,;");
14326
len = StringCSpn (cp, " \t\r\n,;");
14329
sip = CreateSeqIdFromText (cp, sep);
14331
ValNodeAddPointer (&errors, 0, StringSave (cp));
14333
bsp = BioseqFind (sip);
14335
ValNodeAddPointer (&errors, 0, StringSave (cp));
14337
ValNodeAddPointer (&list, OBJ_BIOSEQ, bsp);
14339
sip = SeqIdFree (sip);
14343
len = StringSpn (cp, " \t\r\n,;");
14347
if (errors != NULL) {
14348
cp = ValNodeMergeStrs (errors);
14349
Message (MSG_ERROR, "Unable to find Bioseqs for the following IDs: %s", cp);
14351
list = ValNodeFree (list);
14352
} else if (list == NULL) {
14353
Message (MSG_ERROR, "No IDs listed!");
14359
typedef struct withdrawsequencesfrm {
14363
ButtoN leave_dlg_up;
14364
} WithdrawSequencesFrmData, PNTR WithdrawSequencesFrmPtr;
14366
static void DoWithdrawSequences (ButtoN b)
14368
WithdrawSequencesFrmPtr frm;
14370
ValNodePtr list = NULL;
14372
PopSetRetroStatData stat;
14374
frm = (WithdrawSequencesFrmPtr) GetObjectExtra (b);
14379
sep = GetTopSeqEntryForEntityID (frm->input_entityID);
14381
/* get id list from text */
14382
list_str = SaveStringFromText (frm->id_list);
14383
list = BioseqListFromString (list_str, sep);
14384
list_str = MemFree (list_str);
14385
if (list == NULL) {
14389
/* move listed sequences to wrapper */
14390
MoveSequencesFromSetToWrapper (list, frm->input_entityID);
14392
/* taxfix/cleanup */
14393
ForceCleanupEntityID (frm->input_entityID);
14395
/* redo set title */
14396
MemSet ((Pointer) &stat, 0, sizeof (PopSetRetroStatData));
14397
RemovePopsetTitles (sep);
14398
PopSetAutoDefRetro (sep, &stat);
14401
ValSeqEntryForm (frm->form);
14403
if (!GetStatus (frm->leave_dlg_up)) {
14404
Remove (frm->form);
14410
NLM_EXTERN void WithdrawSequences (IteM i)
14413
WithdrawSequencesFrmPtr frm;
14420
bfp = currentFormDataPtr;
14422
bfp = GetObjectExtra (i);
14424
if (bfp == NULL) return;
14427
frm = MemNew (sizeof (WithdrawSequencesFrmData));
14428
if (frm == NULL) return;
14429
frm->input_entityID = bfp->input_entityID;
14431
w = FixedWindow (-50, -33, -10, -10, "Withdraw Sequences", StdCloseWindowProc);
14432
SetObjectExtra (w, frm, StdCleanupFormProc);
14433
frm->form = (ForM) w;
14435
h = HiddenGroup (w, -1, 0, NULL);
14436
SetGroupSpacing (h, 10, 10);
14438
ppt = StaticPrompt (h, "List of Accessions", 0, popupMenuHeight, programFont, 'l');
14440
frm->id_list = ScrollText (h, 25, 10, programFont, TRUE, NULL);
14442
c = HiddenGroup (h, 4, 0, NULL);
14443
b = DefaultButton (c, "Accept", DoWithdrawSequences);
14444
SetObjectExtra (b, frm, NULL);
14445
PushButton (c, "Cancel", StdCancelButtonProc);
14446
frm->leave_dlg_up = CheckBox (c, "Leave dialog up", NULL);
14448
AlignObjects (ALIGN_CENTER, (HANDLE) ppt, (HANDLE) frm->id_list,
14456
extern void ParseTaxnameToSourceQual (IteM i)
14460
ParseSrcOrgPtr org;
14461
ParseActionPtr parse;
14464
bfp = currentFormDataPtr;
14466
bfp = GetObjectExtra (i);
14468
if (bfp == NULL) return;
14470
f = SingleParseAction (bfp->input_entityID);
14472
/* create parse action with preselected fields */
14473
parse = ParseActionNew ();
14474
/* choose taxname after bionomial as source */
14475
org = ParseSrcOrgNew ();
14476
org->field = ValNodeNew (NULL);
14477
org->field->choice = ParseSrcOrgChoice_taxname_after_binomial;
14478
parse->src = ValNodeNew (NULL);
14479
parse->src->choice = ParseSrc_org;
14480
parse->src->data.ptrvalue = org;
14481
/* choose source qualifiers as dest */
14482
parse->dest = ValNodeNew (NULL);
14483
parse->dest->choice = ParseDest_org;
14484
PointerToForm (f, parse);
14485
parse = ParseActionFree (parse);
14491
extern void ParseDefLineToSourceQual (IteM i)
14495
ParseActionPtr parse;
14498
bfp = currentFormDataPtr;
14500
bfp = GetObjectExtra (i);
14502
if (bfp == NULL) return;
14504
f = SingleParseAction (bfp->input_entityID);
14506
/* create parse action with preselected fields */
14507
parse = ParseActionNew ();
14508
/* choose defline as source */
14509
parse->src = ValNodeNew (NULL);
14510
parse->src->choice = ParseSrc_defline;
14511
/* choose source qualifiers as dest */
14512
parse->dest = ValNodeNew (NULL);
14513
parse->dest->choice = ParseDest_org;
14514
PointerToForm (f, parse);
14515
parse = ParseActionFree (parse);
14520
extern void ParseFlatfileToSourceQual (IteM i)
14524
ParseActionPtr parse;
14527
bfp = currentFormDataPtr;
14529
bfp = GetObjectExtra (i);
14531
if (bfp == NULL) return;
14533
f = SingleParseAction (bfp->input_entityID);
14535
/* create parse action with preselected fields */
14536
parse = ParseActionNew ();
14537
/* choose defline as source */
14538
parse->src = ValNodeNew (NULL);
14539
parse->src->choice = ParseSrc_flatfile;
14540
/* choose source qualifiers as dest */
14541
parse->dest = ValNodeNew (NULL);
14542
parse->dest->choice = ParseDest_org;
14543
PointerToForm (f, parse);
14544
parse = ParseActionFree (parse);
14550
extern void ParseLocalIDToSourceQual (ButtoN b)
14554
ParseActionPtr parse;
14556
bfp = (BaseFormPtr) GetObjectExtra (b);
14557
if (bfp == NULL) return;
14559
f = SingleParseAction (bfp->input_entityID);
14561
/* create parse action with preselected fields */
14562
parse = ParseActionNew ();
14563
/* choose localID as source */
14564
parse->src = ValNodeNew (NULL);
14565
parse->src->choice = ParseSrc_local_id;
14566
/* choose source qualifiers as dest */
14567
parse->dest = ValNodeNew (NULL);
14568
parse->dest->choice = ParseDest_org;
14569
PointerToForm (f, parse);
14570
parse = ParseActionFree (parse);
14576
NLM_EXTERN DialoG SegregateIdDialog (GrouP g)
14579
StringConstraint scd;
14581
dlg = StringConstraintDialog (g, "Mark sequences where sequence ID", TRUE, NULL, NULL);
14582
MemSet (&scd, 0, sizeof (StringConstraint));
14583
scd.match_location = eStringConstraintInList;
14584
PointerToDialog (dlg, &scd);
14589
static void ChooseCategoriesByStringConstraint (ValNodePtr value_list, StringConstraintPtr scp, Boolean do_choose)
14591
ClickableItemPtr cip;
14593
while (value_list != NULL) {
14594
cip = (ClickableItemPtr) value_list->data.ptrvalue;
14596
if (cip->item_list != NULL
14597
&& cip->item_list->choice == OBJ_BIOSEQ
14598
&& cip->item_list->data.ptrvalue != NULL
14599
&& DoesSeqIDListMeetStringConstraint (((BioseqPtr) cip->item_list->data.ptrvalue)->id, scp)) {
14600
cip->chosen = do_choose;
14602
ChooseCategoriesByStringConstraint (cip->subcategories, scp, do_choose);
14605
value_list = value_list->next;
14610
NLM_EXTERN void ChooseCategoriesForSegregateIdDialog(DialoG d, ValNodePtr list)
14612
StringConstraintPtr scp;
14614
scp = DialogToPointer (d);
14615
ChooseCategoriesByStringConstraint (list, scp, TRUE);
14616
scp = StringConstraintFree (scp);
14621
NLM_EXTERN DialoG SegregateConstraintDialog (GrouP g)
14625
dlg = ComplexConstraintDialog (g, NULL, NULL);
14626
ChangeComplexConstraintFieldType (dlg, FieldType_molinfo_field, NULL, Macro_feature_type_any);
14631
static void ChooseCategoriesByConstraint (ValNodePtr value_list, ValNodePtr constraint, Boolean do_choose)
14633
ClickableItemPtr cip;
14635
while (value_list != NULL) {
14636
cip = (ClickableItemPtr) value_list->data.ptrvalue;
14638
if (cip->item_list != NULL
14639
&& DoesObjectMatchConstraintChoiceSet (cip->item_list->choice, cip->item_list->data.ptrvalue, constraint)) {
14640
cip->chosen = do_choose;
14642
ChooseCategoriesByConstraint (cip->subcategories, constraint, do_choose);
14645
value_list = value_list->next;
14650
NLM_EXTERN void ChooseCategoriesForSegregateConstraintDialog(DialoG d, ValNodePtr list)
14652
ValNodePtr constraint;
14654
constraint = DialogToPointer (d);
14655
ChooseCategoriesByConstraint (list, constraint, TRUE);
14656
constraint = ConstraintChoiceSetFree (constraint);
14660
NLM_EXTERN void UnchooseCategoriesForSegregateConstraintDialog(DialoG d, ValNodePtr list)
14662
ValNodePtr constraint;
14664
constraint = DialogToPointer (d);
14665
ChooseCategoriesByConstraint (list, constraint, FALSE);
14666
constraint = ConstraintChoiceSetFree (constraint);
14670
static Boolean DomRNAAndProteinMatch (SeqFeatPtr mrna, ProtRefPtr prp)
14672
CharPtr mrna_product;
14673
Boolean rval = FALSE;
14675
if (mrna == NULL || prp == NULL) {
14678
mrna_product = GetRNARefProductString (mrna->data.value.ptrvalue, NULL);
14679
if (StringHasNoText (mrna_product)) {
14680
if (prp->name == NULL || StringHasNoText (prp->name->data.ptrvalue)) {
14684
if (prp->name != NULL && StringCmp (mrna_product, prp->name->data.ptrvalue) == 0) {
14688
mrna_product = MemFree (mrna_product);
14693
NLM_EXTERN void BulkCDSSetProtein (Pointer target, Pointer data)
14695
SeqFeatXrefPtr xref;
14696
ProtRefPtr prp = NULL;
14697
BioseqPtr prot_bsp;
14698
SeqFeatPtr prot_feat;
14699
SeqMgrFeatContext fcontext;
14700
ValNodePtr prot_name_list = NULL, vnp;
14701
SeqFeatPtr sfp, mrna;
14703
if ((sfp = (SeqFeatPtr) target) == NULL) return;
14705
prot_name_list = (ValNodePtr) data;
14708
while (xref != NULL && xref->data.choice != SEQFEAT_PROT) {
14711
if (xref != NULL) {
14712
prp = xref->data.value.ptrvalue;
14716
if (sfp->data.choice == SEQFEAT_PROT) {
14717
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
14718
} else if (sfp->data.choice == SEQFEAT_CDREGION) {
14719
prot_bsp = BioseqFindFromSeqLoc (sfp->product);
14720
prot_feat = SeqMgrGetNextFeature (prot_bsp, NULL, SEQFEAT_PROT, FEATDEF_PROT, &fcontext);
14721
if (prot_feat == NULL && prot_name_list != NULL) {
14722
prot_feat = CreateNewFeatureOnBioseq (prot_bsp, SEQFEAT_PROT, NULL);
14723
prp = ProtRefNew ();
14724
prot_feat->data.value.ptrvalue = prp;
14725
SeqMgrIndexFeatures (prot_bsp->idx.entityID, NULL);
14727
if (prot_feat != NULL) {
14728
prp = (ProtRefPtr) prot_feat->data.value.ptrvalue;
14733
if (prp == NULL && prot_name_list != NULL) {
14734
xref = SeqFeatXrefNew ();
14735
prp = ProtRefNew ();
14736
xref->data.choice = SEQFEAT_PROT;
14737
xref->data.value.ptrvalue = prp;
14738
xref->next = sfp->xref;
14742
mrna = SeqMgrGetOverlappingmRNA (sfp->location, &fcontext);
14743
if (mrna != NULL) {
14744
if (!DomRNAAndProteinMatch(mrna, prp)) {
14750
prp->name = ValNodeFreeData (prp->name);
14751
for (vnp = prot_name_list; vnp != NULL; vnp = vnp->next) {
14752
ValNodeAddPointer (&prp->name, vnp->choice, StringSave (vnp->data.ptrvalue));
14754
if (mrna != NULL && prot_name_list != NULL) {
14755
SetRNARefProductString (mrna->data.value.ptrvalue, NULL, prot_name_list->data.ptrvalue, ExistingTextOption_replace_old);
14762
typedef struct stringobjectpair {
14766
} StringObjectPairData, PNTR StringObjectPairPtr;
14769
static StringObjectPairPtr StringObjectPairNew (CharPtr str, Uint1 choice, Pointer data)
14771
StringObjectPairPtr sop = (StringObjectPairPtr) MemNew (sizeof (StringObjectPairData));
14773
sop->choice = choice;
14779
static StringObjectPairPtr StringObjectPairFree (StringObjectPairPtr sop)
14782
sop->str = MemFree (sop->str);
14783
sop = MemFree (sop);
14789
static ValNodePtr StringObjectPairListFree (ValNodePtr list)
14791
ValNodePtr vnp_next;
14793
while (list != NULL) {
14794
vnp_next = list->next;
14796
list->data.ptrvalue = StringObjectPairFree (list->data.ptrvalue);
14797
list = ValNodeFree (list);
14804
static int LIBCALLBACK SortVnpByStringObjectPair (VoidPtr ptr1, VoidPtr ptr2)
14807
StringObjectPairPtr sop1;
14808
StringObjectPairPtr sop2;
14812
if (ptr1 != NULL && ptr2 != NULL) {
14813
vnp1 = *((ValNodePtr PNTR) ptr1);
14814
vnp2 = *((ValNodePtr PNTR) ptr2);
14815
if (vnp1 != NULL && vnp2 != NULL) {
14816
sop1 = (StringObjectPairPtr) vnp1->data.ptrvalue;
14817
sop2 = (StringObjectPairPtr) vnp2->data.ptrvalue;
14818
if (sop1 != NULL && sop2 != NULL) {
14819
return StringCmp (sop1->str, sop2->str);
14827
typedef struct uniqstructuredcomment {
14828
StructuredCommentFieldPtr field;
14829
ValNodeBlock pair_list;
14830
} UniqStructuredCommentData, PNTR UniqStructuredCommentPtr;
14833
static void GetUniqueValuesForStructuredCommentFieldCallback (SeqDescrPtr sdp, Pointer data)
14835
UniqStructuredCommentPtr usc;
14839
if (sdp == NULL || sdp->choice != Seq_descr_user
14840
|| (uop = (UserObjectPtr) sdp->data.ptrvalue) == NULL
14841
|| uop->type == NULL
14842
|| StringCmp (uop->type->str, "StructuredComment") != 0
14843
|| (usc = (UniqStructuredCommentPtr)data) == NULL) {
14847
str = GetStructuredCommentFieldFromUserObject (uop, usc->field, NULL);
14849
ValNodeAddPointerToEnd (&(usc->pair_list), 0, StringObjectPairNew(str, OBJ_SEQDESC, sdp));
14854
NLM_EXTERN ValNodePtr GetUniqueValuesForStructuredCommentField (SeqEntryPtr sep, CharPtr field_name)
14856
UniqStructuredCommentData usd;
14857
ValNodePtr list, vnp;
14858
ClickableItemPtr last_cip = NULL;
14859
StringObjectPairPtr sop;
14860
ValNodeBlock cip_list;
14862
usd.field = ValNodeNew (NULL);
14863
usd.field->choice = StructuredCommentField_named;
14864
usd.field->data.ptrvalue = field_name;
14865
InitValNodeBlock(&(usd.pair_list), NULL);
14867
VisitDescriptorsInSep (sep, &usd, GetUniqueValuesForStructuredCommentFieldCallback);
14868
usd.field = ValNodeFree (usd.field);
14869
list = usd.pair_list.head;
14870
list = ValNodeSort (list, SortVnpByStringObjectPair);
14872
InitValNodeBlock(&cip_list, NULL);
14874
for (vnp = list; vnp != NULL; vnp = vnp->next) {
14875
sop = (StringObjectPairPtr) vnp->data.ptrvalue;
14877
if (last_cip == NULL || StringCmp (last_cip->description, sop->str) != 0) {
14878
/* make new category */
14879
last_cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
14880
MemSet (last_cip, 0, sizeof (ClickableItemData));
14881
last_cip->description = sop->str;
14883
ValNodeAddPointerToEnd (&(cip_list), 0, last_cip);
14885
/* add to category */
14886
ValNodeAddPointer (&(last_cip->item_list), sop->choice, sop->data);
14889
list = StringObjectPairListFree(list);
14891
return cip_list.head;
14895
static void GetStructuredCommentFieldNamesCallback (SeqDescrPtr sdp, Pointer data)
14900
if (sdp != NULL && data != NULL && sdp->choice == Seq_descr_user
14901
&& (uop = sdp->data.ptrvalue) != NULL
14902
&& IsUserObjectStructuredComment (uop)) {
14905
while (ufp != NULL) {
14906
if (ufp->label != NULL && ufp->label->str != NULL
14907
&& StringCmp (ufp->label->str, "StructuredCommentPrefix") != 0
14908
&& StringCmp (ufp->label->str, "StructuredCommentSuffix") != 0) {
14909
ValNodeAddPointer ((ValNodePtr PNTR) data, 0, StringSave (ufp->label->str));
14917
NLM_EXTERN ValNodePtr GetStructuredCommentFieldNames (SeqEntryPtr sep)
14919
ValNodePtr list = NULL;
14921
VisitDescriptorsInSep (sep, &list, GetStructuredCommentFieldNamesCallback);
14922
list = ValNodeSort (list, SortVnpByString);
14923
ValNodeUnique (&list, SortVnpByString, ValNodeFreeData);
14928
typedef struct badqual {
14931
Boolean move_to_note;
14932
} BadQualData, PNTR BadQualPtr;
14934
static void RemoveBadQualsCommonCallback (SeqFeatPtr sfp, Pointer data)
14937
GBQualPtr gbqual, gbqual_prev = NULL, gbqual_next;
14943
CharPtr note_fmt = "[%s=%s]";
14946
if (sfp == NULL || (bq = (BadQualPtr) data) == NULL) {
14949
key = GetGBFeatKeyForFeature (sfp);
14950
index = GBFeatKeyNameValid (&key, FALSE);
14951
key = MemFree (key);
14956
for (gbqual = sfp->qual; gbqual != NULL; gbqual = gbqual_next) {
14957
gbqual_next = gbqual->next;
14959
qvalid = IsQualValidForFeature(gbqual, sfp);
14961
val = GBQualNameValid (gbqual->qual);
14962
if (bq->illegal && !ShouldBeAGBQual (sfp->idx.subtype, val, FALSE)) {
14966
if (bq->illegal && (val = GBQualNameValid (gbqual->qual)) == -1) {
14968
} else if (bq->wrong && (qvalid == 0 || qvalid > 1)) {
14973
if (bq->move_to_note) {
14974
note_txt = (CharPtr) MemNew (sizeof (Char) * (StringLen (note_fmt) + StringLen (gbqual->qual) + StringLen (gbqual->val)));
14975
sprintf (note_txt, note_fmt, gbqual->qual == NULL ? "" : gbqual->qual, gbqual->val == NULL ? "" : gbqual->val);
14976
SetStringValue (&(sfp->comment), note_txt, ExistingTextOption_append_semi);
14977
note_txt = MemFree (note_txt);
14979
if (gbqual_prev == NULL) {
14980
sfp->qual = gbqual_next;
14982
gbqual_prev->next = gbqual_next;
14984
gbqual->next = NULL;
14985
gbqual = GBQualFree (gbqual);
14987
gbqual_prev = gbqual;
14993
NLM_EXTERN void RemoveBadQualsCommon (Uint2 entityID, Boolean wrong, Boolean illegal, Boolean move_to_note)
14999
sep = GetTopSeqEntryForEntityID (entityID);
15005
bq.illegal = illegal;
15006
bq.move_to_note = move_to_note;
15008
VisitFeaturesInSep (sep, &bq, RemoveBadQualsCommonCallback);
15010
ObjMgrSetDirtyFlag (entityID, TRUE);
15011
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
15016
static void RemoveBadQualsCommonItem (IteM i, Boolean wrong, Boolean illegal, Boolean move_to_note)
15020
bfp = currentFormDataPtr;
15022
bfp = GetObjectExtra (i);
15024
if (bfp == NULL || bfp->input_entityID == 0) return;
15026
RemoveBadQualsCommon (bfp->input_entityID, wrong, illegal, move_to_note);
15030
NLM_EXTERN void RemoveIllegalQuals (IteM i)
15032
RemoveBadQualsCommonItem (i, FALSE, TRUE, FALSE);
15036
NLM_EXTERN void RemoveWrongQuals (IteM i)
15038
RemoveBadQualsCommonItem (i, TRUE, FALSE, FALSE);
15042
NLM_EXTERN void MoveIllegalQuals (IteM i)
15044
RemoveBadQualsCommonItem (i, FALSE, TRUE, TRUE);
15048
NLM_EXTERN void MoveWrongQuals (IteM i)
15050
RemoveBadQualsCommonItem (i, TRUE, FALSE, TRUE);
15054
static SeqIdPtr GetProteinSeqIdFromBioseq (BioseqPtr bsp)
15059
for (sip = bsp->id; sip != NULL; sip = sip->next) {
15060
if (sip->choice == SEQID_GENERAL
15061
&& (dbtag = (DbtagPtr) sip->data.ptrvalue) != NULL
15062
&& !IsSkippableDbtag(dbtag)) {
15070
static void FindProteinIDDBCallback (BioseqPtr bsp, Pointer data)
15076
if (bsp == NULL || !ISA_aa(bsp->mol) || (pDb = (CharPtr PNTR)data) == NULL || *pDb != NULL) {
15080
sip = GetProteinSeqIdFromBioseq (bsp);
15082
&& (dbtag = (DbtagPtr) sip->data.ptrvalue) != NULL
15083
&& !IsSkippableDbtag(dbtag)) {
15084
*pDb = StringSave (dbtag->db);
15090
static void CreateOneProteinId (BioseqPtr bsp, CharPtr db, CharPtr locus_tag)
15095
SeqIdPtr sip_local, sip_last = NULL;
15097
for (sip = bsp->id; sip != NULL; sip = sip->next) {
15098
if (sip->choice == SEQID_GENERAL
15099
&& (dbtag = (DbtagPtr) sip->data.ptrvalue) != NULL
15100
&& !IsSkippableDbtag(dbtag)) {
15103
if (sip->choice == SEQID_LOCAL) {
15109
sip = ValNodeNew(NULL);
15110
sip->choice = SEQID_GENERAL;
15111
dbtag = DbtagNew ();
15112
dbtag->db = StringSave (db);
15113
dbtag->tag = ObjectIdNew();
15114
dbtag->tag->str = StringSave (locus_tag);
15115
sip->data.ptrvalue = dbtag;
15116
if (sip_local == NULL) {
15117
if (sip_last == NULL) {
15120
sip_last->next = sip;
15122
/* replace in bioseq index */
15123
SeqMgrReplaceInBioseqIndex (bsp);
15125
sep = GetTopSeqEntryForEntityID (bsp->idx.entityID);
15126
ReplaceSeqIdWithSeqId (sip_local, sip, sep);
15127
sip = SeqIdFree (sip);
15132
static void CreateProteinIDsCallback (BioseqPtr bsp, Pointer data)
15137
SeqFeatPtr cds, gene = NULL;
15138
GeneRefPtr grp = NULL;
15139
SeqMgrFeatContext context;
15141
if (bsp == NULL || !ISA_aa(bsp->mol) || (db = (CharPtr)data) == NULL) {
15145
for (sip = bsp->id; sip != NULL; sip = sip->next) {
15146
if (sip->choice == SEQID_GENERAL
15147
&& (dbtag = (DbtagPtr) sip->data.ptrvalue) != NULL
15148
&& !IsSkippableDbtag(dbtag)) {
15153
cds = SeqMgrGetCDSgivenProduct (bsp, &context);
15157
GetGeneInfoForFeature (cds, &grp, &gene);
15158
if (grp != NULL && !StringHasNoText (grp->locus_tag)) {
15159
CreateOneProteinId (bsp, db, grp->locus_tag);
15165
typedef struct justtextform {
15168
} JustTextFormData, PNTR JustTextFormPtr;
15171
static void DoCreateProteinIDs (ButtoN b)
15173
JustTextFormPtr frm;
15177
frm = (JustTextFormPtr) GetObjectExtra (b);
15180
} else if (TextHasNoText (frm->db_txt)) {
15181
Message (MSG_ERROR, "Must provide database tag!");
15185
sep = GetTopSeqEntryForEntityID (frm->input_entityID);
15189
db = SaveStringFromText (frm->db_txt);
15190
VisitBioseqsInSep (sep, db, CreateProteinIDsCallback);
15192
ObjMgrSetDirtyFlag (frm->input_entityID, TRUE);
15193
ObjMgrSendMsg (OM_MSG_UPDATE, frm->input_entityID, 0, 0);
15194
Remove (frm->form);
15200
NLM_EXTERN void CreateProteinIDs (IteM i)
15204
JustTextFormPtr frm;
15211
bfp = currentFormDataPtr;
15213
bfp = GetObjectExtra (i);
15215
if (bfp == NULL) return;
15217
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
15218
VisitBioseqsInSep (sep, &db, FindProteinIDDBCallback);
15220
frm = (JustTextFormPtr) MemNew (sizeof (JustTextFormData));
15222
w = FixedWindow (-50, -33, -10, -10, "Create Protein IDs", StdCloseWindowProc);
15223
SetObjectExtra (w, frm, StdCleanupExtraProc);
15224
h = HiddenGroup (w, -1, 0, NULL);
15225
SetGroupSpacing (h, 10, 10);
15226
frm->form = (ForM) w;
15227
frm->input_entityID = bfp->input_entityID;
15229
g = HiddenGroup (h, 2, 0, NULL);
15230
StaticPrompt (g, "Database", 0, dialogTextHeight, programFont, 'c');
15231
frm->db_txt = DialogText (g, db, 14, NULL);
15234
c = HiddenGroup (h, 2, 0, NULL);
15235
b = DefaultButton (c, "Accept", DoCreateProteinIDs);
15236
SetObjectExtra (b, frm, NULL);
15237
PushButton (c, "Cancel", StdCancelButtonProc);
15238
AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) c, NULL);
15245
typedef struct existinglocustag {
15249
} ExistingLocusTagData, PNTR ExistingLocusTagPtr;
15252
static Int4 GetLocusTagPrefixLen (CharPtr str)
15257
if (StringHasNoText (str)) return 0;
15259
len = StringLen (str) - 1;
15261
while (len > 0 && isdigit (*(str + len))) {
15268
static void PopulateExistingLocusTag (ExistingLocusTagPtr pLocusTag, CharPtr locus_tag)
15273
if (pLocusTag == NULL || StringHasNoText (locus_tag)
15274
|| (prefix_len = GetLocusTagPrefixLen(locus_tag)) < 1) {
15278
if (pLocusTag->prefix == NULL) {
15279
pLocusTag->prefix = (CharPtr) MemNew (sizeof (Char) * (prefix_len + 1));
15280
StringNCpy (pLocusTag->prefix, locus_tag, prefix_len);
15281
pLocusTag->prefix[prefix_len] = 0;
15283
if (StringNCmp (locus_tag, pLocusTag->prefix, prefix_len) == 0) {
15284
val = atol (locus_tag + prefix_len + 1);
15285
if (val > pLocusTag->max) {
15286
pLocusTag->max = val;
15292
static void FindGenePrefix (SeqFeatPtr sfp, Pointer data)
15294
ExistingLocusTagPtr pLocusTag;
15298
|| sfp->data.choice != SEQFEAT_GENE
15299
|| (pLocusTag = (ExistingLocusTagPtr)data) == NULL
15300
|| (grp = (GeneRefPtr) sfp->data.value.ptrvalue) == NULL) {
15304
PopulateExistingLocusTag (pLocusTag, grp->locus_tag);
15308
static void FindGeneLocusTagFromProteinID (BioseqPtr bsp, Pointer data)
15310
ExistingLocusTagPtr pLocusTag;
15314
if (bsp == NULL || !ISA_aa (bsp->mol)
15315
|| (pLocusTag = (ExistingLocusTagPtr)data) == NULL) {
15319
sip = GetProteinSeqIdFromBioseq (bsp);
15321
&& (dbtag = (DbtagPtr) sip->data.ptrvalue) != NULL
15322
&& !IsSkippableDbtag(dbtag)) {
15323
PopulateExistingLocusTag (pLocusTag, dbtag->tag->str);
15324
if (pLocusTag->id_db == NULL) {
15325
pLocusTag->id_db = StringSave (dbtag->db);
15331
static Boolean FeatureSubtypeWantsLocusTagGene (Int4 featdef)
15333
if (featdef == FEATDEF_CDS
15334
|| featdef == FEATDEF_tRNA
15335
|| featdef == FEATDEF_rRNA
15336
|| featdef == FEATDEF_tmRNA
15337
|| featdef == FEATDEF_ncRNA) {
15345
static void CreateLocusTagGenesCallback (SeqFeatPtr sfp, Pointer data)
15347
ExistingLocusTagPtr locus_data;
15348
SeqFeatPtr gene = NULL, mrna;
15349
GeneRefPtr grp = NULL;
15351
BioseqPtr bsp, pbsp = NULL;
15352
SeqLocPtr gene_loc;
15353
DbtagPtr dbtag = NULL;
15356
/* create locus tag genes for features that don't have them */
15357
if (sfp == NULL || !FeatureSubtypeWantsLocusTagGene(sfp->idx.subtype) || (locus_data = (ExistingLocusTagPtr) data) == NULL) {
15361
if (sfp->idx.subtype == FEATDEF_CDS) {
15362
pbsp = BioseqFindFromSeqLoc (sfp->product);
15363
sip = GetProteinSeqIdFromBioseq (pbsp);
15365
dbtag = (DbtagPtr) sip->data.ptrvalue;
15369
GetGeneInfoForFeature (sfp, &grp, &gene);
15371
bsp = BioseqFindFromSeqLoc (sfp->location);
15373
mrna = GetmRNAforCDS(sfp);
15374
if (mrna == NULL) {
15375
gene_loc = SeqLocMerge (bsp, sfp->location, NULL, TRUE, FALSE, FALSE);
15377
gene_loc = SeqLocMerge (bsp, mrna->location, NULL, TRUE, FALSE, FALSE);
15379
if (gene_loc != NULL) {
15380
gene = CreateNewFeatureOnBioseq (bsp, SEQFEAT_GENE, gene_loc);
15381
gene_loc = SeqLocFree (gene_loc);
15382
grp = GeneRefNew ();
15383
gene->data.value.ptrvalue = grp;
15387
if (grp != NULL && StringHasNoText (grp->locus_tag)) {
15388
grp->locus_tag = MemFree (grp->locus_tag);
15389
if (dbtag != NULL && dbtag->tag != NULL && !StringHasNoText (dbtag->tag->str))
15391
grp->locus_tag = StringSave (dbtag->tag->str);
15393
sprintf (buf, "%04d", locus_data->max + 5);
15395
grp->locus_tag = (CharPtr) MemNew (sizeof (Char) * (StringLen (locus_data->prefix) + StringLen (buf) + 2));
15396
sprintf (grp->locus_tag, "%s_%s", locus_data->prefix, buf);
15397
locus_data->max += 5;
15399
if (pbsp != NULL && !StringHasNoText (locus_data->id_db)) {
15400
CreateOneProteinId (pbsp, locus_data->id_db, grp->locus_tag);
15406
typedef struct locustaggeneform {
15409
ButtoN also_protein_ids;
15412
ExistingLocusTagData locus_data;
15413
} LocusTagGeneFormData, PNTR LocusTagGeneFormPtr;
15416
static void CleanupLocusTagGeneForm (
15422
LocusTagGeneFormPtr frm;
15424
frm = (LocusTagGeneFormPtr) data;
15426
frm->locus_data.prefix = MemFree (frm->locus_data.prefix);
15427
frm->locus_data.id_db = MemFree (frm->locus_data.id_db);
15429
StdCleanupFormProc (g, data);
15433
static void DoCreateLocusTagGenes (ButtoN b)
15435
LocusTagGeneFormPtr frm;
15438
frm = (LocusTagGeneFormPtr) GetObjectExtra (b);
15439
if (frm == NULL || TextHasNoText (frm->prefix_txt)) {
15442
frm->locus_data.prefix = MemFree (frm->locus_data.prefix);
15443
frm->locus_data.prefix = SaveStringFromText (frm->prefix_txt);
15444
frm->locus_data.id_db = MemFree (frm->locus_data.id_db);
15445
if (GetStatus (frm->also_protein_ids)) {
15446
frm->locus_data.id_db = SaveStringFromText (frm->db_txt);
15449
sep = GetTopSeqEntryForEntityID (frm->input_entityID);
15452
VisitFeaturesInSep (sep, &(frm->locus_data), CreateLocusTagGenesCallback);
15453
ObjMgrSetDirtyFlag (frm->input_entityID, TRUE);
15454
ObjMgrSendMsg (OM_MSG_UPDATE, frm->input_entityID, 0, 0);
15455
Remove (frm->form);
15461
static void AlsoProteinIdsBtn (ButtoN b)
15463
LocusTagGeneFormPtr frm;
15465
frm = (LocusTagGeneFormPtr) GetObjectExtra (b);
15470
if (GetStatus (frm->also_protein_ids)) {
15471
Enable (frm->db_txt);
15473
Disable (frm->db_txt);
15478
NLM_EXTERN void AddLocusTagGenes (IteM i)
15482
LocusTagGeneFormPtr frm;
15488
bfp = currentFormDataPtr;
15490
bfp = GetObjectExtra (i);
15492
if (bfp == NULL) return;
15494
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
15496
frm = (LocusTagGeneFormPtr) MemNew (sizeof (LocusTagGeneFormData));
15497
frm->locus_data.prefix = NULL;
15498
frm->locus_data.max = 0;
15499
VisitFeaturesInSep (sep, &(frm->locus_data), FindGenePrefix);
15500
VisitBioseqsInSep (sep, &(frm->locus_data), FindGeneLocusTagFromProteinID);
15502
w = FixedWindow (-50, -33, -10, -10, "Create locus_tag genes", StdCloseWindowProc);
15503
SetObjectExtra (w, frm, CleanupLocusTagGeneForm);
15505
h = HiddenGroup (w, -1, 0, NULL);
15506
SetGroupSpacing (h, 10, 10);
15507
frm->form = (ForM) w;
15508
frm->input_entityID = bfp->input_entityID;
15510
g = HiddenGroup (h, 2, 0, NULL);
15511
StaticPrompt (g, "Prefix", 0, dialogTextHeight, programFont, 'c');
15512
frm->prefix_txt = DialogText (g, frm->locus_data.prefix, 14, NULL);
15514
g2 = HiddenGroup (h, 2, 0, NULL);
15515
frm->also_protein_ids = CheckBox (g2, "Also create protein IDs with database:", AlsoProteinIdsBtn);
15516
SetObjectExtra (frm->also_protein_ids, frm, NULL);
15517
frm->db_txt = DialogText (g2, frm->locus_data.id_db, 14, NULL);
15518
Disable (frm->db_txt);
15520
c = HiddenGroup (h, 2, 0, NULL);
15521
b = DefaultButton (c, "Accept", DoCreateLocusTagGenes);
15522
SetObjectExtra (b, frm, NULL);
15523
PushButton (c, "Cancel", StdCancelButtonProc);
15524
AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) c, NULL);