00001 #include "dnpsort.h"
00002 #include <qinputdialog.h>
00003 #include <cassert>
00004
00005 using namespace std;
00006
00007 void DnpSortAlgo::start()
00008 {
00009 if ( selectedReads.empty() ) {
00010 return;
00011 }
00012
00013 bool ok;
00014 int res = QInputDialog::getInteger(
00015 "DNP sort", "Enter start row for selected reads:", 0, 1, numeric_limits<int>::max(), 1,
00016 &ok, 0 );
00017
00018 size_t row(1);
00019 if ( ok ) {
00020
00021 row = res;
00022 } else {
00023
00024 return;
00025 }
00026
00027
00028
00029 init();
00030
00031 if ( dnpID_to_readID.empty() ) {
00032 return;
00033 }
00034
00035 vector<vector<size_t> > groups;
00036
00037 while ( !dnpID_to_readID.empty() ) {
00038
00039
00040 MapSet::iterator firstIt = dnpID_to_readID.begin();
00041
00042 int dnp_id = firstIt->first;
00043
00044
00045 set<int> working_set;
00046 working_set.insert( dnp_id );
00047
00048
00049 groups.push_back( vector<size_t>() );
00050
00051 while ( !working_set.empty() ) {
00052
00053 int curr_dnp_id = *(working_set.begin());
00054 working_set.erase( working_set.begin() );
00055 assert( !dnpDone( curr_dnp_id ) );
00056
00057
00058 for( set<size_t>::iterator it = dnpID_to_readID[ curr_dnp_id ].begin();
00059 it != dnpID_to_readID[ curr_dnp_id ].end(); ++it ) {
00060
00061 if ( readID_to_dnpID[ *it ].empty() ) continue;
00062
00063 assert( used_reads[ *it ] );
00064 groups[ groups.size() - 1 ].push_back( *it );
00065
00066 for( set<int>::iterator it2 = readID_to_dnpID[ *it ].begin();
00067 it2 != readID_to_dnpID[ *it ].end(); ++it2 ) {
00068 if ( *it2 != curr_dnp_id ) {
00069 working_set.insert( *it2 );
00070 }
00071
00072 }
00073 readID_to_dnpID[ *it ].clear();
00074 }
00075
00076 dnpID_to_readID.erase( curr_dnp_id );
00077 assert( dnpDone( curr_dnp_id ) );
00078
00079 }
00080
00081 }
00082
00083
00084
00085 for( size_t i = 0; i < groups.size(); i++ ) {
00086
00087 for( size_t j = 0; j < groups[ i ].size(); j++ ) {
00088 assert( used_reads[ groups[i][j] ] );
00089 getMAl()->set_seq_row( groups[i][j], row );
00090 row++;
00091 }
00092 row += 5;
00093 }
00094
00095
00096 for( size_t i = 0; i < used_reads.size(); i++ ) {
00097 if ( !used_reads[ i ] ) {
00098 getMAl()->set_seq_row( i, row );
00099 row++;
00100
00101 }
00102
00103 }
00104
00105 }
00106
00107 void DnpSortAlgo::init()
00108 {
00109 for( size_t i = 0; i < getMAl()->get_num_seq(); i++ ) {
00110 set<int> tmpset;
00111 readID_to_dnpID.push_back(tmpset);
00112 used_reads.push_back(false);
00113
00114 for( size_t j = 0; j < getMAl()->get_seq_end( i ); j++ ) {
00115
00116 if ( getMAl()->is_DNP(i, j) ) {
00117 dnpID_to_readID[ getMAl()->get_DNP_ID(i, j) ].insert( i );
00118 readID_to_dnpID[ i ].insert( getMAl()->get_DNP_ID(i, j) );
00119 used_reads[i] = true;
00120 }
00121
00122 }
00123 }
00124 }
00125
00126 bool DnpSortAlgo::dnpDone( int dnp_id )
00127 {
00128 return dnpID_to_readID.find( dnp_id ) == dnpID_to_readID.end();
00129 }
00130