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