00001 #include "movealgo.h"
00002 #include "algoparam.h"
00003 #include <iostream>
00004 #include "readdata.h"
00005 #include "generaldata.h"
00006 #include <vector>
00007 #include <cassert>
00008 #include "readsinrect.h"
00009 #include <fstream>
00010
00011 using namespace std;
00012
00013 void MoveAlgo::start()
00014 {
00015 if ( selectedReads.empty() ) {
00016 return;
00017 }
00018
00019 bool allow_overlap(true);
00020
00021 AlgoMoveParam* param = (AlgoMoveParam*)my_param;
00022 assert(param);
00023
00024 int y_delta = param->get_y_delta();
00025 int x_delta = param->get_x_delta();
00026
00027 if ( y_delta == 0 && x_delta == 0) {
00028 return;
00029 }
00030
00031
00032
00033
00034
00035 vector<ReadData> readvec;
00036
00037
00038 int debug_i(0);
00039 for (set< db_recno_t >::iterator it = selectedReads.begin(); it != selectedReads.end(); it++ ){
00040
00041
00042 Database::PrimaryIterator<ReadData>* read_it = new Database::PrimaryIterator<ReadData>(pDoc, "ReadData");
00043
00044 int ret_read = read_it->setFromRecno(*it);
00045 ReadData* r_test = (ret_read != DB_NOTFOUND) ? read_it->answer() : 0;
00046 assert( r_test );
00047 readvec.push_back( *r_test );
00048
00049 delete read_it;
00050
00051
00052
00053 if ( (static_cast<int>(r_test->row()) + y_delta) < 0 ||
00054 (static_cast<int>(r_test->startPos()) + x_delta) < 0 ) {
00055 param->set_y_delta(0);
00056 param->set_x_delta(0);
00057
00058 cerr<<"Read will end up on negative row or col, cancelling move "<<endl;
00059 return;
00060 }
00061
00062 }
00063
00064
00065
00066 for(size_t i = 0; i < readvec.size(); i++ ) {
00067
00068
00069
00070
00071 ReadsInRect* dest_it = new ReadsInRect(pDoc);
00072 dest_it->setWindowCoord( readvec[i].startPos() + x_delta, readvec[i].row() + y_delta, readvec[i].endPos() - readvec[i].startPos(), 1);
00073
00074 if ( !allow_overlap && dest_it->first() ) {
00075
00076
00077 delete dest_it;
00078 }
00079 else {
00080 delete dest_it;
00081 Database::Creator<ReadData> a_creator(pDoc, "ReadData");
00082
00083
00084 a_creator.data()->setRecno(readvec[i].getRecno());
00085 a_creator.data()->setRow(readvec[i].row() + y_delta);
00086 a_creator.data()->setStartPos(readvec[i].startPos() + x_delta);
00087 a_creator.data()->setEndPos(readvec[i].endPos() + x_delta);
00088 a_creator.data()->setName(readvec[i].name());
00089 a_creator.data()->setMate(readvec[i].mate());
00090 a_creator.data()->setMateLength(readvec[i].mateLength());
00091 a_creator.data()->setStrand(readvec[i].strand());
00092 a_creator.data()->setBeginGood(readvec[i].beginGood());
00093 a_creator.data()->setEndGood(readvec[i].endGood());
00094
00095
00096
00097 a_creator.create(true);
00098 }
00099
00100 }
00101 }
00102