1 #include "vcfheader.hpp"
2
3 using namespace std;
4 namespace vcfh{
5
Header()6 Header::Header(){
7 my_header_fields.set_fields = {"CHROM", "POS", "ID", "REF", "ALT", "QUAL", "FILTER", "INFO"};
8 my_reference = "";
9 my_source = "";
10 my_contig = "";
11 my_date = "";
12 my_version = "";
13 }
14
~Header()15 Header::~Header(){
16
17 }
18
set_reference(string ref_file)19 void Header::set_reference(string ref_file){
20 my_reference = ref_file;
21 }
22
set_date()23 void Header::set_date(){
24 string d = make_date();
25 my_date = d;
26 }
27
make_date()28 string Header::make_date(){
29 time_t now = time(0);
30 tm *ltm = localtime(&now);
31 char buffer [20];
32 strftime(buffer, 20, "%G%m%d", ltm);
33 return string(buffer);
34 }
35
set_source(string s)36 void Header::set_source(string s){
37 my_source = s;
38 }
39
set_contig(string c)40 void Header::set_contig(string c){
41 my_contig = c;
42 }
43
set_version(string v)44 void Header::set_version(string v){
45 my_version = v;
46 }
47
add_format(vcfh_format f)48 void Header::Header::add_format(vcfh_format f){
49 my_formats.push_back(f);
50 }
51
add_info(vcfh_info i)52 void Header::add_info(vcfh_info i){
53 my_infos.push_back(i);
54 }
55
add_field(string f)56 void Header::add_field(string f){
57 my_header_fields.opt_fields.push_back(f);
58 }
59
add_filter(vcfh_filter f)60 void Header::add_filter(vcfh_filter f){
61 my_filters.push_back(f);
62 }
63
get_fields() const64 string Header::get_fields() const{
65 string ret;
66 ret = "#";
67 int i;
68 for (i=0; i < my_header_fields.set_fields.size(); i++){
69 ret += my_header_fields.set_fields[i] + "\t";
70 }
71 for (i=0; i < my_header_fields.opt_fields.size(); i++){
72 ret += my_header_fields.opt_fields[i] + "\t";
73 }
74 return ret;
75 }
76
to_string() const77 string Header::to_string() const{
78 // print format (version), date, source and reference.
79 string ret;
80 ret = string("##fileformat=") + my_version + "\n";
81 ret += "##fileDate=" + my_date + "\n";
82 ret += "##source=" + my_source + "\n";
83 ret += "##reference=" + my_reference + "\n";
84 ret += "##contig=" + my_contig + "\n";
85
86 //print info fields
87 int i;
88 for (i = 0; i < my_infos.size(); i++){
89 ret += string("##INFO=<") + "ID=" + my_infos[i].id + ",Number=" + my_infos[i].number + ",Type=" + my_infos[i].type + ",Description=" + my_infos[i].description + ">\n";
90 }
91
92 // print filter fields
93 for (i = 0; i < my_filters.size(); i++){
94 ret += string("##FILTER=<") + "ID=" + my_filters[i].id + ",Number=" + my_filters[i].number + ",Type=" + my_filters[i].type + ",Description=" + my_filters[i].description + ">\n";
95 }
96
97 //print format fields
98 for (i = 0; i < my_formats.size(); i++){
99 ret += string("##FORMAT=<") + "ID=" + my_formats[i].id + ",Number=" + my_formats[i].number + ",Type=" + my_formats[i].type + ",Description=" + my_formats[i].description + ">\n";
100 }
101
102 ret+=get_fields();
103 return ret;
104 }
105
operator <<(std::ostream & os,const vcfh::Header & h)106 std::ostream& operator<<(std::ostream& os, const vcfh::Header& h){
107 os << h.to_string();
108 return os;
109 }
110 }
111