Skip to content

Commit 16d3df4

Browse files
author
Ionut Cristian Arsene
committed
Adding also estimations of the number of peaks, and a random variables to be used for random event rejection
1 parent e8b8dd4 commit 16d3df4

File tree

5 files changed

+132
-43
lines changed

5 files changed

+132
-43
lines changed

PWGDQ/Core/VarManager.cxx

Lines changed: 64 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

PWGDQ/Core/VarManager.h

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ class VarManager : public TObject
206206
kCollisionTimeRes,
207207
kBC,
208208
kBCOrbit,
209+
kCollisionRandom, // random number generated per collision (if required, can be used to perform random selections at the collision level)
209210
kIsPhysicsSelection,
210211
kIsTVXTriggered, // Is trigger TVX
211212
kIsNoTFBorder, // No time frame border
@@ -315,6 +316,10 @@ class VarManager : public TObject
315316
kDCAzFracAbove2mm,
316317
kDCAzFracAbove5mm,
317318
kDCAzFracAbove10mm,
319+
kDCAzNPeaks,
320+
kDCAzNPeaksTrimmed1,
321+
kDCAzNPeaksTrimmed2,
322+
kDCAzNPeaksTrimmed3,
318323
kMCEventGeneratorId,
319324
kMCEventSubGeneratorId,
320325
kMCVtxX,
@@ -1278,8 +1283,8 @@ class VarManager : public TObject
12781283
template <typename T, typename T1>
12791284
static o2::dataformats::VertexBase RecalculatePrimaryVertex(T const& track0, T const& track1, const T1& collision);
12801285

1281-
static std::tuple<double, double, double, double, double> BimodalityCoefficientUnbinned(const std::vector<double>& data);
1282-
static std::tuple<double, double, double, double, double> BimodalityCoefficient(const std::vector<double>& data, float binWidth, int trim = 0, float min = -15.0, float max = 15.0);
1286+
static std::tuple<float, float, float, float, float> BimodalityCoefficientUnbinned(const std::vector<float>& data);
1287+
static std::tuple<float, float, float, float, float, int> BimodalityCoefficientAndNPeaks(const std::vector<float>& data, float binWidth, int trim = 0, float min = -15.0, float max = 15.0);
12831288

12841289
template <typename T, typename C>
12851290
static o2::track::TrackParCovFwd FwdToTrackPar(const T& track, const C& cov);
@@ -1867,6 +1872,10 @@ void VarManager::FillEvent(T const& event, float* values)
18671872
values[kTimestamp] = event.timestamp();
18681873
}
18691874

1875+
if (fgUsedVars[kCollisionRandom]) {
1876+
values[kCollisionRandom] = gRandom->Rndm();
1877+
}
1878+
18701879
if constexpr ((fillMap & Collision) > 0) {
18711880
// TODO: trigger info from the event selection requires a separate flag
18721881
// so that it can be switched off independently of the rest of Collision variables (e.g. if event selection is not available)
@@ -2384,58 +2393,71 @@ void VarManager::FillEventTracks(T const& tracks, float* values)
23842393
}
23852394

