--- /dev/null
+#ifndef SFFINFOCOMMAND_H
+#define SFFINFOCOMMAND_H
+
+/*
+ * sffinfocommand.h
+ * Mothur
+ *
+ * Created by westcott on 7/7/10.
+ * Copyright 2010 Schloss Lab. All rights reserved.
+ *
+ */
+
+#include "command.hpp"
+
+
+/**********************************************************/
+struct CommonHeader {
+ unsigned int magicNumber;
+ string version;
+ unsigned long long indexOffset;
+ unsigned int indexLength;
+ unsigned int numReads;
+ unsigned short headerLength;
+ unsigned short keyLength;
+ unsigned short numFlowsPerRead;
+ int flogramFormatCode;
+ string flowChars; //length depends on number flow reads
+ string keySequence; //length depends on key length
+
+ CommonHeader(){ magicNumber=0; indexOffset=0; indexLength=0; numReads=0; headerLength=0; keyLength=0; numFlowsPerRead=0; flogramFormatCode='s'; }
+ ~CommonHeader() { }
+};
+/**********************************************************/
+struct Header {
+ unsigned short headerLength;
+ unsigned short nameLength;
+ unsigned int numBases;
+ unsigned short clipQualLeft;
+ unsigned short clipQualRight;
+ unsigned short clipAdapterLeft;
+ unsigned short clipAdapterRight;
+ string name; //length depends on nameLength
+ string timestamp;
+ string region;
+ string xy;
+
+ Header() { headerLength=0; nameLength=0; numBases=0; clipQualLeft=0; clipQualRight=0; clipAdapterLeft=0; clipAdapterRight=0; }
+ ~Header() { }
+};
+/**********************************************************/
+struct seqRead {
+ vector<unsigned short> flowgram;
+ vector<unsigned int> flowIndex;
+ string bases;
+ vector<unsigned int> qualScores;
+
+ seqRead() { }
+ ~seqRead() { }
+};
+/**********************************************************/
+
+class SffInfoCommand : public Command {
+
+public:
+ SffInfoCommand(string);
+ SffInfoCommand();
+ ~SffInfoCommand(){}
+
+ vector<string> setParameters();
+ string getCommandName() { return "sffinfo"; }
+ string getCommandCategory() { return "Sequence Processing"; }
+ string getHelpString();
+ string getCitation() { return "http://www.mothur.org/wiki/Sffinfo"; }
+ string getDescription() { return "extract sequences reads from a .sff file"; }
+
+ int execute();
+ void help() { m->mothurOut(getHelpString()); }
+
+private:
+ string sffFilename, sfftxtFilename, outputDir, accnosName;
+ vector<string> filenames, outputNames, accnosFileNames;
+ bool abort, fasta, qual, trim, flow, sfftxt, hasAccnos;
+ int mycount;
+ set<string> seqNames;
+
+ //extract sff file functions
+ int extractSffInfo(string, string);
+ int readCommonHeader(ifstream&, CommonHeader&);
+ int readHeader(ifstream&, Header&);
+ int readSeqData(ifstream&, seqRead&, int, int);
+ int decodeName(string&, string&, string&, string);
+
+ int printCommonHeader(ofstream&, CommonHeader&);
+ int printHeader(ofstream&, Header&);
+ int printSffTxtSeqData(ofstream&, seqRead&, Header&);
+ int printFlowSeqData(ofstream&, seqRead&, Header&);
+ int printFastaSeqData(ofstream&, seqRead&, Header&);
+ int printQualSeqData(ofstream&, seqRead&, Header&);
+ int readAccnosFile(string);
+ int parseSffTxt();
+ bool sanityCheck(Header&, seqRead&);
+
+ //parsesfftxt file functions
+ int parseHeaderLineToInt(ifstream&);
+ vector<unsigned short> parseHeaderLineToFloatVector(ifstream&, int);
+ vector<unsigned int> parseHeaderLineToIntVector(ifstream&, int);
+ string parseHeaderLineToString(ifstream&);
+};
+
+/**********************************************************/
+
+#endif
+
+