00001 #include "sortalgo.h"
00002 #include <qinputdialog.h>
00003 #include <set>
00004 #include <vector>
00005
00006 void SortAlgo::start()
00007 {
00008
00009 if ( getMAl()->get_num_seq() == 0 ) {
00010 return;
00011 }
00012 bool ok;
00013 int res = QInputDialog::getInteger(
00014 "Compact reads", "Enter start row for selected reads:", 0, 1, numeric_limits<int>::max(), 1,
00015 &ok, 0 );
00016
00017 size_t row(1);
00018 if ( ok ) {
00019
00020 row = res;
00021 } else {
00022
00023 return;
00024 }
00025
00026 multiset<sort_struct, compBeg> set_begin;
00027
00028 for( size_t i = 0; i < getMAl()->get_num_seq(); i++ ) {
00029 sort_struct s;
00030 s.begin = getMAl()->get_seq_begin_global(i);
00031 s.end = getMAl()->get_seq_end_global(i);
00032 s.ID = i;
00033
00034 set_begin.insert(s);
00035
00036 }
00037
00038 multiset<sort_struct, compBeg>::iterator it = set_begin.begin();
00039 sort_struct tmp(*it);
00040 tmp.begin = tmp.end;
00041 vector<sort_struct> row_vec;
00042 row_vec.push_back(tmp);
00043 getMAl()->set_seq_row( (*it).ID, row );
00044 set_begin.erase( set_begin.begin() );
00045
00046 while ( !set_begin.empty() ) {
00047 it = set_begin.lower_bound( row_vec[ row_vec.size() - 1 ] );
00048
00049 if ( it == set_begin.end() ) {
00050
00051
00052 row_vec.clear();
00053 ++row;
00054 it = set_begin.begin();
00055 }
00056
00057 tmp = *it;
00058 tmp.begin = tmp.end;
00059 row_vec.push_back(tmp);
00060 getMAl()->set_seq_row( (*it).ID, row );
00061 set_begin.erase(it);
00062 }
00063
00064 }
00065
00066 void SortAlgo::old_start()
00067 {
00068
00069 if ( getMAl()->get_num_seq() == 0 ) {
00070 return;
00071 }
00072 bool ok;
00073 int res = QInputDialog::getInteger(
00074 "Compact reads", "Enter start row for selected reads:", 0, 1, numeric_limits<int>::max(), 1,
00075 &ok, 0 );
00076
00077 size_t row(1);
00078 if ( ok ) {
00079
00080 row = res;
00081 } else {
00082
00083 return;
00084 }
00085
00086 multiset<sort_struct, compBeg> set_begin;
00087
00088 for( size_t i = 0; i < getMAl()->get_num_seq(); i++ ) {
00089 sort_struct s;
00090 s.begin = getMAl()->get_seq_begin_global(i);
00091 s.end = getMAl()->get_seq_end_global(i);
00092 s.ID = i;
00093
00094 set_begin.insert(s);
00095
00096 }
00097
00098
00099
00100 multiset<sort_struct, compBeg>::iterator it = set_begin.begin();
00101 multiset<sort_struct, compEnd> set_end;
00102 sort_struct tmp(*it);
00103 tmp.row = row;
00104 set_end.insert( tmp );
00105 getMAl()->set_seq_row( (*it).ID, row );
00106 ++it;
00107 ++row;
00108
00109 int debugnum(0);
00110
00111 for( ; it != set_begin.end(); ++it ) {
00112
00113 if ( (*it).begin >= (*(set_end.begin())).end ) {
00114 getMAl()->set_seq_row( (*it).ID, (*(set_end.begin())).row );
00115 tmp = *(set_end.begin());
00116 set_end.erase( set_end.begin() );
00117 tmp.end = (*it).end;
00118 set_end.insert(tmp);
00119 debugnum++;
00120
00121 }
00122 else {
00123 getMAl()->set_seq_row( (*it).ID, row );
00124 tmp = *it;
00125 tmp.row = row;
00126 set_end.insert(tmp);
00127 row++;
00128 }
00129 }
00130 }