/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.broad.igv.synteny;
//~--- JDK imports ------------------------------------------------------------
import org.broad.igv.exceptions.ParserException;
import org.broad.igv.feature.Strand;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author jrobinso
*/
public class BlastParser {
/**
* Method description
* <p/>
* queryID,subjectID,percentIden,alignmentLength,
* mismatches,gapOpenings,queryStart,queryStop,subjectStart,subjectStop,eval,bitScore
* <p/>
* 1 9 87.73 864 106 0 100842 101705 222166 221303 0 872
*
* @param file
* @return
*/
public List<BlastMapping> parse(String file) {
List<BlastMapping> mappings = new ArrayList();
BufferedReader reader = null;
boolean tabblastn = file.contains(".tabblastn");
int queryChrIdx = 0;
int queryStartIdx = tabblastn ? 6 : 1;
int queryEndIdx = tabblastn ? 7 : 2;
int queryStrandIdx = tabblastn ? -1 : 3;
int subjectChrIdx = tabblastn ? 1 : 4;
int subjectStartIdx = tabblastn ? 8 : 5;
int subjectEndIdx = tabblastn ? 9 : 6;
int subjectStrandIdx = tabblastn ? -1 : 7;
int nTokens = tabblastn ? 10 : 8;
long lineCount = 0;
String nextLine = null;
boolean dataParsed = false;
try {
reader = new BufferedReader(new FileReader(file));
while ((nextLine = reader.readLine()) != null) {
lineCount++;
String[] tokens = nextLine.split("\t");
if (tokens.length >= nTokens) {
dataParsed = true;
String queryCht = tokens[queryChrIdx];
int queryStart;
int queryEnd;
try {
queryStart = Integer.parseInt(tokens[queryStartIdx]);
queryEnd = Integer.parseInt(tokens[queryEndIdx]);
}
catch (NumberFormatException ne) {
throw new RuntimeException("Non-numeric value found in either start or end column");
}
Strand queryStrand = Strand.NONE;
if (!tabblastn) {
int str = Integer.parseInt(tokens[queryStrandIdx]);
queryStrand = str == 1 ? Strand.POSITIVE : Strand.NEGATIVE;
}
String subjectChr = tokens[subjectChrIdx];
int subjectStart;
int subjectEnd;
try {
subjectStart = Integer.parseInt(tokens[subjectStartIdx]);
subjectEnd = Integer.parseInt(tokens[subjectEndIdx]);
}
catch (NumberFormatException ne) {
throw new RuntimeException("Non-numeric value found in " +
" either subject start or end column");
}
Strand subjectStrand = Strand.NONE;
if (!tabblastn) {
try {
int str = Integer.parseInt(tokens[subjectStrandIdx]);
subjectStrand = str == 1 ? Strand.POSITIVE : Strand.NEGATIVE;
}
catch (NumberFormatException ne) {
throw new RuntimeException("Non-numeric value found in " +
" either subject strand column");
}
}
float percentIden = tabblastn ? Float.parseFloat(tokens[2]) : 100.0f;
BlastMapping.Block queryBlock = new BlastMapping.Block(queryCht, queryStart, queryEnd, queryStrand);
BlastMapping.Block subjectBlock = new BlastMapping.Block(subjectChr, subjectStart, subjectEnd, subjectStrand);
mappings.add(new BlastMapping(queryBlock, subjectBlock, percentIden));
}
}
if (!dataParsed) {
throw new RuntimeException("Data not loaded. Number of columns is less than " + nTokens + ".");
}
} catch (Exception ex) {
if (lineCount != 0) {
throw new ParserException(ex.getMessage(), lineCount, nextLine);
} else {
throw new RuntimeException(ex);
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException iOException) {
}
}
}
return mappings;
}
}