23862395
// compute the unbinned bimodality coefficient and related statistics
2387-
auto [bimodality, mean, stddev, skewness, kurtosis] = BimodalityCoefficient(dcazValues, -1.0);
2396+
auto [bimodality, mean, stddev, skewness, kurtosis, nPeaks] = BimodalityCoefficient(dcazValues, -1.0);
23882397
if (stddev > -1.0) {
23892398
values[kDCAzBimodalityCoefficient] = bimodality;
23902399
values[kDCAzMean] = mean;
23912400
values[kDCAzRMS] = stddev;
23922401
values[kDCAzSkewness] = skewness;
23932402
values[kDCAzKurtosis] = kurtosis;
2403+
values[kDCAzNPeaks] = -9999.0;
23942404
} else {
23952405
values[kDCAzBimodalityCoefficient] = -9999.0;
23962406
values[kDCAzMean] = -9999.0;
23972407
values[kDCAzRMS] = -9999.0;
23982408
values[kDCAzSkewness] = -9999.0;
23992409
values[kDCAzKurtosis] = -9999.0;
2400-
}
2410+
values[kDCAzNPeaks] = -9999.0;
24012411
// compute the binned bimodality coefficient and related statistics with a bin width of 50um
2402-
auto [bimodalityBin, meanBin, stddevBin, skewnessBin, kurtosisBin] = BimodalityCoefficient(dcazValues, 0.005);
2412+
auto [bimodalityBin, meanBin, stddevBin, skewnessBin, kurtosisBin, nPeaksBinned] = BimodalityCoefficient(dcazValues, 0.005);
24032413
if (stddevBin > -1.0) {
24042414
values[kDCAzBimodalityCoefficientBinned] = bimodalityBin;
2415+
values[kDCAzNPeaks] = nPeaksBinned;
24052416
} else {
24062417
values[kDCAzBimodalityCoefficientBinned] = -9999.0;
2418+
values[kDCAzNPeaks] = -9999.0;
24072419
}
2420+
cout << "Bimodality coefficient: " << bimodality << ", mean: " << mean << ", stddev: " << stddev << ", skewness: " << skewness << ", kurtosis: " << kurtosis << ", nPeaks: " << nPeaks << endl;
24082421
// compute the binned bimodality coefficient and related statistics with a bin width of 50um and trimming of 1, 2, 3 entries per bin
2409-
auto [bimodalityBinTrimm1, meanBinTrimm1, stddevBinTrimm1, skewnessBinTrimm1, kurtosisBinTrimm1] = BimodalityCoefficient(dcazValues, 0.005, 2);
2422+
auto [bimodalityBinTrimm1, meanBinTrimm1, stddevBinTrimm1, skewnessBinTrimm1, kurtosisBinTrimm1, nPeaksTrimm1] = BimodalityCoefficient(dcazValues, 0.005, 2);
24102423
if (stddevBinTrimm1 > -1.0) {
24112424
values[kDCAzBimodalityCoefficientBinnedTrimmed1] = bimodalityBinTrimm1;
24122425
values[kDCAzMeanBinnedTrimmed1] = meanBinTrimm1;
24132426
values[kDCAzRMSBinnedTrimmed1] = stddevBinTrimm1;
2427+
values[kDCAzNPeaksTrimmed1] = nPeaksTrimm1;
24142428
} else {
24152429
values[kDCAzBimodalityCoefficientBinnedTrimmed1] = -9999.0;
24162430
values[kDCAzMeanBinnedTrimmed1] = -9999.0;
24172431
values[kDCAzRMSBinnedTrimmed1] = -9999.0;
2432+
values[kDCAzNPeaksTrimmed1] = -9999.0;
24182433
}
2419-
auto [bimodalityBinTrimm2, meanBinTrimm2, stddevBinTrimm2, skewnessBinTrimm2, kurtosisBinTrimm2] = BimodalityCoefficient(dcazValues, 0.005, 3);
2434+
cout << "Bimodality coefficient (trimmed 1): " << bimodalityBinTrimm1 << ", mean: " << meanBinTrimm1 << ", stddev: " << stddevBinTrimm1 << ", skewness: " << skewnessBinTrimm1 << ", kurtosis: " << kurtosisBinTrimm1 << ", nPeaks: " << nPeaksTrimm1 << endl;
2435+
auto [bimodalityBinTrimm2, meanBinTrimm2, stddevBinTrimm2, skewnessBinTrimm2, kurtosisBinTrimm2, nPeaksTrimm2] = BimodalityCoefficient(dcazValues, 0.005, 3);
24202436
if (stddevBinTrimm2 > -1.0) {
24212437
values[kDCAzBimodalityCoefficientBinnedTrimmed2] = bimodalityBinTrimm2;
24222438
values[kDCAzMeanBinnedTrimmed2] = meanBinTrimm2;
24232439
values[kDCAzRMSBinnedTrimmed2] = stddevBinTrimm2;
2440+
values[kDCAzNPeaksTrimmed2] = nPeaksTrimm2;
24242441
} else {
24252442
values[kDCAzBimodalityCoefficientBinnedTrimmed2] = -9999.0;
24262443
values[kDCAzMeanBinnedTrimmed2] = -9999.0;
24272444
values[kDCAzRMSBinnedTrimmed2] = -9999.0;
2445+
values[kDCAzNPeaksTrimmed2] = -9999.0;
24282446
}
2429-
auto [bimodalityBinTrimm3, meanBinTrimm3, stddevBinTrimm3, skewnessBinTrimm3, kurtosisBinTrimm3] = BimodalityCoefficient(dcazValues, 0.005, 4);
2447+
cout << "Bimodality coefficient (trimmed 2): " << bimodalityBinTrimm2 << ", mean: " << meanBinTrimm2 << ", stddev: " << stddevBinTrimm2 << ", skewness: " << skewnessBinTrimm2 << ", kurtosis: " << kurtosisBinTrimm2 << ", nPeaks: " << nPeaksTrimm2 << endl;
2448+
auto [bimodalityBinTrimm3, meanBinTrimm3, stddevBinTrimm3, skewnessBinTrimm3, kurtosisBinTrimm3, nPeaksTrimm3] = BimodalityCoefficient(dcazValues, 0.005, 4);
24302449
if (stddevBinTrimm3 > -1.0) {
24312450
values[kDCAzBimodalityCoefficientBinnedTrimmed3] = bimodalityBinTrimm3;
24322451
values[kDCAzMeanBinnedTrimmed3] = meanBinTrimm3;
24332452
values[kDCAzRMSBinnedTrimmed3] = stddevBinTrimm3;
2453+
values[kDCAzNPeaksTrimmed3] = nPeaksTrimm3;
24342454
} else {
24352455
values[kDCAzBimodalityCoefficientBinnedTrimmed3] = -9999.0;
24362456
values[kDCAzMeanBinnedTrimmed3] = -9999.0;
24372457
values[kDCAzRMSBinnedTrimmed3] = -9999.0;
2458+
values[kDCAzNPeaksTrimmed3] = -9999.0;
24382459
}
2460+
cout << "Bimodality coefficient (trimmed 3): " << bimodalityBinTrimm3 << ", mean: " << meanBinTrimm3 << ", stddev: " << stddevBinTrimm3 << ", skewness: " << skewnessBinTrimm3 << ", kurtosis: " << kurtosisBinTrimm3 << ", nPeaks: " << nPeaksTrimm3 << endl;
24392461

