#include <cmath>
#include <math.h>
#include <algorithm>
+#include <numeric>
//misc
#include <cerrno>
#endif
/***********************************************************************/
-#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <windows.h>
#include <psapi.h>
#include <direct.h>
+ #include <tchar.h>
+
#endif
using namespace std;
#define isnan(x) ((x) != (x))
#define isinf(x) (fabs(x) == std::numeric_limits<double>::infinity())
+
typedef unsigned long ull;
+typedef unsigned short intDist;
struct IntNode {
int lvalue;
IntNode* right;
};
+struct diffPair {
+ float prob;
+ float reverseProb;
+
+ diffPair() {
+ prob = 0; reverseProb = 0;
+ }
+ diffPair(float p, float rp) {
+ prob = p;
+ reverseProb = rp;
+ }
+};
+
+/**********************************************************/
+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() { }
+};
+
+/***********************************************************************/
+struct PDistCell{
+ ull index;
+ float dist;
+ PDistCell() : index(0), dist(0) {};
+ PDistCell(ull c, float d) : index(c), dist(d) {}
+};
+/***********************************************************************/
+struct consTax{
+ string name;
+ string taxonomy;
+ int abundance;
+ consTax() : name(""), taxonomy("unknown"), abundance(0) {};
+ consTax(string n, string t, int a) : name(n), taxonomy(t), abundance(a) {}
+};
+/***********************************************************************/
+struct consTax2{
+ string taxonomy;
+ int abundance;
+ consTax2() : taxonomy("unknown"), abundance(0) {};
+ consTax2(string t, int a) : taxonomy(t), abundance(a) {}
+};
/************************************************************/
struct clusterNode {
int numSeq;
struct seqDist {
int seq1;
int seq2;
- float dist;
+ double dist;
seqDist() {}
- seqDist(int s1, int s2, float d) : seq1(s1), seq2(s2), dist(d) {}
+ seqDist(int s1, int s2, double d) : seq1(s1), seq2(s2), dist(d) {}
~seqDist() {}
};
/************************************************************/
seqPriorityNode(int n, string s, string nm) : numIdentical(n), seq(s), name(nm) {}
~seqPriorityNode() {}
};
+/************************************************************/
+struct compGroup {
+ string group1;
+ string group2;
+ compGroup() {}
+ compGroup(string s, string nm) : group1(s), group2(nm) {}
+ string getCombo() { return group1+"-"+group2; }
+ ~compGroup() {}
+};
/***************************************************************/
struct spearmanRank {
string name;
spearmanRank(string n, float s) : name(n), score(s) {}
};
+//***********************************************************************
+inline bool compareIndexes(PDistCell left, PDistCell right){
+ return (left.index > right.index);
+}
//********************************************************************************************************************
-//sorts highest to lowest
inline bool compareSpearman(spearmanRank left, spearmanRank right){
- return (left.score > right.score);
-}
+ return (left.score < right.score);
+}
+//********************************************************************************************************************
+inline double max(double left, double right){
+ if (left > right) { return left; }
+ else { return right; }
+}
+//********************************************************************************************************************
+inline double max(int left, double right){
+ double value = left;
+ if (left > right) { return value; }
+ else { return right; }
+}
+//********************************************************************************************************************
+inline double max(double left, int right){
+ double value = right;
+ if (left > value) { return left; }
+ else { return value; }
+}
//********************************************************************************************************************
//sorts highest to lowest
inline bool compareSeqPriorityNodes(seqPriorityNode left, seqPriorityNode right){
- return (left.numIdentical > right.numIdentical);
-}
-//********************************************************************************************************************
-//sorts lowest to highest
-inline bool compareSpearmanReverse(spearmanRank left, spearmanRank right){
- return (left.score < right.score);
+ if (left.numIdentical > right.numIdentical) {
+ return true;
+ }else if (left.numIdentical == right.numIdentical) {
+ if (left.seq > right.seq) { return true; }
+ else { return false; }
+ }
+ return false;
}
+
/************************************************************/
//sorts lowest to highest
inline bool compareDistLinePairs(distlinePair left, distlinePair right){
//sorts lowest to highest
inline bool compareSequenceDistance(seqDist left, seqDist right){
return (left.dist < right.dist);
-}
+}
+//********************************************************************************************************************
+//returns sign of double
+inline double sign(double temp){
+ //find sign
+ if (temp > 0) { return 1.0; }
+ else if (temp < 0) { return -1.0; }
+ return 0;
+}
/***********************************************************************/
// snagged from http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2
throw BadConversion(s);
}
-
+//**********************************************************************************************************************
+template <typename T> int sgn(T val){ return (val > T(0)) - (val < T(0)); }
//**********************************************************************************************************************
template<typename T>