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

📄 donofinddlg.cpp

📁 寻找基因位点的一款生物学软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				case 'c':p_c++;break;				
				case 'g':p_g++;break;
				default:break;
				}
			}			
			SetPPosi(posi+1,'a',(double)p_a/(m_donoTotal+1));
			SetPPosi(posi+1,'t',(double)p_t/(m_donoTotal+1));		
			SetPPosi(posi+1,'c',(double)p_c/(m_donoTotal+1));		
			SetPPosi(posi+1,'g',(double)p_g/(m_donoTotal+1));
		}
		
		/************************************************************************/
		/* 打分及排序                                                           */
		/************************************************************************/
		//对TrainingSet中的已知donor位点进行打分
		for(int m_scorei=0;m_scorei<=m_donoTotal;m_scorei++)
		{
			m_trainScore[m_scorei]=ScoreFormula(m_seg9[m_scorei]);
		}
		
		//排序
		int m_orderi,m_orderj;
		double orderTemp;
		for(m_orderi=0;m_orderi<m_donoTotal;m_orderi++)
			for (m_orderj=m_donoTotal;m_orderj>m_orderi;m_orderj--)
			{
				if(m_trainScore[m_orderj]>m_trainScore[m_orderj-1])
				{
					orderTemp=m_trainScore[m_orderj];
					m_trainScore[m_orderj]=m_trainScore[m_orderj-1];
					m_trainScore[m_orderj-1]=orderTemp;
				}
			}
			
			//////////////////////////////////////////////////////////////////////////
			TrainReady=1;		
	}
	else
	{
		m_donoTotal=temp;
		MessageBox("未选择训练集!");
	}
	
	
	
}

//函数功能:返回概率表中的概率
//参数说明:m_position:1~9位置 m_atcg: a t c t 不用加引号
double CDonofindDlg::GetPPosi(int m_position, char m_atcg)
{
	switch(m_atcg) 
	{
	case 'a': return ProbPosi[m_position-1][0];	//a的ASCII为97
	case 't': return ProbPosi[m_position-1][1];	//t的ASCII为116
	case 'c': return ProbPosi[m_position-1][2];	//c的ASCII为99
	case 'g': return ProbPosi[m_position-1][3];	//g的ASCII为103
	case 'A': return ProbPosi[m_position-1][0];
	case 'T': return ProbPosi[m_position-1][1];
	case 'C': return ProbPosi[m_position-1][2];	
	case 'G': return ProbPosi[m_position-1][3];
	default:return 0;
	}
}

double CDonofindDlg::GetPNega(int m_position, char m_atcg)
{
	switch(m_atcg) 
	{
	case 'a': return ProbNega[m_position-1][0];	//a的ASCII为97
	case 't': return ProbNega[m_position-1][1];	//t的ASCII为116
	case 'c': return ProbNega[m_position-1][2];	//c的ASCII为99
	case 'g': return ProbNega[m_position-1][3];	//g的ASCII为103
	case 'A': return ProbNega[m_position-1][0];	
	case 'T': return ProbNega[m_position-1][1];	
	case 'C': return ProbNega[m_position-1][2];
	case 'G': return ProbNega[m_position-1][3];	
	default:return 0;
	}
}

//设置概率格式同上
void CDonofindDlg::SetPPosi(int m_position, char m_atcg, double m_pro)
{
	switch(m_atcg) 
	{
	case 'a': ProbPosi[m_position-1][0]=m_pro; break;	//a的ASCII为97
	case 't': ProbPosi[m_position-1][1]=m_pro; break;	//t的ASCII为116
	case 'c': ProbPosi[m_position-1][2]=m_pro; break;	//c的ASCII为99
	case 'g': ProbPosi[m_position-1][3]=m_pro; break;	//g的ASCII为103
	default	: break;
	}
}

//本函数必须在TrainingSet和敏感度Sn都设置好的情况下才可执行
void CDonofindDlg::OnTestset() 
{
	CDirDialog m_path;
	
	if(m_path.DoBrowse(NULL)==IDOK)
	{
		szTestDir=m_path.m_strPath;
		if(szTestDir.Right(1) != "\\")szTestDir += "\\";			//在路径最后加上“\”
		szTestDir += "*.txt";
		TestReady=1;
	}
	else
	{
		MessageBox("未选择测试集!");
	}
	
}

void CDonofindDlg::OnLookpro() 
{
	// TODO: Add your control notification handler code here
	//print the properties
	CString str,str1;
	if(TrainReady)
	{
		str1+="P+概率\r位置\t   a\t\t   t\t\t   c\t\t   g\t\t\n";
		signed char p9, p4;
		for(p9=0;p9<9;p9++)
		{
			str.Format("%d\t",p9-3);str1+=str;
			str.Format("%.3f\t\t",GetPPosi(p9+1,'a'));str1+=str;
			str.Format("%.3f\t\t",GetPPosi(p9+1,'t'));str1+=str;
			str.Format("%.3f\t\t",GetPPosi(p9+1,'c'));str1+=str;
			str.Format("%.3f\t\t",GetPPosi(p9+1,'g'));str1+=str;
			str1+='\r';
		}
		
		str1+="\rP-概率\r位置\t   a\t\t   t\t\t   c\t\t   g\t\t\n";
		for(p9=0;p9<9;p9++)
		{
			str.Format("%d\t",p9-3);str1+=str;
			for(p4=0;p4<4;p4++)
			{
				str.Format("%.3f",ProbNega[p9][p4]);
				str1+=str;
				str1+='\t';	str1+='\t';
			}
			str1+='\n';
		}
		
		MessageBox(str1,"查看核苷酸分布统计概率表");
	}
	else
	{
		MessageBox("请先设置好训练集和测试集!","参数不足",MB_OK+MB_ICONWARNING);
	}
	
}