24402462
// compute fraction of tracks with |DCAz| > 100um, 200um, 500um, 1mm, 2mm, 5mm, 10mm
24412463
// make a loop over the DCAz values and count how many are above each threshold

PWGDQ/DataModel/ReducedInfoTables.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ DECLARE_SOA_COLUMN(DCAzFracAbove1mm, dcazFracAbove1mm, float);
8888
DECLARE_SOA_COLUMN(DCAzFracAbove2mm, dcazFracAbove2mm, float); //! Fraction of tracks in the event with |DCAz| > 2mm
8989
DECLARE_SOA_COLUMN(DCAzFracAbove5mm, dcazFracAbove5mm, float); //! Fraction of tracks in the event with |DCAz| > 5mm
9090
DECLARE_SOA_COLUMN(DCAzFracAbove10mm, dcazFracAbove10mm, float); //! Fraction of tracks in the event with |DCAz| > 10mm
91+
DECLARE_SOA_COLUMN(DCAzNPeaks, dcazNPeaks, int); //! Number of peaks in the DCAz distribution of the tracks in the event
92+
DECLARE_SOA_COLUMN(DCAzNPeaksTrimmed1, dcazNPeaksTrimmed1, int); //! Number of peaks in the binned DCAz distribution (trimmed 1)
93+
DECLARE_SOA_COLUMN(DCAzNPeaksTrimmed2, dcazNPeaksTrimmed2, int); //! Number of peaks in the binned DCAz distribution (trimmed 2)
94+
DECLARE_SOA_COLUMN(DCAzNPeaksTrimmed3, dcazNPeaksTrimmed3, int); //! Number of peaks in the binned DCAz distribution (trimmed 3)
9195

9296
// Columns declared to guarantee the backward compatibility of the tables
9397
DECLARE_SOA_COLUMN(QvecBPosRe, qvecBPosRe, float);
@@ -226,7 +230,8 @@ DECLARE_SOA_TABLE(ReducedEventsMergingTable, "AOD", "REMERGE", //! Collision m
226230
reducedevent::DCAzRMS, reducedevent::DCAzRMSBinnedTrimmed1, reducedevent::DCAzRMSBinnedTrimmed2, reducedevent::DCAzRMSBinnedTrimmed3,
227231
reducedevent::DCAzSkewness, reducedevent::DCAzKurtosis,
228232
reducedevent::DCAzFracAbove100um, reducedevent::DCAzFracAbove200um, reducedevent::DCAzFracAbove500um,
229-
reducedevent::DCAzFracAbove1mm, reducedevent::DCAzFracAbove2mm, reducedevent::DCAzFracAbove5mm, reducedevent::DCAzFracAbove10mm);
233+
reducedevent::DCAzFracAbove1mm, reducedevent::DCAzFracAbove2mm, reducedevent::DCAzFracAbove5mm, reducedevent::DCAzFracAbove10mm,
234+
reducedevent::DCAzNPeaks, reducedevent::DCAzNPeaksTrimmed1, reducedevent::DCAzNPeaksTrimmed2, reducedevent::DCAzNPeaksTrimmed3);
230235

231236
// TODO and NOTE: This table is just an extension of the ReducedEvents table
232237
// There is no explicit accounting for MC events which were not reconstructed!!!

0 commit comments

Comments
 (0)