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
42 changes: 28 additions & 14 deletions Modules/EMCAL/include/EMCAL/DigitsQcTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,26 @@ namespace emcal
class DigitsQcTask final : public TaskInterface
{
public:
struct DigitsHistograms {
std::string mTriggerClass;
std::array<TH2*, 2> mDigitAmplitude; ///< Digit amplitude
std::array<TH2*, 2> mDigitTime; ///< Digit time
std::array<TH2*, 2> mDigitAmplitudeCalib; ///< Digit amplitude calibrated
std::array<TH2*, 2> mDigitTimeCalib; ///< Digit time calibrated

TH2* mDigitOccupancy = nullptr; ///< Digit occupancy EMCAL and DCAL
TH2* mDigitOccupancyThr = nullptr; ///< Digit occupancy EMCAL and DCAL with Energy trheshold
TProfile2D* mIntegratedOccupancy = nullptr; ///< Digit integrated occupancy
TH1* mDigitAmplitudeEMCAL = nullptr; ///< Digit amplitude in EMCAL
TH1* mDigitAmplitudeDCAL = nullptr; ///< Digit amplitude in DCAL
TH1* mnumberEvents = nullptr; ///< Number of Events for normalization

void initForTrigger(const char* trigger);
void startPublishing();
void reset();
void clean();
};

/// \brief Constructor
DigitsQcTask() = default;
/// Destructor
Expand All @@ -55,22 +75,16 @@ class DigitsQcTask final : public TaskInterface
void reset() override;

void setThreshold(Double_t threshold) { mCellThreshold = threshold; }
void setEndOfPayloadCheck(Bool_t doCheck) { mDoEndOfPayloadCheck = doCheck; }

private:
Double_t mCellThreshold = 0.5; ///< energy cell threshold
std::array<TH2*, 2> mDigitAmplitude; ///< Digit amplitude
std::array<TH2*, 2> mDigitTime; ///< Digit time
std::array<TH2*, 2> mDigitAmplitudeCalib; ///< Digit amplitude calibrated
std::array<TH2*, 2> mDigitTimeCalib; ///< Digit time calibrated
TH2* mDigitOccupancy = nullptr; ///< Digit occupancy EMCAL and DCAL
TH2* mDigitOccupancyThr = nullptr; ///< Digit occupancy EMCAL and DCAL with Energy trheshold
TProfile2D* mIntegratedOccupancy = nullptr; ///< Digit integrated occupancy
TH1* mDigitAmplitudeEMCAL = nullptr; ///< Digit amplitude in EMCAL
TH1* mDigitAmplitudeDCAL = nullptr; ///< Digit amplitude in DCAL
TH1* mnumberEvents = nullptr; ///< Number of Events for normalization
o2::emcal::Geometry* mGeometry = nullptr; ///< EMCAL geometry
o2::emcal::BadChannelMap* mBadChannelMap; ///< EMCAL channel map
o2::emcal::TimeCalibrationParams* mTimeCalib; ///< EMCAL time calib
void startPublishing(DigitsHistograms& histos);
Double_t mCellThreshold = 0.5; ///< energy cell threshold
Bool_t mDoEndOfPayloadCheck = false; ///< Do old style end-of-payload check
std::map<std::string, DigitsHistograms> mHistogramContainer; ///< Container with histograms per trigger class
o2::emcal::Geometry* mGeometry = nullptr; ///< EMCAL geometry
o2::emcal::BadChannelMap* mBadChannelMap; ///< EMCAL channel map
o2::emcal::TimeCalibrationParams* mTimeCalib; ///< EMCAL time calib
};

} // namespace emcal
Expand Down
208 changes: 133 additions & 75 deletions Modules/EMCAL/src/DigitsQcTask.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "EMCALCalib/BadChannelMap.h"
#include "EMCALCalib/TimeCalibrationParams.h"
#include <Framework/InputRecord.h>
#include <CommonConstants/Triggers.h>

