findmatesalgo.cc

Go to the documentation of this file.
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       // 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 }
00134 

Generated on Fri Jul 17 20:19:29 2009 for ngsview by  doxygen 1.5.1