00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 #ifndef CGATOOLS_REFERENCE_GENEDATASTORE_HPP_
00016 #define CGATOOLS_REFERENCE_GENEDATASTORE_HPP_ 1
00017 
00019 
00020 #include "cgatools/core.hpp"
00021 #include "cgatools/util/RangeIntersector.hpp"
00022 #include "cgatools/util/DelimitedFile.hpp"
00023 #include "cgatools/reference/CrrFile.hpp"
00024 
00025 namespace cgatools { namespace reference {
00026 
00027 struct GeneDescriptionData
00028 {
00029     std::string mrnaAcc_, proteinAcc_, geneId_, symbol_;
00030     bool strand_;
00031     std::vector<Range> exonRanges_;
00032     Range genomeCodingRange_;
00033 };
00034 
00035 class GeneDataStore
00036 {
00037 private:
00038     typedef util::IntervalTree<Range,
00039                                Location,
00040                                GeneDescriptionData,
00041                                RangeOverlap,
00042                                GetRangeBoundary > DataStore;
00043 public:
00044     typedef DataStore::QueryResultType QueryResultType;
00045 
00046     GeneDataStore(const reference::CrrFile& crr, const std::string& fn)
00047     {
00048         load(crr, fn);
00049     }
00050 
00051     const util::DelimitedFileMetadata& getMetadata() const
00052     {
00053         return metadata_;
00054     }
00055 
00056     void intersect(const reference::Range& range,
00057                    std::vector<QueryResultType>& result) const
00058     {
00059         tree_.intersect(range, result);
00060     }
00061 
00062 private:
00063     util::DelimitedFileMetadata metadata_;
00064     DataStore tree_;
00065 
00066     void load(const reference::CrrFile& crr, const std::string& fn);
00067 };
00068 
00069 }}
00070 
00071 #endif