+//**********************************************************************************************************************
+int SffInfoCommand::printFlowSeqData(ofstream& out, seqRead& read, Header& header) {
+ try {
+ if(header.clipQualRight > header.clipQualLeft){
+
+ int rightIndex = 0;
+ for (int i = 0; i < header.clipQualRight; i++) { rightIndex += read.flowIndex[i]; }
+
+ out << header.name << ' ' << rightIndex;
+ for (int i = 0; i < read.flowgram.size(); i++) { out << setprecision(2) << ' ' << (read.flowgram[i]/(float)100); }
+ out << endl;
+ }
+
+
+ return 0;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SffInfoCommand", "printFlowSeqData");
+ exit(1);
+ }
+}
+//**********************************************************************************************************************
+int SffInfoCommand::readAccnosFile(string filename) {
+ try {
+ //remove old names
+ seqNames.clear();
+
+ ifstream in;
+ m->openInputFile(filename, in);
+ string name;
+
+ while(!in.eof()){
+ in >> name; m->gobble(in);
+
+ seqNames.insert(name);
+
+ if (m->control_pressed) { seqNames.clear(); break; }
+ }
+ in.close();
+
+ return 0;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SffInfoCommand", "readAccnosFile");
+ exit(1);
+ }
+}
+//**********************************************************************************************************************
+int SffInfoCommand::parseSffTxt() {
+ try {
+
+ ifstream inSFF;
+ m->openInputFile(sfftxtFilename, inSFF);
+
+ if (outputDir == "") { outputDir += m->hasPath(sfftxtFilename); }
+
+ //output file names
+ ofstream outFasta, outQual, outFlow;
+ string outFastaFileName, outQualFileName;
+ string fileRoot = m->getRootName(m->getSimpleName(sfftxtFilename));
+ if (fileRoot.length() > 0) {
+ //rip off last .
+ fileRoot = fileRoot.substr(0, fileRoot.length()-1);
+ fileRoot = m->getRootName(fileRoot);
+ }
+
+ string outFlowFileName = outputDir + fileRoot + "flow";
+ if (trim) {
+ outFastaFileName = outputDir + fileRoot + "fasta";
+ outQualFileName = outputDir + fileRoot + "qual";
+ }else{
+ outFastaFileName = outputDir + fileRoot + "raw.fasta";
+ outQualFileName = outputDir + fileRoot + "raw.qual";
+ }
+
+ if (fasta) { m->openOutputFile(outFastaFileName, outFasta); outputNames.push_back(outFastaFileName); outputTypes["fasta"].push_back(outFastaFileName); }
+ if (qual) { m->openOutputFile(outQualFileName, outQual); outputNames.push_back(outQualFileName); outputTypes["qual"].push_back(outQualFileName); }
+ if (flow) { m->openOutputFile(outFlowFileName, outFlow); outputNames.push_back(outFlowFileName); outFlow.setf(ios::fixed, ios::floatfield); outFlow.setf(ios::showpoint); outputTypes["flow"].push_back(outFlowFileName); }
+
+ //read common header
+ string commonHeader = m->getline(inSFF);
+ string magicNumber = m->getline(inSFF);
+ string version = m->getline(inSFF);
+ string indexOffset = m->getline(inSFF);
+ string indexLength = m->getline(inSFF);
+ int numReads = parseHeaderLineToInt(inSFF);
+ string headerLength = m->getline(inSFF);
+ string keyLength = m->getline(inSFF);
+ int numFlows = parseHeaderLineToInt(inSFF);
+ string flowgramCode = m->getline(inSFF);
+ string flowChars = m->getline(inSFF);
+ string keySequence = m->getline(inSFF);
+ m->gobble(inSFF);
+
+ string seqName;
+
+ if (flow) { outFlow << numFlows << endl; }
+
+ for(int i=0;i<numReads;i++){
+
+ //sanity check
+ if (inSFF.eof()) { m->mothurOut("[ERROR]: Expected " + toString(numReads) + " but reached end of file at " + toString(i+1) + "."); m->mothurOutEndLine(); break; }
+
+ Header header;
+
+ //parse read header
+ inSFF >> seqName;
+ seqName = seqName.substr(1);
+ m->gobble(inSFF);
+ header.name = seqName;
+
+ string runPrefix = parseHeaderLineToString(inSFF); header.timestamp = runPrefix;
+ string regionNumber = parseHeaderLineToString(inSFF); header.region = regionNumber;
+ string xyLocation = parseHeaderLineToString(inSFF); header.xy = xyLocation;
+ m->gobble(inSFF);
+
+ string runName = parseHeaderLineToString(inSFF);
+ string analysisName = parseHeaderLineToString(inSFF);
+ string fullPath = parseHeaderLineToString(inSFF);
+ m->gobble(inSFF);
+
+ string readHeaderLen = parseHeaderLineToString(inSFF); convert(readHeaderLen, header.headerLength);
+ string nameLength = parseHeaderLineToString(inSFF); convert(nameLength, header.nameLength);
+ int numBases = parseHeaderLineToInt(inSFF); header.numBases = numBases;
+ string clipQualLeft = parseHeaderLineToString(inSFF); convert(clipQualLeft, header.clipQualLeft);
+ int clipQualRight = parseHeaderLineToInt(inSFF); header.clipQualRight = clipQualRight;
+ string clipAdapLeft = parseHeaderLineToString(inSFF); convert(clipAdapLeft, header.clipAdapterLeft);
+ string clipAdapRight = parseHeaderLineToString(inSFF); convert(clipAdapRight, header.clipAdapterRight);
+ m->gobble(inSFF);
+
+ seqRead read;
+
+ //parse read
+ vector<unsigned short> flowVector = parseHeaderLineToFloatVector(inSFF, numFlows); read.flowgram = flowVector;
+ vector<unsigned int> flowIndices = parseHeaderLineToIntVector(inSFF, numBases);
+
+ //adjust for print
+ vector<unsigned int> flowIndicesAdjusted; flowIndicesAdjusted.push_back(flowIndices[0]);
+ for (int j = 1; j < flowIndices.size(); j++) { flowIndicesAdjusted.push_back(flowIndices[j] - flowIndices[j-1]); }
+ read.flowIndex = flowIndicesAdjusted;
+
+ string bases = parseHeaderLineToString(inSFF); read.bases = bases;
+ vector<unsigned int> qualityScores = parseHeaderLineToIntVector(inSFF, numBases); read.qualScores = qualityScores;
+ m->gobble(inSFF);
+
+ //if you have provided an accosfile and this seq is not in it, then dont print
+ bool print = true;
+ if (seqNames.size() != 0) { if (seqNames.count(header.name) == 0) { print = false; } }
+
+ //print
+ if (print) {
+ if (fasta) { printFastaSeqData(outFasta, read, header); }
+ if (qual) { printQualSeqData(outQual, read, header); }
+ if (flow) { printFlowSeqData(outFlow, read, header); }
+ }
+
+ //report progress
+ if((i+1) % 10000 == 0){ m->mothurOut(toString(i+1)); m->mothurOutEndLine(); }
+
+ if (m->control_pressed) { break; }
+ }
+
+ //report progress
+ if (!m->control_pressed) { if((numReads) % 10000 != 0){ m->mothurOut(toString(numReads)); m->mothurOutEndLine(); } }