~ubuntu-branches/ubuntu/raring/ncbi-tools6/raring

« back to all changes in this revision

Viewing changes to sequin/sequin10.c

  • Committer: Package Import Robot
  • Author(s): Aaron M. Ucko
  • Date: 2011-09-05 18:55:02 UTC
  • mfrom: (1.1.11 upstream)
  • Revision ID: package-import@ubuntu.com-20110905185502-iuvmoe65ytljhckn
Tags: 6.1.20110713-1
* New upstream release.
* debian/*.symbols: update accordingly.
* make/makeshlb.unx: link libcn3dOGL.so against -lm for sqrt.
* doc/man/*.1: update for new release.
* debian/rules:
  - (VIB): add asnmacro, as upstream takes care to publish binaries thereof.
  - Retire obsolete multiarch-unaware checks for libpthread.
  - Fully modernize Debhelper usage; in particular, transition to overrides.
* debian/compat: advance to 9 per rules modernization.
* debian/ncbi-tools-bin.install: add asnmacro.
* make/makenet.unx: link asnmacro only against libraries it directly needs.
* doc/man/asnmacro.1: give asnmacro a man page.
* doc/man/Psequin.1: list it in SEE ALSO.
* network/id1arch/idfetch.c: revert redundant change (from #295110).
* Convert to multiarch.
  - debian/rules: Install libraries (and ncbithr.o) to multiarch directories.
  - debian/lib*.install: match multiarch library paths.
  - debian/control:
    + Build-Depends: debhelper (>= 8.1.3~), implying a recent dpkg-dev.
    + Set Multi-Arch: as appropriate across the board, and specify
      Pre-Depends: ${misc:Pre-Depends} for runtime libraries.
* debian/*.lintian-overrides: drop leading slashes for Lintian 2.5.x.
* debian/control: Standards-Version: 3.9.2 (already compliant).

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
*
30
30
* Version Creation Date:   9/3/2003
31
31
*
32
 
* $Revision: 1.504 $
 
32
* $Revision: 1.554 $
33
33
*
34
34
* File Description: 
35
35
*
66
66
#include <valapi.h>
67
67
#include <seqsub.h>
68
68
#include <tax3api.h>
 
69
#include <valid.h>
69
70
 
70
71
typedef struct deflineformdata {
71
72
  FEATURE_FORM_BLOCK
263
264
    case DEFLINE_USE_FEATURES :
264
265
      dlfp->feature_requests.feature_list_type = DEFLINE_USE_FEATURES;
265
266
      break;
 
267
    case DEFLINE_PARTIAL_SEQUENCE :
 
268
      dlfp->feature_requests.feature_list_type = DEFLINE_PARTIAL_SEQUENCE;
 
269
      break;
266
270
    case DEFLINE_COMPLETE_SEQUENCE :
267
271
      dlfp->feature_requests.feature_list_type = DEFLINE_COMPLETE_SEQUENCE;
268
272
      break;
668
672
  SetObjectExtra (dlfp->featurePopup, dlfp, NULL);
669
673
  PopupItem (dlfp->featurePopup, "List Features");
670
674
  PopupItem (dlfp->featurePopup, "Complete Sequence");
 
675
  PopupItem (dlfp->featurePopup, "Partial Sequence");
671
676
  PopupItem (dlfp->featurePopup, "Complete Genome");
672
677
  PopupItem (dlfp->featurePopup, "Partial Genome");
673
678
  PopupItem (dlfp->featurePopup, "Sequence");
2789
2794
}
2790
2795
 
2791
2796
 
2792
 
static void LoadOrganismModifierTableEx (IteM i, Boolean IsTaxConsult)
 
2797
NLM_EXTERN void LoadOrganismModifierTableBaseForm (BaseFormPtr bfp, Boolean IsTaxConsult)
2793
2798
{
2794
 
  BaseFormPtr   bfp;
2795
2799
  ValNodePtr    header_line;
2796
2800
  ValNodePtr    vnp;
2797
2801
  TableLinePtr  tlp;
2803
2807
  Int4Ptr       blank_list = NULL;
2804
2808
  OrgModTableColumnData o;
2805
2809
 
2806
 
#ifdef WIN_MAC
2807
 
  bfp = currentFormDataPtr;
2808
 
#else
2809
 
  bfp = GetObjectExtra (i);
2810
 
#endif
2811
2810
  if (bfp == NULL) return;
2812
2811
 
2813
2812
  header_line = ReadTableData ();
2880
2879
  Update ();
2881
2880
}
2882
2881
 
 
2882
static void LoadOrganismModifierTableEx (IteM i, Boolean IsTaxConsult)
 
2883
{
 
2884
  BaseFormPtr   bfp;
 
2885
#ifdef WIN_MAC
 
2886
  bfp = currentFormDataPtr;
 
2887
#else
 
2888
  bfp = GetObjectExtra (i);
 
2889
#endif
 
2890
 
 
2891
  LoadOrganismModifierTableBaseForm (bfp, IsTaxConsult);
 
2892
}
 
2893
 
2883
2894
extern void LoadOrganismModifierTable (IteM i)
2884
2895
{
2885
2896
  LoadOrganismModifierTableEx (i, FALSE);
2891
2902
}
2892
2903
 
2893
2904
 
2894
 
extern Boolean ReplaceImportModifierName (CharPtr PNTR orig_name, Int4 col_num)
 
2905
static void LoadOrganismModifierTableButtonEx (ButtoN b, Boolean IsTaxConsult)
 
2906
{
 
2907
  BaseFormPtr   bfp;
 
2908
 
 
2909
  bfp = (BaseFormPtr) GetObjectExtra(b);
 
2910
  if (b == NULL) {
 
2911
    return;
 
2912
  }
 
2913
  LoadOrganismModifierTableBaseForm (bfp, IsTaxConsult);
 
2914
}
 
2915
 
 
2916
 
 
2917
extern void LoadTaxConsultBtn (ButtoN b)
 
2918
{
 
2919
  LoadOrganismModifierTableButtonEx (b, TRUE);
 
2920
}
 
2921
 
 
2922
 
 
2923
 
 
2924
extern Boolean ReplaceImportModifierName (CharPtr PNTR orig_name, Int4 col_num, ValNodePtr preferred_list)
2895
2925
{
2896
2926
  ModalAcceptCancelData acd;
2897
2927
  WindoW                w;
2921
2951
  }
2922
2952
  
2923
2953
  ValNodeAddPointer (&mod_name_choice_list, 1, StringSave ("Ignore Column"));
2924
 
  mod_name_choice_list->next = GetSourceQualDescList (TRUE, TRUE, FALSE, FALSE);
 
2954
  ValNodeLink (&mod_name_choice_list, ValNodeDupList(preferred_list, SourceQualValNodeCopy));
 
2955
  ValNodeLink(&mod_name_choice_list, GetSourceQualDescList (TRUE, TRUE, FALSE, FALSE));
2925
2956
  ValNodeAddPointer (&mod_name_choice_list, 2, StringSave ("Organism"));
2926
2957
  ValNodeAddPointer (&mod_name_choice_list, 3, StringSave ("Location"));
2927
2958
  
3006
3037
  Boolean              list_accession;
3007
3038
  Boolean              list_local;
3008
3039
  Boolean              list_general;
 
3040
  Boolean              launch_excel;
3009
3041
 
3010
3042
  ValNodePtr           organism_id_profile;
3011
3043
  FILE *fp;  
3376
3408
  ButtoN list_local;
3377
3409
  ButtoN list_general;
3378
3410
  ButtoN list_additional_mods;
 
3411
  ButtoN launch_excel;
3379
3412
  ButtoN accept_btn;
3380
3413
} ExportModFormData, PNTR ExportModFormPtr;
3381
3414
 
3517
3550
  /* initialize dialog to "All" */
3518
3551
  SendMessageToDialog (form_data->selected_mods, NUM_VIB_MSG + 1);
3519
3552
 
 
3553
#ifdef WIN_MSWIN
 
3554
  form_data->launch_excel = CheckBox (h, "Launch Excel", NULL);
 
3555
#endif
 
3556
 
3520
3557
  c = HiddenGroup (h, 2, 0, NULL);
3521
3558
  form_data->accept_btn = PushButton (c, "Accept", ModalAcceptButton);
3522
3559
  SetObjectExtra (form_data->accept_btn, &acd, NULL);
3577
3614
    eotp->list_accession = GetStatus (form_data->list_accession);
3578
3615
    eotp->list_local = GetStatus (form_data->list_local);
3579
3616
    eotp->list_general = GetStatus (form_data->list_general);
 
3617
#ifdef WIN_MSWIN
 
3618
    eotp->launch_excel = GetStatus (form_data->launch_excel);
 
3619
#endif
3580
3620
 
3581
3621
    return TRUE;
3582
3622
  }  
3601
3641
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
3602
3642
  if (sep == NULL) return;
3603
3643
 
 
3644
  MemSet (&eotd, 0, sizeof (ExportOrgTableData));
3604
3645
  eotd.modList = MemNew (NumDefLineModifiers () * sizeof (ModifierItemLocalData));
3605
3646
  if (eotd.modList == NULL) return;
3606
3647
 
3612
3653
  if (SelectModifiersForExport (&eotd))
3613
3654
  {
3614
3655
    if (GetOutputFileName (path, sizeof (path), NULL))
3615
 
        {
 
3656
    {
3616
3657
      eotd.fp = FileOpen (path, "w");
3617
3658
      if (eotd.fp == NULL) 
3618
 
          {
3619
 
            Message (MSG_ERROR, "Unable to open %s", path);
3620
 
          }
3621
 
          else
3622
 
          {
3623
 
            lead_str [0] = 0;
3624
 
                lead_str [1] = 0;
 
3659
      {
 
3660
        Message (MSG_ERROR, "Unable to open %s", path);
 
3661
      }
 
3662
            else
 
3663
            {
 
3664
              lead_str [0] = 0;
 
3665
                    lead_str [1] = 0;
3625
3666
        /* print a header line */
3626
 
            if (eotd.list_accession)
3627
 
                {
3628
 
                  fprintf (eotd.fp, "Accession Number");
3629
 
                  lead_str [0] = '\t';
3630
 
                }
3631
 
                if (eotd.list_local)
3632
 
                {
3633
 
              fprintf (eotd.fp, "%sLocal ID", lead_str);
3634
 
                  lead_str [0] = '\t';
3635
 
                }
 
3667
              if (eotd.list_accession)
 
3668
                    {
 
3669
                      fprintf (eotd.fp, "Accession Number");
 
3670
                      lead_str [0] = '\t';
 
3671
                    }
 
3672
                    if (eotd.list_local)
 
3673
                    {
 
3674
                  fprintf (eotd.fp, "%sLocal ID", lead_str);
 
3675
                      lead_str [0] = '\t';
 
3676
                    }
3636
3677
        if (eotd.list_general)
3637
 
                {
3638
 
                  fprintf (eotd.fp, "%sGeneral ID", lead_str);
3639
 
                  lead_str [0] = '\t';
3640
 
                }
3641
 
                if (eotd.list_tax_name)
3642
 
                {
3643
 
                  fprintf (eotd.fp, "%sTax Name", lead_str);
3644
 
                  lead_str [0] = '\t';
3645
 
                }
 
3678
                    {
 
3679
                      fprintf (eotd.fp, "%sGeneral ID", lead_str);
 
3680
                      lead_str [0] = '\t';
 
3681
                    }
 
3682
                    if (eotd.list_tax_name)
 
3683
                    {
 
3684
                      fprintf (eotd.fp, "%sTax Name", lead_str);
 
3685
                      lead_str [0] = '\t';
 
3686
                    }
3646
3687
 
3647
3688
        for (idx = 0; idx < NumDefLineModifiers (); idx++)
3648
3689
        {
3656
3697
        
3657
3698
        ExportOrganisms  (sep, &eotd);
3658
3699
        FileClose (eotd.fp);
 
3700
#ifdef WIN_MSWIN
 
3701
        if (eotd.launch_excel) {
 
3702
          Nlm_MSWin_OpenApplication ("excel.exe", path);
 
3703
        }
 
3704
#endif
 
3705
            }
3659
3706
          }
3660
 
        }
3661
3707
  }
3662
3708
  for (idx=0; idx < NumDefLineModifiers (); idx++)
3663
3709
  {
4764
4810
  ButtoN                 remove_quotes;
4765
4811
  ButtoN                 accept_button;
4766
4812
  ButtoN                 mail_button;
 
4813
  PrompT                 err_msg;
4767
4814
} QualLoadFormData, PNTR QualLoadFormPtr;
4768
4815
 
4769
4816
static void CleanupQualLoadForm (
4791
4838
  if (data == NULL) return;
4792
4839
 
4793
4840
  form_data = (QualLoadFormPtr) data;
 
4841
  SetTitle (form_data->err_msg, "");
4794
4842
  /* must have one and only one match choice, must have at least one apply choice */
4795
4843
 
4796
4844
  if (form_data->list_dlg == NULL) {
4826
4874
    } else {
4827
4875
      Disable (form_data->accept_button);
4828
4876
      Disable (form_data->mail_button);
 
4877
      SetTitle (form_data->err_msg, err_list->data.ptrvalue);
4829
4878
      err_list = ValNodeFree (err_list);
4830
4879
    }
4831
4880
  }
4927
4976
}
4928
4977
 
4929
4978
 
 
4979
static ValNodePtr CheckForDuplicateColumns (ValNodePtr columns)
 
4980
{
 
4981
  ValNodePtr vnp, vnp2;
 
4982
  TabColumnConfigPtr t, t2;
 
4983
  ValNodePtr duplicate_column_list = NULL;
 
4984
  Boolean    this_dup;
 
4985
 
 
4986
  for (vnp = columns; vnp != NULL; vnp = vnp->next) {
 
4987
    this_dup = FALSE;
 
4988
    t = (TabColumnConfigPtr) vnp->data.ptrvalue;
 
4989
    if (t != NULL && t->field != NULL) {
 
4990
      for (vnp2 = vnp->next; vnp2 != NULL && !this_dup; vnp2 = vnp2->next) {
 
4991
        t2 = (TabColumnConfigPtr) vnp2->data.ptrvalue;
 
4992
        if (t2 != NULL && CompareFieldTypes(t->field, t2->field) == 0 && t2->existing_text != ExistingTextOption_add_qual) {
 
4993
          ValNodeAddPointer (&duplicate_column_list, 0, SummarizeFieldType (t->field));
 
4994
          this_dup = TRUE;
 
4995
        }
 
4996
      }
 
4997
    }
 
4998
  }
 
4999
  duplicate_column_list = ValNodeSort (duplicate_column_list, SortVnpByString);
 
5000
  ValNodeUnique (&duplicate_column_list, SortVnpByString, ValNodeFreeData);
 
5001
  return duplicate_column_list;
 
5002
}
 
5003
 
 
5004
  
 
5005
static void FixDuplicateColumns (ValNodePtr columns)
 
5006
{
 
5007
  ValNodePtr vnp, vnp2;
 
5008
  TabColumnConfigPtr t, t2;
 
5009
 
 
5010
  if (columns == NULL || columns->next == NULL) {
 
5011
    return;
 
5012
  }
 
5013
 
 
5014
  for (vnp = columns; vnp != NULL; vnp = vnp->next) {
 
5015
    t = (TabColumnConfigPtr) vnp->data.ptrvalue;
 
5016
    if (t->field != NULL) {
 
5017
      for (vnp2 = vnp->next; vnp2 != NULL; vnp2 = vnp2->next) {
 
5018
        t2 = (TabColumnConfigPtr) vnp2->data.ptrvalue;
 
5019
        if (CompareFieldTypes(t->field, t2->field) == 0 && t2->existing_text != ExistingTextOption_add_qual) {
 
5020
          t2->existing_text = ExistingTextOption_add_qual;
 
5021
        }
 
5022
      }
 
5023
    }
 
5024
  }
 
5025
}
 
5026
 
 
5027
 
 
5028
static Boolean HandleDuplicateColumns (QualLoadFormPtr form_data, ValNodePtr columns)
 
5029
{
 
5030
  ValNodePtr      dup_col_list;
 
5031
  Int4            i;
 
5032
  ValNodePtr      vnp;
 
5033
  Boolean         rval = TRUE;
 
5034
 
 
5035
  if (form_data == NULL || columns == NULL) {
 
5036
    return FALSE;
 
5037
  }
 
5038
 
 
5039
  dup_col_list = CheckForDuplicateColumns (columns);
 
5040
  if (dup_col_list != NULL) {
 
5041
    if (ANS_CANCEL == Message (MSG_OKC, 
 
5042
         "You have specified multiple columns for the same qualifier value.  This will probably not work as expected. "
 
5043
         " Do you want to change the configuration to add them all as separate qualifiers?")) {
 
5044
      rval = FALSE;
 
5045
    } else {
 
5046
      dup_col_list = ValNodeFreeData(dup_col_list);
 
5047
      FixDuplicateColumns (columns);
 
5048
      if (form_data->list_dlg == NULL) {
 
5049
        for (i = 0, vnp = columns; i < form_data->num_columns && vnp != NULL; i++, vnp = vnp->next) {
 
5050
          PointerToDialog (form_data->column_list[i], vnp->data.ptrvalue);
 
5051
        }
 
5052
      } else {
 
5053
        PointerToDialog (form_data->list_dlg, columns);
 
5054
      }
 
5055
    }
 
5056
  }
 
5057
  dup_col_list = ValNodeFreeData(dup_col_list);
 
5058
 
 
5059
  return rval;
 
5060
}
 
5061
 
 
5062
 
4930
5063
static void DoAcceptQuals (ButtoN b)
4931
5064
{
4932
5065
  QualLoadFormPtr form_data;
4938
5071
  form_data = (QualLoadFormPtr) GetObjectExtra (b);
4939
5072
  if (form_data == NULL) return;
4940
5073
 
 
5074
  if (form_data->list_dlg == NULL) {
 
5075
    for (i = 0; i < form_data->num_columns; i++) {
 
5076
      t = DialogToPointer (form_data->column_list[i]);
 
5077
      ValNodeAddPointer (&columns, 0, t);
 
5078
    }
 
5079
  } else {
 
5080
    columns = DialogToPointer (form_data->list_dlg);
 
5081
  }
 
5082
 
 
5083
  if (!HandleDuplicateColumns(form_data, columns)) {
 
5084
    columns = TabColumnConfigListFree (columns);
 
5085
    return;
 
5086
  }
 
5087
 
4941
5088
  if (GetStatus (form_data->remove_quotes)) {
4942
5089
    RemoveQuotesFromTabTable (form_data->table);
4943
5090
  }
4944
5091
 
4945
 
  if (form_data->list_dlg == NULL) {
4946
 
    for (i = 0; i < form_data->num_columns; i++) {
4947
 
      t = DialogToPointer (form_data->column_list[i]);
4948
 
      ValNodeAddPointer (&columns, 0, t);
4949
 
    }
4950
 
  } else {
4951
 
    columns = DialogToPointer (form_data->list_dlg);
4952
 
  }
4953
 
 
4954
5092
  sep = GetTopSeqEntryForEntityID (form_data->input_entityID);
4955
5093
  if (ApplyTableValues (sep, form_data->table, columns)) {
4956
5094
    ObjMgrSetDirtyFlag (form_data->input_entityID, TRUE);
5032
5170
}
5033
5171
 
5034
5172
 
5035
 
static Boolean HasTaxonomyID (BioSourcePtr biop)
5036
 
{
5037
 
  ValNodePtr  db;
5038
 
  DbtagPtr    dbt;
5039
 
  Boolean     rval = FALSE;
5040
 
 
5041
 
  if (biop == NULL || biop->org == NULL) {
5042
 
    return FALSE;
5043
 
  }
5044
 
  for (db = biop->org->db; db != NULL && !rval; db = db->next) {
5045
 
    dbt = (DbtagPtr) db->data.ptrvalue;
5046
 
    if (dbt != NULL && dbt->db != NULL &&
5047
 
      StringICmp (dbt->db, "taxon") == 0) {
5048
 
      rval = TRUE;
5049
 
    }
5050
 
  }
5051
 
  return rval;
5052
 
}
5053
 
 
5054
 
 
5055
5173
static void ReportOneMailReport (MailReportPtr m, BioSourcePtr biop, LogInfoPtr lip)
5056
5174
{
5057
5175
  Char              id_str[100];
5139
5257
}
5140
5258
 
5141
5259
 
 
5260
static void WantBarcodeAdjustmentCallback (BioseqPtr bsp, Pointer data)
 
5261
{
 
5262
  if (bsp != NULL && data != NULL && HasBARCODETech(bsp)) {
 
5263
    *((BoolPtr)data) = TRUE;
 
5264
  }
 
5265
}
 
5266
 
 
5267
 
 
5268
static Boolean WantBarcodeAdjustment (SeqEntryPtr sep)
 
5269
{
 
5270
  Boolean want_adjustment = FALSE;
 
5271
  Char    path [PATH_MAX];
 
5272
  FILE   *fp;  
 
5273
 
 
5274
  if (!GetSequinAppParam ("BARCODE", "LIVELIST", NULL, path, sizeof (path))) {
 
5275
    return FALSE;
 
5276
  }
 
5277
  if (StringHasNoText (path)) {
 
5278
    return FALSE;
 
5279
  }
 
5280
 
 
5281
  fp = FileOpen (path, "r");
 
5282
  if (fp == NULL) {
 
5283
    return FALSE;
 
5284
  }
 
5285
  FileClose (fp);
 
5286
 
 
5287
  VisitBioseqsInSep (sep, &want_adjustment, WantBarcodeAdjustmentCallback);
 
5288
 
 
5289
  return want_adjustment;
 
5290
}
 
5291
 
 
5292
 
 
5293
static TwoStringHashPtr sBarcodeLiveListAccBin = NULL;
 
5294
static TwoStringHashPtr sBarcodeLiveListAccId = NULL;
 
5295
static TwoStringHashPtr sBarcodeLiveListIdBin = NULL;
 
5296
static Boolean sAttemptedToReadBarcodeLiveList = FALSE;
 
5297
 
 
5298
static void FixBarcodeLiveListIds (ValNodePtr table)
 
5299
{
 
5300
  ValNodePtr row, col;
 
5301
  CharPtr    cp;
 
5302
 
 
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) {
 
5306
      *cp = 0;
 
5307
    }
 
5308
  }
 
5309
}
 
