Skip to content

Commit e3c71c3

Browse files
committed
include stats in bed output
1 parent 3dd77b1 commit e3c71c3

File tree

1 file changed

+47
-15
lines changed

1 file changed

+47
-15
lines changed

Genrich.c

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,8 @@ Pileup* savePval(Chrom** chrom, int chromLen,
372372

373373
/* void printInterval()
374374
* Print bedgraph(ish) interval, with values of:
375-
* pileups (treatment and control),
376-
* p- and q-values, and significance ('*') for each.
375+
* pileups (treatment and control), -log(p),
376+
* -log(q), and significance ('*') for each.
377377
*/
378378
void printInterval(File out, bool gzOut, char* name,
379379
int start, int end, float treatVal, float ctrlVal,
@@ -397,15 +397,18 @@ void printInterval(File out, bool gzOut, char* name,
397397
* Print BED interval for a peak.
398398
*/
399399
void printPeak(File out, bool gzOut, char* name, int start,
400-
int end, int count, float val) {
400+
int end, int count, float val, float fe,
401+
float pval, float qval, int pos) {
401402
if (gzOut)
402-
gzprintf(out.gzf, "%s\t%d\t%d\tpeak_%d\t%d\t.\n",
403+
gzprintf(out.gzf, "%s\t%d\t%d\tpeak_%d\t%d\t.\t%f\t%f\t%f\t%d\n",
403404
name, start, end, count,
404-
MIN((int) (val * 10.0f + 0.5), 1000));
405+
MIN((int) (val * 10.0f + 0.5), 1000),
406+
fe, pval, qval, pos);
405407
else
406-
fprintf(out.f, "%s\t%d\t%d\tpeak_%d\t%d\t.\n",
408+
fprintf(out.f, "%s\t%d\t%d\tpeak_%d\t%d\t.\t%f\t%f\t%f\t%d\n",
407409
name, start, end, count,
408-
MIN((int) (val * 10.0f + 0.5), 1000));
410+
MIN((int) (val * 10.0f + 0.5), 1000),
411+
fe, pval, qval, pos);
409412
}
410413

411414
/* int callPeaks()
@@ -423,10 +426,16 @@ int callPeaks(File out, File log, bool logOpt, bool gzOut,
423426
if (chr->skip)
424427
continue;
425428

426-
// loop through intervals (defined by chr->pval)
427-
int start = 0; // start of interval
429+
// reset peak variables
428430
int peakStart = -1, peakEnd = -1; // ends of potential peak
429-
float peakVal = -1.0f; // most significant peak value
431+
float summitVal = -1.0f; // summit p/q value
432+
int summitPos = 0; // distance from peakStart to summit
433+
int summitLen = 0; // length of summit interval
434+
float summitPval = -1.0f, summitQval = -1.0f; // summit p- and q-values
435+
float summitFE = -1.0f; // summit fold enrichment
436+
437+
// loop through intervals (defined by chr->pval)
438+
int start = 0; // start of interval
430439
int j = 0, k = 0; // indexes into chr->treat, chr->ctrl
431440
for (int m = 0; m < chr->pvalLen; m++) {
432441

@@ -439,7 +448,26 @@ int callPeaks(File out, File log, bool logOpt, bool gzOut,
439448
if (peakStart == -1)
440449
peakStart = start; // start new potential peak
441450
peakEnd = chr->pval->end[m]; // end of potential peak
442-
peakVal = MAX(peakVal, val);
451+
452+
// check if interval is summit for this peak
453+
if (val > summitVal) {
454+
summitVal = val;
455+
summitFE = chr->ctrl->cov[k] ?
456+
chr->treat->cov[j] / chr->ctrl->cov[k] : FLT_MAX;
457+
summitPval = chr->pval->cov[m];
458+
summitQval = qvalOpt ? chr->qval->cov[m] : -1.0f;
459+
summitPos = (peakEnd + (m ? chr->pval->end[m-1] : 0) ) / 2
460+
- peakStart; // midpoint of interval
461+
summitLen = peakEnd - (m ? chr->pval->end[m-1] : 0);
462+
} else if (val == summitVal) {
463+
// update summitPos only if interval is longer
464+
int len = chr->pval->end[m] - (m ? chr->pval->end[m-1] : 0);
465+
if (len > summitLen) {
466+
summitPos = (peakEnd + (m ? chr->pval->end[m-1] : 0) ) / 2
467+
- peakStart; // midpoint of interval
468+
summitLen = len;
469+
}
470+
}
443471

444472
} else {
445473

@@ -449,11 +477,13 @@ int callPeaks(File out, File log, bool logOpt, bool gzOut,
449477
// determine if prior peak meets length threshold
450478
if (peakEnd - peakStart >= minLen) {
451479
printPeak(out, gzOut, chr->name, peakStart,
452-
peakEnd, count, peakVal);
480+
peakEnd, count, summitVal, summitFE,
481+
summitPval, summitQval, summitPos);
453482
count++;
454483
}
455-
peakStart = -1; // reset peak start
456-
peakVal = -1.0f;
484+
peakStart = -1; // reset peak start
485+
summitVal = -1.0f; // reset peak summit value
486+
summitLen = 0; // reset peak summit length
457487
}
458488
}
459489

@@ -480,11 +510,13 @@ int callPeaks(File out, File log, bool logOpt, bool gzOut,
480510
// determine if last peak meets length threshold
481511
if (peakStart != -1 && peakEnd - peakStart >= minLen) {
482512
printPeak(out, gzOut, chr->name, peakStart,
483-
peakEnd, count, peakVal);
513+
peakEnd, count, summitVal, summitFE,
514+
summitPval, summitQval, summitPos);
484515
count++;
485516
}
486517

487518
}
519+
488520
return count;
489521
}
490522

0 commit comments

Comments
 (0)