📄 donofinddlg.cpp
字号:
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 + -