FindMatesAlgo Class Reference

#include <findmatesalgo.h>

Inheritance diagram for FindMatesAlgo:

Inheritance graph
[legend]
Collaboration diagram for FindMatesAlgo:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 FindMatesAlgo (TrapperDoc *pDoc_, std::set< db_recno_t > &recnoList, AlgoParam *param)
void start ()

Detailed Description

Definition at line 6 of file findmatesalgo.h.


Constructor & Destructor Documentation

FindMatesAlgo::FindMatesAlgo ( TrapperDoc pDoc_,
std::set< db_recno_t > &  recnoList,
AlgoParam param 
) [inline]

Definition at line 9 of file findmatesalgo.h.

00009 : Algo(pDoc_, recnoList, param) {}


Member Function Documentation

void FindMatesAlgo::start (  )  [virtual]

Implements Algo.

Definition at line 14 of file findmatesalgo.cc.

References Database::SecondaryIterator< T >::answer(), QInputDialog::getInteger(), Database::SecondaryIterator< T >::key(), ReadMetaData::mate(), Algo::pDoc, QMessageBox::question(), ReadMetaData::readRecno, Algo::selectedReads, Database::SecondaryIterator< T >::set(), ReadMetaData::setName(), and FeatureData::setReadRecno().

00015 {
00016   if ( selectedReads.empty() ) {
00017     return;
00018   }
00019 
00020   int res = QMessageBox::question( 0, "Find mates", "All mates, or mates within an interval?", "All", "Interval", "Cancel", 0, 2 );
00021   
00022   size_t min_ = 0;
00023   size_t max_ = numeric_limits<size_t>::max();
00024 
00025   if( res == 2 ) {
00026     return;
00027   }
00028   else if ( res == 1 ) {
00029     bool ok;
00030     int low = QInputDialog::getInteger(
00031                                        "Find mates", "Lower bound", 0, 0, numeric_limits<int>::max(), 1,
00032                                        &ok, 0 );
00033     
00034     if ( ok ) {
00035       // user entered something and pressed OK
00036       min_ = low;
00037     } else {
00038       // user pressed Cancel
00039       return;
00040     }
00041     int high = QInputDialog::getInteger(
00042                                         "Find mates", "Upper bound", numeric_limits<int>::max(), low, numeric_limits<int>::max(), 1,
00043                                         &ok, 0 );
00044     
00045     if ( ok ) {
00046       // user entered something and pressed OK
00047       max_ = high;
00048     } else {
00049       // user pressed Cancel
00050       return;
00051     }
00052     
00053   }
00054   
00055 
00056   set< db_recno_t > selected_temp = selectedReads;
00057   
00058   selectedReads.clear();
00059 
00060   for (set< db_recno_t >::iterator it = selected_temp.begin(); it != selected_temp.end(); it++ ){
00061 
00062     //New 090316
00063     Database::PrimaryIterator<ReadData>* read_it = new Database::PrimaryIterator<ReadData>(pDoc, "ReadData");
00064 
00065     int ret_read = read_it->setFromRecno(*it);
00066     ReadData* r_test = (ret_read != DB_NOTFOUND) ? read_it->answer() : 0;
00067     assert( r_test );
00068 
00069     int rstart = read_it->answer()->startPos();
00070     int rend = read_it->answer()->endPos();
00071     delete read_it;
00072     //END New 090316
00073 
00074     Database::SecondaryIterator<ReadMetaData>* read_meta_it = 
00075       new Database::SecondaryIterator<ReadMetaData>("readRecno", pDoc, "ReadMetaData"); 
00076     
00077     read_meta_it->key()->setReadRecno(*it);
00078 
00079     assert( read_meta_it->set() == 0 );
00080     
00081     string mate = read_meta_it->answer()->mate();
00082     delete read_meta_it;
00083 
00084     //Find mate (if any) and get its recno
00085     
00086     Database::SecondaryIterator<ReadMetaData>* name_it =
00087       new Database::SecondaryIterator<ReadMetaData>( "name", pDoc, "ReadMetaData" );
00088     name_it->key()->setName( mate );
00089 
00090     //New 090316
00091 
00092 //     if ( name_it->set() == 0 && 
00093 //          name_it->answer()->mateLength() >= min_ && 
00094 //          name_it->answer()->mateLength() <= max_ ) {
00095 //       selectedReads.insert(*it);
00096 //       selectedReads.insert(name_it->answer()->readRecno());
00097       
00098 //     }
00099     if ( name_it->set() == 0 ) {
00100 
00101       
00102       Database::PrimaryIterator<ReadData>* mate_it = new Database::PrimaryIterator<ReadData>(pDoc, "ReadData");
00103       ret_read = mate_it->setFromRecno(name_it->answer()->readRecno());
00104       r_test = (ret_read != DB_NOTFOUND) ? mate_it->answer() : 0;
00105       assert( r_test );
00106       
00107       int mstart = mate_it->answer()->startPos();
00108       int mend = mate_it->answer()->endPos();
00109       
00110       int start = min(rstart, mstart);
00111       int stop = max(rend, mend);
00112       
00113       int len = stop - start + 1;
00114       
00115       if ( len >= min_ && len <= max_ ) {
00116         
00117         selectedReads.insert(*it);
00118         selectedReads.insert(name_it->answer()->readRecno());
00119       }
00120       
00121       delete mate_it;
00122       
00123     }
00124 
00125     //END New 090316
00126     
00127     delete name_it;
00128 //     delete read_it;
00129     
00130 
00131   }
00132   
00133 }


The documentation for this class was generated from the following files:
Generated on Fri Jul 17 20:19:48 2009 for ngsview by  doxygen 1.5.1