5310
 
 
5311
 
 
5312
static Boolean ReadBarcodeLiveList (void)
 
5313
{
 
5314
  ValNodePtr table, col, vnp;
 
5315
  Char    path [PATH_MAX];
 
5316
  FILE   *fp; 
 
5317
  Int4   len, i;
 
5318
 
 
5319
  if (sAttemptedToReadBarcodeLiveList) {
 
5320
    if (sBarcodeLiveListAccBin == NULL) {
 
5321
      return FALSE;
 
5322
    } else {
 
5323
      return TRUE;
 
5324
    }
 
5325
  }
 
5326
  if (!GetSequinAppParam ("BARCODE", "LIVELIST", NULL, path, sizeof (path))) {
 
5327
    return FALSE;
 
5328
  }
 
5329
  if (StringHasNoText (path)) {
 
5330
    return FALSE;
 
5331
  }
 
5332
 
 
5333
  fp = FileOpen (path, "r");
 
5334
  if (fp == NULL) {
 
5335
    return FALSE;
 
5336
  }
 
5337
  table = ReadTabTableFromFile (fp);
 
5338
  FileClose (fp);
 
5339
 
 
5340
  if (table == NULL) {
 
5341
    return FALSE;
 
5342
  }
 
5343
 
 
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++;
 
5362
      }
 
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++;
 
5368
      }
 
5369
    }
 
5370
  }
 
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++;
 
5383
    }
 
5384
  }
 
5385
 
 
5386
  table = FreeTabTable (table);
 
5387
 
 
5388
  sAttemptedToReadBarcodeLiveList = TRUE;
 
5389
  return TRUE;
 
5390
}
 
5391
 
 
5392
 
 
5393
static const CharPtr sBarcodeSpecialWords[] = {
 
5394
  " sp.", " aff.", " cf.", " group", " complex", " nr.", " near", NULL };
 
5395
 
 
5396
 
 
5397
static Boolean IsJustOneWord (CharPtr organism)
 
5398
{
 
5399
  if (StringChr (organism, ' ') == NULL) {
 
5400
    return TRUE;
 
5401
  } else {
 
5402
    return FALSE;
 
5403
  }
 
5404
}
 
5405
 
 
5406
 
 
5407
static Boolean OrganismWantsBarcodeAdjustment (CharPtr organism)
 
5408
{
 
5409
  Boolean rval = FALSE;
 
5410
  Int4    i;
 
5411
  /* TODO - only if contains one of the special words, or is just one word */
 
5412
  if (IsJustOneWord (organism)) {
 
5413
    rval = TRUE;
 
5414
  } else {
 
5415
    for (i = 0; sBarcodeSpecialWords[i] != NULL && !rval; i++) {
 
5416
      if (StringSearch (organism, sBarcodeSpecialWords[i]) != NULL) {
 
5417
        rval = TRUE;
 
5418
      }
 
5419
    }
 
5420
  }
 
5421
 
 
5422
  return rval;
 
5423
}
 
5424
 
 
5425
 
 
5426
static ValNodePtr GetNthValNode (ValNodePtr list, Int4 nth);
 
5427
 
 
5428
static Boolean FieldTypeIsTaxname (ValNodePtr field)
 
5429
{
 
5430
  ValNodePtr srcq;
 
5431
  if (field != NULL
 
5432
      && field->choice == FieldType_source_qual
 
5433
      && (srcq = field->data.ptrvalue) != NULL
 
5434
      && srcq->choice == SourceQualChoice_textqual
 
5435
      && srcq->data.intvalue == Source_qual_taxname) {
 
5436
    return TRUE;
 
5437
  } else {
 
5438
    return FALSE;
 
5439
  }
 
5440
}
 
5441
 
 
5442
 
 
5443
static ValNodePtr AdjustTableForBarcodeLiveList (ValNodePtr table, QualLoadFormPtr form_data)
 
5444
{
 
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;
 
5450
  Int4               i;
 
5451
  CharPtr            uniquer, id, tmp_name;
 
5452
 
 
5453
  new_table = CopyTabTable (table);
 
5454
 
 
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;
 
5462
      }
 
5463
      t = TabColumnConfigFree (t);
 
5464
    }
 
5465
  } else {
 
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;
 
5473
      }
 
5474
    }
 
5475
    columns = TabColumnConfigListFree (columns);
 
5476
  }
 
5477
 
 
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);
 
5488
            if (id != NULL) {
 
5489
              uniquer = GetValueFromTwoStringHash(acc_vnp->data.ptrvalue, sBarcodeLiveListIdBin);
 
5490
              if (uniquer == NULL) {
 
5491
                uniquer = id;
 
5492
              }
 
5493
            }
 
5494
          }
 
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);
 
5501
              }
 
5502
              SetStringValue (&tmp_name, uniquer, ExistingTextOption_append_space);
 
5503
              org_vnp->data.ptrvalue = tmp_name;
 
5504
            }              
 
5505
          }
 
5506
        }
 
5507
      }
 
5508
    }
 
5509
  }
 
5510
 
 
5511
  return new_table;
 
5512
}
 
5513
 
 
5514
 
5142
5515
static void SpecialMailReport (ButtoN b)
5143
5516
{
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;
5155
5528
  sep = GetTopSeqEntryForEntityID (form_data->input_entityID);
5156
5529
  VisitBioseqsInSep (sep, &list, MailReportCallback);
5157
5530
 
 
5531
  /* adjust table if necessary for barcode livelist */
 
5532
  tmp_table = form_data->table;
 
5533
  if (WantBarcodeAdjustment (sep) && ReadBarcodeLiveList()) {
 
5534
    adjusted_table = AdjustTableForBarcodeLiveList (form_data->table, form_data);
 
5535
    form_data->table = adjusted_table;
 
5536
  } 
 
5537
 
5158
5538
  /* now apply table */
5159
5539
  DoAcceptQuals (b);
5160
5540
 
 
5541
  /* put original table back */
 
5542
  form_data->table = tmp_table;
 
5543
  adjusted_table = FreeTabTable (adjusted_table);
 
5544
 
5161
5545
  /* now do taxfix */
5162
5546
  Taxon3ReplaceOrgInSeqEntryEx (sep, FALSE, FALSE);
5163
5547
  ObjMgrSetDirtyFlag (form_data->input_entityID, TRUE);
5241
5625
}
5242
5626
 
5243
5627
 
 
5628
static void ResetColumns (ButtoN b)
 
5629
{
 
5630
  QualLoadFormPtr form_data;
 
5631
  ValNodePtr      vnp;
 
5632
  ValNodePtr      columns = NULL;
 
5633
  Int4            i;
 
5634
  TabColumnConfigPtr t;
 
5635
 
 
5636
  form_data = (QualLoadFormPtr) GetObjectExtra (b);
 
5637
  if (form_data == NULL) return;
 
5638
 
 
5639
  if (form_data->list_dlg == NULL) {
 
5640
    for (i = 0; i < form_data->num_columns; i++) {
 
5641
      t = DialogToPointer (form_data->column_list[i]);
 
5642
      TabColumnConfigReset(t);
 
5643
      PointerToDialog (form_data->column_list[i], t);
 
5644
      t = TabColumnConfigFree(t);
 
5645
    }
 
5646
  } else {
 
5647
    columns = DialogToPointer (form_data->list_dlg);
 
5648
    for (vnp = columns;
 
5649
         vnp != NULL;
 
5650
         vnp = vnp->next) {
 
5651
      vnp->data.ptrvalue = TabColumnConfigFree (vnp->data.ptrvalue);
 
5652
    }
 
5653
    PointerToDialog (form_data->list_dlg, columns);
 
5654
    columns = TabColumnConfigListFree (columns);
 
5655
  }  
 
5656
}
 
5657
 
 
5658
 
5244
5659
static WindoW CreateTableReaderWindowWithTable (Uint2 entityID, ValNodePtr table);
5245
5660
 
5246
5661
static void LoadNewTable (ButtoN b)
5396
5811
}
5397
5812
 
5398
5813
 
5399
 
static void ReparseTabTableAddDummySeqId (ValNodePtr row_list)
5400
 
{
5401
 
  AddTextToTabTableColumn (row_list, 0, "_Seq1", ExistingTextOption_append_none);
5402
 
}
5403
 
 
5404
 
 
5405
 
static void ReloadNewBankitNoId (ButtoN b)
5406
 
{
5407
 
  ReLoadTable (b, ReparseTabTableAddDummySeqId);
5408
 
}
5409
 
 
5410
 
 
5411
5814
static void ReparseForFileId (ValNodePtr table)
5412
5815
{
5413
5816
  ValNodePtr column_list = NULL;
5423
5826
}
5424
5827
 
5425
5828
 
5426
 
static void ReparseForNewBankitId (ValNodePtr table)
5427
 
{
5428
 
  ValNodePtr column_list = NULL;
5429
 
  ValNodeAddInt (&column_list, 0, 0);
5430
 
  ValNodeAddInt (&column_list, 0, 1);
5431
 
  CombineTabTableColumns (table, column_list, "_");
5432
 
}
5433
 
 
5434
 
 
5435
 
static void ReloadNewBankitId (ButtoN b)
5436
 
{
5437
 
  ReLoadTable (b, ReparseForNewBankitId);
5438
 
}
5439
 
 
5440
 
 
5441
5829
static int LIBCALLBACK SortVnpByInt (VoidPtr ptr1, VoidPtr ptr2)
5442
5830
 
5443
5831
{
5462
5850
static void CombineColumns (ButtoN b_in)
5463
5851
{
5464
5852
  WindoW w;
5465
 
  GrouP  h, c;
 
5853
  GrouP  h, g, c;
5466
5854
  DialoG dlg;
 
5855
  TexT   delimiter_txt;
5467
5856
  ValNodePtr options = NULL, vnp, combine_list = NULL;
5468
5857
  Int4       i;
5469
5858
  ButtoN b;
5470
5859
  ModalAcceptCancelData acd;
5471
5860
  QualLoadFormPtr form_data;
5472
 
  CharPtr         label;
 
5861
  CharPtr         label, delimiter;
5473
5862
 
5474
5863
  form_data = (QualLoadFormPtr) GetObjectExtra (b_in);
5475
5864
  if (form_data == NULL || form_data->table == NULL || form_data->table->data.ptrvalue == NULL) return;
5487
5876
       i++, vnp = vnp->next) 
5488
5877
  {
5489
5878
    label = (CharPtr) MemNew (sizeof (Char) * (StringLen (vnp->data.ptrvalue) + 15));
5490
 
    sprintf (label, "%5d   %s", i + 1, vnp->data.ptrvalue);
 
5879
    sprintf (label, "%5d   %s", i + 1, (char *) vnp->data.ptrvalue);
5491
5880
    ValNodeAddPointer (&options, i, label);
5492
5881
  }
5493
5882
 
5495
5884
                                              ValNodeSimpleDataFree, ValNodeStringCopy,
5496
5885
                                              ValNodeStringMatch, "column", 
5497
5886
                                              NULL, NULL, TRUE);
 
5887
  g = HiddenGroup (h, 2, 0, NULL);
 
5888
  SetGroupSpacing (g, 10, 10);
 
5889
  StaticPrompt (g, "Delimiter", 0, popupMenuHeight, programFont, 'l');
 
5890
  delimiter_txt = DialogText (g, ",", 5, NULL);
5498
5891
 
5499
5892
  c = HiddenGroup (h, 3, 0, NULL);
5500
5893
  SetGroupSpacing (c, 10, 10);
5502
5895
  SetObjectExtra (b, &acd, NULL);
5503
5896
  b = PushButton (c, "Cancel", ModalCancelButton);
5504
5897
  SetObjectExtra (b, &acd, NULL);
5505
 
  AlignObjects (ALIGN_CENTER, (HANDLE) dlg, (HANDLE) c, NULL);
 
5898
  AlignObjects (ALIGN_CENTER, (HANDLE) dlg, (HANDLE) g, (HANDLE) c, NULL);
5506
5899
  
5507
5900
  Show(w); 
5508
5901
  Select (w);
5523
5916
          ValNodeAddInt (&combine_list, 0, vnp->choice);
5524
5917
        }
5525
5918
        combine_list = ValNodeSort (combine_list, SortVnpByInt);
5526
 
        CombineTabTableColumns (form_data->table, combine_list, ",");
 
5919
        delimiter = JustSaveStringFromText (delimiter_txt);
 
5920
        CombineTabTableColumns (form_data->table, combine_list, delimiter);
 
5921
        delimiter = MemFree (delimiter);
5527
5922
        combine_list = ValNodeFree (combine_list);
5528
5923
        ReDrawWindowAfterTableReload (form_data);
5529
5924
      }
5534
5929
}
5535
5930
 
5536
5931
 
 
5932
static void SeparateColumns (ButtoN b_in)
 
