]> git.donarmstrong.com Git - mothur.git/blobdiff - flowdata.cpp
added checks to make sure windows processes completed their tasks.
[mothur.git] / flowdata.cpp
index f40fdd64b21aa0ad2dc2beae7e01e942ba46dc23..5dc7dc3e6c780171f1ee5cacdb1d766864f18a18 100644 (file)
@@ -15,63 +15,88 @@ FlowData::FlowData(){}
 
 //**********************************************************************************************************************
 
-FlowData::FlowData(ifstream& flowFile, float signal, float noise, int maxHomoP){
+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();
 
-               baseFlow = "TACG";
+               flowData.assign(numFlows, 0);
+//             baseFlow = "TACG";
                seqName = "";
-               numFlows = 0;
                locationString = "";
-               seqLength = 0;
-               
-               string lengthString;
-               string flowString;
-               
-               flowFile >> seqName >> locationString >> lengthString >> flowString;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "FlowData", "FlowData");
+               exit(1);
+       }
+       
+}
 
-               convert(lengthString.substr(7), seqLength);
-               convert(flowString.substr(9), numFlows);
+//**********************************************************************************************************************
 
-               flowData.resize(numFlows);
-               
-               if (seqName == "") {
-                       m->mothurOut("Error reading quality file, name blank at position, " + toString(flowFile.tellg()));
-                       m->mothurOutEndLine(); 
-               }
-               else{
-                       seqName = seqName.substr(1);
-                       for(int i=0;i<numFlows;i++)     {       flowFile >> flowData[i];        }
+bool FlowData::getNext(ifstream& flowFile){
+       
+       try {
+        seqName = getSequenceName(flowFile);
+               flowFile >> endFlow;    
+        if (!m->control_pressed) {
+            for(int i=0;i<numFlows;i++)        {       flowFile >> flowData[i];        }
+            updateEndFlow(); 
+            translateFlow();
+            m->gobble(flowFile);
                }
+            
+               if(flowFile){   return 1;       }
+               else            {       return 0;       }
+       }
+       catch(exception& e) {
+               m->errorOut(e, "FlowData", "getNext");
+               exit(1);
+       }
+       
+}
+//********************************************************************************************************************
+string FlowData::getSequenceName(ifstream& flowFile) {
+       try {
+               string name = "";
                
-               findDeadSpot(signal, noise, maxHomoP);
-               translateFlow();
+        flowFile >> name;
                
-               m->gobble(flowFile);
+               if (name.length() != 0) { 
+            for (int i = 0; i < name.length(); i++) {
+                if (name[i] == ':') { name[i] = '_'; m->changedSeqNames = true; }
+            }
+        }else{ m->mothurOut("Error in reading your flowfile, at position " + toString(flowFile.tellg()) + ". Blank name."); m->mothurOutEndLine(); m->control_pressed = true;  }
+        
+               return name;
        }
        catch(exception& e) {
-               m->errorOut(e, "FlowData", "FlowData");
+               m->errorOut(e, "FlowData", "getSequenceName");
                exit(1);
        }
-       
 }
 
 //**********************************************************************************************************************
 
-void FlowData::findDeadSpot(float signalIntensity, float noiseIntensity, int maxHomoP){
+void FlowData::updateEndFlow(){
        try{
                
-               int currLength = 0;
+               //int currLength = 0;
                float maxIntensity = (float) maxHomoP + 0.49;
                
-               deadSpot = 0;
-               while(currLength < seqLength + 4){
+               int deadSpot = 0;
+                               
+               while(deadSpot < endFlow){
                        int signal = 0;
                        int noise = 0;
                        
                        for(int i=0;i<4;i++){
-                               float intensity = flowData[i + 4 * deadSpot];
+                               float intensity = flowData[i + deadSpot];
                                if(intensity > signalIntensity){
                                        signal++;
 
@@ -79,18 +104,16 @@ void FlowData::findDeadSpot(float signalIntensity, float noiseIntensity, int max
                                                noise++;
                                        }
                                }
-                               currLength += (int)(intensity+0.5);
                        }
 
                        if(noise > 0 || signal == 0){
                                break;
                        }
                
-                       deadSpot++;
+                       deadSpot += 4;
                }
-               deadSpot *= 4;
-               seqLength = currLength;
-               
+               endFlow = deadSpot;
+
        }
        catch(exception& e) {
                m->errorOut(e, "FlowData", "findDeadSpot");
@@ -104,7 +127,7 @@ void FlowData::translateFlow(){
        
        try{
                sequence = "";
-               for(int i=0;i<deadSpot;i++){
+               for(int i=0;i<endFlow;i++){
                        int intensity = (int)(flowData[i] + 0.5);
                        char base = baseFlow[i % 4];
                        
@@ -128,12 +151,13 @@ void FlowData::translateFlow(){
 
 //**********************************************************************************************************************
 
-void FlowData::capFlows(int maxFlows){
+void FlowData::capFlows(int mF){
        
        try{
                
-               numFlows = maxFlows;
-               if(deadSpot > maxFlows){        deadSpot = maxFlows;    }
+               maxFlows = mF;
+               if(endFlow > maxFlows){ endFlow = maxFlows;     }       
+        translateFlow();
                
        }
        catch(exception& e) {
@@ -148,8 +172,8 @@ bool FlowData::hasMinFlows(int minFlows){
        
        try{
                bool pastMin = 0;
-               
-               if(deadSpot >= minFlows){       pastMin = 1;    }
+               if(endFlow >= minFlows){        pastMin = 1;    }
+
                return pastMin;
        }
        catch(exception& e) {
@@ -173,25 +197,12 @@ Sequence FlowData::getSequence(){
 
 //**********************************************************************************************************************
 
-int FlowData::getSeqLength(){
-       
-       try{
-               return seqLength;               
-       }
-       catch(exception& e) {
-               m->errorOut(e, "FlowData", "getSeqLength");
-               exit(1);
-       }
-}
-
-//**********************************************************************************************************************
-
 void FlowData::printFlows(ofstream& outFlowFile){
        try{
-       //      outFlowFile << '>' << seqName << locationString << " length=" << seqLength << " numflows=" << maxFlows << endl;
-               outFlowFile << seqName << ' ' << deadSpot << ' ' << setprecision(2);
+//     outFlowFile << '>' << seqName << locationString << " length=" << seqLength << " numflows=" << maxFlows << endl;
+               outFlowFile << seqName << ' ' << endFlow << ' ' << setprecision(2);
 
-               for(int i=0;i<numFlows;i++){
+               for(int i=0;i<maxFlows;i++){
                        outFlowFile << flowData[i] << ' ';
                }
                outFlowFile << endl;
@@ -206,10 +217,7 @@ void FlowData::printFlows(ofstream& outFlowFile){
 
 void FlowData::printFlows(ofstream& outFlowFile, string scrapCode){
        try{
-       
-       //      outFlowFile << '>' << seqName << locationString << " length=" << seqLength << " numflows=" << maxFlows << endl;
-
-               outFlowFile << seqName << '|' << scrapCode << ' ' << deadSpot << ' ' << setprecision(2);
+               outFlowFile << seqName << '|' << scrapCode << ' ' << endFlow << ' ' << setprecision(2);
                
                for(int i=0;i<numFlows;i++){
                        outFlowFile << flowData[i] << ' ';
@@ -224,18 +232,15 @@ void FlowData::printFlows(ofstream& outFlowFile, string scrapCode){
 
 //**********************************************************************************************************************
 
-void FlowData::printFASTA(ofstream& outFASTA){
+string FlowData::getName(){
+       
        try{
-               
-               outFASTA << '>' << seqName << endl;
-               outFASTA << sequence << endl;
-
+               return seqName;
        }
        catch(exception& e) {
-               m->errorOut(e, "FlowData", "printFlows");
+               m->errorOut(e, "FlowData", "getName");
                exit(1);
        }
 }
 
-
 //**********************************************************************************************************************