練習問題の解答例_2

解答例

ちなみにDRR017220.fastqに対してsimilarity 0.95以上でクラスタリングした結果は371個のOTUが出来ます。

package clustering;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.StringReader;
import java.util.ArrayList;
 
import neobio.alignment.BasicScoringScheme;
import neobio.alignment.PairwiseAlignment;
import neobio.alignment.ScoringScheme;
import neobio.alignment.SmithWaterman;
 
public class Test {
 
	public static double getsim(String seq1, String seq2){
		 double result=0;
		 SmithWaterman sw = new SmithWaterman();
 
		 int n=0;
		 try {
			StringReader str1 = new StringReader(seq1);
			StringReader str2 = new StringReader(seq2);
			ScoringScheme arg3 = new BasicScoringScheme(1, -1, -1);
			sw.setScoringScheme(arg3);
			sw.loadSequences(str1, str2);
			PairwiseAlignment arg4;
			arg4 = sw.getPairwiseAlignment();
			String match=arg4.getScoreTagLine();
			for(int i=0;i<arg4.getScoreTagLine().length();i++){
			 if(match.substring(i,i+1).equals("|")){
			   n++;
			 }
			}
			result=n/(double)match.length();
		 } catch (Exception e) {
			e.printStackTrace();
		 }
		 return result;
		}
 
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
 
 
    	ArrayList<String> arrayName = new ArrayList<String>();
    	ArrayList<String> arraySeq = new ArrayList<String>();
    	int n=0;
    	File file = new File("C:\\Users\\asakawa\\Desktop\\DRR017220.fastq");
		try {
			BufferedReader br = new BufferedReader(new FileReader(file));
	    	String str = br.readLine();
	    	while(str != null){
	        	n++;
	        	if(n%4==1){
	        		arrayName.add(str);
	        	}else if(n%4==2){
	        		arraySeq.add(str);
	        	}
 
	        	str = br.readLine();
	    	}
	    	br.close();
		} catch (Exception e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
    	System.out.println(arraySeq.size()+"リード読み込み完了");
 
 
    	//1番目のリードに対して、similarityを計算
    	System.out.println(arraySeq.get(0));
 
    	for(int i=1;i<arraySeq.size();i++){
    		if(getsim(arraySeq.get(0), arraySeq.get(i)) >= 0.95){
    			System.out.println(arrayName.get(i)+": "+arraySeq.get(i));
    		}
    	}
 
 
    	//クラスタリングを行う
    	int otu=0; // OTUの数を保存する変数
    	boolean[] clusteredFlag = new boolean[arraySeq.size()];
    	for(int j=0; j<arraySeq.size(); j++){
        	int matchCnt = 0; // 1つのOTU内のリード数をカウント
    		if(clusteredFlag[j]==false){
    			matchCnt++;
    			otu++;
    			clusteredFlag[j]=true;
    			ArrayList<String> matchSeq = new ArrayList<String>();
    			ArrayList<String> matchName = new ArrayList<String>();
    			for(int i=j+1; i<arraySeq.size(); i++){
    				if(clusteredFlag[i]==false){
    					if(getsim(arraySeq.get(j),arraySeq.get(i))>=0.95){
    						matchSeq.add(arraySeq.get(i));
    						matchName.add(arrayName.get(i));
    						matchCnt++;
    						clusteredFlag[i]=true;
    					}
    				}
    			}
    			System.out.println("query: "+arrayName.get(j)+" "+arraySeq.get(j));
    			for(int i=0; i<matchSeq.size(); i++){
    				System.out.print(matchName.get(i)+" "+ matchSeq.get(i)+"\n");
    			}
    			System.out.println(matchCnt+" : "+otu);
    		}
    	}
 
	}
 
}
  • 練習問題の解答例_2.txt
  • 最終更新: 2019/07/15 02:46
  • by 127.0.0.1