Skip to content

Commit 26684b3

Browse files
authored
Merge pull request #14 from vdanjean/master
Fix a deadlock with multi threads and various improvement proposed
2 parents 3c3d851 + 281c5ea commit 26684b3

19 files changed

+574
-896
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ mutscan
1010
*.o
1111
*.obj
1212

13+
# Dependency files
14+
*.d
15+
1316
# Precompiled Headers
1417
*.gch
1518
*.pch

Makefile

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@ TARGET = mutscan
1111
BIN_TARGET = ${TARGET}
1212

1313
CC = g++
14+
CPPFLAGS = -Wall
1415
CFLAGS = -std=c++11 -g -I${DIR_INC}
1516

1617
${BIN_TARGET}:${OBJ}
1718
$(CC) $(OBJ) -lz -lpthread -o $@
1819

19-
${DIR_OBJ}/%.o:${DIR_SRC}/%.cpp make_obj_dir
20-
$(CC) $(CFLAGS) -O3 -c $< -o $@
20+
${DIR_OBJ}/%.o:${DIR_SRC}/%.cpp
21+
@mkdir -p "${DIR_OBJ}"
22+
$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -O3 -c $< -o $@
23+
24+
-include $(wildcard ${DIR_OBJ}/*.d)
25+
2126
.PHONY:clean
2227
clean:
2328
rm obj/*.o
29+
rm obj/*.d
2430
rm mutscan
2531

26-
make_obj_dir:
27-
@if test ! -d $(DIR_OBJ) ; \
28-
then \
29-
mkdir $(DIR_OBJ) ; \
30-
fi
31-
3232
install:
33-
install $(TARGET) $(BINDIR)/$(TARGET)
34-
@echo "Installed."
33+
install $(TARGET) $(DESTDIR)$(BINDIR)/$(TARGET)
34+
@echo "Installed."

src/editdistance.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ unsigned int edit_distance_bpv(T &cmap, char const *vec, size_t const &vecsize,
4242
for(size_t i = 0; i < tlen; ++i) VP[tmax] |= (1L << i);
4343
for(size_t i = 0; i < vecsize; ++i) {
4444
TVALUE &PM = cmap[vec[i]];
45-
for(int r = 0; r <= tmax; ++r) {
45+
for(unsigned int r = 0; r <= tmax; ++r) {
4646
uint64_t X = PM[r];
4747
if(r > 0 && (HN[r - 1] & lmb)) X |= 1L;
4848
D0[r] = (((X & VP[r]) + VP[r]) ^ VP[r]) | X | VN[r];
@@ -65,10 +65,10 @@ unsigned int edit_distance_bpv(T &cmap, char const *vec, size_t const &vecsize,
6565
template<typename T>
6666
unsigned int edit_distance_dp(T const *str1, size_t const size1, T const *str2, size_t const size2) {
6767
vector< vector<uint32_t> > d(size1 + 1, vector<uint32_t>(size2 + 1));
68-
for (int i = 0; i < size1 + 1; i++) d[i][0] = i;
69-
for (int i = 0; i < size2 + 1; i++) d[0][i] = i;
70-
for (int i = 1; i < size1 + 1; i++) {
71-
for (int j = 1; j < size2 + 1; j++) {
68+
for (size_t i = 0; i < size1 + 1; i++) d[i][0] = i;
69+
for (size_t i = 0; i < size2 + 1; i++) d[0][i] = i;
70+
for (size_t i = 1; i < size1 + 1; i++) {
71+
for (size_t j = 1; j < size2 + 1; j++) {
7272
d[i][j] = min(min(d[i-1][j], d[i][j-1]) + 1, d[i-1][j-1] + (str1[i-1] == str2[j-1] ? 0 : 1));
7373
}
7474
}
@@ -131,7 +131,7 @@ unsigned int edit_distance(string a, string b) {
131131

132132
unsigned int hamming_distance(const char *a, const unsigned int asize, const char *b, const unsigned int bsize) {
133133
int dis = 0;
134-
for(int i=0; i<min(asize, bsize); i++) {
134+
for(unsigned int i=0; i<min(asize, bsize); i++) {
135135
if(a[i]!=b[i])
136136
dis++;
137137
}

src/htmlreporter.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ void HtmlReporter::printHelper() {
4343
void HtmlReporter::printMutations() {
4444
// calculate the found mutation
4545
int found = 0;
46-
for(int i=0;i<mMutationList.size();i++){
46+
for(size_t i=0;i<mMutationList.size();i++){
4747
vector<Match*> matches = mMutationMatches[i];
48-
if(matches.size()>=GlobalSettings::minReadSupport){
48+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport){
4949
found++;
5050
}
5151
}
@@ -56,9 +56,9 @@ void HtmlReporter::printMutations() {
5656
if(found>1)
5757
mFile<<"s";
5858
mFile<<":</p><ul>";
59-
for(int i=0;i<mMutationList.size();i++){
59+
for(size_t i=0;i<mMutationList.size();i++){
6060
vector<Match*> matches = mMutationMatches[i];
61-
if(matches.size()>=GlobalSettings::minReadSupport){
61+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport){
6262
id++;
6363
mFile<<"<li class='menu_item'><a href='#"<<mMutationList[i].mName<<"'> " << id << ", " << mMutationList[i].mName;
6464
mFile<< " (" << matches.size() << " reads support, " << Match::countUnique(matches) << " unique)" << "</a></li>";
@@ -67,9 +67,9 @@ void HtmlReporter::printMutations() {
6767
mFile<<"</ul></div>";
6868
}
6969
id=0;
70-
for(int i=0;i<mMutationList.size();i++){
70+
for(size_t i=0;i<mMutationList.size();i++){
7171
vector<Match*> matches = mMutationMatches[i];
72-
if(matches.size()>=GlobalSettings::minReadSupport){
72+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport){
7373
id++;
7474
printMutation(id, mMutationList[i], matches);
7575
}
@@ -80,11 +80,11 @@ void HtmlReporter::printMutationsJS() {
8080
mFile << "\n<script type=\"text/javascript\">" << endl;
8181
mFile << "var data_break = [";
8282
int id=0;
83-
for(int i=0;i<mMutationList.size();i++){
83+
for(size_t i=0;i<mMutationList.size();i++){
8484
vector<Match*> matches = mMutationMatches[i];
85-
if(matches.size()>=GlobalSettings::minReadSupport){
85+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport){
8686
mFile << "\n[";
87-
for(int m=0; m<matches.size(); m++){
87+
for(size_t m=0; m<matches.size(); m++){
8888
mFile << "\n[";
8989
matches[m]->printJS(mFile, mMutationList[i].mLeft.length(), mMutationList[i].mCenter.length(), mMutationList[i].mRight.length());
9090
mFile << "],";
@@ -140,7 +140,7 @@ void HtmlReporter::printMutation(int id, Mutation& mutation, vector<Match*>& mat
140140
mFile << "<td>" << mutation.mRight << "</td>";
141141
mFile << "<td>" << "" << "</td>";
142142
mFile << "</tr>";
143-
for(int m=0; m<matches.size(); m++){
143+
for(size_t m=0; m<matches.size(); m++){
144144
long rowid = id*100000 + m;
145145
if(!GlobalSettings::simplifiedMode)
146146
mFile << "<tr onclick='toggle(" << rowid << ");'>";
@@ -266,7 +266,7 @@ void HtmlReporter::printScanTargets(){
266266
mFile << "<p> scanned " << mMutationList.size() << " mutation spots...<input type='button' id='target_view_btn', onclick=toggle_target_list('target_list'); value='show'></input></p>";
267267
mFile << "<ul id='target_list' style='display:none'>";
268268
int id=0;
269-
for(int i=0;i<mMutationList.size();i++){
269+
for(size_t i=0;i<mMutationList.size();i++){
270270
id++;
271271
mFile<<"<li> " << id << ", " << mMutationList[i].mName << "</li>";
272272
}

src/jsonreporter.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ void JsonReporter::run() {
2525
mFile << "\t\"mutations\":{";
2626

2727
bool isFirstMut = true;
28-
for(int i=0;i<mMutationList.size();i++){
28+
for(size_t i=0;i<mMutationList.size();i++){
2929
Mutation mut = mMutationList[i];
3030
vector<Match*> matches = mMutationMatches[i];
31-
if(matches.size()>=GlobalSettings::minReadSupport){
31+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport){
3232
if(isFirstMut) {
3333
mFile << endl;
3434
isFirstMut = false;
@@ -40,7 +40,7 @@ void JsonReporter::run() {
4040
mFile << "\t\t\t\"" << "chr" << "\":" << "\"" << mut.mChr << "\"," << endl;
4141
mFile << "\t\t\t\"" << "ref" << "\":[" << "\"" << mut.mLeft << "\"," << "\"" << mut.mCenter << "\"," << "\"" << mut.mRight << "\"]," << endl;
4242
mFile << "\t\t\t\"" << "reads" << "\":[" << endl;
43-
for(int m=0; m<matches.size(); m++){
43+
for(size_t m=0; m<matches.size(); m++){
4444
mFile << "\t\t\t\t{" << endl;
4545
mFile << "\t\t\t\t\t\"breaks\":";
4646
matches[m]->printBreaksToJson(mFile, mut.mLeft.length(), mut.mCenter.length(), mut.mRight.length());

src/match.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Match::~Match(){
3434
// we don't delete mRead or mSequence here since they are shared by different objects
3535
// and will be deleted in other places
3636
if(mOriginalReads) {
37-
for(int i=0;i<mOriginalReads->size();i++){
37+
for(size_t i=0;i<mOriginalReads->size();i++){
3838
delete (*mOriginalReads)[i];
3939
(*mOriginalReads)[i] = NULL;
4040
}
@@ -112,7 +112,7 @@ void Match::printBreaksToJson(ofstream& file, int leftlen, int centerlen, int ri
112112
breaks.push_back( mPos+centerlen );
113113
breaks.push_back( min(mPos+centerlen+rightlen, mReadLen));
114114
file << "[";
115-
for(int i=0; i<breaks.size(); i++) {
115+
for(size_t i=0; i<breaks.size(); i++) {
116116
file << breaks[i];
117117
if(i!=breaks.size() - 1)
118118
file << ",";
@@ -149,7 +149,7 @@ void Match::printJS(ofstream& file, int leftlen, int centerlen, int rightlen) {
149149
void Match::printReadsToFile(ofstream& file){
150150
if(!mOriginalReads)
151151
return;
152-
for(int i=0;i<mOriginalReads->size();i++){
152+
for(size_t i=0;i<mOriginalReads->size();i++){
153153
(*mOriginalReads)[i]->printFile(file);
154154
}
155155
}
@@ -163,7 +163,7 @@ int Match::countUnique(vector<Match*>& matches) {
163163
return 0;
164164
int count = 1;
165165
Match* cur = matches[0];
166-
for(int i=1;i<matches.size();i++){
166+
for(size_t i=1;i<matches.size();i++){
167167
Match* m = matches[i];
168168
if( *m > *cur || *m < *cur) {
169169
cur = m;

src/match.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class Match{
2727
void setReversed(bool flag);
2828
void addOriginalRead(Read* r);
2929
void addOriginalPair(ReadPair* pair);
30+
template <class ReadData> void addOriginalReadData(ReadData* r);
3031
int readlength() const;
3132

3233
inline bool operator <(const Match& other) const
@@ -62,5 +63,14 @@ class Match{
6263
char mMeanQual;
6364
};
6465

66+
template <>
67+
inline void Match::addOriginalReadData<Read> (Read* r) {
68+
addOriginalRead(r);
69+
}
6570

66-
#endif
71+
template <>
72+
inline void Match::addOriginalReadData<ReadPair> (ReadPair* pair) {
73+
addOriginalPair(pair);
74+
}
75+
76+
#endif

src/multihtmlreporter.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ MultiHtmlReporter::~MultiHtmlReporter(){
2020

2121
void MultiHtmlReporter::stat(){
2222
mTotalCount = 0;
23-
for(int m=0; m<mMutationList.size(); m++) {
23+
for(size_t m=0; m<mMutationList.size(); m++) {
2424
vector<Match*> matches = mMutationMatches[m];
25-
if(matches.size()>=GlobalSettings::minReadSupport) {
25+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport) {
2626
mTotalCount++;
2727
string chr = mMutationList[m].mChr;
2828
if(mChrCount.count(chr)==0)
@@ -69,9 +69,9 @@ void MultiHtmlReporter::printAllChromosomeLink(ofstream& file) {
6969
map<string, int>::iterator iter;
7070
file << "<ul id='menu'>";
7171
file << "<div style='font-size:12px;padding-top:20px;text-align:left;color:#aaaaaa'>Mutations found of all chromosomes:</div>";
72-
for(int m=0; m<mMutationList.size(); m++) {
72+
for(size_t m=0; m<mMutationList.size(); m++) {
7373
vector<Match*> matches = mMutationMatches[m];
74-
if(matches.size()>=GlobalSettings::minReadSupport) {
74+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport) {
7575
found = true;
7676
string chr = mMutationList[m].mChr;
7777
string filename = chr + "/" + to_string(m) + ".html";
@@ -88,9 +88,9 @@ void MultiHtmlReporter::printAllChromosomeLink(ofstream& file) {
8888

8989
void MultiHtmlReporter::printChrLink(ofstream& file, string chr) {
9090
bool found = false;
91-
for(int m=0; m<mMutationList.size(); m++) {
91+
for(size_t m=0; m<mMutationList.size(); m++) {
9292
vector<Match*> matches = mMutationMatches[m];
93-
if(matches.size()>=GlobalSettings::minReadSupport) {
93+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport) {
9494
found = true;
9595
if(chr == mMutationList[m].mChr) {
9696
string filename = chr + "/" + to_string(m) + ".html";
@@ -106,9 +106,9 @@ void MultiHtmlReporter::printChrLink(ofstream& file, string chr) {
106106
}
107107

108108
void MultiHtmlReporter::printMutationHtml() {
109-
for(int m=0; m<mMutationList.size(); m++) {
109+
for(size_t m=0; m<mMutationList.size(); m++) {
110110
vector<Match*> matches = mMutationMatches[m];
111-
if(matches.size()>=GlobalSettings::minReadSupport) {
111+
if((ssize_t)matches.size()>=GlobalSettings::minReadSupport) {
112112
string chr = mMutationList[m].mChr;
113113
string folder = mFolderPath + "/" + chr;
114114
string filename = folder + "/" + to_string(m) + ".html";
@@ -262,7 +262,7 @@ void MultiHtmlReporter::printScanTargets(ofstream& file){
262262
file << "<p> scanned " << mMutationList.size() << " mutation spots...<input type='button' id='target_view_btn', onclick=toggle_target_list('target_list'); value='show'></input></p>";
263263
file << "<ul id='target_list' style='display:none'>";
264264
int id=0;
265-
for(int i=0;i<mMutationList.size();i++){
265+
for(size_t i=0;i<mMutationList.size();i++){
266266
id++;
267267
file<<"<li> " << id << ", " << mMutationList[i].mName << "</li>";
268268
}

src/mutation.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ vector<Mutation> Mutation::parseBuiltIn() {
181181
vector<Mutation> mutations;
182182
vector<string> lines;
183183
split(BUILT_IN_MUTATIONS, lines, "\n");
184-
for(int i=0;i<lines.size();i++){
184+
for(size_t i=0;i<lines.size();i++){
185185
string linestr = lines[i];
186186
vector<string> splitted;
187187
split(linestr, splitted, ",");
@@ -228,7 +228,7 @@ vector<Mutation> Mutation::parseVcf(string vcfFile, string refFile) {
228228
fr.readAll();
229229
map<string, string> ref = fr.contigs();
230230

231-
for(int i=0;i<variants.size();i++) {
231+
for(size_t i=0;i<variants.size();i++) {
232232
Variant& v = variants[i];
233233
// skip the unmasked if markedOnly flag is set true
234234
if(markedOnly && (v.filter!="m" && v.filter!="M"))
@@ -248,7 +248,7 @@ vector<Mutation> Mutation::parseVcf(string vcfFile, string refFile) {
248248
}
249249
// the variant is out of this contig, or in the front or tail
250250
// note that VCF is 1-based, and string is 0-based
251-
if(v.pos > ref[chrom].length() + 25 + v.ref.length() || v.pos < 25 + v.ref.length())
251+
if((size_t)v.pos > ref[chrom].length() + 25 + v.ref.length() || (size_t)v.pos < 25 + v.ref.length())
252252
continue;
253253

254254
string gene = v.gene();

0 commit comments

Comments
 (0)