Skip to content

Commit ce42acd

Browse files
committed
Fixed memory issue
1 parent b62d7f1 commit ce42acd

File tree

5 files changed

+98
-78
lines changed

5 files changed

+98
-78
lines changed

common.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ htsFile* safe_hts_open( char* path, char* mode)
159159
there hasn't been already */
160160
void set_str( char** target, char* source)
161161
{
162+
int len = -1;
163+
len = strlen( source) + 1;
164+
162165
if( *target != NULL)
163166
{
164167
free( ( *target));
@@ -167,7 +170,7 @@ void set_str( char** target, char* source)
167170
if (source != NULL)
168171
{
169172
( *target) = ( char*) getMem( sizeof( char) * ( strlen( source) + 1));
170-
strncpy( ( *target), source, ( strlen( source) + 1));
173+
strncpy( ( *target), source, len);
171174
}
172175
else
173176
{

free.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ void free_DS(bam_info* in_bam, parameters *params)
8585
free( params->outdir);
8686
free( params->sonic_file);
8787
free( params->sonic_info);
88+
free( params->mappability_file);
8889
free( params);
8990

9091
if(hash_table_count != NULL)

kmer.c

Lines changed: 67 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ void free_hash_table_kmer(parameters *params)
5050

5151
int is_kmer_valid_likelihood (char *str)
5252
{
53-
54-
int i, l;
53+
int i, l = -1;
5554
l = (int) strlen(str);
5655

5756
if (l != KMER)
@@ -122,7 +121,6 @@ int read_kmer_jellyfish( parameters *params)
122121
rewind(fp_reads);
123122
//fprintf(stderr,"There are %d lines", mer_count);
124123

125-
//fprintf(stderr,"HEREE %d\n", mer_count);
126124
hash_size = firstPrime(mer_count * 1.2);
127125
params->hash_size_kmer = hash_size;
128126

@@ -225,7 +223,7 @@ char* read_ref_seq( parameters *params, char* chr_name, int start, int end)
225223

226224
return ref_seq;
227225
}
228-
226+
/*
229227
int query_jellyfish(char* str, int count, char type)
230228
{
231229
int k = 0, z, freq = 0, freq_sum = 0;
@@ -266,8 +264,10 @@ int query_jellyfish(char* str, int count, char type)
266264
all_svs_dup[count].k_mer += freq_sum;
267265
268266
return 1;
269-
}
270-
int calculate_kmers_jellyfish(parameters *params, char* chr_name, int count, int total_variant, char type)
267+
}*/
268+
269+
270+
/*int calculate_kmers_jellyfish(parameters *params, char* chr_name, int count, int total_variant, char type)
271271
{
272272
int variation_length, i, j = 0, freq;
273273
char* seq = NULL, *seq_tmp = NULL;
@@ -321,7 +321,7 @@ int calculate_kmers_jellyfish(parameters *params, char* chr_name, int count, int
321321
seq = NULL;
322322
}
323323
return 1;
324-
}
324+
}*/
325325

326326

327327
int kmer_count_interval(parameters *params, int start, int end)
@@ -332,8 +332,9 @@ int kmer_count_interval(parameters *params, int start, int end)
332332
char seq[KMERWINDOWSIZE + 10];
333333
//char* seq = NULL;
334334
unsigned int hash_val1, hash_val2;
335-
HashInfo *tmp;
336-
int k_mer_count = 0;
335+
HashInfo *tmp = NULL;
336+
int kmer_count_forward = 0, kmer_count_reverse = 0;
337+
int is_kmer_valid = 0;
337338

338339

339340
variation_length = end - start + 1;
@@ -345,74 +346,76 @@ int kmer_count_interval(parameters *params, int start, int end)
345346
j++;
346347
}
347348
seq[j] = '\0';
348-
//fprintf(stderr,"%s\n", seq);
349349

350-
//fprintf(stderr,"%d of %d (size = %d)\n", count, total_variant, variation_length);
351350

352351
for(i = 0; i < variation_length - KMER; i += KMERSLIDE)
353352
{
354-
for(j = 0; j < 2; j++)
353+
// For forward strand
354+
seq_tmp = substring(seq, i, KMER);
355+
//if(seq_tmp == NULL)
356+
//continue;
357+
358+
is_kmer_valid = is_kmer_valid_likelihood(seq_tmp);
359+
if(!is_kmer_valid)
355360
{
356-
if(j == 0)
357-
{
358-
seq_tmp = substring(seq, i, KMER);
359-
if(seq_tmp == NULL)
360-
continue;
361+
free(seq_tmp);
362+
continue;
363+
}
361364

362-
if(!is_kmer_valid_likelihood(seq_tmp))
363-
continue;
365+
MurmurHash3_x86_128(seq_tmp, strlen(seq_tmp), 42, hash);
366+
hash_val1 = (unsigned) hash[0] % params->hash_size_kmer;
364367

365-
MurmurHash3_x86_128(seq_tmp, strlen(seq_tmp), 42, hash);
366-
//fprintf(stderr,"%u - \n", hash[0]);
367-
//fprintf(stderr,"%li - \n", params->hash_size_kmer);
368-
hash_val1 = (unsigned) hash[0] % params->hash_size_kmer;
368+
MurmurHash3_x86_128(seq_tmp, strlen(seq_tmp), 11, hash);
369+
hash_val2 = (unsigned) hash[0] % params->hash_size_kmer;
370+
//fprintf(stderr,"%u - %u\n", hash_val1, hash_val2);
369371

370-
MurmurHash3_x86_128(seq_tmp, strlen(seq_tmp), 11, hash);
371-
hash_val2 = (unsigned) hash[0] % params->hash_size_kmer;
372-
//fprintf(stderr,"%u - %u\n", hash_val1, hash_val2);
373-
}
374-
else
372+
tmp = hash_table_kmer[hash_val1];
373+
while(tmp != NULL)
374+
{
375+
if(tmp->hash2 == hash_val2)
375376
{
376-
seq_tmp_rev = reverseComplement(seq_tmp);
377-
378-
if(seq_tmp_rev == NULL)
379-
continue;
377+
kmer_count_forward += tmp->freq;
378+
break;
379+
}
380+
tmp = tmp->next;
381+
}
380382

381-
if(!is_kmer_valid_likelihood(seq_tmp_rev))
382-
continue;
383+
//For reverse strand
384+
seq_tmp_rev = reverseComplement(seq_tmp);
385+
//if(seq_tmp_rev == NULL)
386+
//continue;
383387

384-
MurmurHash3_x86_128(seq_tmp_rev, strlen(seq_tmp_rev), 42, hash);
385-
hash_val1 = (unsigned) hash[0] % params->hash_size_kmer;
388+
is_kmer_valid = is_kmer_valid_likelihood(seq_tmp_rev);
389+
if(!is_kmer_valid)
390+
{
391+
free(seq_tmp_rev);
392+
continue;
393+
}
386394

387-
MurmurHash3_x86_128(seq_tmp_rev, strlen(seq_tmp_rev), 11, hash);
388-
hash_val2 = (unsigned) hash[0] % params->hash_size_kmer;
395+
MurmurHash3_x86_128(seq_tmp_rev, strlen(seq_tmp_rev), 42, hash);
396+
hash_val1 = (unsigned) hash[0] % params->hash_size_kmer;
389397

390-
free(seq_tmp);
391-
seq_tmp = NULL;
398+
MurmurHash3_x86_128(seq_tmp_rev, strlen(seq_tmp_rev), 11, hash);
399+
hash_val2 = (unsigned) hash[0] % params->hash_size_kmer;
392400

393-
free(seq_tmp_rev);
394-
seq_tmp_rev = NULL;
395-
}
401+
free(seq_tmp);
402+
seq_tmp = NULL;
396403

397-
tmp = hash_table_kmer[hash_val1];
404+
free(seq_tmp_rev);
405+
seq_tmp_rev = NULL;
398406

399-
while(tmp != NULL)
407+
tmp = hash_table_kmer[hash_val1];
408+
while(tmp != NULL)
409+
{
410+
if(tmp->hash2 == hash_val2)
400411
{
401-
if(tmp->hash2 == hash_val2)
402-
{
403-
k_mer_count += tmp->freq;
404-
break;
405-
}
406-
tmp = tmp->next;
412+
kmer_count_reverse += tmp->freq;
413+
break;
407414
}
415+
tmp = tmp->next;
408416
}
409417
}
410-
/*if(seq != NULL)
411-
{
412-
free(seq);
413-
seq = NULL;
414-
}*/
415-
return k_mer_count;
418+
return (kmer_count_forward + kmer_count_reverse);
416419
}
417420

