Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Modules/MUON/MCH/include/MCH/DigitsTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "MCHBase/Digit.h"
#endif
#include "MCHDigitFiltering/DigitFilter.h"
#include "Common/TH1Ratio.h"
#include "Common/TH2Ratio.h"

class TH1F;
Expand Down Expand Up @@ -67,6 +68,9 @@ class DigitsTask /*final*/ : public TaskInterface // todo add back the "final" w
template <typename T>
void publishObject(T* histo, std::string drawOption, bool statBox, bool isExpert);

bool mEnable1DRateMaps{ true }; // whether to publish 1D maps of channel rates
bool mEnable2DRateMaps{ false }; // whether to publish 2D maps of channel rates

bool mFullHistos{ false }; // publish extra diagnostics plots

o2::mch::DigitFilter mIsSignalDigit;
Expand All @@ -77,6 +81,10 @@ class DigitsTask /*final*/ : public TaskInterface // todo add back the "final" w
std::unique_ptr<TH2FRatio> mHistogramOccupancyElec; // Occupancy histogram (Elec view)
std::unique_ptr<TH2FRatio> mHistogramSignalOccupancyElec; // Occupancy histogram (Elec view) for signal-like digits

// 1D rate histograms using Elec view, where each x bin corresponds to the unique ID of a DualSAMPA board
std::unique_ptr<TH1DRatio> mHistogramRatePerDualSampa;
std::unique_ptr<TH1DRatio> mHistogramRateSignalPerDualSampa;

std::unique_ptr<TH2F> mHistogramDigitsOrbitElec;
std::unique_ptr<TH2F> mHistogramDigitsSignalOrbitElec;

Expand Down
6 changes: 6 additions & 0 deletions Modules/MUON/MCH/include/MCH/PreclustersTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,16 @@ class PreclustersTask /*final*/ : public o2::quality_control::core::TaskInterfac

void plotPrecluster(const o2::mch::PreCluster& preCluster, gsl::span<const o2::mch::Digit> digits);

bool mEnable1DPseudoeffMaps{ true }; // whether to publish 1D maps of channel pseudo-efficiencies
bool mEnable2DPseudoeffMaps{ false }; // whether to publish 2D maps of channel pseudo-efficiencies

o2::mch::DigitFilter mIsSignalDigit;

std::unique_ptr<TH2FRatio> mHistogramPseudoeffElec; // Mergeable object, Occupancy histogram (Elec view)

// 1D pseudo-efficiency histogram using Elec view, where each x bin corresponds to the unique ID of a DualSAMPA board
std::unique_ptr<TH1DRatio> mHistogramPseudoeffPerDualSampa;

std::unique_ptr<TH1DRatio> mHistogramPreclustersPerDE; // number of pre-clusters per DE and per TF
std::unique_ptr<TH1DRatio> mHistogramPreclustersSignalPerDE; // number of pre-clusters with signal per DE and per TF

Expand Down
65 changes: 52 additions & 13 deletions Modules/MUON/MCH/src/DigitsTask.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ void DigitsTask::initialize(o2::framework::InitContext& /*ctx*/)

mIsSignalDigit = o2::mch::createDigitFilter(20, true, true);

// flags to enable the publication of either 1D and 2D maps of channel rates
mEnable1DRateMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable1DRateMaps", mEnable1DRateMaps);
mEnable2DRateMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable2DRateMaps", mEnable2DRateMaps);

// flag to enable extra disagnostics plots; it also enables on-cycle plots
mFullHistos = getConfigurationParameter<bool>(mCustomParameters, "FullHistos", mFullHistos);

Expand All @@ -70,13 +74,25 @@ void DigitsTask::initialize(o2::framework::InitContext& /*ctx*/)
const uint32_t nElecXbins = NumberOfDualSampas;

