Sleipnir
|
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