📄 xmenu.c
字号:
if(aln_mode==MULTIPLEM)
{
remove_gap_pos(1,nseqs,0);
load_aln(seq_panel,0,nseqs-1,FALSE);
}
else
{
remove_gap_pos(1,profile1_nseqs,1);
load_aln(prf_panel[0],0,profile1_nseqs-1,FALSE);
remove_gap_pos(profile1_nseqs+1,nseqs,2);
load_aln(prf_panel[1],profile1_nseqs,nseqs-1,FALSE);
}
info("Gap positions removed.");
}
static void RemoveGaps(IteM item)
{
int i,j,sl;
panel_data data;
Boolean sel=FALSE;
if (nseqs==0)
{
Message(MSG_OK,"No file loaded.");
return;
}
GetPanelExtra(active_panel.names,&data);
for (i=0;i<data.nseqs;i++)
if(data.selected[i]==TRUE)
{
sel=TRUE;
break;
}
if(sel==FALSE)
{
Message(MSG_OK,"Select sequences by clicking on the names.");
return;
}
if (Message(MSG_YN,"Remove gaps from selected sequences ?")==ANS_NO)
return;
for (i=data.firstseq+1;i<=data.firstseq+data.nseqs;i++)
if(data.selected[i-data.firstseq-1]==TRUE)
{
sl=0;
for(j=1;j<=seqlen_array[i];++j) {
if((seq_array[i][j] == gap_pos1) ||
(seq_array[i][j] == gap_pos2)) continue;
++sl;
seq_array[i][sl]=seq_array[i][j];
}
seq_array[i][sl+1]=-3;
seqlen_array[i]=sl;
}
load_aln(active_panel,data.firstseq,data.firstseq+data.nseqs-1,FALSE);
active_panel.modified=TRUE;
info("Gaps in selected sequences removed.");
}
static void CutSequences(IteM item)
{
int i,pos;
Boolean sel=FALSE;
panel_data data;
if (nseqs==0)
{
Message(MSG_OK,"No file loaded.");
return;
}
GetPanelExtra(active_panel.names,&data);
for (i=0;i<data.nseqs;i++)
if(data.selected[i]==TRUE)
{
sel=TRUE;
pos=i;
break;
}
if(sel==FALSE)
{
Message(MSG_OK,"Select sequences to be cut by clicking on the names.");
return;
}
if(ncutseqs>0)
{
if (Message(MSG_YN,"The previously cut sequences will be lost.\nDo you want to continue?")==ANS_NO) return;
}
if (saveseqlen_array!=NULL) ckfree(saveseqlen_array);
if (saveseq_array!=NULL)
{
for(i=0;i<ncutseqs;i++)
{
if (saveseq_array[i]!=NULL) ckfree(saveseq_array[i]);
}
ckfree(saveseq_array);
}
if (savetitles!=NULL)
{
for(i=0;i<ncutseqs;i++)
{
if (savetitles[i]!=NULL) ckfree(savetitles[i]);
}
ckfree(savetitles);
}
if (savenames!=NULL)
{
for(i=0;i<ncutseqs;i++)
{
if (savenames[i]!=NULL) ckfree(savenames[i]);
}
ckfree(savenames);
}
ncutseqs=0;
savenames=(char **)ckalloc((data.nseqs+1) * sizeof(char *));
savetitles=(char **)ckalloc((data.nseqs+1) * sizeof(char *));
saveseq_array=(char **)ckalloc((data.nseqs+1) * sizeof(char *));
saveseqlen_array=(sint *)ckalloc((data.nseqs+1) * sizeof(sint));
for(i=0;i<data.nseqs;i++)
{
savenames[i]=NULL;
savetitles[i]=NULL;
saveseq_array[i]=NULL;
}
if (data.prf_no == 0)
cut_multiplem();
else if (data.prf_no == 1)
cut_profile1();
else if (data.prf_no == 2)
cut_profile2();
GetPanelExtra(active_panel.names,&data);
if(pos>=data.nseqs) pos=data.nseqs-1;
if(data.nseqs>0)
data.selected[pos]=TRUE;
SetPanelExtra(active_panel.names,&data);
DrawPanel(active_panel.names);
active_panel.modified=TRUE;
info("Cut %d sequences.",ncutseqs);
}
static void cut_multiplem(void)
{
int i,j;
panel_data data;
GetPanelExtra(active_panel.names,&data);
for (i=data.nseqs;i>0;i--)
{
if(data.selected[i-1]==TRUE)
{
ssave(i);
for(j=i;j<data.nseqs;j++)
sscpy(j,j+1);
}
}
nseqs-=ncutseqs;
if (nseqs<=0) empty=TRUE;
if (ncutseqs>0)
if(nseqs<=data.vseqs)
load_aln(active_panel,0,nseqs-1,TRUE);
else
load_aln(active_panel,0,nseqs-1,FALSE);
}
static void cut_profile1(void)
{
int i,j;
panel_data data;
GetPanelExtra(active_panel.names,&data);
for (i=data.nseqs;i>0;i--)
{
if(data.selected[i-1]==TRUE)
{
ssave(i);
for(j=i;j<nseqs;j++)
sscpy(j,j+1);
}
}
profile1_nseqs-=ncutseqs;
nseqs-=ncutseqs;
if (profile1_nseqs<=0) profile1_empty=TRUE;
if (nseqs<=0) empty=TRUE;
if (ncutseqs>0)
{
if(profile1_nseqs<=data.vseqs)
load_aln(active_panel,0,profile1_nseqs-1,TRUE);
else
load_aln(active_panel,0,profile1_nseqs-1,FALSE);
if (!profile2_empty)
load_aln(prf_panel[1],profile1_nseqs,nseqs-1,FALSE);
}
}
static void cut_profile2(void)
{
int i,j;
panel_data data;
GetPanelExtra(active_panel.names,&data);
for (i=data.nseqs;i>0;i--)
{
if(data.selected[i-1]==TRUE)
{
ssave(i+profile1_nseqs);
for(j=i+profile1_nseqs;j<nseqs;j++)
sscpy(j,j+1);
}
}
nseqs-=ncutseqs;
if (nseqs-profile1_nseqs<=0) profile2_empty=TRUE;
if (nseqs<=0) empty=TRUE;
if (ncutseqs>0)
if(nseqs-profile1_nseqs<=data.vseqs)
load_aln(active_panel,profile1_nseqs,nseqs-1,FALSE);
else
load_aln(active_panel,profile1_nseqs,nseqs-1,TRUE);
}
static void PasteSequences(IteM item)
{
int insert;
int i,n;
panel_data data;
if (ncutseqs<=0)
{
Message(MSG_OK,"No sequences available for pasting.\n"
" Cut selected sequences first.");
return;
}
GetPanelExtra(active_panel.names,&data);
n=ncutseqs;
insert=-1;
if (data.nseqs>0)
{
for(i=data.nseqs-1;i>=0;i--)
if(data.selected[i]==TRUE)
{
insert=i;
break;
}
if (insert==-1)
{
Message(MSG_OK,"Select a sequence by clicking on the name.\n"
" Cut sequences will be pasted after this one.");
return;
}
}
if (data.prf_no == 2)
{
insert += profile1_nseqs;
for(i=profile1_nseqs+data.nseqs;i>insert+1;i--)
sscpy(i+ncutseqs,i);
for(i=1;ncutseqs>0;i++)
sload(insert+i+1);
}
else
{
for(i=nseqs;i>insert+1;i--)
sscpy(i+ncutseqs,i);
for(i=1;ncutseqs>0;i++)
sload(insert+i+1);
}
if(data.prf_no==0)
{
nseqs=data.nseqs+n;
if (nseqs>0) empty=FALSE;
load_aln(seq_panel,0,nseqs-1,FALSE);
}
else if(data.prf_no==1)
{
profile1_nseqs=data.nseqs+n;
nseqs+=n;
if (profile1_nseqs>0) profile1_empty=FALSE;
load_aln(active_panel,0,profile1_nseqs-1,FALSE);
if (!profile2_empty)
load_aln(prf_panel[1],profile1_nseqs,nseqs-1,FALSE);
}
else if(data.prf_no==2)
{
nseqs=profile1_nseqs+data.nseqs+n;
if (profile1_nseqs<nseqs)
{
profile2_empty=FALSE;
empty=FALSE;
}
/*
load_aln(prf_panel[0],0,profile1_nseqs-1,FALSE);
*/
load_aln(prf_panel[1],profile1_nseqs,nseqs-1,FALSE);
}
active_panel.modified=TRUE;
info("Pasted %d sequences.",n);
}
/* copies a sequence from clustal arrays position j to temp arrays */
static void ssave(int j)
{
int k;
if (saveseq_array[ncutseqs] != NULL) ckfree(saveseq_array[ncutseqs]);
if (savenames[ncutseqs] != NULL) ckfree(savenames[ncutseqs]);
if (savetitles[ncutseqs] != NULL) ckfree(savetitles[ncutseqs]);
savenames[ncutseqs]=(char *)ckalloc((MAXNAMES+2)*sizeof(char));
savetitles[ncutseqs]=(char *)ckalloc((MAXTITLES+2)*sizeof(char));
strcpy(savenames[ncutseqs],names[j]);
strcpy(savetitles[ncutseqs],titles[j]);
saveseqlen_array[ncutseqs]=seqlen_array[j];
saveseq_array[ncutseqs]=(char *)ckalloc((seqlen_array[j]+2)*sizeof(char));
for(k=1;k<=seqlen_array[j];k++)
saveseq_array[ncutseqs][k]=seq_array[j][k];
saveseq_array[ncutseqs][k]= -3;
ncutseqs++;
}
/* copies a sequence from clustal arrays position i to position j */
static void sscpy(int i,int j)
{
int k;
strcpy(names[i],names[j]);
strcpy(titles[i],titles[j]);
seqlen_array[i]=seqlen_array[j];
realloc_seq(i,seqlen_array[i]);
for(k=1;k<=seqlen_array[j];k++)
seq_array[i][k]=seq_array[j][k];
seq_array[i][k]= -3;
}
/* copies last sequence in temp arrays to clustal arrays after entry i */
static void sload(int i)
{
int k;
if (ncutseqs<1) return;
ncutseqs--;
strcpy(names[i],savenames[ncutseqs]);
strcpy(titles[i],savetitles[ncutseqs]);
seqlen_array[i]=saveseqlen_array[ncutseqs];
realloc_seq(i,seqlen_array[i]);
for(k=1;k<=seqlen_array[i];k++)
seq_array[i][k]=saveseq_array[ncutseqs][k];
seq_array[i][k]= -3;
}
static void SelectSeqs(IteM item)
{
select_seqs(seq_panel,TRUE);
}
static void SelectPrf1(IteM item)
{
select_seqs(prf_panel[0],TRUE);
}
static void SelectPrf2(IteM item)
{
select_seqs(prf_panel[1],TRUE);
}
static void MergeProfiles(IteM item)
{
if (profile2_empty)
{
error("Profile 2 not loaded");
return;
}
profile_no=1;
profile1_nseqs=nseqs;
profile2_empty=TRUE;
load_aln(prf_panel[0],0,profile1_nseqs-1,FALSE);
load_aln(prf_panel[1],profile1_nseqs,nseqs-1,FALSE);
active_panel=prf_panel[0];
info("Added Profile 2 to Profile 1.");
}
static void ClearSeqRange(IteM item)
{
if(aln_mode==MULTIPLEM)
clear_seqrange(seq_panel);
else
{
clear_seqrange(prf_panel[1]);
clear_seqrange(prf_panel[0]);
}
}
static void ClearSeqs(IteM item)
{
if(aln_mode==MULTIPLEM)
select_seqs(seq_panel,FALSE);
else
{
select_seqs(prf_panel[1],FALSE);
select_seqs(prf_panel[0],FALSE);
}
}
static void clear_seqrange(spanel p)
{
int f,l;
panel_data data;
GetPanelExtra(p.seqs,&data);
f=data.firstsel;
l=data.lastsel;
data.firstsel=data.lastsel=-1;
SetPanelExtra(p.seqs,&data);
highlight_seqrange(p.seqs,f,l,NORMAL);
}
static void select_seqs(spanel p,Boolean flag)
{
int i;
panel_data data;
GetPanelExtra(p.names,&data);
if (data.nseqs == 0) return;
for (i=0;i<data.nseqs;i++)
data.selected[i]=flag;
SetPanelExtra(p.names,&data);
draw_names(p.names);
if(flag==TRUE) active_panel=p;
}
static void CAlignWin (IteM item)
{
if (empty)
{
error("No sequences loaded");
return;
}
if (nseqs <= 1)
{
error("Alignment has only %d sequences",nseqs);
return;
}
do_align_window(&calignw,&ctreetext,NEW,"Complete Alignment",CompleteAlign);
}
void CompleteAlign(ButtoN but)
{
char phylip_name[FILENAMELEN];
GetTitle(ctreetext, filename, FILENAMELEN);
stripspace(filename);
strcpy(phylip_name,filename);
if (!open_aln_files()) return;
WatchCursor();
if (Visible(calignw))
{
Remove(calignw);
calignw=NULL;
}
align(phylip_name);
if(save_log && save_log_fd!=NULL)
{
fclose(save_log_fd);
save_log_fd=NULL;
}
/* reload the sequences from the output file (so that the sequence order is
correct - either INPUT or ALIGNED , don't output messages */
reload_alignment();
load_aln(seq_panel,0,nseqs-1,FALSE);
ArrowCursor();
}
static void RealignSeqsWin (IteM item)
{
int i;
Boolean sel=FALSE;
panel_data data;
if (empty)
{
error("No sequences loaded");
return;
}
if (nseqs <= 1)
{
error("Alignment has only %d sequences
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -