⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmenu.c

📁 是有关基因比对的经典算法的实现。这对于初学计算生物学的人是非常重要的算法。
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -