--- /dev/null
+/*
+ * flowdata.cpp
+ * Mothur
+ *
+ * Created by Pat Schloss on 12/22/10.
+ * Copyright 2010 Schloss Lab. All rights reserved.
+ *
+ */
+
+#include "flowdata.h"
+
+//**********************************************************************************************************************
+
+FlowData::FlowData(){}
+
+//**********************************************************************************************************************
+
+FlowData::~FlowData(){ /* do nothing */ }
+
+//**********************************************************************************************************************
+
+FlowData::FlowData(int numFlows, float signal, float noise, int maxHomoP, string baseFlow) :
+ numFlows(numFlows), signalIntensity(signal), noiseIntensity(noise), maxHomoP(maxHomoP), baseFlow(baseFlow){
+
+ try {
+ m = MothurOut::getInstance();
+
+ flowData.assign(numFlows, 0);
+// baseFlow = "TACG";
+ seqName = "";
+ locationString = "";
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "FlowData");
+ exit(1);
+ }
+
+}
+
+//**********************************************************************************************************************
+
+bool FlowData::getNext(ifstream& flowFile){
+
+ try {
+ flowFile >> seqName >> endFlow;
+ //cout << "in Flowdata " + seqName << endl;
+ for(int i=0;i<numFlows;i++) { flowFile >> flowData[i]; }
+ //cout << "in Flowdata read " << seqName + " done" << endl;
+ updateEndFlow();
+ translateFlow();
+
+ m->gobble(flowFile);
+ if(flowFile){ return 1; }
+ else { return 0; }
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "getNext");
+ exit(1);
+ }
+
+}
+
+//**********************************************************************************************************************
+
+void FlowData::updateEndFlow(){
+ try{
+
+ //int currLength = 0;
+ float maxIntensity = (float) maxHomoP + 0.49;
+
+ int deadSpot = 0;
+
+ while(deadSpot < endFlow){
+ int signal = 0;
+ int noise = 0;
+
+ for(int i=0;i<4;i++){
+ float intensity = flowData[i + deadSpot];
+ if(intensity > signalIntensity){
+ signal++;
+
+ if(intensity < noiseIntensity || intensity > maxIntensity){
+ noise++;
+ }
+ }
+ }
+
+ if(noise > 0 || signal == 0){
+ break;
+ }
+
+ deadSpot += 4;
+ }
+ endFlow = deadSpot;
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "findDeadSpot");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************
+
+void FlowData::translateFlow(){
+
+ try{
+ sequence = "";
+ for(int i=0;i<endFlow;i++){
+ int intensity = (int)(flowData[i] + 0.5);
+ char base = baseFlow[i % 4];
+
+ for(int j=0;j<intensity;j++){
+ sequence += base;
+ }
+ }
+
+ if(sequence.size() > 4){
+ sequence = sequence.substr(4);
+ }
+ else{
+ sequence = "NNNN";
+ }
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "translateFlow");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************
+
+void FlowData::capFlows(int mF){
+
+ try{
+
+ maxFlows = mF;
+ if(endFlow > maxFlows){ endFlow = maxFlows; }
+ translateFlow();
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "capFlows");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************
+
+bool FlowData::hasMinFlows(int minFlows){
+
+ try{
+ bool pastMin = 0;
+ if(endFlow >= minFlows){ pastMin = 1; }
+
+ return pastMin;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "hasMinFlows");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************
+
+Sequence FlowData::getSequence(){
+
+ try{
+ return Sequence(seqName, sequence);
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "getSequence");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************
+
+void FlowData::printFlows(ofstream& outFlowFile){
+ try{
+// outFlowFile << '>' << seqName << locationString << " length=" << seqLength << " numflows=" << maxFlows << endl;
+ outFlowFile << seqName << ' ' << endFlow << ' ' << setprecision(2);
+
+ for(int i=0;i<maxFlows;i++){
+ outFlowFile << flowData[i] << ' ';
+ }
+ outFlowFile << endl;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "printFlows");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************
+
+void FlowData::printFlows(ofstream& outFlowFile, string scrapCode){
+ try{
+ outFlowFile << seqName << '|' << scrapCode << ' ' << endFlow << ' ' << setprecision(2);
+
+ for(int i=0;i<numFlows;i++){
+ outFlowFile << flowData[i] << ' ';
+ }
+ outFlowFile << endl;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "printFlows");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************
+
+string FlowData::getName(){
+
+ try{
+ return seqName;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "FlowData", "getName");
+ exit(1);
+ }
+}
+
+//**********************************************************************************************************************