//打分公式,只需传一个片段的首碱基的地址即可,自动往后计算9个碱基
double CDonofindDlg::ScoreFormula(unsigned char* m_record)
{
	double scoreP=1,scoreN=1;
	for(int i=0;i<9;i++)scoreP*=GetPPosi(i+1,m_record[i]);
	for(i=0;i<9;i++)scoreN*=GetPNega(i+1,m_record[i]);
	return (log(scoreP/scoreN));
}



void CDonofindDlg::OnRefresh() 
{
	CFileFind m_findTest;
	CFile fileTest;
	CString pathTest;
	
	BOOL res;
	char *filestr;
	DWORD lens,i=0;
	int atcg11=0, nowposi=0;
	int m_tp=0,m_totalp=0;
	int m_truePosi[100];	//给出的dono位点的位置
	int trueDonoNums;		//给出的dono位点的个数
	
	unsigned int num=0;		//文件首提取的数字
	char tranum=0;			//提取数字辅助变量
	
	CString str,str2;		//MessageBox();测试变量
	int qq=0,counti=0;		//通用循环计数变量
	
	double m_testScore,m_pPosi,m_pNega;
	
	UpdateData();
	m_donoOutput="";
	if(TrainReady&&TestReady)
	{
		res=m_findTest.FindFile(szTestDir);
		while(res)
		{
			res=m_findTest.FindNextFile();						//若还有文档返回值res为1,否则为0
			
			//针对一个文件的处理
			if(!m_findTest.IsDirectory() && !m_findTest.IsDots())	//文件夹以文档形式存,排除目录和/.. /.情况
			{
				pathTest=m_findTest.GetFilePath();
				fileTest.Open(pathTest,CFile::modeRead);
				lens=fileTest.GetLength();
				filestr=new char[lens+1];
				fileTest.Read(filestr,lens);
				fileTest.Close();
				
				if(filestr[0]=='>')//排除非正常格式的干扰文件
				{
					//以上为文件操作,以下为具体处理函数
					trueDonoNums=0;//每个文件一开始提供的真donor位点的个数
					
					i=0;
					//提取前边DONO位点的位置并储存在m_truePosi[]数组中
					while(filestr[i]!='(')i++;
					do{
						while (filestr[i++]!='.') ;//i为第二个“.”
						
						//提取 .. 后面的数字
						num=0;
						tranum=0;
						i++;
						
						
						while(filestr[i] >= '0' && filestr[i] <= '9')
						{
							//str2.Format("%c",filestr[i]);
							//MessageBox(str2);
							tranum=filestr[i]-'0';					
							num = num*10 + tranum;
							i++;
						}
						
						m_truePosi[trueDonoNums]=num;
						trueDonoNums++;
						//此时trueDonoNums即为donor位点个数,非数组下标
					}
					while(filestr[i++] != ')');
					//此时的i为“)”后一个
					atcg11=0;
					while(filestr[atcg11] != ')')atcg11++;
					while(filestr[atcg11]!='A' && filestr[atcg11]!='T' 
						&& filestr[atcg11]!='C' && filestr[atcg11]!='G')atcg11++;
					
					
					//测试TestSetting中的字符种类:ATCG BRY \n \r
					//测试文件末尾字符:[lens]为文件结束标志,lens-1 lens-2为回车换行 lens-3为最后一个数据“G”				
					nowposi=0;
					for(i=atcg11;i<=(lens-3-8);i++)//绝对坐标
					{	
						if(filestr[i]=='A' || filestr[i]=='T'|| filestr[i]=='C'|| filestr[i]=='G'||
							filestr[i]=='B'|| filestr[i]=='R'|| filestr[i]=='N'|| filestr[i]=='Y')
						{	
							nowposi++;
							
							m_pPosi=m_pNega=1;
							for(counti=0;counti<9;counti++)m_pPosi*=GetPPosi(counti+1,filestr[i+counti]);
							for(counti=0;counti<9;counti++)m_pNega*=GetPNega(counti+1,filestr[i+counti]);
							m_testScore=log(m_pPosi/m_pNega);
							
							if(m_testScore > m_cval)
							{
								m_totalp++;//FP+TP
								for(counti=0; counti<trueDonoNums; counti++)
									if (nowposi==m_truePosi[counti])
									{
										str.Format("%d\t\t", m_truePosi[counti]);
										m_tp++;//TP
										m_donoOutput+=str;
										//	MessageBox(str);
									}
							}
							
							
						}
						
					}

				}
				delete []filestr;
			}
		}
		//Finish All The Files.
		m_tpnum=m_tp;
		m_fpnum=m_totalp-m_tp;
		m_spval=((double)m_tp/(double)m_totalp);
		UpdateData(FALSE);	
	}
	else MessageBox("请先设置好训练集和测试集!","参数不足",MB_OK+MB_ICONWARNING);
}

void CDonofindDlg::OnExit() 
{
	// TODO: Add your control notification handler code here
	CDialog::OnOK();
}

double CDonofindDlg::ScoreForTest(char *posi)
{
	double a;
	return a;
}

void CDonofindDlg::OnChangeSnval() 
{
	double m_dbSnval;
	if(TrainReady&&TestReady)
	{
		UpdateData();
		m_dbSnval=atof((LPCTSTR)m_snval);
		if(m_dbSnval>=0&&m_dbSnval<=1)
		{
			m_cval=m_trainScore[(int)(m_dbSnval*(double)m_donoTotal)];
			UpdateData(FALSE);
		}
		else MessageBox("请输入0 ~ 1范围的一个小数");
	}
	else 
	{
		m_snval="0.95";
		MessageBox("请先设置训练集和测试集!");
		UpdateData(FALSE);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -