yat/omic/GFF.cc

Code
Comments
Other
Rev Date Author Line
2482 24 Apr 11 peter 1 // $Id$
2482 24 Apr 11 peter 2
2482 24 Apr 11 peter 3 /*
3875 05 Mar 20 peter 4   Copyright (C) 2011, 2012, 2020 Peter Johansson
2482 24 Apr 11 peter 5
2482 24 Apr 11 peter 6   This file is part of the yat library, http://dev.thep.lu.se/yat
2482 24 Apr 11 peter 7
2482 24 Apr 11 peter 8   The yat library is free software; you can redistribute it and/or
2482 24 Apr 11 peter 9   modify it under the terms of the GNU General Public License as
2482 24 Apr 11 peter 10   published by the Free Software Foundation; either version 3 of the
2482 24 Apr 11 peter 11   License, or (at your option) any later version.
2482 24 Apr 11 peter 12
2482 24 Apr 11 peter 13   The yat library is distributed in the hope that it will be useful,
2482 24 Apr 11 peter 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
2482 24 Apr 11 peter 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2482 24 Apr 11 peter 16   General Public License for more details.
2482 24 Apr 11 peter 17
2482 24 Apr 11 peter 18   You should have received a copy of the GNU General Public License
2482 24 Apr 11 peter 19   along with yat. If not, see <http://www.gnu.org/licenses/>.
2482 24 Apr 11 peter 20 */
2482 24 Apr 11 peter 21
2881 18 Nov 12 peter 22 #include <config.h>
2881 18 Nov 12 peter 23
2482 24 Apr 11 peter 24 #include "GFF.h"
2482 24 Apr 11 peter 25
2482 24 Apr 11 peter 26 #include "yat/utility/Exception.h"
2482 24 Apr 11 peter 27 #include "yat/utility/split.h"
2482 24 Apr 11 peter 28 #include "yat/utility/stl_utility.h"
2482 24 Apr 11 peter 29 #include "yat/utility/yat_assert.h"
2482 24 Apr 11 peter 30
2482 24 Apr 11 peter 31 #include <cassert>
2482 24 Apr 11 peter 32 #include <istream>
2482 24 Apr 11 peter 33 #include <map>
2482 24 Apr 11 peter 34 #include <ostream>
2482 24 Apr 11 peter 35 #include <sstream>
2482 24 Apr 11 peter 36 #include <string>
2482 24 Apr 11 peter 37 #include <vector>
2482 24 Apr 11 peter 38
2482 24 Apr 11 peter 39 namespace theplu {
2482 24 Apr 11 peter 40 namespace yat {
2482 24 Apr 11 peter 41 namespace omic {
2482 24 Apr 11 peter 42
2482 24 Apr 11 peter 43   GFF::GFF(void) {}
2482 24 Apr 11 peter 44
2482 24 Apr 11 peter 45   GFF::~GFF(void) {}
2482 24 Apr 11 peter 46
2482 24 Apr 11 peter 47   const std::string& GFF::attribute(const std::string& key) const
2723 12 Apr 12 peter 48   {
2482 24 Apr 11 peter 49     try {
2723 12 Apr 12 peter 50       return utility::get(attributes(), key);
2482 24 Apr 11 peter 51     }
2482 24 Apr 11 peter 52     catch (utility::runtime_error& e) {
2482 24 Apr 11 peter 53       std::stringstream ss;
2482 24 Apr 11 peter 54       ss << "GFF attribute `" << key << "' not found";
2482 24 Apr 11 peter 55       throw utility::runtime_error(ss.str());
2482 24 Apr 11 peter 56     }
2482 24 Apr 11 peter 57     assert(false && "we should never reach here since we throw above");
2482 24 Apr 11 peter 58     // return some nonsense to avoid compiler warning
2482 24 Apr 11 peter 59     return vec_[0];
2482 24 Apr 11 peter 60   }
2482 24 Apr 11 peter 61
2482 24 Apr 11 peter 62   const std::map<std::string, std::string>& GFF::attributes(void) const
2723 12 Apr 12 peter 63   {
2482 24 Apr 11 peter 64     if (attributes_.empty()) {
2482 24 Apr 11 peter 65       typedef std::map<std::string, std::string> StrMap;
2482 24 Apr 11 peter 66       // since we create attributes map lazily, i.e., first here and
2482 24 Apr 11 peter 67       // not already in getline we need to const_cast here. Prefer
2596 30 Oct 11 peter 68       // const_cast over declaring variable mutable; the latter
2482 24 Apr 11 peter 69       // would allow modifications in the entire class.
2482 24 Apr 11 peter 70       StrMap& a = const_cast<StrMap&>(attributes_);
2482 24 Apr 11 peter 71       create_attributes(a);
2482 24 Apr 11 peter 72     }
2723 12 Apr 12 peter 73     return attributes_;
2482 24 Apr 11 peter 74   }
2482 24 Apr 11 peter 75
2482 24 Apr 11 peter 76
2482 24 Apr 11 peter 77   const std::string& GFF::end(void) const
2723 12 Apr 12 peter 78   {
2482 24 Apr 11 peter 79     assert(4 < vec_.size());
2482 24 Apr 11 peter 80     return vec_[4];
2482 24 Apr 11 peter 81   }
2482 24 Apr 11 peter 82
2482 24 Apr 11 peter 83
2482 24 Apr 11 peter 84   const std::string& GFF::phase(void) const
2723 12 Apr 12 peter 85   {
2482 24 Apr 11 peter 86     assert(7 < vec_.size());
2482 24 Apr 11 peter 87     return vec_[7];
2482 24 Apr 11 peter 88   }
2482 24 Apr 11 peter 89
2482 24 Apr 11 peter 90
2482 24 Apr 11 peter 91   const std::string& GFF::score(void) const
2723 12 Apr 12 peter 92   {
2482 24 Apr 11 peter 93     assert(5 < vec_.size());
2482 24 Apr 11 peter 94     return vec_[5];
2482 24 Apr 11 peter 95   }
2482 24 Apr 11 peter 96
2482 24 Apr 11 peter 97
2482 24 Apr 11 peter 98   const std::string& GFF::seqid(void) const
2723 12 Apr 12 peter 99   {
2482 24 Apr 11 peter 100     assert(0 < vec_.size());
2482 24 Apr 11 peter 101     return vec_[0];
2482 24 Apr 11 peter 102   }
2482 24 Apr 11 peter 103
2482 24 Apr 11 peter 104
2482 24 Apr 11 peter 105   const std::string& GFF::source(void) const
2723 12 Apr 12 peter 106   {
2482 24 Apr 11 peter 107     assert(1 < vec_.size());
2482 24 Apr 11 peter 108     return vec_[1];
2482 24 Apr 11 peter 109   }
2482 24 Apr 11 peter 110
2482 24 Apr 11 peter 111
2482 24 Apr 11 peter 112   const std::string& GFF::start(void) const
2723 12 Apr 12 peter 113   {
2482 24 Apr 11 peter 114     assert(3 < vec_.size());
2482 24 Apr 11 peter 115     return vec_[3];
2482 24 Apr 11 peter 116   }
2482 24 Apr 11 peter 117
2482 24 Apr 11 peter 118
2482 24 Apr 11 peter 119   const std::string& GFF::strand(void) const
2723 12 Apr 12 peter 120   {
2482 24 Apr 11 peter 121     assert(6 < vec_.size());
2482 24 Apr 11 peter 122     return vec_[6];
2482 24 Apr 11 peter 123   }
2723 12 Apr 12 peter 124
2723 12 Apr 12 peter 125
2482 24 Apr 11 peter 126   const std::string& GFF::type(void) const
2723 12 Apr 12 peter 127   {
2482 24 Apr 11 peter 128     assert(2 < vec_.size());
2482 24 Apr 11 peter 129     return vec_[2];
2482 24 Apr 11 peter 130   }
2723 12 Apr 12 peter 131
2482 24 Apr 11 peter 132   const std::vector<std::string>& GFF::vec(void) const { return vec_; }
2482 24 Apr 11 peter 133
2482 24 Apr 11 peter 134   void GFF::create_attributes(std::map<std::string, std::string>& m) const
2482 24 Apr 11 peter 135   {
2482 24 Apr 11 peter 136     assert(8 < vec_.size());
2482 24 Apr 11 peter 137     std::vector<std::string> v;
2482 24 Apr 11 peter 138     utility::split(v, vec_[8], ';');
2723 12 Apr 12 peter 139
2723 12 Apr 12 peter 140     for (size_t i=0; i<v.size(); ++i)
2482 24 Apr 11 peter 141       add_attribute(m, v[i]);
2482 24 Apr 11 peter 142   }
2482 24 Apr 11 peter 143
2482 24 Apr 11 peter 144
2482 24 Apr 11 peter 145   std::ostream& operator<<(std::ostream& os, const GFF& gff)
2482 24 Apr 11 peter 146   {
2482 24 Apr 11 peter 147     if (gff.vec_.empty())
2482 24 Apr 11 peter 148       return os;
2482 24 Apr 11 peter 149     os << gff.vec()[0];
2482 24 Apr 11 peter 150     for (size_t i=1; i<gff.vec().size(); ++i)
3870 24 Feb 20 peter 151       os << "\t" << gff.vec()[i];
2482 24 Apr 11 peter 152     return os;
2482 24 Apr 11 peter 153   }
2482 24 Apr 11 peter 154
2482 24 Apr 11 peter 155
2482 24 Apr 11 peter 156   bool getline(std::istream& is, GFF& gff)
2482 24 Apr 11 peter 157   {
2482 24 Apr 11 peter 158     std::string line;
2482 24 Apr 11 peter 159     if (!getline(is, line))
2482 24 Apr 11 peter 160       return false;
2482 24 Apr 11 peter 161     // ignore comment
2482 24 Apr 11 peter 162     size_t i = line.find('#');
2723 12 Apr 12 peter 163     if (i!=std::string::npos)
2482 24 Apr 11 peter 164       line.resize(i);
2482 24 Apr 11 peter 165     if (line.empty())
2482 24 Apr 11 peter 166       return getline(is, gff);
2482 24 Apr 11 peter 167     gff.vec_.clear();
2482 24 Apr 11 peter 168     utility::split(gff.vec_, line, '\t');
2703 12 Mar 12 peter 169     gff.attributes_.clear();
2482 24 Apr 11 peter 170     return true;
2482 24 Apr 11 peter 171   }
2482 24 Apr 11 peter 172
2482 24 Apr 11 peter 173 }}}