418421
void init_kmer_per_chr( bam_info* in_bam, parameters* param, int chr_index)
@@ -421,10 +424,11 @@ void init_kmer_per_chr( bam_info* in_bam, parameters* param, int chr_index)
421424
memset (in_bam->kmer, 0, (param->this_sonic->chromosome_lengths[chr_index] * sizeof(short)));
422425
}
423426

424-
void calc_kmer_counts(bam_info *in_bam, parameters *params, int chr_index)
427+
long calc_kmer_counts(bam_info *in_bam, parameters *params, int chr_index)
425428
{
426-
int i, j, end;
427-
short tmp;
429+
int i, j, end = -1;
430+
short tmp = 0;
431+
long total_kmers = 0;
428432

429433
for( i = 0; i < params->this_sonic->chromosome_lengths[chr_index]; i += KMERWINDOWSLIDE)
430434
{
@@ -433,11 +437,13 @@ void calc_kmer_counts(bam_info *in_bam, parameters *params, int chr_index)
433437
else
434438
end = params->this_sonic->chromosome_lengths[chr_index];
435439

440+
tmp = 0;
436441
tmp = (short) kmer_count_interval(params, i, end);
437-
442+
total_kmers += (long) tmp;
438443
for(j = 0; j < KMERWINDOWSLIDE; j++)
439444
in_bam->kmer[i + j] = tmp;
440445
}
446+
return total_kmers;
441447
}
442448

