halapi
hierarchichalalignmentformatapi
|
00001 /* 00002 * Copyright (C) 2012 by Glenn Hickey (hickey@soe.ucsc.edu) 00003 * 00004 * Released under the MIT license, see LICENSE.txt 00005 */ 00006 00007 #ifndef _HDF5DNAITERATOR_H 00008 #define _HDF5DNAITERATOR_H 00009 00010 #include <cassert> 00011 #include <H5Cpp.h> 00012 #include "halDNAIterator.h" 00013 #include "halCommon.h" 00014 #include "hdf5ExternalArray.h" 00015 #include "hdf5Genome.h" 00016 #include "hdf5DNA.h" 00017 00018 namespace hal { 00019 00020 class HDF5DNAIterator : public DNAIterator 00021 { 00022 public: 00023 00024 HDF5DNAIterator(HDF5Genome* genome, hal_index_t index); 00025 ~HDF5DNAIterator(); 00026 00027 hal_dna_t getChar() const; 00028 hal_dna_t getCompChar() const; 00029 void setChar(hal_dna_t c); 00030 void toLeft() const; 00031 void toRight() const; 00032 void jumpTo(hal_size_t index) const; 00033 const Genome* getGenome() const; 00034 Genome* getGenome(); 00035 hal_index_t getArrayIndex() const; 00036 00037 void readString(std::string& outString, hal_size_t length, 00038 hal_bool_t reversed = false) const; 00039 00040 void writeString(const std::string& inString, hal_size_t length, 00041 hal_bool_t reversed = false); 00042 00043 inline bool inRange() const; 00044 00045 protected: 00046 mutable hal_index_t _index; 00047 mutable HDF5Genome* _genome; 00048 }; 00049 00050 inline bool HDF5DNAIterator::inRange() const 00051 { 00052 return _index >= 0 && 00053 _index < (hal_index_t)_genome->_dnaArray.getSize(); 00054 } 00055 00056 inline hal_dna_t HDF5DNAIterator::getChar() const 00057 { 00058 assert(inRange() == true); 00059 return _genome->_dnaArray.getValue<hal_dna_t>(_index, 0); 00060 } 00061 00062 inline hal_dna_t HDF5DNAIterator::getCompChar() const 00063 { 00064 assert(inRange() == true); 00065 return reverseComplement(getChar()); 00066 } 00067 00068 inline void HDF5DNAIterator::setChar(hal_dna_t c) 00069 { 00070 if (inRange() == false) 00071 { 00072 throw hal_exception("Trying to set character out of range"); 00073 } 00074 _genome->_dnaArray.setValue(_index, 0, c); 00075 } 00076 00077 inline void HDF5DNAIterator::toLeft() const 00078 { 00079 --_index; 00080 } 00081 00082 inline void HDF5DNAIterator::toRight() const 00083 { 00084 ++_index; 00085 } 00086 00087 inline void HDF5DNAIterator::jumpTo(hal_size_t index) const 00088 { 00089 _index = static_cast<hal_index_t>(index); 00090 } 00091 00092 inline const Genome* HDF5DNAIterator::getGenome() const 00093 { 00094 return _genome; 00095 } 00096 00097 inline Genome* HDF5DNAIterator::getGenome() 00098 { 00099 return _genome; 00100 } 00101 00102 inline hal_index_t HDF5DNAIterator::getArrayIndex() const 00103 { 00104 return _index; 00105 } 00106 00107 inline void HDF5DNAIterator::readString(std::string& outString, 00108 hal_size_t length, 00109 hal_bool_t reversed) const 00110 { 00111 assert(inRange() == true); 00112 outString.resize(length); 00113 if (reversed == false) 00114 { 00115 for (hal_size_t i = 0; i < length; ++i) 00116 { 00117 outString[i] = getChar(); 00118 toRight(); 00119 } 00120 } 00121 else 00122 { 00123 for (hal_index_t i = length - 1; i >= 0; --i) 00124 { 00125 outString[i] = getCompChar(); 00126 toRight(); 00127 } 00128 } 00129 } 00130 00131 inline void HDF5DNAIterator::writeString(const std::string& inString, 00132 hal_size_t length, 00133 hal_bool_t reversed) 00134 { 00135 assert(inRange() == true); 00136 if (reversed == false) 00137 { 00138 for (hal_size_t i = 0; i < length; ++i) 00139 { 00140 setChar(inString[i]); 00141 toRight(); 00142 } 00143 } 00144 else 00145 { 00146 for (hal_index_t i = length - 1; i >= 0; --i) 00147 { 00148 setChar(reverseComplement(inString[i])); 00149 toRight(); 00150 } 00151 } 00152 } 00153 00154 } 00155 #endif