summaryrefslogtreecommitdiff
path: root/sequin/sequin7.c
diff options
context:
space:
mode:
Diffstat (limited to 'sequin/sequin7.c')
-rw-r--r--sequin/sequin7.c202
1 files changed, 190 insertions, 12 deletions
diff --git a/sequin/sequin7.c b/sequin/sequin7.c
index 7b8c7e92..63218505 100644
--- a/sequin/sequin7.c
+++ b/sequin/sequin7.c
@@ -29,7 +29,7 @@
*
* Version Creation Date: 1/3/98
*
-* $Revision: 6.144 $
+* $Revision: 6.148 $
*
* File Description:
*
@@ -7195,9 +7195,11 @@ static Boolean CDSMeetsStringConstraint (SeqFeatPtr sfp,
extern Boolean MeetsStringConstraint (SeqFeatPtr sfp,
CharPtr findThisStr)
{
- GBQualPtr gbqp;
- GeneRefPtr grp;
- RnaRefPtr rrp;
+ GBQualPtr gbqp;
+ GeneRefPtr grp;
+ RnaRefPtr rrp;
+ SeqMgrFeatContext context;
+ Boolean have_context = FALSE;
/* If no string constraint, then everyone matches */
@@ -7226,6 +7228,15 @@ extern Boolean MeetsStringConstraint (SeqFeatPtr sfp,
gbqp = gbqp->next;
}
+ if (SeqMgrGetDesiredFeature (sfp->idx.entityID, NULL, 0, 0, sfp, &context) != NULL)
+ {
+ if (StringISearch (context.label, findThisStr))
+ {
+ return TRUE;
+ }
+ have_context = TRUE;
+ }
+
if (sfp->data.choice == SEQFEAT_GENE)
{
grp = sfp->data.value.ptrvalue;
@@ -7250,6 +7261,15 @@ extern Boolean MeetsStringConstraint (SeqFeatPtr sfp,
if (StringISearch ((CharPtr) rrp->ext.value.ptrvalue, findThisStr))
return TRUE;
}
+ else if (rrp->type == 3 && rrp->ext.choice == 2 && have_context)
+ {
+ /* look for the label as it appears to the user */
+ if (StringNCmp(findThisStr, "tRNA-", 5) == 0
+ && StringISearch (context.label, findThisStr + 5))
+ {
+ return TRUE;
+ }
+ }
}
/* If we got to here, then the string constraint was not found */
@@ -8123,7 +8143,7 @@ static void MarkProteinCallback (SeqEntryPtr sep, Pointer mydata, Int4 index, In
}
}
-extern void RemoveProteins (IteM i)
+extern void RemoveProteinsAndOptionallyRenormalize (IteM i, Boolean renormalize)
{
BaseFormPtr bfp;
@@ -8167,12 +8187,26 @@ extern void RemoveProteins (IteM i)
ValNodeFree (vnp);
SeqMgrLinkSeqEntry (sep, parenttype, parentptr);
RestoreSeqEntryObjMgrData (sep, omdptop, &omdata);
+ if (renormalize)
+ {
+ RenormalizeNucProtSets (sep, TRUE);
+ }
ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
ObjMgrDeSelect (0, 0, 0, 0, NULL);
Update ();
}
+extern void RemoveProteins (IteM i)
+{
+ RemoveProteinsAndOptionallyRenormalize (i, FALSE);
+}
+
+extern void RemoveProteinsAndRenormalize (IteM i)
+{
+ RemoveProteinsAndOptionallyRenormalize (i, TRUE);
+}
+
#define EDIT_FIVE_PRIME 1
#define EDIT_THREE_PRIME 2
@@ -9009,7 +9043,7 @@ WriteAlignmentInterleaveToFile
MemSet (printed_line, ' ', printed_line_len - 2);
label_pos = alnlabels + (row - 1) * (label_len + 1) * sizeof (Char);
MemCpy (printed_line, label_pos, StringLen (label_pos));
- AlignmentIntervalToString (salp, row, start, stop, 1, FALSE,
+ AlignmentIntervalToString (salp, row, start, stop, 1, TRUE,
seqbuf, alnbuf, &alnbuf_len);
MemCpy (printed_line + label_len + 1, alnbuf, alnbuf_len);
fprintf (fp, printed_line);
@@ -9028,8 +9062,95 @@ WriteAlignmentInterleaveToFile
}
}
+static void WriteAlignmentContiguousToFile
+(SeqAlignPtr salp,
+ FILE *fp)
+{
+ Int4 num_segments;
+ SeqAlignPtr tmp_salp;
+ Int4 idx;
+ CharPtr PNTR alnlabels = NULL;
+ Int4Ptr label_len = NULL;
+ Int4Ptr aln_len = NULL;
+ Uint1Ptr alnbuf = NULL;
+ Uint1Ptr seqbuf = NULL;
+ CharPtr printed_line = NULL;
+ Int4 alnbuf_len;
+ Int4 printed_line_len;
+ CharPtr label_pos;
+ Int4 row, start, stop;
+ Int4 seq_chars_per_row = 80;
+
+ if (salp == NULL || fp == NULL) return;
+
+ num_segments = 0;
+ for (tmp_salp = salp; tmp_salp != NULL; tmp_salp = tmp_salp->next)
+ {
+ num_segments++;
+ }
+
+
+ /* get labels and lengths for all segments */
+ alnlabels = (CharPtr PNTR) MemNew (sizeof (CharPtr) * num_segments);
+ label_len = (Int4Ptr) MemNew (sizeof (Int4) * num_segments);
+ aln_len = (Int4Ptr) MemNew (sizeof (Int4) * num_segments);
+ if (alnlabels != NULL && label_len != NULL && aln_len != NULL)
+ {
+ for (tmp_salp = salp, idx = 0; tmp_salp != NULL, idx < num_segments; tmp_salp = tmp_salp->next, idx++)
+ {
+ alnlabels [idx] = GetSeqAlignLabels (tmp_salp, &label_len[idx]);
+ aln_len [idx]= AlnMgr2GetAlnLength(tmp_salp, FALSE);
+
+ }
+
+ /* get buffers */
+ alnbuf = (Uint1Ptr) MemNew (seq_chars_per_row * sizeof (Uint1));
+ seqbuf = (Uint1Ptr) MemNew (seq_chars_per_row * sizeof (Uint1));
+ printed_line_len = seq_chars_per_row + 3;
+ printed_line = (CharPtr) MemNew (printed_line_len * sizeof (Char));
+ if (alnbuf != NULL && seqbuf != NULL && printed_line != NULL) {
+ printed_line [ printed_line_len - 1] = 0;
+ printed_line [ printed_line_len - 2] = '\n';
+
+ for (row = 1; row <= salp->dim; row++) {
+ if (salp->next != NULL)
+ {
+ fprintf (fp, "[\n");
+ }
+ for (tmp_salp = salp, idx = 0; tmp_salp != NULL, idx < num_segments; tmp_salp = tmp_salp->next, idx++)
+ {
+ label_pos = alnlabels [idx] + (row - 1) * (label_len[idx] + 1) * sizeof (Char);
+ fprintf (fp, ">%s\n", label_pos);
+ start = 0;
+ stop = seq_chars_per_row - 1;
+ while (start < aln_len [idx]) {
+ MemSet (printed_line, ' ', printed_line_len - 2);
+ AlignmentIntervalToString (tmp_salp, row, start, stop, 1, TRUE,
+ seqbuf, alnbuf, &alnbuf_len);
+ MemCpy (printed_line, alnbuf, alnbuf_len);
+ fprintf (fp, printed_line);
+ start = stop + 1;
+ stop += seq_chars_per_row;
+ }
+ fprintf (fp, "\n");
+ }
+ if (salp->next != NULL)
+ {
+ fprintf (fp, "]\n");
+ }
+ }
+ }
+ MemFree (alnbuf);
+ MemFree (seqbuf);
+ MemFree (printed_line);
+ }
+ MemFree (label_len);
+ MemFree (alnlabels);
+ MemFree (aln_len);
+}
+
static void
-WriteAlignmentContiguousToFile
+OldWriteAlignmentContiguousToFile
(SeqAlignPtr salp,
FILE *fp)
{
@@ -9085,26 +9206,83 @@ WriteAlignmentContiguousToFile
}
}
+static SetAlignmentDim (SeqAlignPtr salp)
+{
+ AMAlignIndex2Ptr amaip;
+ DenseSegPtr dsp;
+
+ if (salp == NULL || salp->dim > 0 || salp->saip == NULL) return;
+
+ if (salp->saip->indextype == INDEX_PARENT)
+ {
+ amaip = (AMAlignIndex2Ptr)(salp->saip);
+ salp->dim = amaip->sharedaln->dim;
+ }
+ else if (salp->saip->indextype == INDEX_CHILD)
+ {
+ dsp = (DenseSegPtr)(salp->segs);
+ salp->dim = dsp->dim;
+ }
+}
+
+static void IndexAlignmentSet (SeqAlignPtr salp)
+{
+ SeqAlignPtr tmp_salp, next_salp;
+
+ if (salp == NULL || salp->saip != NULL) return;
+
+ if (salp->next != NULL && salp->dim > 2)
+ {
+ for (tmp_salp = salp; tmp_salp != NULL; tmp_salp = tmp_salp->next)
+ {
+ next_salp = tmp_salp->next;
+ tmp_salp->next = NULL;
+ if (tmp_salp->segtype == SAS_DENSEG && tmp_salp->next == NULL) {
+ AlnMgr2IndexSingleChildSeqAlign(tmp_salp);
+ } else {
+ AlnMgr2IndexSeqAlign(tmp_salp);
+ }
+ SetAlignmentDim (tmp_salp);
+ tmp_salp->next = next_salp;
+ }
+ }
+ else
+ {
+ if (salp->segtype == SAS_DENSEG && salp->next == NULL) {
+ AlnMgr2IndexSingleChildSeqAlign(salp);
+ } else {
+ AlnMgr2IndexSeqAlign(salp);
+ }
+ SetAlignmentDim (salp);
+ }
+}
+
static void WriteSeqEntryAlignmentToFile (SeqEntryPtr sep, FILE *fp, Boolean Interleave)
{
BioseqSetPtr bssp;
SeqAnnotPtr sap;
- SeqAlignPtr salp;
+ SeqAlignPtr salp = NULL;
if (sep == NULL || ! IS_Bioseq_set (sep)) return;
bssp = (BioseqSetPtr) sep->data.ptrvalue;
if (bssp == NULL) return;
for (sap = bssp->annot; sap != NULL; sap = sap->next) {
if (sap->type == 2) {
- salp = (SeqAlignPtr) sap->data;
- if (salp->saip == NULL) {
- AlnMgr2IndexSingleChildSeqAlign (salp);
- }
+ salp = SeqAlignListDup((SeqAlignPtr) sap->data);
+ IndexAlignmentSet (salp);
+
if (Interleave) {
+ if (salp->next != NULL)
+ {
+ Message (MSG_ERROR, "Unable to write segmented alignments as interleave");
+ return;
+ }
WriteAlignmentInterleaveToFile (salp, fp);
} else {
WriteAlignmentContiguousToFile (salp, fp);
}
+ SeqAlignFree (salp);
+ salp = NULL;
}
}