@@ -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 */
378378void 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 */
399399void 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