5933
{
 
5934
  WindoW w;
 
5935
  GrouP  h, g, c;
 
5936
  DialoG dlg;
 
5937
  TexT   delimiter_txt;
 
5938
  ButtoN just_first_delimiter_btn;
 
5939
  ValNodePtr options = NULL, vnp;
 
5940
  Int4       i;
 
5941
  ButtoN b;
 
5942
  ModalAcceptCancelData acd;
 
5943
  QualLoadFormPtr form_data;
 
5944
  CharPtr         label, delimiter;
 
5945
  Boolean         just_first_delimiter;
 
5946
 
 
5947
  form_data = (QualLoadFormPtr) GetObjectExtra (b_in);
 
5948
  if (form_data == NULL || form_data->table == NULL || form_data->table->data.ptrvalue == NULL) return;
 
5949
  
 
5950
  acd.accepted = FALSE;
 
5951
  acd.cancelled = FALSE;
 
5952
  acd.third_option = FALSE;
 
5953
  
 
5954
  w = ModalWindow(-20, -13, -10, -10, NULL);
 
5955
  h = HiddenGroup (w, -1, 0, NULL);
 
5956
  SetGroupSpacing (h, 10, 10);
 
5957
 
 
5958
  for (i = 0, vnp = form_data->table->data.ptrvalue;
 
5959
       i < form_data->num_columns && vnp != NULL; 
 
5960
       i++, vnp = vnp->next) 
 
5961
  {
 
5962
    label = (CharPtr) MemNew (sizeof (Char) * (StringLen (vnp->data.ptrvalue) + 15));
 
5963
    sprintf (label, "%5d   %s", i + 1, (char *) vnp->data.ptrvalue);
 
5964
    ValNodeAddPointer (&options, i, label);
 
5965
  }
 
5966
 
 
5967
  dlg = ValNodeSelectionDialog (h, options, TALL_SELECTION_LIST, ValNodeStringName,
 
5968
                                              ValNodeSimpleDataFree, ValNodeStringCopy,
 
5969
                                              ValNodeStringMatch, "column", 
 
5970
                                              NULL, NULL, TRUE);
 
5971
  g = HiddenGroup (h, 2, 0, NULL);
 
5972
  SetGroupSpacing (g, 10, 10);
 
5973
  StaticPrompt (g, "Delimiter", 0, popupMenuHeight, programFont, 'l');
 
5974
  delimiter_txt = DialogText (g, ",", 5, NULL);
 
5975
 
 
5976
  just_first_delimiter_btn = CheckBox (h, "Separate only at first delimiter", NULL);
 
5977
 
 
5978
  c = HiddenGroup (h, 3, 0, NULL);
 
5979
  SetGroupSpacing (c, 10, 10);
 
5980
  b = PushButton (c, "Separate", ModalAcceptButton);
 
5981
  SetObjectExtra (b, &acd, NULL);
 
5982
  b = PushButton (c, "Cancel", ModalCancelButton);
 
5983
  SetObjectExtra (b, &acd, NULL);
 
5984
  AlignObjects (ALIGN_CENTER, (HANDLE) dlg, (HANDLE) g, (HANDLE) c, NULL);
 
5985
  
 
5986
  Show(w); 
 
5987
  Select (w);
 
5988
  while (!acd.accepted && ! acd.cancelled)
 
5989
  {
 
5990
    ProcessExternalEvent ();
 
5991
    Update ();
 
5992
    ProcessAnEvent ();
 
5993
    if (acd.accepted)
 
5994
    {
 
5995
      /* combine here */
 
5996
      options = DialogToPointer (dlg);
 
5997
      if (options == NULL) {
 
5998
        Message (MSG_ERROR, "Must choose at least one column!");
 
5999
        acd.accepted = FALSE;
 
6000
      } else {
 
6001
        delimiter = JustSaveStringFromText (delimiter_txt);
 
6002
        if (delimiter == NULL) {
 
6003
          delimiter = StringSave (" ");
 
6004
        }
 
6005
        just_first_delimiter = GetStatus (just_first_delimiter_btn);
 
6006
        for (vnp = options; vnp != NULL; vnp = vnp->next) {
 
6007
          ReparseTabTableSeparateColumnAtDelimiter (form_data->table, *delimiter, vnp->choice, just_first_delimiter);
 
6008
        }
 
6009
        delimiter = MemFree (delimiter);
 
6010
        ReDrawWindowAfterTableReload (form_data);
 
6011
      }
 
6012
      options = ValNodeFree (options);
 
6013
    }
 
6014
  }
 
6015
  Remove (w);
 
6016
}
 
6017
 
 
6018
 
 
6019
static void ShowTableReaderTable (ButtoN b)
 
6020
{
 
6021
  QualLoadFormPtr form_data;
 
6022
  Char            path [PATH_MAX];
 
6023
  FILE           *fp;
 
6024
 
 
6025
  form_data = (QualLoadFormPtr) GetObjectExtra (b);
 
6026
  if (form_data == NULL || form_data->table == NULL) return;
 
6027
 
 
6028
  TmpNam (path);
 
6029
  fp = FileOpen (path, "wb");
 
6030
  if (fp == NULL) {
 
6031
    Message (MSG_ERROR, "Unable to open temporary file %s", path);
 
6032
    return;
 
6033
  }
 
6034
  WriteTabTableToFile (form_data->table, fp);
 
6035
  FileClose (fp);
 
6036
  LaunchGeneralTextViewer (path, "WARNING - Editing in this window will not be reflected in the table reader!");
 
6037
  FileRemove (path);
 
6038
}
 
6039
 
 
6040
 
5537
6041
static WindoW CreateTableReaderWindowWithTable (Uint2 entityID, ValNodePtr table)
5538
6042
{
5539
6043
  ValNodePtr   blank_list;
5540
6044
  ValNodePtr   col_vnp, blank_vnp;
5541
6045
  Int4         index;
5542
6046
  WindoW        w;
5543
 
  GrouP         h, g, g2, g3, c;
 
6047
  GrouP         h, g, g2, g3, g4, c;
5544
6048
  QualLoadFormPtr form_data;
5545
6049
  CharPtr         title;
5546
6050
  Int4            col_for_list = 3;
5594
6098
    }
5595
6099
  }
5596
6100
 
5597
 
  g2 = HiddenGroup (h, 2, 0, NULL);
 
6101
  g2 = HiddenGroup (h, 3, 0, NULL);
5598
6102
  b = PushButton (g2, "Automatch Qualifiers", AutoMatchQuals);
5599
6103
  SetObjectExtra (b, form_data, NULL);
 
6104
  b = PushButton (g2, "Reset Columns", ResetColumns);
 
6105
  SetObjectExtra (b, form_data, NULL);
5600
6106
  form_data->remove_quotes = CheckBox (g2, "Remove quotes around values", NULL);
5601
6107
  SetStatus (form_data->remove_quotes, TRUE);
5602
 
 
5603
 
  g3 = HiddenGroup (h, 7, 0, NULL);
 
6108
  g4 = HiddenGroup (h, 8, 0, NULL);
 
6109
  SetGroupSpacing (g4, 10, 10);
 
6110
  b = PushButton (g4, "View Table (NO EDITING!)", ShowTableReaderTable);
 
6111
  SetObjectExtra (b, form_data, NULL);
 
6112
  g3 = HiddenGroup (h, 8, 0, NULL);
5604
6113
  b = PushButton (g3, "Load New Table", LoadNewTable);
5605
6114
  SetObjectExtra (b, form_data, NULL);
5606
6115
  b = PushButton (g3, "Reload, 1st Space=Tab", ReloadFirstSpace);
5607
6116
  SetObjectExtra (b, form_data, NULL);
5608
6117
  b = PushButton (g3, "Reload, Mult Space=Tab", ReloadMultiSpace);
5609
6118
  SetObjectExtra (b, form_data, NULL);
5610
 
  b = PushButton (g3, "Reload, First Two are File ID", ReloadFileId);
5611
 
  SetObjectExtra (b, form_data, NULL);
5612
 
  b = PushButton (g3, "New BankIt With SeqId", ReloadNewBankitId);
5613
 
  SetObjectExtra (b, form_data, NULL);
5614
 
  b = PushButton (g3, "New BankIt No SeqId", ReloadNewBankitNoId);
 
6119
  b = PushButton (g3, "Reload, Combine First Two for ID", ReloadFileId);
5615
6120
  SetObjectExtra (b, form_data, NULL);
5616
6121
  b = PushButton (g3, "Combine Columns", CombineColumns);
5617
6122
  SetObjectExtra (b, form_data, NULL);
 
6123
  b = PushButton (g3, "Separate Columns", SeparateColumns);
 
6124
  SetObjectExtra (b, form_data, NULL);
5618
6125
 
 
6126
  form_data->err_msg = StaticPrompt (h, "", 200, dialogTextHeight, systemFont, 'c');
5619
6127
  c = HiddenGroup (h, 7, 0, NULL);
5620
6128
  form_data->accept_button = DefaultButton (c, "Accept", DoAcceptQuals);
5621
6129
  SetObjectExtra (form_data->accept_button, form_data, NULL);
5631
6139
                (HANDLE) g, 
5632
6140
                (HANDLE) g2,
5633
6141
                (HANDLE) g3,
 
6142
                (HANDLE) g4,
 
6143
                (HANDLE) form_data->err_msg,
5634
6144
                (HANDLE) c, NULL);
5635
6145
 
5636
6146
  blank_list = ValNodeFree (blank_list);
5668
6178
}
5669
6179
 
5670
6180
 
 
6181
static void NewLoadFeatureQualifierTableEntityID (Uint2 entityID)
 
6182
{
 
6183
  WindoW        w;
 
6184
  QualLoadFormPtr form_data;
 
6185
  TabColumnConfigPtr t;
 
6186
  ValNodePtr         column_list = NULL;
 
6187
 
 
6188
 
 
6189
  w = CreateTableReaderWindow (entityID);
 
6190
 
 
6191
  if (w != NULL) {
 
6192
    /* populate */
 
6193
    form_data = (QualLoadFormPtr) GetObjectExtra (w);
 
6194
    if (form_data != NULL) {
 
6195
      t = TabColumnConfigNew ();
 
6196
      t->match_type = MatchTypeNew ();
 
6197
      t->match_type->match_location = eTableMatchNucID;
 
6198
      if (form_data->list_dlg == NULL) {
 
6199
        PointerToDialog (form_data->column_list[0], t);
 
6200
      } else {
 
6201
        ValNodeAddPointer (&column_list, 0, t);
 
6202
        PointerToDialog (form_data->list_dlg, column_list);
 
6203
        column_list = ValNodeFree (column_list);
 
6204
      }
 
6205
      t = TabColumnConfigFree (t);
 
6206
    } 
 
6207
 
 
6208
    RealizeWindow (w);
 
6209
    Show (w);
 
6210
    Update ();
 
6211
  }
 
6212
}
 
6213
 
 
6214
 
5671
6215
extern void NewLoadFeatureQualifierTable (IteM i)
5672
6216
{
5673
6217
  BaseFormPtr  bfp;
5674
 
  WindoW        w;
5675
 
  QualLoadFormPtr form_data;
5676
 
  TabColumnConfigPtr t;
5677
 
  ValNodePtr         column_list = NULL;
5678
6218
 
5679
6219
#ifdef WIN_MAC
5680
6220
  bfp = currentFormDataPtr;
5682
6222
  bfp = GetObjectExtra (i);
5683
6223
#endif
5684
6224
  if (bfp == NULL) return;
5685
 
 
5686
 
  w = CreateTableReaderWindow (bfp->input_entityID);
5687
 
 
5688
 
  if (w != NULL) {
5689
 
    /* populate */
5690
 
    form_data = (QualLoadFormPtr) GetObjectExtra (w);
5691
 
    if (form_data != NULL) {
5692
 
      t = TabColumnConfigNew ();
5693
 
      t->match_type = MatchTypeNew ();
5694
 
      t->match_type->match_location = eTableMatchNucID;
5695
 
      if (form_data->list_dlg == NULL) {
5696
 
        PointerToDialog (form_data->column_list[0], t);
5697
 
      } else {
5698
 
        ValNodeAddPointer (&column_list, 0, t);
5699
 
        PointerToDialog (form_data->list_dlg, column_list);
5700
 
        column_list = ValNodeFree (column_list);
5701
 
      }
5702
 
      t = TabColumnConfigFree (t);
5703
 
    } 
5704
 
 
5705
 
    RealizeWindow (w);
5706
 
    Show (w);
5707
 
    Update ();
5708
 
  }
 
6225
  NewLoadFeatureQualifierTableEntityID (bfp->input_entityID);
 
6226
}
 
6227
 
 
6228
 
 
6229
extern void NewLoadFeatureQualifierTableToolBtn (ButtoN b)
 
6230
{
 
6231
  BaseFormPtr  bfp;
 
6232
 
 
6233
  bfp = (BaseFormPtr) GetObjectExtra (b);
 
6234
  if (bfp == NULL) return;
 
6235
  NewLoadFeatureQualifierTableEntityID (bfp->input_entityID);
5709
6236
}
5710
6237
 
5711
6238
 
5751
6278
}  
5752
6279
  
5753
6280
 
5754
 
extern void LoadTaxTableReader (IteM i)
 
6281
static void LoadTaxTableReaderBaseForm (BaseFormPtr bfp)
5755
6282
{
5756
 
  BaseFormPtr  bfp;
5757
6283
  WindoW        w;
5758
6284
  QualLoadFormPtr form_data;
5759
6285
  TabColumnConfigPtr t;
5760
6286
  ValNodePtr         column_list = NULL, s;
5761
6287
 
5762
 
#ifdef WIN_MAC
5763
 
  bfp = currentFormDataPtr;
5764
 
#else
5765
 
  bfp = GetObjectExtra (i);
5766
 
#endif
5767
6288
  if (bfp == NULL) return;
5768
6289
 
5769
6290
  w = CreateTableReaderWindow (bfp->input_entityID);
5814
6335
}
5815
6336
 
5816
6337
 
 
6338
extern void LoadTaxTableReader (IteM i)
 
6339
{
 
6340
  ButtonOrMenuItemTemplate (i, LoadTaxTableReaderBaseForm);
 
6341
}
 
6342
 
 
6343
 
 
6344
extern void LoadTaxTableReaderBtn (ButtoN b)
 
6345
{
 
6346
  ButtonOrMenuButtonTemplate (b, LoadTaxTableReaderBaseForm);
 
6347
}
 
6348
 
 
6349
 
5817
6350
extern void NewLoadSourceQualifierTable (IteM i)
5818
6351
{
5819
6352
  BaseFormPtr  bfp;
8801
9334
}
8802
9335
 
8803
9336
 
8804
 
#ifdef OS_MSWIN
8805
 
#include <undefwin.h>
8806
 
#include <windows.h>
8807
 
 
8808
 
NLM_EXTERN Int4 RunSilent(const char *cmdline) {
8809
 
    int status = -1;
8810
 
 
8811
 
    STARTUPINFO         StartupInfo;
8812
 
    PROCESS_INFORMATION ProcessInfo;
8813
 
 
8814
 
    DWORD dwCreateFlags;
8815
 
 
8816
 
#ifndef COMP_METRO
8817
 
    /* code warrior headers do not have this, so comment out to allow compilation */
8818
 
    _flushall();
8819
 
#endif
8820
 
 
8821
 
    /* Set startup info */
8822
 
    memset(&StartupInfo, 0, sizeof(StartupInfo));
8823
 
    StartupInfo.cb          = sizeof(STARTUPINFO);
8824
 
    StartupInfo.dwFlags     = STARTF_USESHOWWINDOW;
8825
 
    StartupInfo.wShowWindow = SW_HIDE;
8826
 
    dwCreateFlags           = CREATE_NEW_CONSOLE;
8827
 
 
8828
 
    /* Run program */
8829
 
    if (CreateProcess(NULL, (LPSTR)cmdline, NULL, NULL, FALSE,
8830
 
                      dwCreateFlags, NULL, NULL, &StartupInfo, &ProcessInfo))
8831
 
    {
8832
 
        /* wait running process */
8833
 
        DWORD exitcode = -1;
8834
 
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
8835
 
        GetExitCodeProcess(ProcessInfo.hProcess, &exitcode);
8836
 
        status = exitcode;
8837
 
        CloseHandle(ProcessInfo.hProcess);
8838
 
        CloseHandle(ProcessInfo.hThread);
8839
 
    }
8840
 
    else
8841
 
    {
8842
 
        DWORD dw = GetLastError();
8843
 
        /* check for common errors first */
8844
 
        if(dw == ERROR_FILE_NOT_FOUND)
8845
 
            Message(MSG_ERROR, "CreateProcess() failed: file not found.");
8846
 
        else
8847
 
            /* generic error message */
8848
 
            Message(MSG_ERROR, "CreateProcess() failed, error code %d.",
8849
 
                    (int)dw);
8850
 
    }
8851
 
 
8852
 
    return status;
8853
 
}
8854
 
#endif
8855
 
 
8856
9337
static void MacroAECRAction (IteM i, Boolean indexer_version, Uint1 action_type, Uint1 qual_type)
8857
9338
{
8858
9339
  BaseFormPtr        bfp;
9025
9506
}
9026
9507
 
9027
9508
 
 
9509
NLM_EXTERN void RemoveAllSourceNoteBaseForm (BaseFormPtr bfp)
 
