00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "featuredata.h"
00016 #include <qdatastream.h>
00017 #include <qstring.h>
00018 #include <iostream>
00019
00020 using namespace std;
00021
00022 class Dbt;
00023
00024 FeatureData::FeatureData( db_recno_t readRecno, TR_DNA startPos, TR_DNA endPos) : GeneralData()
00025 {
00026 s.readRecno = readRecno;
00027 s.startPos = startPos;
00028 s.endPos = endPos;
00029 m_gui = NULL;
00030 m_info = NULL;
00031 }
00032
00033 FeatureData::~FeatureData()
00034 {
00035 delete m_gui;
00036 delete m_info;
00037 }
00038
00039 FeatureGui * FeatureData::gui()
00040 {
00041
00042 if ( !m_gui )
00043 m_gui = makeGui();
00044
00045 return m_gui;
00046 }
00047
00048 FeatureInfo * FeatureData::info()
00049 {
00050
00051 if ( !m_info )
00052 m_info = makeInfo();
00053
00054 return m_info;
00055 }
00056
00057 FeatureInfo * FeatureData::makeInfo()
00058 {
00059
00060 return new FeatureInfo(this);
00061 }
00062
00063 TrDb::IndexMap FeatureData::getIndexMap()
00064 {
00065 TrDb::IndexMap iMap;
00066 TrDb::Index i = {
00067 &FeatureData::bt_compare_seqRecNo,
00068 &FeatureData::getSeqRecNo,
00069 QString("readRecno"),
00070 NULL
00071 };
00072 iMap.insert( make_pair( i.name.ascii(), i ) );
00073 return iMap;
00074 }
00075
00076 void FeatureData::writeStream( QDataStream & stream )
00077 {
00078 QIODevice * dev = stream.device();
00079 Q_ASSERT( dev );
00080 if ( ! ( IO_WriteOnly & dev->mode() ) )
00081 {
00082 cerr << "data stream should be writeonly" << endl;
00083 exit(1);
00084 }
00085 stream.writeRawBytes( ( char * ) &s, sizeof ( StorageData ) );
00086 }
00087
00088 void FeatureData::readStream( QDataStream & stream )
00089 {
00090 QIODevice * dev = stream.device();
00091 Q_ASSERT( dev );
00092 stream.readRawBytes( ( char * ) &s, sizeof ( StorageData ) );
00093 }
00094
00095 void FeatureData::readDom( QDomElement & elem )
00096 {
00097 GeneralData::readDom( elem );
00098 QString startPosStr = elem.attribute("startPos");
00099 long startPosLong = startPosStr.toLong();
00100
00101 s.startPos = startPosLong;
00102 QString endPosStr = elem.attribute("endPos");
00103 ulong endPosLong = endPosStr.toLong();
00104 s.endPos = endPosLong;
00105 QString readRecnoStr = elem.attribute("readRecno");
00106 ulong readRecnoLong = readRecnoStr.toLong();
00107 s.readRecno = static_cast< db_recno_t >( readRecnoLong );
00108 }
00109
00110 void FeatureData::readAttributes( const QXmlAttributes& attr )
00111 {
00112
00113 if ( attr.value("startPos") != "" ) {
00114 QString startPosStr = attr.value("startPos");
00115 long startPosLong = startPosStr.toLong();
00116
00117 s.startPos = startPosLong;
00118 }
00119 if ( attr.value("endPos") != "" ) {
00120 QString endPosStr = attr.value("endPos");
00121 ulong endPosLong = endPosStr.toLong();
00122 s.endPos = endPosLong;
00123 }
00124 }
00125 void FeatureData::writeXml( ostream& stream )
00126 {
00127 stream<<'<'<<uniqueName()<<' '
00128 <<"startPos=\""<<s.startPos<<"\" "
00129 <<"endPos=\""<<s.endPos<<"\"";
00130 }
00131
00132 void FeatureData::print_debug_info()
00133 {
00134 cerr<<"readRecno: "<<s.readRecno<<endl;
00135 }
00136
00137 void FeatureData::writeDom( QDomElement & elem )
00138 {
00139 GeneralData::writeDom( elem );
00140 Q_UINT32 readRecno = s.readRecno;
00141 QString startPosStr, endPosStr, readRecnoStr;
00142 startPosStr.setNum( ( Q_INT32 ) s.startPos );
00143 endPosStr.setNum( ( Q_INT32 ) s.endPos );
00144 readRecnoStr.setNum( readRecno );
00145 elem.setAttribute("startPos", startPosStr );
00146 elem.setAttribute("endPos", endPosStr);
00147 elem.setAttribute("readRecno", readRecnoStr);
00148 }
00149
00150
00151
00152 DnpData::DnpData( db_recno_t readRecno, TR_DNA startPos, TR_DNA endPos )
00153 : FeatureData( readRecno, startPos, endPos ), dnpID(-1), type(-1)
00154 {}
00155
00156 void DnpData::readStream( QDataStream & stream )
00157 {
00158 FeatureData::readStream( stream );
00159 stream>>dnpID>>type;
00160 }
00161
00162 void DnpData::writeStream( QDataStream & str )
00163 {
00164 FeatureData::writeStream( str );
00165 str<<dnpID<<type;
00166 }
00167
00168 void DnpData::writeDom( QDomElement & elem )
00169 {
00170 FeatureData::writeDom( elem );
00171 elem.setAttribute("dnp", "11" );
00172 }
00173
00174 void DnpData::readDom( QDomElement & elem )
00175 {
00176 FeatureData::readDom( elem );
00177 }
00178
00179 void DnpData::readAttributes( const QXmlAttributes& attr )
00180 {
00181 FeatureData::readAttributes( attr );
00182 if ( attr.value("dnpID") != "" ) {
00183 dnpID = attr.value("dnpID").toInt();
00184 }
00185 if ( attr.value("type") != "" ) {
00186 type = attr.value("type").toInt();
00187 }
00188
00189 }
00190 void DnpData::writeXml( ostream& stream )
00191 {
00192 FeatureData::writeXml(stream);
00193 stream<<" dnpID=\""<<dnpID<<"\""
00194 <<" type=\""<<type<<"\"";
00195 stream<<"/>\n";
00196 }
00197
00198
00199 void DnpData::set_dnpID(int id)
00200 {
00201 dnpID = id;
00202 }
00203
00204 int DnpData::get_dnpID()
00205 {
00206 return dnpID;
00207 }
00208
00209 void DnpData::set_dnp_type(int t)
00210 {
00211 type = t;
00212 }
00213
00214 int DnpData::get_dnp_type()
00215 {
00216 return type;
00217 }
00218
00219 void DnaStrData::writeStream( QDataStream & stream )
00220 {
00221 FeatureData::writeStream( stream );
00222 stream << dnaVector;
00223 }
00224
00225
00226 DnaStrData::DnaStrData( db_recno_t readRecno, TR_DNA startPos, TR_DNA endPos )
00227 : FeatureData( readRecno, startPos, endPos )
00228 {}
00229
00230 void DnaStrData::readStream( QDataStream & stream )
00231 {
00232 FeatureData::readStream( stream );
00233 stream >> dnaVector;
00234 }
00235
00236
00237
00238 void DnaStrData::writeDom( QDomElement & elem )
00239 {
00240 FeatureData::writeDom( elem );
00241 dnaVector.writeDom( elem );
00242 }
00243
00244 void DnaStrData::readDom( QDomElement & elem )
00245 {
00246 FeatureData::readDom( elem );
00247 dnaVector.readDom( elem );
00248 }
00249
00250 void DnaStrData::readAttributes(const QXmlAttributes& attr)
00251 {
00252 FeatureData::readAttributes(attr);
00253 dnaVector.readAttributes(attr);
00254 }
00255
00256 void DnaStrData::writeXml( ostream& stream )
00257 {
00258 FeatureData::writeXml(stream);
00259 stream<<" trappervector=\"";
00260 for( size_t i = 0; i < dnaVector.stlVector().size(); i++ ) {
00261 stream<<dnaVector.stlVector()[i];
00262 }
00263 stream<<"\"/>\n";
00264 }
00265
00266
00267 DnaStrData::~DnaStrData()
00268 {
00269 }
00270
00271 void QualityData::readStream( QDataStream & stream )
00272 {
00273 FeatureData::readStream( stream );
00274 stream >> qualityVector;
00275 }
00276
00277 void QualityData::writeStream( QDataStream & stream )
00278 {
00279 FeatureData::writeStream( stream );
00280 stream << qualityVector;
00281 }
00282
00283 void QualityData::writeDom( QDomElement & elem )
00284 {
00285 FeatureData::writeDom( elem );
00286 qualityVector.writeDom( elem );
00287 }
00288
00289 void QualityData::readDom( QDomElement & elem )
00290 {
00291 FeatureData::readDom( elem );
00292 qualityVector.readDom( elem );
00293 }
00294
00295 void QualityData::readAttributes(const QXmlAttributes& attr)
00296 {
00297 FeatureData::readAttributes(attr);
00298 qualityVector.readAttributes(attr);
00299 }
00300
00301 void QualityData::writeXml( ostream& stream )
00302 {
00303 FeatureData::writeXml(stream);
00304 stream<<" trappervector=\"";
00305 for( size_t i = 0; i < qualityVector.stlVector().size(); i++ ) {
00306 stream<<' '<<qualityVector.stlVector()[i];
00307 }
00308 stream<<"\"/>\n";
00309 }
00310
00311 ChromatData::ChromatData( db_recno_t readRecno, TR_DNA startPos, TR_DNA endPos ):
00312 FeatureData( readRecno, startPos, endPos ), cagt_vec(4)
00313 {}
00314
00315 void ChromatData::readStream( QDataStream & str )
00316 {
00317 FeatureData::readStream( str );
00318 for( size_t i = 0; i < 4; i++ ) {
00319 str>>cagt_vec[i];
00320 }
00321 str>>phd_vec;
00322 str>>gap_vec;
00323 }
00324
00325 void ChromatData::writeStream( QDataStream & str )
00326 {
00327 FeatureData::writeStream( str );
00328 for( size_t i = 0; i < 4; i++ ) {
00329 str<<cagt_vec[i];
00330 }
00331 str<<phd_vec;
00332 str<<gap_vec;
00333 }
00334
00335 void ChromatData::writeDom( QDomElement & elem )
00336 {
00337 FeatureData::writeDom( elem );
00338 elem.setAttribute("cc", "11" );
00339 }
00340
00341 void ChromatData::readDom( QDomElement & elem )
00342 {
00343 FeatureData::readDom( elem );
00344
00345 }
00346 void ChromatData::readAttributes(const QXmlAttributes& attr)
00347 {
00348 FeatureData::readAttributes(attr);
00349
00350 if ( attr.value("c_vector") != "" ) {
00351 QString str = attr.value("c_vector");
00352 cagt_vec[0].readString(str);
00353
00354 }
00355 if ( attr.value("a_vector") != "" ) {
00356 QString str = attr.value("a_vector");
00357 cagt_vec[1].readString(str);
00358
00359 }
00360 if ( attr.value("g_vector") != "" ) {
00361 QString str = attr.value("g_vector");
00362 cagt_vec[2].readString(str);
00363
00364 }
00365 if ( attr.value("t_vector") != "" ) {
00366 QString str = attr.value("t_vector");
00367 cagt_vec[3].readString(str);
00368
00369 }
00370 if ( attr.value("phd") != "" ) {
00371 QString str = attr.value("phd");
00372 phd_vec.readString(str);
00373
00374 }
00375 if ( attr.value("gap") != "" ) {
00376 QString str = attr.value("gap");
00377 gap_vec.readString(str);
00378
00379 }
00380
00381 }
00382 void ChromatData::writeXml( ostream& stream )
00383 {
00384 FeatureData::writeXml(stream);
00385 if ( cagt_vec[0].stlVector().size() > 0 ) {
00386 stream<<" c_vector=\"";
00387 for( size_t i = 0; i < cagt_vec[0].stlVector().size(); i++ ) {
00388 stream<<' '<<cagt_vec[0].stlVector()[i];
00389 }
00390 stream<<"\"";
00391 }
00392 if ( cagt_vec[1].stlVector().size() > 0 ) {
00393 stream<<" a_vector=\"";
00394 for( size_t i = 0; i < cagt_vec[1].stlVector().size(); i++ ) {
00395 stream<<' '<<cagt_vec[1].stlVector()[i];
00396 }
00397 stream<<"\"";
00398 }
00399 if ( cagt_vec[2].stlVector().size() > 0 ) {
00400 stream<<" g_vector=\"";
00401 for( size_t i = 0; i < cagt_vec[2].stlVector().size(); i++ ) {
00402 stream<<' '<<cagt_vec[2].stlVector()[i];
00403 }
00404 stream<<"\"";
00405 }
00406 if ( cagt_vec[3].stlVector().size() > 0 ) {
00407 stream<<" t_vector=\"";
00408 for( size_t i = 0; i < cagt_vec[3].stlVector().size(); i++ ) {
00409 stream<<' '<<cagt_vec[3].stlVector()[i];
00410 }
00411 stream<<"\"";
00412 }
00413 if ( phd_vec.stlVector().size() > 0 ) {
00414 stream<<" phd=\"";
00415 for( size_t i = 0; i < phd_vec.stlVector().size(); i++ ) {
00416 stream<<' '<<phd_vec.stlVector()[i];
00417 }
00418 stream<<"\"";
00419 }
00420 if ( gap_vec.stlVector().size() > 0 ) {
00421 stream<<" gap=\"";
00422 for( size_t i = 0; i < gap_vec.stlVector().size(); i++ ) {
00423 stream<<' '<<gap_vec.stlVector()[i];
00424 }
00425 stream<<"\"";
00426 }
00427
00428 stream<<"/>\n";
00429 }
00430
00431 QualityData::QualityData( db_recno_t readRecno, TR_DNA startPos, TR_DNA endPos, int quality_ ):
00432 FeatureData( readRecno, startPos, endPos )
00433 {}
00434
00435 int FeatureData::bt_compare_seqRecNo( DB * , const DBT *dbt1, const DBT *dbt2)
00436 {
00437
00438 db_recno_t * recno1 = ( db_recno_t *) dbt1->data;
00439 db_recno_t * recno2 = ( db_recno_t *) dbt2->data;
00440 if ( *recno1 > *recno2 )
00441 return 1;
00442 if ( *recno1 < *recno2 )
00443 return -1;
00444 if ( *recno1 == *recno2 )
00445 return 0;
00446
00447 return 0;
00448 }
00449
00450 int FeatureData::getSeqRecNo( Db * , const Dbt * , const Dbt *pdata, Dbt *skey)
00451 {
00452 memset(skey, 0, sizeof(Dbt));
00453 StorageData * data = ( StorageData * ) pdata->get_data();
00454 skey->set_data( ( u_int8_t * ) (& (data->readRecno)) );
00455 skey->set_size(sizeof( db_recno_t ));
00456 return(0);
00457 }