5174
5858
SeqEdPaste (sefp);
5177
static void SeqEdCut (SeqEdFormPtr sefp)
5179
if (sefp == NULL || sefp->edit_pos_start == sefp->edit_pos_end) return;
5181
if (AddJournalEntry (eSeqEdDelete, sefp->edit_pos_start,
5182
sefp->edit_pos_end - sefp->edit_pos_start,
5185
sefp->edit_pos_end = sefp->edit_pos_start;
5186
StringToClipboard (sefp->last_journal_entry->char_data);
5861
static void ChooseGapType (GrouP g)
5865
t = GetObjectExtra (g);
5870
if (GetValue (g) == 2)
5880
static void MakeGapFeats (
5888
BioseqPtr fakebsp = NULL;
5890
ValNodePtr PNTR gapvnp;
5893
SeqAnnotPtr sap = NULL;
5899
if (bsp == NULL || bsp->repr != Seq_repr_delta) return;
5900
gapvnp = (ValNodePtr PNTR) userdata;
5901
sip = SeqIdFindBest (bsp->id, 0);
5902
if (sip == NULL) return;
5904
for (vnp = (ValNodePtr)(bsp->seq_ext); vnp != NULL; vnp = vnp->next) {
5905
if (vnp->choice == 1) {
5906
slp = (SeqLocPtr) vnp->data.ptrvalue;
5907
if (slp == NULL) continue;
5908
currpos += SeqLocLen (slp);
5910
if (vnp->choice == 2) {
5911
litp = (SeqLitPtr) vnp->data.ptrvalue;
5912
if (litp == NULL) continue;
5913
if (litp->seq_data == NULL && litp->length > 0) {
5914
if (fakebsp == NULL) {
5915
/* to be freed with MemFree, not BioseqFree */
5916
fakebsp = MemNew (sizeof (Bioseq));
5917
if (fakebsp == NULL) return;
5918
sap = SeqAnnotNew ();
5919
if (sap == NULL) return;
5921
fakebsp->annot = sap;
5922
ValNodeAddPointer (gapvnp, 0, (Pointer) fakebsp);
5924
ifp = ImpFeatNew ();
5925
if (ifp == NULL) continue;
5926
ifp->key = StringSave ("gap");
5927
sfp = SeqFeatNew ();
5928
if (sfp == NULL) continue;
5929
sfp->data.choice = SEQFEAT_IMP;
5930
sfp->data.value.ptrvalue = (Pointer) ifp;
5931
sfp->next = (SeqFeatPtr) sap->data;
5932
sap->data = (Pointer) sfp;
5934
if (fuzz != NULL && fuzz->choice == 4 && fuzz->a == 0) {
5935
AddQualifierToFeature (sfp, "estimated_length", "unknown");
5936
sfp->location = AddIntervalToLocation (NULL, sip, currpos, currpos + litp->length - 1, FALSE, FALSE);
5938
sprintf (buf, "%ld", (long) litp->length);
5939
AddQualifierToFeature (sfp, "estimated_length", buf);
5940
sfp->location = AddIntervalToLocation (NULL, sip, currpos, currpos + litp->length - 1, FALSE, FALSE);
5943
currpos += litp->length;
5948
static void FreeSeqEdFormGapFeatList (SeqEdFormPtr sefp)
5951
SeqAnnotPtr sap, sapnext;
5953
if (sefp == NULL || sefp->gapvnp == NULL)
5958
bsp = (BioseqPtr) sefp->gapvnp->data.ptrvalue;
5961
while (sap != NULL) {
5962
sapnext = sap->next;
5967
/* frees fake Bioseq that was created by MemNew, not BioseqNew */
5968
sefp->gapvnp = ValNodeFreeData (sefp->gapvnp);
5971
static void SeqEdReindexGaps (SeqEdFormPtr sefp, BioseqPtr edit_bsp)
5973
FreeSeqEdFormGapFeatList (sefp);
5975
MakeGapFeats (edit_bsp, &(sefp->gapvnp));
5976
SeqMgrClearFeatureIndexes (sefp->input_entityID, NULL);
5977
SeqMgrIndexFeaturesExEx (sefp->input_entityID, NULL, FALSE, FALSE, sefp->gapvnp);
5980
static void SeqEdInsertGapMenuItem (IteM i)
5983
ModalAcceptCancelData acd;
5985
GrouP h, g, k, gap_type_grp, c;
5989
CharPtr gap_len_str;
5990
Int4 gap_type, gap_len;
5991
Boolean is_unknown_gap;
5992
Boolean changed = FALSE;
5994
sefp = (SeqEdFormPtr) GetObjectExtra (i);
5995
if (sefp == NULL || sefp->edit_pos_start < 0)
6000
w = MovableModalWindow(-20, -13, -10, -10, "Insert Gap", NULL);
6001
h = HiddenGroup (w, -1, 0, NULL);
6003
g = HiddenGroup (h, 2, 0, NULL);
6004
gap_type_grp = HiddenGroup (g, 0, 2, ChooseGapType);
6005
RadioButton (gap_type_grp, "Unknown length");
6006
RadioButton (gap_type_grp, "Known length:");
6007
k = HiddenGroup (g, 0, 2, NULL);
6008
StaticPrompt (k, "", 0, popupMenuHeight, programFont, 'l');
6009
gap_len_txt = DialogText (k, "100", 5, NULL);
6011
SetObjectExtra (gap_type_grp, gap_len_txt, NULL);
6012
SetValue (gap_type_grp, 1);
6013
ChooseGapType (gap_type_grp);
6015
c = HiddenGroup (h, 2, 0, NULL);
6016
b = PushButton (c, "Accept", ModalAcceptButton);
6017
SetObjectExtra (b, &acd, NULL);
6018
b = PushButton (c, "Cancel", ModalCancelButton);
6019
SetObjectExtra (b, &acd, NULL);
6020
AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) c, NULL);
6027
acd.accepted = FALSE;
6028
acd.cancelled = FALSE;
6029
while (!acd.accepted && ! acd.cancelled)
6031
ProcessExternalEvent ();
6041
gap_type = GetValue (gap_type_grp);
6044
is_unknown_gap = FALSE;
6048
is_unknown_gap = TRUE;
6051
if (! is_unknown_gap)
6054
gap_len_str = SaveStringFromText (gap_len_txt);
6055
if (!StringHasNoText (gap_len_str))
6057
gap_len = atoi (gap_len_str);
6059
gap_len_str = MemFree (gap_len_str);
6063
Message (MSG_ERROR, "Gap length must be greater than zero!");
6067
RemapSeqEdIntervalForGap (sefp);
6068
SeqEdDelete (sefp, FALSE);
6069
AddJournalEntryEx (eSeqEdInsertGap, sefp->edit_pos_start,
6071
sefp, is_unknown_gap);
6072
SeqEdReindexGaps (sefp, sefp->bfp->bvd.bsp);
5187
6082
ResizeSeqEdView (sefp);
5188
6083
Select (sefp->bfp->bvd.seqView);
5189
6084
inval_panel (sefp->bfp->bvd.seqView, -1, -1);
5190
SeqEdUpdateStatus (sefp);
5194
static void SeqEdCutMenuItem (IteM i)
5198
if (i == NULL) return;
5199
sefp = (SeqEdFormPtr) GetObjectExtra (i);
5204
6088
static void SeqEdCopy (SeqEdFormPtr sefp)
6627
typedef struct finddlgdata
6632
GrouP search_choice_grp;
6633
ButtoN reverse_complement_btn;
6634
PopuP frame_choice_popup;
6637
} FindDlgData, PNTR FindDlgPtr;
6639
static void LIBCALLBACK MatchProc (Int4 position, CharPtr name, CharPtr pattern,
6640
Int2 cutSite, Uint1 strand, Pointer userdata)
6643
ValNodePtr PNTR loc_list;
6645
loc_list = (ValNodePtr PNTR) userdata;
6646
if (loc_list == NULL) return;
6648
ValNodeAddInt (loc_list, 0, position);
6651
static void ConvertIntListToLocList (ValNodePtr loc_list, BioseqPtr bsp, Int4 pattern_len)
6658
if (loc_list == NULL || bsp == NULL || pattern_len == 0)
6663
for (vnp = loc_list; vnp != NULL; vnp = vnp->next)
6665
start = vnp->data.intvalue;
6666
stop = start + pattern_len - 1;
6667
slp = SeqLocIntNew(start, stop, Seq_strand_plus, SeqIdDup(bsp->id));
6668
vnp->data.ptrvalue = slp;
6673
static ValNodePtr FindSeqMatch (BioseqPtr bsp, CharPtr pattern)
6677
ValNodePtr pattern_loc_list = NULL;
6682
if (bsp == NULL || StringHasNoText (pattern))
6687
tbl = SeqSearchNew (MatchProc, &pattern_loc_list);
6688
if (tbl == NULL) return NULL;
6690
SeqSearchAddNucleotidePattern (tbl, "Find", pattern, 1, SEQ_SEARCH_JUST_TOP_STRAND);
6692
spp = SeqPortNew (bsp, 0, bsp->length-1, Seq_strand_plus, Seq_code_iupacna);
6693
SeqPortSeek (spp, 0, SEEK_SET);
6694
ctr = SeqPortRead (spp, buf, 1);
6697
SeqSearchProcessCharacter (tbl, buf[0]);
6698
ctr = SeqPortRead (spp, buf, 1);
6701
SeqSearchFree (tbl);
6702
ConvertIntListToLocList (pattern_loc_list, bsp, StringLen (pattern));
6703
return pattern_loc_list;
6706
static ValNodePtr MergeIntLists (ValNodePtr list1, ValNodePtr list2)
6708
ValNodePtr vnp1, vnp2, new_list = NULL;
6713
while (vnp1 != NULL || vnp2 != NULL)
6717
ValNodeAddInt (&new_list, 0, vnp2->data.intvalue);
6720
else if (vnp2 == NULL)
6722
ValNodeAddInt (&new_list, 0, vnp1->data.intvalue);
6725
else if (vnp1->data.intvalue < vnp2->data.intvalue)
6727
ValNodeAddInt (&new_list, 0, vnp1->data.intvalue);
6730
else if (vnp2->data.intvalue < vnp1->data.intvalue)
6732
ValNodeAddInt (&new_list, 0, vnp2->data.intvalue);
6737
/* values are equal, take only one */
6738
ValNodeAddInt (&new_list, 0, vnp1->data.intvalue);
6746
static ValNodePtr FindTranslationMatchOneFrame
6751
SeqFeatPtr fake_cds;
6758
ValNodePtr pattern_loc_list = NULL, vnp;
6765
CharPtr scratch_pattern;
6767
if (bsp == NULL || StringHasNoText (pattern))
6776
stop = bsp->length - 1;
6777
strand = Seq_strand_plus;
6781
stop = bsp->length - 1;
6782
strand = Seq_strand_plus;
6786
stop = bsp->length - 1;
6787
strand = Seq_strand_plus;
6791
stop = bsp->length - 1;
6792
strand = Seq_strand_minus;
6796
stop = bsp->length - 2;
6797
strand = Seq_strand_minus;
6801
stop = bsp->length - 3;
6802
strand = Seq_strand_minus;
6809
fake_cds = make_fake_cds(bsp, start, stop, strand);
6811
bs = ProteinFromCdRegionEx(fake_cds, TRUE, FALSE);
6812
SeqFeatFree(fake_cds);
6813
if(bs == NULL) return NULL;
6814
frame_str = BSMerge (bs, NULL);
6816
if (frame_str == NULL) return NULL;
6817
scratch_pattern = StringSave (pattern);
6818
if (strand == Seq_strand_minus)
6820
reverse_string (scratch_pattern);
6823
tfp = TextFsaNew ();
6824
TextFsaAdd (tfp, scratch_pattern);
6829
if (strand == Seq_strand_minus)
6831
prot_pos = stop + 1;
6837
pattern_len = StringLen (scratch_pattern);
6838
while (ch != '\0') {
6840
state = TextFsaNext (tfp, state, ch, &matches);
6841
if (matches != NULL)
6843
if (strand == Seq_strand_minus)
6845
/* need to add locations in reverse order */
6846
vnp = ValNodeNew(NULL);
6849
vnp->next = pattern_loc_list;
6850
vnp->data.intvalue = prot_pos - 3;
6851
pattern_loc_list = vnp;
6856
ValNodeAddInt (&pattern_loc_list, 0, prot_pos + 3 - (3 * pattern_len));
6861
if (strand == Seq_strand_minus)
6871
MemFree (frame_str);
6872
MemFree (scratch_pattern);
6874
return pattern_loc_list;
6877
static ValNodePtr FindTranslation (BioseqPtr bsp, CharPtr pattern, Int4 pick_frame)
6880
ValNodePtr loc_list = NULL;
6881
ValNodePtr new_list, comb_list;
6882
if (bsp == NULL || StringHasNoText (pattern))
6887
if (pick_frame < 1 || pick_frame > 6)
6889
for (i = 1; i <= 6; i++)
6891
new_list = FindTranslationMatchOneFrame (bsp, pattern, i);
6892
comb_list = MergeIntLists (loc_list, new_list);
6893
ValNodeFree (new_list);
6894
ValNodeFree (loc_list);
6895
loc_list = comb_list;
6900
loc_list = FindTranslationMatchOneFrame (bsp, pattern, pick_frame);
6902
ConvertIntListToLocList (loc_list, bsp, StringLen (pattern));
6906
static void CleanPattern (CharPtr pattern, Int4 search_choice)
6910
if (pattern == NULL) return;
6911
for (cp = pattern; *cp != 0; cp++)
6913
if (search_choice == 3)
6915
*cp = toupper (*cp);
6919
*cp = tolower (*cp);
5748
6924
static void FindPatternButton (ButtoN b)
5750
6926
SeqEdFormPtr sefp;
5751
DialogBoxDataPtr dbdp;
5752
6928
WindoW wdialog;
5753
ValNodePtr seqloc_list = NULL;
6933
Int4 search_choice = 0;
5760
6935
if (b == NULL) return;
5761
6936
sefp = (SeqEdFormPtr) GetObjectExtra (b);
5762
6937
if (sefp == NULL) return;
5763
6938
wdialog = ParentWindow (b);
5764
dbdp = (DialogBoxDataPtr) GetObjectExtra (wdialog);
5765
strp = GetPatternFromDialogText (dbdp->txt1);
6939
fdp = (FindDlgPtr) GetObjectExtra (wdialog);
6940
strp = GetPatternFromDialogText (fdp->pattern_txt);
6942
if (fdp->search_choice_grp != NULL)
6944
search_choice = GetValue (fdp->search_choice_grp);
6947
CleanPattern (strp, search_choice);
6948
if (GetStatus (fdp->reverse_complement_btn) && search_choice != 3)
6950
complement_string (strp);
6951
reverse_string (strp);
5766
6954
if (strp == NULL) {
5767
SetTitle (dbdp->prompt, "No item found");
6955
SetTitle (fdp->prompt, "No item found");
5770
6959
if (sefp->current_pattern != NULL) {
5771
if ((StringStr(sefp->current_pattern, strp))
6960
if ((StringStr(sefp->current_pattern, strp))
5772
6961
&& (StringLen(sefp->current_pattern) == StringLen (strp))
5773
&& (dbdp->bt2 == NULL || sefp->current_pattern_translate == GetStatus (dbdp->bt2))
5774
&& (dbdp->bt == NULL || sefp->current_pattern_revcomp == GetStatus (dbdp->bt)))
5777
ShowNextSeqEdPattern (sefp);
5781
MemFree (sefp->current_pattern);
6962
&& (fdp->search_choice_grp == NULL
6963
|| (search_choice == 1 && !sefp->current_pattern_translate
6964
&& sefp->current_pattern_revcomp == GetStatus (fdp->reverse_complement_btn))
6965
|| (search_choice == 3 && sefp->current_pattern_translate
6966
&& sefp->current_pattern_translate_frame_choice == GetValue (fdp->frame_choice_popup))))
6969
ShowNextSeqEdPattern (sefp);
6974
MemFree (sefp->current_pattern);
5784
6977
sefp->current_pattern = strp;
5785
6978
if (sefp->match_list != NULL)
5786
6979
sefp->match_list = MatchListFree (sefp->match_list);
5788
sefp->current_pattern_revcomp = (Boolean) GetStatus (dbdp->bt);
5789
if (dbdp->bt2!=NULL)
5790
sefp->current_pattern_translate = (Boolean) GetStatus (dbdp->bt2);
6980
if (search_choice == 1)
6982
sefp->current_pattern_revcomp = (Boolean) GetStatus (fdp->reverse_complement_btn);
6983
sefp->current_pattern_translate = FALSE;
6985
else if (search_choice == 3)
6987
sefp->current_pattern_translate = TRUE;
6988
sefp->current_pattern_translate_frame_choice = GetValue (fdp->frame_choice_popup);
5792
/* construct "list" of seqlocs to search for pattern */
5793
sip = SeqIdFindBest(sefp->bfp->bvd.bsp->id, 0);
5794
if (sip == NULL) return;
5795
slp = SeqLocIntNew (0, sefp->bfp->bvd.bsp->length - 1, Seq_strand_plus, sip);
5796
ValNodeAddPointer (&(seqloc_list), 0, slp);
5798
if (sefp->current_pattern_translate && !sefp->current_pattern_revcomp)
6991
if (sefp->current_pattern_translate)
5800
sefp->match_list = JK_NTPattern2 (strp, seqloc_list, sefp->current_pattern_revcomp,
5801
ObjMgrGetEntityIDForPointer (sefp->bfp->bvd.bsp));
6993
pick_frame = sefp->current_pattern_translate_frame_choice;
6998
sefp->match_list = FindTranslation (sefp->bfp->bvd.bsp, strp, pick_frame);
5805
sefp->match_list = JK_NTPattern (strp, seqloc_list, sefp->current_pattern_revcomp, sefp->bfp->bvd.bsp->mol);
7002
sefp->match_list = FindSeqMatch (sefp->bfp->bvd.bsp, strp);
5807
7004
if (sefp->match_list != NULL) {
5808
7005
count = ValNodeLen (sefp->match_list);
5810
SetTitle (dbdp->prompt, "No item found");
7007
SetTitle (fdp->prompt, "No item found");
5811
7008
else if (count ==1) {
5812
SetTitle (dbdp->prompt, "1 item found");
7009
SetTitle (fdp->prompt, "1 item found");
5814
7011
sprintf (str, "%d items found - next=CTRL->, previous=CTRL<- ", (int) count);
5815
SetTitle (dbdp->prompt, str);
7012
SetTitle (fdp->prompt, str);
5817
7014
ShowNextSeqEdPattern (sefp);
5820
SetTitle (dbdp->prompt, "No item found");
7017
SetTitle (fdp->prompt, "No item found");
7024
static void ChangeSearchChoice (GrouP g)
7030
wdialog = ParentWindow (g);
7031
fdp = (FindDlgPtr) GetObjectExtra (wdialog);
7032
if (fdp == NULL) return;
7036
Enable (fdp->reverse_complement_btn);
7037
Disable (fdp->frame_choice_popup);
7041
Disable (fdp->reverse_complement_btn);
7042
Enable (fdp->frame_choice_popup);
5827
7046
static void SeqEdFindPatternDialog (IteM i)
5829
7048
WindoW w, wdialog;
5830
DialogBoxDataPtr dbdp;
5831
7050
SeqEdFormPtr sefp;
5835
7055
if (i == NULL) return;
5836
7056
sefp = (SeqEdFormPtr) GetObjectExtra (i);
5839
7059
w = ParentWindow (i);
5841
7061
wdialog=FixedWindow (-50, -33, -10, -10, "Find", StdCloseWindowProc);
5842
dbdp = (DialogBoxDataPtr) MemNew (sizeof (DialogBoxData));
5843
SetObjectExtra (wdialog, (Pointer) dbdp, StdCleanupExtraProc);
5848
g1 = HiddenGroup (wdialog, 1, 0, NULL);
5849
StaticPrompt (g1, "Find pattern:", 0, popupMenuHeight, programFont, 'l');
5851
g1 = HiddenGroup (wdialog, 1, 0, NULL);
5852
dbdp->txt1 = ScrollText (g1, 25, 8, programFont, TRUE, NULL);
5853
g3 = HiddenGroup (wdialog, 1, 0, NULL);
5854
dbdp->prompt = StaticPrompt (g3, "", (Int2)(25*stdCharWidth), stdLineHeight, programFont, 'l');
7062
fdp = (FindDlgPtr) MemNew (sizeof (FindDlgData));
7063
SetObjectExtra (wdialog, (Pointer) fdp, StdCleanupExtraProc);
7065
fdp->search_choice_grp = NULL;
7067
h = HiddenGroup (wdialog, -1, 0, NULL);
7069
p1 = StaticPrompt (h, "Find pattern:", 0, popupMenuHeight, programFont, 'l');
7071
fdp->pattern_txt = ScrollText (h, 25, 8, programFont, TRUE, NULL);
7072
fdp->prompt = StaticPrompt (h, "", (Int2)(25*stdCharWidth), stdLineHeight, programFont, 'l');
5855
7073
if (ISA_na(sefp->bfp->bvd.bsp->mol))
5857
g2 = HiddenGroup (wdialog, 4, 0, NULL);
5858
dbdp->bt = CheckBox (g2, "reverse complement", NULL);
5859
SetStatus (dbdp->bt, FALSE);
5860
dbdp->bt2 = CheckBox (g2, "translate sequence", NULL);
5861
SetStatus (dbdp->bt2, FALSE);
5862
b = PushButton (g2, "Find Next", FindPatternButton);
5863
SetObjectExtra (b, sefp, NULL);
5864
PushButton (g2, "Dismiss", StdCancelButtonProc);
7075
fdp->search_choice_grp = NormalGroup (h, 2, 0, "Search in", systemFont, ChangeSearchChoice);
7076
RadioButton (fdp->search_choice_grp, "Nucleotide sequence");
7077
fdp->reverse_complement_btn = CheckBox (fdp->search_choice_grp, "reverse complement", NULL);
7078
SetStatus (fdp->reverse_complement_btn, FALSE);
7079
RadioButton (fdp->search_choice_grp, "Translated frame");
7080
fdp->frame_choice_popup = PopupList (fdp->search_choice_grp, TRUE, NULL);
7081
PopupItem (fdp->frame_choice_popup, "Any");
7082
PopupItem (fdp->frame_choice_popup, "+1");
7083
PopupItem (fdp->frame_choice_popup, "+2");
7084
PopupItem (fdp->frame_choice_popup, "+3");
7085
PopupItem (fdp->frame_choice_popup, "-1");
7086
PopupItem (fdp->frame_choice_popup, "-2");
7087
PopupItem (fdp->frame_choice_popup, "-3");
7088
SetValue (fdp->frame_choice_popup, 1);
7089
Disable (fdp->frame_choice_popup);
7090
SetValue (fdp->search_choice_grp, 1);
7092
g1 = fdp->search_choice_grp;
7093
g2 = HiddenGroup (h, 2, 0, NULL);
7094
b = PushButton (g2, "Find Next", FindPatternButton);
7095
SetObjectExtra (b, sefp, NULL);
7096
PushButton (g2, "Dismiss", StdCancelButtonProc);
5867
g2 = HiddenGroup (wdialog, 2, 0, NULL);
5868
b = PushButton (g2, "Find Next", FindPatternButton);
5869
SetObjectExtra (b, sefp, NULL);
5870
PushButton (g2, "Close", StdCancelButtonProc);
7099
g1 = HiddenGroup (h, 2, 0, NULL);
7100
b = PushButton (g1, "Find Next", FindPatternButton);
7101
SetObjectExtra (b, sefp, NULL);
7102
PushButton (g1, "Close", StdCancelButtonProc);
7105
AlignObjects (ALIGN_CENTER, (HANDLE) p1, (HANDLE) fdp->pattern_txt, (HANDLE)fdp->prompt,
7106
(HANDLE) fdp->search_choice_grp, (HANDLE) g2, NULL);
5872
7107
RealizeWindow (wdialog);
5873
7108
Show (wdialog);
6394
7633
return (ForM) w;
7636
static Int4 GetScrollPosForAlnPos (Int4 aln_pos, BioseqViewPtr bvp)
7638
Int4 aln_line = 0, display_line, mult;
7640
if (bvp == NULL || aln_pos < 0)
7645
aln_line = aln_pos / bvp->CharsAtLine;
7646
if (aln_line >= bvp->TotalLines)
7648
return bvp->TotalLines - 1;
7651
if (bvp->SeqPanLines[aln_line]->bioSeqLine > 0)
7653
mult = aln_line / bvp->SeqPanLines[aln_line]->bioSeqLine;
7656
display_line = aln_line * mult;
7660
display_line = aln_line;
7665
display_line = aln_line;
7668
if (display_line >= bvp->TotalLines)
7670
display_line = bvp->TotalLines - 1;
7673
while (bvp->SeqPanLines[display_line]->bioSeqLine > aln_line
7674
&& display_line > -1)
7679
while (bvp->SeqPanLines[display_line]->bioSeqLine < aln_line
7680
&& display_line < bvp->TotalLines - 1)
7685
if (bvp->SeqPanLines[display_line]->bioSeqLine == aln_line)
7687
while (display_line > -1
7688
&& bvp->SeqPanLines[display_line]->bioSeqLine == aln_line)
7694
return display_line;
7697
static void SeqAlnSelectItem (BioseqViewPtr bvp, Int2 itemID)
7701
for (vnp = bvp->Selection; vnp != NULL; vnp = vnp->next)
7703
if (vnp->data.intvalue == itemID)
7709
ValNodeAddInt (&bvp->Selection, 1, itemID);
7712
static void SeqAlnUnselectItem (BioseqViewPtr bvp, Int2 itemID)
7716
for (vnp = bvp->Selection; vnp != NULL; vnp = vnp->next)
7718
if (vnp->data.intvalue == itemID)
7726
static void SeqAlnScrollToAlnPos (SeqEdFormPtr sefp, Int4 pos)
7729
Int4 scroll_pos, bmax;
7730
WindoW currentport, temport;
7734
|| sefp->bfp == NULL
7735
|| sefp->bfp->bvd.salp == NULL)
7739
aln_len = AlnMgr2GetAlnLength(sefp->bfp->bvd.salp, FALSE);
7745
else if (pos > aln_len)
7750
sb = GetSlateVScrollBar ((SlatE) sefp->bfp->bvd.seqView);
7751
if (sb == NULL) return;
7752
bmax = GetBarMax (sb);
7754
scroll_pos = GetScrollPosForAlnPos (pos, &(sefp->bfp->bvd));
7755
if (scroll_pos > bmax)
7760
SetBarValue (sb, scroll_pos);
7761
currentport = ParentWindow (sefp->bfp->bvd.seqView);
7762
temport = SavePort (currentport);
7763
Select (sefp->bfp->bvd.seqView);
7764
inval_panel (sefp->bfp->bvd.seqView, -1, -1);
7765
RestorePort (temport);
7768
static void SeqAlnGoToAlnPosBtn (ButtoN b)
7774
sefp = (SeqEdFormPtr) GetObjectExtra ((WindoW)ParentWindow (b));
7775
if (sefp == NULL || sefp->bfp == NULL) return;
7777
GetTitle (sefp->goto_txt, str, 15);
7778
if (! CCStrToLong (str, &aln_pos))
7783
SeqAlnScrollToAlnPos (sefp, aln_pos);
7786
static void SeqAlnGoToSeqPosBtn (ButtoN b)
7789
Int4 seq_pos, aln_pos;
7794
sefp = (SeqEdFormPtr) GetObjectExtra ((WindoW)ParentWindow (b));
7796
|| sefp->bfp == NULL
7797
|| sefp->bfp->bvd.salp == NULL)
7802
sip = AlnMgr2GetNthSeqIdPtr(sefp->bfp->bvd.salp, sefp->bfp->bvd.TargetRow);
7803
bsp = BioseqFind (sip);
7809
GetTitle (sefp->lookat_txt, str, 15);
7810
if (! CCStrToLong (str, &seq_pos))
7819
else if (seq_pos >= bsp->length)
7821
seq_pos = bsp->length - 1;
7824
aln_pos = AlnMgr2MapBioseqToSeqAlign (sefp->bfp->bvd.salp,
7826
sefp->bfp->bvd.TargetRow);
7828
SeqAlnScrollToAlnPos (sefp, aln_pos);
7831
static void SeqAlnClose (SeqEdFormPtr sefp)
7834
if (sefp == NULL) return;
7836
Remove (sefp->form);
7840
static void SeqAlnCloseButton (ButtoN b)
7845
sefp = (SeqEdFormPtr) GetObjectExtra (b);
7849
static void SeqAlnCloseMenuItem (IteM i)
7854
sefp = (SeqEdFormPtr) GetObjectExtra (i);
7858
static Int4 FindMaxLabelLen (SeqAlignPtr salp)
7867
if (salp == NULL) return 0;
7868
for (i = 0; i < salp->dim; i++) {
7869
sip = AlnMgr2GetNthSeqIdPtr(salp, i + 1);
7870
bsp = BioseqFind (sip);
7872
sip = SeqIdFindBestAccession (bsp->id);
7874
SeqIdWrite (sip, tmpbuf, PRINTID_TEXTID_ACCESSION, 41);
7875
len = StringLen (tmpbuf) + 1;
7876
if (len > max_len) {
7883
static CharPtr GetSeqAlignLabels (SeqAlignPtr salp, Int4Ptr label_len)
7890
if (salp == NULL || label_len == NULL) {
7894
*label_len = FindMaxLabelLen (salp);
7895
if (*label_len < 1) return NULL;
7897
labels = (CharPtr) MemNew ((*label_len + 1) * salp->dim * sizeof (Char));
7898
if (labels == NULL) return NULL;
7899
MemSet (labels, 0, *label_len * salp->dim * sizeof (Char));
7901
for (i = 0; i < salp->dim; i++) {
7902
sip = AlnMgr2GetNthSeqIdPtr(salp, i + 1);
7903
bsp = BioseqFind (sip);
7905
sip = SeqIdFindBestAccession (bsp->id);
7907
SeqIdWrite (sip, labels + i * (*label_len + 1) * sizeof (Char),
7908
PRINTID_TEXTID_ACCESSION, *label_len);
7914
WriteAlignmentInterleaveToFile
7917
Int4 seq_chars_per_row,
7918
Boolean show_substitutions)
7920
Int4 row, start, stop;
7924
Int4 aln_len = AlnMgr2GetAlnLength(salp, FALSE);
7926
CharPtr printed_line;
7927
Int4 printed_line_len;
7931
if (salp == NULL || fp == NULL) return;
7933
alnlabels = GetSeqAlignLabels (salp, &label_len);
7934
if (alnlabels != NULL) {
7935
alnbuf = (Uint1Ptr) MemNew ((seq_chars_per_row + 1)* sizeof (Uint1));
7936
if (alnbuf != NULL) {
7937
seqbuf = (Uint1Ptr) MemNew ((seq_chars_per_row + 1) * sizeof (Uint1));
7938
if (seqbuf != NULL) {
7939
printed_line_len = label_len + 1 + seq_chars_per_row + 3;
7940
printed_line = (CharPtr) MemNew (printed_line_len * sizeof (Char));
7941
if (printed_line != NULL) {
7942
printed_line [ printed_line_len - 1] = 0;
7943
printed_line [ printed_line_len - 2] = '\n';
7945
stop = seq_chars_per_row - 1;
7946
while (start < aln_len) {
7947
for (row = 1; row <= salp->dim; row++) {
7948
MemSet (printed_line, ' ', printed_line_len - 2);
7949
label_pos = alnlabels + (row - 1) * (label_len + 1) * sizeof (Char);
7950
MemCpy (printed_line, label_pos, StringLen (label_pos));
7951
AlignmentIntervalToString (salp, row, start, stop, 1, TRUE,
7952
seqbuf, alnbuf, &alnbuf_len,
7953
show_substitutions);
7954
MemCpy (printed_line + label_len + 1, alnbuf, alnbuf_len);
7955
fprintf (fp, printed_line);
7959
stop += seq_chars_per_row;
7961
MemFree (printed_line);
7967
MemFree (alnlabels);
7971
extern void WriteAlignmentContiguousToFile
7974
Int4 seq_chars_per_row,
7975
Boolean show_substitutions)
7978
SeqAlignPtr tmp_salp;
7980
CharPtr PNTR alnlabels = NULL;
7981
Int4Ptr label_len = NULL;
7982
Int4Ptr aln_len = NULL;
7983
Uint1Ptr alnbuf = NULL;
7984
Uint1Ptr seqbuf = NULL;
7985
CharPtr printed_line = NULL;
7987
Int4 printed_line_len;
7989
Int4 row, start, stop;
7991
if (salp == NULL || fp == NULL) return;
7994
for (tmp_salp = salp; tmp_salp != NULL; tmp_salp = tmp_salp->next)
8000
/* get labels and lengths for all segments */
8001
alnlabels = (CharPtr PNTR) MemNew (sizeof (CharPtr) * num_segments);
8002
label_len = (Int4Ptr) MemNew (sizeof (Int4) * num_segments);
8003
aln_len = (Int4Ptr) MemNew (sizeof (Int4) * num_segments);
8004
if (alnlabels != NULL && label_len != NULL && aln_len != NULL)
8006
for (tmp_salp = salp, idx = 0; tmp_salp != NULL && idx < num_segments; tmp_salp = tmp_salp->next, idx++)
8008
alnlabels [idx] = GetSeqAlignLabels (tmp_salp, &label_len[idx]);
8009
aln_len [idx]= AlnMgr2GetAlnLength(tmp_salp, FALSE);
8014
alnbuf = (Uint1Ptr) MemNew (seq_chars_per_row * sizeof (Uint1));
8015
seqbuf = (Uint1Ptr) MemNew (seq_chars_per_row * sizeof (Uint1));
8016
printed_line_len = seq_chars_per_row + 3;
8017
printed_line = (CharPtr) MemNew (printed_line_len * sizeof (Char));
8018
if (alnbuf != NULL && seqbuf != NULL && printed_line != NULL) {
8019
printed_line [ printed_line_len - 1] = 0;
8020
printed_line [ printed_line_len - 2] = '\n';
8022
for (row = 1; row <= salp->dim; row++) {
8023
if (salp->next != NULL)
8025
fprintf (fp, "[\n");
8027
for (tmp_salp = salp, idx = 0;
8028
tmp_salp != NULL && idx < num_segments;
8029
tmp_salp = tmp_salp->next, idx++)
8031
label_pos = alnlabels [idx] + (row - 1) * (label_len[idx] + 1) * sizeof (Char);
8032
fprintf (fp, ">%s\n", label_pos);
8034
stop = seq_chars_per_row - 1;
8035
while (start < aln_len [idx]) {
8036
MemSet (printed_line, ' ', printed_line_len - 2);
8037
AlignmentIntervalToString (tmp_salp, row, start, stop, 1, TRUE,
8038
seqbuf, alnbuf, &alnbuf_len,
8039
show_substitutions);
8040
MemCpy (printed_line, alnbuf, alnbuf_len);
8041
fprintf (fp, printed_line);
8043
stop += seq_chars_per_row;
8047
if (salp->next != NULL)
8049
fprintf (fp, "]\n");
8055
MemFree (printed_line);
8057
MemFree (label_len);
8058
MemFree (alnlabels);
8062
static void SeqAlnExportAln (SeqEdFormPtr sefp, Boolean interleave)
8065
Char path[PATH_MAX];
8067
if (sefp == NULL || sefp->bfp == NULL || sefp->bfp->bvd.salp == NULL)
8072
if (! GetOutputFileName (path, sizeof (path), "")) return;
8073
fp = FileOpen (path, "w");
8076
Message (MSG_ERROR, "Unable to open %s", path);
8081
WriteAlignmentInterleaveToFile (sefp->bfp->bvd.salp, fp,
8082
sefp->bfp->bvd.CharsAtLine,
8083
sefp->bfp->bvd.showAlnSubstitutions);
8085
WriteAlignmentContiguousToFile (sefp->bfp->bvd.salp, fp,
8086
sefp->bfp->bvd.CharsAtLine,
8087
sefp->bfp->bvd.showAlnSubstitutions);
8093
static void SeqAlnExportAlnMenuItem (IteM i, Boolean interleave)
8097
sefp = (SeqEdFormPtr) GetObjectExtra (i);
8098
SeqAlnExportAln (sefp, interleave);
8101
static void SeqAlnExportInterleave (IteM i)
8103
SeqAlnExportAlnMenuItem (i, TRUE);
8106
static void SeqAlnExportContiguous (IteM i)
8108
SeqAlnExportAlnMenuItem (i, FALSE);
8111
static void SeqAlnShowSubstitutionsMenuItem (IteM i)
8116
sefp = (SeqEdFormPtr) GetObjectExtra (i);
8117
if (sefp != NULL && sefp->bfp != NULL)
8119
sefp->bfp->bvd.showAlnSubstitutions = GetStatus (i);
8120
temport = SavePort(sefp->form);
8121
Select (sefp->bfp->bvd.seqView);
8122
inval_panel (sefp->bfp->bvd.seqView, -1, -1);
8123
RestorePort (temport);
8128
static void RemoveSequencesFromAlignment (IteM i)
8135
ValNodePtr sip_list = NULL, vnp;
8137
sefp = (SeqEdFormPtr) GetObjectExtra (i);
8139
if (sefp != NULL && sefp->bfp != NULL && sefp->bfp->bvd.salp != NULL)
8141
sep = GetTopSeqEntryForEntityID (sefp->input_entityID);
8142
/* first, check for pairwise alignments */
8143
for (n = 1; n < sefp->bfp->bvd.salp->dim; n++)
8145
sip = AlnMgr2GetNthSeqIdPtr(sefp->bfp->bvd.salp, n);
8146
bsp = BioseqFind (sip);
8147
if (bsp != NULL && isSelected (bsp->idx.itemID, &(sefp->bfp->bvd)))
8149
if (IsSequenceFirstInPairwise (sep, sip))
8151
Message (MSG_ERROR, "One of the selected sequences is the first in a pairwise alignment."
8152
" You must convert the alignment to a multiple alignment before trying to remove this sequence.");
8153
sip_list = ValNodeFree (sip_list);
8158
ValNodeAddPointer (&sip_list, bsp->idx.itemID, sip);
8163
for (vnp = sip_list; vnp != NULL; vnp = vnp->next)
8165
SeqAlignBioseqDeleteById (sefp->bfp->bvd.salp, vnp->data.ptrvalue);
8166
SeqAlnUnselectItem (&(sefp->bfp->bvd), vnp->choice);
8168
sip_list = ValNodeFree (sip_list);
8169
DeleteMarkedObjects (sefp->input_entityID, 0, NULL);
8170
ObjMgrSetDirtyFlag (sefp->input_entityID, TRUE);
8171
ObjMgrSendMsg (OM_MSG_UPDATE, sefp->input_entityID, 0, 0);
8172
/* reindex alignment */
8173
SAIndex2Free2(sefp->bfp->bvd.salp->saip);
8174
sefp->bfp->bvd.salp->saip = NULL;
8175
AlnMgr2IndexSeqAlign(sefp->bfp->bvd.salp);
8176
/* update alignment editor window */
8177
ResizeSeqEditorWindow ((WindoW)sefp->form);
8181
typedef struct setalntarget
8185
} SetAlnTargetData, PNTR SetAlnTargetPtr;
8187
static void SeqAlnSetTarget (IteM i)
8189
SetAlnTargetPtr satp;
8191
satp = (SetAlnTargetPtr) GetObjectExtra (i);
8192
if (satp != NULL && satp->sefp != NULL
8193
&& satp->sefp->bfp != NULL
8194
&& satp->sefp->bfp->bvd.salp != NULL
8196
&& satp->target <= satp->sefp->bfp->bvd.salp->dim)
8198
satp->sefp->bfp->bvd.TargetRow = satp->target;
8199
ResizeSeqEditorWindow ((WindoW) satp->sefp->form);
8203
static void SeqAlnValidateAlignment (IteM i)
8207
sefp = (SeqEdFormPtr) GetObjectExtra (i);
8208
if (sefp == NULL) return;
8210
ValidateSeqAlign (sefp->bfp->bvd.salp, 0, TRUE, TRUE, TRUE, FALSE, FALSE, NULL);
8213
static void CreateAlnMenus (WindoW w)
8221
SetAlnTargetPtr satp;
8226
if (w == NULL) return;
8227
sefp = (SeqEdFormPtr) GetObjectExtra (w);
8228
if (sefp == NULL) return;
8231
edit_menu = PulldownMenu (w, "File");
8232
sub = SubMenu (edit_menu, "Export");
8233
localItem = CommandItem (sub, "Interleave", SeqAlnExportInterleave);
8234
SetObjectExtra (localItem, sefp, NULL);
8235
localItem = CommandItem (sub, "Contiguous", SeqAlnExportContiguous);
8236
SetObjectExtra (localItem, sefp, NULL);
8238
localItem = CommandItem (edit_menu, "Close", SeqAlnCloseMenuItem);
8239
SetObjectExtra (localItem, sefp, NULL);
8242
edit_menu = PulldownMenu (w, "Edit");
8243
localItem = CommandItem (edit_menu, "Remove Sequences From Alignment",
8244
RemoveSequencesFromAlignment);
8245
SetObjectExtra (localItem, sefp, NULL);
8246
localItem = CommandItem (edit_menu, "Validate Alignemtn", SeqAlnValidateAlignment);
8247
SetObjectExtra (localItem, sefp, NULL);
8250
edit_menu = PulldownMenu (w, "View");
8251
sub = SubMenu (edit_menu, "Target");
8252
for (n = 1; n <= sefp->bfp->bvd.salp->dim; n++)
8254
sip = AlnMgr2GetNthSeqIdPtr(sefp->bfp->bvd.salp, n);
8255
bsp = BioseqFind (sip);
8258
sip = SeqIdFindBestAccession (bsp->id);
8260
SeqIdWrite (sip, label, PRINTID_REPORT, sizeof (label) - 1);
8261
localItem = CommandItem (sub, label, SeqAlnSetTarget);
8262
satp = (SetAlnTargetPtr) MemNew (sizeof (SetAlnTargetData));
8268
SetObjectExtra (localItem, satp, StdCleanupExtraProc);
8270
localItem = StatusItem (edit_menu, "Show Substitutions", SeqAlnShowSubstitutionsMenuItem);
8271
SetObjectExtra (localItem, sefp, NULL);
8274
extern ForM CreateAlnEditorWindow (Int2 left, Int2 top, CharPtr windowname, SeqAlignPtr salp, Uint2 entityID)
8280
Int2 window_width = 650;
8281
Int2 window_hgt = 300,
8286
OMUserDataPtr omudp;
8293
sefp = SeqEdFormNew ();
8300
font = ParseFont ("Monaco, 9");
8303
font = ParseFont ("Courier, 9");
8306
font = ParseFont ("fixed, 12");
8309
charwidth = CharWidth ('0');
8310
lineheight = FontHeight () + SEQ_Y_OFFSET;
8312
w = DocumentWindow (left, top, (Int2)(-10), (Int2)(-10), windowname, NULL, ResizeSeqEditorWindow);
8313
SetObjectExtra (w, (Pointer) sefp, CleanupSeqEdForm);
8314
sefp->form = (ForM) w;
8315
sefp->formmessage = SeqEdFormMessage;
8317
sefp->input_entityID = entityID;
8319
/* initialize view pointer */
8320
sefp->bfp = (BioseqViewFormPtr) MemNew (sizeof (BioseqViewForm));
8321
if (sefp->bfp == NULL) return NULL;
8323
sefp->bfp->bvd.seqAlignMode = TRUE;
8324
sefp->bfp->bvd.salp = salp;
8325
AlnMgr2IndexSeqAlign(sefp->bfp->bvd.salp);
8326
sip = AlnMgr2GetNthSeqIdPtr(sefp->bfp->bvd.salp, 1);
8327
sefp->bfp->bvd.bsp = BioseqFind (sip);
8328
sefp->bfp->bvd.TargetRow = 1;
8329
sefp->bfp->bvd.DrawGrid = FALSE;
8330
sefp->bfp->bvd.SeqStartPosX = (FindMaxLabelLen (sefp->bfp->bvd.salp) + 10) * charwidth;
8331
sefp->bfp->bvd.CharHeight = FontHeight ();
8332
sefp->bfp->bvd.displayFont = font;
8333
sefp->bfp->bvd.LineHeight = lineheight;
8334
sefp->bfp->bvd.CharWidth = charwidth;
8335
sefp->bfp->bvd.seq_entityID = sefp->input_entityID;
8336
sefp->bfp->bvd.on_the_fly = FALSE;
8337
sefp->bfp->bvd.showAlnSubstitutions = FALSE;
8342
sefp->upper_button_group = HiddenGroup (w, -10, -10, NULL);
8343
SetGroupSpacing (sefp->upper_button_group, 10, 3);
8345
g = HiddenGroup (sefp->upper_button_group, btns_across, 0, NULL);
8346
SetGroupSpacing (g, 10, 3);
8347
sprintf (str, "%ld", (long) sefp->edit_pos_start);
8348
sefp->goto_btn = PushButton (g, "Go to alignment position:", SeqAlnGoToAlnPosBtn);
8349
sefp->goto_txt = DialogText (g, str, (Int2)6, NULL);
8350
sefp->lookat_btn = PushButton (g, "Go to sequence position:", SeqAlnGoToSeqPosBtn);
8351
sefp->lookat_txt = DialogText (g, str, (Int2)6, NULL);
8353
/* numbering location and grid controls */
8354
StaticPrompt (g, " Numbering: ", 0, popupMenuHeight, programFont, 'l');
8355
sefp->bfp->bvd.newNumControl = PopupList (g, TRUE, ChangeSeqEditControls);
8356
SetObjectExtra (sefp->bfp->bvd.newNumControl, sefp, NULL);
8357
PopupItem (sefp->bfp->bvd.newNumControl, "None");
8358
PopupItem (sefp->bfp->bvd.newNumControl, "Side");
8359
PopupItem (sefp->bfp->bvd.newNumControl, "Top");
8360
SetValue (sefp->bfp->bvd.newNumControl, 3);
8361
StaticPrompt (g, " Grid: ", 0, popupMenuHeight, programFont, 'l');
8362
sefp->bfp->bvd.newGridControl = PopupList (g, TRUE, ChangeSeqEditControls);
8363
SetObjectExtra (sefp->bfp->bvd.newGridControl, sefp, NULL);
8364
PopupItem (sefp->bfp->bvd.newGridControl, "On");
8365
PopupItem (sefp->bfp->bvd.newGridControl, "Off");
8366
SetValue (sefp->bfp->bvd.newGridControl, 2);
8368
g = HiddenGroup (w, 1, 0, NULL);
8370
sefp->position_label = StaticPrompt (g, "", window_width, dialogTextHeight, programFont, 'l');
8371
SeqEdUpdateStatus (sefp);
8373
g = HiddenGroup (w, 1, 0, NULL);
8375
sefp->bfp->bvd.seqView = AutonomousPanel4 (g, window_width, window_hgt, onDrawSeqPanel, onVScrollBarSeqPanel, NULL, sizeof (BioseqViewPtr), onCloseSeqPanel, NULL);
8377
SetObjectExtra (sefp->bfp->bvd.seqView, sefp->bfp, NULL);
8379
sefp->lower_button_group = HiddenGroup (w, 6, 0, NULL);
8380
SetGroupSpacing (sefp->lower_button_group, 10, 3);
8381
StaticPrompt (sefp->lower_button_group, "Features:", 0, dialogTextHeight, programFont, 'l');
8382
sefp->bfp->bvd.newFeatControl = PopupList (sefp->lower_button_group, TRUE, ChangeSeqEditControls);
8383
PopupItem (sefp->bfp->bvd.newFeatControl, "Target Sequence");
8384
PopupItem (sefp->bfp->bvd.newFeatControl, "Hidden");
8385
PopupItem (sefp->bfp->bvd.newFeatControl, "All Sequences");
8386
SetValue (sefp->bfp->bvd.newFeatControl, 2);
8387
SetObjectExtra (sefp->bfp->bvd.newFeatControl, sefp, NULL);
8388
sefp->accept = PushButton (sefp->lower_button_group, "Close", SeqAlnCloseButton);
8389
SetObjectExtra (sefp->accept, sefp, NULL);
8390
ResizeSeqView (&(sefp->bfp->bvd));
8392
/* SetSlateChar ((SlatE) sefp->bfp->bvd.seqView, SeqEdOnKey); */
8393
SetSeqAlnPanelClick (sefp);
8395
/* register to receive update messages */
8396
sefp->userkey = OMGetNextUserKey ();
8398
sefp->proctype = OMPROC_EDIT;
8399
omudp = ObjMgrAddUserData (sefp->input_entityID, sefp->procid, sefp->proctype, sefp->userkey);
8400
if (omudp != NULL) {
8401
omudp->userdata.ptrvalue = (Pointer) sefp;
8402
omudp->messagefunc = SeqEditMsgFunc;
6398
8409
BioseqPageData seqpnlPageData = {
6399
8410
"Sequence", TRUE, TRUE, TRUE, FALSE, -1,