namespace o2
{
Expand All @@ -27,68 +28,23 @@ namespace emcal

DigitsQcTask::~DigitsQcTask()
{
for (auto h : mDigitAmplitude) {
delete h;
}
for (auto h : mDigitTime) {
delete h;
}
for (auto h : mDigitAmplitudeCalib) {
delete h;
}
for (auto h : mDigitTimeCalib) {
delete h;
for (auto en : mHistogramContainer) {
en.second.clean();
}
if (mDigitAmplitudeEMCAL)
delete mDigitAmplitudeEMCAL;
if (mDigitAmplitudeDCAL)
delete mDigitAmplitudeDCAL;
}

void DigitsQcTask::initialize(o2::framework::InitContext& /*ctx*/)
{
QcInfoLogger::GetInstance() << "initialize DigitsQcTask" << AliceO2::InfoLogger::InfoLogger::endm;
//define histograms
mDigitAmplitude[0] = new TH2F("digitAmplitudeHG", "Digit Amplitude (High gain)", 100, 0, 100, 20000, 0., 20000.);
mDigitAmplitude[1] = new TH2F("digitAmplitudeLG", "Digit Amplitude (Low gain)", 100, 0, 100, 20000, 0., 20000.);
mDigitAmplitudeCalib[0] = new TH2F("digitAmplitudeHGCalib", "Digit Amplitude Calib (High gain)", 100, 0, 100, 20000, 0., 20000.);
mDigitAmplitudeCalib[1] = new TH2F("digitAmplitudeLGCalib", "Digit Amplitude Calib (Low gain)", 100, 0, 100, 20000, 0., 20000.);

mDigitOccupancy = new TH2F("digitOccupancyEMC", "Digit Occupancy EMCAL", 96, -0.5, 95.5, 208, -0.5, 207.5);
mDigitOccupancyThr = new TH2F("digitOccupancyEMCwThr", "Digit Occupancy EMCAL with E>0.5 GeV/c", 96, -0.5, 95.5, 208, -0.5, 207.5);

mIntegratedOccupancy = new TProfile2D("digitOccupancyInt", "Digit Occupancy Integrated", 96, -0.5, 95.5, 208, -0.5, 207.5);
mIntegratedOccupancy->GetXaxis()->SetTitle("col");
mIntegratedOccupancy->GetYaxis()->SetTitle("row");

mDigitTime[0] = new TH2F("digitTimeHG", "Digit Time (High gain)", 2000, -200, 200, 20000, 0., 20000.);
mDigitTime[1] = new TH2F("digitTimeLG", "Digit Time (Low gain)", 2000, -200, 200, 20000, 0., 20000.);
mDigitTimeCalib[0] = new TH2F("digitTimeHGCalib", "Digit Time Calib (High gain)", 2000, -200, 200, 20000, 0., 20000.);
mDigitTimeCalib[1] = new TH2F("digitTimeLGCalib", "Digit Time Calib (Low gain)", 2000, -200, 200, 20000, 0., 20000.);
// 1D histograms for showing the integrated spectrum

mDigitAmplitudeEMCAL = new TH1F("digitAmplitudeEMCAL", "Digit amplitude in EMCAL", 100, 0., 100.);
mDigitAmplitudeDCAL = new TH1F("digitAmplitudeDCAL", "Digit amplitude in DCAL", 100, 0., 100.);
mnumberEvents = new TH1F("NumberOfEvents", "Number Of Events", 1, 0.5, 1.5);

//Puglishing histograms
for (auto h : mDigitAmplitude)
getObjectsManager()->startPublishing(h);

for (auto h : mDigitTime)
getObjectsManager()->startPublishing(h);

for (auto h : mDigitAmplitudeCalib)
getObjectsManager()->startPublishing(h);

for (auto h : mDigitTimeCalib)
getObjectsManager()->startPublishing(h);

getObjectsManager()->startPublishing(mDigitAmplitudeEMCAL);
getObjectsManager()->startPublishing(mDigitAmplitudeDCAL);
getObjectsManager()->startPublishing(mDigitOccupancy);
getObjectsManager()->startPublishing(mDigitOccupancyThr);
getObjectsManager()->startPublishing(mIntegratedOccupancy);
getObjectsManager()->startPublishing(mnumberEvents);
std::array<std::string, 2> triggers = { { "CAL", "PHYS" } };
for (const auto& trg : triggers) {
DigitsHistograms histos;
histos.initForTrigger(trg.data());
startPublishing(histos);
mHistogramContainer[trg] = histos;
} //trigger type

// initialize geometry
if (!mGeometry)
Expand Down Expand Up @@ -121,12 +77,14 @@ void DigitsQcTask::monitorData(o2::framework::ProcessingContext& ctx)
// check if we have payoad
using MaskType_t = o2::emcal::BadChannelMap::MaskType_t;

auto dataref = ctx.inputs().get("emcal-digits");
auto const* emcheader = o2::framework::DataRefUtils::getHeader<o2::emcal::EMCALBlockHeader*>(dataref);
if (!emcheader->mHasPayload) {
QcInfoLogger::GetInstance() << "No more digits" << AliceO2::InfoLogger::InfoLogger::endm;
//ctx.services().get<o2::framework::ControlService>().readyToQuit(false);
return;
if (mDoEndOfPayloadCheck) {
auto dataref = ctx.inputs().get("emcal-digits");
auto const* emcheader = o2::framework::DataRefUtils::getHeader<o2::emcal::EMCALBlockHeader*>(dataref);
if (!emcheader->mHasPayload) {
QcInfoLogger::GetInstance() << "No more digits" << AliceO2::InfoLogger::InfoLogger::endm;
//ctx.services().get<o2::framework::ControlService>().readyToQuit(false);
return;
}
}

// Get payload and loop over digits
Expand All @@ -142,46 +100,61 @@ void DigitsQcTask::monitorData(o2::framework::ProcessingContext& ctx)
//gsl::span<const o2::emcal::Digit> eventdigits(digitcontainer.data() + trg.getFirstEntry(), trg.getNumberOfObjects());
gsl::span<const o2::emcal::Cell> eventdigits(digitcontainer.data() + trg.getFirstEntry(), trg.getNumberOfObjects());

//trigger type
auto triggertype = trg.getTriggerBits();
bool isPhysTrigger = triggertype & o2::trigger::PhT, isCalibTrigger = triggertype & o2::trigger::Cal;
std::string trgClass;
if (isPhysTrigger) {
trgClass = "PHYS";
} else if (isCalibTrigger) {
trgClass = "CAL";
} else {
QcInfoLogger::GetInstance() << QcInfoLogger::Error << " Unmonitored trigger class requested " << AliceO2::InfoLogger::InfoLogger::endm;
continue;
}

auto histos = mHistogramContainer[trgClass];

for (auto digit : eventdigits) {
int index = digit.getHighGain() ? 0 : (digit.getLowGain() ? 1 : -1);
if (index < 0)
continue;
auto cellindices = mGeometry->GetCellIndex(digit.getTower());

mDigitAmplitude[index]->Fill(digit.getEnergy(), digit.getTower());
histos.mDigitAmplitude[index]->Fill(digit.getEnergy(), digit.getTower());

auto timeoffset = mTimeCalib->getTimeCalibParam(digit.getTower(), digit.getLowGain());
auto timeoffset = mTimeCalib ? mTimeCalib->getTimeCalibParam(digit.getTower(), digit.getLowGain()) : 0.;

if ((mBadChannelMap->getChannelStatus(digit.getTower()) == MaskType_t::GOOD_CELL)) {
mDigitAmplitudeCalib[index]->Fill(digit.getEnergy(), digit.getTower());
mDigitTimeCalib[index]->Fill(digit.getTimeStamp() - timeoffset, digit.getTower());
if (!mBadChannelMap || (mBadChannelMap->getChannelStatus(digit.getTower()) == MaskType_t::GOOD_CELL)) {
histos.mDigitAmplitudeCalib[index]->Fill(digit.getEnergy(), digit.getTower());
histos.mDigitTimeCalib[index]->Fill(digit.getTimeStamp() - timeoffset, digit.getTower());
}
mDigitTime[index]->Fill(digit.getTimeStamp(), digit.getTower());
histos.mDigitTime[index]->Fill(digit.getTimeStamp(), digit.getTower());

// get the supermodule for filling EMCAL/DCAL spectra

try {

auto [row, col] = mGeometry->GlobalRowColFromIndex(digit.getTower());
if (digit.getEnergy() > 0) {
mDigitOccupancy->Fill(col, row);
histos.mDigitOccupancy->Fill(col, row);
}
if (digit.getEnergy() > mCellThreshold) {
mDigitOccupancyThr->Fill(col, row);
histos.mDigitOccupancyThr->Fill(col, row);
}
mIntegratedOccupancy->Fill(col, row, digit.getEnergy());
histos.mIntegratedOccupancy->Fill(col, row, digit.getEnergy());

if (std::get<0>(cellindices) < 12)
mDigitAmplitudeEMCAL->Fill(digit.getEnergy());
histos.mDigitAmplitudeEMCAL->Fill(digit.getEnergy());

else
mDigitAmplitudeDCAL->Fill(digit.getEnergy());
histos.mDigitAmplitudeDCAL->Fill(digit.getEnergy());
} catch (o2::emcal::InvalidCellIDException& e) {
QcInfoLogger::GetInstance() << "Invalid cell ID: " << e.getCellID() << AliceO2::InfoLogger::InfoLogger::endm;
};
}
histos.mnumberEvents->Fill(1);
eventcounter++;
mnumberEvents->Fill(1);
}
}

Expand All @@ -200,17 +173,102 @@ void DigitsQcTask::reset()
// clean all the monitor objects here

QcInfoLogger::GetInstance() << "Resetting the histogram" << AliceO2::InfoLogger::InfoLogger::endm;
for (auto h : mDigitAmplitude)
for (auto cont : mHistogramContainer) {
cont.second.reset();
}
}

void DigitsQcTask::startPublishing(DigitsHistograms& histos)
{
for (auto h : histos.mDigitAmplitude) {
getObjectsManager()->startPublishing(h);
}

for (auto h : histos.mDigitTime) {
getObjectsManager()->startPublishing(h);
}
for (auto h : histos.mDigitAmplitudeCalib) {
getObjectsManager()->startPublishing(h);
}

for (auto h : histos.mDigitTimeCalib) {
getObjectsManager()->startPublishing(h);
}

getObjectsManager()->startPublishing(histos.mDigitAmplitudeEMCAL);
getObjectsManager()->startPublishing(histos.mDigitAmplitudeDCAL);
getObjectsManager()->startPublishing(histos.mDigitOccupancy);
getObjectsManager()->startPublishing(histos.mDigitOccupancyThr);
getObjectsManager()->startPublishing(histos.mIntegratedOccupancy);
getObjectsManager()->startPublishing(histos.mnumberEvents);
}

void DigitsQcTask::DigitsHistograms::initForTrigger(const char* trigger)
{
mTriggerClass = trigger;

mDigitAmplitude[0] = new TH2F(Form("digitAmplitudeHG_%s", mTriggerClass.data()), Form("Digit Amplitude (High gain) %s", mTriggerClass.data()), 100, 0, 100, 20000, 0., 20000.);
mDigitAmplitude[1] = new TH2F(Form("digitAmplitudeLG_%s", mTriggerClass.data()), Form("Digit Amplitude (Low gain) %s", mTriggerClass.data()), 100, 0, 100, 20000, 0., 20000.);

mDigitAmplitudeCalib[0] = new TH2F(Form("digitAmplitudeHGCalib_%s", mTriggerClass.data()), Form("Digit Amplitude (High gain) %s", mTriggerClass.data()), 100, 0, 100, 20000, 0., 20000.);
mDigitAmplitudeCalib[1] = new TH2F(Form("digitAmplitudeLGCalib_%s", mTriggerClass.data()), Form("Digit Amplitude (Low gain) %s", mTriggerClass.data()), 100, 0, 100, 20000, 0., 20000.);

mDigitTime[0] = new TH2F(Form("digitTimeHG_%s", mTriggerClass.data()), Form("Digit Time (High gain) %s", mTriggerClass.data()), 2000, -200, 200, 20000, 0., 20000.);
mDigitTime[1] = new TH2F(Form("digitTimeLG_%s", mTriggerClass.data()), Form("Digit Time (Low gain) %s", mTriggerClass.data()), 2000, -200, 200, 20000, 0., 20000.);

mDigitTimeCalib[0] = new TH2F(Form("digitTimeHGCalib_%s", mTriggerClass.data()), Form("Digit Time Calib (High gain) %s", mTriggerClass.data()), 2000, -200, 200, 20000, 0., 20000.);
mDigitTimeCalib[1] = new TH2F(Form("digitTimeLGCalib_%s", mTriggerClass.data()), Form("Digit Time Calib (Low gain) %s", mTriggerClass.data()), 2000, -200, 200, 20000, 0., 20000.);

mDigitOccupancy = new TH2F(Form("digitOccupancyEMC_%s", mTriggerClass.data()), Form("Digit Occupancy EMCAL %s", mTriggerClass.data()), 96, -0.5, 95.5, 208, -0.5, 207.5);
mDigitOccupancyThr = new TH2F(Form("digitOccupancyEMCwThr_%s", mTriggerClass.data()), Form("Digit Occupancy EMCAL with E>0.5 GeV/c %s", mTriggerClass.data()), 96, -0.5, 95.5, 208, -0.5, 207.5);

mIntegratedOccupancy = new TProfile2D(Form("digitOccupancyInt_%s", mTriggerClass.data()), Form("Digit Occupancy Integrated %s", mTriggerClass.data()), 96, -0.5, 95.5, 208, -0.5, 207.5);
mIntegratedOccupancy->GetXaxis()->SetTitle("col");
mIntegratedOccupancy->GetYaxis()->SetTitle("row");
// 1D histograms for showing the integrated spectrum

mDigitAmplitudeEMCAL = new TH1F(Form("digitAmplitudeEMCAL_%s", mTriggerClass.data()), Form("Digit amplitude in EMCAL %s", mTriggerClass.data()), 500, 0., 500.);
mDigitAmplitudeDCAL = new TH1F(Form("digitAmplitudeDCAL_%s", mTriggerClass.data()), Form("Digit amplitude in DCAL %s", mTriggerClass.data()), 500, 0., 500.);
mnumberEvents = new TH1F(Form("NumberOfEvents_%s", mTriggerClass.data()), Form("Number Of Events %s", mTriggerClass.data()), 1, 0.5, 1.5);
}

void DigitsQcTask::DigitsHistograms::reset()
{

for (auto h : mDigitAmplitude) {
h->Reset();
for (auto h : mDigitTime)
}
for (auto h : mDigitTime) {
h->Reset();
}

mDigitAmplitudeEMCAL->Reset();
mDigitAmplitudeDCAL->Reset();
mDigitOccupancy->Reset();
mDigitOccupancyThr->Reset();
mIntegratedOccupancy->Reset();
}

void DigitsQcTask::DigitsHistograms::clean()
{
for (auto h : mDigitAmplitude) {
delete h;
}
for (auto h : mDigitTime) {
delete h;
}
for (auto h : mDigitAmplitudeCalib) {
delete h;
}
for (auto h : mDigitTimeCalib) {
delete h;
}
if (mDigitAmplitudeEMCAL)
delete mDigitAmplitudeEMCAL;
if (mDigitAmplitudeDCAL)
delete mDigitAmplitudeDCAL;
}

} // namespace emcal
} // namespace quality_control_modules
} // namespace o2