Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

readdata.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  *                                                                             *
00003  *   Copyright (C) 2003  Erik Sjolund,  (<html>Erik Sj&ouml;lund</html>)       *
00004  *                       Center for Genomics and Bioinformatics,               *
00005  *                       Karolinska Institutet,                                *
00006  *                       Stockholm,                                            *
00007  *                       Sweden                                                *
00008  *                                                                             *
00009  *  Author: Erik Sjolund                                                       *
00010  *  Email: erik.sjolund@adivo.se                                               *
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;//Works since StorageData is trivial
00024 //   cerr<<"other.name_: "<<other.name_<<endl;
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   //Should work, since std::string conforms to trappervector interface
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   //Should work, since std::string conforms to trappervector interface
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   // is long the same thing as Q_INT64 ?
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 * /* not used */, const DBT *dbt1, const DBT *dbt2)
00199 {
00200   /* order after row and then after end position */
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   /* should never reach this point */
00216   return 0;
00217 }
00218 
00219 int ReadData::bt_compare_end( DB * /* not used */, const DBT *dbt1, const DBT *dbt2)
00220 {
00221   /* order after end position */
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   /* should never reach this point */
00233   return 0;
00234 }
00235 
00236 int ReadData::bt_compare_name( DB * /* not used */, const DBT *dbt1, const DBT *dbt2)
00237 {
00238   /* order after end position */
00239   
00240   char* seqData1 = ( char* ) dbt1->data;
00241   char* seqData2 = ( char* ) dbt2->data;
00242 
00243 //   cerr<<seqData1<<'\t'<<seqData2<<'\t'<<strcmp(seqData1, seqData2)<<endl;
00244   
00245   return strcmp(seqData1, seqData2);
00246 }
00247 
00248 int ReadData::getRowPos(Db * /* not used */, const Dbt * /* not used */,
00249                         const Dbt *pdata, Dbt *skey)
00250 {
00251   //  memset(skey, 0, sizeof(Dbt));
00252   //  ReadData::StorageData * data = ( ReadData::StorageData * ) pdata->get_data();
00253   //  skey->set_data( ( u_int8_t * ) (& (data->readRecno)) );
00254   // skey->set_size(sizeof( db_recno_t ));
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 * /* not used */, const Dbt * /* not used */,
00263                         const Dbt *pdata, Dbt *skey)
00264 {
00265   
00266   memset(skey, 0, sizeof(Dbt));
00267 
00268 //   ReadData* tmp = new ReadData();
00269 //   Database::setFromDbt(pdata, tmp);
00270 
00271 //   skey->set_data( (void*)tmp->name().c_str() );
00272 //   skey->set_size(strlen( tmp->name().c_str() ) + 1 );
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 }

Generated on Fri Mar 17 17:44:24 2006 for trapper by  doxygen 1.4.4