9510
{
 
9511
  SeqEntryPtr sep;
 
9512
  RemoveActionPtr remove;
 
9513
  AECRActionPtr aecr;
 
9514
  ValNodePtr    aecr_a;
 
9515
  ValNodePtr    macro;
 
9516
  ValNodePtr    src_field;
 
9517
 
 
9518
  if (bfp == NULL) {
 
9519
    return;
 
9520
  }
 
9521
 
 
9522
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
9523
  if (sep == NULL) {
 
9524
    return;
 
9525
  }
 
9526
 
 
9527
  src_field = ValNodeNew (NULL);
 
9528
  src_field->choice = SourceQualChoice_textqual;
 
9529
  src_field->data.intvalue = Source_qual_all_notes;
 
9530
  remove = RemoveActionNew ();
 
9531
  remove->field = ValNodeNew (NULL);
 
9532
  remove->field->choice = FieldType_source_qual;
 
9533
  remove->field->data.ptrvalue = src_field;
 
9534
  aecr_a = ValNodeNew (NULL);
 
9535
  aecr_a->choice = ActionChoice_remove;
 
9536
  aecr_a->data.ptrvalue = remove;
 
9537
  aecr = AECRActionNew ();
 
9538
  aecr->action = aecr_a;
 
9539
  macro = ValNodeNew (NULL);
 
9540
  macro->choice = MacroActionChoice_aecr;
 
9541
  macro->data.ptrvalue = aecr;
 
9542
 
 
9543
  ApplyMacroToSeqEntry (sep, macro);
 
9544
 
 
9545
  macro = MacroActionChoiceFree(macro);
 
9546
}
 
9547
 
 
9548
 
 
9549
NLM_EXTERN void ApplyIsolationSourceBaseForm (BaseFormPtr bfp)
 
9550
{
 
9551
  ForM           f;
 
9552
  ValNodePtr     macro;
 
9553
  ValNodePtr     src_field;
 
9554
  ApplyActionPtr apply;
 
9555
  AECRActionPtr  aecr;
 
9556
  ValNodePtr     aecr_a;
 
9557
  
 
9558
  f = SingleMacroAction (bfp->input_entityID, TRUE);
 
9559
 
 
9560
  src_field = ValNodeNew (NULL);
 
9561
  src_field->choice = SourceQualChoice_textqual;
 
9562
  src_field->data.intvalue = Source_qual_isolation_source;
 
9563
 
 
9564
  apply = ApplyActionNew ();
 
9565
  apply->field = ValNodeNew (NULL);
 
9566
  apply->field->choice = FieldType_source_qual;
 
9567
  apply->field->data.ptrvalue = src_field;
 
9568
 
 
9569
  aecr_a = ValNodeNew (NULL);
 
9570
  aecr_a->choice = ActionChoice_apply;
 
9571
  aecr_a->data.ptrvalue = apply;
 
9572
  aecr = AECRActionNew ();
 
9573
  aecr->action = aecr_a;
 
9574
 
 
9575
  macro = ValNodeNew (NULL);
 
9576
  macro->choice = MacroActionChoice_aecr;
 
9577
  macro->data.ptrvalue = aecr;
 
9578
 
 
9579
  PointerToForm (f, macro);
 
9580
  macro = MacroActionChoiceFree (macro);
 
9581
    
 
9582
  Show (f);
 
9583
  Select (f);
 
9584
  SendMessageToForm (f, VIB_MSG_ENTER);
 
9585
}
 
9586
 
9028
9587
 
9029
9588
typedef struct convertboisourcedbxreftofeaturedbxref {
9030
9589
  FORM_MESSAGE_BLOCK
9193
9752
 
9194
9753
typedef struct structuredcommentsform {
9195
9754
  FORM_MESSAGE_BLOCK
 
9755
  GrouP table_type;
 
9756
  GrouP match_info;
9196
9757
  PopuP match_column;
9197
9758
  DialoG match_type;
9198
 
  TexT   database_name;
 
9759
  DialoG database_name;
9199
9760
 
9200
9761
  ValNodePtr table;
9201
9762
} StructuredCommentsFormData, PNTR StructuredCommentsFormPtr;
9213
9774
}
9214
9775
 
9215
9776
 
9216
 
static CharPtr DbnameFromString (CharPtr string)
9217
 
{
9218
 
  CharPtr tmp;
9219
 
  Int4    len;
9220
 
 
9221
 
  if (StringHasNoText (string)) {
9222
 
    return NULL;
9223
 
  }
9224
 
 
9225
 
  tmp = StringSave (string + StringSpn (string, "##"));
9226
 
  len = StringLen (tmp);
9227
 
  if (len > 2 && StringCmp (tmp + len - 2, "##") == 0) {
9228
 
    tmp[len - 2] = 0;
9229
 
    len -= 2;
9230
 
  }
9231
 
  if (len > 6 && StringCmp (tmp + len - 6, "-START") == 0) {
9232
 
    tmp[len - 6] = 0;
9233
 
    len -= 6;
9234
 
  }
9235
 
  if (len > 6 && StringCmp (tmp + len - 4, "-END") == 0) {
9236
 
    tmp[len - 4] = 0;
9237
 
    len -= 4;
9238
 
  }
9239
 
  if (len > 4 && StringCmp (tmp + len - 4, "Data") == 0) {
9240
 
    tmp[len - 4] = 0;
9241
 
    len -= 4;
9242
 
  }
9243
 
  if (StringCmp (tmp, "HIV-Database") == 0) {
9244
 
    StringCpy (tmp, "HIVDatabase");
9245
 
  }
9246
 
  return tmp;
9247
 
}
9248
 
 
9249
 
 
9250
9777
static UserObjectPtr UserObjectFromRow (ValNodePtr header, ValNodePtr line, Int4 col, CharPtr dbname, ValNodePtr PNTR err_list)
9251
9778
{
9252
9779
  ValNodePtr vnp_h, vnp_l;
9256
9783
  CharPtr    msg;
9257
9784
  UserObjectPtr uop;
9258
9785
  CharPtr       prefix = NULL, suffix = NULL;
9259
 
  CharPtr       prefix_fmt = "##%sData-START##";
9260
 
  CharPtr       suffix_fmt = "##%sData-END##";
 
9786
  CharPtr       prefix_fmt = "##%s-START##";
 
9787
  CharPtr       suffix_fmt = "##%s-END##";
9261
9788
  CharPtr       tmp_dbname = NULL;
9262
9789
  Boolean       prefix_from_row = FALSE;
9263
9790
 
9289
9816
         vnp_h = vnp_h->next, vnp_l = vnp_l->next) {
9290
9817
      if (StringICmp (vnp_h->data.ptrvalue, "StructuredCommentPrefix") == 0
9291
9818
          || StringICmp (vnp_h->data.ptrvalue, "StructuredCommentSuffix") == 0) {
9292
 
        tmp_dbname = DbnameFromString(vnp_l->data.ptrvalue);
 
9819
        tmp_dbname = StructuredCommentDbnameFromString(vnp_l->data.ptrvalue);
9293
9820
        dbname = tmp_dbname;
9294
9821
        prefix_from_row = TRUE;
9295
9822
      }
9296
9823
    }
 
9824
  } else {
 
9825
    /* fix supplied dbname if necessary */
 
9826
    tmp_dbname = StructuredCommentDbnameFromString(dbname);
 
9827
    if (tmp_dbname != NULL) {
 
9828
      dbname = tmp_dbname;
 
9829
    }
9297
9830
  }
9298
9831
 
9299
 
 
9300
9832
  /* build user object */
9301
9833
  vnp_h = header;
9302
9834
  vnp_l = line->data.ptrvalue;
9339
9871
}
9340
9872
 
9341
9873
 
 
9874
static void ChangeStructuredCommentTableType(GrouP g)
 
9875
{
 
9876
  StructuredCommentsFormPtr frm;
 
9877
 
 
9878
  frm = (StructuredCommentsFormPtr)GetObjectExtra (g);
 
9879
  if (frm == NULL) {
 
9880
    return;
 
9881
  }
 
9882
 
 
9883
  if (GetValue (frm->table_type) == 1) {
 
9884
    Enable (frm->match_info);
 
9885
  } else {
 
9886
    Disable (frm->match_info);
 
9887
  }
 
9888
}
 
9889
 
 
9890
 
9342
9891
static void DoParseStructuredComments (ButtoN b)
9343
9892
{
9344
9893
  StructuredCommentsFormPtr frm;
9346
9895
  MatchTypePtr              match_type;
9347
9896
  ValNodePtr                sequence_lists;
9348
9897
  SeqEntryPtr               sep;
9349
 
  ValNodePtr                err_list = NULL, vnp, header, line, s_row, vnp_s;
 
9898
  ValNodePtr                err_list = NULL, vnp, header, line, s_row, vnp_s, tmp_table, vnp_h;
9350
9899
  LogInfoPtr                lip;
9351
9900
  BioseqPtr                 bsp;
9352
9901
  UserObjectPtr             uop, uop_cpy;
9353
9902
  SeqDescrPtr               sdp;
9354
 
  CharPtr                   database_name = NULL;
9355
 
  Int4                      len;
 
9903
  CharPtr                   database_name = NULL, spec_db, file_db;
 
9904
  Boolean                   found_prefix;
9356
9905
 
9357
9906
  frm = (StructuredCommentsFormPtr) GetObjectExtra (b);
9358
9907
  if (frm == NULL) {
9361
9910
 
9362
9911
  sep = GetTopSeqEntryForEntityID (frm->input_entityID);
9363
9912
 
9364
 
  col = GetValue (frm->match_column) - 1;
9365
 
  match_type = DialogToPointer (frm->match_type);
9366
 
  sequence_lists = GetSequenceListsForMatchTypeInTabTable (sep, frm->table->next, col, match_type, &err_list);
9367
 
 
 
9913
  database_name = DialogToPointer (frm->database_name);
 
9914
 
 
9915
  if (GetValue (frm->table_type) == 1) {
 
9916
    col = GetValue (frm->match_column) - 1;
 
9917
    match_type = DialogToPointer (frm->match_type);
 
9918
    sequence_lists = GetSequenceListsForMatchTypeInTabTable (sep, frm->table->next, col, match_type, &err_list);
 
9919
 
 
9920
    if (err_list != NULL) {
 
9921
      lip = OpenLog ("Table Problems");
 
9922
      for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
 
9923
        fprintf (lip->fp, "%s\n", (CharPtr) vnp->data.ptrvalue);
 
9924
      }
 
9925
      lip->data_in_log = TRUE;
 
9926
      CloseLog (lip);
 
9927
      lip = FreeLog (lip);
 
9928
      err_list = ValNodeFreeData (err_list);
 
9929
      if (ANS_YES != Message (MSG_YN, "Continue with table problems")) {
 
9930
        sequence_lists = FreeSequenceLists(sequence_lists);
 
9931
        return;
 
9932
      }
 
9933
    }
 
9934
 
 
9935
    WatchCursor ();
 
9936
    Update();
 
9937
 
 
9938
    header = frm->table->data.ptrvalue;
 
9939
    line = frm->table->next;
 
9940
    s_row = sequence_lists;
 
9941
 
 
9942
 
 
9943
    while (line != NULL && s_row != NULL) {
 
9944
      vnp_s = s_row->data.ptrvalue;
 
9945
      if (vnp_s != NULL) {
 
9946
        uop = UserObjectFromRow (header, line, col, database_name, &err_list);
 
9947
        while (vnp_s != NULL) {
 
9948
          bsp = vnp_s->data.ptrvalue;
 
9949
          uop_cpy = (UserObjectPtr) AsnIoMemCopy (uop, (AsnReadFunc) UserObjectAsnRead, (AsnWriteFunc) UserObjectAsnWrite);
 
9950
          sdp = CreateNewDescriptorOnBioseq (bsp, Seq_descr_user);
 
9951
          sdp->data.ptrvalue = uop_cpy;
 
9952
          vnp_s = vnp_s->next;
 
9953
        }
 
9954
        uop = UserObjectFree (uop);
 
9955
      }
 
9956
      line = line->next;
 
9957
      s_row = s_row->next;
 
9958
    }
 
9959
 
 
9960
 
 
9961
    sequence_lists = FreeSequenceLists(sequence_lists);
 
9962
 
 
9963
  } else {
 
9964
    tmp_table = FlipTabTableAxes (frm->table);
 
9965
    if (!StringHasNoText (database_name)) {
 
9966
      found_prefix = FALSE;
 
9967
      spec_db = StructuredCommentDbnameFromString(database_name);
 
9968
      for (vnp_h = tmp_table->data.ptrvalue, vnp_s = tmp_table->next->data.ptrvalue; 
 
9969
           vnp_h != NULL && vnp_s != NULL; 
 
9970
           vnp_h = vnp_h->next, vnp_s = vnp_s->next) {
 
9971
        if (StringICmp(vnp_h->data.ptrvalue, "StructuredCommentPrefix") == 0
 
9972
            || StringICmp (vnp_h->data.ptrvalue, "StructuredCommentSuffix") == 0) {
 
9973
          file_db = StructuredCommentDbnameFromString(vnp_s->data.ptrvalue);
 
9974
          if (StringCmp (file_db, spec_db) != 0) {
 
9975
            vnp_s->data.ptrvalue = MemFree (vnp_s->data.ptrvalue);
 
9976
            vnp_s->data.ptrvalue = StringSave (spec_db);
 
9977
          }
 
9978
          file_db = MemFree (file_db);
 
9979
          found_prefix = TRUE;
 
9980
        }
 
9981
      }
 
9982
      if (!found_prefix) {
 
9983
        vnp = ValNodeNew (NULL);
 
9984
        vnp->data.ptrvalue = StringSave ("StructuredCommentPrefix");
 
9985
        vnp->next = tmp_table->data.ptrvalue;
 
9986
        tmp_table->data.ptrvalue = vnp;
 
9987
 
 
9988
        vnp = ValNodeNew (NULL);
 
9989
        vnp->data.ptrvalue = StringSave (spec_db);
 
9990
        vnp->next = tmp_table->next->data.ptrvalue;
 
9991
        tmp_table->next->data.ptrvalue = vnp;
 
9992
      }
 
9993
      spec_db = MemFree (spec_db);
 
9994
    }
 
9995
 
 
9996
    CreateStructuredCommentsForAllFromTable(sep, tmp_table->data.ptrvalue, tmp_table->next, &err_list);
 
9997
    tmp_table = FreeTabTable(tmp_table);
 
9998
  }
 
9999
 
 
10000
  /* show errors from creating structured comments */
9368
10001
  if (err_list != NULL) {
9369
 
    lip = OpenLog ("Table Problems");
 
10002
    lip = OpenLog ("Data Problems");
9370
10003
    for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
9371
10004
      fprintf (lip->fp, "%s\n", (CharPtr) vnp->data.ptrvalue);
9372
10005
    }
9374
10007
    CloseLog (lip);
9375
10008
    lip = FreeLog (lip);
9376
10009
    err_list = ValNodeFreeData (err_list);
9377
 
    if (ANS_YES != Message (MSG_YN, "Continue with table problems")) {
9378
 
      sequence_lists = FreeSequenceLists(sequence_lists);
9379
 
      return;
9380
 
    }
9381
 
  }
9382
 
 
9383
 
  WatchCursor ();
9384
 
  Update();
9385
 
 
9386
 
  header = frm->table->data.ptrvalue;
9387
 
  line = frm->table->next;
9388
 
  s_row = sequence_lists;
9389
 
 
9390
 
  if (frm->database_name != NULL) {
9391
 
    database_name = SaveStringFromText (frm->database_name);
9392
 
    len = StringLen (database_name);
9393
 
    if (len >= 4 && StringCmp (database_name + len - 4, "data") == 0) {
9394
 
      database_name[len - 4] = 0;
9395
 
    }
9396
 
  }
9397
 
 
9398
 
  while (line != NULL && s_row != NULL) {
9399
 
    vnp_s = s_row->data.ptrvalue;
9400
 
    if (vnp_s != NULL) {
9401
 
      uop = UserObjectFromRow (header, line, col, database_name, &err_list);
9402
 
      while (vnp_s != NULL) {
9403
 
        bsp = vnp_s->data.ptrvalue;
9404
 
        uop_cpy = (UserObjectPtr) AsnIoMemCopy (uop, (AsnReadFunc) UserObjectAsnRead, (AsnWriteFunc) UserObjectAsnWrite);
9405
 
        sdp = CreateNewDescriptorOnBioseq (bsp, Seq_descr_user);
9406
 
        sdp->data.ptrvalue = uop_cpy;
9407
 
        vnp_s = vnp_s->next;
9408
 
      }
9409
 
      uop = UserObjectFree (uop);
9410
 
    }
9411
 
    line = line->next;
9412
 
    s_row = s_row->next;
9413
10010
  }
9414
10011
 
9415
10012
  database_name = MemFree (database_name);
9416
10013
 
9417
 
  if (err_list != NULL) {
9418
 
    lip = OpenLog ("Data Problems");
9419
 
    for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
9420
 
      fprintf (lip->fp, "%s\n", (CharPtr) vnp->data.ptrvalue);
9421
 
    }
9422
 
    lip->data_in_log = TRUE;
9423
 
    CloseLog (lip);
9424
 
    lip = FreeLog (lip);
9425
 
    err_list = ValNodeFreeData (err_list);
9426
 
  }
9427
 
 
9428
 
  sequence_lists = FreeSequenceLists(sequence_lists);
9429
10014
  ObjMgrSetDirtyFlag (frm->input_entityID, TRUE);
9430
10015
  ObjMgrSendMsg (OM_MSG_UPDATE, frm->input_entityID, 0, 0);
9431
10016
 
9490
10075
 
9491
10076
      h = HiddenGroup (w, -1, 0, NULL);
9492
10077
 
