diff --git a/Modules/CTP/include/CTP/CTPTrendingTask.h b/Modules/CTP/include/CTP/CTPTrendingTask.h index abcf2d17a7..56420831f9 100644 --- a/Modules/CTP/include/CTP/CTPTrendingTask.h +++ b/Modules/CTP/include/CTP/CTPTrendingTask.h @@ -62,16 +62,21 @@ class CTPTrendingTask : public PostProcessingInterface MetaData mMetaData; UInt_t mTime; // this is not a specific time, used for x axis in trending plots, this name is used in all other modules, please suggest a new name if not appropriate - std::string mInputNamesDefault[5] = { "TVX", "VBA", "DMC", "EMC", "PH0" }; // ctp inputs to be trended by default, unless modified in config.json - std::string ctpinputs[49] = { " T0A", " T0C", " TVX", " TSC", " TCE", " VBA", " VOR", " VIR", " VNC", " VCH", "11", "12", " UCE", "DMC", " USC", " UVX", " U0C", " U0A", "COS", "LAS", "EMC", " PH0", "23", "24", "ZED", "ZNC", "PHL", "PHH", "PHM", "30", "31", "32", "33", "34", "35", "36", "EJ1", "EJ2", "EG1", "EG2", "DJ1", "DG1", "DJ2", "DG2", "45", "46", "47", "48", "49" }; // all ctp input names - std::string mClassNamesDefault[5] = { "CMTVX-B-NOPF", "CMVBA-B-NOPF", "CTVXDMC-B-NOPF-EMC", "CTVXEMC-B-NOPF-EMC", "CTVXPH0-B-NOPF-PHSCPV" }; // ctp classes to be trended by default, unless modified in config.json - std::string mClassNames[5] = { "", "", "", "", "" }; // the trended ctp classes will be filled in this array, either default or from config - std::string mInputNames[5] = { "", "", "", "", "" }; // the trended ctp inputs will be filled in this array, either default or from config - const int mNumberOfClasses = 5; // number of thrended ctp classes - const int mNumberOfInputs = 5; // number of thrended ctp inputs - int mClassIndex[5] = { 65, 65, 65, 65, 65 }; // indices of trended ctp classes, found in CTPconfig - int mInputIndex[5] = { 49, 49, 49, 49, 49 }; // indices of trended ctp inputs, found in CTPconfig - bool mCTPconfigFound = false; // bool telling whether the CTPconfing was already found + std::string mInputNamesDefault[5] = { "MTVX", "MVBA", "0DMC", "0EMC", "0PH0" }; // ctp inputs to be trended by default, unless modified in config.json + std::string mTrendedInputNames[5] = { "inputContentMinBias1:time", "inputContentMinBias2:time", "inputContentDMC:time", "inputContentEMC:time", "inputContentPHO:time" }; + std::string mTrendedClassNames[5] = { "classContentMinBias1:time", "classContentMinBias2:time", "classContentDMC:time", "classContentEMC:time", "classContentPHO:time" }; + std::string mTrendedInputRatioNames[4] = { "inputContentMinBias2/inputs", "inputContentDMC/inputs", "inputContentEMC/inputs", "inputContentPHO/inputs" }; + std::string mTrendedClassRatioNames[4] = { "classContentMinBias2/classes", "classContentDMC/classes", "classContentEMC/classes", "classContentPHO/classes" }; + std::string mClassNamesDefault[5] = { "CMTVX-B-NOPF", "CMVBA-B-NOPF", "CTVXDMC-B-NOPF-EMC", "CTVXEMC-B-NOPF-EMC", "CTVXPH0-B-NOPF-PHSCPV" }; // ctp classes to be trended by default, unless modified in config.json + std::string mClassNames[5] = { "", "", "", "", "" }; // the trended ctp classes will be filled in this array, either default or from config + std::string mInputNames[5] = { "", "", "", "", "" }; // the trended ctp inputs will be filled in this array, either default or from config + std::string mInputParameters[5] = { "minBias1Input", "minBias2Input", "minBisDMCInput", "minBiasEMCInput", "minBiasPHOInput" }; + std::string mClassParameters[5] = { "minBias1Class", "minBias2Class", "minBisDMCclass", "minBiasEMCclass", "minBiasPHOclass" }; + const int mNumberOfClasses = 5; // number of thrended ctp classes + const int mNumberOfInputs = 5; // number of thrended ctp inputs + int mClassIndex[5] = { 65, 65, 65, 65, 65 }; // indices of trended ctp classes, found in CTPconfig + int mInputIndex[5] = { 49, 49, 49, 49, 49 }; // indices of trended ctp inputs, found in CTPconfig + bool mCTPconfigFound = false; // bool telling whether the CTPconfing was already found std::map mPlots; diff --git a/Modules/CTP/include/CTP/RawDataQcTask.h b/Modules/CTP/include/CTP/RawDataQcTask.h index 0c342e9a27..1dc1a149dd 100644 --- a/Modules/CTP/include/CTP/RawDataQcTask.h +++ b/Modules/CTP/include/CTP/RawDataQcTask.h @@ -61,6 +61,8 @@ class CTPRawDataReaderTask final : public TaskInterface int indexMB2 = -1; static const int ninps = o2::ctp::CTP_NINPUTS + 1; static const int nclasses = o2::ctp::CTP_NCLASSES + 1; + double mScaleInput1 = 1; + double mScaleInput2 = 1; long int mTimestamp; std::string classNames[nclasses]; int mIndexMBclass = -1; // index for the MB ctp class, which is used as scaling for the ratios diff --git a/Modules/CTP/include/CTP/RawDataReaderCheck.h b/Modules/CTP/include/CTP/RawDataReaderCheck.h index 0b2a98b876..3cf9d480e4 100644 --- a/Modules/CTP/include/CTP/RawDataReaderCheck.h +++ b/Modules/CTP/include/CTP/RawDataReaderCheck.h @@ -65,16 +65,15 @@ class RawDataReaderCheck : public o2::quality_control::checker::CheckInterface TH1D* mHistClassesPrevious = nullptr; // histogram storing ctp class rates from previous cycle TH1D* mHistInputRatioPrevious = nullptr; // histogram storing ctp input ratios to MB from previous cycle TH1D* mHistClassRatioPrevious = nullptr; - TH1D* mHistAbsolute = nullptr; // histogram storing ctp class ratios to MB from previous cycle - std::vector mVecGoodBC; // vector of good BC positions - std::vector mVecMediumBC; // vector of medium BC positions, we expect a BC at this position, but inputs are below mThreshold - std::vector mVecBadBC; // vector of bad BC positions, we don't expect a BC at this position, but inputs are abow mThreshold - std::vector mVecIndexBad; // vector of ctp input and class indices, which had a big relative change - std::vector mVecIndexMedium; // vector of ctp input and class indices, which had a relative change - std::bitset mLHCBCs; // LHC filling scheme - const char* ctpinputs[49] = { " T0A", " T0C", " TVX", " TSC", " TCE", " VBA", " VOR", " VIR", " VNC", " VCH", "11", "12", " UCE", "DMC", " USC", " UVX", " U0C", " U0A", "COS", "LAS", "EMC", " PH0", "23", "24", "ZED", "ZNC", "PHL", "PHH", "PHM", "30", "31", "32", "33", "34", "35", "36", "EJ1", "EJ2", "EG1", "EG2", "DJ1", "DG1", "DJ2", "DG2", "45", "46", "47", "48", "49" }; // ctp input names + TH1D* mHistAbsolute = nullptr; // histogram storing ctp class ratios to MB from previous cycle + std::vector mVecGoodBC; // vector of good BC positions + std::vector mVecMediumBC; // vector of medium BC positions, we expect a BC at this position, but inputs are below mThreshold + std::vector mVecBadBC; // vector of bad BC positions, we don't expect a BC at this position, but inputs are abow mThreshold + std::vector mVecIndexBad; // vector of ctp input and class indices, which had a big relative change + std::vector mVecIndexMedium; // vector of ctp input and class indices, which had a relative change + std::bitset mLHCBCs; // LHC filling scheme - ClassDefOverride(RawDataReaderCheck, 8); + ClassDefOverride(RawDataReaderCheck, 9); }; } // namespace o2::quality_control_modules::ctp diff --git a/Modules/CTP/src/CTPTrendingTask.cxx b/Modules/CTP/src/CTPTrendingTask.cxx index bf0fe31690..3e34947816 100644 --- a/Modules/CTP/src/CTPTrendingTask.cxx +++ b/Modules/CTP/src/CTPTrendingTask.cxx @@ -24,6 +24,10 @@ #include #include // #include "DataFormatsCTP/RunManager.h" +#include "Common/Utils.h" +#include + +using namespace o2::quality_control_modules::common; #include #include @@ -74,64 +78,15 @@ void CTPTrendingTask::initCTP(Trigger& t) mCTPconfigFound = true; } - try { - mClassNames[0] = std::stof(mCustomParameters.at("minBias1Class", "default")); - } catch (const std::exception& e) { - mClassNames[0] = mClassNamesDefault[0]; - } - - try { - mClassNames[1] = std::stof(mCustomParameters.at("minBias2Class", "default")); - } catch (const std::exception& e) { - mClassNames[1] = mClassNamesDefault[1]; - } - - try { - mClassNames[2] = std::stof(mCustomParameters.at("minBisDMCclass", "default")); - } catch (const std::exception& e) { - mClassNames[2] = mClassNamesDefault[2]; - } - - try { - mClassNames[3] = std::stof(mCustomParameters.at("minBiasEMCclass", "default")); - } catch (const std::exception& e) { - mClassNames[3] = mClassNamesDefault[3]; - } - - try { - mClassNames[4] = std::stof(mCustomParameters.at("minBiasPHOclass", "default")); - } catch (const std::exception& e) { - mClassNames[4] = mClassNamesDefault[4]; - } - - try { - mInputNames[0] = std::stof(mCustomParameters.at("minBias1Input", "default")); - } catch (const std::exception& e) { - mInputNames[0] = mInputNamesDefault[0]; - } - - try { - mInputNames[1] = std::stof(mCustomParameters.at("minBias2Input", "default")); - } catch (const std::exception& e) { - mInputNames[1] = mInputNamesDefault[1]; - } - - try { - mInputNames[2] = std::stof(mCustomParameters.at("minBisDMCInput", "default")); - } catch (const std::exception& e) { - mInputNames[2] = mInputNamesDefault[2]; - } - - try { - mInputNames[3] = std::stof(mCustomParameters.at("minBiasEMCInput", "default")); - } catch (const std::exception& e) { - mInputNames[3] = mInputNamesDefault[3]; - } - - try { - mInputNames[4] = std::stof(mCustomParameters.at("minBiasPHOInput", "default")); - } catch (const std::exception& e) { - mInputNames[4] = mInputNamesDefault[4]; + for (int i = 0; i < 5; i++) { + mClassNames[i] = getFromExtendedConfig(t.activity, mCustomParameters, mClassParameters[i], mClassNamesDefault[i]); + if (mClassNames[i] == "") { + mClassNames[i] = mClassNamesDefault[i]; + } + mInputNames[i] = getFromExtendedConfig(t.activity, mCustomParameters, mInputParameters[i], mInputNamesDefault[i]); + if (mInputNames[i] == "") { + mInputNames[i] = mInputNamesDefault[i]; + } } // get the indices of the classes we want to trend @@ -148,13 +103,8 @@ void CTPTrendingTask::initCTP(Trigger& t) } } - for (size_t i = 0; i < sizeof(ctpinputs) / sizeof(std::string); i++) { - for (size_t j = 0; j < mNumberOfInputs; j++) { - if (ctpinputs[i].find(mInputNames[j]) != std::string::npos) { - mInputIndex[j] = i + 1; - break; - } - } + for (int i = 0; i < 5; i++) { + mInputIndex[i] = o2::ctp::CTPInputsConfiguration::getInputIndexFromName(mInputNames[i]); } // Preparing data structure of TTree @@ -236,11 +186,10 @@ void CTPTrendingTask::generatePlots() return; } - int index = 0; // for keeping track what is trended: - // 0 <= index < 5 - absolute input rates are trended - // 5 <= index < 10 - absolute class rates are trended - // 10 <= index < 15 - input rate ratios are trended - // 15 <= index < 19 - class rate ratios are trended + int indexInput = -1; + int indexClass = -1; + int indexInputRatio = -1; + int indexClassRatio = -1; for (const auto& plot : mConfig.plots) { // Before we generate any new plots, we have to delete existing under the same names. @@ -250,27 +199,53 @@ void CTPTrendingTask::generatePlots() mPlots[plot.name] = nullptr; } - if (index < 5 && mInputIndex[index] == 49) { // if the input index == 49, this input won't be trended - ILOG(Info, Support) << "Input " << mInputNames[index] << " is not trended." << ENDM; - index++; - continue; + indexInput = -1; + indexClass = -1; + indexInputRatio = -1; + indexClassRatio = -1; + for (int i = 0; i < 5; i++) { + if (plot.varexp.find(mTrendedInputNames[i]) != std::string::npos) { + if (mInputIndex[i] == 255) { + ILOG(Info, Support) << "Input " << mInputNames[i] << " is not trended." << ENDM; + indexInput = -10; + } else { + indexInput = i; + } + } + if (plot.varexp.find(mTrendedClassNames[i]) != std::string::npos) { + if (mClassIndex[i] == 65) { + ILOG(Info, Support) << "Class " << mClassNames[i] << " is not trended." << ENDM; + indexClass = -10; + } else { + indexClass = i; + } + } + if (i < 4) { + if (plot.varexp.find(mTrendedInputRatioNames[i]) != std::string::npos) { + if (mInputIndex[i + 1] == 255 || mInputIndex[0] == 255) { + ILOG(Info, Support) << "Input ratio " << mInputNames[i + 1] << " / " << mInputNames[0] << " is not trended." << ENDM; + indexInputRatio = -10; + } else { + indexInputRatio = i; + } + } + if (plot.varexp.find(mTrendedClassRatioNames[i]) != std::string::npos) { + if (mClassIndex[i + 1] == 65) { + ILOG(Info, Support) << "Class ratio " << mClassNames[i + 1] << " / " << mClassNames[0] << " is not trended." << ENDM; + indexClassRatio = -10; + } else { + indexClassRatio = i; + } + } + } } - if (index > 4 && index < 10 && mClassIndex[index - 5] == 65) { // if the class index == 65, this ctp class is not defined in the CTPconfig, so it won't be trended - ILOG(Info, Support) << "Class " << mClassNames[index - 5] << " is not trended." << ENDM; - index++; + if (indexInput == -10 || indexClass == -10) continue; - } - - if (index > 9 && index < 14 && (mInputIndex[index - 9] == 49 || mInputIndex[0] == 49)) { // if the input index == 49, this ctp input won't be trended - ILOG(Info, Support) << "Input ratio " << mInputNames[index - 13] << " / " << mInputNames[0] << " is not trended." << ENDM; - index++; + if (indexClassRatio == -10 || indexInputRatio == -10) continue; - } - - if (index > 13 && (mClassIndex[index - 13] == 65 || mClassIndex[0] == 65)) { // if the class index == 65, this ctp class is not defined in the CTPconfig, so it won't be trended - ILOG(Info, Support) << "Class ratio " << mClassNames[index - 13] << " / " << mClassNames[0] << " is not trended." << ENDM; - index++; + if (indexInput == -1 && indexClass == -1 && indexInputRatio == -1 && indexClassRatio == -1) { + ILOG(Warning, Support) << "Wrongly defined variable: " << plot.varexp << ENDM; continue; } @@ -280,19 +255,23 @@ void CTPTrendingTask::generatePlots() c->SetName(plot.name.c_str()); if (auto histo = dynamic_cast(c->GetPrimitive("htemp"))) { - if (index < 5) { - histo->SetTitle(mInputNames[index].c_str()); - } else if (index < 10) { - histo->SetTitle(mClassNames[index - 5].c_str()); - } else if (index < 14) { - histo->SetTitle(Form("%s/%s", mInputNames[index - 9].c_str(), mInputNames[0].c_str())); - } else { - histo->SetTitle(Form("%s/%s", mClassNames[index - 13].c_str(), mClassNames[0].c_str())); + if (indexInput > -1) { + histo->SetTitle(mInputNames[indexInput].c_str()); + } + if (indexClass > -1) { + histo->SetTitle(mClassNames[indexClass].c_str()); + } + if (indexInputRatio > -1) { + histo->SetTitle(Form("%s/%s", mInputNames[indexInputRatio + 1].c_str(), mInputNames[0].c_str())); + } + if (indexClassRatio > -1) { + histo->SetTitle(Form("%s/%s", mClassNames[indexClassRatio + 1].c_str(), mClassNames[0].c_str())); } - if (index < 10) { + if (indexInput > -1 || indexClass > -1) { histo->GetYaxis()->SetTitle("rate [kHz]"); - } else { + } + if (indexInputRatio > -1 || indexClassRatio > -1) { histo->GetYaxis()->SetTitle("rate ratio"); } c->Update(); @@ -315,7 +294,5 @@ void CTPTrendingTask::generatePlots() mPlots[plot.name] = c; getObjectsManager()->startPublishing(c, PublicationPolicy::Once); - - index++; } } diff --git a/Modules/CTP/src/RawDataQcTask.cxx b/Modules/CTP/src/RawDataQcTask.cxx index bd27a386c9..f2d95d3656 100644 --- a/Modules/CTP/src/RawDataQcTask.cxx +++ b/Modules/CTP/src/RawDataQcTask.cxx @@ -27,6 +27,10 @@ // #include "DataFormatsCTP/RunManager.h" #include #include "Framework/TimingInfo.h" +#include "Common/Utils.h" +#include + +using namespace o2::quality_control_modules::common; namespace o2::quality_control_modules::ctp { @@ -76,7 +80,7 @@ void CTPRawDataReaderTask::startOfActivity(const Activity& activity) mRunNumber = activity.mId; mTimestamp = activity.mValidity.getMin(); - auto MBclassName = mCustomParameters.atOrDefaultValue("MBclassName", "CMTVX-B-NOPF", activity); + auto MBclassName = getFromExtendedConfig(activity, mCustomParameters, "MBclassName", "CMTVX-B-NOPF"); std::string run = std::to_string(mRunNumber); std::string ccdbName = mCustomParameters["ccdbName"]; @@ -115,18 +119,37 @@ void CTPRawDataReaderTask::startOfActivity(const Activity& activity) ILOG(Warning, Support) << "CTP config not found, run:" << run << ENDM; } if (mIndexMBclass == -1) { + MBclassName = "CMBV0 (default)"; mIndexMBclass = 1; } - std::string nameInput1 = mCustomParameters.atOrDefaultValue("MB1inputName", "MTVX", activity); - std::string nameInput2 = mCustomParameters.atOrDefaultValue("MB2inputName", "MT0A", activity); + std::string nameInput1 = getFromExtendedConfig(activity, mCustomParameters, "MB1inputName", "MTVX"); + std::string nameInput2 = getFromExtendedConfig(activity, mCustomParameters, "MB2inputName", "MT0A"); + + auto input1Tokens = o2::utils::Str::tokenize(nameInput1, ':', false, true); + if (input1Tokens.size() > 0) { + nameInput1 = input1Tokens[0]; + } + if (input1Tokens.size() > 1) { + mScaleInput1 = std::stod(input1Tokens[1]); + } + + auto input2Tokens = o2::utils::Str::tokenize(nameInput2, ':', false, true); + if (input2Tokens.size() > 0) { + nameInput2 = input2Tokens[0]; + } + if (input2Tokens.size() > 1) { + mScaleInput2 = std::stod(input2Tokens[1]); + } indexMB1 = o2::ctp::CTPInputsConfiguration::getInputIndexFromName(nameInput1); indexMB2 = o2::ctp::CTPInputsConfiguration::getInputIndexFromName(nameInput2); if (indexMB1 == -1) { indexMB1 = 3; // 3 is the MTVX index + nameInput1 = "MTVX (default)"; } if (indexMB2 == -1) { indexMB2 = 5; // 5 is the MTCE index + nameInput2 = "MTCE (default)"; } for (int i = 0; i < nclasses; i++) { if (classNames[i] == "") { @@ -144,6 +167,11 @@ void CTPRawDataReaderTask::startOfActivity(const Activity& activity) mHistoBCMinBias1->SetTitle(Form("BC position %s", nameInput1.c_str())); mHistoBCMinBias2->SetTitle(Form("BC position %s", nameInput2.c_str())); + if (mScaleInput2 > 1) { + mHistoBCMinBias2->SetTitle(Form("BC position %s scaled 1/%g", nameInput2.c_str(), mScaleInput2)); + } + mHistoClassRatios->SetTitle(Form("Class Ratio to %s", MBclassName.c_str())); + mHistoInputRatios->SetTitle(Form("Input Ratio to %s", nameInput1.c_str())); } void CTPRawDataReaderTask::startOfCycle() @@ -172,11 +200,11 @@ void CTPRawDataReaderTask::monitorData(o2::framework::ProcessingContext& ctx) mHistoInputs->getNum()->Fill(i); mHistoInputRatios->getNum()->Fill(i); if (i == indexMB1 - 1) { - mHistoBCMinBias1->Fill(bcid); + mHistoBCMinBias1->Fill(bcid, 1. / mScaleInput1); mHistoInputRatios->getDen()->Fill(0., 1); } if (i == indexMB2 - 1) { - mHistoBCMinBias2->Fill(bcid); + mHistoBCMinBias2->Fill(bcid, 1. / mScaleInput2); } } } diff --git a/Modules/CTP/src/RawDataReaderCheck.cxx b/Modules/CTP/src/RawDataReaderCheck.cxx index c3ed5d8d0a..624cca4bc7 100644 --- a/Modules/CTP/src/RawDataReaderCheck.cxx +++ b/Modules/CTP/src/RawDataReaderCheck.cxx @@ -27,6 +27,8 @@ #include #include #include +#include "Common/Utils.h" +#include using namespace std; using namespace o2::quality_control; @@ -40,31 +42,27 @@ void RawDataReaderCheck::configure() // reading the parameters from the config.json // if not available, setting a default value // the threshold values are nSigma - std::string param = mCustomParameters.atOrDefaultValue("thresholdRateBad", "3"); - mThresholdRateBad = std::stof(param); + mThresholdRateBad = common::getFromConfig(mCustomParameters, "thresholdRateBad", 3.); if (mThresholdRateBad > 4 || mThresholdRateBad < 0) { mThresholdRateBad = 3; } - param = mCustomParameters.atOrDefaultValue("thresholdRateMedium", "2"); - mThresholdRateMedium = std::stof(param); + mThresholdRateMedium = common::getFromConfig(mCustomParameters, "thresholdRateMedium", 2.); if (mThresholdRateMedium > 4 || mThresholdRateMedium < 0) { mThresholdRateMedium = 2; } - param = mCustomParameters.atOrDefaultValue("thresholdRateRatioBad", "3"); - mThresholdRateRatioBad = std::stof(param); + mThresholdRateRatioBad = common::getFromConfig(mCustomParameters, "thresholdRateRatioBad", 3.); if (mThresholdRateRatioBad > 4 || mThresholdRateRatioBad < 0) { mThresholdRateRatioBad = 3; } - param = mCustomParameters.atOrDefaultValue("thresholdRateRatioMedium", "2"); - mThresholdRateRatioMedium = std::stof(param); + + mThresholdRateRatioMedium = common::getFromConfig(mCustomParameters, "thresholdRateRatioMedium", 2.); if (mThresholdRateRatioMedium > 4 || mThresholdRateRatioMedium < 0) { mThresholdRateRatioMedium = 2; } - param = mCustomParameters.atOrDefaultValue("nSigmaBC", "2"); - mNSigBC = std::stof(param); + mNSigBC = common::getFromConfig(mCustomParameters, "nSigmaBC", 2.); if (mNSigBC < 0) { mNSigBC = 2; } @@ -266,7 +264,12 @@ void RawDataReaderCheck::beautify(std::shared_ptr mo, Quality che } if (mFlagInput) { for (size_t i = 0; i < h->GetXaxis()->GetNbins(); i++) { - h->GetXaxis()->SetBinLabel(i + 1, ctpinputs[i]); + std::string label = o2::ctp::CTPInputsConfiguration::getInputNameFromIndex(i + 1); + if (label == "none") { + h->GetXaxis()->SetBinLabel(i + 1, Form("%zu", i + 1)); + } else { + h->GetXaxis()->SetBinLabel(i + 1, label.c_str()); + } } h->GetXaxis()->SetLabelSize(0.045); h->GetXaxis()->LabelsOption("v"); @@ -282,7 +285,7 @@ void RawDataReaderCheck::beautify(std::shared_ptr mo, Quality che h->GetListOfFunctions()->Add(msg->Clone()); for (size_t i = 0; i < mVecIndexBad.size(); i++) { if (mFlagInput) { - msg = std::make_shared(0.45, 0.65 - i * 0.05, Form("Check %s %s", ctpinputs[mVecIndexBad[i]], groupName.c_str())); + msg = std::make_shared(0.45, 0.65 - i * 0.05, Form("Check %s %s", o2::ctp::CTPInputsConfiguration::getInputNameFromIndex(mVecIndexBad[i] + 1).c_str(), groupName.c_str())); } else { msg = std::make_shared(0.45, 0.65 - i * 0.05, Form("Check %s %s", groupName.c_str(), h->GetXaxis()->GetBinLabel(mVecIndexBad[i] + 1))); }