5931
static void DoParseTrinomial (BioSourcePtr biop, Pointer userdata)
5934
BinomialOrgNamePtr bonp;
5940
if (biop == NULL) return;
5942
if (orp == NULL) return;
5944
if (onp == NULL) return;
5945
if (onp->choice != 1) return;
5946
bonp = (BinomialOrgNamePtr) onp->data;
5947
if (bonp == NULL) return;
5948
if (StringHasNoText (bonp->subspecies)) return;
5949
for (omp = onp->mod; omp != NULL; omp = omp->next) {
5950
if (omp->subtype == ORGMOD_sub_species) return;
5952
str = bonp->subspecies;
5953
if (StringNICmp (str, "subsp. ", 7) == 0) {
5955
if (StringHasNoText (str)) return;
5958
if (omp == NULL) return;
5959
omp->subtype = ORGMOD_sub_species;
5960
omp->subname = StringSave (str);
5961
omp->next = onp->mod;
5965
extern void ParseTrinomial (IteM i);
5966
extern void ParseTrinomial (IteM i)
5973
bfp = currentFormDataPtr;
5975
bfp = GetObjectExtra (i);
5977
if (bfp == NULL) return;
5978
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
5979
if (sep == NULL) return;
5981
VisitBioSourcesInSep (sep, NULL, DoParseTrinomial);
5983
ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
5984
ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
5988
#define REMOVE_QUAL 1
5989
#define CONVERT_FEAT 2
5990
#define CONVERT_QUAL 3
5994
typedef struct qualformdata {
6008
Boolean stringfound;
6009
Boolean abortconvert;
6012
EnumFieldAssoc PNTR realalist;
6013
EnumFieldAssoc PNTR alist;
6016
} QualFormData, PNTR QualFormPtr;
6018
static void LIBCALLBACK AsnWriteQualifierForDCallBack (AsnExpOptStructPtr pAEOS)
6025
qfp = (QualFormPtr) pAEOS->data;
6026
if (ISA_STRINGTYPE (AsnFindBaseIsa (pAEOS->atp))) {
6027
pchSource = (CharPtr) pAEOS->dvp->ptrvalue;
6028
pchFind = qfp->findStr;
6029
if (StringSearch (pchSource, pchFind) != NULL) {
6030
qfp->stringfound = TRUE;
6035
static Boolean QualifierHasSubstring (ObjMgrTypePtr omtp, AsnIoPtr aip, Pointer ptr, QualFormPtr qfp)
6038
qfp->stringfound = FALSE;
6039
(omtp->asnwrite) (ptr, aip, NULL);
6040
return qfp->stringfound;
6043
static void CommentToNote (SeqFeatPtr sfp)
6048
if (sfp == NULL || sfp->comment == NULL) return;
6049
gbqual = GBQualNew ();
6050
if (gbqual == NULL) return;
6051
gbqual->qual = StringSave ("note");
6052
gbqual->val = sfp->comment;
6053
sfp->comment = NULL;
6054
gbqual->next = sfp->qual;
6058
static void NoteToComment (SeqFeatPtr sfp)
6064
GBQualPtr PNTR prevqual;
6067
if (sfp == NULL) return;
6069
prevqual = (GBQualPtr PNTR) &(sfp->qual);
6070
while (gbqual != NULL) {
6071
nextqual = gbqual->next;
6072
if (StringICmp (gbqual->qual, "note") == 0) {
6073
*(prevqual) = gbqual->next;
6074
gbqual->next = NULL;
6075
if (sfp->comment == NULL) {
6076
sfp->comment = gbqual->val;
6078
len = StringLen (sfp->comment) + StringLen (gbqual->val) + 5;
6079
str = MemNew (sizeof (Char) * len);
6080
StringCpy (str, sfp->comment);
6081
StringCat (str, "; ");
6082
StringCat (str, gbqual->val);
6083
sfp->comment = MemFree (sfp->comment);
6084
gbqual->val = MemFree (gbqual->val);
6088
GBQualFree (gbqual);
6090
prevqual = (GBQualPtr PNTR) &(gbqual->next);
6096
static void EditQualifierString (QualFormPtr qfp, GBQualPtr gbqual, CharPtr foundit)
6106
if (qfp == NULL || gbqual == NULL || foundit == NULL) return;
6107
foundlen = StringLen (qfp->findStr);
6108
replen = StringLen (qfp->replaceStr);
6109
if (replen > foundlen) {
6110
diff = replen - foundlen;
6112
diff = foundlen - replen;
6114
newstring = MemNew (StringLen (gbqual->val) + diff + 1);
6117
while (tmp != foundit) {
6122
if (qfp->replaceStr != NULL) {
6123
tmp2 = MemCopy (tmp2, qfp->replaceStr, replen);
6127
tmp2 = StringMove (tmp2, tmp);
6128
gbqual->val = MemFree (gbqual->val);
6129
gbqual->val = newstring;
6132
#define NUM_SITES 26
6133
static CharPtr siteString [NUM_SITES] = {
6134
"", "active site", "binding site", "cleavage site", "inhibition site", "modified site",
6135
"glycosylation site", "myristoylation site", "mutagenized site", "metal binding site",
6136
"phosphorylation site", "acetylation site", "amidation site", "methylation site",
6137
"hydroxylation site", "sulfatation site", "oxidative deamination site",
6138
"pyrrolidone carboxylic acid site", "gamma carboxyglutamic acid site",
6139
"blocked site", "lipid binding site", "np binding site", "DNA binding site",
6140
"signal peptide", "transit peptide", "transmembrane region"
6143
/*=========================================================================*/
6145
/* SeqLocAdjustByOffset () */
6147
/*=========================================================================*/
6149
extern void SeqLocAdjustByOffset (SeqLocPtr slp,
6154
switch (slp->choice) {
6156
sinp = (SeqIntPtr) slp->data.ptrvalue;
6159
sinp->from += offset;
6166
case SEQLOC_PACKED_PNT :
6167
case SEQLOC_PACKED_INT :
6177
/*=========================================================================*/
6179
/* MoveProteinFeatures () */
6181
/*=========================================================================*/
6183
static void MoveProteinFeatures (SeqFeatPtr destSfp,
6190
while (NULL != srcSfp) {
6192
/* Make a copy of the source feature */
6194
copySfp = SeqFeatCopy (srcSfp);
6195
copySfp->next = NULL;
6197
/* Adjust the location of the source feature */
6199
destSip = SeqLocId (destSfp->location);
6200
SeqLocReplaceLocalID (copySfp->location, destSip);
6201
SeqLocAdjustByOffset (copySfp->location, *offsetPtr);
6203
/* Attach it to the end of the linked */
6204
/* list of destination features. */
6206
if (NULL == destSfp)
6209
while (destSfp->next != NULL)
6210
destSfp = destSfp->next;
6211
destSfp->next = copySfp;
6214
/* Mark the source feature to be deleted */
6216
srcSfp->idx.deleteme = TRUE;
6218
/* Go to the next source feature */
6220
srcSfp = srcSfp->next;
6223
/* Return successfully */
6228
/*=========================================================================*/
6230
/* MoveProteinAnnots () */
6232
/*=========================================================================*/
6234
static void MoveProteinAnnots (BioseqPtr destBsp,
6235
BioseqPtr sourceBsp,
6238
SeqAnnotPtr sourceSap;
6239
SeqAnnotPtr destSap;
6240
SeqAnnotPtr lastDestSap;
6242
SeqFeatPtr sourceSfp;
6244
/* Find end of destination annotation list */
6246
if (NULL == destBsp->annot)
6247
lastDestSap = destBsp->annot;
6249
for (lastDestSap = destBsp->annot;
6250
lastDestSap->next != NULL;
6251
lastDestSap = lastDestSap->next) {
6254
/* For each source SeqAnnot ... */
6256
sourceSap = sourceBsp->annot;
6257
while (NULL != sourceSap) {
6259
/* ... if not feature table then */
6260
/* add to end of dest annots */
6262
if (sourceBsp->annot->type != 1) {
6263
if (NULL == lastDestSap)
6264
lastDestSap = sourceBsp->annot;
6266
lastDestSap->next = sourceBsp->annot;
6267
lastDestSap = lastDestSap->next;
6269
lastDestSap->next = NULL;
6272
/* ... Else if feature table then */
6273
/* if there is a dest feature */
6274
/* table merge them, otherwise */
6275
/* add to end of dest annots */
6279
/* Find a destination feature table to merge with */
6281
destSap = destBsp->annot;
6282
while ((destSap != NULL) && (destSap->type != 1))
6283
destSap = destSap->next;
6285
/* If no destination feature table found */
6286
/* then just add to end of list. */
6288
if (NULL == destSap) {
6289
if (NULL == lastDestSap)
6290
lastDestSap = sourceBsp->annot;
6292
lastDestSap->next = sourceBsp->annot;
6293
lastDestSap = lastDestSap->next;
6295
lastDestSap->next = NULL;
6298
/* Otherwise, move all the features */
6299
/* from the source feature table to */
6300
/* the destination one. */
6303
sourceSfp = (SeqFeatPtr) sourceBsp->annot->data;
6304
destSfp = (SeqFeatPtr) destSap->data;
6305
MoveProteinFeatures (destSfp, sourceSfp, offsetPtr);
6309
sourceSap->idx.deleteme = TRUE;
6310
sourceSap = sourceSap->next;
6316
/*=========================================================================*/
6318
/* ConvertProtsToMatPeptides () */
6320
/*=========================================================================*/
6322
static void ConvertProtsToMatPeptides (BioseqPtr bsp)
6329
/* Make sure that it's a protein Bioseq */
6331
if (! ISA_aa (bsp->mol))
6334
/* Find all the protein features and */
6335
/* convert them to mat_peptides. */
6338
while (NULL != sap) {
6339
if (1 == sap->type) {
6340
sfp = (SeqFeatPtr) sap->data;
6341
while (NULL != sfp) {
6342
if (sfp->data.choice == SEQFEAT_PROT) {
6343
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
6352
/* Add a new full-length protein feature */
6354
prp = ProtRefNew ();
6355
slp = SeqLocIntNew (0, bsp->length-1, 1, bsp->id);
6356
sfp = CreateNewFeatureOnBioseq (bsp, SEQFEAT_PROT, slp);
6357
sfp->data.value.ptrvalue = (Pointer) prp;
6360
/* Return successfully */
6365
static void ConvertFirstMatProteinToPolyProtein (
6367
SeqFeatPtr firstMatCDS
6371
SeqLocPtr firstMatLoc;
6372
BioseqPtr firstMatBsp;
6376
|| firstMatCDS == NULL)
6381
firstMatBsp = BioseqFindFromSeqLoc (firstMatCDS->product);
6382
if (firstMatBsp == NULL) return;
6384
strand = SeqLocStrand (firstMatCDS->location);
6385
firstMatLoc = firstMatCDS->location;
6386
firstMatCDS->location = SeqLocMerge (nucBsp, firstMatLoc, NULL, FALSE, TRUE, FALSE);
6387
expand_seq_loc (0, nucBsp->length - 1, strand, firstMatCDS->location);
6389
SetSeqLocPartial (firstMatCDS->location, TRUE, TRUE);
6390
firstMatCDS->partial = TRUE;
6391
SeqLocFree (firstMatLoc);
6393
firstMatBsp->seq_data = BSFree (firstMatBsp->seq_data);
6394
firstMatBsp->seq_data = ProteinFromCdRegion (firstMatCDS, FALSE);
6395
firstMatBsp->length = BSLen (firstMatBsp->seq_data);
6396
SetSeqFeatProduct (firstMatCDS, firstMatBsp);
6400
/*=========================================================================*/
6402
/* MergeProteinBioseqs () */
6404
/*=========================================================================*/
6406
static Boolean MergeProteinBioseqs (BioseqSetPtr bssp)
6408
BioseqPtr firstProtBsp = NULL;
6415
SeqMgrFeatContext fcontext;
6417
/* Find the nucleotide bioseq */
6420
for (sep = bssp->seq_set; (sep != NULL) && (found != TRUE); sep = sep->next)
6423
if (!IS_Bioseq (sep))
6426
bsp = (BioseqPtr) sep->data.ptrvalue;
6427
if (ISA_na (bsp->mol))
6434
/* Use the the CDS features to loop through the protein Bioseqs */
6436
cdsSfp = SeqMgrGetNextFeature (bsp, NULL, SEQFEAT_CDREGION, 0, &fcontext);
6437
while (NULL != cdsSfp)
6439
protBsp = BioseqFindFromSeqLoc (cdsSfp->product);
6441
/* If it's the first Bioseq then */
6442
/* just save a pointer to it and */
6443
/* get its length to use as an */
6444
/* offset for the next Bioseq. */
6446
if (NULL == firstProtBsp) {
6447
ConvertFirstMatProteinToPolyProtein (bsp, cdsSfp);
6448
protBsp = BioseqFindFromSeqLoc (cdsSfp->product);
6449
firstProtBsp = protBsp;
6450
offset = firstProtBsp->length;
6453
/* Otherwise, move all of its features to */
6454
/* the first prot Bioseq and delete it. */
6458
/* Move all features to 1st protein Bioseq */
6459
offset = fcontext.left / 3;
6461
MoveProteinAnnots (firstProtBsp, protBsp, &offset);
6463
/* Mark for deletion the original Bioseq */
6464
protBsp->idx.deleteme = TRUE;
6465
/* Mark for deletion the CDS */
6466
/* pointing to this Bioseq. */
6467
cdsSfp->idx.deleteme = TRUE;
6471
cdsSfp = SeqMgrGetNextFeature (protBsp, cdsSfp, SEQFEAT_CDREGION,
6475
/* Convert the protein features on the combined */
6476
/* protein bioseq to mat_peptides. */
6478
ConvertProtsToMatPeptides (firstProtBsp);
6480
/* Return successfully */
6485
/*----------------------------------------------------------------------*/
6487
/* MergeCDSForOneSet () */
6489
/*----------------------------------------------------------------------*/
6491
static Boolean LIBCALLBACK MergeCDSForOneSet (BioseqSetPtr bssp)
6493
SeqEntryPtr childSep;
6494
BioseqSetPtr childBssp;
6496
/* Recurse down from the top until */
6497
/* we find a nuc/prot set. */
6499
if (bssp->_class != BioseqseqSet_class_nuc_prot)
6501
childSep = bssp->seq_set;
6503
while (NULL != childSep)
6505
if (IS_Bioseq_set (childSep))
6507
childBssp = (BioseqSetPtr) childSep->data.ptrvalue;
6508
MergeCDSForOneSet (childBssp);
6510
childSep = childSep->next;
6515
/* Combine all of a nucleotide Bioseq's product */
6516
/* protein Bioseqs into one Bioseq. */
6518
MergeProteinBioseqs (bssp);
6520
/* Return successfully */
6525
/*=========================================================================*/
6529
/*=========================================================================*/
6531
extern void MergeCDS (IteM i);
6533
extern void MergeCDS (IteM i)
6539
/* Get the top level BioseqSet */
6542
bfp = currentFormDataPtr;
6544
bfp = GetObjectExtra (i);
6550
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
6557
if (IS_Bioseq (sep))
6560
bssp = (BioseqSetPtr) sep->data.ptrvalue;
6562
/* Loop through all the Nuc-Prot sets */
6564
MergeCDSForOneSet (bssp);
6566
/* Do an update and return successfully */
6568
DeleteMarkedObjects (bfp->input_entityID, 0, NULL);
6569
ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
6570
ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
6577
static void FeatConvertImpToSpecialRNA (SeqFeatPtr sfp,
6584
sfp->data.value.ptrvalue = ImpFeatFree ((ImpFeatPtr) sfp->data.value.ptrvalue);
6585
sfp->data.choice = SEQFEAT_RNA;
6586
sfp->data.value.ptrvalue = (Pointer) rrp;
6587
if (toFeatSubType == FEATDEF_precursor_RNA) {
6595
static void FeatConvertGeneToRNA (SeqFeatPtr sfp,
6602
BioseqPtr productbsp;
6611
FeatDefLabel (sfp, label, sizeof (label), OM_LABEL_CONTENT);
6612
if (fromFeat == SEQFEAT_GENE) {
6613
sfp->data.value.ptrvalue =
6614
GeneRefFree ((GeneRefPtr) sfp->data.value.ptrvalue);
6615
} else if (fromFeat == SEQFEAT_CDREGION) {
6616
if (sfp->product != NULL) {
6617
sip = SeqLocId (sfp->product);
6619
productbsp = BioseqFind (sip);
6620
if (productbsp != NULL) {
6621
ValNodeAddPointer (&(qfp->bsplist), 0, (Pointer) productbsp);
6625
sfp->data.value.ptrvalue =
6626
CdRegionFree ((CdRegionPtr) sfp->data.value.ptrvalue);
6629
sfp->data.choice = SEQFEAT_RNA;
6630
sfp->data.value.ptrvalue = (Pointer) rrp;
6631
switch (toFeatSubType) {
6632
case FEATDEF_preRNA :
6644
case FEATDEF_snRNA :
6647
case FEATDEF_scRNA :
6650
case FEATDEF_snoRNA :
6653
case FEATDEF_otherRNA :
6660
if (toFeatSubType == FEATDEF_tRNA) {
6661
trp = (tRNAPtr) MemNew (sizeof (tRNA));
6662
rrp->ext.choice = 2;
6663
rrp->ext.value.ptrvalue = (Pointer) trp;
6665
trp->aa = ParseTRnaString (label, NULL, NULL, FALSE);
6667
for (j = 0; j < 6; j++) {
6668
trp->codon [j] = 255;
6671
} else if (! StringHasNoText (label)) {
6672
rrp->ext.choice = 1;
6673
rrp->ext.value.ptrvalue = StringSave (label);
6677
static void FeatConvertRegionToImp (SeqFeatPtr sfp,
6679
EnumFieldAssoc PNTR alist)
6681
EnumFieldAssocPtr ap;
6687
ifp = ImpFeatNew ();
6691
str = (CharPtr) sfp->data.value.ptrvalue;
6692
sfp->data.choice = SEQFEAT_IMP;
6693
sfp->data.value.ptrvalue = (Pointer) ifp;
6694
for (i = 1, ap = alist; ap->name != NULL; i++, ap++) {
6695
if (ap->value == toFeatSubType) {
6696
ifp->key = MemFree (ifp->key);
6697
ifp->key = StringSave (ap->name);
6701
if (ifp->key == NULL) {
6702
ifp->key = StringSave ("misc_feature");
6705
if (! StringHasNoText (str)) {
6706
gbqual = GBQualNew ();
6707
if (gbqual != NULL) {
6708
gbqual->qual = StringSave ("note");
6710
gbqual->next = sfp->qual;
6717
static void FeatConvertRegionToRNA (SeqFeatPtr sfp,
6727
str = (CharPtr) sfp->data.value.ptrvalue;
6728
sfp->data.choice = SEQFEAT_RNA;
6729
sfp->data.value.ptrvalue = (Pointer) rrp;
6731
if (toFeatSubType == FEATDEF_precursor_RNA) {
6737
if (! StringHasNoText (str)) {
6738
rrp->ext.choice = 1;
6739
rrp->ext.value.ptrvalue = str;
6744
static void FeatConvertImpToRNA (SeqFeatPtr sfp,
6753
sfp->data.value.ptrvalue =
6754
ImpFeatFree ((ImpFeatPtr) sfp->data.value.ptrvalue);
6755
sfp->data.choice = SEQFEAT_RNA;
6756
sfp->data.value.ptrvalue = (Pointer) rrp;
6758
switch (toFeatSubType) {
6759
case FEATDEF_preRNA :
6771
case FEATDEF_snRNA :
6774
case FEATDEF_scRNA :
6777
case FEATDEF_snoRNA :
6780
case FEATDEF_otherRNA :
6789
static void FeatConvertCommentToMiscFeature (SeqFeatPtr sfp)
6793
if (sfp->data.value.ptrvalue == NULL) {
6794
ifp = ImpFeatNew ();
6796
ifp->key = StringSave ("misc_feature");
6797
sfp->data.choice = SEQFEAT_IMP;
6798
sfp->data.value.ptrvalue = (Pointer) ifp;
6803
static void FeatConvertGeneToMiscFeature (SeqFeatPtr sfp)
6810
ifp = ImpFeatNew ();
6815
grp = (GeneRefPtr) sfp->data.value.ptrvalue;
6817
genelocus = grp->locus;
6821
sfp->data.value.ptrvalue =
6822
GeneRefFree ((GeneRefPtr) sfp->data.value.ptrvalue);
6823
sfp->data.choice = SEQFEAT_IMP;
6824
sfp->data.value.ptrvalue = (Pointer) ifp;
6825
ifp->key = StringSave ("misc_feature");
6827
if (! StringHasNoText (genelocus)) {
6828
gbqual = GBQualNew ();
6829
if (gbqual != NULL) {
6830
gbqual->qual = StringSave ("gene");
6831
gbqual->val = genelocus;
6832
gbqual->next = sfp->qual;
6839
static void FeatConvertRNAToMiscFeature (SeqFeatPtr sfp)
6846
ifp = ImpFeatNew ();
6851
rrp = (RnaRefPtr) sfp->data.value.ptrvalue;
6853
if (rrp->ext.choice == 1) {
6854
rnaname = (CharPtr) rrp->ext.value.ptrvalue;
6855
rrp->ext.value.ptrvalue = NULL;
6859
sfp->data.value.ptrvalue =
6860
RnaRefFree ((RnaRefPtr) sfp->data.value.ptrvalue);
6861
sfp->data.choice = SEQFEAT_IMP;
6862
sfp->data.value.ptrvalue = (Pointer) ifp;
6863
ifp->key = StringSave ("misc_feature");
6865
if (! StringHasNoText (rnaname)) {
6866
gbqual = GBQualNew ();
6867
if (gbqual != NULL) {
6868
gbqual->qual = StringSave ("product");
6869
gbqual->val = rnaname;
6870
gbqual->next = sfp->qual;
6877
static void FeatConvertSiteToMiscFeature (SeqFeatPtr sfp)
6883
ifp = ImpFeatNew ();
6887
sitetype = (Int2) sfp->data.value.intvalue;
6888
sfp->data.choice = SEQFEAT_IMP;
6889
sfp->data.value.ptrvalue = (Pointer) ifp;
6890
ifp->key = StringSave ("misc_feature");
6891
if (sitetype > 0 && sitetype < NUM_SITES) {
6892
gbqual = GBQualNew ();
6893
if (gbqual != NULL) {
6894
gbqual->qual = StringSave ("note");
6895
gbqual->val = StringSave (siteString [sitetype]);
6896
gbqual->next = sfp->qual;
6903
static void FeatConvertPeptideToRegion (SeqFeatPtr sfp)
6909
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
6914
if (vnp != NULL && vnp->next == NULL) {
6915
str = (CharPtr) vnp->data.ptrvalue;
6916
if (! StringHasNoText (str)) {
6917
vnp->data.ptrvalue = NULL;
6918
sfp->data.value.ptrvalue = ProtRefFree (prp);
6919
sfp->data.choice = SEQFEAT_REGION;
6920
sfp->data.value.ptrvalue = (Pointer) str;
6927
static void FeatConvertImpToImp (SeqFeatPtr sfp,
6929
EnumFieldAssoc PNTR alist)
6931
EnumFieldAssocPtr ap;
6935
ifp = (ImpFeatPtr) sfp->data.value.ptrvalue;
6939
for (i = 1, ap = alist; ap->name != NULL; i++, ap++) {
6940
if (ap->value == toFeatSubType) {
6941
ifp->key = MemFree (ifp->key);
6942
ifp->key = StringSave (ap->name);
6948
static void FeatConvertRNAToRNA (SeqFeatPtr sfp,
6953
rrp = (RnaRefPtr) sfp->data.value.ptrvalue;
6957
switch (toFeatSubType) {
6958
case FEATDEF_preRNA :
6970
case FEATDEF_snRNA :
6973
case FEATDEF_scRNA :
6976
case FEATDEF_snoRNA :
6979
case FEATDEF_otherRNA :
6988
static void FeatConvertProtToProt (SeqFeatPtr sfp,
6993
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
6997
switch (toFeatSubType) {
7001
case FEATDEF_preprotein :
7004
case FEATDEF_mat_peptide_aa :
7007
case FEATDEF_sig_peptide_aa :
7010
case FEATDEF_transit_peptide_aa :
7019
/*---------------------------------------------------------------------*/
7021
/* FeatConvertImpToPeptide () - Convert a given import feature to a */
7022
/* protein feature. */
7024
/* Note : Any of the Import feature's gbquals that can be converted */
7025
/* to protein fields are caught in the automatic cleanup */
7026
/* called during reindexing, so they don't need to be */
7027
/* converted here. */
7029
/*---------------------------------------------------------------------*/
7031
static void FeatConvertImpToPeptide (SeqFeatPtr sfp,
7044
/* Get the Import Feature */
7046
ifp = (ImpFeatPtr) sfp->data.value.ptrvalue;
7050
/* Convert the location to a protein location */
7052
cds = FindBestCds (qfp->input_entityID, sfp->location, NULL, NULL);
7056
slp = dnaLoc_to_aaLoc (cds, sfp->location, TRUE, &frame, FALSE);
7060
/* Create a new generic feature */
7062
sip = SeqLocId (cds->product);
7066
bsp = BioseqLockById (sip);
7070
newSfp = CreateNewFeatureOnBioseq (bsp, SEQFEAT_PROT, slp);
7075
/* Make it into a protein feature */
7077
prp = ProtRefNew ();
7078
newSfp->data.value.ptrvalue = (Pointer) prp;
7082
switch (toFeatSubType) {
7083
case FEATDEF_mat_peptide_aa :
7086
case FEATDEF_sig_peptide_aa :
7089
case FEATDEF_transit_peptide_aa :
7094
sfp->idx.subtype = toFeatSubType;
7096
/* Transfer unchanged fields from old feature */
7098
newSfp->partial = sfp->partial;
7099
newSfp->excpt = sfp->excpt;
7100
newSfp->exp_ev = sfp->exp_ev;
7101
newSfp->pseudo = sfp->pseudo;
7102
newSfp->comment = sfp->comment;
7103
newSfp->qual = sfp->qual;
7104
newSfp->title = sfp->title;
7105
newSfp->ext = sfp->ext;
7106
newSfp->cit = sfp->cit;
7107
newSfp->xref = sfp->xref;
7108
newSfp->dbxref = sfp->dbxref;
7109
newSfp->except_text = sfp->except_text;
7111
/* Null out pointers to transferred fields from old feature */
7112
/* so that they don't get deleted when the feature does, */
7114
sfp->comment = NULL;
7121
sfp->except_text = NULL;
7123
/* Mark the old feature for deletion */
7125
sfp->idx.deleteme = TRUE;
7128
/*---------------------------------------------------------------------*/
7130
/* FeatConvertPeptideToImp () - */
7132
/*---------------------------------------------------------------------*/
7134
static void FeatConvertPeptideToImp (SeqFeatPtr sfp,
7147
GBQualPtr topOfGbqList;
7152
/* Make sure that we have a matching peptide feature */
7154
if (sfp->data.choice != SEQFEAT_PROT)
7157
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
7161
switch (qfp->subtype) {
7162
case FEATDEF_mat_peptide_aa :
7163
if (2 != prp->processed)
7166
case FEATDEF_sig_peptide_aa :
7167
if (3 != prp->processed)
7170
case FEATDEF_transit_peptide_aa :
7171
if (4 != prp->processed)
7176
/* Convert the location from the protein */
7177
/* to the nucleotide Bioseq. */
7179
cds = FindBestCds (qfp->input_entityID, NULL, sfp->location, NULL);
7183
slp = aaLoc_to_dnaLoc (cds, sfp->location);
7186
sfp->location = SeqLocFree (sfp->location);
7187
sfp->location = slp;
7189
/* Create a new import feature and */
7190
/* attach it to the feature. */
7192
ifp = ImpFeatNew ();
7196
switch (qfp->subtype) {
7197
case FEATDEF_mat_peptide_aa :
7198
ifp->key = StringSave ("mat_peptide");
7200
case FEATDEF_sig_peptide_aa :
7201
ifp->key = StringSave ("sig_peptide");
7203
case FEATDEF_transit_peptide_aa :
7204
ifp->key = StringSave ("transit_peptide");
7208
sfp->data.choice = SEQFEAT_IMP;
7209
sfp->data.value.ptrvalue = (Pointer) ifp;
7211
/* Store the protein fields as */
7212
/* gbqual qualifier/value pairs */
7217
name = vnp->data.ptrvalue;
7222
gbqual = GBQualNew ();
7225
topOfGbqList = gbqual;
7226
gbqual->qual = StringSave ("product");
7227
gbqual->val = StringSave (name);
7235
ec = (CharPtr) vnp->data.ptrvalue;
7238
gbqual = GBQualNew ();
7241
prevGbq->next = gbqual;
7242
gbqual->qual = StringSave ("EC_number");
7243
gbqual->val = StringSave (ec);
7249
vnp = prp->activity;
7251
activity = (CharPtr) vnp->data.ptrvalue;
7253
if (NULL != activity) {
7254
gbqual = GBQualNew ();
7257
prevGbq->next = gbqual;
7258
gbqual->qual = StringSave ("function");
7259
gbqual->val = StringSave (activity);
7264
for (vnp = prp->db; vnp != NULL; vnp = vnp->next) {
7265
dbt = (DbtagPtr) vnp->data.ptrvalue;
7268
if (! StringHasNoText (dbt->db)) {
7269
gbqual = GBQualNew ();
7272
prevGbq->next = gbqual;
7274
if (oip->str != NULL && (! StringHasNoText (oip->str))) {
7275
sprintf (idStr, "%s:%s", dbt->tag, oip->str);
7276
gbqual->qual = StringSave ("db_xref");
7277
gbqual->val = StringSave (idStr);
7279
sprintf (idStr, "%s:%ld", dbt->tag, (long) oip->id);
7280
gbqual->qual = StringSave ("db_xref");
7281
gbqual->val = StringSave (idStr);
7287
/* Insert the new qualifiers in front of any existing ones */
7289
gbqual->next = sfp->qual;
7290
sfp->qual = topOfGbqList;
7292
/* Free the obsolete Protein reference */
7297
/*---------------------------------------------------------------------*/
7299
/* FeatConvertBioSrcToRepeatRegion () */
7301
/* 9/28/2004: Changed to convert all BioSource features with notes */
7302
/* instead of ones with transposon or insertion_seq qualifiers. */
7303
/*---------------------------------------------------------------------*/
7305
static void FeatConvertBioSrcToRepeatRegion (SeqFeatPtr sfp)
7310
OrgModPtr omp = NULL;
7311
SubSourcePtr ssp = NULL;
7312
CharPtr text_to_use = NULL;
7315
/* Only convert transposon and insertion_seq features */
7317
biop = (BioSourcePtr) sfp->data.value.ptrvalue;
7318
for (ssp = biop->subtype;
7319
ssp != NULL && ssp->subtype != SUBSRC_other;
7323
if (biop->org != NULL && biop->org->orgname != NULL)
7325
for (omp = biop->org->orgname->mod;
7326
omp != NULL && omp->subtype != ORGMOD_other;
7333
/* Create a new Import Feature */
7335
ifp = ImpFeatNew ();
7338
ifp->key = StringSave ("repeat_region");
7340
/* Copy relevant info from the BioSource */
7341
/* feature to the Import feature. */
7345
text_len += StringLen (ssp->name) + 1;
7349
text_len += StringLen (omp->subname) + 1;
7353
text_to_use = (CharPtr) MemNew (text_len * sizeof (Char));
7354
if (text_to_use != NULL)
7356
text_to_use [0] = 0;
7359
StringCat (text_to_use, ssp->name);
7363
if (!StringHasNoText (text_to_use))
7365
StringCat (text_to_use, ";");
7367
StringCat (text_to_use, omp->subname);
7369
gbqual = GBQualNew ();
7372
gbqual->qual = StringSave ("note");
7373
gbqual->val = text_to_use;
7374
gbqual->next = sfp->qual;
7380
/* Delete the old BioSource feature */
7382
sfp->data.value.ptrvalue = BioSourceFree (biop);
7384
/* Attach the new Import feature in its place */
7386
sfp->data.choice = SEQFEAT_IMP;
7387
sfp->data.value.ptrvalue = ifp;
7390
/*-------------------------------------------------------------------------*/
7392
/* FeatConvert () -- Convert a given feature from one type to another. */
7394
/*-------------------------------------------------------------------------*/
7396
static Boolean FeatConvert (QualFormPtr qfp,
7403
fromFeat = FindFeatFromFeatDefType (qfp->subtype);
7404
toFeat = FindFeatFromFeatDefType (toFeatSubType);
7406
if (fromFeat == SEQFEAT_IMP &&
7407
toFeat == SEQFEAT_PROT)
7408
FeatConvertImpToPeptide (sfp, toFeatSubType, qfp);
7409
else if (fromFeat == SEQFEAT_PROT &&
7410
toFeat == SEQFEAT_IMP &&
7411
qfp->subtype == FEATDEF_mat_peptide_aa)
7412
FeatConvertPeptideToImp (sfp, qfp);
7413
else if (fromFeat == SEQFEAT_PROT &&
7414
toFeat == SEQFEAT_IMP &&
7415
qfp->subtype == FEATDEF_sig_peptide_aa)
7416
FeatConvertPeptideToImp (sfp, qfp);
7417
else if (fromFeat == SEQFEAT_PROT &&
7418
toFeat == SEQFEAT_IMP &&
7419
qfp->subtype == FEATDEF_transit_peptide_aa)
7420
FeatConvertPeptideToImp (sfp, qfp);
7421
else if (fromFeat == SEQFEAT_IMP &&
7422
(toFeatSubType == FEATDEF_misc_RNA ||
7423
toFeatSubType == FEATDEF_precursor_RNA))
7424
FeatConvertImpToSpecialRNA (sfp, toFeatSubType);
7425
else if ((fromFeat == SEQFEAT_GENE ||
7426
fromFeat == SEQFEAT_CDREGION) &&
7427
toFeat == SEQFEAT_RNA)
7428
FeatConvertGeneToRNA (sfp, toFeatSubType, fromFeat, qfp);
7429
else if (fromFeat == SEQFEAT_REGION &&
7430
toFeat == SEQFEAT_IMP)
7431
FeatConvertRegionToImp (sfp, toFeatSubType, qfp->alist);
7432
else if (fromFeat == SEQFEAT_REGION &&
7433
(toFeatSubType == FEATDEF_misc_RNA ||
7434
toFeatSubType == FEATDEF_precursor_RNA))
7435
FeatConvertRegionToRNA (sfp, toFeatSubType);
7436
else if (fromFeat == SEQFEAT_IMP &&
7437
toFeat == SEQFEAT_RNA)
7438
FeatConvertImpToRNA (sfp, toFeatSubType);
7439
else if (fromFeat == SEQFEAT_COMMENT &&
7440
toFeatSubType == FEATDEF_misc_feature)
7441
FeatConvertCommentToMiscFeature (sfp);
7442
else if (fromFeat == SEQFEAT_GENE &&
7443
toFeatSubType == FEATDEF_misc_feature)
7444
FeatConvertGeneToMiscFeature (sfp);
7445
else if (fromFeat == SEQFEAT_RNA &&
7446
toFeatSubType == FEATDEF_misc_feature)
7447
FeatConvertRNAToMiscFeature (sfp);
7448
else if (fromFeat == SEQFEAT_SITE &&
7449
toFeatSubType == FEATDEF_misc_feature)
7450
FeatConvertSiteToMiscFeature (sfp);
7451
else if (fromFeat == SEQFEAT_PROT &&
7452
(qfp->subtype == FEATDEF_mat_peptide_aa ||
7453
qfp->subtype == FEATDEF_sig_peptide_aa ||
7454
qfp->subtype == FEATDEF_transit_peptide_aa) &&
7455
toFeat == SEQFEAT_REGION)
7456
FeatConvertPeptideToRegion (sfp);
7457
else if (fromFeat == SEQFEAT_BIOSRC &&
7458
toFeat == SEQFEAT_IMP &&
7459
toFeatSubType == FEATDEF_repeat_region)
7460
FeatConvertBioSrcToRepeatRegion (sfp);
7461
else if (fromFeat != toFeat)
7464
Message (MSG_OK, "This conversion not supported - contact"
7465
" sequindev for instructions.");
7466
qfp->abortconvert = TRUE;
7469
else if (fromFeat == SEQFEAT_IMP)
7470
FeatConvertImpToImp (sfp, toFeatSubType, qfp->alist);
7471
else if (fromFeat == SEQFEAT_RNA)
7472
FeatConvertRNAToRNA (sfp, toFeatSubType);
7473
else if (fromFeat == SEQFEAT_PROT)
7474
FeatConvertProtToProt (sfp, toFeatSubType);
7479
static GbFeatName AddQualifierList[] = {
7480
{"allele", Class_text}, {"anticodon", Class_pos_aa},
7481
{"bound_moiety", Class_text},
7482
{"chromosome", Class_text},
7483
{"citation", Class_bracket_int},
7484
{"codon", Class_seq_aa},
7485
{"codon_start", Class_int_or}, {"cons_splice", Class_site},
7486
{"db_xref", Class_text},
7487
{"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
7488
{"evidence", Class_exper}, {"exception", Class_text},
7489
{"frequency", Class_text}, {"function", Class_text},
7490
{"gene", Class_text}, {"gdb_xref", Class_text},
7491
{"insertion_seq", Class_text},
7492
{"label", Class_token},
7493
{"map", Class_text},
7494
{"mod_base", Class_token}, {"note", Class_note},
7495
{"number", Class_number}, {"organism", Class_text},
7496
{"partial", Class_none}, {"PCR_conditions", Class_text},
7497
{"phenotype", Class_text},
7498
{"plasmid", Class_text}, {"product", Class_text},
7499
{"pseudo", Class_none},
7500
{"rearranged", Class_none}, { "replace", Class_text},
7501
{"rpt_family", Class_text}, {"rpt_type", Class_rpt},
7502
{"rpt_unit", Class_token},
7503
{"sequenced_mol", Class_text},
7504
{"standard_name", Class_text},
7505
{"translation", Class_text}, {"transl_except", Class_pos_aa},
7506
{"transl_table", Class_int}, {"transposon", Class_text},
7507
{"usedin", Class_token},
7508
{"focus", Class_none},
7509
{"protein_id", Class_text},
7510
{"organelle", Class_text}, {"transcript_id", Class_text},
7511
{"transgenic", Class_none}, {"environmental_sample", Class_none},
7512
{"locus_tag", Class_text}, {"mol_type", Class_text},
7515
const Int4 NumAddQualifiers = sizeof (AddQualifierList) / sizeof (GbFeatName);
7517
static Int2 AddQualifierNameValid (CharPtr qual)
7521
for (i = 0; i < NumAddQualifiers && qual != NULL; i++) {
7522
if (StringCmp(qual, AddQualifierList[i].name) == 0)
7530
static void QualAdd (QualFormPtr qfp,
7532
Int2 fromFeatSubType)
7536
if (fromFeatSubType - 1 > NumAddQualifiers || fromFeatSubType < 1) return;
7537
if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "partial") == 0)
7539
sfp->partial = FALSE;
7541
else if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
7546
gbqual = GBQualNew ();
7547
if (gbqual != NULL) {
7549
StringSave (AddQualifierList[fromFeatSubType - 1].name);
7550
gbqual->val = StringSave (qfp->findStr);
7551
gbqual->next = sfp->qual;
7553
if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "note") == 0)
7554
NoteToComment (sfp);
7559
static GbFeatName RemoveQualifierList[] = {
7560
{"allele", Class_text}, {"anticodon", Class_pos_aa},
7561
{"bound_moiety", Class_text}, {"citation", Class_bracket_int},
7562
{"codon", Class_seq_aa}, {"codon_start", Class_int_or},
7563
{"cons_splice", Class_site}, {"db_xref", Class_text},
7564
{"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
7565
{"evidence", Class_exper}, {"exception", Class_text},
7566
{"frequency", Class_text}, {"function", Class_text},
7567
{"gene", Class_text}, {"gdb_xref", Class_text},
7568
{"insertion_seq", Class_text}, {"label", Class_token},
7569
{"map", Class_text}, {"mod_base", Class_token},
7570
{"note", Class_note}, {"number", Class_number}, {"organism", Class_text},
7571
{"partial", Class_none}, {"PCR_conditions", Class_text},
7572
{"phenotype", Class_text}, {"plasmid", Class_text},
7573
{"product", Class_text}, {"pseudo", Class_none},
7574
{"rearranged", Class_none}, { "replace", Class_text},
7575
{"rpt_family", Class_text}, {"rpt_type", Class_rpt},
7576
{ "rpt_unit", Class_token}, {"sequenced_mol", Class_text},
7577
{"standard_name", Class_text}, {"translation", Class_text},
7578
{"transl_except", Class_pos_aa}, {"transl_table", Class_int},
7579
{"transposon", Class_text}, {"usedin", Class_token},
7580
{"focus", Class_none}, {"protein_id", Class_text},
7581
{"organelle", Class_text}, {"transcript_id", Class_text},
7582
{"transgenic", Class_none}, {"environmental_sample", Class_none},
7583
{"locus_tag", Class_text}, {"mol_type", Class_text},
7586
const Int4 NumRemoveQualifiers = sizeof (RemoveQualifierList) / sizeof (GbFeatName);
7588
static Int2 RemoveQualifierNameValid (CharPtr qual)
7592
for (i = 0; i < NumRemoveQualifiers && qual != NULL; i++) {
7593
if (StringCmp(qual, RemoveQualifierList[i].name) == 0)
7601
static GbFeatName ConvertQualifierList[] = {
7602
{"allele", Class_text}, {"anticodon", Class_pos_aa},
7603
{"bound_moiety", Class_text},
7604
{"chromosome", Class_text},
7605
{"citation", Class_bracket_int},
7606
{"codon", Class_seq_aa},
7607
{"codon_start", Class_int_or}, {"cons_splice", Class_site},
7608
{"db_xref", Class_text},
7609
{"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
7610
{"evidence", Class_exper}, {"exception", Class_text},
7611
{"frequency", Class_text}, {"function", Class_text},
7612
{"gene", Class_text}, {"gdb_xref", Class_text},
7613
{"insertion_seq", Class_text},
7614
{"label", Class_token},
7615
{"map", Class_text},
7616
{"mod_base", Class_token}, {"note", Class_note},
7617
{"number", Class_number}, {"organism", Class_text},
7618
{"partial", Class_none}, {"PCR_conditions", Class_text},
7619
{"phenotype", Class_text},
7620
{"plasmid", Class_text}, {"product", Class_text},
7621
{"pseudo", Class_none},
7622
{"rearranged", Class_none}, { "replace", Class_text},
7623
{"rpt_family", Class_text}, {"rpt_type", Class_rpt},
7624
{ "rpt_unit", Class_token},
7625
{"sequenced_mol", Class_text},
7626
{"standard_name", Class_text},
7627
{"translation", Class_text}, {"transl_except", Class_pos_aa},
7628
{"transl_table", Class_int}, {"transposon", Class_text},
7629
{"usedin", Class_token},
7630
{"focus", Class_none},
7631
{"protein_id", Class_text},
7632
{"organelle", Class_text}, {"transcript_id", Class_text},
7633
{"transgenic", Class_none}, {"environmental_sample", Class_none},
7634
{"locus_tag", Class_text}, {"mol_type", Class_text},
7635
{"segment", Class_text}
7638
const Int4 NumConvertQualifiers = sizeof (ConvertQualifierList) / sizeof (GbFeatName);
7640
static Int2 ConvertQualifierNameValid (CharPtr qual)
7644
for (i = 0; i < NumConvertQualifiers && qual != NULL; i++) {
7645
if (StringCmp(qual, ConvertQualifierList[i].name) == 0)
7653
static GbFeatName EditQualifierList[] = {
7654
{"allele", Class_text}, {"anticodon", Class_pos_aa},
7655
{"bound_moiety", Class_text},
7656
{"chromosome", Class_text},
7657
{"citation", Class_bracket_int},
7658
{"codon", Class_seq_aa},
7659
{"codon_start", Class_int_or}, {"cons_splice", Class_site},
7660
{"db_xref", Class_text},
7661
{"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
7662
{"evidence", Class_exper}, {"exception", Class_text},
7663
{"frequency", Class_text}, {"function", Class_text},
7664
{"gene", Class_text}, {"gdb_xref", Class_text},
7665
{"insertion_seq", Class_text},
7666
{"label", Class_token},
7667
{"map", Class_text},
7668
{"mod_base", Class_token}, {"note", Class_note},
7669
{"number", Class_number}, {"organism", Class_text},
7670
{"partial", Class_none}, {"PCR_conditions", Class_text},
7671
{"phenotype", Class_text},
7672
{"plasmid", Class_text}, {"product", Class_text},
7673
{"pseudo", Class_none},
7674
{"rearranged", Class_none}, { "replace", Class_text},
7675
{"rpt_family", Class_text}, {"rpt_type", Class_rpt},
7676
{ "rpt_unit", Class_token},
7677
{"sequenced_mol", Class_text},
7678
{"standard_name", Class_text},
7679
{"translation", Class_text}, {"transl_except", Class_pos_aa},
7680
{"transl_table", Class_int}, {"transposon", Class_text},
7681
{"usedin", Class_token},
7682
{"focus", Class_none},
7683
{"protein_id", Class_text},
7684
{"organelle", Class_text}, {"transcript_id", Class_text},
7685
{"transgenic", Class_none}, {"environmental_sample", Class_none},
7686
{"locus_tag", Class_text}, {"mol_type", Class_text},
7687
{"segment", Class_text}
7690
const Int4 NumEditQualifiers = sizeof (EditQualifierList) / sizeof (GbFeatName);
7692
static Int2 EditQualifierNameValid (CharPtr qual)
7696
for (i = 0; i < NumEditQualifiers && qual != NULL; i++) {
7697
if (StringCmp(qual, EditQualifierList[i].name) == 0)
7705
static void QualConvertEditRemove (QualFormPtr qfp,
7707
Int2 fromFeatSubType,
7713
GBQualPtr PNTR prevqual;
7716
if (qfp->type == REMOVE_QUAL)
7718
if ( fromFeatSubType < NumRemoveQualifiers
7719
&& StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "note") == 0)
7720
CommentToNote (sfp);
7722
else if (qfp->type == ADD_QUAL)
7724
if (fromFeatSubType < NumAddQualifiers
7725
&& StringCmp (AddQualifierList[fromFeatSubType -1].name, "note") == 0)
7726
CommentToNote (sfp);
7728
else if (qfp->type == CONVERT_QUAL)
7730
if (fromFeatSubType < NumConvertQualifiers
7731
&& StringCmp (ConvertQualifierList[fromFeatSubType -1].name, "note") == 0)
7732
CommentToNote (sfp);
7734
else if (qfp->type == EDIT_QUAL)
7736
if (fromFeatSubType < NumEditQualifiers
7737
&& StringCmp (EditQualifierList[fromFeatSubType - 1].name, "note") == 0)
7738
CommentToNote (sfp);
7742
if (fromFeatSubType - 1 == GBQUAL_note ||
7743
toFeatSubType - 1 == GBQUAL_note)
7744
CommentToNote (sfp);
7747
if (qfp->type != CONVERT_QUAL) {
7748
if (qfp->type == REMOVE_QUAL)
7750
if (fromFeatSubType < NumRemoveQualifiers)
7752
if (StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "partial") == 0)
7753
sfp->partial = FALSE;
7754
else if (StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
7758
else if (qfp->type == ADD_QUAL)
7760
if (fromFeatSubType < NumAddQualifiers)
7762
if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "partial") == 0)
7763
sfp->partial = FALSE;
7764
else if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
7768
else if (qfp->type == EDIT_QUAL)
7770
if (fromFeatSubType < NumEditQualifiers)
7772
if (StringCmp (EditQualifierList[fromFeatSubType - 1].name, "partial") == 0)
7773
sfp->partial = FALSE;
7774
else if (StringCmp (EditQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
7780
if (fromFeatSubType - 1 == GBQUAL_partial)
7781
sfp->partial = FALSE;
7782
else if (fromFeatSubType - 1 == GBQUAL_evidence)
7788
prevqual = (GBQualPtr PNTR) &(sfp->qual);
7790
while (gbqual != NULL) {
7791
nextqual = gbqual->next;
7792
if (qfp->type == REMOVE_QUAL)
7793
qual = RemoveQualifierNameValid (gbqual->qual);
7794
else if (qfp->type == ADD_QUAL)
7795
qual = AddQualifierNameValid (gbqual->qual);
7796
else if (qfp->type == CONVERT_QUAL)
7797
qual = ConvertQualifierNameValid (gbqual->qual);
7798
else if (qfp->type == EDIT_QUAL)
7799
qual = EditQualifierNameValid (gbqual->qual);
7801
qual = GBQualNameValid (gbqual->qual);
7802
if (qual > -1 && qual == fromFeatSubType - 1) {
7803
if (qfp->type == CONVERT_QUAL) {
7804
gbqual->qual = MemFree (gbqual->qual);
7805
gbqual->qual = StringSave (ConvertQualifierList [toFeatSubType - 1].name);
7806
prevqual = (GBQualPtr PNTR) &(gbqual->next);
7807
} else if (qfp->type == EDIT_QUAL) {
7808
foundit = StringStr (gbqual->val, qfp->findStr);
7809
if (foundit != NULL) {
7810
EditQualifierString (qfp, gbqual, foundit);
7812
prevqual = (GBQualPtr PNTR) &(gbqual->next);
7814
*(prevqual) = gbqual->next;
7815
gbqual->next = NULL;
7816
GBQualFree (gbqual);
7819
prevqual = (GBQualPtr PNTR) &(gbqual->next);
7824
if (qfp->type == REMOVE_QUAL)
7826
if ( fromFeatSubType < NumRemoveQualifiers
7827
&& StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "note") == 0)
7828
NoteToComment (sfp);
7830
else if (qfp->type == ADD_QUAL)
7832
if ( fromFeatSubType < NumAddQualifiers
7833
&& StringCmp (AddQualifierList[fromFeatSubType - 1].name, "note") == 0)
7834
NoteToComment (sfp);
7836
else if (qfp->type == CONVERT_QUAL)
7838
if ( fromFeatSubType < NumConvertQualifiers
7839
&& StringCmp (ConvertQualifierList[fromFeatSubType - 1].name, "note") == 0)
7840
NoteToComment (sfp);
7842
else if (qfp->type == EDIT_QUAL)
7844
if ( fromFeatSubType < NumEditQualifiers
7845
&& StringCmp (EditQualifierList[fromFeatSubType - 1].name, "note") == 0)
7846
NoteToComment (sfp);
7850
if (fromFeatSubType - 1 == GBQUAL_note ||
7851
toFeatSubType - 1 == GBQUAL_note) {
7852
NoteToComment (sfp);
7857
static void CommonQualifierCallback (SeqEntryPtr sep, Pointer mydata, Int4 index, Int2 indent)
7867
SeqAnnotPtr nextsap;
7877
if (mydata == NULL) return;
7878
if (sep == NULL || sep->data.ptrvalue == NULL) return;
7879
qfp = (QualFormPtr) mydata;
7880
if (qfp == NULL) return;
7881
if (qfp->abortconvert) return;
7883
if (omtp == NULL || omtp->subtypefunc == NULL) return;
7884
if (IS_Bioseq (sep)) {
7885
bsp = (BioseqPtr) sep->data.ptrvalue;
7887
} else if (IS_Bioseq_set (sep)) {
7888
bssp = (BioseqSetPtr) sep->data.ptrvalue;
7893
switch (qfp->type) {
7895
val = GetValue (qfp->fromquallist);
7896
if (val == 0) return;
7899
if (GetEnumPopup ((PopuP) qfp->tofeatlist, qfp->alist, &enumval)) {
7900
newval = (Int2) enumval;
7902
if (newval == 0) return;
7905
val = GetValue (qfp->fromquallist);
7906
if (val == 0) return;
7907
newval = GetValue (qfp->toquallist);
7908
if (newval == 0) return;
7911
val = GetValue (qfp->fromquallist);
7912
if (val == 0) return;
7915
val = GetValue (qfp->fromquallist);
7916
if (val == 0) return;
7921
qfp->findStr = JustSaveStringFromText (qfp->findthis);
7922
notext = StringHasNoText (qfp->findStr);
7923
qfp->replaceStr = JustSaveStringFromText (qfp->replacewith);
7924
if (qfp->type == EDIT_QUAL && notext) return;
7925
if (qfp->type == ADD_QUAL && notext) return;
7926
aip = AsnIoNullOpen ();
7927
aeop = AsnExpOptNew (aip, NULL, NULL, AsnWriteQualifierForDCallBack);
7929
aeop->user_data = (Pointer) qfp;
7933
nextsap = sap->next;
7936
sfp = (SeqFeatPtr) sap->data;
7939
nextsfp = sfp->next;
7940
subtype = (*(omtp->subtypefunc)) ((Pointer) sfp);
7941
lookfor = qfp->subtype;
7943
if ((SEQFEAT_IMP == sfp->data.choice) &&
7944
((subtype == FEATDEF_mat_peptide ||
7945
subtype == FEATDEF_sig_peptide ||
7946
subtype == FEATDEF_transit_peptide)))
7951
if (qfp->type != CONVERT_FEAT)
7953
if (qfp->subtype == 0)
7957
if (subtype == lookfor)
7959
if (qfp->type == ADD_QUAL)
7961
QualAdd (qfp, sfp, val);
7963
else if (notext || QualifierHasSubstring (omtp, aip,
7964
(Pointer) sfp, qfp))
7966
if (qfp->type == CONVERT_FEAT)
7968
if (FeatConvert (qfp, sfp, newval) == FALSE)
7975
QualConvertEditRemove (qfp, sfp, val, newval);
7978
if (qfp->type == REMOVE_QUAL
7979
&& val < NumRemoveQualifiers
7980
&& StringCmp (RemoveQualifierList[val - 1].name, "citation") == 0)
7982
sfp->cit = PubSetFree (sfp->cit);
7993
static void DoProcessQualifier (ButtoN b)
8007
/* Check for valid conditions */
8009
qfp = (QualFormPtr) GetObjectExtra (b);
8010
if (qfp == NULL) return;
8011
sep = GetTopSeqEntryForEntityID (qfp->input_entityID);
8012
if (sep == NULL) return;
8014
/* Hide the popup and initialize */
8019
qfp->itemtype = OBJ_SEQFEAT;
8021
qfp->abortconvert = FALSE;
8022
qfp->bsplist = NULL;
8024
/* Get the 'from' feature type */
8027
if (GetEnumPopup ((PopuP) qfp->fromfeatlist, qfp->alist, &enumval)) {
8028
val = (Int2) enumval;
8036
if (qfp->subtype != 0 || qfp->type != CONVERT_FEAT) {
8037
qfp->omp = ObjMgrGet ();
8039
if (qfp->omp != NULL) {
8040
qfp->omtp = ObjMgrTypeFind (qfp->omp, OBJ_SEQFEAT, NULL, NULL);
8042
if (qfp->type == CONVERT_FEAT) {
8044
if (GetEnumPopup ((PopuP) qfp->tofeatlist, qfp->alist, &enumval)) {
8045
val = (Int2) enumval;
8048
choice = FindFeatFromFeatDefType (qfp->subtype);
8049
newchoice = FindFeatFromFeatDefType (val);
8051
if (choice == SEQFEAT_IMP && newchoice == SEQFEAT_CDREGION) {
8054
qfp->findStr = JustSaveStringFromText (qfp->findthis);
8055
PrepareToConvertToCDS (sep, qfp->input_entityID,
8056
qfp->subtype, qfp->findStr);
8057
if (GetStatus (qfp->leaveDlgUp)) {
8066
if (qfp->itemtype != 0 && qfp->omtp != NULL) {
8067
SeqEntryExplore (sep, (Pointer) qfp, CommonQualifierCallback);
8075
if (qfp->bsplist != NULL) {
8076
if (Message (MSG_YN, "Remove protein products?") == ANS_YES) {
8077
for (tmp = qfp->bsplist; tmp != NULL; tmp = tmp->next) {
8078
bsp = (BioseqPtr) tmp->data.ptrvalue;
8079
itemID = GetItemIDGivenPointer (qfp->input_entityID, OBJ_BIOSEQ, (Pointer) bsp);
8081
MemSet ((Pointer) (&ompc), 0, sizeof (OMProcControl));
8082
ompc.do_not_reload_from_cache = TRUE;
8083
ompc.input_entityID = qfp->input_entityID;
8084
ompc.input_itemID = itemID;
8085
ompc.input_itemtype = OBJ_BIOSEQ;
8086
if (! DetachDataForProc (&ompc, FALSE)) {
8087
Message (MSG_POSTERR, "DetachDataForProc failed");
8092
RenormalizeNucProtSets (sep, TRUE);
8095
/* Force an update */
8097
DeleteMarkedObjects (qfp->input_entityID, 0, NULL);
8098
ObjMgrSetDirtyFlag (qfp->input_entityID, TRUE);
8099
ObjMgrSendMsg (OM_MSG_UPDATE, qfp->input_entityID, 0, 0);
8100
if (GetStatus (qfp->leaveDlgUp)) {
8107
static void QualMessageProc (ForM f, Int2 mssg)
8112
qfp = (QualFormPtr) GetObjectExtra (f);
8114
if (qfp->appmessage != NULL) {
8115
qfp->appmessage (f, mssg);
8120
static void CleanupQualForm (GraphiC g, VoidPtr data)
8126
qfp = (QualFormPtr) data;
8128
MemFree (qfp->findStr);
8129
MemFree (qfp->replaceStr);
8130
if (qfp->alist != NULL
8131
&& qfp->alist != qfp->realalist
8132
&& qfp->alist != qfp->realalist + 1)
8134
for (j = 0; qfp->alist [j].name != NULL; j++) {
8135
MemFree (qfp->alist [j].name);
8137
MemFree (qfp->alist);
8139
if (qfp->realalist != NULL) {
8140
for (j = 0; qfp->realalist [j].name != NULL; j++) {
8141
MemFree (qfp->realalist [j].name);
8144
MemFree (qfp->realalist);
8145
ValNodeFree (qfp->bsplist);
8147
StdCleanupFormProc (g, data);
8150
static void ProcessQualifier (IteM i, Int2 type)
8153
EnumFieldAssocPtr ap;
8164
StdEditorProcsPtr sepp;
8170
bfp = currentFormDataPtr;
8172
bfp = GetObjectExtra (i);
8174
if (bfp == NULL) return;
8175
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
8176
if (sep == NULL) return;
8177
qfp = (QualFormPtr) MemNew (sizeof (QualFormData));
8178
if (qfp == NULL) return;
8182
title = "Qualifier Removal";
8185
title = "Feature Conversion";
8188
title = "Qualifier Conversion";
8191
title = "Edit Qualifier";
8194
title = "Add Qualifier";
8200
w = FixedWindow (-50, -33, -10, -10, title, StdCloseWindowProc);
8201
SetObjectExtra (w, qfp, CleanupQualForm);
8202
qfp->form = (ForM) w;
8203
qfp->formmessage = QualMessageProc;
8205
sepp = (StdEditorProcsPtr) GetAppProperty ("StdEditorForm");
8207
SetActivate (w, sepp->activateForm);
8208
qfp->appmessage = sepp->handleMessages;
8211
qfp->input_entityID = bfp->input_entityID;
8212
qfp->input_itemID = bfp->input_itemID;
8213
qfp->input_itemtype = bfp->input_itemtype;
8215
if (type == CONVERT_FEAT) {
8216
ap = import_featdef_alist (TRUE, FALSE, TRUE);
8218
ap = import_featdef_alist (FALSE, FALSE, FALSE);
8220
SortEnumFieldAssocPtrArray (ap, CompareImpFeatEnumFieldAssoc);
8221
qfp->realalist = ap;
8222
if (type == CONVERT_FEAT) {
8225
ap->name = MemFree (ap->name);
8226
ap->name = StringSave ("[ALL FEATURES]");
8229
if (type == CONVERT_FEAT)
8231
qfp->alist = InsertMostUsedFeatureEnumFieldAssoc (ap);
8238
h = HiddenGroup (w, -1, 0, NULL);
8239
SetGroupSpacing (h, 10, 10);
8241
g = HiddenGroup (h, 0, 2, NULL);
8243
if (type == CONVERT_FEAT) {
8244
StaticPrompt (g, "From Feature", 0, 0, programFont, 'c');
8246
StaticPrompt (g, "Feature", 0, 0, programFont, 'c');
8248
if (indexerVersion) {
8253
qfp->fromfeatlist = SingleList (g, 10, listHeight, NULL);
8254
for (ap = qfp->alist; ap->name != NULL; ap++) {
8255
ListItem (qfp->fromfeatlist, ap->name);
8258
if (type == CONVERT_FEAT) {
8259
StaticPrompt (g, "To Feature", 0, 0, programFont, 'c');
8260
qfp->tofeatlist = SingleList (g, 10, listHeight, NULL);
8261
for (ap = qfp->alist; ap->name != NULL; ap++) {
8262
ListItem (qfp->tofeatlist, ap->name);
8265
if (type == CONVERT_QUAL) {
8266
StaticPrompt (g, "From Qualifier", 0, 0, programFont, 'c');
8268
StaticPrompt (g, "Qualifier", 0, 0, programFont, 'c');
8270
qfp->fromquallist = SingleList (g, 10, listHeight, NULL);
8271
if (type == REMOVE_QUAL)
8273
for (j = 0; j < NumRemoveQualifiers; j++) {
8274
ListItem (qfp->fromquallist, RemoveQualifierList [j].name);
8277
else if (type == ADD_QUAL)
8279
for (j = 0; j < NumAddQualifiers; j++) {
8280
ListItem (qfp->fromquallist, AddQualifierList [j].name);
8283
else if (type == CONVERT_QUAL)
8285
for (j = 0; j < NumConvertQualifiers; j++) {
8286
ListItem (qfp->fromquallist, ConvertQualifierList [j].name);
8289
else if (type == EDIT_QUAL)
8291
for (j = 0; j < NumEditQualifiers; j++) {
8292
ListItem (qfp->fromquallist, EditQualifierList [j].name);
8297
for (j = 0; j < ParFlat_TOTAL_GBQUAL; j++) {
8298
ListItem (qfp->fromquallist, ParFlat_GBQual_names [j].name);
8301
if (type == CONVERT_QUAL) {
8302
StaticPrompt (g, "To Qualifier", 0, 0, programFont, 'c');
8303
qfp->toquallist = SingleList (g, 10, listHeight, NULL);
8304
for (j = 0; j < NumConvertQualifiers; j++) {
8305
ListItem (qfp->toquallist, ConvertQualifierList [j].name);
8310
if (type == EDIT_QUAL) {
8311
k = HiddenGroup (h, 2, 0, NULL);
8313
k = HiddenGroup (h, 0, 2, NULL);
8315
if (type == EDIT_QUAL) {
8316
StaticPrompt (k, "Find", 0, dialogTextHeight, programFont, 'l');
8317
} else if (type == ADD_QUAL) {
8318
StaticPrompt (k, "Text", 0, dialogTextHeight, programFont, 'l');
8320
StaticPrompt (k, "Optional string constraint", 0, dialogTextHeight, programFont, 'c');
8322
qfp->findthis = DialogText (k, "", 14, NULL);
8323
if (type == EDIT_QUAL) {
8324
StaticPrompt (k, "Replace", 0, dialogTextHeight, programFont, 'l');
8325
qfp->replacewith = DialogText (k, "", 14, NULL);
8328
for (ap = qfp->alist; ap->name != NULL; ap++) {
8335
c = HiddenGroup (h, 4, 0, NULL);
8336
b = DefaultButton (c, "Accept", DoProcessQualifier);
8337
SetObjectExtra (b, qfp, NULL);
8338
PushButton (c, "Cancel", StdCancelButtonProc);
8339
qfp->leaveDlgUp = CheckBox (c, "Leave Dialog Up", NULL);
8341
AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) k, (HANDLE) c, NULL);
8344
Select (qfp->findthis);
8348
extern void RemoveQualifier (IteM i);
8349
extern void ConvertFeatures (IteM i);
8350
extern void ConvertQualifier (IteM i);
8351
extern void EditQualifier (IteM i);
8352
extern void AddQualifier (IteM i);
8354
extern void RemoveQualifier (IteM i)
8357
ProcessQualifier (i, REMOVE_QUAL);
8360
extern void ConvertFeatures (IteM i)
8363
ProcessQualifier (i, CONVERT_FEAT);
8366
extern void ConvertQualifier (IteM i)
8369
ProcessQualifier (i, CONVERT_QUAL);
8372
extern void EditQualifier (IteM i)
8375
ProcessQualifier (i, EDIT_QUAL);
8378
extern void AddQualifier (IteM i)
8381
ProcessQualifier (i, ADD_QUAL);
8384
#define REMOVE_SOURCE 1
8385
#define CONVERT_SOURCE 2
8386
#define EDIT_SOURCE 3
8387
#define ADD_SOURCE 4
8389
/* Note that any changes to this alist should also be made to */
8390
/* the (subsource_and_orgmod_subtype_remove_alistX list which */
8393
static ENUM_ALIST(subsource_and_orgmod_subtype_alistX)
8404
{"Chromosome", 101},
8413
{"Endogenous_virus-name", 125},
8414
{"Environmental-sample", 127},
8416
{"Forma-specialis", 26},
8422
{"Ins-seq-name", 121},
8424
{"Isolation-source", 128},
8427
{"Note - OrgMod", 55},
8428
{"Note - SubSource", 155},
8429
{"Old Lineage", 53}, /* 253 */
8430
{"Old Name", 54}, /* 254 */
8432
{"Plasmid-name", 119},
8433
{"Plastid-name", 122},
8434
{"Pop-variant", 117},
8435
{"Rearranged", 115},
8441
{"Specific-host", 21},
8442
{"Specimen-voucher", 23},
8444
{"Sub-species", 22},
8451
{"Tissue-lib", 118},
8452
{"Tissue-type", 110},
8453
{"Transgenic", 126},
8454
{"Transposon-name", 120},
8459
static ENUM_ALIST(subsource_and_orgmod_subtype_remove_alistX)
8471
{"Chromosome", 101},
8480
{"Endogenous_virus-name", 125},
8481
{"Environmental-sample", 127},
8483
{"Forma-specialis", 26},
8489
{"Ins-seq-name", 121},
8491
{"Isolation-source", 128},
8494
{"Note - OrgMod", 55},
8495
{"Note - SubSource", 155},
8496
{"Old Lineage", 53}, /* 253 */
8497
{"Old Name", 54}, /* 254 */
8499
{"Plasmid-name", 119},
8500
{"Plastid-name", 122},
8501
{"Pop-variant", 117},
8502
{"Rearranged", 115},
8508
{"Specific-host", 21},
8509
{"Specimen-voucher", 23},
8511
{"Sub-species", 22},
8518
{"Tissue-lib", 118},
8519
{"Tissue-type", 110},
8520
{"Transgenic", 126},
8521
{"Transposon-name", 120},
8526
static ENUM_ALIST(biosource_genome_alistX)
8532
{"Endogenous-virus", 19},
8533
{"Extrachromosomal", 8},
8535
{"Insertion Sequence", 11},
8538
{"Macronuclear", 7},
8539
{"Mitochondrion", 5},
8540
{"Nucleomorph", 15},
8549
static ENUM_ALIST(orgref_textfield_alist)
8551
{"Scientific Name", 1},
8557
typedef struct sourceformdata {
8561
ButtoN applyToParts;
8579
GrouP applyChoiceGrp; /* This is the group for the radio buttons for the
8580
* constraint on which biosources to operate on.
8582
PopuP qual_to_have; /* This is the control that indicates which qualifier
8583
* should be present to operate on a biosource.
8585
TexT text_to_have; /* This is the control that indicates the text that
8586
* should be present in the biosource to be operated on.
8588
Int4 applyChoiceVal; /* This is the value of the applyChoiceGrp choice. */
8589
CharPtr text_to_have_str;/* This is the contents of the text_to_have box. */
8590
Int4 qual_to_have_val;/* This is the subtype for the qual to have. */
8599
Boolean replaceOldAsked;
8600
Boolean doReplaceAll;
8601
Boolean use_semicolon;
8603
} SourceFormData, PNTR SourceFormPtr;
8605
static ValNodePtr EnumToValNode (EnumFieldAssocPtr al)
8607
EnumFieldAssocPtr efap;
8608
ValNodePtr list = NULL, vnp;
8610
for (efap = al; efap->name != NULL; efap++)
8612
vnp = ValNodeNew (list);
8613
if (list == NULL) list = vnp;
8616
vnp->choice = efap->value;
8617
vnp->data.ptrvalue = efap->name;
8623
extern ValNodePtr GetQualList (void)
8627
list = EnumToValNode (subsource_and_orgmod_subtype_alistX);
8631
Uint2 mod_widths [] = {
8635
Uint2 mod_types [] = {
8636
TAGLIST_POPUP, TAGLIST_TEXT
8639
extern Uint1 FindTypeForModNameText (CharPtr cp)
8641
EnumFieldAssocPtr ap;
8643
for (ap = subsource_and_orgmod_subtype_alistX; ap->name != NULL; ap++)
8645
if (StringICmp (ap->name, cp) == 0)
8653
static void ModListToModDialog (DialoG d, Pointer data)
8662
ValNodePtr name_vnp;
8663
ValNodePtr value_vnp;
8666
tlp = (TagListPtr) GetObjectExtra (d);
8667
lpp = (ListPairPtr) data;
8670
name_vnp = lpp->selected_names_list;
8671
value_vnp = lpp->selected_values_list;
8672
while (name_vnp != NULL) {
8673
if (!StringHasNoText (name_vnp->data.ptrvalue))
8675
vnp = ValNodeNew (head);
8679
len = StringLen (name_vnp->data.ptrvalue) + 4;
8680
if (value_vnp != NULL)
8682
len += StringLen (value_vnp->data.ptrvalue);
8687
if (value_vnp != NULL && ! StringHasNoText (value_vnp->data.ptrvalue))
8689
sprintf (str, "%d\t%s\n",
8691
value_vnp->data.ptrvalue);
8695
sprintf (str, "%d\t\n", name_vnp->choice);
8698
vnp->data.ptrvalue = str;
8700
name_vnp = name_vnp->next;
8701
if (value_vnp != NULL)
8703
value_vnp = value_vnp->next;
8706
SendMessageToDialog (tlp->dialog, VIB_MSG_RESET);
8708
SendMessageToDialog (tlp->dialog, VIB_MSG_REDRAW);
8709
for (j = 0, vnp = tlp->vnp; vnp != NULL; j++, vnp = vnp->next) {
8711
tlp->max = MAX ((Int2) 0, (Int2) (j - tlp->rows + 1));
8712
CorrectBarMax (tlp->bar, tlp->max);
8713
CorrectBarPage (tlp->bar, tlp->rows - 1, tlp->rows - 1);
8717
static CharPtr GetValueNameFromEnum (Int4 val, EnumFieldAssocPtr list)
8719
EnumFieldAssocPtr ap;
8721
for (ap = list; ap != NULL && ap->name != NULL; ap++)
8723
if (ap->value == val)
8731
static Pointer ModDialogToModList (DialoG d)
8743
ValNodePtr vnp, name_vnp, value_vnp;
8749
tlp = (TagListPtr) GetObjectExtra (d);
8751
lpp = (ListPairPtr) MemNew (sizeof (ListPairData));
8752
if (lpp == NULL) return NULL;
8753
lpp->selected_names_list = NULL;
8754
lpp->selected_values_list = NULL;
8756
if (tlp != NULL && tlp->vnp != NULL) {
8757
for (vnp = tlp->vnp; vnp != NULL; vnp = vnp->next) {
8758
str = (CharPtr) vnp->data.ptrvalue;
8760
len = StringLen (str);
8761
for (j = 0; j < len; j++) {
8763
if (ch != ' ' && ch != '\t' && ch != '\n') {
8768
tmp = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 0);
8769
if (tmp != NULL && sscanf (tmp, "%d", &val) == 1 && val != 0) {
8770
mod_name = GetValueNameFromEnum (val, subsource_and_orgmod_subtype_alistX);
8771
if (mod_name != NULL && ! StringHasNoText (mod_name)) {
8772
mod_value = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 1);
8773
name_vnp = ValNodeNew (lpp->selected_names_list);
8774
value_vnp = ValNodeNew (lpp->selected_values_list);
8775
if (lpp->selected_names_list == NULL)
8777
lpp->selected_names_list = name_vnp;
8779
if (lpp->selected_values_list == NULL)
8781
lpp->selected_values_list = value_vnp;
8783
if (name_vnp != NULL)
8785
name_vnp->choice = val;
8786
name_vnp->data.ptrvalue = mod_name;
8788
if (value_vnp != NULL)
8790
value_vnp->data.ptrvalue = mod_value;
8799
return (Pointer) lpp;
8802
static EnumFieldAssocPtr mod_lists[] =
8803
{ subsource_and_orgmod_subtype_alistX, NULL };
8805
extern DialoG CreateModifierTagList (GrouP g, ListPairPtr lpp)
8809
if (lpp == NULL) return NULL;
8810
d = CreateTagListDialog (g, 4, 2, STD_TAG_SPACING, mod_types,
8811
mod_widths, mod_lists,
8813
ModDialogToModList);
8814
PointerToDialog (d, lpp);
8818
extern ListPairPtr GetModifierList (DialoG d)
8822
lpp = DialogToPointer (d);
8826
extern void AppendOrReplaceString (
8827
CharPtr PNTR string_loc,
8829
Boolean PNTR asked_question,
8830
Boolean PNTR do_replace,
8831
Boolean PNTR use_semicolon
8835
CharPtr tmp_value, tmp_new_value;
8837
if (string_loc == NULL
8838
|| new_value == NULL
8839
|| asked_question == NULL
8840
|| do_replace == NULL
8841
|| use_semicolon == NULL)
8846
if (! *asked_question && !StringHasNoText (*string_loc))
8848
*asked_question = TRUE;
8850
ans = Message (MSG_YN, "Do you wish to overwrite existing content?");
8851
*do_replace = (Boolean) (ans == ANS_YES);
8852
if (! *use_semicolon)
8856
ans = Message (MSG_YN, "Separate items with semicolon?");
8857
*use_semicolon = (Boolean) (ans == ANS_YES);
8863
if (*do_replace || StringHasNoText (*string_loc))
8865
MemFree (*string_loc);
8866
*string_loc = StringSave (new_value);
8870
tmp_value = MemNew (StringLen (*string_loc) + StringLen ( new_value) + 3);
8871
if (tmp_value == NULL) return;
8872
StringCpy (tmp_value, *string_loc);
8873
TrimSpacesAroundString (tmp_value);
8876
StringCat (tmp_value, "; ");
8880
StringCat (tmp_value, " ");
8882
tmp_new_value = StringSave (new_value);
8883
TrimSpacesAroundString (tmp_new_value);
8884
StringCat (tmp_value, tmp_new_value);
8885
MemFree (tmp_new_value);
8886
MemFree (*string_loc);
8887
*string_loc = tmp_value;
8891
static SubSourcePtr FindSubSource (BioSourcePtr biop, Uint1 subtype, SourceFormPtr sfp,
8892
Boolean forceRemove, Boolean convertNote, Boolean is_feat)
8895
SubSourcePtr PNTR prev;
8899
if (subtype == 55 || subtype == 155) {
8902
prev = &(biop->subtype);
8903
for (ssp = biop->subtype; ssp != NULL; ssp = ssp->next) {
8904
if (ssp->subtype == subtype) {
8905
if (sfp->type == REMOVE_SOURCE || forceRemove) {
8906
if (StringHasNoText (sfp->findStr) ||
8907
StringISearch (ssp->name, sfp->findStr) != NULL) {
8909
SubSourceFree (ssp);
8916
prev = &(ssp->next);
8918
if (sfp->type == REMOVE_SOURCE || forceRemove) return NULL;
8919
if (sfp->type != ADD_SOURCE && (! convertNote)) return NULL;
8920
if (subtype == SUBSRC_transgenic && is_feat) return NULL;
8921
ssp = SubSourceNew ();
8922
if (biop->subtype == NULL) {
8923
biop->subtype = ssp;
8925
tmp = biop->subtype;
8926
while (tmp->next != NULL) {
8932
ssp->subtype = subtype;
8937
static OrgModPtr FindOrgMod (BioSourcePtr biop, Uint1 subtype, SourceFormPtr sfp, Boolean forceRemove, Boolean convertNote)
8943
OrgModPtr PNTR prev;
8946
if (subtype == 55 || subtype == 155) {
8948
} else if (subtype == 53) {
8950
} else if (subtype == 54) {
8956
if (sfp->type != ADD_SOURCE) return NULL;
8960
if (orp == NULL) return NULL;
8963
if ((sfp->type != ADD_SOURCE) &&
8964
(sfp->type != CONVERT_SOURCE))
8966
onp = OrgNameNew ();
8969
if (onp == NULL) return NULL;
8971
for (mod = onp->mod; mod != NULL; mod = mod->next) {
8972
if (mod->subtype == subtype) {
8973
if (sfp->type == REMOVE_SOURCE || forceRemove) {
8974
if (StringHasNoText (sfp->findStr) ||
8975
StringISearch (mod->subname, sfp->findStr) != NULL) {
8984
prev = &(mod->next);
8986
if (sfp->type == REMOVE_SOURCE || forceRemove) return NULL;
8987
if (sfp->type != ADD_SOURCE && (! convertNote)) return NULL;
8989
if (onp->mod == NULL) {
8993
while (tmp->next != NULL) {
8999
mod->subtype = subtype;
9004
static void ConvertSourceString (OrgRefPtr orp, Int2 fromval, Int2 toval)
9009
if (orp == NULL || fromval == toval) return;
9016
tmp = StringSave (orp->taxname);
9017
SetTaxNameAndRemoveTaxRef (orp, NULL);
9025
tmp = onp->lineage ;
9026
onp->lineage = NULL;
9039
if (tmp == NULL) return;
9043
SetTaxNameAndRemoveTaxRef (orp, tmp);
9050
onp = OrgNameNew ();
9058
onp = OrgNameNew ();
9069
} /* ConvertSourceString */
9071
static void EditSourceString (CharPtr PNTR strptr, SourceFormPtr sfp, CharPtr foundit)
9081
if (sfp == NULL || strptr == NULL || foundit == NULL) return;
9082
foundlen = StringLen (sfp->findStr);
9083
replen = StringLen (sfp->replaceStr);
9084
if (replen > foundlen) {
9085
diff = replen - foundlen;
9087
diff = foundlen - replen;
9089
newstring = MemNew (StringLen (*strptr) + diff + 1);
9092
while (tmp != foundit) {
9097
if (sfp->replaceStr != NULL) {
9098
tmp2 = MemCopy (tmp2, sfp->replaceStr, replen);
9102
tmp2 = StringMove (tmp2, tmp);
9103
*strptr = MemFree (*strptr);
9104
*strptr = newstring;
9107
static Uint1 AssignSubtype (Uint1 subtype)
9110
if (subtype >= 100) {
9113
if (subtype == 55) {
9119
static void RemoveSubSourceByPtr (BioSourcePtr biop, SubSourcePtr to_remove)
9121
SubSourcePtr ssp, prev;
9123
if (biop == NULL || to_remove == NULL) return;
9126
ssp = biop->subtype;
9129
if (ssp == to_remove)
9133
biop->subtype = ssp->next;
9135
SubSourceFree (ssp);
9136
ssp = biop->subtype;
9140
prev->next = ssp->next;
9142
SubSourceFree (ssp);
9154
static void ConvertSubSourceModifier (
9158
SubSourcePtr ssp_from
9161
SubSourcePtr ssp_to;
9163
if (biop == NULL || sfp == NULL || ssp_from == NULL) return;
9164
ssp_to = FindSubSource (biop, sfp->toval - 100, sfp, TRUE, FALSE, is_feat);
9167
AppendOrReplaceString (&(ssp_to->name), ssp_from->name,
9168
&(sfp->replaceOldAsked),
9169
&(sfp->doReplaceAll),
9170
&(sfp->use_semicolon));
9171
RemoveSubSourceByPtr (biop, ssp_from);
9175
ssp_from->subtype = AssignSubtype (sfp->toval);
9179
static void RemoveOrgModByPtr (BioSourcePtr biop, OrgModPtr to_remove)
9181
OrgModPtr mod, prev;
9184
|| biop->org == NULL
9185
|| biop->org->orgname == NULL
9186
|| biop->org->orgname->mod == NULL
9187
|| to_remove == NULL)
9193
mod = biop->org->orgname->mod;
9196
if (mod == to_remove)
9200
biop->org->orgname->mod = mod->next;
9203
mod = biop->org->orgname->mod;
9207
prev->next = mod->next;
9221
static void ConvertOrganismModifier (
9230
if (biop == NULL || sfp == NULL || mod_from == NULL) return;
9231
mod_to = FindOrgMod (biop, sfp->toval, sfp, FALSE, FALSE);
9234
AppendOrReplaceString (&(mod_to->subname), mod_from->subname,
9235
&(sfp->replaceOldAsked),
9236
&(sfp->doReplaceAll),
9237
&(sfp->use_semicolon));
9238
RemoveOrgModByPtr (biop, mod_from);
9242
mod_from->subtype = AssignSubtype (sfp->toval);
9246
static void ConvertSubSourceToOrgMod (
9262
if (sfp->toval == 55)
9264
mod = FindOrgMod (biop, 255, sfp, FALSE, FALSE);
9268
mod = FindOrgMod (biop, sfp->toval, sfp, FALSE, FALSE);
9272
if (biop->org == NULL)
9274
biop->org = OrgRefNew ();
9275
if (biop->org == NULL) return;
9277
if (biop->org->orgname == NULL)
9279
biop->org->orgname = OrgNameNew ();
9280
if (biop->org->orgname == NULL) return;
9283
if (sfp->toval == 55)
9289
mod->subtype = sfp->toval;
9291
mod->subname = StringSave (ssp->name);
9292
mod->next = biop->org->orgname->mod;
9293
biop->org->orgname->mod = mod;
9297
AppendOrReplaceString (&(mod->subname), ssp->name,
9298
&(sfp->replaceOldAsked),
9299
&(sfp->doReplaceAll),
9300
&(sfp->use_semicolon));
9302
RemoveSubSourceByPtr (biop, ssp);
9305
static void ConvertOrgModToSubSource (
9321
if (sfp->toval == 155)
9323
ssp = FindSubSource (biop, 255, sfp, FALSE, FALSE, is_feat);
9327
ssp = FindSubSource (biop, sfp->toval - 100, sfp, FALSE, FALSE, is_feat);
9331
ssp = SubSourceNew ();
9332
if (sfp->toval == 155)
9338
ssp->subtype = sfp->toval - 100;
9340
ssp->name = StringSave (mod->subname);
9341
ssp->next = biop->subtype;
9342
biop->subtype = ssp;
9346
AppendOrReplaceString (&(ssp->name), mod->subname,
9347
&(sfp->replaceOldAsked),
9348
&(sfp->doReplaceAll),
9349
&(sfp->use_semicolon));
9351
RemoveOrgModByPtr (biop, mod);
9354
static Boolean DoesBioSourceQualContainString (BioSourcePtr biop, CharPtr str)
9356
SubSourcePtr ssp = NULL;
9357
OrgRefPtr orp = NULL;
9358
OrgNamePtr onp = NULL;
9359
OrgModPtr mod = NULL;
9365
if (str == NULL || StringHasNoText (str))
9369
for (ssp = biop->subtype; ssp != NULL; ssp = ssp->next) {
9370
if (ssp->name != NULL && StringStr (ssp->name, str) != NULL)
9383
for (mod = onp->mod; mod != NULL; mod = mod->next) {
9384
if (mod->subname != NULL && StringStr (mod->subname, str) != NULL)
9392
static Boolean DoesBioSourceOrgNameContainString (BioSourcePtr biop, CharPtr str)
9394
if (biop == NULL || str == NULL || biop->org == NULL) return FALSE;
9395
if (StringStr (biop->org->taxname, str) != NULL || StringStr (biop->org->common, str) != NULL)
9402
static Boolean DoesBioSourceHaveQual (BioSourcePtr biop, Uint1 subtype, Boolean is_ssp)
9404
SubSourcePtr ssp = NULL;
9405
OrgRefPtr orp = NULL;
9406
OrgNamePtr onp = NULL;
9407
OrgModPtr mod = NULL;
9415
if (subtype == 55 || subtype == 155) {
9418
for (ssp = biop->subtype; ssp != NULL; ssp = ssp->next) {
9419
if (ssp->subtype == subtype) {
9426
if (subtype == 55 || subtype == 155) {
9428
} else if (subtype == 53) {
9430
} else if (subtype == 54) {
9442
for (mod = onp->mod; mod != NULL; mod = mod->next) {
9443
if (mod->subtype == subtype) {
9451
static Boolean OkToOperateOnSource (BioSourcePtr biop, SourceFormPtr sfp)
9456
if (biop == NULL || sfp == NULL) {
9460
switch (sfp->applyChoiceVal)
9466
subtype = sfp->qual_to_have_val;
9472
if (DoesBioSourceHaveQual (biop, subtype, TRUE))
9478
return DoesBioSourceHaveQual (biop, subtype, FALSE);
9481
else if (subtype >= 100)
9483
subtype = subtype - 100;
9486
return DoesBioSourceHaveQual (biop, subtype, is_ssp);
9489
return DoesBioSourceQualContainString (biop, sfp->text_to_have_str)
9490
|| DoesBioSourceOrgNameContainString (biop, sfp->text_to_have_str);
9496
static void ProcessBioSourceFunc (BioSourcePtr biop, SourceFormPtr sfp, Boolean is_feat)
9500
OrgModPtr mod = NULL;
9503
SubSourcePtr ssp = NULL;
9505
CharPtr str1 = NULL;
9506
CharPtr str2 = NULL;
9510
if (biop == NULL || sfp == NULL) return;
9511
if (! OkToOperateOnSource (biop, sfp)) return;
9512
if (sfp->choice == 1) {
9513
if (sfp->fromval == 999) {
9514
ssp = FindSubSource (biop, 255, sfp, FALSE, FALSE, is_feat);
9518
mod = FindOrgMod (biop, 255, sfp, FALSE, FALSE);
9520
str2 = mod->subname;
9522
else if (sfp->fromval >= 100) {
9523
ssp = FindSubSource (biop, sfp->fromval - 100, sfp, FALSE, FALSE, is_feat);
9524
if (ssp == NULL) return;
9527
mod = FindOrgMod (biop, sfp->fromval, sfp, FALSE, FALSE);
9528
if (mod == NULL) return;
9531
switch (sfp->type) {
9532
case REMOVE_SOURCE :
9534
case CONVERT_SOURCE :
9535
if (sfp->toval < 1) return;
9536
if (StringHasNoText (sfp->findStr) || StringISearch (str, sfp->findStr) != NULL) {
9537
if (sfp->toval >= 100 && ssp != NULL) {
9538
ConvertSubSourceModifier (biop, sfp, is_feat, ssp);
9539
} else if (sfp->toval < 100 && mod != NULL) {
9540
ConvertOrganismModifier (biop, sfp, is_feat, mod);
9541
} else if (sfp->toval < 100 && ssp != NULL) {
9542
ConvertSubSourceToOrgMod (biop, sfp, is_feat, ssp);
9543
} else if (sfp->toval >= 100 && mod != NULL) {
9544
ConvertOrgModToSubSource (biop, sfp, is_feat, mod);
9550
foundit = StringISearch (ssp->name, sfp->findStr);
9551
while (foundit != NULL) {
9552
offset = foundit - ssp->name + 1 + StringLen (sfp->replaceStr);
9553
EditSourceString (&(ssp->name), sfp, foundit);
9554
foundit = StringISearch (ssp->name + offset, sfp->findStr);
9556
} else if (mod != NULL) {
9557
foundit = StringISearch (mod->subname, sfp->findStr);
9558
while (foundit != NULL) {
9559
offset = foundit - mod->subname + 1 + StringLen (sfp->replaceStr);
9560
EditSourceString (&(mod->subname), sfp, foundit);
9561
foundit = StringISearch (mod->subname + offset, sfp->findStr);
9567
AppendOrReplaceString (&(ssp->name), sfp->findStr,
9568
&(sfp->replaceOldAsked),
9569
&(sfp->doReplaceAll),
9570
&(sfp->use_semicolon));
9571
if (ssp->name == NULL &&
9572
(ssp->subtype == SUBSRC_germline ||
9573
ssp->subtype == SUBSRC_rearranged ||
9574
ssp->subtype == SUBSRC_environmental_sample)) {
9575
ssp->name = StringSave ("");
9576
} else if (ssp->subtype == SUBSRC_transgenic && (! is_feat)) {
9577
ssp->name = StringSave ("");
9579
} else if (mod != NULL) {
9580
AppendOrReplaceString (&(mod->subname), sfp->findStr,
9581
&(sfp->replaceOldAsked),
9582
&(sfp->doReplaceAll),
9583
&(sfp->use_semicolon));
9589
} else if (sfp->choice == 2) {
9590
switch (sfp->type) {
9591
case REMOVE_SOURCE :
9592
if (sfp->fromval == 0 || biop->genome == sfp->fromval) {
9596
case CONVERT_SOURCE :
9597
if (biop->genome == sfp->fromval) {
9598
biop->genome = sfp->toval;
9603
biop->genome = sfp->fromval;
9608
} else if (sfp->choice == 3) {
9610
switch (sfp->type) {
9611
case REMOVE_SOURCE :
9614
case CONVERT_SOURCE :
9615
if (biop->origin == sfp->fromval)
9617
biop->origin = sfp->toval;
9622
biop->origin = sfp->fromval;
9627
} else if (sfp->choice == 4) {
9633
switch (sfp->type) {
9634
case REMOVE_SOURCE :
9635
switch (sfp->fromval) {
9638
SetTaxNameAndRemoveTaxRef (orp, MemFree (orp->taxname));
9643
orp->common = MemFree (orp->common);
9648
onp->lineage = MemFree (onp->lineage);
9653
onp->div = MemFree (onp->div);
9660
case CONVERT_SOURCE :
9661
ConvertSourceString (orp, sfp->fromval, sfp->toval);
9664
switch (sfp->fromval) {
9667
foundit = StringISearch (orp->taxname, sfp->findStr);
9668
if (foundit != NULL) {
9669
tmp_str = StringSave (orp->taxname);
9670
foundit = StringISearch (tmp_str, sfp->findStr);
9671
EditSourceString (&(tmp_str), sfp, foundit);
9672
SetTaxNameAndRemoveTaxRef (orp, tmp_str);
9678
foundit = StringISearch (orp->common, sfp->findStr);
9679
if (foundit != NULL) {
9680
EditSourceString (&(orp->common), sfp, foundit);
9686
foundit = StringISearch (onp->lineage, sfp->findStr);
9687
if (foundit != NULL) {
9688
EditSourceString (&(onp->lineage), sfp, foundit);
9694
foundit = StringISearch (onp->div, sfp->findStr);
9695
if (foundit != NULL) {
9696
EditSourceString (&(onp->div), sfp, foundit);
9712
static Boolean ProcessSourceGatherFunc (GatherContextPtr gcp)
9717
Boolean is_feat = FALSE;
9721
if (gcp == NULL) return TRUE;
9722
sfp = (SourceFormPtr) gcp->userdata;
9723
if (sfp == NULL) return TRUE;
9724
if (gcp->thisitem == NULL) return TRUE;
9726
if (gcp->thistype == OBJ_SEQFEAT) {
9727
feat = (SeqFeatPtr) gcp->thisitem;
9728
if (feat->data.choice == SEQFEAT_BIOSRC) {
9729
biop = (BioSourcePtr) feat->data.value.ptrvalue;
9732
} else if (gcp->thistype == OBJ_SEQDESC) {
9733
vnp = (ValNodePtr) gcp->thisitem;
9734
if (vnp->choice == Seq_descr_source) {
9735
biop = (BioSourcePtr) vnp->data.ptrvalue;
9738
if (biop == NULL) return TRUE;
9739
ProcessBioSourceFunc (biop, sfp, is_feat);
9743
static void PutBioSourceOnPartAndProcess (SeqEntryPtr sep, Int2 onlythis, SourceFormPtr sfp)
9750
SeqMgrDescContext dcontext;
9755
if (IS_Bioseq_set (sep)) {
9756
bssp = (BioseqSetPtr) sep->data.ptrvalue;
9758
if (onlythis != 0 && bssp->_class == BioseqseqSet_class_parts) {
9759
for (tmp = bssp->seq_set, count = 1;
9760
tmp != NULL && count != onlythis;
9761
tmp = tmp->next, count++) continue;
9763
PutBioSourceOnPartAndProcess (tmp, onlythis, sfp);
9766
for (tmp = bssp->seq_set; tmp != NULL; tmp = tmp->next) {
9767
PutBioSourceOnPartAndProcess (tmp, onlythis, sfp);
9773
nsep = FindNucSeqEntry (sep);
9774
if (nsep == NULL) return;
9775
bsp = (BioseqPtr) nsep->data.ptrvalue;
9776
if (bsp == NULL) return;
9777
if (bsp->repr == Seq_repr_raw) {
9778
sdp = SeqEntryGetSeqDescr (nsep, Seq_descr_source, NULL);
9780
biop = (BioSourcePtr) sdp->data.ptrvalue;
9781
ProcessBioSourceFunc (biop, sfp, FALSE);
9784
sdp = SeqMgrGetNextDescriptor (bsp, NULL, Seq_descr_source, &dcontext);
9785
if (sdp == NULL) return;
9786
biop = (BioSourcePtr) sdp->data.ptrvalue;
9788
biop = (BioSourcePtr) AsnIoMemCopy ((Pointer) biop,
9789
(AsnReadFunc) BioSourceAsnRead,
9790
(AsnWriteFunc) BioSourceAsnWrite);
9792
sdp = CreateNewDescriptor (nsep, Seq_descr_source);
9794
sdp->data.ptrvalue = (Pointer) biop;
9795
ProcessBioSourceFunc (biop, sfp, FALSE);
9802
static ENUM_ALIST(origin_alist)
9803
{" ", ORG_DEFAULT },
9804
{"Natural", ORG_NATURAL },
9805
{"Natural Mutant", ORG_NATMUT },
9806
{"Mutant", ORG_MUT },
9807
{"Artificial", ORG_ARTIFICIAL },
9808
{"Synthetic", ORG_SYNTHETIC },
9809
{"Other", ORG_OTHER },
9812
static void DoProcessSource (ButtoN b)
9821
sfp = (SourceFormPtr) GetObjectExtra (b);
9822
if (sfp == NULL) return;
9827
sfp->applyChoiceVal = GetValue (sfp->applyChoiceGrp);
9828
sfp->text_to_have_str = SaveStringFromText (sfp->text_to_have);
9829
if (GetEnumPopup (sfp->qual_to_have, subsource_and_orgmod_subtype_alistX, &val))
9831
sfp->qual_to_have_val = (Int2) val;
9835
sfp->qual_to_have_val = 0;
9841
sfp->choice = GetValue (sfp->sourceGroup);
9842
if (sfp->choice == 1) {
9843
if (REMOVE_SOURCE == sfp->type) {
9844
if (GetEnumPopup (sfp->frommod, subsource_and_orgmod_subtype_remove_alistX,
9846
sfp->fromval = (Int2) val;
9847
if (GetEnumPopup (sfp->tomod, subsource_and_orgmod_subtype_remove_alistX,
9849
sfp->toval = (Int2) val;
9852
if (GetEnumPopup (sfp->frommod, subsource_and_orgmod_subtype_alistX,
9854
sfp->fromval = (Int2) val;
9855
if (GetEnumPopup (sfp->tomod, subsource_and_orgmod_subtype_alistX, &val))
9856
sfp->toval = (Int2) val;
9858
} else if (sfp->choice == 2) {
9859
if (GetEnumPopup (sfp->fromgen, biosource_genome_alistX, &val)) {
9860
sfp->fromval = (Int2) val;
9862
if (GetEnumPopup (sfp->togen, biosource_genome_alistX, &val)) {
9863
sfp->toval = (Int2) val;
9865
} else if (sfp->choice == 3) {
9866
if (GetEnumPopup (sfp->fromorigin, origin_alist, &val)) {
9867
sfp->fromval = (Int2) val;
9869
if (GetEnumPopup (sfp->toorigin, origin_alist, &val)) {
9870
sfp->toval = (Int2) val;
9872
} else if (sfp->choice == 4) {
9873
if (GetEnumPopup (sfp->fromref, orgref_textfield_alist, &val)) {
9874
sfp->fromval = (Int2) val;
9876
if (GetEnumPopup (sfp->toref, orgref_textfield_alist, &val)) {
9877
sfp->toval = (Int2) val;
9880
if (sfp->fromval > 0 || (sfp->choice == 4 || sfp->type == REMOVE_SOURCE)) {
9881
sfp->findStr = JustSaveStringFromText (sfp->findthis);
9882
sfp->replaceStr = JustSaveStringFromText (sfp->replacewith);
9883
if (sfp->type != EDIT_SOURCE) {
9884
TrimSpacesAroundString (sfp->findStr);
9885
TrimSpacesAroundString (sfp->replaceStr);
9887
if (sfp->type != EDIT_SOURCE
9888
|| (! StringHasNoText (sfp->findStr))
9890
|| sfp->choice == 3) {
9891
sfp->replaceOldAsked = FALSE;
9892
sfp->doReplaceAll = FALSE;
9894
if (sfp->applyToParts != NULL && GetStatus (sfp->applyToParts)) {
9895
GetTitle (sfp->onlyThisPart, str, sizeof (str));
9896
if (! StrToInt (str, &(sfp->onlythis))) {
9900
if (sfp->onlythis > 0) {
9901
sep = GetTopSeqEntryForEntityID (sfp->input_entityID);
9902
PutBioSourceOnPartAndProcess (sep, sfp->onlythis, sfp);
9904
MemSet ((Pointer) (&gs), 0, sizeof (GatherScope));
9906
MemSet((Pointer)(gs.ignore), (int)(TRUE), (size_t)(OBJ_MAX * sizeof(Boolean)));
9907
gs.ignore[OBJ_BIOSEQ] = FALSE;
9908
gs.ignore[OBJ_BIOSEQ_SEG] = FALSE;
9909
gs.ignore[OBJ_SEQANNOT] = FALSE;
9910
gs.ignore[OBJ_SEQFEAT] = FALSE;
9911
gs.ignore[OBJ_SEQDESC] = FALSE;
9912
GatherEntity (sfp->input_entityID, (Pointer) sfp, ProcessSourceGatherFunc, &gs);
9918
if (indexerVersion && sfp->type == ADD_SOURCE) {
9919
sep = GetTopSeqEntryForEntityID (sfp->input_entityID);
9920
if (CountSeqEntryComponents (sep) == 1) {
9921
Message (MSG_OK, "When only one record present, edit the BioSource directly");
9924
ObjMgrSetDirtyFlag (sfp->input_entityID, TRUE);
9925
ObjMgrSendMsg (OM_MSG_UPDATE, sfp->input_entityID, 0, 0);
9926
if (GetStatus (sfp->leaveDlgUp)) {
9934
static void ChangeSourceGroup (GrouP g)
9940
sfp = (SourceFormPtr) GetObjectExtra (g);
9941
if (sfp == NULL) return;
9945
SafeHide (sfp->genGrp);
9946
SafeHide (sfp->refGrp);
9947
SafeShow (sfp->modGrp);
9948
SafeShow (sfp->txtGrp);
9949
SafeHide (sfp->originGrp);
9952
SafeHide (sfp->modGrp);
9953
SafeHide (sfp->refGrp);
9954
SafeHide (sfp->txtGrp);
9955
SafeShow (sfp->genGrp);
9956
SafeHide (sfp->originGrp);
9959
SafeHide (sfp->modGrp);
9960
SafeHide (sfp->refGrp);
9961
SafeHide (sfp->txtGrp);
9962
SafeHide (sfp->genGrp);
9963
SafeShow (sfp->originGrp);
9966
SafeHide (sfp->modGrp);
9967
SafeHide (sfp->genGrp);
9968
SafeShow (sfp->txtGrp);
9969
SafeShow (sfp->refGrp);
9970
SafeHide (sfp->originGrp);
9973
SafeHide (sfp->modGrp);
9974
SafeHide (sfp->genGrp);
9975
SafeHide (sfp->refGrp);
9976
SafeHide (sfp->txtGrp);
9982
static void SourceMessageProc (ForM f, Int2 mssg)
9987
sfp = (SourceFormPtr) GetObjectExtra (f);
9989
if (sfp->appmessage != NULL) {
9990
sfp->appmessage (f, mssg);
9995
static void CleanupSourceForm (GraphiC g, VoidPtr data)
10000
sfp = (SourceFormPtr) data;
10002
MemFree (sfp->findStr);
10003
MemFree (sfp->replaceStr);
10004
MemFree (sfp->text_to_have_str);
10006
StdCleanupFormProc (g, data);
10009
static PopuP PopupOrSingleList (GrouP prnt, Boolean macLike, PupActnProc actn, EnumFieldAssocPtr al, UIEnum val)
10015
lst = CreateEnumListDialog (prnt, 0, 16, (LstActnProc) actn, al, 0, NULL);
10016
SetEnumPopup ((PopuP) lst, al, val);
10017
return (PopuP) lst;
10021
pop = CreateEnumPopupDialog (prnt, macLike, actn, al, 0, NULL);
10022
SetEnumPopup (pop, al, val);
10027
extern Boolean HasPartsSet (SeqEntryPtr sep);
10029
static void SourceApplyToPartsProc (ButtoN b)
10034
sfp = (SourceFormPtr) GetObjectExtra (b);
10035
if (sfp == NULL) return;
10036
if (GetStatus (b)) {
10037
SafeEnable (sfp->onlyThisPart);
10039
SafeDisable (sfp->onlyThisPart);
10043
static void ClearProcessSourceDlgText (ButtoN b)
10047
sfp = (SourceFormPtr) GetObjectExtra (b);
10048
if (sfp == NULL) return;
10050
switch (sfp->type) {
10051
case REMOVE_SOURCE :
10052
SetTitle (sfp->findthis, "");
10054
case CONVERT_SOURCE :
10055
SetTitle (sfp->findthis, "");
10058
SetTitle (sfp->findthis, "");
10059
SetTitle (sfp->replacewith, "");
10062
SetTitle (sfp->findthis, "");
10067
Select (sfp->findthis);
10070
static void ClearProcessSourceDlg (ButtoN b)
10074
sfp = (SourceFormPtr) GetObjectExtra (b);
10075
if (sfp == NULL) return;
10077
if ( sfp->onlyThisPart != NULL) {
10078
Disable (sfp->onlyThisPart);
10080
SetValue (sfp->sourceGroup, 1);
10081
Hide (sfp->modGrp);
10082
switch (sfp->type) {
10083
case REMOVE_SOURCE :
10084
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10085
SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
10086
SetTitle (sfp->findthis, "");
10087
SetValue (sfp->frommod, 1);
10088
SetValue (sfp->fromorigin, 1);
10090
case CONVERT_SOURCE :
10091
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10092
SetEnumPopup (sfp->togen, biosource_genome_alistX, 0);
10093
SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
10094
SetEnumPopup (sfp->toref, orgref_textfield_alist, 0);
10095
SetTitle (sfp->findthis, "");
10096
SetValue (sfp->frommod, 1);
10097
SetValue (sfp->tomod, 1);
10098
SetValue (sfp->fromorigin, 1);
10099
SetValue (sfp->toorigin, 1);
10102
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10103
SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
10104
SetTitle (sfp->findthis, "");
10105
SetTitle (sfp->replacewith, "");
10106
SetValue (sfp->frommod, 1);
10107
SetValue (sfp->fromorigin, 1);
10110
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10111
SetTitle (sfp->findthis, "");
10112
SetValue (sfp->frommod, 1);
10113
SetValue (sfp->fromorigin, 1);
10118
Hide (sfp->genGrp);
10119
Hide (sfp->refGrp);
10120
Show (sfp->modGrp);
10121
SafeHide (sfp->originGrp);
10122
Select (sfp->findthis);
10125
static void ChangeApplyTarget (GrouP g)
10130
sfp = (SourceFormPtr) GetObjectExtra (g);
10131
if (sfp == NULL) return;
10132
val = GetValue (g);
10135
Disable (sfp->qual_to_have);
10136
Disable (sfp->text_to_have);
10139
Enable (sfp->qual_to_have);
10140
Disable (sfp->text_to_have);
10143
Disable (sfp->qual_to_have);
10144
Enable (sfp->text_to_have);
10149
static void ProcessSource (IteM i, Int2 type)
10158
StdEditorProcsPtr sepp;
10166
bfp = currentFormDataPtr;
10168
bfp = GetObjectExtra (i);
10170
if (bfp == NULL) return;
10171
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
10172
if (sep == NULL) return;
10173
sfp = (SourceFormPtr) MemNew (sizeof (SourceFormData));
10174
if (sfp == NULL) return;
10177
case REMOVE_SOURCE :
10178
title = "Source Removal";
10180
case CONVERT_SOURCE :
10181
title = "Source Conversion";
10184
title = "Edit Source";
10187
title = "Add Source";
10193
w = FixedWindow (-50, -33, -10, -10, title, StdCloseWindowProc);
10194
SetObjectExtra (w, sfp, CleanupSourceForm);
10195
sfp->form = (ForM) w;
10196
sfp->formmessage = SourceMessageProc;
10198
sepp = (StdEditorProcsPtr) GetAppProperty ("StdEditorForm");
10199
if (sepp != NULL) {
10200
SetActivate (w, sepp->activateForm);
10201
sfp->appmessage = sepp->handleMessages;
10204
sfp->input_entityID = bfp->input_entityID;
10205
sfp->input_itemID = bfp->input_itemID;
10206
sfp->input_itemtype = bfp->input_itemtype;
10208
h = HiddenGroup (w, -1, 0, NULL);
10209
SetGroupSpacing (h, 10, 10);
10211
z = HiddenGroup (h, 1, 0, NULL);
10212
if (HasPartsSet (sep)) {
10213
sfp->applyToParts = CheckBox (z, "Apply to segmented parts, not segmented sequence", SourceApplyToPartsProc);
10214
SetObjectExtra (sfp->applyToParts, sfp, NULL);
10215
x = HiddenGroup (z, 2, 0, NULL);
10216
StaticPrompt (x, "Apply only to particular numbered segment", 0, dialogTextHeight, programFont, 'l');
10217
sfp->onlyThisPart = DialogText (x, "", 4, NULL);
10218
Disable (sfp->onlyThisPart);
10220
sfp->onlyThisPart = NULL;
10223
sfp->sourceGroup = HiddenGroup (h, 4, 0, ChangeSourceGroup);
10224
SetObjectExtra (sfp->sourceGroup, sfp, NULL);
10225
RadioButton (sfp->sourceGroup, "Modifiers");
10226
RadioButton (sfp->sourceGroup, "Location");
10227
RadioButton (sfp->sourceGroup, "Origin");
10228
RadioButton (sfp->sourceGroup, "Strings");
10229
SetValue (sfp->sourceGroup, 1);
10231
q = HiddenGroup (h, 0, 0, NULL);
10233
sfp->modGrp = HiddenGroup (q, -4, 0, NULL);
10235
case REMOVE_SOURCE :
10236
StaticPrompt (sfp->modGrp, "Remove", 0, popupMenuHeight, programFont, 'l');
10237
sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_remove_alistX, 0);
10239
case CONVERT_SOURCE :
10240
StaticPrompt (sfp->modGrp, "From", 0, popupMenuHeight, programFont, 'l');
10241
sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
10243
StaticPrompt (sfp->modGrp, "To", 0, popupMenuHeight, programFont, 'l');
10244
sfp->tomod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
10247
StaticPrompt (sfp->modGrp, "Type", 0, popupMenuHeight, programFont, 'l');
10248
sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
10251
StaticPrompt (sfp->modGrp, "Type", 0, popupMenuHeight, programFont, 'l');
10252
sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
10257
Hide (sfp->modGrp);
10259
sfp->genGrp = HiddenGroup (q, 4, 0, NULL);
10261
case REMOVE_SOURCE :
10262
StaticPrompt (sfp->genGrp, "Remove", 0, popupMenuHeight, programFont, 'l');
10263
sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
10264
InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
10265
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10267
case CONVERT_SOURCE :
10268
StaticPrompt (sfp->genGrp, "From", 0, popupMenuHeight, programFont, 'l');
10269
sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
10270
InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
10271
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10273
StaticPrompt (sfp->genGrp, "To", 0, popupMenuHeight, programFont, 'l');
10274
sfp->togen = PopupList (sfp->genGrp, TRUE, NULL);
10275
InitEnumPopup (sfp->togen, biosource_genome_alistX, NULL);
10276
SetEnumPopup (sfp->togen, biosource_genome_alistX, 0);
10279
StaticPrompt (sfp->genGrp, "Type", 0, popupMenuHeight, programFont, 'l');
10280
sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
10281
InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
10282
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10285
StaticPrompt (sfp->genGrp, "Type", 0, popupMenuHeight, programFont, 'l');
10286
sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
10287
InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
10288
SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
10293
Hide (sfp->genGrp);
10295
sfp->refGrp = HiddenGroup (q, 4, 0, NULL);
10297
case REMOVE_SOURCE :
10298
StaticPrompt (sfp->refGrp, "Remove", 0, popupMenuHeight, programFont, 'l');
10299
sfp->fromref = PopupList (sfp->refGrp, TRUE, NULL);
10300
InitEnumPopup (sfp->fromref, orgref_textfield_alist, NULL);
10301
SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
10303
case CONVERT_SOURCE :
10304
StaticPrompt (sfp->refGrp, "From", 0, popupMenuHeight, programFont, 'l');
10305
sfp->fromref = PopupList (sfp->refGrp, TRUE, NULL);
10306
InitEnumPopup (sfp->fromref, orgref_textfield_alist, NULL);
10307
SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
10309
StaticPrompt (sfp->refGrp, "To", 0, popupMenuHeight, programFont, 'l');
10310
sfp->toref = PopupList (sfp->refGrp, TRUE, NULL);
10311
InitEnumPopup (sfp->toref, orgref_textfield_alist, NULL);
10312
SetEnumPopup (sfp->toref, orgref_textfield_alist, 0);
10315
StaticPrompt (sfp->refGrp, "Type", 0, popupMenuHeight, programFont, 'l');
10316
sfp->fromref = PopupList (sfp->refGrp, TRUE, NULL);
10317
InitEnumPopup (sfp->fromref, orgref_textfield_alist, NULL);
10318
SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
10325
Hide (sfp->refGrp);
10327
Show (sfp->modGrp);
10329
sfp->txtGrp = NULL;
10331
case REMOVE_SOURCE :
10332
case CONVERT_SOURCE :
10333
sfp->txtGrp = HiddenGroup (h, 0, 3, NULL);
10334
StaticPrompt (sfp->txtGrp, "Optional string constraint for item to change", 0, dialogTextHeight, programFont, 'c');
10335
sfp->findthis = DialogText (sfp->txtGrp, "", 14, NULL);
10338
sfp->txtGrp = HiddenGroup (h, 2, 0, NULL);
10339
StaticPrompt (sfp->txtGrp, "Text", 0, dialogTextHeight, programFont, 'c');
10340
sfp->findthis = DialogText (sfp->txtGrp, "", 14, NULL);
10343
sfp->txtGrp = HiddenGroup (h, 2, 0, NULL);
10344
StaticPrompt (sfp->txtGrp, "Find", 0, dialogTextHeight, programFont, 'l');
10345
sfp->findthis = DialogText (sfp->txtGrp, "", 14, NULL);
10346
StaticPrompt (sfp->txtGrp, "Replace", 0, dialogTextHeight, programFont, 'l');
10347
sfp->replacewith = DialogText (sfp->txtGrp, "", 14, NULL);
10353
/* Build origin group */
10355
case REMOVE_SOURCE :
10356
sfp->originGrp = HiddenGroup (h, 2, 0, NULL);
10357
StaticPrompt (sfp->originGrp, "Remove", 0, dialogTextHeight, programFont, 'l');
10358
sfp->fromorigin = PopupList (sfp->originGrp, TRUE, NULL);
10359
InitEnumPopup (sfp->fromorigin, origin_alist, NULL);
10363
sfp->originGrp = HiddenGroup (h, 2, 0, NULL);
10364
StaticPrompt (sfp->originGrp, "Origin", 0, dialogTextHeight, programFont, 'l');
10365
sfp->fromorigin = PopupList (sfp->originGrp, TRUE, NULL);
10366
InitEnumPopup (sfp->fromorigin, origin_alist, NULL);
10368
case CONVERT_SOURCE :
10369
sfp->originGrp = HiddenGroup (h, 4, 0, NULL);
10370
StaticPrompt (sfp->originGrp, "From", 0, dialogTextHeight, programFont, 'l');
10371
sfp->fromorigin = PopupList (sfp->originGrp, TRUE, NULL);
10372
InitEnumPopup (sfp->fromorigin, origin_alist, NULL);
10373
StaticPrompt (sfp->originGrp, "To", 0, dialogTextHeight, programFont, 'l');
10374
sfp->toorigin = PopupList (sfp->originGrp, TRUE, NULL);
10375
InitEnumPopup (sfp->toorigin, origin_alist, NULL);
10378
SafeHide (sfp->originGrp);
10380
sfp->applyChoiceGrp = HiddenGroup (h, 1, 3, ChangeApplyTarget);
10381
SetObjectExtra (sfp->applyChoiceGrp, sfp, NULL);
10382
RadioButton (sfp->applyChoiceGrp, "To every biosource");
10383
RadioButton (sfp->applyChoiceGrp, "When qualifier present");
10384
sfp->qual_to_have = PopupOrSingleList (sfp->applyChoiceGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
10385
RadioButton (sfp->applyChoiceGrp, "When any qualifier or the organism name contains");
10386
sfp->text_to_have = DialogText (sfp->applyChoiceGrp, "", 14, NULL);
10387
SetValue (sfp->applyChoiceGrp, 1);
10388
Disable (sfp->qual_to_have);
10389
Disable (sfp->text_to_have);
10391
c = HiddenGroup (h, 5, 0, NULL);
10392
b = DefaultButton (c, "Accept", DoProcessSource);
10393
SetObjectExtra (b, sfp, NULL);
10394
PushButton (c, "Cancel", StdCancelButtonProc);
10395
b = PushButton (c, "Clear", ClearProcessSourceDlg);
10396
SetObjectExtra (b, sfp, NULL);
10397
b = PushButton (c, "Clear Text", ClearProcessSourceDlgText);
10398
SetObjectExtra (b, sfp, NULL);
10399
sfp->leaveDlgUp = CheckBox (c, "Leave Dialog Up", NULL);
10401
AlignObjects (ALIGN_CENTER, (HANDLE) sfp->applyChoiceGrp, (HANDLE) c,
10402
(HANDLE) sfp->sourceGroup,
10403
(HANDLE) sfp->modGrp, (HANDLE) sfp->genGrp,
10404
(HANDLE) sfp->refGrp, (HANDLE) sfp->txtGrp,
10405
(HANDLE) sfp->originGrp, NULL);
10408
Select (sfp->findthis);
10412
extern void RemoveSource (IteM i);
10413
extern void ConvertSource (IteM i);
10414
extern void EditSource (IteM i);
10415
extern void AddSource (IteM i);
10417
extern void RemoveSource (IteM i)
10420
ProcessSource (i, REMOVE_SOURCE);
10423
extern void ConvertSource (IteM i)
10426
ProcessSource (i, CONVERT_SOURCE);
10429
extern void EditSource (IteM i)
10432
ProcessSource (i, EDIT_SOURCE);
10435
extern void AddSource (IteM i)
10438
ProcessSource (i, ADD_SOURCE);