9493
 
      ppt1 = StaticPrompt (h, "Choose column that identifies sequence for structured comment", 0, dialogTextHeight,
 
10078
      frm->table_type = HiddenGroup (h, 0, 2, ChangeStructuredCommentTableType);
 
10079
      SetGroupSpacing (frm->table_type, 10, 10);
 
10080
      SetObjectExtra (frm->table_type, frm, NULL);
 
10081
      RadioButton (frm->table_type, "Table includes accessions for structured comments, one per line");
 
10082
      RadioButton (frm->table_type, "Table is one structured comment, field names across the top");
 
10083
      SetValue (frm->table_type, 1);
 
10084
 
 
10085
      frm->match_info = HiddenGroup (h, -1, 0, NULL);
 
10086
      SetGroupSpacing (frm->match_info, 10, 10);
 
10087
      ppt1 = StaticPrompt (frm->match_info, "Choose column that identifies sequence for structured comment", 0, dialogTextHeight,
9494
10088
                                       programFont, 'l');
9495
 
      frm->match_column = PopupList (h, TRUE, NULL);
 
10089
      frm->match_column = PopupList (frm->match_info, TRUE, NULL);
9496
10090
      vnp = frm->table->data.ptrvalue;
9497
10091
      col = 1;
9498
10092
      while (vnp != NULL) {
9510
10104
      }
9511
10105
      SetValue (frm->match_column, 1);
9512
10106
 
9513
 
      ppt2 = StaticPrompt (h, "Specify relationship of column to sequence", 0, dialogTextHeight,
 
10107
      ppt2 = StaticPrompt (frm->match_info, "Specify relationship of column to sequence", 0, dialogTextHeight,
9514
10108
                                       programFont, 'l');      
9515
 
      frm->match_type = MatchTypeDialog (h, NULL, NULL);
 
10109
      frm->match_type = MatchTypeDialog (frm->match_info, NULL, NULL);
 
10110
      AlignObjects (ALIGN_CENTER, (HANDLE) ppt1,
 
10111
                                  (HANDLE) frm->match_column,
 
10112
                                  (HANDLE) ppt2,
 
10113
                                  (HANDLE) frm->match_type,
 
10114
                                  NULL);
9516
10115
 
9517
10116
      ppt3 = StaticPrompt (h, "Choose database name", 0, dialogTextHeight,
9518
10117
                                  programFont, 'l');
9519
10118
 
9520
 
      frm->database_name = DialogText (h, "", 10, NULL);
 
10119
      frm->database_name = StructuredCommentDatabaseNameDialog (h, NULL, NULL);
9521
10120
 
9522
10121
      c = HiddenGroup (h, 2, 0, NULL);
9523
10122
      b = PushButton (c, "Accept", DoParseStructuredComments);
9524
10123
      SetObjectExtra (b, frm, NULL);
9525
10124
      PushButton (c, "Cancel", StdCancelButtonProc);
9526
 
 
9527
 
      AlignObjects (ALIGN_CENTER, (HANDLE) ppt1,
9528
 
                                  (HANDLE) frm->match_column,
9529
 
                                  (HANDLE) ppt2,
9530
 
                                  (HANDLE) frm->match_type,
 
10125
      AlignObjects (ALIGN_CENTER, (HANDLE) frm->table_type,
 
10126
                                  (HANDLE) frm->match_info,
9531
10127
                                  (HANDLE) ppt3,
9532
10128
                                  (HANDLE) frm->database_name,
9533
10129
                                  (HANDLE) c,
9539
10135
  } 
9540
10136
}
9541
10137
 
9542
 
#if 0
9543
 
static void DoSubmitterParseStructuredComments (ButtoN b)
9544
 
{
9545
 
  StructuredCommentsFormPtr frm;
9546
 
  Int4                      col;
9547
 
  MatchTypeData             match_type;
9548
 
  CharPtr                   database_name = NULL;
9549
 
  ValNodePtr                sequence_lists;
9550
 
  SeqEntryPtr               sep;
9551
 
  ValNodePtr                err_list = NULL, vnp, header, line, s_row, vnp_s;
9552
 
  LogInfoPtr                lip;
9553
 
  BioseqPtr                 bsp;
9554
 
  UserObjectPtr             uop, uop_cpy;
9555
 
  SeqDescrPtr               sdp;
9556
 
 
9557
 
  frm = (StructuredCommentsFormPtr) GetObjectExtra (b);
9558
 
  if (frm == NULL) {
9559
 
    return;
9560
 
  }
9561
 
 
9562
 
  sep = GetTopSeqEntryForEntityID (frm->input_entityID);
9563
 
  col = 0;
9564
 
  match_type.choice = eTableMatchNucID;
9565
 
  match_type.match_location = String_location_equals;
9566
 
  match_type.data = NULL;
9567
 
 
9568
 
  sequence_lists = GetSequenceListsForMatchTypeInTabTable (sep, frm->table->next, col, &match_type, &err_list);
9569
 
 
9570
 
  if (err_list != NULL) {
9571
 
    lip = OpenLog ("Table Problems");
9572
 
    for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
9573
 
      fprintf (lip->fp, "%s\n", (CharPtr) vnp->data.ptrvalue);
9574
 
    }
9575
 
    lip->data_in_log = TRUE;
9576
 
    CloseLog (lip);
9577
 
    lip = FreeLog (lip);
9578
 
    err_list = ValNodeFreeData (err_list);
9579
 
    if (ANS_YES != Message (MSG_YN, "Continue with table problems")) {
9580
 
      sequence_lists = FreeSequenceLists(sequence_lists);
9581
 
      return;
9582
 
    }
9583
 
  }
9584
 
 
9585
 
  WatchCursor ();
9586
 
  Update();
9587
 
 
9588
 
  header = frm->table->data.ptrvalue;
9589
 
  line = frm->table->next;
9590
 
  s_row = sequence_lists;
9591
 
  if (frm->database_name != NULL) {
9592
 
    database_name = SaveStringFromText (frm->database_name);
9593
 
  }
9594
 
 
9595
 
  while (line != NULL && s_row != NULL) {
9596
 
    vnp_s = s_row->data.ptrvalue;
9597
 
    if (vnp_s != NULL) {
9598
 
      uop = UserObjectFromRow (header, line, col, database_name, &err_list);
9599
 
      while (vnp_s != NULL) {
9600
 
        bsp = vnp_s->data.ptrvalue;
9601
 
        uop_cpy = (UserObjectPtr) AsnIoMemCopy (uop, (AsnReadFunc) UserObjectAsnRead, (AsnWriteFunc) UserObjectAsnWrite);
9602
 
        sdp = CreateNewDescriptorOnBioseq (bsp, Seq_descr_user);
9603
 
        sdp->data.ptrvalue = uop_cpy;
9604
 
        vnp_s = vnp_s->next;
9605
 
      }
9606
 
      uop = UserObjectFree (uop);
9607
 
    }
9608
 
    line = line->next;
9609
 
    s_row = s_row->next;
9610
 
  }
9611
 
 
9612
 
  database_name = MemFree (database_name);
9613
 
 
9614
 
  if (err_list != NULL) {
9615
 
    lip = OpenLog ("Data Problems");
9616
 
    for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
9617
 
      fprintf (lip->fp, "%s\n", (CharPtr) vnp->data.ptrvalue);
9618
 
    }
9619
 
    lip->data_in_log = TRUE;
9620
 
    CloseLog (lip);
9621
 
    lip = FreeLog (lip);
9622
 
    err_list = ValNodeFreeData (err_list);
9623
 
  }
9624
 
 
9625
 
  sequence_lists = FreeSequenceLists(sequence_lists);
9626
 
  ObjMgrSetDirtyFlag (frm->input_entityID, TRUE);
9627
 
  ObjMgrSendMsg (OM_MSG_UPDATE, frm->input_entityID, 0, 0);
9628
 
 
9629
 
  Remove (frm->form);
9630
 
  ArrowCursor ();
9631
 
  Update ();
9632
 
  
9633
 
}
9634
 
#endif
 
10138
 
 
10139
static Boolean AnySequencesInList (ValNodePtr list)
 
10140
{
 
10141
  Boolean rval = FALSE;
 
10142
 
 
10143
  while (list != NULL && !rval) {
 
10144
    if (list->data.ptrvalue != NULL) {
 
10145
      rval = TRUE;
 
10146
    }
 
10147
    list = list->next;
 
10148
  }
 
10149
  return rval;
 
10150
}
 
10151
 
 
10152
 
 
10153
static Boolean HeaderHasAtLeastTwoColumns (ValNodePtr header)
 
10154
{
 
10155
  if (header == NULL || header->next == NULL) {
 
10156
    return FALSE;
 
10157
  } else {
 
10158
    return TRUE;
 
10159
  }
 
10160
}
 
10161
 
 
10162
 
 
10163
static Boolean HeaderLooksLikeSeqId (ValNodePtr header)
 
10164
{
 
10165
  if (header == NULL) {
 
10166
    return FALSE;
 
10167
  } else if (StringICmp (header->data.ptrvalue, "accession") == 0
 
10168
    || StringICmp (header->data.ptrvalue, "seqid") == 0) {
 
10169
    return TRUE;
 
10170
  } else {
 
10171
    return FALSE;
 
10172
  }
 
10173
}
 
10174
 
9635
10175
 
9636
10176
NLM_EXTERN void SubmitterCreateStructuredComments (IteM i)
9637
10177
{
9640
10180
  FILE *fp;
9641
10181
  Int4                      col;
9642
10182
  MatchTypeData             match_type;
9643
 
  CharPtr                   database_name = NULL;
9644
10183
  ValNodePtr                sequence_lists;
9645
10184
  SeqEntryPtr               sep;
9646
 
  ValNodePtr                err_list = NULL, vnp, header, line, s_row, vnp_s;
 
10185
  ValNodePtr                err_list = NULL, vnp, header, line, s_row, vnp_s, tmp;
9647
10186
  LogInfoPtr                lip;
9648
10187
  BioseqPtr                 bsp;
9649
10188
  UserObjectPtr             uop, uop_cpy;
9685
10224
 
9686
10225
  sequence_lists = GetSequenceListsForMatchTypeInTabTable (sep, table->next, col, &match_type, &err_list);
9687
10226
 
9688
 
  if (err_list != NULL) {
9689
 
    lip = OpenLog ("Table Problems");
9690
 
    for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
9691
 
      fprintf (lip->fp, "%s\n", (CharPtr) vnp->data.ptrvalue);
9692
 
    }
9693
 
    lip->data_in_log = TRUE;
9694
 
    CloseLog (lip);
9695
 
    lip = FreeLog (lip);
 
10227
  if (err_list != NULL && !AnySequencesInList(sequence_lists) 
 
10228
      && HeaderHasAtLeastTwoColumns(table->data.ptrvalue)
 
10229
      && !HeaderLooksLikeSeqId(table->data.ptrvalue)) {
9696
10230
    err_list = ValNodeFreeData (err_list);
9697
 
    if (ANS_YES != Message (MSG_YN, "Continue with table problems")) {
9698
 
      sequence_lists = FreeSequenceLists(sequence_lists);
9699
 
      return;
9700
 
    }
9701
 
  }
9702
 
 
9703
 
  WatchCursor ();
9704
 
  Update();
9705
 
 
9706
 
  header = table->data.ptrvalue;
9707
 
  line = table->next;
9708
 
  s_row = sequence_lists;
9709
 
 
9710
 
  while (line != NULL && s_row != NULL) {
9711
 
    vnp_s = s_row->data.ptrvalue;
9712
 
    if (vnp_s != NULL) {
9713
 
      uop = UserObjectFromRow (header, line, col, NULL, &err_list);
9714
 
      while (vnp_s != NULL) {
9715
 
        bsp = vnp_s->data.ptrvalue;
9716
 
        uop_cpy = (UserObjectPtr) AsnIoMemCopy (uop, (AsnReadFunc) UserObjectAsnRead, (AsnWriteFunc) UserObjectAsnWrite);
9717
 
        sdp = CreateNewDescriptorOnBioseq (bsp, Seq_descr_user);
9718
 
        sdp->data.ptrvalue = uop_cpy;
9719
 
        vnp_s = vnp_s->next;
9720
 
      }
9721
 
      uop = UserObjectFree (uop);
9722
 
    }
9723
 
    line = line->next;
9724
 
    s_row = s_row->next;
9725
 
  }
9726
 
 
 
10231
    tmp = FlipTabTableAxes (table);
 
10232
    table = FreeTabTable (table);
 
10233
    table = tmp;
 
10234
    CreateStructuredCommentsForAllFromTable(sep, table->data.ptrvalue, table->next, &err_list);
 
10235
  } else {
 
10236
    if (err_list != NULL) {
 
10237
      lip = OpenLog ("Table Problems");
 
10238
      for (vnp = err_list; vnp != NULL; vnp = vnp->next) {
 
10239
        fprintf (lip->fp, "%s\n", (CharPtr) vnp->data.ptrvalue);
 
10240
      }
 
10241
      lip->data_in_log = TRUE;
 
10242
      CloseLog (lip);
 
10243
      lip = FreeLog (lip);
 
10244
      err_list = ValNodeFreeData (err_list);
 
10245
      if (ANS_YES != Message (MSG_YN, "Continue with table problems")) {
 
10246
        sequence_lists = FreeSequenceLists(sequence_lists);
 
10247
        return;
 
10248
      }
 
10249
    }
 
10250
 
 
10251
    WatchCursor ();
 
10252
    Update();
 
10253
 
 
10254
    header = table->data.ptrvalue;
 
10255
    line = table->next;
 
10256
    s_row = sequence_lists;
 
10257
 
 
10258
    while (line != NULL && s_row != NULL) {
 
10259
      vnp_s = s_row->data.ptrvalue;
 
10260
      if (vnp_s != NULL) {
 
10261
        uop = UserObjectFromRow (header, line, col, NULL, &err_list);
 
10262
        while (vnp_s != NULL) {
 
10263
          bsp = vnp_s->data.ptrvalue;
 
10264
          uop_cpy = (UserObjectPtr) AsnIoMemCopy (uop, (AsnReadFunc) UserObjectAsnRead, (AsnWriteFunc) UserObjectAsnWrite);
 
10265
          sdp = CreateNewDescriptorOnBioseq (bsp, Seq_descr_user);
 
10266
          sdp->data.ptrvalue = uop_cpy;
 
10267
          vnp_s = vnp_s->next;
 
10268
        }
 
10269
        uop = UserObjectFree (uop);
 
10270
      }
 
10271
      line = line->next;
 
10272
      s_row = s_row->next;
 
10273
    }
 
10274
  }
9727
10275
 
9728
10276
  if (err_list != NULL) {
9729
10277
    lip = OpenLog ("Data Problems");
10339
10887
  ButtoN source_qualifiers;
10340
10888
  DialoG src_qual_selection;
10341
10889
  GrouP  qual_choice;
 
10890
  ButtoN launch_excel;
10342
10891
} ExportQualifiersFormData, PNTR ExportQualifiersFormPtr;
10343
10892
 
10344
10893
static void DoExportQualifiers (ButtoN b)
10392
10941
    }
10393
10942
    ExportFieldTable (field_type, field_list, GetTopSeqEntryForEntityID (frm->input_entityID), fp);
10394
10943
    FileClose (fp);
 
10944
#ifdef WIN_MSWIN
 
10945
    if (GetStatus (frm->launch_excel)) {
 
10946
      Nlm_MSWin_OpenApplication ("excel.exe", path);
 
10947
    }
 
10948
#endif
 
10949
 
10395
10950
  }
10396
10951
  field_list = FieldTypeListFree (field_list);
10397
10952
  Remove (frm->form);
10487
11042
  RadioButton (frm->qual_choice, "Publication Titles");
10488
11043
  SetValue (frm->qual_choice, 1);
10489
11044
 
 
11045
#ifdef WIN_MSWIN
 
11046
  frm->launch_excel = CheckBox (h, "Launch Excel", NULL);
 
11047
#endif
10490
11048
 
10491
11049
  c = HiddenGroup (h, 2, 0, NULL);
10492
11050
  b = PushButton (c, "Accept", DoExportQualifiers);
10493
11051
  SetObjectExtra (b, frm, NULL);
10494
11052
  PushButton (c, "Cancel", StdCancelButtonProc);
10495
11053
 
10496
 
  AlignObjects (ALIGN_CENTER, (HANDLE) frm->source_qualifiers, (HANDLE) frm->src_qual_selection, (HANDLE) frm->qual_choice, (HANDLE) c, NULL);
 
11054
  AlignObjects (ALIGN_CENTER, (HANDLE) frm->source_qualifiers, 
 
11055
                              (HANDLE) frm->src_qual_selection, 
 
11056
                              (HANDLE) frm->qual_choice, 
 
11057
#ifdef WIN_MSWIN
 
11058
                              (HANDLE) frm->launch_excel,
 
11059
#endif
 
11060
                              (HANDLE) c, 
 
11061
                              NULL);
10497
11062
  Show (w);
10498
11063
}
10499
11064
 
10611
11176
}
10612
11177
 
10613
11178
 
 
11179
extern void FixiPCRPrimerSeqsMenuItem (IteM i)
 
11180
{
 
11181
  BaseFormPtr    bfp;
 
11182
  SeqEntryPtr    sep;
 
11183
 
 
11184
 
 
11185
#ifdef WIN_MAC
 
11186
  bfp = currentFormDataPtr;
 
11187
#else
 
11188
  bfp = GetObjectExtra (i);
 
11189
#endif
 
11190
  if (bfp == NULL) return;
 
11191
 
 
11192
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
11193
 
 
11194
  WatchCursor ();
 
11195
  Update();
 
11196
  VisitBioSourcesInSep (sep, NULL, FixiPCRPrimerSeqsCallback);
 
11197
  ArrowCursor ();
 
11198
  Update ();
 
11199
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
 
11200
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
 
11201
}
 
11202
 
 
11203
 