443449
void calc_expected_kmer(bam_info *in_bam, parameters *params, int chr_index)

kmer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,6 @@ void init_hash_count_kmer(parameters *params);
4141
int kmer_count_interval(parameters *params, int start, int end);
4242
void init_kmer_per_chr( bam_info* in_bam, parameters* param, int chr_index);
4343
void calc_expected_kmer(bam_info *in_bam, parameters *params, int chr_index);
44-
void calc_kmer_counts(bam_info *in_bam, parameters *params, int chr_index);
44+
long calc_kmer_counts(bam_info *in_bam, parameters *params, int chr_index);
4545

4646
#endif /* KMER_H_ */

likelihood.c

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,8 @@ void find_SVs( bam_info *in_bam, parameters *params, FILE* fp_del, FILE* fp_dup,
324324
sv_count = 0;
325325
del_count = 0;
326326
dup_count = 0;
327-
int kmer_hash_size;
327+
int kmer_hash_size = 0;
328+
long total_kmers = 0;
328329

329330
fprintf(stderr,"\nLoading known SVs ");
330331
load_known_SVs( &all_svs_del, &all_svs_dup, params, chr_name, &del_count, &dup_count);
@@ -336,6 +337,12 @@ void find_SVs( bam_info *in_bam, parameters *params, FILE* fp_del, FILE* fp_dup,
336337

337338
sv_count = del_count + dup_count;
338339

340+
if(sv_count == 0)
341+
{
342+
free(in_bam->rd_unfiltered);
343+
return;
344+
}
345+
339346
if(params->low_map_regions != NULL)
340347
{
341348
//fprintf(stderr,"Loading Low mappability regions\n");
@@ -354,20 +361,23 @@ void find_SVs( bam_info *in_bam, parameters *params, FILE* fp_del, FILE* fp_dup,
354361
fprintf(stderr,"\nReading K-MERS\n");
355362
kmer_hash_size = read_kmer_jellyfish(params);
356363

357-
//fprintf(stderr,"\nReading ref");
358-
readReferenceSeq(params, chr_index);
359-
360-
init_kmer_per_chr(in_bam, params, chr_index);
364+
//fprintf(stderr,"\nHash size %d\n", kmer_hash_size);
365+
if(kmer_hash_size > MINKMERHASHSIZE)
366+
{
367+
readReferenceSeq(params, chr_index);
361368

362-
fprintf(stderr,"-->calculating k-mer counts\n");
363-
calc_kmer_counts(in_bam, params, chr_index);
369+
init_kmer_per_chr(in_bam, params, chr_index);
364370

365-
fprintf(stderr,"-->calculating expected counts\n");
366-
calc_expected_kmer(in_bam, params, chr_index);
371+
fprintf(stderr,"-->calculating k-mer counts");
372+
total_kmers = calc_kmer_counts(in_bam, params, chr_index);
373+
fprintf(stderr," (%li kmers)\n", total_kmers);
367374

368-
free(params->ref_seq);
369-
params->ref_seq = NULL;
375+
fprintf(stderr,"-->calculating expected counts\n");
376+
calc_expected_kmer(in_bam, params, chr_index);
370377

378+
free(params->ref_seq);
379+
params->ref_seq = NULL;
380+
}
371381
}
372382

373383
//Check mappability
@@ -382,18 +392,18 @@ void find_SVs( bam_info *in_bam, parameters *params, FILE* fp_del, FILE* fp_dup,
382392
fprintf(stderr,"\nCalculating Likelihoods\n");
383393
find_depths(in_bam, params, chr_name, chr_index);
384394

385-
free( in_bam->rd_unfiltered);
395+
free(in_bam->rd_unfiltered);
386396

387397
if(params->mappability_file != NULL)
388-
free( in_bam->mappability);
398+
free(in_bam->mappability);
389399

390400
if(!params->no_kmer)
391401
{
392-
free( in_bam->kmer);
402+
free(in_bam->kmer);
393403
in_bam->kmer = NULL;
394404
free_hash_table_kmer(params);
395405
}
396-
406+
//fprintf(stderr,"Outputting\n");
397407
output_SVs(params, fp_SVs, fp_del, fp_dup);
398408

399409
free_SVs(all_svs_del, del_count);

0 commit comments

Comments
 (0)