]> git.donarmstrong.com Git - mothur.git/blob - summaryqualcommand.h
Added summary.qual command. Added fontsize parameter to heatmap.sim and venn commands
[mothur.git] / summaryqualcommand.h
1 #ifndef SUMMARYQUALCOMMAND_H
2 #define SUMMARYQUALCOMMAND_H
3
4 /*
5  *  summaryqualcommand.h
6  *  Mothur
7  *
8  *  Created by westcott on 11/28/11.
9  *  Copyright 2011 Schloss Lab. All rights reserved.
10  *
11  */
12
13
14 #include "command.hpp"
15 #include "qualityscores.h"
16
17 /**************************************************************************************************/
18
19 class SummaryQualCommand : public Command {
20 public:
21         SummaryQualCommand(string);
22         SummaryQualCommand();
23         ~SummaryQualCommand(){}
24         
25         vector<string> setParameters();
26         string getCommandName()                 { return "summary.qual";                        }
27         string getCommandCategory()             { return "Sequence Processing";         }
28         string getHelpString(); 
29         string getCitation() { return "http://www.mothur.org/wiki/Summary.qual"; }
30         string getDescription()         { return "summarize the quality of a set of sequences"; }
31         
32         int execute(); 
33         void help() { m->mothurOut(getHelpString()); }  
34         
35 private:
36         bool abort;
37         string qualfile, outputDir, namefile;
38         vector<string> outputNames;
39         map<string, int> nameMap;
40         int processors;
41         
42         struct linePair {
43                 unsigned long long start;
44                 unsigned long long end;
45                 linePair(unsigned long long i, unsigned long long j) : start(i), end(j) {}
46         };
47         
48         vector<linePair> lines;
49         vector<int> processIDS;
50         
51         int createProcessesCreateSummary(vector<int>&, vector<int>&, vector< vector<int> >&, string);
52         int driverCreateSummary(vector<int>&, vector<int>&, vector< vector<int> >&, string, linePair);  
53         int printQual(string, vector<int>&, vector<int>&, vector< vector<int> >&);
54 };
55
56 /**************************************************************************************************/
57 //custom data structure for threads to use.
58 // This is passed by void pointer so it can be any data type
59 // that can be passed using a single void pointer (LPVOID).
60 struct seqSumQualData {
61         vector<int>* position;
62         vector<int>* averageQ;
63         vector< vector<int> >* scores; 
64         string filename, namefile; 
65         unsigned long long start;
66         unsigned long long end;
67         int count;
68         MothurOut* m;
69         map<string, int> nameMap;
70         
71         ~seqSumQualData(){}
72         seqSumQualData(vector<int>* p, vector<int>* a, vector< vector<int> >* s, string f, MothurOut* mout, unsigned long long st, unsigned long long en, string n, map<string, int> nam) {
73                 position = p;
74                 averageQ = a;
75                 scores = s;
76                 filename = f;
77                 m = mout;
78                 start = st;
79                 end = en;
80                 namefile = n;
81                 nameMap = nam;
82                 count = 0;
83         }
84 };
85
86 /**************************************************************************************************/
87 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
88 #else
89 static DWORD WINAPI MySeqSumQualThreadFunction(LPVOID lpParam){ 
90         seqSumQualData* pDataArray;
91         pDataArray = (seqSumQualData*)lpParam;
92         
93         try {
94                 ifstream in;
95                 pDataArray->m->openInputFile(pDataArray->filename, in);
96                 
97                 //print header if you are process 0
98                 if ((pDataArray->start == 0) || (pDataArray->start == 1)) {
99                         in.seekg(0);
100                 }else { //this accounts for the difference in line endings. 
101                         in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); 
102                 }
103                 
104                 int count = 0;
105                 for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process
106                                 
107                         if (pDataArray->m->control_pressed) { in.close(); pDataArray->count = 1; return 1; }
108                         
109                         QualityScores current(in); pDataArray->m->gobble(in);
110                         
111                         if (current.getName() != "") {
112                         
113                                 int num = 1;
114                                 if (pDataArray->namefile != "") {
115                                         //make sure this sequence is in the namefile, else error 
116                                         map<string, int>::iterator it = pDataArray->nameMap.find(current.getName());
117                                         
118                                         if (it == pDataArray->nameMap.end()) { pDataArray->m->mothurOut("[ERROR]: " + current.getName() + " is not in your namefile, please correct."); pDataArray->m->mothurOutEndLine(); pDataArray->m->control_pressed = true; }
119                                         else { num = it->second; }
120                                 }
121                                 
122                                 vector<int> thisScores = current.getQualityScores();
123                                 
124                                 //resize to num of positions setting number of seqs with that size to 1
125                                 if (pDataArray->position->size() < thisScores.size()) { pDataArray->position->resize(thisScores.size(), 0); }
126                                 if (pDataArray->averageQ->size() < thisScores.size()) { pDataArray->averageQ->resize(thisScores.size(), 0); }
127                                 if (pDataArray->scores->size() < thisScores.size()) { 
128                                         pDataArray->scores->resize(thisScores.size()); 
129                                         for (int i = 0; i < pDataArray->scores->size(); i++) { pDataArray->scores->at(i).resize(41, 0); }
130                                 }
131                                 
132                                 //increase counts of number of seqs with this position
133                                 //average is really the total, we will average in execute
134                                 for (int i = 0; i < thisScores.size(); i++) { 
135                                         pDataArray->position->at(i) += num; 
136                                         pDataArray->averageQ->at(i) += (thisScores[i] * num); //weighting for namesfile
137                                         if (thisScores[i] > 40) { pDataArray->m->mothurOut("[ERROR]: " + current.getName() + " has a quality scores of " + toString(thisScores[i]) + ", expecting values to be less than 40."); pDataArray->m->mothurOutEndLine(); pDataArray->m->control_pressed = true; }
138                                         else { pDataArray->scores->at(i)[thisScores[i]] += num; }  
139                                 }
140                                 
141                                 count += num;
142                         }
143                 }
144                 
145                 pDataArray->count = count;
146                 in.close();
147                 
148                 return 0;
149                 
150         }
151         catch(exception& e) {
152                 pDataArray->m->errorOut(e, "SummaryQualCommand", "MySeqSumQualThreadFunction");
153                 exit(1);
154         }
155
156 #endif
157
158
159 /**************************************************************************************************/
160
161
162 #endif
163