10614
11204
static void GetContigsInScaffoldsCallback (BioseqPtr bsp, Pointer data)
10615
11205
{
10616
11206
  ValNodePtr PNTR contig_list;
10763
11353
} RemoveContigFromScaffoldFormData, PNTR RemoveContigFromScaffoldFormPtr;
10764
11354
 
10765
11355
 
10766
 
static CharPtr ValNodeSeqIdName (ValNodePtr vnp)
10767
 
{
10768
 
  Char buf[100];
10769
 
  if (vnp == NULL || vnp->data.ptrvalue == NULL)
10770
 
  {
10771
 
    return NULL;
10772
 
  }
10773
 
  else
10774
 
  {
10775
 
    SeqIdWrite (vnp->data.ptrvalue, buf, PRINTID_REPORT, sizeof (buf) - 1);
10776
 
    return StringSave (buf);
10777
 
  }
10778
 
}
10779
 
 
10780
 
 
10781
 
static void ValNodeSeqIdFree (ValNodePtr vnp)
10782
 
{
10783
 
  if (vnp != NULL && vnp->data.ptrvalue != NULL)
10784
 
  {
10785
 
    vnp->data.ptrvalue = SeqIdFree (vnp->data.ptrvalue);
10786
 
  }
10787
 
}
10788
 
 
10789
 
 
10790
 
static ValNodePtr ValNodeSeqIdCopy (ValNodePtr vnp)
10791
 
{
10792
 
  ValNodePtr vnp_copy = NULL;
10793
 
  if (vnp != NULL)
10794
 
  {
10795
 
    ValNodeAddPointer (&vnp_copy, vnp->choice, SeqIdDup (vnp->data.ptrvalue));
10796
 
  }
10797
 
  return vnp_copy;
10798
 
}
10799
 
 
10800
 
 
10801
 
static Boolean ValNodeSeqIdMatch (ValNodePtr vnp1, ValNodePtr vnp2)
10802
 
{
10803
 
  if (vnp1 == NULL || vnp2 == NULL)
10804
 
  {
10805
 
    return FALSE;
10806
 
  }
10807
 
  if (SeqIdComp (vnp1->data.ptrvalue, vnp2->data.ptrvalue) == SIC_YES)
10808
 
  {
10809
 
    return TRUE;
10810
 
  }
10811
 
  else
10812
 
  {
10813
 
    return FALSE;
10814
 
  }
10815
 
}
10816
 
 
10817
 
 
10818
11356
static void DoRemoveContigsFromScaffolds (ButtoN b)
10819
11357
{
10820
11358
  ValNodePtr contig_list, vnp;
11573
12111
}
11574
12112
 
11575
12113
 
 
12114
static Boolean AreAllSequencesInAlignmentAtPosition (SeqAlignPtr salp, Int4 pos)
 
12115
{
 
12116
  Int4 row, num_rows, val;
 
12117
 
 
12118
  if (salp == NULL || pos < 0) {
 
12119
    return FALSE;
 
12120
  }
 
12121
  num_rows = AlnMgr2GetNumRows(salp);
 
12122
  for (row = 1; row <= num_rows; row++) {
 
12123
    val = AlnMgr2MapSeqAlignToBioseq (salp, pos, row);
 
12124
    if (val == -2) {
 
12125
      return FALSE;
 
12126
    }
 
12127
  }
 
12128
  return TRUE;
 
12129
}
 
12130
 
 
12131
 
11576
12132
static void DoTrimSeqsByAln (ButtoN b)
11577
12133
{
11578
12134
  TrimSeqByAlignFormPtr frm;
11587
12143
 
11588
12144
  frm = (TrimSeqByAlignFormPtr) GetObjectExtra (b);
11589
12145
 
11590
 
  lip = OpenLog ("Trimmed Locations");
11591
12146
  if (GetStatus (frm->trim_before_btn)) {
11592
12147
    str = SaveStringFromText (frm->trim_before_coord_txt);
11593
12148
    val_start = atoi (str) - 1;
11594
12149
    str = MemFree (str);
 
12150
    if (!AreAllSequencesInAlignmentAtPosition(frm->salp, val_start)) {
 
12151
      if (Message(MSG_OKC, "Not all sequences are in the alignment at position %d - are you sure you want to continue?", val_start) == ANS_CANCEL) {
 
12152
        return;
 
12153
      }
 
12154
    }
11595
12155
  }
11596
12156
  if (GetStatus (frm->trim_after_btn)) {
11597
12157
    str = SaveStringFromText (frm->trim_after_coord_txt);
11598
12158
    val_stop = atoi (str) - 1;
11599
12159
    str = MemFree (str);
 
12160
    if (!AreAllSequencesInAlignmentAtPosition(frm->salp, val_stop)) {
 
12161
      if (Message(MSG_OKC, "Not all sequences are in the alignment at position %d - are you sure you want to continue?", val_stop) == ANS_CANCEL) {
 
12162
        return;
 
12163
      }
 
12164
    }
11600
12165
  }
 
12166
  lip = OpenLog ("Trimmed Locations");
11601
12167
 
11602
12168
  num_rows = AlnMgr2GetNumRows(frm->salp);
11603
12169
 
11696
12262
  sep = GetTopSeqEntryForEntityID (frm->input_entityID);
11697
12263
  sap = (SeqAnnotPtr) FindSeqAlignInSeqEntry (sep, OBJ_SEQANNOT);
11698
12264
  if (sap != NULL) {
 
12265
    CloseAlignmentEditor (sap->idx.entityID, sap->idx.itemID);
 
12266
 
11699
12267
    sap->idx.deleteme = TRUE;
11700
12268
    DeleteMarkedObjects (frm->input_entityID, 0, NULL);
11701
12269
    fprintf (lip->fp, "Removed Alignment\n");
12295
12863
  if (data == NULL) {
12296
12864
    SetValue (dlg->missing_feat_policy, eFeatureBetweenPolicy_NoFeatPartial);
12297
12865
    MemSet (&vn, 0, sizeof (ValNode));
12298
 
    vn.choice = Feature_type_cds;
 
12866
    vn.choice = Macro_feature_type_cds;
12299
12867
    PointerToDialog (dlg->feat_type_dlg, &vn);
12300
12868
    PointerToDialog (dlg->constraint_dlg, NULL);
12301
12869
  } else {
12416
12984
  if (add == NULL) {
12417
12985
    PointerToDialog (dlg->left_policy_dlg, NULL);
12418
12986
    MemSet (&vn, 0, sizeof (ValNode));
12419
 
    vn.choice = Feature_type_misc_feature;
 
12987
    vn.choice = Macro_feature_type_misc_feature;
12420
12988
    PointerToDialog (dlg->feat_type_add_dlg, &vn);
12421
12989
    PointerToDialog (dlg->details_dlg, NULL);
12422
12990
    PointerToDialog (dlg->right_policy_dlg, NULL);
12725
13293
    return;
12726
13294
  }
12727
13295
 
12728
 
  ccd.change_cap = (Int4) DialogToPointer (dlg->cap_dlg);
 
13296
  ccd.change_cap = GetCapChangeDialogValue (dlg->cap_dlg);
12729
13297
 
12730
13298
  ccd.orgnames = NULL;
12731
13299
  sep = GetTopSeqEntryForEntityID (dlg->input_entityID);
12771
13339
}
12772
13340
 
12773
13341
 
12774
 
NLM_EXTERN void ChangeQualifierCase (IteM i)
 
13342
NLM_EXTERN void ChangeQualifierCaseBaseForm (BaseFormPtr bfp)
12775
13343
{
12776
 
  BaseFormPtr       bfp;
12777
13344
  WindoW            w;
12778
13345
  GrouP             h, c;
12779
13346
  ButtoN            b;
12780
13347
  ChangeQualCaseFormPtr dlg;
 
13348
  ValNode           vn;
12781
13349
 
12782
 
#ifdef WIN_MAC
12783
 
  bfp = currentFormDataPtr;
12784
 
#else
12785
 
  bfp = GetObjectExtra (i);
12786
 
#endif
12787
13350
  if (bfp == NULL || bfp->input_entityID == 0) return;
12788
13351
 
12789
13352
  dlg = (ChangeQualCaseFormPtr) MemNew (sizeof (ChangeQualCaseFormData));
12797
13360
  SetGroupSpacing (h, 10, 10);
12798
13361
 
12799
13362
  dlg->qual_dlg = ParseDstDialog (h, NULL, NULL);
 
13363
  MemSet (&vn, 0, sizeof (ValNode));
 
13364
  vn.choice = ParseDest_org;
 
13365
  PointerToDialog (dlg->qual_dlg, &vn);
12800
13366
  dlg->cap_dlg = CapChangeDialog (h, NULL, NULL);
12801
 
  PointerToDialog (dlg->cap_dlg, (Pointer) 1);
 
13367
  SetCapChangeDialogValue (dlg->cap_dlg, Cap_change_tolower);
12802
13368
 
12803
13369
  c = HiddenGroup (h, 4, 0, NULL);
12804
13370
  b = DefaultButton (c, "Accept", DoChangeQualCase);
12813
13379
  Update ();
12814
13380
}
12815
13381
 
 
13382
NLM_EXTERN void ChangeQualifierCase (IteM i)
 
13383
{
 
13384
  BaseFormPtr       bfp;
 
13385
 
 
13386
#ifdef WIN_MAC
 
13387
  bfp = currentFormDataPtr;
 
13388
#else
 
13389
  bfp = GetObjectExtra (i);
 
13390
#endif
 
13391
  if (bfp == NULL || bfp->input_entityID == 0) return;
 
13392
 
 
13393
  ChangeQualifierCaseBaseForm (bfp);
 
13394
}
 
13395
 
12816
13396
 
12817
13397
typedef struct applymoltypeform {
12818
13398
  FORM_MESSAGE_BLOCK
13103
13683
}
13104
13684
 
13105
13685
 
 
13686
NLM_EXTERN void ApplyAssemblyComment (IteM i)
 
13687
{
 
13688
  ApplyFormattedStructuredComment (i, "Assembly");
 
13689
}
 
13690
 
 
13691
 
13106
13692
typedef struct releasedateform {
13107
13693
  FORM_MESSAGE_BLOCK
13108
13694
 
13717
14303
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);  
13718
14304
  Update ();
13719
14305
}
 
14306
 
 
14307
 
 
14308
 
 
14309
static ValNodePtr BioseqListFromString(CharPtr str, SeqEntryPtr sep)
 
14310
{
 
14311
  ValNodePtr list = NULL;
 
14312
  SeqIdPtr   sip;
 
14313
  BioseqPtr  bsp;
 
14314
  CharPtr    cp;
 
14315
  Int4       len;
 
14316
  Char       ch;
 
14317
  ValNodePtr errors = NULL;
 
14318
 
 
14319
  if (str == NULL) {
 
14320
    return NULL;
 
14321
  }
 
14322
  len = StringSpn (str, " \t\r\n,;");
 
14323
  cp = str + len;
 
14324
 
 
14325
  while (*cp != 0) {
 
14326
    len = StringCSpn (cp, " \t\r\n,;");
 
14327
    ch = *(cp + len);
 
14328
    *(cp + len) = 0;
 
14329
    sip = CreateSeqIdFromText (cp, sep);
 
14330
    if (sip == NULL) {
 
14331
      ValNodeAddPointer (&errors, 0, StringSave (cp));
 
14332
    } else {
 
14333
      bsp = BioseqFind (sip);
 
14334
      if (bsp == NULL) {
 
14335
        ValNodeAddPointer (&errors, 0, StringSave (cp));
 
14336
      } else {
 
14337
        ValNodeAddPointer (&list, OBJ_BIOSEQ, bsp);
 
14338
      }
 
14339
      sip = SeqIdFree (sip);
 
14340
    }
 
14341
    *(cp + len) = ch;
 
14342
    cp += len;
 
14343
    len = StringSpn (cp, " \t\r\n,;");
 
14344
    cp = cp + len;
 
14345
  }
 
14346
  
 
14347
  if (errors != NULL) {
 
14348
    cp = ValNodeMergeStrs (errors);
 
14349
    Message (MSG_ERROR, "Unable to find Bioseqs for the following IDs: %s", cp);
 
14350
    cp = MemFree (cp);
 
14351
    list = ValNodeFree (list);
 
14352
  } else if (list == NULL) {
 
14353
    Message (MSG_ERROR, "No IDs listed!");
 
14354
  }
 
14355
  return list;
 
14356
}
 
14357
 
 
14358
 
 
14359
typedef struct withdrawsequencesfrm {
 
14360
  FORM_MESSAGE_BLOCK
 
14361
 
 
14362
  TexT id_list;
 
14363
  ButtoN leave_dlg_up;
 
14364
} WithdrawSequencesFrmData, PNTR WithdrawSequencesFrmPtr;
 
14365
 
 
14366
static void DoWithdrawSequences (ButtoN b)
 
14367
{
 
14368
  WithdrawSequencesFrmPtr frm;
 
14369
  SeqEntryPtr             sep;
 
14370
  ValNodePtr              list = NULL;
 
14371
  CharPtr                 list_str;
 
14372
  PopSetRetroStatData     stat;
 
14373
 
 
14374
  frm = (WithdrawSequencesFrmPtr) GetObjectExtra (b);
 
14375
  if (frm == NULL) {
 
14376
    return;
 
14377
  }
 
14378
 
 
14379
  sep = GetTopSeqEntryForEntityID (frm->input_entityID);
 
14380
 
 
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) {
 
14386
    return;
 
14387
  }
 
14388
 
 
14389
  /* move listed sequences to wrapper */
 
14390
  MoveSequencesFromSetToWrapper (list, frm->input_entityID);
 
14391
 
 
14392
  /* taxfix/cleanup */
 
14393
  ForceCleanupEntityID (frm->input_entityID);
 
14394
 
 
14395
  /* redo set title */
 
14396
  MemSet ((Pointer) &stat, 0, sizeof (PopSetRetroStatData));
 
14397
  RemovePopsetTitles (sep);
 
14398
  PopSetAutoDefRetro (sep, &stat);
 
14399
 
 
14400
  /* validate */
 
14401
  ValSeqEntryForm (frm->form);
 
14402
 
 
14403
  if (!GetStatus (frm->leave_dlg_up)) {
 
14404
    Remove (frm->form);
 
14405
  }
 
14406
 
 
14407
}
 
14408
 
 
14409
 
 
14410
NLM_EXTERN void WithdrawSequences (IteM i)
 
14411
{
 
14412
  BaseFormPtr  bfp;
 
14413
  WithdrawSequencesFrmPtr frm;
 
14414
  WindoW       w;
 
14415
  GrouP        h, c;
 
14416
  ButtoN       b;
 
14417
  PrompT       ppt;
 
14418
 
 
14419
#ifdef WIN_MAC
 
14420
  bfp = currentFormDataPtr;
 
14421
#else
 
14422
  bfp = GetObjectExtra (i);
 
14423
#endif
 
14424
  if (bfp == NULL) return;
 
14425
 
 
14426
 
 
14427
  frm = MemNew (sizeof (WithdrawSequencesFrmData));
 
14428
  if (frm == NULL) return;
 
14429
  frm->input_entityID = bfp->input_entityID;
 
14430
 
 
14431
  w = FixedWindow (-50, -33, -10, -10, "Withdraw Sequences", StdCloseWindowProc);
 
14432
  SetObjectExtra (w, frm, StdCleanupFormProc);
 
14433
  frm->form = (ForM) w;
 
14434
 
 
14435
  h = HiddenGroup (w, -1, 0, NULL);
 
14436
  SetGroupSpacing (h, 10, 10);
 
14437
 
 
14438
  ppt = StaticPrompt (h, "List of Accessions", 0, popupMenuHeight, programFont, 'l');
 
14439
 
 
14440
  frm->id_list = ScrollText (h, 25, 10, programFont, TRUE, NULL);
 
14441
 
 
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);
 
14447
 
 
14448
  AlignObjects (ALIGN_CENTER, (HANDLE) ppt, (HANDLE) frm->id_list,
 
14449
                (HANDLE) c, NULL);
 
14450
  RealizeWindow (w);
 
14451
  Show (w);
 
14452
  Update ();
 
14453
}
 
14454
 
 
14455
 
 
14456
extern void ParseTaxnameToSourceQual (IteM i)
 
14457
{
 
14458
  BaseFormPtr  bfp;
 
14459
  ForM         f;
 
14460
  ParseSrcOrgPtr org;
 
14461
  ParseActionPtr parse;
 
14462
 
 
14463
#ifdef WIN_MAC
 
14464
  bfp = currentFormDataPtr;
 
14465
#else
 
14466
  bfp = GetObjectExtra (i);
 
14467
#endif
 
14468
  if (bfp == NULL) return;
 
14469
 
 
14470
  f = SingleParseAction (bfp->input_entityID);
 
14471
  if (f != NULL) {
 
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);
 
14486
    Show (f);
 
14487
  }
 
14488
}
 
14489
 
 
14490
 
 
14491
extern void ParseDefLineToSourceQual (IteM i)
 
14492
{
 
14493
  BaseFormPtr  bfp;
 
14494
  ForM         f;
 
14495
  ParseActionPtr parse;
 
14496
 
 
14497
#ifdef WIN_MAC
 
14498
  bfp = currentFormDataPtr;
 
14499
#else
 
14500
  bfp = GetObjectExtra (i);
 
14501
#endif
 
14502
  if (bfp == NULL) return;
 
14503
 
 
14504
  f = SingleParseAction (bfp->input_entityID);
 
14505
  if (f != NULL) {
 
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);
 
14516
    Show (f);
 
14517
  }
 
14518
}
 
