]> git.donarmstrong.com Git - rsem.git/blob - GTFItem.h
RSEM Source Codes
[rsem.git] / GTFItem.h
1 #ifndef __GTFITEM__
2 #define __GTFITEM__
3
4 #include<cstdio>
5 #include<cstdlib>
6 #include<cassert>
7 #include<string>
8 #include<sstream>
9
10 #include "utils.h"
11
12 class GTFItem {
13  public:
14
15   GTFItem() {
16     seqname = source = feature = "";
17     score = "";
18     start = end = 0;
19     strand = 0; //strand is a char variable
20     frame = "";
21     gene_id = transcript_id = "";
22     left = "";
23   }
24
25   bool operator<(const GTFItem& o) const {
26           if (gene_id != o.gene_id) return gene_id < o.gene_id;
27           if (transcript_id != o.transcript_id) return transcript_id < o.transcript_id;
28           return start < o.start;
29   }
30
31   void my_assert(char value, std::string& line, const std::string& msg) {
32           if (!value) {
33                   fprintf(stderr, ".gtf file might be corrupted!\n");
34                   fprintf(stderr, "Stop at line : %s\n", line.c_str());
35                   fprintf(stderr, "Error Message: %s\n", msg.c_str());
36                   exit(-1);
37           }
38   }
39
40   void parse(std::string line) {
41     std::istringstream strin(line);
42     std::string tmp;
43
44     getline(strin, seqname, '\t');
45     getline(strin, source, '\t');
46     getline(strin, feature, '\t');
47     getline(strin, tmp, '\t');
48     start = atoi(tmp.c_str());
49     getline(strin, tmp, '\t');
50     end = atoi(tmp.c_str());
51     getline(strin, score, '\t');
52     getline(strin, tmp, '\t');
53     my_assert((tmp.length() == 1 && (tmp[0] == '+' || tmp[0] == '-')), line, "Strand is neither '+' nor '-'!");
54     strand = tmp[0];
55     getline(strin, frame, '\t');
56
57     getline(strin, tmp, ';'); tmp = cleanStr(tmp);
58     my_assert((tmp.substr(0, 7) == "gene_id"), line, "Identifier should be gene_id!");
59     tmp = cleanStr(tmp.substr(7));
60     my_assert((tmp[0] == '"' && tmp[tmp.length() - 1] == '"'), line, "Textual attributes should be surrounded by doublequotes!");
61     gene_id = tmp.substr(1, tmp.length() - 2);
62
63     getline(strin, tmp, ';'); tmp = cleanStr(tmp);
64     my_assert((tmp.substr(0, 13) == "transcript_id"), line, "Identifier should be transcript_id!");
65     tmp = cleanStr(tmp.substr(13));
66     my_assert((tmp[0] == '"' && tmp[tmp.length() - 1] == '"'), line, "Textual attributes should be surrounded by doublequotes!");
67     transcript_id = tmp.substr(1, tmp.length() - 2);
68
69     getline(strin, left);
70   }
71
72   std::string getSeqName() { return seqname; }
73   std::string getSource() { return source; }
74   std::string getFeature() { return feature; }
75   int getStart() { return start; }
76   int getEnd() { return end; }
77   char getStrand() { return strand; }
78   std::string getScore() { return score; }  // float, integer or "." ; let downstream programs parse it
79   std::string getFrame() { return frame; }  // 0, 1, 2, or "."; let downstream programs parse it
80   std::string getGeneID() { return gene_id; }
81   std::string getTranscriptID() { return transcript_id; }
82   std::string getLeft() { return left; }
83
84   void setGeneID(const std::string& gene_id) {
85     this->gene_id = gene_id;
86   }
87
88   std::string toString() {
89     std::string val;
90     std::ostringstream strout;
91     strout<<seqname<<'\t'<<source<<'\t'<<feature<<'\t'<<start<<'\t'<<end<<'\t'<<score<<'\t'<<strand<<'\t'<<frame<<'\t';
92     strout<<"gene_id \""<<gene_id<<"\"; transcript_id \""<<transcript_id<<"\";"<<left;
93     val = strout.str();
94
95     return val;
96   }
97
98  private:
99   std::string seqname, source, feature;
100   std::string score;
101   int start, end;
102   char strand;
103   std::string frame;
104   std::string gene_id, transcript_id;
105   std::string left;
106 };
107
108 #endif