public boolean processString() { String value = ""; SequenceReader r = new SequenceReader(true); r.indexFASTAFile(hitFilename, null, true); int l = (3 * querySeq.length()) / 2; String hitSeq = r.getSubSequence(hitReference.getId(), hitStart, hitStart + l); int hitPtr = 0; int queryPtr = 0; boolean displayResult = false; boolean donePreClipping = false; int tagCtr = 0; int i = 0; boolean continueParsing = true; int totalCount = 0; int delCount = 0; int insCount = 0; int matchCount = 0; boolean processed = true; // System.out.println(" Hit: "+hitSeq.length()+" "+hitSeq); // System.out.println("Query: "+querySeq.length()+" "+querySeq); hitAlnSize = 0; queryAlnSize = 0; hitAlnSize = 0; while ((i < cigarString.length()) && (continueParsing)) { // for (int i=0; i<cigarString.length(); i++) { // System.out.println("hitPtr="+hitPtr+" queryPtr="+queryPtr); // System.out.println("Query: " + queryString.toString()); // System.out.println(" Hit: " + hitString.toString()); char c = cigarString.charAt(i); if (Character.isDigit(c)) { value = value + c; } else { int n = Integer.parseInt(value); totalCount += n; // System.out.println(n + " " + c); switch (c) { case 'M': case '=': case 'X': queryString.append(querySeq.substring(queryPtr, queryPtr + n)); hitString.append(hitSeq.substring(hitPtr, hitPtr + n)); queryPtr += n; hitPtr += n; queryAlnSize += n; hitAlnSize += n; donePreClipping = true; matchCount += n; break; case 'I': if (n > 100) { System.out.println(""); System.out.println("Error: large I (" + n + ") - read " + queryID + " ignored"); processed = false; continueParsing = false; } else { queryString.append(querySeq.substring(queryPtr, queryPtr + n)); for (int j = 0; j < n; j++) { hitString.append('-'); } queryPtr += n; queryAlnSize += n; } donePreClipping = true; insCount += n; break; case 'D': if (n > 100) { System.out.println("Error: large D (" + n + ") - read " + queryID + " ignored"); processed = false; continueParsing = false; } else { hitString.append(hitSeq.substring(hitPtr, hitPtr + n)); for (int j = 0; j < n; j++) { queryString.append('-'); } hitPtr += n; hitAlnSize += n; } donePreClipping = true; delCount += n; break; case 'N': System.out.println("Warning: encountered N in CIGAR format!"); System.out.println(""); displayResult = true; hitString.append(hitSeq.substring(hitPtr, hitPtr + n)); for (int j = 0; j < n; j++) { queryString.append('-'); } queryPtr += n; hitPtr += n; donePreClipping = true; break; case 'S': // System.out.println("Warnning: encountered S in CIGAR format!"); queryPtr += n; if (!donePreClipping) { queryStart += n; } displayResult = true; break; case 'H': // System.out.println("Warning: encountered H in CIGAR format!"); if (!donePreClipping) { queryStart += n; } else { // System.out.println("Warning: hard clipping at end"); } displayResult = true; break; case 'P': System.out.println("Warning: encountered P in CIGAR format!"); System.out.println(""); displayResult = true; donePreClipping = true; break; default: System.out.println("Unrecognised character in CIGAR string: " + c); processed = false; break; } value = ""; tagCtr++; // System.out.println("qseq="+querySeq.length()+" matchCount="+matchCount+" // insCount="+insCount+" delCount="+delCount+" totalCount="+totalCount); // System.out.println("Query: "+queryString.toString()); // System.out.println(" Hit: "+hitString.toString()); } i++; // System.out.println("i="+i+" and length="+cigarString.length()); } // if (displayResult) { // System.out.println(queryFilename); // System.out.println("Query: " + queryString.toString()); // System.out.println(" Hit: " + hitString.toString()); // System.exit(1); // } return processed; }