#include <findmatesalgo.h>
Inheritance diagram for FindMatesAlgo:
Public Member Functions | |
FindMatesAlgo (TrapperDoc *pDoc_, std::set< db_recno_t > &recnoList, AlgoParam *param) | |
void | start () |
Definition at line 6 of file findmatesalgo.h.
|
Definition at line 9 of file findmatesalgo.h. 00009 : Algo(pDoc_, recnoList, param) {}
|
|
Implements Algo. Definition at line 13 of file findmatesalgo.cc. References Database::SecondaryIterator< T >::answer(), Database::PrimaryIterator< T >::answer(), GeneralData::getRecno(), Database::SecondaryIterator< T >::key(), ReadData::mate(), ReadData::mateLength(), Algo::pDoc, Algo::selectedReads, Database::SecondaryIterator< T >::set(), Database::PrimaryIterator< T >::setFromRecno(), and ReadData::setName(). 00014 { 00015 if ( selectedReads.empty() ) { 00016 return; 00017 } 00018 00019 int res = QMessageBox::question( 0, "Find mates", "All mates, or mates within an interval?", "All", "Interval", "Cancel", 0, 2 ); 00020 00021 size_t min_ = 0; 00022 size_t max_ = numeric_limits<size_t>::max(); 00023 00024 if( res == 2 ) { 00025 return; 00026 } 00027 else if ( res == 1 ) { 00028 bool ok; 00029 int low = QInputDialog::getInteger( 00030 "Find mates", "Lower bound", 0, 0, numeric_limits<int>::max(), 1, 00031 &ok, 0 ); 00032 00033 if ( ok ) { 00034 // user entered something and pressed OK 00035 min_ = low; 00036 } else { 00037 // user pressed Cancel 00038 return; 00039 } 00040 int high = QInputDialog::getInteger( 00041 "Find mates", "Upper bound", numeric_limits<int>::max(), low, numeric_limits<int>::max(), 1, 00042 &ok, 0 ); 00043 00044 if ( ok ) { 00045 // user entered something and pressed OK 00046 max_ = high; 00047 } else { 00048 // user pressed Cancel 00049 return; 00050 } 00051 00052 } 00053 00054 00055 set< db_recno_t > selected_temp = selectedReads; 00056 00057 selectedReads.clear(); 00058 00059 for (set< db_recno_t >::iterator it = selected_temp.begin(); it != selected_temp.end(); it++ ){ 00060 00061 Database::PrimaryIterator<ReadData>* read_it = new Database::PrimaryIterator<ReadData>(pDoc, "ReadData"); 00062 00063 int ret_read = read_it->setFromRecno(*it); 00064 ReadData* r_test = (ret_read != DB_NOTFOUND) ? read_it->answer() : 0; 00065 assert( r_test ); 00066 00067 00068 //Find mate (if any) and get its recno 00069 00070 Database::SecondaryIterator<ReadData>* name_it = 00071 new Database::SecondaryIterator<ReadData>( "name", pDoc, "ReadData" ); 00072 name_it->key()->setName( r_test->mate() ); 00073 if ( name_it->set() == 0 && 00074 name_it->answer()->mateLength() >= min_ && 00075 name_it->answer()->mateLength() <= max_ ) { 00076 selectedReads.insert(*it); 00077 selectedReads.insert(name_it->answer()->getRecno()); 00078 00079 } 00080 00081 delete name_it; 00082 delete read_it; 00083 00084 00085 } 00086 00087 }
|