Sleipnir
src/seekmap.cpp
00001 /*****************************************************************************
00002 * This file is provided under the Creative Commons Attribution 3.0 license.
00003 *
00004 * You are free to share, copy, distribute, transmit, or adapt this work
00005 * PROVIDED THAT you attribute the work to the authors listed below.
00006 * For more information, please see the following web page:
00007 * http://creativecommons.org/licenses/by/3.0/
00008 *
00009 * This file is a component of the Sleipnir library for functional genomics,
00010 * authored by:
00011 * Curtis Huttenhower (chuttenh@princeton.edu)
00012 * Mark Schroeder
00013 * Maria D. Chikina
00014 * Olga G. Troyanskaya (ogt@princeton.edu, primary contact)
00015 *
00016 * If you use this library, the included executable tools, or any related
00017 * code in your work, please cite the following publication:
00018 * Curtis Huttenhower, Mark Schroeder, Maria D. Chikina, and
00019 * Olga G. Troyanskaya.
00020 * "The Sleipnir library for computational functional genomics"
00021 *****************************************************************************/
00022 #include "seekmap.h"
00023 
00024 namespace Sleipnir {
00025 
00026 /*
00027  * IntIntMap Data Structure
00028  */
00029 void CSeekIntIntMap::Initialize(const utype &iSize){
00030     m_iF.resize(iSize);
00031     m_iR.resize(iSize);
00032     m_iSize = iSize;
00033     Clear();
00034 }
00035 CSeekIntIntMap::CSeekIntIntMap(const utype &iSize){
00036     Initialize(iSize);
00037 }
00038 
00039 const vector<utype>& CSeekIntIntMap::GetAllForward() const{
00040     return m_iF;
00041 }
00042 
00043 const vector<utype>& CSeekIntIntMap::GetAllReverse() const{
00044     return m_iR;
00045 }
00046 
00047 CSeekIntIntMap::CSeekIntIntMap(const vector<char> &cP, const bool bReverse){
00048     Initialize(cP.size());
00049     Reset(cP, bReverse);
00050 }
00051 
00052 
00053 CSeekIntIntMap::CSeekIntIntMap(const char *cP, const utype &iSize,
00054     const bool bReverse){
00055     Initialize(iSize);
00056     Reset(cP, bReverse);
00057 }
00058 
00059 CSeekIntIntMap::CSeekIntIntMap(CSeekIntIntMap *a){
00060     m_iNumSet = a->m_iNumSet;
00061     m_iSize = a->m_iSize;   
00062     m_iF.resize(a->m_iF.size());
00063     m_iR.resize(a->m_iR.size());
00064     copy(a->m_iF.begin(), a->m_iF.end(), m_iF.begin());
00065     copy(a->m_iR.begin(), a->m_iR.end(), m_iR.begin());
00066     m_iterR = m_iR.begin() + m_iNumSet;
00067 }
00068 
00069 CSeekIntIntMap::~CSeekIntIntMap(){
00070     m_iF.clear();
00071     m_iR.clear();
00072     m_iNumSet = 0;
00073     m_iSize = 0;
00074 }
00075 
00076 utype CSeekIntIntMap::GetForward(const utype &i) const{
00077     return m_iF[i];
00078 }
00079 
00080 utype CSeekIntIntMap::GetReverse(const utype &i) const{
00081     return m_iR[i];
00082 }
00083 
00084 void CSeekIntIntMap::Add(const utype &i){
00085     m_iF[i] = m_iNumSet;
00086     *m_iterR = i;
00087     m_iterR++;
00088     m_iNumSet++;
00089 }
00090 
00091 void CSeekIntIntMap::Clear(){
00092     vector<utype>::iterator iterF = m_iF.begin();
00093     vector<utype>::iterator iterR = m_iR.begin();
00094     for(; iterF!=m_iF.end(); iterF++, iterR++){
00095         *iterF = -1;
00096         *iterR = -1;
00097     }
00098     m_iNumSet = 0;
00099     m_iterR = m_iR.begin();
00100 }
00101 
00102 utype CSeekIntIntMap::GetNumSet() const{
00103     return m_iNumSet;
00104 }
00105 
00106 utype CSeekIntIntMap::GetSize() const{
00107     return m_iSize;
00108 }
00109 
00110 void CSeekIntIntMap::Reset(const char *cP, const bool bReverse){
00111     utype i;
00112     if(bReverse==false){
00113         for(i=0; i<m_iSize; i++){
00114             if(cP[i]==1){
00115                 Add(i);
00116             }
00117         }
00118     }else{
00119         for(i=0; i<m_iSize; i++){
00120             if(cP[i]==0){
00121                 Add(i);
00122             }
00123         }
00124     }
00125 }
00126 
00127 void CSeekIntIntMap::Reset(const vector<char> &cP, const bool bReverse){
00128     utype i;
00129     if(bReverse==false){
00130         for(i=0; i<m_iSize; i++){
00131             if(cP[i]==1){
00132                 Add(i);
00133             }
00134         }
00135     }else{
00136         for(i=0; i<m_iSize; i++){
00137             if(cP[i]==0){
00138                 Add(i);
00139             }
00140         }
00141     }
00142 }
00143 
00144 /*
00145  * StrIntMap Data Structure
00146  */
00147 CSeekStrIntMap::CSeekStrIntMap(){
00148     m_mapstrint.clear();
00149     m_mapintstr.clear();
00150 }
00151 
00152 CSeekStrIntMap::~CSeekStrIntMap(){
00153     m_mapstrint.clear();
00154     m_mapintstr.clear();
00155 }
00156 
00157 void CSeekStrIntMap::Clear(){
00158     m_mapstrint.clear();
00159     m_mapintstr.clear();
00160 }
00161 
00162 void CSeekStrIntMap::SetAll(const vector<string> &s){
00163     Clear();
00164     utype i = 0;
00165     for(i=0; i<s.size(); i++){
00166         m_mapstrint[s[i]] = i;
00167         m_mapintstr[i] = s[i];
00168     }
00169 }
00170 
00171 void CSeekStrIntMap::Set(const string &s, const utype &i){
00172     m_mapstrint[s] = i;
00173     m_mapintstr[i] = s;
00174 }
00175 
00176 map<string, utype>& CSeekStrIntMap::GetMapForward(){
00177     return m_mapstrint;
00178 }
00179 
00180 map<utype, string>& CSeekStrIntMap::GetMapReverse(){
00181     return m_mapintstr;
00182 }
00183 
00184 
00185 utype CSeekStrIntMap::Get(const string &s) const{
00186     map<string, utype>::const_iterator  iter = m_mapstrint.find(s);
00187     return iter->second;
00188 }
00189 
00190 string CSeekStrIntMap::Get(const utype &i) const{
00191     map<utype, string>::const_iterator  iter = m_mapintstr.find(i);
00192     return iter->second;
00193 }
00194 
00195 utype CSeekStrIntMap::GetSize() const{
00196     return m_mapintstr.size();
00197 }
00198 
00199 vector<string> CSeekStrIntMap::GetAllString() const{
00200     vector<string> vecStr;
00201     vecStr.clear();
00202     vecStr.resize(GetSize());
00203     map<string, utype>::const_iterator  iter = m_mapstrint.begin();
00204     vector<string>::iterator iterV = vecStr.begin();
00205     for(; iter!=m_mapstrint.end(); iter++, iterV++)
00206         *iterV = iter->first;
00207     return vecStr;
00208 }
00209 
00210 vector<utype> CSeekStrIntMap::GetAllInteger() const{
00211     vector<utype> vecInt;
00212     vecInt.clear();
00213     vecInt.resize(GetSize());
00214     map<utype, string>::const_iterator  iter = m_mapintstr.begin();
00215     vector<utype>::iterator iterV = vecInt.begin();
00216     for(; iter!=m_mapintstr.end(); iter++, iterV++)
00217         *iterV = iter->first;
00218     return vecInt;
00219 }
00220 }
00221