#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.
FindMatesAlgo::FindMatesAlgo | ( | TrapperDoc * | pDoc_, | |
std::set< db_recno_t > & | recnoList, | |||
AlgoParam * | param | |||
) | [inline] |
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 }