00001 #include "findmatesalgo.h"
00002 #include "algoparam.h"
00003 #include <iostream>
00004 #include "readdata.h"
00005 #include "generaldata.h"
00006 #include <cassert>
00007 #include <qmessagebox.h>
00008 #include <qinputdialog.h>
00009 #include <limits>
00010 #include "featuredata.h"
00011
00012 using namespace std;
00013
00014 void FindMatesAlgo::start()
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
00036 min_ = low;
00037 } else {
00038
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
00047 max_ = high;
00048 } else {
00049
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
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
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
00085
00086 Database::SecondaryIterator<ReadMetaData>* name_it =
00087 new Database::SecondaryIterator<ReadMetaData>( "name", pDoc, "ReadMetaData" );
00088 name_it->key()->setName( mate );
00089
00090
00091
00092
00093
00094
00095
00096
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
00126
00127 delete name_it;
00128
00129
00130
00131 }
00132
00133 }
00134