00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "readdata.h"
00015 #include <map>
00016 #include "trappervector.h"
00017 #include <ostream>
00018
00019 using namespace std;
00020
00021 ReadData::ReadData( const ReadData& other ) : GeneralData(other)
00022 {
00023 s = other.s;
00024
00025 name_ = other.name_;
00026 mate_ = other.mate_;
00027 matelen_ = other.matelen_;
00028 strand_ = other.strand_;
00029 beginGood_ = other.beginGood_;
00030 endGood_ = other.endGood_;
00031
00032 }
00033
00034
00035 ReadData::~ReadData()
00036 {}
00037
00038 void ReadData::print_debug_info()
00039 {
00040 cerr<<"This is class "<<uniqueName()<<endl;
00041 cerr<<"recno: "<<getRecno()<<endl;
00042 cerr<<"row: "<<row()<<endl;
00043 cerr<<"startPos: "<<startPos()<<endl;
00044 cerr<<"endPos: "<<endPos()<<endl;
00045 }
00046
00047 void ReadData::readStream( QDataStream & stream )
00048 {
00049 QIODevice * dev = stream.device();
00050 Q_ASSERT( dev );
00051 stream.readRawBytes( ( char * ) &s, sizeof ( StorageData ) );
00052
00053 QString tmp;
00054 stream>>tmp;
00055 name_ = tmp.ascii();
00056 stream>>tmp;
00057 mate_ = tmp.ascii();
00058 stream>>matelen_;
00059 stream>>tmp;
00060 strand_ = tmp.ascii();
00061 stream>>beginGood_;
00062 stream>>endGood_;
00063 }
00064
00065 void ReadData::writeStream( QDataStream & stream )
00066 {
00067 QIODevice * dev = stream.device();
00068 Q_ASSERT( dev );
00069 if ( ! ( IO_WriteOnly & dev->mode() ) )
00070 {
00071 cerr << "data stream should be writeonly" << endl;
00072 exit(1);
00073 }
00074 stream.writeRawBytes( ( char * ) &s, sizeof ( StorageData ) );
00075
00076 QString tmp;
00077 tmp = name_;
00078 stream<<tmp;
00079 tmp = mate_;
00080 stream<<tmp;
00081 stream<<matelen_;
00082 tmp = strand_;
00083 stream<<tmp;
00084 stream<<beginGood_;
00085 stream<<endGood_;
00086 }
00087
00088 void ReadData::writeDom( QDomElement & elem )
00089 {
00090 GeneralData::writeDom( elem );
00091 Q_INT32 startPos = s.startPos;
00092 Q_INT32 endPos = s.endPos;
00093 Q_INT32 row = s.row;
00094 QString startPosStr, endPosStr, rowStr;
00095 startPosStr.setNum( startPos );
00096 endPosStr.setNum( endPos );
00097 rowStr.setNum( row );
00098 elem.setAttribute("startPos", startPosStr );
00099 elem.setAttribute("endPos", endPosStr);
00100 elem.setAttribute("row", rowStr);
00101 elem.setAttribute("name", name_ );
00102 }
00103
00104 void ReadData::readDom( QDomElement & elem )
00105 {
00106 GeneralData::readDom( elem );
00107 QString startPosStr = elem.attribute("startPos");
00108 long startPosLong = startPosStr.toLong();
00109
00110 s.startPos = startPosLong;
00111 QString endPosStr = elem.attribute("endPos");
00112 long endPosLong = endPosStr.toLong();
00113 s.endPos = endPosLong;
00114 QString rowStr = elem.attribute("row");
00115 long rowLong = rowStr.toLong();
00116 s.row = rowLong;
00117 name_ = elem.attribute("name").ascii();
00118 }
00119 void ReadData::readAttributes( const QXmlAttributes& attr )
00120 {
00121 if ( attr.value("row") != "" ) {
00122 QString rowPosStr = attr.value("row");
00123 s.row = rowPosStr.toLong();
00124 }
00125 if ( attr.value("startPos") != "" ) {
00126 QString startPosStr = attr.value("startPos");
00127 s.startPos = startPosStr.toLong();
00128 }
00129 if ( attr.value("endPos") != "" ) {
00130 QString endPosStr = attr.value("endPos");
00131 s.endPos = endPosStr.toLong();
00132 endGood_ = s.endPos - s.startPos;
00133 }
00134 if ( attr.value("name") != "" ) {
00135 name_ = attr.value("name").ascii();
00136 }
00137 if ( attr.value("mate") != "" ) {
00138 mate_ = attr.value("mate").ascii();
00139 }
00140 if ( attr.value("matelen") != "" ) {
00141 matelen_ = attr.value("matelen").toInt();
00142 }
00143 if ( attr.value("strand") != "" ) {
00144 strand_ = attr.value("strand").ascii();
00145 }
00146 if ( attr.value("beginGood") != "" ) {
00147 beginGood_ = attr.value("beginGood").toInt();
00148 }
00149 if ( attr.value("endGood") != "" ) {
00150 endGood_ = attr.value("endGood").toInt();
00151 }
00152 }
00153
00154 void ReadData::writeXml( ostream& stream )
00155 {
00156 stream<<"<ReadData "
00157 <<"row=\""<<s.row<<"\" "
00158 <<"startPos=\""<<s.startPos<<"\" "
00159 <<"endPos=\""<<s.endPos<<"\" "
00160 <<"name=\""<<name_<<"\" "
00161 <<"mate=\""<<mate_<<"\" "
00162 <<"matelen=\""<<matelen_<<"\" "
00163 <<"strand=\""<<strand_<<"\" "
00164 <<"beginGood=\""<<beginGood_<<"\" "
00165 <<"endGood=\""<<endGood_<<"\">\n";
00166 }
00167
00168 TrDb::IndexMap ReadData::getIndexMap()
00169 {
00170 TrDb::IndexMap iMap;
00171 TrDb::Index i = {
00172 &ReadData::bt_compare_rowPos,
00173 &ReadData::getRowPos,
00174 QString("pos"),
00175 NULL
00176 };
00177 iMap.insert( make_pair( i.name.ascii(), i ) );
00178
00179 TrDb::Index i2 = {
00180 &ReadData::bt_compare_end,
00181 &ReadData::getRowPos,
00182 QString("end"),
00183 NULL
00184 };
00185 iMap.insert( make_pair( i2.name.ascii(), i2 ) );
00186
00187 TrDb::Index i3 = {
00188 &ReadData::bt_compare_name,
00189 &ReadData::getName,
00190 QString("name"),
00191 NULL
00192 };
00193 iMap.insert( make_pair( i3.name.ascii(), i3 ) );
00194
00195 return iMap;
00196 }
00197
00198 int ReadData::bt_compare_rowPos( DB * , const DBT *dbt1, const DBT *dbt2)
00199 {
00200
00201
00202 ReadData::StorageData * seqData1 = ( ReadData::StorageData *) dbt1->data;
00203 ReadData::StorageData * seqData2 = ( ReadData::StorageData *) dbt2->data;
00204 if ( seqData1->row > seqData2->row )
00205 return 1;
00206 if ( seqData1->row < seqData2->row )
00207 return -1;
00208 if ( seqData1->endPos == seqData2->endPos )
00209 return 0;
00210 if ( seqData1->endPos > seqData2->endPos )
00211 return 1;
00212 if ( seqData1->endPos < seqData2->endPos )
00213 return -1;
00214
00215
00216 return 0;
00217 }
00218
00219 int ReadData::bt_compare_end( DB * , const DBT *dbt1, const DBT *dbt2)
00220 {
00221
00222
00223 ReadData::StorageData * seqData1 = ( ReadData::StorageData *) dbt1->data;
00224 ReadData::StorageData * seqData2 = ( ReadData::StorageData *) dbt2->data;
00225 if ( seqData1->endPos > seqData2->endPos )
00226 return 1;
00227 if ( seqData1->endPos < seqData2->endPos )
00228 return -1;
00229 if ( seqData1->endPos == seqData2->endPos )
00230 return 0;
00231
00232
00233 return 0;
00234 }
00235
00236 int ReadData::bt_compare_name( DB * , const DBT *dbt1, const DBT *dbt2)
00237 {
00238
00239
00240 char* seqData1 = ( char* ) dbt1->data;
00241 char* seqData2 = ( char* ) dbt2->data;
00242
00243
00244
00245 return strcmp(seqData1, seqData2);
00246 }
00247
00248 int ReadData::getRowPos(Db * , const Dbt * ,
00249 const Dbt *pdata, Dbt *skey)
00250 {
00251
00252
00253
00254
00255
00256 memset(skey, 0, sizeof(Dbt));
00257 skey->set_data( pdata->get_data() );
00258 skey->set_size(sizeof( struct ReadData::StorageData ));
00259 return(0);
00260 }
00261
00262 int ReadData::getName(Db * , const Dbt * ,
00263 const Dbt *pdata, Dbt *skey)
00264 {
00265
00266 memset(skey, 0, sizeof(Dbt));
00267
00268
00269
00270
00271
00272
00273
00274 ReadData tmp;
00275 Database::setFromDbt(pdata, &tmp);
00276 char* name = (char*)malloc(sizeof(char)*(tmp.name().length() + 1));
00277 strcpy(name, tmp.name().c_str());
00278 assert( name[ tmp.name().length() ] == '\0' );
00279 skey->set_flags( DB_DBT_APPMALLOC );
00280 skey->set_data( (void*)name );
00281 skey->set_size(sizeof(char)*(strlen(name) + 1) );
00282
00283
00284 return 0;
00285 }