14519
 
 
14520
extern void ParseFlatfileToSourceQual (IteM i)
 
14521
{
 
14522
  BaseFormPtr  bfp;
 
14523
  ForM         f;
 
14524
  ParseActionPtr parse;
 
14525
 
 
14526
#ifdef WIN_MAC
 
14527
  bfp = currentFormDataPtr;
 
14528
#else
 
14529
  bfp = GetObjectExtra (i);
 
14530
#endif
 
14531
  if (bfp == NULL) return;
 
14532
 
 
14533
  f = SingleParseAction (bfp->input_entityID);
 
14534
  if (f != NULL) {
 
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);
 
14545
    Show (f);
 
14546
  }
 
14547
}
 
14548
 
 
14549
 
 
14550
extern void ParseLocalIDToSourceQual (ButtoN b)
 
14551
{
 
14552
  BaseFormPtr bfp;
 
14553
  ForM         f;
 
14554
  ParseActionPtr parse;
 
14555
 
 
14556
  bfp = (BaseFormPtr) GetObjectExtra (b);
 
14557
  if (bfp == NULL) return;
 
14558
 
 
14559
  f = SingleParseAction (bfp->input_entityID);
 
14560
  if (f != NULL) {
 
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);
 
14571
    Show (f);
 
14572
  }
 
14573
}
 
14574
 
 
14575
 
 
14576
NLM_EXTERN DialoG SegregateIdDialog (GrouP g)
 
14577
{
 
14578
  DialoG dlg;
 
14579
  StringConstraint   scd;
 
14580
 
 
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);
 
14585
  return dlg;
 
14586
}
 
14587
 
 
14588
 
 
14589
static void ChooseCategoriesByStringConstraint (ValNodePtr value_list, StringConstraintPtr scp, Boolean do_choose)
 
14590
{
 
14591
  ClickableItemPtr cip;
 
14592
 
 
14593
  while (value_list != NULL) {
 
14594
    cip = (ClickableItemPtr) value_list->data.ptrvalue;
 
14595
      if (cip != NULL) {
 
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;
 
14601
      } else {
 
14602
          ChooseCategoriesByStringConstraint (cip->subcategories, scp, do_choose);
 
14603
      }
 
14604
      }
 
14605
      value_list = value_list->next;
 
14606
  }
 
14607
}
 
14608
 
 
14609
 
 
14610
NLM_EXTERN void ChooseCategoriesForSegregateIdDialog(DialoG d, ValNodePtr list)
 
14611
{
 
14612
  StringConstraintPtr scp;
 
14613
 
 
14614
  scp = DialogToPointer (d);
 
14615
  ChooseCategoriesByStringConstraint (list, scp, TRUE);
 
14616
  scp = StringConstraintFree (scp);
 
14617
 
 
14618
}
 
14619
 
 
14620
 
 
14621
NLM_EXTERN DialoG SegregateConstraintDialog (GrouP g)
 
14622
{
 
14623
  DialoG dlg;
 
14624
 
 
14625
  dlg = ComplexConstraintDialog (g, NULL, NULL);
 
14626
  ChangeComplexConstraintFieldType (dlg, FieldType_molinfo_field, NULL, Macro_feature_type_any);
 
14627
  return dlg;
 
14628
}
 
14629
 
 
14630
 
 
14631
static void ChooseCategoriesByConstraint (ValNodePtr value_list, ValNodePtr constraint, Boolean do_choose)
 
14632
{
 
14633
  ClickableItemPtr cip;
 
14634
 
 
14635
  while (value_list != NULL) {
 
14636
    cip = (ClickableItemPtr) value_list->data.ptrvalue;
 
14637
    if (cip != NULL) {
 
14638
      if (cip->item_list != NULL 
 
14639
          && DoesObjectMatchConstraintChoiceSet (cip->item_list->choice, cip->item_list->data.ptrvalue, constraint)) {
 
14640
        cip->chosen = do_choose;
 
14641
      } else {
 
14642
          ChooseCategoriesByConstraint (cip->subcategories, constraint, do_choose);
 
14643
      }
 
14644
    }
 
14645
    value_list = value_list->next;
 
14646
  }
 
14647
}
 
14648
 
 
14649
 
 
14650
NLM_EXTERN void ChooseCategoriesForSegregateConstraintDialog(DialoG d, ValNodePtr list)
 
14651
{
 
14652
  ValNodePtr constraint;
 
14653
 
 
14654
  constraint = DialogToPointer (d);
 
14655
  ChooseCategoriesByConstraint (list, constraint, TRUE);
 
14656
  constraint = ConstraintChoiceSetFree (constraint);
 
14657
}
 
14658
 
 
14659
 
 
14660
NLM_EXTERN void UnchooseCategoriesForSegregateConstraintDialog(DialoG d, ValNodePtr list)
 
14661
{
 
14662
  ValNodePtr constraint;
 
14663
 
 
14664
  constraint = DialogToPointer (d);
 
14665
  ChooseCategoriesByConstraint (list, constraint, FALSE);
 
14666
  constraint = ConstraintChoiceSetFree (constraint);
 
14667
}
 
14668
 
 
14669
 
 
14670
static Boolean DomRNAAndProteinMatch (SeqFeatPtr mrna, ProtRefPtr prp)
 
14671
{
 
14672
  CharPtr mrna_product;
 
14673
  Boolean rval = FALSE;
 
14674
 
 
14675
  if (mrna == NULL || prp == NULL) {
 
14676
    return FALSE;
 
14677
  }
 
14678
  mrna_product = GetRNARefProductString (mrna->data.value.ptrvalue, NULL);
 
14679
  if (StringHasNoText (mrna_product)) {
 
14680
    if (prp->name == NULL || StringHasNoText (prp->name->data.ptrvalue)) {
 
14681
      rval = TRUE;
 
14682
    }
 
14683
  } else {
 
14684
    if (prp->name != NULL && StringCmp (mrna_product, prp->name->data.ptrvalue) == 0) {
 
14685
      rval = TRUE;
 
14686
    }
 
14687
  }
 
14688
  mrna_product = MemFree (mrna_product);
 
14689
  return rval;
 
14690
}
 
14691
 
 
14692
 
 
14693
NLM_EXTERN void BulkCDSSetProtein (Pointer target, Pointer data)
 
14694
{
 
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;
 
14702
 
 
14703
  if ((sfp = (SeqFeatPtr) target) == NULL) return;
 
14704
 
 
14705
  prot_name_list = (ValNodePtr) data;
 
14706
 
 
14707
  xref = sfp->xref;
 
14708
  while (xref != NULL && xref->data.choice != SEQFEAT_PROT) {
 
14709
    xref = xref->next;
 
14710
  }
 
14711
  if (xref != NULL) {
 
14712
    prp = xref->data.value.ptrvalue;
 
14713
  }
 
14714
 
 
14715
  if (prp == NULL) {
 
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);
 
14726
      }
 
14727
      if (prot_feat != NULL) {
 
14728
        prp = (ProtRefPtr) prot_feat->data.value.ptrvalue;
 
14729
      }
 
14730
    }
 
14731
  }
 
14732
 
 
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;
 
14739
    sfp->xref = xref;
 
14740
  }
 
14741
 
 
14742
  mrna = SeqMgrGetOverlappingmRNA (sfp->location, &fcontext);
 
14743
  if (mrna != NULL) {
 
14744
    if (!DomRNAAndProteinMatch(mrna, prp)) {
 
14745
      mrna = NULL;
 
14746
    }
 
14747
  }
 
14748
 
 
14749
  if (prp != NULL) {
 
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));
 
14753
    }
 
14754
    if (mrna != NULL && prot_name_list != NULL) {
 
14755
      SetRNARefProductString (mrna->data.value.ptrvalue, NULL, prot_name_list->data.ptrvalue, ExistingTextOption_replace_old);
 
14756
    }
 
14757
  }
 
14758
 
 
14759
}
 
14760
 
 
14761
 
 
14762
typedef struct stringobjectpair {
 
14763
  CharPtr str;
 
14764
  Uint1   choice;
 
14765
  Pointer data;
 
14766
} StringObjectPairData, PNTR StringObjectPairPtr;
 
14767
 
 
14768
 
 
14769
static StringObjectPairPtr StringObjectPairNew (CharPtr str, Uint1 choice, Pointer data)
 
14770
{
 
14771
  StringObjectPairPtr sop = (StringObjectPairPtr) MemNew (sizeof (StringObjectPairData));
 
14772
  sop->str = str;
 
14773
  sop->choice = choice;
 
14774
  sop->data = data;
 
14775
  return sop;
 
14776
}
 
14777
 
 
14778
 
 
14779
static StringObjectPairPtr StringObjectPairFree (StringObjectPairPtr sop)
 
14780
{
 
14781
  if (sop != NULL) {
 
14782
    sop->str = MemFree (sop->str);
 
14783
    sop = MemFree (sop);
 
14784
  }
 
14785
  return sop;
 
14786
}
 
14787
 
 
14788
 
 
14789
static ValNodePtr StringObjectPairListFree (ValNodePtr list)
 
14790
{
 
14791
  ValNodePtr vnp_next;
 
14792
 
 
14793
  while (list != NULL) {
 
14794
    vnp_next = list->next;
 
14795
    list->next = NULL;
 
14796
    list->data.ptrvalue = StringObjectPairFree (list->data.ptrvalue);
 
14797
    list = ValNodeFree (list);
 
14798
    list = vnp_next;
 
14799
  }
 
14800
  return list;
 
14801
}
 
14802
 
 
14803
 
 
14804
static int LIBCALLBACK SortVnpByStringObjectPair (VoidPtr ptr1, VoidPtr ptr2)
 
14805
 
 
14806
{
 
14807
  StringObjectPairPtr     sop1;
 
14808
  StringObjectPairPtr     sop2;
 
14809
  ValNodePtr  vnp1;
 
14810
  ValNodePtr  vnp2;
 
14811
 
 
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);
 
14820
      }
 
14821
    }
 
14822
  }
 
14823
  return 0;
 
14824
}
 
14825
 
 
14826
 
 
14827
typedef struct uniqstructuredcomment {
 
14828
  StructuredCommentFieldPtr field;
 
14829
  ValNodeBlock pair_list;
 
14830
} UniqStructuredCommentData, PNTR UniqStructuredCommentPtr;
 
14831
 
 
14832
 
 
14833
static void GetUniqueValuesForStructuredCommentFieldCallback (SeqDescrPtr sdp, Pointer data)
 
14834
{
 
14835
  UniqStructuredCommentPtr usc;
 
14836
  UserObjectPtr uop;
 
14837
  CharPtr str;
 
14838
 
 
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) {
 
14844
    return;
 
14845
  }
 
14846
 
 
14847
  str = GetStructuredCommentFieldFromUserObject (uop, usc->field, NULL);
 
14848
  if (str != NULL) {
 
14849
    ValNodeAddPointerToEnd (&(usc->pair_list), 0, StringObjectPairNew(str, OBJ_SEQDESC, sdp));
 
14850
  }
 
14851
}
 
14852
 
 
14853
 
 
14854
NLM_EXTERN ValNodePtr GetUniqueValuesForStructuredCommentField (SeqEntryPtr sep, CharPtr field_name)
 
14855
{
 
14856
  UniqStructuredCommentData usd;
 
14857
  ValNodePtr list, vnp;
 
14858
  ClickableItemPtr last_cip = NULL;
 
14859
  StringObjectPairPtr sop;
 
14860
  ValNodeBlock cip_list;
 
14861
 
 
14862
  usd.field = ValNodeNew (NULL);
 
14863
  usd.field->choice = StructuredCommentField_named;
 
14864
  usd.field->data.ptrvalue = field_name;
 
14865
  InitValNodeBlock(&(usd.pair_list), NULL);
 
14866
 
 
14867
  VisitDescriptorsInSep (sep, &usd, GetUniqueValuesForStructuredCommentFieldCallback);
 
14868
  usd.field = ValNodeFree (usd.field);
 
14869
  list = usd.pair_list.head;
 
14870
  list = ValNodeSort (list, SortVnpByStringObjectPair);
 
14871
 
 
14872
  InitValNodeBlock(&cip_list, NULL);
 
14873
 
 
14874
  for (vnp = list; vnp != NULL; vnp = vnp->next) {
 
14875
    sop = (StringObjectPairPtr) vnp->data.ptrvalue;
 
14876
    if (sop != NULL) {
 
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;
 
14882
        sop->str = NULL;
 
14883
        ValNodeAddPointerToEnd (&(cip_list), 0, last_cip);
 
14884
      }
 
14885
      /* add to category */
 
14886
      ValNodeAddPointer (&(last_cip->item_list), sop->choice, sop->data);        
 
14887
    }
 
14888
  }
 
14889
  list = StringObjectPairListFree(list);
 
14890
 
 
14891
  return cip_list.head;
 
14892
}
 
14893
 
 
14894
 
 
14895
static void GetStructuredCommentFieldNamesCallback (SeqDescrPtr sdp, Pointer data)
 
14896
{
 
14897
  UserObjectPtr uop;
 
14898
  UserFieldPtr  ufp;
 
14899
 
 
14900
  if (sdp != NULL && data != NULL && sdp->choice == Seq_descr_user
 
14901
      && (uop = sdp->data.ptrvalue) != NULL
 
14902
      && IsUserObjectStructuredComment (uop)) {
 
14903
 
 
14904
    ufp = uop->data;
 
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));
 
14910
      }
 
14911
      ufp = ufp->next;
 
14912
    }
 
14913
  }
 
14914
}
 
14915
 
 
14916
 
 
14917
NLM_EXTERN ValNodePtr GetStructuredCommentFieldNames (SeqEntryPtr sep)
 
14918
{
 
14919
  ValNodePtr list = NULL;
 
14920
 
 
14921
  VisitDescriptorsInSep (sep, &list, GetStructuredCommentFieldNamesCallback);
 
14922
  list = ValNodeSort (list, SortVnpByString);
 
14923
  ValNodeUnique (&list, SortVnpByString, ValNodeFreeData);
 
14924
  return list;
 
14925
}
 
14926
 
 
14927
 
 
14928
typedef struct badqual {
 
14929
  Boolean wrong;
 
14930
  Boolean illegal;
 
14931
  Boolean move_to_note;
 
14932
} BadQualData, PNTR BadQualPtr;
 
14933
 
 
14934
static void RemoveBadQualsCommonCallback (SeqFeatPtr sfp, Pointer data)
 
14935
{
 
14936
  BadQualPtr bq;
 
14937
  GBQualPtr  gbqual, gbqual_prev = NULL, gbqual_next;
 
14938
  Int2       index;
 
14939
  Int2       val;
 
14940
  CharPtr    key;
 
14941
  Boolean    do_remove;
 
14942
  CharPtr    note_txt;
 
14943
  CharPtr    note_fmt = "[%s=%s]";
 
14944
  Int4       qvalid;
 
14945
 
 
14946
  if (sfp == NULL || (bq = (BadQualPtr) data) == NULL) {
 
14947
    return;
 
14948
  }
 
14949
  key = GetGBFeatKeyForFeature (sfp);
 
14950
  index = GBFeatKeyNameValid (&key, FALSE);
 
14951
  key = MemFree (key);
 
14952
  if (index < 0) {
 
14953
    return;
 
14954
  }
 
14955
 
 
14956
  for (gbqual = sfp->qual; gbqual != NULL; gbqual = gbqual_next) {
 
14957
    gbqual_next = gbqual->next;
 
14958
    do_remove = FALSE;
 
14959
    qvalid = IsQualValidForFeature(gbqual, sfp);
 
14960
    if (qvalid == 1) {
 
14961
      val = GBQualNameValid (gbqual->qual);
 
14962
      if (bq->illegal && !ShouldBeAGBQual (sfp->idx.subtype, val, FALSE)) {
 
14963
        do_remove = TRUE;
 
14964
      }
 
14965
    } else {
 
14966
      if (bq->illegal && (val = GBQualNameValid (gbqual->qual)) == -1) {
 
14967
        do_remove = TRUE;
 
14968
      } else if (bq->wrong && (qvalid == 0 || qvalid > 1)) {
 
14969
        do_remove = TRUE;
 
14970
      }
 
14971
    }
 
14972
    if (do_remove) {
 
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);
 
14978
      }
 
14979
      if (gbqual_prev == NULL) {
 
14980
        sfp->qual = gbqual_next;
 
14981
      } else {
 
14982
        gbqual_prev->next = gbqual_next;
 
14983
      }
 
14984
      gbqual->next = NULL;
 
14985
      gbqual = GBQualFree (gbqual);
 
14986
    } else {
 
14987
      gbqual_prev = gbqual;
 
14988
    }
 
14989
  }
 
14990
}
 
14991
 
 
14992
 
 
14993
NLM_EXTERN void RemoveBadQualsCommon (Uint2 entityID, Boolean wrong, Boolean illegal, Boolean move_to_note)
 
14994
{
 
14995
  SeqEntryPtr  sep;
 
14996
  BadQualData  bq;
 
14997
 
 
14998
 
 
14999
  sep = GetTopSeqEntryForEntityID (entityID);
 
15000
  if (sep == NULL) {
 
15001
    return;
 
15002
  }
 
15003
 
 
15004
  bq.wrong = wrong;
 
15005
  bq.illegal = illegal;
 
15006
  bq.move_to_note = move_to_note;
 
15007
 
 
15008
  VisitFeaturesInSep (sep, &bq, RemoveBadQualsCommonCallback);
 
15009
 
 
15010
  ObjMgrSetDirtyFlag (entityID, TRUE);
 
15011
  ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
 
15012
  Update();
 
15013
}
 
15014
 
 
15015
 
 
15016
static void RemoveBadQualsCommonItem (IteM i, Boolean wrong, Boolean illegal, Boolean move_to_note)
 
