2069
/*=========================================================================*/
2073
/*=========================================================================*/
2075
static void MergeCDSCallback (BioseqPtr bsp, Pointer userdata)
2077
SeqFeatPtr cds, first_cds;
2078
SeqMgrFeatContext fcontext;
2079
Int4 left = -1, right = -1;
2080
SeqLocPtr cover_loc;
2081
Boolean partial_left = FALSE, partial_right = FALSE;
2089
first_cds = SeqMgrGetNextFeature (bsp, NULL, SEQFEAT_CDREGION, 0, &fcontext);
2093
if (left == -1 || left > fcontext.left)
2095
left = fcontext.left;
2096
partial_left = fcontext.partialL;
2098
if (right < fcontext.right)
2100
right = fcontext.right;
2101
partial_right = fcontext.partialR;
2103
cds = SeqMgrGetNextFeature (bsp, cds, SEQFEAT_CDREGION, 0, &fcontext);
2105
if (left < 0 || right < 0)
2109
strand = SeqLocStrand (first_cds->location);
2110
cover_loc = SeqLocIntNew (left, right, strand, bsp->id);
2111
if (strand == Seq_strand_minus)
2113
SetSeqLocPartial (cover_loc, partial_right, partial_left);
2117
SetSeqLocPartial (cover_loc, partial_left, partial_right);
2120
cds = CreateNewFeatureOnBioseq (bsp, SEQFEAT_CDREGION, cover_loc);
2121
cds->partial = (partial_left | partial_right);
2122
cds->data.value.ptrvalue = AsnIoMemCopy (first_cds->data.value.ptrvalue,
2123
(AsnReadFunc) CdRegionAsnRead,
2124
(AsnWriteFunc) CdRegionAsnWrite);
2125
RetranslateOneCDS (cds, first_cds->idx.entityID, TRUE, FALSE);
2128
extern void MergeCDS (IteM i)
2134
/* Get the top level BioseqSet */
2137
bfp = currentFormDataPtr;
2139
bfp = GetObjectExtra (i);
2145
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
2152
lip = OpenLog ("Merge CDS Mat Peptides");
2153
VisitBioseqsInSep (sep, NULL, MergeCDSCallback);
2154
ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
2155
ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
2156
VisitBioseqsInSep (sep, lip, ConvertInnerCDSsToMatPeptidesCallback);
2160
/* Do an update and return successfully */
2162
DeleteMarkedObjects (bfp->input_entityID, 0, NULL);
2163
ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
2164
ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
2171
2070
static Boolean ConvertImpToSpecialRNA
2172
2071
(SeqFeatPtr sfp,
2173
2072
Uint2 featdef_to,
17145
17055
static Boolean ConvertImpToImp (SeqFeatPtr, Uint2 featdef_to, Pointer extradata);
17146
17056
static Boolean ConvertRNAToRNA (SeqFeatPtr, Uint2 featdef_to, Pointer extradata);
17147
17057
static Boolean ConvertProtToProt (SeqFeatPtr, Uint2 featdef_to, Pointer extradata);
17058
static Boolean ConvertCDSToMatPeptide (SeqFeatPtr sfp, Uint2 featdef_to, Pointer extradata);
17059
static Boolean ConvertMiscFeatureToCDSFunction (SeqFeatPtr sfp, Uint2 featdef_to, Pointer extradata);
17150
17061
static ConvertFeatureProcsData ConvertFeaturesTable[] = {
17151
17062
{ SEQFEAT_CDREGION, FEATDEF_CDS, SEQFEAT_RNA, FEATDEF_ANY,
17181
17092
"If protein feature has name, this will be saved as /product qualifier on new feature.\nIf protein feature does not have name but does have description, this will be saved as /product qualifier on new feature.\n"
17182
17093
"EC_number values from the protein feature will be saved as /EC_number qualifiers on the new feature.\nActivity values will be saved as /function qualifiers on the new feature.\n"
17183
17094
"Db_xref values from the protein feature will be saved as /db_xref qualifers on the new feature." },
17095
{ SEQFEAT_IMP, FEATDEF_misc_feature, SEQFEAT_CDREGION, FEATDEF_CDS,
17096
NULL, NULL, NULL, ConvertMiscFeatureToCDSFunction, NULL,
17097
"Use misc_feature comment for coding region product name." },
17184
17098
{ SEQFEAT_IMP, FEATDEF_ANY, SEQFEAT_RNA, FEATDEF_misc_RNA,
17185
17099
NULL, NULL, NULL, ConvertImpToSpecialRNA, NULL,
17186
17100
"Creates a misc_RNA. Import feature key is discarded." },
17251
17165
{ SEQFEAT_PROT, FEATDEF_ANY, SEQFEAT_PROT, FEATDEF_ANY,
17252
17166
NULL, NULL, NULL, ConvertProtToProt, NULL,
17253
17167
"Changes type of protein feature." },
17168
{ SEQFEAT_CDREGION, FEATDEF_CDS, SEQFEAT_PROT, FEATDEF_mat_peptide_aa,
17169
NULL, NULL, NULL, ConvertCDSToMatPeptide, NULL,
17170
"If coding region is overlapped by another coding region, will convert the coding region to a mat-peptide on the overlapping coding region's protein sequence, otherwise if you have checked \"Leave Original Feature\" it will create a mat-peptide with the same protein names and description on the protein sequence for the coding region." }
17256
17173
static Int4 num_convert_feature_table_lines = sizeof (ConvertFeaturesTable) / sizeof (ConvertFeatureProcsData);
29288
extern LogInfoPtr OpenLog (CharPtr display_title)
29292
lip = (LogInfoPtr) MemNew (sizeof (LogInfoData));
29297
TmpNam (lip->path);
29298
lip->fp = FileOpen (lip->path, "w");
29299
lip->data_in_log = FALSE;
29300
lip->display_title = StringSave (display_title);
29304
extern void CloseLog (LogInfoPtr lip)
29306
if (lip == NULL || lip->fp == NULL)
29310
FileClose (lip->fp);
29312
if (lip->data_in_log)
29314
LaunchGeneralTextViewer (lip->path, lip->display_title);
29316
FileRemove (lip->path);
29319
extern LogInfoPtr FreeLog (LogInfoPtr lip)
29323
lip->display_title = MemFree (lip->display_title);
29324
if (lip->fp != NULL)
29326
FileClose (lip->fp);
29328
FileRemove (lip->path);
29330
lip = MemFree (lip);
29335
29223
static CharPtr GetLastLineageFromString (CharPtr lineage)
29337
29225
CharPtr last_semicolon, lineage_start, penultimate_semicolon;
29571
static SeqFeatPtr GetProtFeature (BioseqPtr protbsp)
29573
SeqMgrFeatContext fcontext;
29575
SeqFeatPtr prot_sfp;
29578
if (protbsp == NULL) return NULL;
29580
prot_sfp = SeqMgrGetNextFeature (protbsp, NULL, 0, FEATDEF_PROT, &fcontext);
29581
if (prot_sfp == NULL) {
29582
sap = protbsp->annot;
29583
while (sap != NULL && prot_sfp == NULL) {
29584
if (sap->type == 1) {
29585
prot_sfp = sap->data;
29586
while (prot_sfp != NULL
29587
&& (prot_sfp->data.choice != SEQFEAT_PROT
29588
|| (prp = prot_sfp->data.value.ptrvalue) == NULL
29589
|| prp->processed != 0)) {
29590
prot_sfp = prot_sfp->next;
29600
29459
static void ApplyProductName (CombineCDSPtr ccp, SeqFeatPtr new_cds)
29602
29461
BioseqPtr first_prot_bsp, new_prot_bsp;
29740
static void CombineCDSsOnBioseq (BioseqPtr bsp, Pointer userdata)
29745
if (bsp == NULL || userdata == NULL)
29750
ccp = (CombineCDSPtr) userdata;
29752
ConvertInnerCDSsToMatPeptidesCallback (bsp, ccp->lip);
29601
(SeqLocPtr nuc_loc,
29602
SeqFeatPtr top_cds,
29604
BioseqPtr prot_bsp,
29607
SeqLocPtr prot_loc = NULL;
29608
Boolean partial5, partial3;
29610
if (nuc_loc == NULL || top_cds == NULL || prot_bsp == NULL
29611
|| top_cds->location == NULL)
29616
prot_loc = dnaLoc_to_aaLoc(top_cds, nuc_loc, TRUE, &cds_frame, TRUE);
29617
if (prot_loc == NULL) {
29618
if (lip != NULL && lip->fp != NULL)
29620
fprintf (lip->fp, "Invalid coordinates for mat_peptide conversion\n");
29621
lip->data_in_log = TRUE;
29625
Message (MSG_ERROR, "Invalid coordinates for mat_peptide conversion");
29628
/* set partials if necessary? */
29629
CheckSeqLocForPartial (nuc_loc, &partial5, &partial3);
29630
SetSeqLocPartial (prot_loc, partial5, partial3);
29637
static Boolean ConvertCDSToMatPeptideNoOverlap (SeqFeatPtr sfp, LogInfoPtr lip)
29639
SeqMgrFeatContext fcontext;
29641
if (sfp == NULL || sfp->data.choice != SEQFEAT_CDREGION) {
29644
if (!CreateMatPeptideFromCDS (sfp)) {
29645
SeqMgrGetDesiredFeature (sfp->idx.entityID, NULL, sfp->idx.itemID, 0, sfp, &fcontext);
29646
if (lip != NULL && lip->fp != NULL) {
29647
fprintf (lip->fp, "Coding region %s has no product sequence\n", fcontext.label);
29648
lip->data_in_log = TRUE;
29650
Message (MSG_ERROR, "Coding region %s has no product sequence\n", fcontext.label);
29659
static void ConvertCDSToMatPeptideNoOverlapCallback (BioseqPtr bsp, Pointer userdata)
29662
SeqMgrFeatContext fcontext;
29665
if (bsp == NULL || ISA_aa (bsp->mol)) {
29669
lip = (LogInfoPtr) userdata;
29670
for (sfp = SeqMgrGetNextFeature (bsp, NULL, SEQFEAT_CDREGION, 0, &fcontext);
29672
sfp = SeqMgrGetNextFeature (bsp, sfp, SEQFEAT_CDREGION, 0, &fcontext)) {
29673
ConvertCDSToMatPeptideNoOverlap (sfp, lip);
29678
static void ConvertCDSToMatPeptideOverlap (SeqFeatPtr sfp, SeqFeatPtr top_cds, LogInfoPtr lip)
29680
SeqMgrFeatContext gene_context;
29683
if (sfp == NULL || top_cds == NULL || sfp->data.choice != SEQFEAT_CDREGION || top_cds->data.choice != SEQFEAT_CDREGION) {
29687
if (!ConvertCDSToMatPeptideForOverlappingCDS (sfp, top_cds, TRUE)) {
29688
if (lip != NULL && lip->fp != NULL)
29690
fprintf (lip->fp, "Invalid coordinates for mat_peptide conversion\n");
29691
lip->data_in_log = TRUE;
29695
Message (MSG_ERROR, "Invalid coordinates for mat_peptide conversion");
29698
/* Mark gene with same location for deletion */
29699
gene = SeqMgrGetOverlappingGene (sfp->location, &gene_context);
29700
if (gene != NULL && SeqLocCompare (gene->location, sfp->location) == SLC_A_EQ_B)
29702
gene->idx.deleteme = 1;
29708
static void ConvertInnerCDSsToMatPeptidesCallback (BioseqPtr bsp, Pointer userdata)
29711
SeqFeatPtr sfp = NULL;
29712
ValNodePtr top_level_cds_list = NULL;
29713
SeqMgrFeatContext context;
29715
SeqFeatPtr top_cds;
29717
if (bsp == NULL || ! ISA_na (bsp->mol)) return;
29718
lip = (LogInfoPtr) userdata;
29720
sfp = SeqMgrGetNextFeature (bsp, sfp, SEQFEAT_CDREGION, 0, &context);
29721
while (sfp != NULL)
29724
for (vnp = top_level_cds_list;
29725
vnp != NULL && top_cds == NULL;
29728
top_cds = (SeqFeatPtr) vnp->data.ptrvalue;
29729
if (top_cds != NULL)
29731
if (SeqLocCompare (top_cds->location, sfp->location) != SLC_B_IN_A)
29738
if (top_cds == NULL)
29740
/* add to list of top level CDSs */
29741
ValNodeAddPointer (&top_level_cds_list, 0, sfp);
29745
ConvertCDSToMatPeptideOverlap (sfp, top_cds, lip);
29747
sfp = SeqMgrGetNextFeature (bsp, sfp, SEQFEAT_CDREGION, 0, &context);
29749
ValNodeFree (top_level_cds_list);
29755
29753
static void DoCombineCDS (ButtoN b)
29882
29884
h = HiddenGroup (w, -1, 0, NULL);
29883
29885
SetGroupSpacing (h, 10, 10);
29885
ccp->action_choice_grp = HiddenGroup (h, 0, 2, EnableNewCDSControls);
29887
ccp->action_choice_grp = HiddenGroup (h, 0, 3, EnableNewCDSControls);
29886
29888
RadioButton (ccp->action_choice_grp, "Convert inner CDSs to mat_peptides");
29887
RadioButton (ccp->action_choice_grp, "AND Merge multiple CDSs into one CDS");
29889
RadioButton (ccp->action_choice_grp, "Merge multiple CDSs into one CDS and convert inner CDSs to mat_peptides");
29890
RadioButton (ccp->action_choice_grp, "Create mat-peptide from protein on each CDS");
29888
29891
SetValue (ccp->action_choice_grp, 1);
29889
29892
SetObjectExtra (ccp->action_choice_grp, ccp, NULL);
32772
/* sequesters is different from segregate - we aren't creating a permanent new set with
32773
* the combined descriptors of the previous set; we're creating a temporary holding set.
32769
32775
static void SequesterCategorySeqEntries (BioseqSetPtr newset, ClickableItemPtr category)
32771
32777
ValNodePtr vnp_item;
32772
SeqEntryPtr sep, last_sep, prev_sep, remove_sep;
32773
BioseqSetPtr bssp, orig_parent;
32778
SeqEntryPtr sep, last_sep, prev_sep, remove_sep, set_sep, tmp_sep;
32779
BioseqSetPtr bssp, orig_parent, prev_new_parent = NULL, prev_orig_parent = NULL;
32774
32780
BioseqPtr bsp;
32775
32781
Int4 set_pos;
32828
32834
prev_sep->next = sep->next;
32831
/* set class type if not already set */
32832
if (newset->_class == BioseqseqSet_class_genbank) {
32833
newset->_class = orig_parent->_class;
32836
/* add descriptors from the orig_parent to the new parent */
32837
AddNewUniqueDescriptors (&(newset->descr), orig_parent->descr);
32839
/* add annotations from the orig_parent to the new parent */
32840
AddNewUniqueAnnotations (&(newset->annot), orig_parent->annot);
32842
/* add to new parent */
32839
/* if this seq-entry is from the same parent as the previous one, just add this to
32840
* our current placeholder.
32842
if (prev_orig_parent != orig_parent) {
32843
prev_new_parent = BioseqSetNew ();
32844
prev_new_parent->_class = orig_parent->_class;
32845
/* add descriptors from the orig_parent to the new parent */
32846
AddNewUniqueDescriptors (&(prev_new_parent->descr), orig_parent->descr);
32848
/* add annotations from the orig_parent to the new parent */
32849
AddNewUniqueAnnotations (&(prev_new_parent->annot), orig_parent->annot);
32851
/* add new parent to set */
32852
set_sep = SeqEntryNew ();
32853
set_sep->choice = 2;
32854
set_sep->data.ptrvalue = prev_new_parent;
32856
if (newset->seq_set == NULL) {
32857
newset->seq_set = set_sep;
32859
for (tmp_sep = newset->seq_set; tmp_sep->next != NULL; tmp_sep = tmp_sep->next) {
32861
tmp_sep->next = set_sep;
32863
SeqMgrLinkSeqEntry (set_sep, OBJ_BIOSEQSET, newset);
32866
/* add seqentry to new parent */
32844
32867
if (last_sep == NULL) {
32845
newset->seq_set = sep;
32868
prev_new_parent->seq_set = sep;
32847
32870
last_sep->next = sep;
32849
32872
last_sep = sep;
32850
SeqMgrLinkSeqEntry (sep, OBJ_BIOSEQSET, newset);
32874
SeqMgrLinkSeqEntry (sep, OBJ_BIOSEQSET, prev_new_parent);
32852
32876
/* create unsequester entry */
32853
32877
ValNodeAddPointer (&unsequester_list, 0, UnsequesterNew (sep, orig_parent, set_pos));
32879
prev_orig_parent = orig_parent;
32856
32882
for (vnp_item = category->subcategories; vnp_item != NULL; vnp_item = vnp_item->next) {
33029
33055
bfp = GetBaseFormForEntityID (entityID);
33030
33056
RemoveSeqEntryViewer (bfp->form);
33032
bssp = (BioseqSetPtr) add_back_sep->data.ptrvalue;
33058
/* we created a genbank set to hold the actual parent sets */
33059
top_bssp = (BioseqSetPtr) add_back_sep->data.ptrvalue;
33034
33061
/* need to process entries in seq_set in reverse, so that the set_pos will be
33035
33062
* correct relative to when the seq-entry was removed */
33036
ValNodeReverse (&(bssp->seq_set));
33037
sep = bssp->seq_set;
33039
while (sep != NULL) {
33040
next_sep = sep->next;
33042
u = GetUnsequesterForSep (sep, unsequester_list);
33043
if (u == NULL || u->orig_parent == NULL) {
33044
AddSepBackToSet (sep, sequester_set, bssp->descr, 0);
33046
AddSepBackToSet (sep, u->orig_parent, bssp->descr, u->set_pos);
33063
ValNodeReverse (&(top_bssp->seq_set));
33064
new_parent_sep = top_bssp->seq_set;
33066
while (new_parent_sep != NULL) {
33067
bssp = new_parent_sep->data.ptrvalue;
33068
ValNodeReverse (&(bssp->seq_set));
33069
sep = bssp->seq_set;
33071
while (sep != NULL) {
33072
next_sep = sep->next;
33074
u = GetUnsequesterForSep (sep, unsequester_list);
33075
if (u == NULL || u->orig_parent == NULL) {
33076
AddSepBackToSet (sep, sequester_set, bssp->descr, 0);
33078
AddSepBackToSet (sep, u->orig_parent, bssp->descr, u->set_pos);
33082
bssp->seq_set = NULL;
33083
new_parent_sep = new_parent_sep->next;
33051
33086
ObjMgrDelete (OBJ_SEQENTRY, add_back_sep);
33052
bssp->seq_set = NULL;
33053
bssp->idx.deleteme = TRUE;
33087
top_bssp->seq_set = NULL;
33088
top_bssp->idx.deleteme = TRUE;
33054
33089
DeleteMarkedObjects (entityID, 0, NULL);
33056
33091
DeleteMarkedObjects (sequester_set->idx.entityID, 0, NULL);
33258
NLM_EXTERN Boolean OkToSequester (void)
33260
if (unsequester_list != NULL || sequester_set != NULL) {
33268
NLM_EXTERN void LIBCALLBACK SequesterSequenceList (Uint2 entityID, ValNodePtr bsp_list)
33271
BioseqSetPtr bssp, new_set;
33272
ClickableItemData cid;
33273
ObjMgrDataPtr omdptop;
33277
Uint2 new_entityID;
33278
FormMessageFunc old_message_handler;
33280
BioseqViewFormPtr vfp;
33281
SeqEntryPtr pulled_sep;
33283
if (bsp_list == NULL) {
33287
if (unsequester_list != NULL || sequester_set != NULL) {
33288
Message (MSG_ERROR, "You are already sequestering a set. You cannot sequester until you have restored these sequences to the original set.");
33292
sep = GetTopSeqEntryForEntityID (entityID);
33293
if (sep == NULL || !IS_Bioseq_set (sep)) {
33294
Message (MSG_ERROR, "This record does not have a top-levelset!");
33298
bssp = FindTopLevelSetForDesktopFunction((BioseqSetPtr) sep->data.ptrvalue);
33299
if (bssp == NULL) {
33300
Message (MSG_ERROR, "Unable to find top level set");
33304
WriteTheEntityID (entityID, SEQUESTER_BACKUP_FILE, FALSE);
33305
sequester_set = bssp;
33307
/* create a new set with just the chosen sequences */
33308
SaveSeqEntryObjMgrData (sep, &omdptop, &omdata);
33309
GetSeqEntryParent (sep, &parentptr, &parenttype);
33311
new_set = BioseqSetNew ();
33312
new_set->_class = BioseqseqSet_class_genbank;
33314
MemSet (&cid, 0, sizeof (ClickableItemData));
33316
cid.item_list = bsp_list;
33317
SequesterCategorySeqEntries (new_set, &cid);
33319
RestoreSeqEntryObjMgrData (sep, omdptop, &omdata);
33320
DeleteMarkedObjects (entityID, 0, NULL);
33321
ObjMgrSetDirtyFlag (entityID, TRUE);
33322
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
33324
pulled_sep = SeqEntryNew ();
33325
pulled_sep->choice = 2;
33326
pulled_sep->data.ptrvalue = new_set;
33327
SeqMgrLinkSeqEntry (pulled_sep, 0, NULL);
33329
new_entityID = ObjMgrRegister (OBJ_SEQENTRY, pulled_sep);
33330
seqviewprocs.filepath = NULL;
33331
seqviewprocs.forceSeparateViewer = TRUE;
33332
old_message_handler = seqviewprocs.handleMessages;
33333
seqviewprocs.handleMessages = SequesterFormMessage;
33336
SeqEntrySetScope (NULL);
33337
GatherProcLaunch (OMPROC_VIEW, FALSE, new_entityID, 1,
33338
OBJ_BIOSEQ, 0, 0, OBJ_BIOSEQ, 0);
33340
seqviewprocs.handleMessages = old_message_handler;
33342
/* hide viewer with the remaining sequences */
33343
bfp = GetBaseFormForEntityID (entityID);
33346
vfp = (BioseqViewFormPtr) bfp;
33347
Hide (vfp->toolForm);
33350
/* get rid of existing validator window, replace with validator for new sequences */
33351
FreeValidateWindow ();
33352
bfp = GetBaseFormForEntityID (new_entityID);
33353
ValSeqEntryForm (bfp->form);
33224
33357
extern Int2 LIBCALLBACK SequesterSequences (Pointer data)
33226
33359
/* note - in future, will need to make sequester dialog modal. */
33227
return SegregateSetsByFieldEx (data, SequesterSets);
33360
return SegregateSetsByFieldEx (data, SequesterSets, eSegPageId);
37479
static Pointer HasBarcodeKeyword (Uint1 data_choice, Pointer data, Pointer metadata)
37482
SeqMgrDescContext context;
37485
Boolean rval = FALSE;
37487
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37488
if (res != NULL && res->bsp != NULL) {
37489
for (sdp = SeqMgrGetNextDescriptor (res->bsp, NULL, Seq_descr_genbank, &context);
37490
sdp != NULL && !rval;
37491
sdp = SeqMgrGetNextDescriptor (res->bsp, sdp, Seq_descr_genbank, &context)) {
37492
gb = (GBBlockPtr) sdp->data.ptrvalue;
37494
for (vnp = gb->keywords; vnp != NULL && !rval; vnp = vnp->next) {
37495
if (StringCmp (vnp->data.ptrvalue, "BARCODE") == 0) {
37503
return StringSave ("TRUE");
37346
37511
static Int4 BarcodeFormatBarcodeID (ColPtr col, CharPtr name)
37348
37513
if (col == NULL) return 0;
37405
37570
{ "Country", NULL, NULL, GetBarcodeTestCountryResult, NULL, BulkFreeSimpleText, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, NULL, BulkSimpleTextCopy },
37406
37571
{ "Voucher", NULL, NULL, GetBarcodeTestSpecimenVoucherResult, NULL, BulkFreeSimpleText, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, NULL, BulkSimpleTextCopy },
37407
37572
{ "Percent Ns", NULL, NULL, GetBarcodeTestPercentNsResult, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BarcodeFormatPercentN, NULL, NULL, BulkSimpleTextCopy },
37573
{ "Has BARCODE Keyword", NULL, NULL, HasBarcodeKeyword, NULL, BulkFreeSimpleText, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, NULL, BulkSimpleTextCopy },
37408
37574
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
37410
37576
static void NavigateToBarcodeTestResultBioseq (ValNodePtr object, Pointer userdata)