@@ -359,25 +359,24 @@ double VarManager::ComputePIDcalibration(int species, double nSigmaValue)
359359}
360360
361361// __________________________________________________________________
362- std::tuple<double , double , double , double , double > VarManager::BimodalityCoefficientUnbinned (const std::vector<double >& data)
362+ std::tuple<float , float , float , float , float > VarManager::BimodalityCoefficientUnbinned (const std::vector<float >& data)
363363{
364364 // Bimodality coefficient = (skewness^2 + 1) / kurtosis
365365 // return a tuple including the coefficient, mean, RMS, skewness, and kurtosis
366366 size_t n = data.size ();
367367 if (n < 3 ) {
368368 return std::make_tuple (-1.0 , -1.0 , -1.0 , -1.0 , -1.0 );
369369 }
370- double mean = std::accumulate (data.begin (), data.end (), 0.0 ) / n;
370+ float mean = std::accumulate (data.begin (), data.end (), 0.0 ) / n;
371371
372- double m2 = 0.0 , m3 = 0.0 , m4 = 0.0 ;
373- for (double x : data) {
374- double diff = x - mean;
375- double diff2 = diff * diff;
376- double diff3 = diff2 * diff;
377- double diff4 = diff3 * diff;
372+ float m2 = 0.0 , m3 = 0.0 , m4 = 0.0 ;
373+ float diff, diff2;
374+ for (float x : data) {
375+ diff = x - mean;
376+ diff2 = diff * diff;
378377 m2 += diff2;
379- m3 += diff3 ;
380- m4 += diff4 ;
378+ m3 += diff2 * diff ;
379+ m4 += diff2 * diff2 ;
381380 }
382381
383382 m2 /= n;
@@ -388,21 +387,23 @@ std::tuple<double, double, double, double, double> VarManager::BimodalityCoeffic
388387 return std::make_tuple (-1.0 , -1.0 , -1.0 , -1.0 , -1.0 );
389388 }
390389
391- double stddev = std::sqrt (m2);
392- double skewness = m3 / (stddev * stddev * stddev);
393- double kurtosis = m4 / (m2 * m2);
390+ float stddev = std::sqrt (m2);
391+ float skewness = m3 / (stddev * stddev * stddev);
392+ float kurtosis = m4 / (m2 * m2);
394393
395394 return std::make_tuple ((skewness * skewness + 1.0 ) / kurtosis, mean, stddev, skewness, kurtosis);
396395}
397396
398- std::tuple<double , double , double , double , double > VarManager::BimodalityCoefficient (const std::vector<double >& data, float binWidth, int trim, float min, float max)
397+ std::tuple<float , float , float , float , float , int > VarManager::BimodalityCoefficientAndNPeaks (const std::vector<float >& data, float binWidth, int trim, float min, float max)
399398{
400399 // Bimodality coefficient = (skewness^2 + 1) / kurtosis
401400 // return a tuple including the coefficient, mean, RMS, skewness, and kurtosis
402401
403402 // if the binWidth is < 0, use the unbinned calculation
404403 if (binWidth < 0 ) {
405- return BimodalityCoefficientUnbinned (data);
404+ // get the tuple from the unbinned calculation
405+ auto [bc, mean, stddev, skewness, kurtosis] = BimodalityCoefficientUnbinned (data);
406+ return std::make_tuple (bc, mean, stddev, skewness, kurtosis, -1 );
406407 }
407408
408409 // bin the data and put it in a vector
@@ -428,46 +429,62 @@ std::tuple<double, double, double, double, double> VarManager::BimodalityCoeffic
428429 }
429430 }
430431
432+ // count the number of peaks
433+ int nPeaks = 0 ;
434+ bool inPeak = false ;
435+ for (int i = 0 ; i < nBins; ++i) {
436+ if (counts[i] > 0 ) {
437+ if (!inPeak) {
438+ inPeak = true ;
439+ nPeaks++;
440+ }
441+ } else {
442+ inPeak = false ;
443+ }
444+ }
445+
431446 // first compute the mean
432- double mean = 0.0 ;
433- double totalCounts = 0.0 ;
447+ float mean = 0.0 ;
448+ float totalCounts = 0.0 ;
434449 for (int i = 0 ; i < nBins; ++i) {
435- double binCenter = min + (i + 0.5 ) * binWidth;
450+ float binCenter = min + (i + 0.5 ) * binWidth;
436451 mean += counts[i] * binCenter;
437452 totalCounts += counts[i];
438453 }
439454
440455 if (totalCounts == 0 ) {
441- return std::make_tuple (-1.0 , -1.0 , -1.0 , -1.0 , -1.0 );
456+ return std::make_tuple (-1.0 , -1.0 , -1.0 , -1.0 , -1.0 , - 1 );
442457 }
443458 mean /= totalCounts;
444459
445460 // then compute the second, third, and fourth central moments
446- double m2 = 0.0 , m3 = 0.0 , m4 = 0.0 ;
461+ float m2 = 0.0 , m3 = 0.0 , m4 = 0.0 ;
462+ float diff, diff2, binCenter;
447463 for (int i = 0 ; i < nBins; ++i) {
448- double binCenter = min + (i + 0.5 ) * binWidth;
449- double diff = binCenter - mean;
450- double diff2 = diff * diff;
451- double diff3 = diff2 * diff;
452- double diff4 = diff3 * diff;
464+ if (counts[i] == 0 ) {
465+ continue ; // skip empty bins
466+ }
467+ binCenter = min + (i + 0.5 ) * binWidth;
468+ diff = binCenter - mean;
469+ diff2 = diff * diff;
453470 m2 += counts[i] * diff2;
454- m3 += counts[i] * diff3 ;
455- m4 += counts[i] * diff4 ;
471+ m3 += counts[i] * diff2 * diff ;
472+ m4 += counts[i] * diff2 * diff2 ;
456473 }
457474
458475 m2 /= totalCounts;
459476 m3 /= totalCounts;
460477 m4 /= totalCounts;
461478
462479 if (m2 == 0.0 ) {
463- return std::make_tuple (-1.0 , -1.0 , -1.0 , -1.0 , -1.0 );
480+ return std::make_tuple (-1.0 , -1.0 , -1.0 , -1.0 , -1.0 , - 1 );
464481 }
465482
466- double stddev = std::sqrt (m2);
467- double skewness = m3 / (stddev * stddev * stddev);
468- double kurtosis = m4 / (m2 * m2); // Pearson's kurtosis, not excess
483+ float stddev = std::sqrt (m2);
484+ float skewness = m3 / (stddev * stddev * stddev);
485+ float kurtosis = m4 / (m2 * m2); // Pearson's kurtosis, not excess
469486
470- return std::make_tuple ((skewness * skewness + 1.0 ) / kurtosis, mean, stddev, skewness, kurtosis);
487+ return std::make_tuple ((skewness * skewness + 1.0 ) / kurtosis, mean, stddev, skewness, kurtosis, nPeaks );
471488}
472489
473490// __________________________________________________________________
@@ -501,6 +518,8 @@ void VarManager::SetDefaultVarNames()
501518 fgVariableUnits[kTimeFromSOR ] = " min." ;
502519 fgVariableNames[kBCOrbit ] = " Bunch crossing" ;
503520 fgVariableUnits[kBCOrbit ] = " " ;
521+ fgVariableNames[kCollisionRandom ] = " Random number (collision-level)" ;
522+ fgVariableUnits[kCollisionRandom ] = " " ;
504523 fgVariableNames[kIsPhysicsSelection ] = " Physics selection" ;
505524 fgVariableUnits[kIsPhysicsSelection ] = " " ;
506525 fgVariableNames[kVtxX ] = " Vtx X " ;
@@ -733,6 +752,14 @@ void VarManager::SetDefaultVarNames()
733752 fgVariableUnits[kDCAzFracAbove5mm ] = " " ;
734753 fgVariableNames[kDCAzFracAbove10mm ] = " Fraction of tracks with |DCAz| > 10 mm" ;
735754 fgVariableUnits[kDCAzFracAbove10mm ] = " " ;
755+ fgVariableNames[kDCAzNPeaks ] = " Number of peaks in DCAz distribution" ;
756+ fgVariableUnits[kDCAzNPeaks ] = " " ;
757+ fgVariableNames[kDCAzNPeaksTrimmed1 ] = " Number of peaks in binned DCAz distribution (trimmed 1)" ;
758+ fgVariableUnits[kDCAzNPeaksTrimmed1 ] = " " ;
759+ fgVariableNames[kDCAzNPeaksTrimmed2 ] = " Number of peaks in binned DCAz distribution (trimmed 2)" ;
760+ fgVariableUnits[kDCAzNPeaksTrimmed2 ] = " " ;
761+ fgVariableNames[kDCAzNPeaksTrimmed3 ] = " Number of peaks in binned DCAz distribution (trimmed 3)" ;
762+ fgVariableUnits[kDCAzNPeaksTrimmed3 ] = " " ;
736763 fgVariableNames[kPt ] = " p_{T}" ;
737764 fgVariableUnits[kPt ] = " GeV/c" ;
738765 fgVariableNames[kPt1 ] = " p_{T1}" ;
@@ -1709,6 +1736,7 @@ void VarManager::SetDefaultVarNames()
17091736 fgVarNamesMap[" kCollisionTimeRes" ] = kCollisionTimeRes ;
17101737 fgVarNamesMap[" kBC" ] = kBC ;
17111738 fgVarNamesMap[" kBCOrbit" ] = kBCOrbit ;
1739+ fgVarNamesMap[" kCollisionRandom" ] = kCollisionRandom ;
17121740 fgVarNamesMap[" kIsPhysicsSelection" ] = kIsPhysicsSelection ;
17131741 fgVarNamesMap[" kIsTVXTriggered" ] = kIsTVXTriggered ;
17141742 fgVarNamesMap[" kIsNoTFBorder" ] = kIsNoTFBorder ;
@@ -1816,6 +1844,10 @@ void VarManager::SetDefaultVarNames()
18161844 fgVarNamesMap[" kDCAzFracAbove2mm" ] = kDCAzFracAbove2mm ;
18171845 fgVarNamesMap[" kDCAzFracAbove5mm" ] = kDCAzFracAbove5mm ;
18181846 fgVarNamesMap[" kDCAzFracAbove10mm" ] = kDCAzFracAbove10mm ;
1847+ fgVarNamesMap[" kDCAzNPeaks" ] = kDCAzNPeaks ;
1848+ fgVarNamesMap[" kDCAzNPeaksTrimmed1" ] = kDCAzNPeaksTrimmed1 ;
1849+ fgVarNamesMap[" kDCAzNPeaksTrimmed2" ] = kDCAzNPeaksTrimmed2 ;
1850+ fgVarNamesMap[" kDCAzNPeaksTrimmed3" ] = kDCAzNPeaksTrimmed3 ;
18191851 fgVarNamesMap[" kMCEventGeneratorId" ] = kMCEventGeneratorId ;
18201852 fgVarNamesMap[" kMCEventSubGeneratorId" ] = kMCEventSubGeneratorId ;
18211853 fgVarNamesMap[" kMCVtxX" ] = kMCVtxX ;
0 commit comments