Java 实现PDB数据库中蛋白质部分序列与Uniport数据库中相应的全长序列的最优匹配
2012-09-06 20:34
399 查看
/** * @param strArr数组的第一维是部分序列,第二维是全长序列 * @return 返回时两个大部分对齐后的部分和全长序列, 若返回null时则表示, 程序对齐失败 * @function 程序主要是实现经过处理后的蛋白质部分序列与全长序列的对齐, * 忽略每个氨基酸前后MW(最小窗口)中间的一些小的不一样的氨基酸, 部分序列中可以加空格, 全长序列中不能加空格 * @notice 在某种情况下程序可能会失效 */ public static String[] AlignTwoProteinSeqIgnoreLittleMistakeInMW(String partSeq, String fullSeq){ final int MW = 10; // 表示前后窗口的大小 final int lW = 3; // 表示在前后窗口中最多能容忍几个错误 final int MFPreSpaceNum = 3; //表示全长序列前面最多加多少空格 StringBuffer partAns = new StringBuffer(partSeq.toUpperCase()); StringBuffer fullAns = new StringBuffer(fullSeq.toUpperCase()); int fullPreSpaceNum = 0; boolean isFirstMatch = false; //标记第一次是否能对其 for (int i = 0; ; i++){ //Seq是在变动的 partSeq = partAns.toString(); fullSeq = fullAns.toString(); String prePI = mySubString(partSeq, i-MW, i); String afterPI = mySubString(partSeq, i+1, i+1+MW); String preFI = mySubString(fullSeq, i-MW, i); String afterFI = mySubString(fullSeq, i+1, i+1+MW); int preNSAcidNum = statisticNotSameAcidNum(prePI, preFI); int afterNSAcidNum = statisticNotSameAcidNum(afterPI, afterFI); if (fullSeq.charAt(i) == partSeq.charAt(i)){ //当前氨基酸是一样的 //如果后面的窗口不可以匹配, 则我们要根据前面的窗口判断是前面加空格 if (lW < afterNSAcidNum){ if (lW < preNSAcidNum){ System.out.println("这是不会出现的错"); System.exit(-1); }else{ if (prePI.charAt(MW - 1) == ' '){ //在前面加空格 partAns.delete(0, partAns.length()); partAns.append(partSeq.substring(0, i)); partAns.append(" "); partAns.append(partSeq.substring(i, partSeq.length())); } } }else{ // 判断是不是第一次匹配 int afterFISpaceNum = 0; for (int kkk = 0; kkk < afterFI.length(); kkk++){ if (' ' == afterFI.charAt(kkk)){ afterFISpaceNum++; } } if (lW >= afterFISpaceNum) isFirstMatch = true; } } else{ //当前氨基酸是不一样的 if (lW < afterNSAcidNum){ //如果后面的不可以匹配 partAns.delete(0, partAns.length()); partAns.append(partSeq.substring(0, i)); partAns.append(" "); partAns.append(partSeq.substring(i, partSeq.length())); }else{ //如果后面的可以匹配就匹配 // 判断是不是第一次匹配 int afterFISpaceNum = 0; for (int kkk = 0; kkk < afterFI.length(); kkk++){ if (' ' == afterFI.charAt(kkk)){ afterFISpaceNum++; } } if (lW >= afterFISpaceNum) isFirstMatch = true; } } // 判断是否匹配成功 String temp = mySubString("", 0-MW, 0); if (afterPI.equals(temp) || afterFI.equalsIgnoreCase(temp)){ if (!isFirstMatch){ fullPreSpaceNum++; if (MFPreSpaceNum + 1 <= fullPreSpaceNum){ return null; } fullAns.delete(0, fullAns.length()); fullAns.append(" "); fullAns.append(fullSeq); i = fullPreSpaceNum - 1; partAns.delete(0, partAns.length()); //略去中间产生的无用空格 for (int lll = 0; lll < partSeq.length(); lll++){ if (' ' != partSeq.charAt(lll)) { partAns.append(partSeq.charAt(lll)); } } }else{ break; } } } return partAns.append("#" + fullAns.toString()).toString().split("#"); } public static String mySubString(String srcStr, int begin, int end){ //没有的部分我们用空格表示 保证返回的字符串长度为end-begin int len = srcStr.length(); byte[] srcArr = srcStr.getBytes(); byte[] ans = new byte[end - begin]; for (int i = 0; i < end - begin; i++) ans[i] = ' '; if (begin < 0 && end <= len){ begin = 0; for (int i = end - 1, j = ans.length - 1; i >= begin; i--, j--){ ans[j] = srcArr[i]; } }else if (end > len && begin >= 0){ end = len; for (int i = begin, j = 0; i < end; i++, j++){ ans[j] = srcArr[i]; } }else if (begin >=0 && end <= len){ for (int i = begin, j = 0; i < end; i++, j++){ ans[j] = srcArr[i]; } }else if(begin < 0 && end > len){ for (int i = 0, j = 0 - begin; i < len; i++, j++){ ans[j] = srcArr[i]; } } return new String(ans); } public static int statisticNotSameAcidNum(String lineone, String linetwo){ byte[] oneArr = lineone.toUpperCase().getBytes(); //忽略氨基酸的大小写 byte[] twoArr = linetwo.toUpperCase().getBytes(); if (oneArr.length != twoArr.length){ System.out.println("two line not the same lenght!"); return -1; } int ans = 0; for (int i = 0; i < oneArr.length; i++){ if (oneArr[i] != twoArr[i] && ' ' != oneArr[i] && ' ' != twoArr[i]){ ans++; } } return ans; }
相关文章推荐
- 时间序列数据库KDB 与Java结合使用介绍 -- 3 基于KDB JDBC的写入实现
- KMP算法部分匹配值计算-Java实现
- java实现最大子序列问题——————性能最优的算法
- 基于JNI技术,实现数据库查询,在C++中MD5匹配后回调至Java层的方案
- Java实现控制台登录(控制台输入的数据与数据库中的数据匹配) 注册
- Java实现Neo4j数据库的相关操作
- Java实现括号匹配
- java代码实现highchart与数据库数据结合完整案例分析(二)---折线图
- 使用监听器实现JAVA代码对数据库的定时操作,求大神帮帮忙!!!
- Java+opencv3.2.0实现模板匹配
- java实现redis数据库访问
- 【Javaweb篇】设置文字不换行,超过的部分用“...”代替css实现
- java版 利用栈实现括号匹配
- Java 实现连接sql server 2000(JDBC数据库访问例子)
- Android用java代码实现部分文字变色
- 笔试Java实现单例设计模式(最优方案)
- 数字使用相应的加密策略传递一个字符串后Java实现代码
- Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
- MyBlog部分模块---基于Servlet+JSP+JavaBean实现登陆注册验证功能
- JAVA实现网页爬虫及将数据写入数据库