diff --git a/Modules/ZDC/CMakeLists.txt b/Modules/ZDC/CMakeLists.txt index 85a783d92d..ce600bef8c 100644 --- a/Modules/ZDC/CMakeLists.txt +++ b/Modules/ZDC/CMakeLists.txt @@ -2,7 +2,7 @@ add_library(O2QcZDC) -target_sources(O2QcZDC PRIVATE src/ZDCRecDataCheck.cxx src/ZDCRecDataTask.cxx src/ZDCRecDataPostProcessing.cxx src/PostProcessingConfigZDC.cxx src/ZDCRawDataCheck.cxx src/ZDCRawDataTask.cxx ) +target_sources(O2QcZDC PRIVATE src/ZDCRecBeautifyPlots.cxx src/ZDCRecDataCheck.cxx src/ZDCRecDataTask.cxx src/ZDCRecDataPostProcessing.cxx src/PostProcessingConfigZDC.cxx src/ZDCRawDataCheck.cxx src/ZDCRawDataTask.cxx ) target_include_directories( O2QcZDC @@ -19,6 +19,7 @@ install(TARGETS O2QcZDC add_root_dictionary(O2QcZDC HEADERS + include/ZDC/ZDCRecBeautifyPlots.h include/ZDC/ZDCRecDataCheck.h include/ZDC/ZDCRecDataTask.h include/ZDC/ZDCRecDataPostProcessing.h diff --git a/Modules/ZDC/include/ZDC/LinkDef.h b/Modules/ZDC/include/ZDC/LinkDef.h index 5226c1c062..6f06bdbd12 100644 --- a/Modules/ZDC/include/ZDC/LinkDef.h +++ b/Modules/ZDC/include/ZDC/LinkDef.h @@ -3,9 +3,10 @@ #pragma link off all classes; #pragma link off all functions; -#pragma link C++ class o2::quality_control_modules::zdc::ZDCRawDataTask+; -#pragma link C++ class o2::quality_control_modules::zdc::ZDCRawDataCheck+; -#pragma link C++ class o2::quality_control_modules::zdc::ZDCRecDataTask+; -#pragma link C++ class o2::quality_control_modules::zdc::ZDCRecDataCheck+; -#pragma link C++ class o2::quality_control_modules::zdc::ZDCRecDataPostProcessing+; +#pragma link C++ class o2::quality_control_modules::zdc::ZDCRawDataTask + ; +#pragma link C++ class o2::quality_control_modules::zdc::ZDCRawDataCheck + ; +#pragma link C++ class o2::quality_control_modules::zdc::ZDCRecDataTask + ; +#pragma link C++ class o2::quality_control_modules::zdc::ZDCRecDataCheck + ; +#pragma link C++ class o2::quality_control_modules::zdc::ZDCRecDataPostProcessing + ; +#pragma link C++ class o2::quality_control_modules::zdc::ZDCRecBeautifyPlots + ; #endif diff --git a/Modules/ZDC/include/ZDC/ZDCRawDataCheck.h b/Modules/ZDC/include/ZDC/ZDCRawDataCheck.h index b5b9c931f8..d416c2fa5c 100644 --- a/Modules/ZDC/include/ZDC/ZDCRawDataCheck.h +++ b/Modules/ZDC/include/ZDC/ZDCRawDataCheck.h @@ -75,6 +75,10 @@ class ZDCRawDataCheck : public o2::quality_control::checker::CheckInterface private: std::vector mVectHistoCheck; std::vector mVectch; + float NOISE_LEVEL_LOW = 0.0; + float NOISE_LEVEL_HIGH = 2.0; + bool COMPARATOR_ARRAY[12]; + int REFERENCE_BIN = 7; // std::string mStringW = "List channels Warning Quality: "; // std::string mStringE = "List channels Bad Quality: "; diff --git a/Modules/ZDC/include/ZDC/ZDCRawDataTask.h b/Modules/ZDC/include/ZDC/ZDCRawDataTask.h index 4866160339..507c345f6e 100644 --- a/Modules/ZDC/include/ZDC/ZDCRawDataTask.h +++ b/Modules/ZDC/include/ZDC/ZDCRawDataTask.h @@ -156,6 +156,9 @@ class ZDCRawDataTask final : public TaskInterface TH2* fSummaryAlignShift; TH2* fSummaryError; TH1* fOverBc; + // Begin Stefan addition + TH2* fBCalignment; + // End Stefan addition std::vector fNameHisto; std::map fMapBinNameIdSummaryHisto; @@ -173,6 +176,9 @@ class ZDCRawDataTask final : public TaskInterface int fAlignCycle = 1; // param int fErrorCycle = 1; // param int fAlignNumEntries = 2000; + // Begin Stefan addition + int FirstEventBC = 0; + // End Stefan addition sAlignment fMatrixAlign[o2::zdc::NModules][o2::zdc::NChPerModule]; }; diff --git a/Modules/ZDC/include/ZDC/ZDCRecBeautifyPlots.h b/Modules/ZDC/include/ZDC/ZDCRecBeautifyPlots.h new file mode 100644 index 0000000000..cc4483ad8c --- /dev/null +++ b/Modules/ZDC/include/ZDC/ZDCRecBeautifyPlots.h @@ -0,0 +1,52 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file ZDCRecBeautifyPlots.h +/// \author Stefan Cristi Zugravel +/// + +#ifndef QC_MODULE_ZDC_ZDCZDCRECBEAUTIFYPLOTS_H +#define QC_MODULE_ZDC_ZDCZDCRECBEAUTIFYPLOTS_H + +#include "QualityControl/CheckInterface.h" + +namespace o2::quality_control_modules::zdc +{ + +/// \brief ZDC Beautify for centroids plots +/// \author Stefan Cristi Zugravel +class ZDCRecBeautifyPlots : public o2::quality_control::checker::CheckInterface +{ + public: + /// Default constructor + ZDCRecBeautifyPlots() = default; + /// Destructor + ~ZDCRecBeautifyPlots() override = default; + + // Override interface + void configure() override; + Quality check(std::map>* moMap) override; + void beautify(std::shared_ptr mo, Quality checkResult = Quality::Null) override; + std::string getAcceptedType() override; + void reset() override; + void startOfActivity(const Activity& activity) override; + void endOfActivity(const Activity& activity) override; + + private: + std::shared_ptr mActivity; + + ClassDefOverride(ZDCRecBeautifyPlots, 3); +}; + +} // namespace o2::quality_control_modules::zdc + +#endif // QC_MODULE_ZDC_ZDCZDCRECBEAUTIFYPLOTS_H diff --git a/Modules/ZDC/include/ZDC/ZDCRecDataTask.h b/Modules/ZDC/include/ZDC/ZDCRecDataTask.h index 5637a419b5..e726de3f5b 100644 --- a/Modules/ZDC/include/ZDC/ZDCRecDataTask.h +++ b/Modules/ZDC/include/ZDC/ZDCRecDataTask.h @@ -101,6 +101,14 @@ class ZDCRecDataTask final : public TaskInterface int process(const gsl::span& RecBC, const gsl::span& Energy, const gsl::span& TDCData, const gsl::span& Info); bool FillTDCValueHisto(); std::vector tokenLine(std::string Line, std::string Delimiter); + // Begin Stefan addition + bool IsEventCentral(); + void SetConfigCentralEvent(float tdcLimit, int centraleventconfigvalue); + void settdcLimit(float tdcv) { ftdcLimit = tdcv; }; + void setcentraleventconfigvalue(int centrentcfg) { fcentraleventconfigvalue = centrentcfg; }; + float gettdcLimit() { return ftdcLimit; }; + int getcentraleventconfigvalue() { return fcentraleventconfigvalue; }; + // End Stefan addition private: std::vector mVecCh; @@ -127,6 +135,10 @@ class ZDCRecDataTask final : public TaskInterface int fNumBinY = 0; double fMinBinY = 0; double fMaxBinY = 0; + // Begin Stefan addition + float ftdcLimit = 0; + int fcentraleventconfigvalue = 0; + // End Stefan addition // TH1F* mHistogram = nullptr; }; diff --git a/Modules/ZDC/src/ZDCRawDataCheck.cxx b/Modules/ZDC/src/ZDCRawDataCheck.cxx index 63d93d34e7..db3cc36fb1 100644 --- a/Modules/ZDC/src/ZDCRawDataCheck.cxx +++ b/Modules/ZDC/src/ZDCRawDataCheck.cxx @@ -56,12 +56,12 @@ Quality ZDCRawDataCheck::check(std::map Histo to check for (int ih = 0; ih < (int)mVectHistoCheck.size(); ih++) { - mVectHistoCheck.at(ih).numE = 0; - mVectHistoCheck.at(ih).numW = 0; - mVectHistoCheck.at(ih).stringW = ""; - mVectHistoCheck.at(ih).stringE = ""; if (mo->getName() == mVectHistoCheck.at(ih).nameHisto) { if ((mo->getName() == "hpedSummary")) { + mVectHistoCheck.at(ih).numE = 0; + mVectHistoCheck.at(ih).numW = 0; + mVectHistoCheck.at(ih).stringW = ""; + mVectHistoCheck.at(ih).stringE = ""; auto* h = dynamic_cast(mo->getObject()); if (h == nullptr) { ILOG(Error, Support) << "could not cast hpedSummary to TH1*" << ENDM; @@ -87,6 +87,10 @@ Quality ZDCRawDataCheck::check(std::mapgetName() == "hAlignPlot") || (mo->getName() == "hAlignPlotShift")) { + mVectHistoCheck.at(ih).numE = 0; + mVectHistoCheck.at(ih).numW = 0; + mVectHistoCheck.at(ih).stringW = ""; + mVectHistoCheck.at(ih).stringE = ""; int flag_ch_empty = 1; int flag_all_ch_empty = 1; auto* h = dynamic_cast(mo->getObject()); @@ -128,6 +132,10 @@ Quality ZDCRawDataCheck::check(std::mapgetName() == "herrorSummary") { + mVectHistoCheck.at(ih).numE = 0; + mVectHistoCheck.at(ih).numW = 0; + mVectHistoCheck.at(ih).stringW = ""; + mVectHistoCheck.at(ih).stringE = ""; int flag_ch_empty = 1; auto* h = dynamic_cast(mo->getObject()); if (h == nullptr) { @@ -161,6 +169,36 @@ Quality ZDCRawDataCheck::check(std::mapgetName() == "hBCAlignPlot") { + mVectHistoCheck.at(ih).numE = 0; + mVectHistoCheck.at(ih).numW = 0; + mVectHistoCheck.at(ih).stringW = ""; + mVectHistoCheck.at(ih).stringE = ""; + bool ratio_array[12]; + float ratio = 0.0; + auto* h = dynamic_cast(mo->getObject()); + if (h == nullptr) { + ILOG(Error, Support) << "could not cast herrorSummary to TH2*" << ENDM; + return Quality::Null; + } + if ((int)h->GetNbinsX() != (int)mVectHistoCheck.at(ih).paramch.size()) { + return Quality::Null; + } + for (int x = 0; x < h->GetNbinsX(); x++) { + for (int y = 0; y < h->GetNbinsY(); y++) { + ratio = (h->GetBinContent(x + 1, y + 1)) / (h->GetBinContent(x + 1, REFERENCE_BIN)); + if ((ratio > NOISE_LEVEL_LOW) && (ratio < NOISE_LEVEL_HIGH)) { + ratio_array[y] = true; + } else { + ratio_array[y] = false; + } + } + if (!std::equal(std::begin(ratio_array), std::end(ratio_array), std::begin(COMPARATOR_ARRAY))) { + mVectHistoCheck.at(ih).numE += 1; + mVectHistoCheck.at(ih).stringE = mVectHistoCheck.at(ih).stringE + mVectHistoCheck.at(ih).paramch.at(x).ch + " "; + } + } + } // check result check if (mVectHistoCheck.at(ih).numW == 0 && mVectHistoCheck.at(ih).numE == 0) { result = Quality::Good; @@ -175,7 +213,7 @@ Quality ZDCRawDataCheck::check(std::map 0) { result = Quality::Bad; result.addFlag(FlagTypeFactory::Unknown(), - "It is bad because " + std::to_string(mVectHistoCheck.at(ih).numW) + " channels:" + mVectHistoCheck.at(ih).stringE + "have a value in the bad range"); + "It is bad because " + std::to_string(mVectHistoCheck.at(ih).numE) + " channels:" + mVectHistoCheck.at(ih).stringE + "have a value in the bad range"); mVectHistoCheck.at(ih).quality = 3; } } @@ -188,8 +226,6 @@ std::string ZDCRawDataCheck::getAcceptedType() { return "TH1"; } void ZDCRawDataCheck::beautify(std::shared_ptr mo, Quality checkResult) { - // dumpStruct(); - for (int ih = 0; ih < (int)mVectHistoCheck.size(); ih++) { if (mo->getName() == mVectHistoCheck.at(ih).nameHisto) { @@ -198,6 +234,25 @@ void ZDCRawDataCheck::beautify(std::shared_ptr mo, Quality checkR ILOG(Error, Support) << "could not cast '" << mo->getName() << "' to TH1*" << ENDM; return; } + if (mo->getName() == "hBCAlignPlot") { + float ratio = 0.0; + for (int x = 0; x < h->GetNbinsX(); x++) { + for (int y = 0; y < h->GetNbinsY(); y++) { + ratio = (h->GetBinContent(x + 1, y + 1)) / (h->GetBinContent(x + 1, REFERENCE_BIN)); + float xpos = h->GetXaxis()->GetBinCenter(x + 1); + float ypos = h->GetYaxis()->GetBinCenter(y + 1); + std::string strValue = std::format("{:.2f}", ratio); + TLatex* msgr = new TLatex(xpos - 0.35, ypos - 0.15, strValue.c_str()); + msgr->SetTextSize(9); + if ((ratio > NOISE_LEVEL_LOW) && (ratio < NOISE_LEVEL_HIGH)) { + msgr->SetTextColor(kGreen); + } else { + msgr->SetTextColor(kRed); + } + h->GetListOfFunctions()->Add(msgr); + } + } + } if (mVectHistoCheck.at(ih).quality == 1) { std::string errorSt = getCurrentDataTime() + " Ok"; TLatex* msg = new TLatex(mVectHistoCheck.at(ih).posMsgX, mVectHistoCheck.at(ih).posMsgY, errorSt.c_str()); @@ -209,7 +264,7 @@ void ZDCRawDataCheck::beautify(std::shared_ptr mo, Quality checkR h->SetFillColor(kGreen); msg->Draw(); } else if (mVectHistoCheck.at(ih).quality == 3) { - std::string errorSt = getCurrentDataTime() + " Errors --> Call the expert." + mVectHistoCheck.at(ih).stringE; + std::string errorSt = getCurrentDataTime() + " Errors --> Call the expert. " + mVectHistoCheck.at(ih).stringE; TLatex* msg = new TLatex(mVectHistoCheck.at(ih).posMsgX, mVectHistoCheck.at(ih).posMsgY, errorSt.c_str()); msg->SetNDC(); msg->SetTextSize(16); @@ -267,7 +322,45 @@ void ZDCRawDataCheck::init(const Activity& activity) setChCheck("hpedSummary", "TH1F", "PED", "PED_POS_MSG_X", "PED_POS_MSG_Y", activity); setChCheck("hAlignPlotShift", "TH2F", "ALIGN", "ALIGN_POS_MSG_X", "ALIGN_POS_MSG_Y", activity); setChCheck("herrorSummary", "TH2F", "ERROR", "ERROR_POS_MSG_X", "ERROR_POS_MSG_Y", activity); - // dumpStruct(); + setChCheck("hBCAlignPlot", "TH2F", "PED", "PED_POS_MSG_X", "PED_POS_MSG_Y", activity); + + std::vector tokenString; + if (auto param = mCustomParameters.find("REFERENCE_BIN"); param != mCustomParameters.end()) { + ILOG(Debug, Devel) << "Custom parameter - REFERENCE_BIN: " << param->second << ENDM; + tokenString = tokenLine(param->second, ";"); + REFERENCE_BIN = atoi(param->second.c_str()); + } else { + REFERENCE_BIN = 7; + } + if (auto param = mCustomParameters.find("NOISE_LEVEL_LOW"); param != mCustomParameters.end()) { + ILOG(Debug, Devel) << "Custom parameter - NOISE_LEVEL_LOW: " << param->second << ENDM; + tokenString = tokenLine(param->second, ";"); + NOISE_LEVEL_LOW = atof(param->second.c_str()); + } else { + NOISE_LEVEL_LOW = 0.0; + } + if (auto param = mCustomParameters.find("NOISE_LEVEL_HIGH"); param != mCustomParameters.end()) { + ILOG(Debug, Devel) << "Custom parameter - NOISE_LEVEL_HIGH: " << param->second << ENDM; + tokenString = tokenLine(param->second, ";"); + NOISE_LEVEL_HIGH = atof(param->second.c_str()); + } else { + NOISE_LEVEL_HIGH = 2.0; + } + if (auto param = mCustomParameters.find("COMPARATOR_ARRAY"); param != mCustomParameters.end()) { + ILOG(Debug, Devel) << "Custom parameter - COMPARATOR_ARRAY: " << param->second << ENDM; + tokenString = tokenLine(param->second, ";"); + for (int i = 0; i < 12; i++) { + if (atoi(tokenString.at(i).c_str()) == 1) { + COMPARATOR_ARRAY[i] = true; + } else { + COMPARATOR_ARRAY[i] = false; + } + } + } else { + for (int i = 0; i < 12; i++) { + COMPARATOR_ARRAY[i] = false; + } + } } void ZDCRawDataCheck::setChName(std::string channel) diff --git a/Modules/ZDC/src/ZDCRawDataTask.cxx b/Modules/ZDC/src/ZDCRawDataTask.cxx index 3d763a77c8..03119b3c74 100644 --- a/Modules/ZDC/src/ZDCRawDataTask.cxx +++ b/Modules/ZDC/src/ZDCRawDataTask.cxx @@ -215,6 +215,11 @@ void ZDCRawDataTask::reset() if (fOverBc) { fOverBc->Reset(); } + // Begin Stefan addition + if (fBCalignment) { + fBCalignment->Reset(); + } + // End Stefan addition } void ZDCRawDataTask::initHisto() @@ -543,6 +548,25 @@ void ZDCRawDataTask::initHisto() } else { fAlignNumEntries = 2000; } + + // Begin Stefan addition + if (auto param = mCustomParameters.find("CONFIG_BC_ALIGN"); param != mCustomParameters.end()) { + ILOG(Debug, Devel) << "Custom parameter - CONFIG_BC_ALIGN: " << param->second << ENDM; + tokenString = tokenLine(param->second, ";"); + FirstEventBC = atoi(param->second.c_str()); + } else { + FirstEventBC = 0; + } + + if (auto param = mCustomParameters.find("BC_ALIGN_PLOT"); param != mCustomParameters.end()) { + ILOG(Debug, Devel) << "Custom parameter - BC_ALIGN_PLOT: " << param->second << ENDM; + tokenString = tokenLine(param->second, ";"); + setBinHisto2D(atoi(tokenString.at(0).c_str()), atof(tokenString.at(1).c_str()), atof(tokenString.at(2).c_str()), atoi(tokenString.at(3).c_str()), atof(tokenString.at(4).c_str()), atof(tokenString.at(5).c_str())); + } else { + setBinHisto2D(26, 0.5, 26.5, 12, -0.5, 11.5); + } + addNewHisto("BC_ALIGN_PLOT", "hBCAlignPlot", "BC alignment Plot", "NONE", "NONE"); + // End Stefan addition } void ZDCRawDataTask::init() @@ -688,6 +712,15 @@ int ZDCRawDataTask::process(const o2::zdc::EventChData& ch) fNumCycle = 0; } + // Begin Stefan addiiton + if (fBCalignment && (f.bc > (FirstEventBC - 7)) && (f.bc < (FirstEventBC + 6))) { + if (f.Hit) { + fBCalignment->Fill(fMatrixAlign[f.board][f.ch].bin, f.bc); + // fBCalignment->Fill(fMatrixAlign[f.board][f.ch].bin -1, f.bc); + } + } + // End Stefan addition + if ((f.Alice_0 || f.Auto_0 || f.Alice_1 || f.Auto_1 || f.Alice_2 || f.Auto_2 || f.Alice_3 || f.Auto_3 || f.Auto_m) && fTriggerBits && fTriggerBitsHits) { if (f.Alice_3) { fTriggerBits->Fill(itb, 9); @@ -918,6 +951,7 @@ bool ZDCRawDataTask::addNewHisto(std::string type, std::string name, std::string } TString hname = TString::Format("%s", name.c_str()); TString htit = TString::Format("%s", title.c_str()); + // BASELINE if (type == "BASELINE") { // Check if Histogram Exist @@ -1186,7 +1220,15 @@ bool ZDCRawDataTask::addNewHisto(std::string type, std::string name, std::string } } - if ((type == "SUMMARYBASELINE") || (type == "SUMMARYRATE") || (type == "SUMMARY_ALIGN") || (type == "SUMMARY_ALIGN_SHIFT") || (type == "SUMMARY_ERROR")) { + if ((type == "SUMMARYBASELINE") || (type == "SUMMARYRATE") || (type == "SUMMARY_ALIGN") || (type == "SUMMARY_ALIGN_SHIFT") || (type == "SUMMARY_ERROR") || (type == "BC_ALIGN_PLOT")) { + // Begin Stefan addition + if (type == "BC_ALIGN_PLOT") { + fBCalignment = new TH2D(hname, htit, fNumBinX, fMinBinX, fMaxBinX, fNumBinY, FirstEventBC - 6 - 0.5, FirstEventBC + 6 - 0.5); + fBCalignment->GetXaxis()->LabelsOption("v"); + fBCalignment->SetStats(0); + fBCalignment->GetYaxis()->SetTitle("Bunch Crossing [#]"); + } + // End Stefan addition if (type == "SUMMARYBASELINE") { fSummaryPedestal = new TH1F(hname, htit, fNumBinX, fMinBinX, fMaxBinX); fSummaryPedestal->GetXaxis()->LabelsOption("v"); @@ -1220,6 +1262,11 @@ bool ZDCRawDataTask::addNewHisto(std::string type, std::string name, std::string continue; } else { i++; + // Begin Stefan addition + if (type == "BC_ALIGN_PLOT") { + fBCalignment->GetXaxis()->SetBinLabel(fMatrixAlign[imod][ich].bin, TString::Format("%s", fMatrixAlign[imod][ich].name_ch.c_str())); + } + // Begin Stefan addition if (type == "SUMMARYBASELINE") { fSummaryPedestal->GetXaxis()->SetBinLabel(i, TString::Format("%s", getNameChannel(imod, ich).c_str())); } @@ -1239,6 +1286,11 @@ bool ZDCRawDataTask::addNewHisto(std::string type, std::string name, std::string } } } + // Begin Stefan addition + if (type == "BC_ALIGN_PLOT") { + getObjectsManager()->startPublishing(fBCalignment); + } + // Begin Stefan addition if (type == "SUMMARYBASELINE") { getObjectsManager()->startPublishing(fSummaryPedestal); } @@ -1258,6 +1310,11 @@ bool ZDCRawDataTask::addNewHisto(std::string type, std::string name, std::string getObjectsManager()->startPublishing(fSummaryError); } try { + // Begin Stefan addition + if (type == "BC_ALIGN_PLOT") { + getObjectsManager()->addMetadata(fBCalignment->GetName(), fBCalignment->GetName(), "34"); + } + // Begin Stefan addition if (type == "SUMMARYBASELINE") { getObjectsManager()->addMetadata(fSummaryPedestal->GetName(), fSummaryPedestal->GetName(), "34"); } @@ -1275,6 +1332,11 @@ bool ZDCRawDataTask::addNewHisto(std::string type, std::string name, std::string } return true; } catch (...) { + // Begin Stefan addition + if (type == "BC_ALIGN_PLOT") { + ILOG(Warning, Support) << "Metadata could not be added to " << fBCalignment->GetName() << ENDM; + } + // Begin Stefan addition if (type == "SUMMARYBASELINE") { ILOG(Warning, Support) << "Metadata could not be added to " << fSummaryPedestal->GetName() << ENDM; } diff --git a/Modules/ZDC/src/ZDCRecBeautifyPlots.cxx b/Modules/ZDC/src/ZDCRecBeautifyPlots.cxx new file mode 100644 index 0000000000..01905d791f --- /dev/null +++ b/Modules/ZDC/src/ZDCRecBeautifyPlots.cxx @@ -0,0 +1,98 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file ZDCRecBeautifyPlots.cxx +/// \author Stefan Cristi Zugravel +/// + +#include "ZDC/ZDCRecBeautifyPlots.h" +#include "QualityControl/MonitorObject.h" +#include "QualityControl/Quality.h" +#include "QualityControl/QcInfoLogger.h" +// ROOT +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace o2::quality_control; + +namespace o2::quality_control_modules::zdc +{ + +void ZDCRecBeautifyPlots::configure() +{ + // THUS FUNCTION BODY IS AN EXAMPLE. PLEASE REMOVE EVERYTHING YOU DO NOT NEED. + // This method is called whenever CustomParameters are set. + + // Example of retrieving a custom parameter + std::string parameter = mCustomParameters.atOrDefaultValue("myOwnKey1", "default"); +} + +Quality ZDCRecBeautifyPlots::check(std::map>* moMap) +{ + Quality result = Quality::Null; + return result; +} + +std::string ZDCRecBeautifyPlots::getAcceptedType() +{ + // This method is a remnant of early interface prototype and will be removed in the scope of ticket QC-373 + return "TH1"; +} + +void ZDCRecBeautifyPlots::beautify(std::shared_ptr mo, Quality checkResult) +{ + if (mo->getName() == "h_CENTR_ZNA" || mo->getName() == "h_CENTR_ZNC" || mo->getName() == "h_CENTR_ZNA_cut_ZEM" || mo->getName() == "h_CENTR_ZNC_cut_ZEM") { + auto* h = dynamic_cast(mo->getObject()); + if (h == nullptr) { + ILOG(Error, Support) << "could not cast '" << mo->getName() << "' to TH2*" << ENDM; + return; + } + auto* lineH = new TLine(0.5, 0, -0.5, 0); + auto* lineV = new TLine(0, 0.5, 0, -0.5); + auto* marker = new TMarker(h->GetMean(1), h->GetMean(2), 20); + lineH->SetLineColor(kBlack); + lineV->SetLineColor(kBlack); + lineH->SetLineWidth(2); + lineV->SetLineWidth(2); + marker->SetMarkerColor(2); + h->GetListOfFunctions()->Add(lineH); + h->GetListOfFunctions()->Add(lineV); + h->GetListOfFunctions()->Add(marker); + } +} + +void ZDCRecBeautifyPlots::reset() +{ + // THUS FUNCTION BODY IS AN EXAMPLE. PLEASE REMOVE EVERYTHING YOU DO NOT NEED. + ILOG(Debug, Devel) << "ZDCRecBeautifyPlots::reset" << ENDM; + // please reset the state of the check here to allow for reuse between consecutive runs. +} + +void ZDCRecBeautifyPlots::startOfActivity(const Activity& activity) +{ + // THUS FUNCTION BODY IS AN EXAMPLE. PLEASE REMOVE EVERYTHING YOU DO NOT NEED. + ILOG(Debug, Devel) << "ZDCRecBeautifyPlots::start : " << activity.mId << ENDM; +} + +void ZDCRecBeautifyPlots::endOfActivity(const Activity& activity) +{ + // THUS FUNCTION BODY IS AN EXAMPLE. PLEASE REMOVE EVERYTHING YOU DO NOT NEED. + ILOG(Debug, Devel) << "ZDCRecBeautifyPlots::end : " << activity.mId << ENDM; +} + +} // namespace o2::quality_control_modules::zdc diff --git a/Modules/ZDC/src/ZDCRecDataTask.cxx b/Modules/ZDC/src/ZDCRecDataTask.cxx index 0e8b74c0d2..a72ebc036f 100644 --- a/Modules/ZDC/src/ZDCRecDataTask.cxx +++ b/Modules/ZDC/src/ZDCRecDataTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2022 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // @@ -198,6 +198,13 @@ void ZDCRecDataTask::setBinHisto2D(int numBinX, double minBinX, double maxBinX, setMaxBinY(maxBinY); } +// CENTRAL_EVENT_CONFIG -> tdcLimit [ns] ; centraleventconfig [discrete value] +void ZDCRecDataTask::SetConfigCentralEvent(float tdcLimit, int centraleventconfig) +{ + settdcLimit(tdcLimit); + setcentraleventconfigvalue(centraleventconfig); +} + void ZDCRecDataTask::dumpHistoStructure() { std::ofstream dumpFile; @@ -464,6 +471,7 @@ void ZDCRecDataTask::initHisto() setBinHisto2D(100, -10.5, 10.5, 100, -10.5, 10.5); } addNewHisto("TDC-DIFF", "h_TDC_ZNC_DIFF_ZNA_ZNC_SUM_ZNA_V", "TDC Time (ns) TDC ZNC + ZNA vs ZNC - ZNA", "TDCV", "ZNC-ZNA", "TDCV", "ZNC+ZNA", 0); + addNewHisto("TDC-DIFF", "h_TDC_ZNC_DIFF_ZNA_ZNC_SUM_ZNA_V_cut", "TDC Time (ns) TDC ZNC + ZNA vs ZNC - ZNA with cut on ZEMs", "TDCV", "ZNC-ZNA", "TDCV", "ZNC+ZNA", 0); if (auto param = mCustomParameters.find("TDCAvsTDCT"); param != mCustomParameters.end()) { ILOG(Debug, Devel) << "Custom parameter - TDCAvsTDCT: " << param->second << ENDM; @@ -554,6 +562,15 @@ void ZDCRecDataTask::initHisto() } addNewHisto("CENTR_ZNC", "h_CENTR_ZNC", "ZNC Centroid (cm)", "ADC", "CXZNC", "ADC", "CYZNC", 0); addNewHisto("CENTR_ZNC", "h_CENTR_ZNC_cut_ZEM", "ZNC Centroid (cm)", "ADC", "CXZNC", "ADC", "CYZNC", 0); + + // Here we set the parameters for the configuration of the logic which selects the central events + if (auto param = mCustomParameters.find("CENTRAL_EVENT_CONFIG"); param != mCustomParameters.end()) { + ILOG(Debug, Devel) << "Custom parameter - CENTRAL_EVENT_CONFIG: " << param->second << ENDM; + tokenString = tokenLine(param->second, ";"); + SetConfigCentralEvent(atof(tokenString.at(0).c_str()), atoi(tokenString.at(1).c_str())); + } else { + SetConfigCentralEvent(0.0, 0); + } } bool ZDCRecDataTask::add1DHisto(std::string typeH, std::string name, std::string title, std::string typeCh1, std::string ch1, int bin) @@ -800,10 +817,20 @@ int ZDCRecDataTask::process(const gsl::span& RecBC, int znac_id = getIdTDCch("TDCV", "ZNAC"); auto nhit_zncc = mEv.NtdcV(zncc_id); auto nhit_znac = mEv.NtdcV(znac_id); - if ((mEv.NtdcA(zncc_id) == nhit_zncc && nhit_zncc > 0) && (mEv.NtdcA(znac_id) == nhit_znac && nhit_znac > 0)) { - auto sum = mEv.tdcV(zncc_id, 0) + mEv.tdcV(znac_id, 0); - auto diff = mEv.tdcV(zncc_id, 0) - mEv.tdcV(znac_id, 0); - mHisto2D.at(i).histo->Fill(diff, sum); + if (mHisto2D.at(i).histo->GetName() == TString::Format("h_TDC_ZNC_DIFF_ZNA_ZNC_SUM_ZNA_V")) { + if ((mEv.NtdcA(zncc_id) == nhit_zncc && nhit_zncc > 0) && (mEv.NtdcA(znac_id) == nhit_znac && nhit_znac > 0)) { + auto sum = mEv.tdcV(zncc_id, 0) + mEv.tdcV(znac_id, 0); + auto diff = mEv.tdcV(zncc_id, 0) - mEv.tdcV(znac_id, 0); + mHisto2D.at(i).histo->Fill(diff, sum); + } + } + if (mHisto2D.at(i).histo->GetName() == TString::Format("h_TDC_ZNC_DIFF_ZNA_ZNC_SUM_ZNA_V_cut")) { + // if (( (float)o2::zdc::TDCZEM2 > -2.5 && (float)o2::zdc::TDCZEM2 < 2.5 ) && ( (float)o2::zdc::TDCZEM1 > -2.5 && (float)o2::zdc::TDCZEM1 < 2.5 ) ){ + if ((mEv.NtdcA(zncc_id) == nhit_zncc && nhit_zncc > 0) && (mEv.NtdcA(znac_id) == nhit_znac && nhit_znac > 0) && ((float)mEv.tdcV(5, 0) > -12.5 && (float)mEv.tdcV(5, 0) < 12.5) && ((float)mEv.tdcV(4, 0) > -12.5 && (float)mEv.tdcV(4, 0) < 12.5)) { + auto sum = mEv.tdcV(zncc_id, 0) + mEv.tdcV(znac_id, 0); + auto diff = mEv.tdcV(zncc_id, 0) - mEv.tdcV(znac_id, 0); + mHisto2D.at(i).histo->Fill(diff, sum); + } } } if (mHisto2D.at(i).typeh == "TDC_T_A" && mHisto2D.at(i).typech1 == "TDCV" && mHisto2D.at(i).typech2 == "TDCA") { @@ -838,8 +865,7 @@ int ZDCRecDataTask::process(const gsl::span& RecBC, mEv.centroidZNA(x, y); mHisto2D.at(i).histo->Fill(x, y); } else { - // if (( (float)o2::zdc::TDCZEM2 > -2.5 && (float)o2::zdc::TDCZEM2 < 2.5 ) && ( (float)o2::zdc::TDCZEM1 > -2.5 && (float)o2::zdc::TDCZEM1 < 2.5 ) ){ - if (((float)mEv.tdcV(5, 0) > -2.5 && (float)mEv.tdcV(5, 0) < 2.5) && ((float)mEv.tdcV(4, 0) > -2.5 && (float)mEv.tdcV(4, 0) < 2.5)) { + if (IsEventCentral()) { mEv.centroidZNA(x, y); mHisto2D.at(i).histo->Fill(x, y); } @@ -850,7 +876,7 @@ int ZDCRecDataTask::process(const gsl::span& RecBC, mEv.centroidZNC(x, y); mHisto2D.at(i).histo->Fill(x, y); } else { - if (((float)mEv.tdcV(5, 0) > -2.5 && (float)mEv.tdcV(5, 0) < 2.5) && ((float)mEv.tdcV(4, 0) > -2.5 && (float)mEv.tdcV(4, 0) < 2.5)) { + if (IsEventCentral()) { mEv.centroidZNC(x, y); mHisto2D.at(i).histo->Fill(x, y); } @@ -861,6 +887,20 @@ int ZDCRecDataTask::process(const gsl::span& RecBC, return 0; } +bool ZDCRecDataTask::IsEventCentral() +{ + if (fcentraleventconfigvalue == 1) { + // Both ZEMs between a configurable value + if (((float)mEv.tdcV(5, 0) > -ftdcLimit && (float)mEv.tdcV(5, 0) < ftdcLimit) && ((float)mEv.tdcV(4, 0) > -ftdcLimit && (float)mEv.tdcV(4, 0) < ftdcLimit)) { + return true; + } else { + return false; + } + } else { + return false; + } +} + float ZDCRecDataTask::getADCRecValue(std::string typech, std::string ch) { if (typech == "ADC" && ch == "ZNAC") {