// Histograms in electronics coordinates
mHistogramOccupancyElec = std::make_unique<TH2FRatio>("Occupancy_Elec", "Occupancy", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
mHistogramOccupancyElec->Sumw2(kFALSE);
publishObject(mHistogramOccupancyElec.get(), "colz", false, false);
if (mEnable1DRateMaps) {
mHistogramRatePerDualSampa = std::make_unique<TH1DRatio>("RatePerDualSampa", "Average rate per dual sampa;DS index;rate (kHz)", o2::mch::NumberOfDualSampas, 0, o2::mch::NumberOfDualSampas, false);
mHistogramRatePerDualSampa->Sumw2(kFALSE);
publishObject(mHistogramRatePerDualSampa.get(), "hist", false, false);

mHistogramRateSignalPerDualSampa = std::make_unique<TH1DRatio>("RateSignalPerDualSampa", "Average rate per dual sampa (signal);DS index;rate (kHz)", o2::mch::NumberOfDualSampas, 0, o2::mch::NumberOfDualSampas, false);
mHistogramRateSignalPerDualSampa->Sumw2(kFALSE);
publishObject(mHistogramRateSignalPerDualSampa.get(), "hist", false, false);
}

mHistogramSignalOccupancyElec = std::make_unique<TH2FRatio>("OccupancySignal_Elec", "Occupancy (signal)", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
mHistogramSignalOccupancyElec->Sumw2(kFALSE);
publishObject(mHistogramSignalOccupancyElec.get(), "colz", false, false);
if (mEnable2DRateMaps) {
mHistogramOccupancyElec = std::make_unique<TH2FRatio>("Occupancy_Elec", "Occupancy", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
mHistogramOccupancyElec->Sumw2(kFALSE);
publishObject(mHistogramOccupancyElec.get(), "colz", false, false);

mHistogramSignalOccupancyElec = std::make_unique<TH2FRatio>("OccupancySignal_Elec", "Occupancy (signal)", nElecXbins, 0, nElecXbins, 64, 0, 64, true);
mHistogramSignalOccupancyElec->Sumw2(kFALSE);
publishObject(mHistogramSignalOccupancyElec.get(), "colz", false, false);
}

mHistogramDigitsOrbitElec = std::make_unique<TH2F>("DigitOrbit_Elec", "Digit orbits vs DS Id", nElecXbins, 0, nElecXbins, 130, -1, 129);
publishObject(mHistogramDigitsOrbitElec.get(), "colz", true, false);
Expand Down Expand Up @@ -159,9 +175,17 @@ void DigitsTask::plotDigit(const o2::mch::Digit& digit)
// fecId and channel uniquely identify each physical pad
int fecId = getDsIndex(DsDetId{ deId, dsId });

mHistogramOccupancyElec->getNum()->Fill(fecId, channel);
if (isSignal) {
mHistogramSignalOccupancyElec->getNum()->Fill(fecId, channel);
if (mEnable1DRateMaps) {
mHistogramRatePerDualSampa->getNum()->Fill(fecId);
if (isSignal) {
mHistogramRateSignalPerDualSampa->getNum()->Fill(fecId);
}
}
if (mEnable2DRateMaps) {
mHistogramOccupancyElec->getNum()->Fill(fecId, channel);
if (isSignal) {
mHistogramSignalOccupancyElec->getNum()->Fill(fecId, channel);
}
}

//--------------------------------------------------------------------------
Expand Down Expand Up @@ -201,8 +225,17 @@ void DigitsTask::updateOrbits()
static constexpr double sOrbitLengthInMicroseconds = sOrbitLengthInNanoseconds / 1000;
static constexpr double sOrbitLengthInMilliseconds = sOrbitLengthInMicroseconds / 1000;

mHistogramOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
mHistogramSignalOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
if (mEnable1DRateMaps) {
for (int dsIndex = 0; dsIndex <= NumberOfDualSampas; dsIndex++) {
mHistogramRatePerDualSampa->getDen()->SetBinContent(dsIndex + 1, mNOrbits * sOrbitLengthInMilliseconds * numberOfDualSampaChannels(dsIndex));
mHistogramRateSignalPerDualSampa->getDen()->SetBinContent(dsIndex + 1, mNOrbits * sOrbitLengthInMilliseconds * numberOfDualSampaChannels(dsIndex));
}
}

if (mEnable2DRateMaps) {
mHistogramOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
mHistogramSignalOccupancyElec->getDen()->SetBinContent(1, 1, mNOrbits * sOrbitLengthInMilliseconds);
}
}

void DigitsTask::resetOrbits()
Expand All @@ -217,8 +250,14 @@ void DigitsTask::endOfCycle()
updateOrbits();

// update mergeable ratios
mHistogramOccupancyElec->update();
mHistogramSignalOccupancyElec->update();
if (mEnable1DRateMaps) {
mHistogramRatePerDualSampa->update();
mHistogramRateSignalPerDualSampa->update();
}
if (mEnable2DRateMaps) {
mHistogramOccupancyElec->update();
mHistogramSignalOccupancyElec->update();
}
}

void DigitsTask::endOfActivity(const Activity& /*activity*/)
Expand Down
55 changes: 47 additions & 8 deletions Modules/MUON/MCH/src/PreclustersTask.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
///

#include "MCH/PreclustersTask.h"
#include "MUONCommon/Helpers.h"
#include "MCH/Helpers.h"
#ifdef MCH_HAS_MAPPING_FACTORY
#include "MCHMappingFactory/CreateSegmentation.h"
Expand All @@ -30,6 +31,7 @@ using namespace std;
using namespace o2::mch;
using namespace o2::mch::raw;
using namespace o2::quality_control::core;
using namespace o2::quality_control_modules::muon;

namespace o2
{
Expand All @@ -54,6 +56,10 @@ void PreclustersTask::initialize(o2::framework::InitContext& /*ctx*/)
{
ILOG(Info, Devel) << "initialize PreclustersTask" << AliceO2::InfoLogger::InfoLogger::endm;

// flags to enable the publication of either 1D and 2D maps of channel pseudo-efficiencies
mEnable1DPseudoeffMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable1DPseudoeffMaps", mEnable1DPseudoeffMaps);
mEnable2DPseudoeffMaps = getConfigurationParameter<bool>(mCustomParameters, "Enable2DPseudoeffMaps", mEnable2DPseudoeffMaps);

mIsSignalDigit = o2::mch::createDigitFilter(20, true, true);

mHistogramPreclustersPerDE = std::make_unique<TH1DRatio>("PreclustersPerDE", "Number of pre-clusters for each DE", getNumDE(), 0, getNumDE());
Expand All @@ -64,9 +70,17 @@ void PreclustersTask::initialize(o2::framework::InitContext& /*ctx*/)
const uint32_t nElecXbins = NumberOfDualSampas;

// Histograms in electronics coordinates
mHistogramPseudoeffElec = std::make_unique<TH2FRatio>("Pseudoeff_Elec", "Pseudoeff", nElecXbins, 0, nElecXbins, 64, 0, 64);
mHistogramPseudoeffElec->Sumw2(kFALSE);
publishObject(mHistogramPseudoeffElec.get(), "colz", false);
if (mEnable1DPseudoeffMaps) {
mHistogramPseudoeffPerDualSampa = std::make_unique<TH1DRatio>("PseudoeffPerDualSampa", "Average pseudo-efficiency per dual sampa;DS index;efficiency", o2::mch::NumberOfDualSampas, 0, o2::mch::NumberOfDualSampas, false);
mHistogramPseudoeffPerDualSampa->Sumw2(kFALSE);
publishObject(mHistogramPseudoeffPerDualSampa.get(), "hist", false);
}

if (mEnable2DPseudoeffMaps) {
mHistogramPseudoeffElec = std::make_unique<TH2FRatio>("Pseudoeff_Elec", "Pseudoeff", nElecXbins, 0, nElecXbins, 64, 0, 64);
mHistogramPseudoeffElec->Sumw2(kFALSE);
publishObject(mHistogramPseudoeffElec.get(), "colz", false);
}

//----------------------------------
// Charge distribution histograms
Expand Down Expand Up @@ -337,23 +351,43 @@ void PreclustersTask::plotPrecluster(const o2::mch::PreCluster& preCluster, gsl:
if (isGoodDen[0]) {
// good cluster on non-bending side, check if there is data from the bending side as well
if (fecIdB >= 0 && channelB >= 0) {
mHistogramPseudoeffElec->getDen()->Fill(fecIdB, channelB);
if (mEnable1DPseudoeffMaps) {
mHistogramPseudoeffPerDualSampa->getDen()->Fill(fecIdB);
}
if (mEnable2DPseudoeffMaps) {
mHistogramPseudoeffElec->getDen()->Fill(fecIdB, channelB);
}
}
if (isGoodNum[0]) { // Check if associated to something on Bending
if (fecIdB >= 0 && channelB >= 0) {
mHistogramPseudoeffElec->getNum()->Fill(fecIdB, channelB);
if (mEnable1DPseudoeffMaps) {
mHistogramPseudoeffPerDualSampa->getNum()->Fill(fecIdB);
}
if (mEnable2DPseudoeffMaps) {
mHistogramPseudoeffElec->getNum()->Fill(fecIdB, channelB);
}
}
}
}

if (isGoodDen[1]) {
// good cluster on bending side, check if there is data from the non-bending side as well
if (fecIdNB >= 0 && channelNB >= 0) {
mHistogramPseudoeffElec->getDen()->Fill(fecIdNB, channelNB);
if (mEnable1DPseudoeffMaps) {
mHistogramPseudoeffPerDualSampa->getDen()->Fill(fecIdNB);
}
if (mEnable2DPseudoeffMaps) {
mHistogramPseudoeffElec->getDen()->Fill(fecIdNB, channelNB);
}
}
if (isGoodNum[1]) { // Check if associated to something on Non-Bending
if (fecIdNB >= 0 && channelNB >= 0) {
mHistogramPseudoeffElec->getNum()->Fill(fecIdNB, channelNB);
if (mEnable1DPseudoeffMaps) {
mHistogramPseudoeffPerDualSampa->getNum()->Fill(fecIdNB);
}
if (mEnable2DPseudoeffMaps) {
mHistogramPseudoeffElec->getNum()->Fill(fecIdNB, channelNB);
}
}
}
}
Expand Down Expand Up @@ -398,7 +432,12 @@ void PreclustersTask::endOfCycle()
ILOG(Info, Devel) << "endOfCycle" << AliceO2::InfoLogger::InfoLogger::endm;

// update mergeable ratios
mHistogramPseudoeffElec->update();
if (mEnable1DPseudoeffMaps) {
mHistogramPseudoeffPerDualSampa->update();
}
if (mEnable2DPseudoeffMaps) {
mHistogramPseudoeffElec->update();
}
mHistogramPreclustersPerDE->update();
mHistogramPreclustersSignalPerDE->update();
}
Expand Down