15017
{
 
15018
  BaseFormPtr  bfp;
 
15019
#ifdef WIN_MAC
 
15020
  bfp = currentFormDataPtr;
 
15021
#else
 
15022
  bfp = GetObjectExtra (i);
 
15023
#endif
 
15024
  if (bfp == NULL || bfp->input_entityID == 0) return;
 
15025
 
 
15026
  RemoveBadQualsCommon (bfp->input_entityID, wrong, illegal, move_to_note);
 
15027
}
 
15028
 
 
15029
 
 
15030
NLM_EXTERN void RemoveIllegalQuals (IteM i)
 
15031
{
 
15032
  RemoveBadQualsCommonItem (i, FALSE, TRUE, FALSE);
 
15033
}
 
15034
 
 
15035
 
 
15036
NLM_EXTERN void RemoveWrongQuals (IteM i)
 
15037
{
 
15038
  RemoveBadQualsCommonItem (i, TRUE, FALSE, FALSE);
 
15039
}
 
15040
 
 
15041
 
 
15042
NLM_EXTERN void MoveIllegalQuals (IteM i)
 
15043
{
 
15044
  RemoveBadQualsCommonItem (i, FALSE, TRUE, TRUE);
 
15045
}
 
15046
 
 
15047
 
 
15048
NLM_EXTERN void MoveWrongQuals (IteM i)
 
15049
{
 
15050
  RemoveBadQualsCommonItem (i, TRUE, FALSE, TRUE);
 
15051
}
 
15052
 
 
15053
 
 
15054
static SeqIdPtr GetProteinSeqIdFromBioseq (BioseqPtr bsp)
 
15055
{
 
15056
  SeqIdPtr sip;
 
15057
  DbtagPtr dbtag;
 
15058
 
 
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)) {
 
15063
      return sip;
 
15064
    }
 
15065
  }
 
15066
  return NULL;
 
15067
}
 
15068
 
 
15069
 
 
15070
static void FindProteinIDDBCallback (BioseqPtr bsp, Pointer data)
 
15071
{
 
15072
  CharPtr PNTR pDb;
 
15073
  SeqIdPtr sip;
 
15074
  DbtagPtr dbtag;
 
15075
 
 
15076
  if (bsp == NULL || !ISA_aa(bsp->mol) || (pDb = (CharPtr PNTR)data) == NULL || *pDb != NULL) {
 
15077
    return;
 
15078
  }
 
15079
 
 
15080
  sip = GetProteinSeqIdFromBioseq (bsp);
 
15081
  if (sip != NULL 
 
15082
      && (dbtag = (DbtagPtr) sip->data.ptrvalue) != NULL
 
15083
      && !IsSkippableDbtag(dbtag)) {
 
15084
    *pDb = StringSave (dbtag->db);
 
15085
  }
 
15086
}
 
15087
 
 
15088
 
 
15089
 
 
15090
static void CreateOneProteinId (BioseqPtr bsp, CharPtr db, CharPtr locus_tag)
 
15091
{
 
15092
  SeqIdPtr sip;
 
15093
  DbtagPtr dbtag;
 
15094
  SeqEntryPtr sep;
 
15095
  SeqIdPtr sip_local, sip_last = NULL;
 
15096
 
 
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)) {
 
15101
      return;
 
15102
    }
 
15103
    if (sip->choice == SEQID_LOCAL) {
 
15104
      sip_local = sip;
 
15105
    }
 
15106
    sip_last = sip;
 
15107
  }
 
15108
 
 
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) {
 
15118
      bsp->id = sip;
 
15119
    } else {
 
15120
      sip_last->next = sip;
 
15121
    }
 
15122
    /* replace in bioseq index */
 
15123
    SeqMgrReplaceInBioseqIndex (bsp);
 
15124
  } else {
 
15125
    sep = GetTopSeqEntryForEntityID (bsp->idx.entityID);
 
15126
    ReplaceSeqIdWithSeqId (sip_local, sip, sep);
 
15127
    sip = SeqIdFree (sip);
 
15128
  }
 
15129
}
 
15130
 
 
15131
 
 
15132
static void CreateProteinIDsCallback (BioseqPtr bsp, Pointer data)
 
15133
{
 
15134
  CharPtr db;
 
15135
  SeqIdPtr sip;
 
15136
  DbtagPtr dbtag;
 
15137
  SeqFeatPtr cds, gene = NULL;
 
15138
  GeneRefPtr grp = NULL;
 
15139
  SeqMgrFeatContext context;
 
15140
 
 
15141
  if (bsp == NULL || !ISA_aa(bsp->mol) || (db = (CharPtr)data) == NULL) {
 
15142
    return;
 
15143
  }
 
15144
 
 
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)) {
 
15149
      return;
 
15150
    }
 
15151
  }
 
15152
 
 
15153
  cds = SeqMgrGetCDSgivenProduct (bsp, &context);
 
15154
  if (cds == NULL) {
 
15155
    return;
 
15156
  }
 
15157
  GetGeneInfoForFeature (cds, &grp, &gene);
 
15158
  if (grp != NULL && !StringHasNoText (grp->locus_tag)) {
 
15159
    CreateOneProteinId (bsp, db, grp->locus_tag);
 
15160
  }
 
15161
 
 
15162
}
 
15163
 
 
15164
 
 
15165
typedef struct justtextform {
 
15166
  FORM_MESSAGE_BLOCK
 
15167
  TexT       db_txt;
 
15168
} JustTextFormData, PNTR JustTextFormPtr;
 
15169
 
 
15170
 
 
15171
static void DoCreateProteinIDs (ButtoN b)
 
15172
{
 
15173
  JustTextFormPtr frm;
 
15174
  CharPtr db;
 
15175
  SeqEntryPtr sep;
 
15176
 
 
15177
  frm = (JustTextFormPtr) GetObjectExtra (b);
 
15178
  if (frm == NULL) {
 
15179
    return;
 
15180
  } else if (TextHasNoText (frm->db_txt)) {
 
15181
    Message (MSG_ERROR, "Must provide database tag!");
 
15182
    return;
 
15183
  }
 
15184
 
 
15185
  sep = GetTopSeqEntryForEntityID (frm->input_entityID);
 
15186
 
 
15187
  WatchCursor();
 
15188
  Update();
 
15189
  db = SaveStringFromText (frm->db_txt);
 
15190
  VisitBioseqsInSep (sep, db, CreateProteinIDsCallback);
 
15191
  db = MemFree (db);
 
15192
  ObjMgrSetDirtyFlag (frm->input_entityID, TRUE);
 
15193
  ObjMgrSendMsg (OM_MSG_UPDATE, frm->input_entityID, 0, 0);
 
15194
  Remove (frm->form);
 
15195
  ArrowCursor();
 
15196
  Update();
 
15197
}
 
15198
 
 
15199
 
 
15200
NLM_EXTERN void CreateProteinIDs (IteM i)
 
15201
{
 
15202
  BaseFormPtr  bfp;
 
15203
  SeqEntryPtr  sep;
 
15204
  JustTextFormPtr frm;
 
15205
  WindoW       w;
 
15206
  GrouP        h, g, c;
 
15207
  ButtoN       b;
 
15208
  CharPtr      db = NULL;
 
15209
 
 
15210
#ifdef WIN_MAC
 
15211
  bfp = currentFormDataPtr;
 
15212
#else
 
15213
  bfp = GetObjectExtra (i);
 
15214
#endif
 
15215
  if (bfp == NULL) return;
 
15216
 
 
15217
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
15218
  VisitBioseqsInSep (sep, &db, FindProteinIDDBCallback);
 
15219
 
 
15220
  frm = (JustTextFormPtr) MemNew (sizeof (JustTextFormData));
 
15221
 
 
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;
 
15228
 
 
15229
  g = HiddenGroup (h, 2, 0, NULL);
 
15230
  StaticPrompt (g, "Database", 0, dialogTextHeight, programFont, 'c');
 
15231
  frm->db_txt = DialogText (g, db, 14, NULL);
 
15232
  db = MemFree (db);
 
15233
 
 
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);
 
15239
 
 
15240
  Show (w);
 
15241
 
 
15242
}
 
15243
 
 
15244
 
 
15245
typedef struct existinglocustag {
 
15246
  CharPtr prefix;
 
15247
  Int4    max;
 
15248
  CharPtr id_db;
 
15249
} ExistingLocusTagData, PNTR ExistingLocusTagPtr;
 
15250
 
 
15251
 
 
15252
static Int4 GetLocusTagPrefixLen (CharPtr str)
 
15253
 
 
15254
{
 
15255
  Int4    len;
 
15256
 
 
15257
  if (StringHasNoText (str)) return 0;
 
15258
 
 
15259
  len = StringLen (str) - 1;
 
15260
 
 
15261
  while (len > 0 && isdigit (*(str + len))) {
 
15262
    len--;
 
15263
  }
 
15264
  return len;
 
15265
}
 
15266
 
 
15267
 
 
15268
static void PopulateExistingLocusTag (ExistingLocusTagPtr pLocusTag, CharPtr locus_tag)
 
15269
{
 
15270
  Int4 prefix_len;
 
15271
  Int4 val;
 
15272
 
 
15273
  if (pLocusTag == NULL || StringHasNoText (locus_tag)
 
15274
      || (prefix_len = GetLocusTagPrefixLen(locus_tag)) < 1) {
 
15275
    return;
 
15276
  }
 
15277
 
 
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;
 
15282
  } 
 
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;
 
15287
    }
 
15288
  }
 
15289
}
 
15290
 
 
15291
 
 
15292
static void FindGenePrefix (SeqFeatPtr sfp, Pointer data)
 
15293
{
 
15294
  ExistingLocusTagPtr pLocusTag;
 
15295
  GeneRefPtr grp;
 
15296
 
 
15297
  if (sfp == NULL 
 
15298
      || sfp->data.choice != SEQFEAT_GENE
 
15299
      || (pLocusTag = (ExistingLocusTagPtr)data) == NULL
 
15300
      || (grp = (GeneRefPtr) sfp->data.value.ptrvalue) == NULL) {
 
15301
    return;
 
15302
  }
 
15303
 
 
15304
  PopulateExistingLocusTag (pLocusTag, grp->locus_tag);
 
15305
}
 
15306
 
 
15307
 
 
15308
static void FindGeneLocusTagFromProteinID (BioseqPtr bsp, Pointer data)
 
15309
{
 
15310
  ExistingLocusTagPtr pLocusTag;
 
15311
  SeqIdPtr sip;
 
15312
  DbtagPtr dbtag;
 
15313
 
 
15314
  if (bsp == NULL || !ISA_aa (bsp->mol)
 
15315
      || (pLocusTag = (ExistingLocusTagPtr)data) == NULL) {
 
15316
    return;
 
15317
  }
 
15318
 
 
15319
  sip = GetProteinSeqIdFromBioseq (bsp);
 
15320
  if (sip != NULL 
 
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);
 
15326
    }
 
15327
  }
 
15328
}
 
15329
 
 
15330
 
 
15331
static Boolean FeatureSubtypeWantsLocusTagGene (Int4 featdef)
 
15332
{
 
15333
  if (featdef == FEATDEF_CDS
 
15334
      || featdef == FEATDEF_tRNA
 
15335
      || featdef == FEATDEF_rRNA
 
15336
      || featdef == FEATDEF_tmRNA
 
15337
      || featdef == FEATDEF_ncRNA) {
 
15338
    return TRUE;
 
15339
  } else {
 
15340
    return FALSE;
 
15341
  }
 
15342
}
 
15343
 
 
15344
 
 
15345
static void CreateLocusTagGenesCallback (SeqFeatPtr sfp, Pointer data)
 
15346
{
 
15347
  ExistingLocusTagPtr locus_data;
 
15348
  SeqFeatPtr gene = NULL, mrna;
 
15349
  GeneRefPtr grp = NULL;
 
15350
  Char buf[15];
 
15351
  BioseqPtr bsp, pbsp = NULL;
 
15352
  SeqLocPtr gene_loc;
 
15353
  DbtagPtr  dbtag = NULL;
 
15354
  SeqIdPtr  sip;
 
15355
 
 
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) {
 
15358
    return;
 
15359
  }
 
15360
 
 
15361
  if (sfp->idx.subtype == FEATDEF_CDS) {
 
15362
    pbsp = BioseqFindFromSeqLoc (sfp->product);
 
15363
    sip = GetProteinSeqIdFromBioseq (pbsp);
 
15364
    if (sip != NULL) { 
 
15365
      dbtag = (DbtagPtr) sip->data.ptrvalue;
 
15366
    }
 
15367
  }
 
15368
      
 
15369
  GetGeneInfoForFeature (sfp, &grp, &gene);
 
15370
  if (grp == NULL) {
 
15371
    bsp = BioseqFindFromSeqLoc (sfp->location);
 
15372
    if (bsp != NULL) {
 
15373
      mrna = GetmRNAforCDS(sfp);
 
15374
      if (mrna == NULL) {
 
15375
        gene_loc = SeqLocMerge (bsp, sfp->location, NULL, TRUE, FALSE, FALSE);
 
15376
      } else {
 
15377
        gene_loc = SeqLocMerge (bsp, mrna->location, NULL, TRUE, FALSE, FALSE);
 
15378
      }
 
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;
 
15384
      }
 
15385
    }
 
15386
  }
 
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))
 
15390
    {
 
15391
      grp->locus_tag = StringSave (dbtag->tag->str);
 
15392
    } else {
 
15393
      sprintf (buf, "%04d", locus_data->max + 5);
 
15394
 
 
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;
 
15398
    }
 
15399
    if (pbsp != NULL && !StringHasNoText (locus_data->id_db)) {
 
15400
      CreateOneProteinId (pbsp, locus_data->id_db, grp->locus_tag);
 
15401
    }
 
15402
  }
 
15403
}
 
15404
 
 
15405
 
 
15406
typedef struct locustaggeneform {
 
15407
  FORM_MESSAGE_BLOCK
 
15408
  TexT       prefix_txt;
 
15409
  ButtoN     also_protein_ids;
 
15410
  TexT       db_txt;
 
15411
 
 
15412
  ExistingLocusTagData locus_data;
 
15413
} LocusTagGeneFormData, PNTR LocusTagGeneFormPtr;
 
15414
 
 
15415
 
 
15416
static void CleanupLocusTagGeneForm (
 
15417
  GraphiC g,
 
15418
  VoidPtr data
 
15419
)
 
15420
 
 
15421
{
 
15422
  LocusTagGeneFormPtr frm;
 
15423
 
 
15424
  frm = (LocusTagGeneFormPtr) data;
 
15425
  if (frm != NULL) {
 
15426
    frm->locus_data.prefix = MemFree (frm->locus_data.prefix);
 
15427
    frm->locus_data.id_db = MemFree (frm->locus_data.id_db);
 
15428
  }
 
15429
  StdCleanupFormProc (g, data);
 
15430
}
 
15431
 
 
15432
 
 
15433
static void DoCreateLocusTagGenes (ButtoN b)
 
15434
{
 
15435
  LocusTagGeneFormPtr frm;
 
15436
  SeqEntryPtr sep;
 
15437
 
 
15438
  frm = (LocusTagGeneFormPtr) GetObjectExtra (b);
 
15439
  if (frm == NULL || TextHasNoText (frm->prefix_txt)) {
 
15440
    return;
 
15441
  }
 
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);
 
15447
  }
 
15448
 
 
15449
  sep = GetTopSeqEntryForEntityID (frm->input_entityID);
 
15450
  WatchCursor();
 
15451
  Update();
 
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);
 
15456
  ArrowCursor();
 
15457
  Update();
 
15458
}
 
15459
 
 
15460
 
 
15461
static void AlsoProteinIdsBtn (ButtoN b)
 
15462
{
 
15463
  LocusTagGeneFormPtr frm;
 
15464
 
 
15465
  frm = (LocusTagGeneFormPtr) GetObjectExtra (b);
 
15466
  if (frm == NULL) {
 
15467
    return;
 
15468
  }
 
15469
 
 
15470
  if (GetStatus (frm->also_protein_ids)) {
 
15471
    Enable (frm->db_txt);
 
15472
  } else {
 
15473
    Disable (frm->db_txt);
 
15474
  }
 
15475
}
 
15476
 
 
15477
 
 
15478
NLM_EXTERN void AddLocusTagGenes (IteM i)
 
15479
{
 
15480
  BaseFormPtr         bfp;
 
15481
  SeqEntryPtr         sep;
 
15482
  LocusTagGeneFormPtr frm;
 
15483
  WindoW              w;
 
15484
  GrouP               h, g, g2, c;
 
15485
  ButtoN              b;
 
15486
 
 
15487
#ifdef WIN_MAC
 
15488
  bfp = currentFormDataPtr;
 
15489
#else
 
15490
  bfp = GetObjectExtra (i);
 
15491
#endif
 
15492
  if (bfp == NULL) return;
 
15493
 
 
15494
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
15495
 
 
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);
 
15501
 
 
15502
  w = FixedWindow (-50, -33, -10, -10, "Create locus_tag genes", StdCloseWindowProc);
 
15503
  SetObjectExtra (w, frm, CleanupLocusTagGeneForm);
 
15504
 
 
15505
  h = HiddenGroup (w, -1, 0, NULL);
 
15506
  SetGroupSpacing (h, 10, 10);
 
15507
  frm->form = (ForM) w;
 
15508
  frm->input_entityID = bfp->input_entityID;
 
15509
 
 
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);
 
15513
 
 
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);
 
15519
 
 
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);
 
15525
 
 
15526
  Show (w);
 
15527
 
 
15528
}