00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "MatchStoreUngapped.h"
00034 #include "MatchStoreGapped.h"
00035 #include "SequenceReader.h"
00036 #include "HashTable.h"
00037 #include "GlobalDefinitions.h"
00038 #include <algorithm>
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 void MatchAlgorithmUngapped::generateMatches
00064
00065 ( HitListVector& hitList, MatchAdder& addMatch )
00066 {
00067
00068
00069
00070
00071
00072
00073 if (dynamic_cast<MatchAdderCodonCodon*>(&addMatch)
00074 ||dynamic_cast<MatchAdderCodonProtein*>(&addMatch))
00075 {
00076 wordLength_ *= gNumReadingFrames;
00077 stepLength_ *= gNumReadingFrames;
00078 }
00079
00080 sort( hitList.begin(), hitList.end() );
00081
00082
00083
00084
00085 if ( hitList.size() == 0 ) return;
00086
00087 HitListVector::const_iterator i ( hitList.begin() );
00088
00089 int adjacentBases = wordLength_;
00090 SequenceNumber adjacentStart = i->queryPos;
00091 int basesToAdd;
00092
00093 HitListVector::const_iterator lastHit( i );
00094 ++i;
00095
00096 for ( ; i != hitList.end() ; ++i )
00097 {
00098
00099 if ( ( i->subjectNum == lastHit->subjectNum )
00100 && ( i->diff == lastHit->diff ) )
00101 {
00102
00103
00104
00105
00106
00107
00108 basesToAdd = i->queryPos - lastHit->queryPos;
00109 if (basesToAdd <= stepLength_)
00110
00111 {
00112 adjacentBases += basesToAdd;
00113 }
00114
00115 else
00116 {
00117 if ( adjacentBases>=minToProcess_)
00118 {
00119 DEBUG_L2(lastHit->subjectNum << " " <<
00120 adjacentBases << " " <<
00121 adjacentStart << " " <<
00122 adjacentStart + adjacentBases -1 << " " <<
00123 adjacentStart + lastHit->diff << " " <<
00124 adjacentStart + lastHit->diff + adjacentBases -1 );
00125
00126
00127 addMatch( lastHit->subjectNum,
00128 adjacentBases,
00129 adjacentStart,
00130 adjacentStart + adjacentBases -1,
00131 adjacentStart + lastHit->diff,
00132 adjacentStart + lastHit->diff + adjacentBases -1 );
00133 }
00134 adjacentStart = i->queryPos;
00135 adjacentBases = wordLength_;
00136 }
00137 }
00138 else
00139 {
00140 if( adjacentBases>=minToProcess_)
00141 {
00142 DEBUG_L2(lastHit->subjectNum << " " <<
00143 adjacentBases << " " <<
00144 adjacentStart << " " <<
00145 adjacentStart + adjacentBases -1 << " " <<
00146 adjacentStart + lastHit->diff << " " <<
00147 adjacentStart + lastHit->diff + adjacentBases -1 );
00148
00149 addMatch( lastHit->subjectNum,
00150 adjacentBases,
00151 adjacentStart,
00152 adjacentStart + adjacentBases -1,
00153 adjacentStart + lastHit->diff,
00154 adjacentStart + lastHit->diff + adjacentBases -1 );
00155 }
00156 adjacentStart = i->queryPos;
00157 adjacentBases = wordLength_;
00158
00159 }
00160 ++lastHit;
00161 }
00162 if (adjacentBases>=minToProcess_)
00163 {
00164 DEBUG_L2(lastHit->subjectNum << " " <<
00165 adjacentBases << " " <<
00166 adjacentStart << " " <<
00167 adjacentStart + adjacentBases -1 << " " <<
00168 adjacentStart + lastHit->diff << " " <<
00169 adjacentStart + lastHit->diff + adjacentBases -1 );
00170
00171 addMatch( lastHit->subjectNum,
00172 adjacentBases,
00173 adjacentStart,
00174 adjacentStart + adjacentBases -1,
00175 adjacentStart + lastHit->diff,
00176 adjacentStart + lastHit->diff + adjacentBases -1 );
00177 }
00178 return;
00179
00180 }
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191