Overlap_AMOS.cc

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 #include "Overlap_AMOS.hh"
00011 using namespace AMOS;
00012 using namespace std;
00013 
00014 
00015 
00016 
00017 //================================================ Overlap_t ===================
00018 const NCode_t Overlap_t::NCODE = M_OVERLAP;
00019 
00020 
00021 //----------------------------------------------------- flip -------------------
00022 void Overlap_t::flip ( )
00023 {
00024   OverlapAdjacency_t oa = getAdjacency( );
00025   if ( oa == NORMAL )
00026     setAdjacency (ANTINORMAL);
00027   else if ( oa == ANTINORMAL )
00028     setAdjacency (NORMAL);
00029 
00030   Size_t tHang = aHang_m;
00031   aHang_m = bHang_m;
00032   bHang_m = tHang;
00033 
00034   reads_m = std::make_pair (reads_m . second, reads_m . first);
00035 }
00036 
00037 
00038 //----------------------------------------------------- getAdjacency -----------
00039 OverlapAdjacency_t Overlap_t::getAdjacency ( ) const
00040 {
00041   if ( flags_m . nibble & ADJACENCY_BIT )
00042     {
00043       switch (flags_m . nibble & ADJACENCY_BITS)
00044         {
00045         case NORMAL_BITS     : return NORMAL;
00046         case ANTINORMAL_BITS : return ANTINORMAL;
00047         case INNIE_BITS      : return INNIE;
00048         case OUTIE_BITS      : return OUTIE;
00049         }
00050     }
00051   return NULL_ADJACENCY;
00052 }
00053 
00054 
00055 //----------------------------------------------------- readMessage ------------
00056 void Overlap_t::readMessage (const Message_t & msg)
00057 {
00058   Universal_t::readMessage (msg);
00059 
00060   try {
00061     istringstream ss;
00062 
00063     if ( msg . exists (F_READS) )
00064       {
00065         ss . str (msg . getField (F_READS));
00066         ss >> reads_m . first;
00067         ss . ignore( );
00068         ss >> reads_m . second;
00069         if ( !ss )
00070           AMOS_THROW_ARGUMENT ("Invalid nodes format");
00071         ss . clear( );
00072       }
00073 
00074     if ( msg . exists (F_ADJACENCY) )
00075       {
00076         ss . str (msg . getField (F_ADJACENCY));
00077         setAdjacency (ss . get( ));
00078         ss . clear( );
00079       }
00080 
00081     if ( msg . exists (F_AHANG) )
00082       {
00083         ss . str (msg . getField (F_AHANG));
00084         ss >> aHang_m;
00085         if ( !ss )
00086           AMOS_THROW_ARGUMENT ("Invalid aHang format");
00087         ss . clear( );
00088       }
00089 
00090     if ( msg . exists (F_BHANG) )
00091       {
00092         ss . str (msg . getField (F_BHANG));
00093         ss >> bHang_m;
00094         if ( !ss )
00095           AMOS_THROW_ARGUMENT ("Invalid bHang format");
00096         ss . clear( );
00097       }
00098 
00099     if ( msg . exists (F_SCORE) )
00100       {
00101         ss . str (msg . getField (F_SCORE));
00102         ss >> score_m;
00103         if ( !ss )
00104           AMOS_THROW_ARGUMENT ("Invalid score format");
00105         ss . clear( );
00106       }
00107 
00108     if ( msg . exists (F_FLAG) )
00109       {
00110         char fA, fB, fC;
00111         ss . str (msg . getField (F_FLAG));
00112         ss >> fA >> fB >> fC;
00113         setFlagA ( fA == '1' );
00114         setFlagB ( fB == '1' );
00115         setFlagC ( fC == '1' );
00116         if ( !ss )
00117           AMOS_THROW_ARGUMENT ("Invalid flag format");
00118         ss . clear( );
00119       }
00120   }
00121   catch (ArgumentException_t) {
00122     
00123     clear( );
00124     throw;
00125   }
00126 }
00127 
00128 
00129 //----------------------------------------------------- readRecord -------------
00130 void Overlap_t::readRecord (istream & fix, istream & var)
00131 {
00132   Universal_t::readRecord (fix, var);
00133 
00134   readLE (fix, &aHang_m);
00135   readLE (fix, &bHang_m);
00136   readLE (fix, &(reads_m . first));
00137   readLE (fix, &(reads_m . second));
00138   readLE (fix, &score_m);
00139 }
00140 
00141 
00142 //----------------------------------------------------- readRecordFix ----------
00143 void Overlap_t::readRecordFix (istream & fix)
00144 {
00145   Universal_t::readRecordFix (fix);
00146 
00147   readLE (fix, &aHang_m);
00148   readLE (fix, &bHang_m);
00149   readLE (fix, &(reads_m . first));
00150   readLE (fix, &(reads_m . second));
00151   readLE (fix, &score_m);
00152 }
00153 
00154 
00155 //----------------------------------------------------- setAdjacency -----------
00156 void Overlap_t::setAdjacency (OverlapAdjacency_t adj)
00157 {
00158   uint8_t bits = flags_m . nibble;
00159   flags_m . nibble &= ~ADJACENCY_BITS;
00160   flags_m . nibble |=  ADJACENCY_BIT;
00161 
00162   switch (adj)
00163     {
00164     case NORMAL     : flags_m . nibble |= NORMAL_BITS;     break;
00165     case ANTINORMAL : flags_m . nibble |= ANTINORMAL_BITS; break;
00166     case INNIE      : flags_m . nibble |= INNIE_BITS;      break;
00167     case OUTIE      : flags_m . nibble |= OUTIE_BITS;      break;
00168     case NULL_ADJACENCY:
00169       flags_m . nibble &= ~ADJACENCY_BIT;
00170       break;
00171     default:
00172       flags_m . nibble = bits;
00173       AMOS_THROW_ARGUMENT ((string)"Invalid adjacency " + adj);
00174     }
00175 }
00176 
00177 
00178 //----------------------------------------------------- writeMessage -----------
00179 void Overlap_t::writeMessage (Message_t & msg) const
00180 {
00181   Universal_t::writeMessage (msg);
00182 
00183   try {
00184     ostringstream ss;
00185 
00186     msg . setMessageCode (Overlap_t::NCODE);
00187 
00188     if ( reads_m . first != NULL_ID  ||  reads_m . second != NULL_ID )
00189       {
00190         ss << reads_m . first << ',' << reads_m . second;
00191         msg . setField (F_READS, ss . str( ));
00192         ss . str (NULL_STRING);
00193       }
00194 
00195     if ( getAdjacency( ) != NULL_ADJACENCY )
00196       {
00197         ss << getAdjacency( );
00198         msg . setField (F_ADJACENCY, ss . str( ));
00199         ss . str (NULL_STRING);
00200       }
00201 
00202     ss << aHang_m;
00203     msg . setField (F_AHANG, ss . str( ));
00204     ss . str (NULL_STRING);
00205 
00206     ss << bHang_m;
00207     msg . setField (F_BHANG, ss . str( ));
00208     ss . str (NULL_STRING);
00209 
00210     ss << score_m;
00211     msg . setField (F_SCORE, ss . str( ));
00212     ss . str (NULL_STRING);
00213 
00214     if ( isFlagA( )  ||  isFlagB( )  ||  isFlagC( ) )
00215       {
00216         ss << isFlagA( ) << isFlagB( ) << isFlagC( );
00217         msg . setField (F_FLAG, ss . str( ));
00218         ss . str (NULL_STRING);
00219       }
00220   }
00221   catch (ArgumentException_t) {
00222 
00223     msg . clear( );
00224     throw;
00225   }
00226 }
00227 
00228 
00229 //----------------------------------------------------- writeRecord ------------
00230 void Overlap_t::writeRecord (ostream & fix, ostream & var) const
00231 {
00232   Universal_t::writeRecord (fix, var);
00233 
00234   writeLE (fix, &aHang_m);
00235   writeLE (fix, &bHang_m);
00236   writeLE (fix, &(reads_m . first));
00237   writeLE (fix, &(reads_m . second));
00238   writeLE (fix, &score_m);
00239 }

Generated on Mon Feb 22 17:36:27 2010 for libAMOS by  doxygen 1.4.7