+#ifndef CCODE_H
+#define CCODE_H
+
+/*
+ * ccode.h
+ * Mothur
+ *
+ * Created by westcott on 8/24/09.
+ * Copyright 2009 Schloss LAB. All rights reserved.
+ *
+ */
+
+#include "chimera.h"
+#include "dist.h"
+#include "decalc.h"
+
+/***********************************************************/
+//This class was created using the algorythms described in the
+// "Evaluating putative chimeric sequences from PCR-amplified products" paper
+//by Juan M. Gonzalez, Johannes Zimmerman and Cesareo Saiz-Jimenez.
+
+/***********************************************************/
+
+class Ccode : public Chimera {
+
+ public:
+ Ccode(string, string, bool, string, int, int, string); //fasta, template, filter, mask, window, numWanted, outputDir
+ ~Ccode();
+
+ int getChimeras(Sequence* query);
+ Sequence print(ostream&, ostream&);
+
+ #ifdef USE_MPI
+ Sequence print(MPI_File&, MPI_File&);
+ #endif
+ private:
+
+ Dist* distCalc;
+ DeCalculator* decalc;
+ int iters, window, numWanted;
+ string fastafile, mapInfo;
+
+ Sequence* querySeq;
+
+ map<int, int> spotMap;
+ map<int, int>::iterator it;
+
+ vector<int> windows; //windows is the vector of window breaks for query
+ int windowSizes; //windowSizes is the size of the windows for query
+ map<int, int> trim; //trim is the map containing the starting and ending positions for query
+ vector<SeqDist> closest; //closest is a vector of sequence at are closest to query
+ vector<float> averageRef; //averageRef is the average distance at each window for the references for query
+ vector<float> averageQuery; //averageQuery is the average distance at each winow for the query for query
+ vector<float> sumRef; //sumRef is the sum of distances at each window for the references for query
+ vector<float> sumSquaredRef; //sumSquaredRef is the sum of squared distances at each window for the references for query
+ vector<float> sumQuery; //sumQuery is the sum of distances at each window for the comparison of query to references for query
+ vector<float> sumSquaredQuery; //sumSquaredQuery is the sum of squared distances at each window for the comparison of query to references for query
+ vector<float> varRef; //varRef is the variance among references seqs at each window for query
+ vector<float> varQuery; //varQuery is the variance among references and query at each window
+ vector<float> sdRef; //sdRef is the standard deviation of references seqs at each window for query
+ vector<float> sdQuery; //sdQuery is the standard deviation of references and query at each window
+ vector<float> anova; //anova is the vector of anova scores for each window for query
+ int refCombo; //refCombo is the number of reference sequences combinations for query
+ vector<bool> isChimericConfidence; //isChimericConfidence indicates whether query is chimeric at a given window according to the confidence limits
+ vector<bool> isChimericTStudent; //isChimericConfidence indicates whether query is chimeric at a given window according to the confidence limits
+ vector<bool> isChimericANOVA; //isChimericConfidence indicates whether query is chimeric at a given window according to the confidence limits
+
+ vector<SeqDist> findClosest(Sequence*, int);
+ void removeBadReferenceSeqs(vector<SeqDist>&); //removes sequences from closest that are to different of too similar to eachother.
+ void trimSequences(Sequence*);
+ vector<int> findWindows();
+ void getAverageRef(vector<SeqDist>); //fills sumRef, averageRef, sumSquaredRef and refCombo.
+ void getAverageQuery (vector<SeqDist>, Sequence*); //fills sumQuery, averageQuery, sumSquaredQuery.
+ void findVarianceRef (); //fills varRef and sdRef also sets minimum error rate to 0.001 to avoid divide by 0.
+ void findVarianceQuery (); //fills varQuery and sdQuery
+ void determineChimeras (); //fills anova, isChimericConfidence, isChimericTStudent and isChimericANOVA.
+
+ int getDiff(string, string); //return number of mismatched bases, a gap to base is not counted as a mismatch
+ float getT(int);
+ float getF(int);
+
+ #ifdef USE_MPI
+ int printMapping(string&);
+ MPI_File outMap;
+ #endif
+
+};
+
+/***********************************************************/
+
+#endif
+
+