diff --git a/DataFormats/Detectors/CTP/include/DataFormatsCTP/Configuration.h b/DataFormats/Detectors/CTP/include/DataFormatsCTP/Configuration.h index e1543b4336c5e..ba75f38a56f5c 100644 --- a/DataFormats/Detectors/CTP/include/DataFormatsCTP/Configuration.h +++ b/DataFormats/Detectors/CTP/include/DataFormatsCTP/Configuration.h @@ -21,6 +21,7 @@ #include #include #include +#include namespace o2 { namespace ctp @@ -28,15 +29,21 @@ namespace ctp /// Database constants const std::string CCDBPathCTPConfig = "CTP/Config/Config"; /// -bool isDetector(o2::detectors::DetID& det); /// CTP Config items struct BCMask { BCMask() = default; std::string name; std::bitset BCmask; - void printStream(std::ostream& strem) const; + void printStream(std::ostream& stream) const; ClassDefNV(BCMask, 1); }; +struct CTPGenerator { + static const std::set Generators; + std::string name; + std::string frequency; + void printStream(std::ostream& stream) const; + ClassDefNV(CTPGenerator, 1); +}; struct CTPInput { CTPInput() = default; std::string name; @@ -61,30 +68,45 @@ struct CTPDetector { o2::detectors::DetID::ID detID; const char* getName() const { return o2::detectors::DetID::getName(detID); } uint32_t HBaccepted; /// Number of HB frames in TF to be accepted - void printStream(std::ostream& strem) const; + std::string mode; + uint32_t ferst; + void printStream(std::ostream& stream) const; + ClassDefNV(CTPDetector, 1) }; struct CTPCluster { CTPCluster() = default; std::string name; + uint32_t hwMask; o2::detectors::DetID::mask_t maskCluster; std::string getClusterDetNames() const { return o2::detectors::DetID::getNames(maskCluster, ' '); } void printStream(std::ostream& strem) const; - ClassDefNV(CTPCluster, 2) + ClassDefNV(CTPCluster, 3) }; struct CTPClass { CTPClass() = default; std::string name; std::uint64_t classMask; - CTPDescriptor const* descriptor; - CTPCluster const* cluster; + CTPDescriptor const* descriptor = nullptr; + CTPCluster const* cluster = nullptr; + int clusterIndex; + ; void printStream(std::ostream& strem) const; - ClassDefNV(CTPClass, 1); + ClassDefNV(CTPClass, 2); }; class CTPConfiguration { public: CTPConfiguration() = default; bool isDetector(const o2::detectors::DetID& det); + void capitaliseString(std::string& str); + enum ConfigPart { MASKS, + GENS, + INPUT, + LTG, + LTGitems, + CLUSTER, + CLASS }; + int loadConfigurationRun3(const std::string& ctpconfiguartion); int loadConfiguration(const std::string& ctpconfiguartion); void addBCMask(const BCMask& bcmask); void addCTPInput(const CTPInput& input); @@ -97,6 +119,7 @@ class CTPConfiguration std::vector& getCTPClasses() { return mCTPClasses; } uint64_t getInputMask(const std::string& name); bool isMaskInInputs(const uint64_t& mask) const; + bool isBCMaskInConfig(const std::string maskname) const; CTPInput* isInputInConfig(const std::string inpname); uint64_t getDecrtiptorInputsMask(const std::string& name) const; std::map> getDet2InputMap(); @@ -107,13 +130,15 @@ class CTPConfiguration std::string mName; std::string mVersion; std::vector mBCMasks; + std::vector mGenerators; std::vector mInputs; std::vector mDescriptors; std::vector mDetectors; std::vector mClusters; std::vector mCTPClasses; + int processConfigurationLineRun3(std::string& line, int& level); int processConfigurationLine(std::string& line, int& level); - ClassDefNV(CTPConfiguration, 2); + ClassDefNV(CTPConfiguration, 3); }; } // namespace ctp } // namespace o2 diff --git a/DataFormats/Detectors/CTP/src/Configuration.cxx b/DataFormats/Detectors/CTP/src/Configuration.cxx index d7517acd26d90..3da14c6d45820 100644 --- a/DataFormats/Detectors/CTP/src/Configuration.cxx +++ b/DataFormats/Detectors/CTP/src/Configuration.cxx @@ -15,17 +15,42 @@ #include "DataFormatsCTP/Configuration.h" #include #include +#include #include "CommonUtils/StringUtils.h" #include "FairLogger.h" using namespace o2::ctp; // +// +bool CTPConfiguration::isDetector(const o2::detectors::DetID& det) +{ + bool isdet = det.getID() >= det.getNDetectors(); + isdet |= det.getID() < 0; + if (isdet) { + LOG(error) << " Detector does not exist: " << det.getID(); + return false; + } + return true; +} +void CTPConfiguration::capitaliseString(std::string& str) +{ + for (auto& c : str) { + c = std::toupper(c); + } +} +// void BCMask::printStream(std::ostream& stream) const { stream << "CTP BC mask:" << name << std::endl; /// << ":" << BCmask << std::endl; } // +const std::set CTPGenerator::Generators = {"bcd1m", "bcd2m", "bcd10", "bcd20", "rnd1m", "rnd2m", "rnd10", "rnd20"}; +void CTPGenerator::printStream(std::ostream& stream) const +{ + stream << "CTP generator:" << name << " frequency:" << frequency << std::endl; +} +// void CTPInput::printStream(std::ostream& stream) const { stream << "CTP Input:" << name << " Detector:" << getInputDetName() << " Level:" << level << " Hardware mask:0x" << std::hex << inputMask << std::dec << std::endl; @@ -50,30 +75,45 @@ void CTPDescriptor::printStream(std::ostream& stream) const // void CTPDetector::printStream(std::ostream& stream) const { - stream << "CTP Detector:" << getName() << " HBaccepted:" << HBaccepted << std::endl; + stream << "CTP Detector:" << getName() << " HBaccepted:" << HBaccepted; + stream << " Mode:" << mode << " FErst:" << ferst << std::endl; } void CTPCluster::printStream(std::ostream& stream) const { - stream << "CTP Cluster:" << name << getClusterDetNames(); + stream << "CTP Cluster:" << name << " " << getClusterDetNames(); stream << " mask:0b" << std::hex << maskCluster << " " << std::dec; stream << std::endl; } // void CTPClass::printStream(std::ostream& stream) const { - stream << "CTP Class:" << name << " Hardware mask:" << classMask << " Descriptor:" << descriptor->name << " Cluster:" << cluster->name << std::endl; + stream << "CTP Class:" << name << " Hardware mask:" << classMask; + if (descriptor != nullptr) { + stream << " Descriptor:" << descriptor->name; + } + if (cluster != nullptr) { + stream << " Cluster:" << cluster->name; + } + stream << std::endl; } /// CTP configuration /// Assuming Run2 format + LTG -// -bool CTPConfiguration::isDetector(const o2::detectors::DetID& det) +int CTPConfiguration::loadConfigurationRun3(const std::string& ctpconfiguration) { - if (det.getID() >= det.getNDetectors()) { - LOG(fatal) << " Detector does not exist: " << det.getName(); - return false; + LOG(info) << "Loading CTP configuration."; + std::istringstream iss(ctpconfiguration); + int ret = 0; + int level = MASKS; + std::string line; + while (std::getline(iss, line)) { + o2::utils::Str::trim(line); + if ((ret = processConfigurationLineRun3(line, level)) != 0) { + return ret; + } } - return true; + return ret; + return 0; } int CTPConfiguration::loadConfiguration(const std::string& ctpconfiguration) { @@ -90,6 +130,143 @@ int CTPConfiguration::loadConfiguration(const std::string& ctpconfiguration) } return ret; } +int CTPConfiguration::processConfigurationLineRun3(std::string& line, int& level) +{ + // LOG(debug) << "line:" << line; + if (line.size() == 0) { + return 0; + } + if (line.at(0) == '#') { + return 0; + } + // + std::vector tokens = o2::utils::Str::tokenize(line, ' '); + size_t ntokens = tokens.size(); + if (ntokens == 0) { + LOG(warning) << "# of tokens zero in line:" << line; + return 0; + } + size_t first; + if (CTPGenerator::Generators.count(tokens[0])) { + if (level != CLASS) { + level = GENS; + } + level = GENS; + } else if ((first = line.find("bcm")) != std::string::npos) { + if (level == MASKS) { + level = MASKS; + } + } else if ((first = line.find("LTG")) != std::string::npos) { + level = LTG; + } else if ((first = line.find("cluster")) != std::string::npos) { + level = CLUSTER; + } else { + } + switch (level) { + case MASKS: { + BCMask bcmask; + bcmask.name = tokens[1]; + std::regex LHdelimiters("[LH]"); + if (std::regex_search(tokens[2], LHdelimiters)) { + // jusko notation + } else { + // list of integers + for (int i = 2; i < ntokens; i++) { + uint32_t bc; + try { + bc = std::stoull(tokens[i]); + } catch (...) { + LOG(info) << "mask syntax:" << tokens[i]; + continue; + } + bcmask.BCmask.set(bc, 1); + } + } + mBCMasks.push_back(bcmask); + LOG(info) << "BC mask added:" << bcmask.name; + break; + } + case GENS: { + CTPGenerator gen; + gen.name = tokens[0]; + gen.frequency = tokens[1]; + LOG(info) << "Gen added:" << line; + break; + } + case LTG: { + CTPDetector ctpdet; + std::string detname = tokens[1]; + capitaliseString(detname); + o2::detectors::DetID det(detname.c_str()); + if (isDetector(det)) { + ctpdet.detID = det.getID(); + LOG(info) << "Detector found:" << det.getID() << " " << detname; + } else { + LOG(info) << "Unknown detectors:" << line; + } + mDetectors.push_back(ctpdet); + level = LTGitems; + break; + } + case LTGitems: { + if (ntokens == 1) { + mDetectors.back().mode = tokens[0]; + } + LOG(info) << "LTGitem:" << line; + break; + } + case CLUSTER: { + CTPCluster cluster; + try { + cluster.hwMask = std::stoull(tokens[0]); + } catch (...) { + LOG(info) << "Cluster syntax error:" << line; + return level; + } + LOG(info) << "Cluster:" << line; + cluster.name = tokens[2]; + o2::detectors::DetID::mask_t mask; + for (int item = 3; item < ntokens; item++) { + std::string detname = tokens[item]; + capitaliseString(detname); + // LOG(info) << "Detector:" << detname; + o2::detectors::DetID det(detname.c_str()); + isDetector(det); + mask |= det.getMask(); + } + cluster.maskCluster = mask; + mClusters.push_back(cluster); + level = CLASS; + // LOG(info) << "Cluster done:" << cluster.name << std::endl; + break; + } + case CLASS: { + // add to the last cluster + uint64_t index; + try { + index = std::stoull(tokens[0]); + } catch (...) { + LOG(info) << "Class syntax error:" << line; + return level; + } + LOG(info) << "Class:" << line; + CTPClass cls; + cls.classMask = 1ull << index; + cls.name = tokens[1]; + cls.clusterIndex = mClusters.size() - 1; + // LOG(info) << "point:" << cls.cluster << " " << &mClusters.front(); + mCTPClasses.push_back(cls); + break; + } + default: { + LOG(info) << "unknown line:" << line; + } + } + for (auto& cls : mCTPClasses) { + cls.cluster = &mClusters[cls.clusterIndex]; + } + return 0; +} int CTPConfiguration::processConfigurationLine(std::string& line, int& level) { if (line.size() == 0) { @@ -269,7 +446,7 @@ void CTPConfiguration::printStream(std::ostream& stream) const for (const auto& i : mDescriptors) { i.printStream(stream); } - stream << "CTP detectors:" << std::endl; + stream << "CTP detectors:" << mDetectors.size() << std::endl; for (const auto& i : mDetectors) { i.printStream(stream); } @@ -300,6 +477,15 @@ bool CTPConfiguration::isMaskInInputs(const uint64_t& mask) const } return false; } +bool CTPConfiguration::isBCMaskInConfig(const std::string maskname) const +{ + for (auto& bcm : mBCMasks) { + if (bcm.name == maskname) { + return true; + } + } + return false; +} CTPInput* CTPConfiguration::isInputInConfig(const std::string inpname) { for (auto& inp : mInputs) { diff --git a/DataFormats/Detectors/CTP/src/DataFormatsCTPLinkDef.h b/DataFormats/Detectors/CTP/src/DataFormatsCTPLinkDef.h index 47ea52e8f1d91..2def9ecf7cd97 100644 --- a/DataFormats/Detectors/CTP/src/DataFormatsCTPLinkDef.h +++ b/DataFormats/Detectors/CTP/src/DataFormatsCTPLinkDef.h @@ -20,6 +20,8 @@ #pragma link C++ class vector < o2::ctp::CTPInputDigit> + ; #pragma link C++ class o2::ctp::BCMask + ; #pragma link C++ class vector < o2::ctp::BCMask> + ; +#pragma link C++ class o2::ctp::CTPGenerator + ; +#pragma link C++ class vector < o2::ctp::CTPGenerator> + ; #pragma link C++ class o2::ctp::CTPInput + ; #pragma link C++ class vector < o2::ctp::CTPInput> + ; #pragma link C++ class o2::ctp::CTPDescriptor + ; diff --git a/Detectors/CTP/macro/CreateCTPConfig.C b/Detectors/CTP/macro/CreateCTPConfig.C index 5abe052ddbf0b..2f6f57d76322b 100644 --- a/Detectors/CTP/macro/CreateCTPConfig.C +++ b/Detectors/CTP/macro/CreateCTPConfig.C @@ -62,9 +62,40 @@ void CreateCTPConfig(long tmin = 0, long tmax = -1, std::string ccdbHost = "http cfgstr += "CT0A 4 DT0A ALL \n"; cfgstr += "CT0B 62 DT0B ALL \n"; cfgstr += "CINTHM 63 DHM ALL \n"; - - ctpcfg.loadConfiguration(cfgstr); + // + // run3 config + // + std::string cfgRun3str = + "bcm TOF 100 1288 2476 \n \ +bcm PHYS 1226 \n\ +bcd10 1khz \n\ +bcd20 0 \n\ +bcd2m 45khz \n\ +# \n\ +LTG tof \n\ +trig \n\ +bcm TOF e \n\ +# \n\ +LTG mft \n\ +ferst 1 \n\ +# \n\ +LTG mch \n\ +ferst 1 \n\ +# 3 clusters for CRU, TRD and oldTTC detectors: \n\ +0 cluster clu1 fv0 ft0 fdd its mft mid mch tpc zdc tst tof \n\ +0 cl_ph PHYS \n\ +# \n\ +1 cluster clu2 trd \n\ +1 cl_45khz bcd2m \n\ +2 cluster clu3 hmp phs \n\ +2 cl_1khz bcd10 \n \ +3 cluster clu4 emc cpv \n \ +4 cl_5khz bcd20 \n"; + // ctpcfg.loadConfiguration(cfgstr); + ctpcfg.loadConfigurationRun3(cfgRun3str); ctpcfg.printStream(std::cout); + std::cout << "Going write to db" << std::endl; + // return; /// /// add to database o2::ccdb::CcdbApi api; diff --git a/Detectors/CTP/workflowScalers/README.md b/Detectors/CTP/workflowScalers/README.md new file mode 100644 index 0000000000000..4b109f779dc1d --- /dev/null +++ b/Detectors/CTP/workflowScalers/README.md @@ -0,0 +1,8 @@ +How to generate c++ proto files ? +On the computer where project +https://gitlab.cern.ch/aliceCTP3/ctp3-ipbus/-/tree/master +is installed, run + +protoc -I$CTP3_ROOT/ccm/protos --cpp_out=. $CTP3_ROOT/ccm/protos/ctpd.proto + +The h and cc files are in current directory. diff --git a/Detectors/CTP/workflowScalers/py/scalersCTP_v0.txt b/Detectors/CTP/workflowScalers/py/scalersCTP_v0.txt new file mode 100644 index 0000000000000..4efd6f733c44b --- /dev/null +++ b/Detectors/CTP/workflowScalers/py/scalersCTP_v0.txt @@ -0,0 +1,1052 @@ +names: "runn1" +names: "runn2" +names: "runn3" +names: "runn4" +names: "runn5" +names: "runn6" +names: "runn7" +names: "runn8" +names: "runn9" +names: "runn10" +names: "runn11" +names: "runn12" +names: "runn13" +names: "runn14" +names: "runn15" +names: "ltg1_ORB" +names: "ltg1_HB" +names: "ltg1_HBr" +names: "ltg1_HC" +names: "ltg1_PH" +names: "ltg1_PP" +names: "ltg1_CAL" +names: "ltg1_SOT" +names: "ltg1_EOT" +names: "ltg1_SOC" +names: "ltg1_EOC" +names: "ltg1_TF" +names: "ltg1_FERST" +names: "ltg1_RT" +names: "ltg1_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg1_GAP1" +names: "ltg1_GAP2" +names: "ltg1_TPC_sync" +names: "ltg1_TPC_rst" +names: "ltg1_TOF" +names: "ltg2_ORB" +names: "ltg2_HB" +names: "ltg2_HBr" +names: "ltg2_HC" +names: "ltg2_PH" +names: "ltg2_PP" +names: "ltg2_CAL" +names: "ltg2_SOT" +names: "ltg2_EOT" +names: "ltg2_SOC" +names: "ltg2_EOC" +names: "ltg2_TF" +names: "ltg2_FERST" +names: "ltg2_RT" +names: "ltg2_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg2_GAP1" +names: "ltg2_GAP2" +names: "ltg2_TPC_sync" +names: "ltg2_TPC_rst" +names: "ltg2_TOF" +names: "ltg3_ORB" +names: "ltg3_HB" +names: "ltg3_HBr" +names: "ltg3_HC" +names: "ltg3_PH" +names: "ltg3_PP" +names: "ltg3_CAL" +names: "ltg3_SOT" +names: "ltg3_EOT" +names: "ltg3_SOC" +names: "ltg3_EOC" +names: "ltg3_TF" +names: "ltg3_FERST" +names: "ltg3_RT" +names: "ltg3_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg3_GAP1" +names: "ltg3_GAP2" +names: "ltg3_TPC_sync" +names: "ltg3_TPC_rst" +names: "ltg3_TOF" +names: "ltg4_ORB" +names: "ltg4_HB" +names: "ltg4_HBr" +names: "ltg4_HC" +names: "ltg4_PH" +names: "ltg4_PP" +names: "ltg4_CAL" +names: "ltg4_SOT" +names: "ltg4_EOT" +names: "ltg4_SOC" +names: "ltg4_EOC" +names: "ltg4_TF" +names: "ltg4_FERST" +names: "ltg4_RT" +names: "ltg4_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg4_GAP1" +names: "ltg4_GAP2" +names: "ltg4_TPC_sync" +names: "ltg4_TPC_rst" +names: "ltg4_TOF" +names: "ltg5_ORB" +names: "ltg5_HB" +names: "ltg5_HBr" +names: "ltg5_HC" +names: "ltg5_PH" +names: "ltg5_PP" +names: "ltg5_CAL" +names: "ltg5_SOT" +names: "ltg5_EOT" +names: "ltg5_SOC" +names: "ltg5_EOC" +names: "ltg5_TF" +names: "ltg5_FERST" +names: "ltg5_RT" +names: "ltg5_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg5_GAP1" +names: "ltg5_GAP2" +names: "ltg5_TPC_sync" +names: "ltg5_TPC_rst" +names: "ltg5_TOF" +names: "ltg6_ORB" +names: "ltg6_HB" +names: "ltg6_HBr" +names: "ltg6_HC" +names: "ltg6_PH" +names: "ltg6_PP" +names: "ltg6_CAL" +names: "ltg6_SOT" +names: "ltg6_EOT" +names: "ltg6_SOC" +names: "ltg6_EOC" +names: "ltg6_TF" +names: "ltg6_FERST" +names: "ltg6_RT" +names: "ltg6_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg6_GAP1" +names: "ltg6_GAP2" +names: "ltg6_TPC_sync" +names: "ltg6_TPC_rst" +names: "ltg6_TOF" +names: "ltg7_ORB" +names: "ltg7_HB" +names: "ltg7_HBr" +names: "ltg7_HC" +names: "ltg7_PH" +names: "ltg7_PP" +names: "ltg7_CAL" +names: "ltg7_SOT" +names: "ltg7_EOT" +names: "ltg7_SOC" +names: "ltg7_EOC" +names: "ltg7_TF" +names: "ltg7_FERST" +names: "ltg7_RT" +names: "ltg7_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg7_GAP1" +names: "ltg7_GAP2" +names: "ltg7_TPC_sync" +names: "ltg7_TPC_rst" +names: "ltg7_TOF" +names: "ltg8_ORB" +names: "ltg8_HB" +names: "ltg8_HBr" +names: "ltg8_HC" +names: "ltg8_PH" +names: "ltg8_PP" +names: "ltg8_CAL" +names: "ltg8_SOT" +names: "ltg8_EOT" +names: "ltg8_SOC" +names: "ltg8_EOC" +names: "ltg8_TF" +names: "ltg8_FERST" +names: "ltg8_RT" +names: "ltg8_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg8_GAP1" +names: "ltg8_GAP2" +names: "ltg8_TPC_sync" +names: "ltg8_TPC_rst" +names: "ltg8_TOF" +names: "ltg9_ORB" +names: "ltg9_HB" +names: "ltg9_HBr" +names: "ltg9_HC" +names: "ltg9_PH" +names: "ltg9_PP" +names: "ltg9_CAL" +names: "ltg9_SOT" +names: "ltg9_EOT" +names: "ltg9_SOC" +names: "ltg9_EOC" +names: "ltg9_TF" +names: "ltg9_FERST" +names: "ltg9_RT" +names: "ltg9_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg9_GAP1" +names: "ltg9_GAP2" +names: "ltg9_TPC_sync" +names: "ltg9_TPC_rst" +names: "ltg9_TOF" +names: "ltg10_ORB" +names: "ltg10_HB" +names: "ltg10_HBr" +names: "ltg10_HC" +names: "ltg10_PH" +names: "ltg10_PP" +names: "ltg10_CAL" +names: "ltg10_SOT" +names: "ltg10_EOT" +names: "ltg10_SOC" +names: "ltg10_EOC" +names: "ltg10_TF" +names: "ltg10_FERST" +names: "ltg10_RT" +names: "ltg10_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg10_GAP1" +names: "ltg10_GAP2" +names: "ltg10_TPC_sync" +names: "ltg10_TPC_rst" +names: "ltg10_TOF" +names: "ltg11_ORB" +names: "ltg11_HB" +names: "ltg11_HBr" +names: "ltg11_HC" +names: "ltg11_PH" +names: "ltg11_PP" +names: "ltg11_CAL" +names: "ltg11_SOT" +names: "ltg11_EOT" +names: "ltg11_SOC" +names: "ltg11_EOC" +names: "ltg11_TF" +names: "ltg11_FERST" +names: "ltg11_RT" +names: "ltg11_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg11_GAP1" +names: "ltg11_GAP2" +names: "ltg11_TPC_sync" +names: "ltg11_TPC_rst" +names: "ltg11_TOF" +names: "ltg12_ORB" +names: "ltg12_HB" +names: "ltg12_HBr" +names: "ltg12_HC" +names: "ltg12_PH" +names: "ltg12_PP" +names: "ltg12_CAL" +names: "ltg12_SOT" +names: "ltg12_EOT" +names: "ltg12_SOC" +names: "ltg12_EOC" +names: "ltg12_TF" +names: "ltg12_FERST" +names: "ltg12_RT" +names: "ltg12_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg12_GAP1" +names: "ltg12_GAP2" +names: "ltg12_TPC_sync" +names: "ltg12_TPC_rst" +names: "ltg12_TOF" +names: "ltg13_ORB" +names: "ltg13_HB" +names: "ltg13_HBr" +names: "ltg13_HC" +names: "ltg13_PH" +names: "ltg13_PP" +names: "ltg13_CAL" +names: "ltg13_SOT" +names: "ltg13_EOT" +names: "ltg13_SOC" +names: "ltg13_EOC" +names: "ltg13_TF" +names: "ltg13_FERST" +names: "ltg13_RT" +names: "ltg13_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg13_GAP1" +names: "ltg13_GAP2" +names: "ltg13_TPC_sync" +names: "ltg13_TPC_rst" +names: "ltg13_TOF" +names: "ltg14_ORB" +names: "ltg14_HB" +names: "ltg14_HBr" +names: "ltg14_HC" +names: "ltg14_PH" +names: "ltg14_PP" +names: "ltg14_CAL" +names: "ltg14_SOT" +names: "ltg14_EOT" +names: "ltg14_SOC" +names: "ltg14_EOC" +names: "ltg14_TF" +names: "ltg14_FERST" +names: "ltg14_RT" +names: "ltg14_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg14_GAP1" +names: "ltg14_GAP2" +names: "ltg14_TPC_sync" +names: "ltg14_TPC_rst" +names: "ltg14_TOF" +names: "ltg15_ORB" +names: "ltg15_HB" +names: "ltg15_HBr" +names: "ltg15_HC" +names: "ltg15_PH" +names: "ltg15_PP" +names: "ltg15_CAL" +names: "ltg15_SOT" +names: "ltg15_EOT" +names: "ltg15_SOC" +names: "ltg15_EOC" +names: "ltg15_TF" +names: "ltg15_FERST" +names: "ltg15_RT" +names: "ltg15_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg15_GAP1" +names: "ltg15_GAP2" +names: "ltg15_TPC_sync" +names: "ltg15_TPC_rst" +names: "ltg15_TOF" +names: "ltg16_ORB" +names: "ltg16_HB" +names: "ltg16_HBr" +names: "ltg16_HC" +names: "ltg16_PH" +names: "ltg16_PP" +names: "ltg16_CAL" +names: "ltg16_SOT" +names: "ltg16_EOT" +names: "ltg16_SOC" +names: "ltg16_EOC" +names: "ltg16_TF" +names: "ltg16_FERST" +names: "ltg16_RT" +names: "ltg16_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg16_GAP1" +names: "ltg16_GAP2" +names: "ltg16_TPC_sync" +names: "ltg16_TPC_rst" +names: "ltg16_TOF" +names: "ltg17_ORB" +names: "ltg17_HB" +names: "ltg17_HBr" +names: "ltg17_HC" +names: "ltg17_PH" +names: "ltg17_PP" +names: "ltg17_CAL" +names: "ltg17_SOT" +names: "ltg17_EOT" +names: "ltg17_SOC" +names: "ltg17_EOC" +names: "ltg17_TF" +names: "ltg17_FERST" +names: "ltg17_RT" +names: "ltg17_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg17_GAP1" +names: "ltg17_GAP2" +names: "ltg17_TPC_sync" +names: "ltg17_TPC_rst" +names: "ltg17_TOF" +names: "ltg18_ORB" +names: "ltg18_HB" +names: "ltg18_HBr" +names: "ltg18_HC" +names: "ltg18_PH" +names: "ltg18_PP" +names: "ltg18_CAL" +names: "ltg18_SOT" +names: "ltg18_EOT" +names: "ltg18_SOC" +names: "ltg18_EOC" +names: "ltg18_TF" +names: "ltg18_FERST" +names: "ltg18_RT" +names: "ltg18_RS" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "" +names: "ltg18_GAP1" +names: "ltg18_GAP2" +names: "ltg18_TPC_sync" +names: "ltg18_TPC_rst" +names: "ltg18_TOF" +names: "bc40" +names: "clk240" +names: "extorb" +names: "PLSRin" +names: "FastLMin" +names: "BUSYin" +names: "SPAREin" +names: "inp1" +names: "inp2" +names: "inp3" +names: "inp4" +names: "inp5" +names: "inp6" +names: "inp7" +names: "inp8" +names: "inp9" +names: "inp10" +names: "inp11" +names: "inp12" +names: "inp13" +names: "inp14" +names: "inp15" +names: "inp16" +names: "inp17" +names: "inp18" +names: "inp19" +names: "inp20" +names: "inp21" +names: "inp22" +names: "inp23" +names: "inp24" +names: "inp25" +names: "inp26" +names: "inp27" +names: "inp28" +names: "inp29" +names: "inp30" +names: "inp31" +names: "inp32" +names: "inp33" +names: "inp34" +names: "inp35" +names: "inp36" +names: "inp37" +names: "inp38" +names: "inp39" +names: "inp40" +names: "inp41" +names: "inp42" +names: "inp43" +names: "inp44" +names: "inp45" +names: "inp46" +names: "inp47" +names: "inp48" +names: "clamb1" +names: "clamb2" +names: "clamb3" +names: "clamb4" +names: "clamb5" +names: "clamb6" +names: "clamb7" +names: "clamb8" +names: "clamb9" +names: "clamb10" +names: "clamb11" +names: "clamb12" +names: "clamb13" +names: "clamb14" +names: "clamb15" +names: "clamb16" +names: "clamb17" +names: "clamb18" +names: "clamb19" +names: "clamb20" +names: "clamb21" +names: "clamb22" +names: "clamb23" +names: "clamb24" +names: "clamb25" +names: "clamb26" +names: "clamb27" +names: "clamb28" +names: "clamb29" +names: "clamb30" +names: "clamb31" +names: "clamb32" +names: "clamb33" +names: "clamb34" +names: "clamb35" +names: "clamb36" +names: "clamb37" +names: "clamb38" +names: "clamb39" +names: "clamb40" +names: "clamb41" +names: "clamb42" +names: "clamb43" +names: "clamb44" +names: "clamb45" +names: "clamb46" +names: "clamb47" +names: "clamb48" +names: "clamb49" +names: "clamb50" +names: "clamb51" +names: "clamb52" +names: "clamb53" +names: "clamb54" +names: "clamb55" +names: "clamb56" +names: "clamb57" +names: "clamb58" +names: "clamb59" +names: "clamb60" +names: "clamb61" +names: "clamb62" +names: "clamb63" +names: "clamb64" +names: "clama1" +names: "clama2" +names: "clama3" +names: "clama4" +names: "clama5" +names: "clama6" +names: "clama7" +names: "clama8" +names: "clama9" +names: "clama10" +names: "clama11" +names: "clama12" +names: "clama13" +names: "clama14" +names: "clama15" +names: "clama16" +names: "clama17" +names: "clama18" +names: "clama19" +names: "clama20" +names: "clama21" +names: "clama22" +names: "clama23" +names: "clama24" +names: "clama25" +names: "clama26" +names: "clama27" +names: "clama28" +names: "clama29" +names: "clama30" +names: "clama31" +names: "clama32" +names: "clama33" +names: "clama34" +names: "clama35" +names: "clama36" +names: "clama37" +names: "clama38" +names: "clama39" +names: "clama40" +names: "clama41" +names: "clama42" +names: "clama43" +names: "clama44" +names: "clama45" +names: "clama46" +names: "clama47" +names: "clama48" +names: "clama49" +names: "clama50" +names: "clama51" +names: "clama52" +names: "clama53" +names: "clama54" +names: "clama55" +names: "clama56" +names: "clama57" +names: "clama58" +names: "clama59" +names: "clama60" +names: "clama61" +names: "clama62" +names: "clama63" +names: "clama64" +names: "cla0b1" +names: "cla0b2" +names: "cla0b3" +names: "cla0b4" +names: "cla0b5" +names: "cla0b6" +names: "cla0b7" +names: "cla0b8" +names: "cla0b9" +names: "cla0b10" +names: "cla0b11" +names: "cla0b12" +names: "cla0b13" +names: "cla0b14" +names: "cla0b15" +names: "cla0b16" +names: "cla0b17" +names: "cla0b18" +names: "cla0b19" +names: "cla0b20" +names: "cla0b21" +names: "cla0b22" +names: "cla0b23" +names: "cla0b24" +names: "cla0b25" +names: "cla0b26" +names: "cla0b27" +names: "cla0b28" +names: "cla0b29" +names: "cla0b30" +names: "cla0b31" +names: "cla0b32" +names: "cla0b33" +names: "cla0b34" +names: "cla0b35" +names: "cla0b36" +names: "cla0b37" +names: "cla0b38" +names: "cla0b39" +names: "cla0b40" +names: "cla0b41" +names: "cla0b42" +names: "cla0b43" +names: "cla0b44" +names: "cla0b45" +names: "cla0b46" +names: "cla0b47" +names: "cla0b48" +names: "cla0b49" +names: "cla0b50" +names: "cla0b51" +names: "cla0b52" +names: "cla0b53" +names: "cla0b54" +names: "cla0b55" +names: "cla0b56" +names: "cla0b57" +names: "cla0b58" +names: "cla0b59" +names: "cla0b60" +names: "cla0b61" +names: "cla0b62" +names: "cla0b63" +names: "cla0b64" +names: "cla0a1" +names: "cla0a2" +names: "cla0a3" +names: "cla0a4" +names: "cla0a5" +names: "cla0a6" +names: "cla0a7" +names: "cla0a8" +names: "cla0a9" +names: "cla0a10" +names: "cla0a11" +names: "cla0a12" +names: "cla0a13" +names: "cla0a14" +names: "cla0a15" +names: "cla0a16" +names: "cla0a17" +names: "cla0a18" +names: "cla0a19" +names: "cla0a20" +names: "cla0a21" +names: "cla0a22" +names: "cla0a23" +names: "cla0a24" +names: "cla0a25" +names: "cla0a26" +names: "cla0a27" +names: "cla0a28" +names: "cla0a29" +names: "cla0a30" +names: "cla0a31" +names: "cla0a32" +names: "cla0a33" +names: "cla0a34" +names: "cla0a35" +names: "cla0a36" +names: "cla0a37" +names: "cla0a38" +names: "cla0a39" +names: "cla0a40" +names: "cla0a41" +names: "cla0a42" +names: "cla0a43" +names: "cla0a44" +names: "cla0a45" +names: "cla0a46" +names: "cla0a47" +names: "cla0a48" +names: "cla0a49" +names: "cla0a50" +names: "cla0a51" +names: "cla0a52" +names: "cla0a53" +names: "cla0a54" +names: "cla0a55" +names: "cla0a56" +names: "cla0a57" +names: "cla0a58" +names: "cla0a59" +names: "cla0a60" +names: "cla0a61" +names: "cla0a62" +names: "cla0a63" +names: "cla0a64" +names: "cla1b1" +names: "cla1b2" +names: "cla1b3" +names: "cla1b4" +names: "cla1b5" +names: "cla1b6" +names: "cla1b7" +names: "cla1b8" +names: "cla1b9" +names: "cla1b10" +names: "cla1b11" +names: "cla1b12" +names: "cla1b13" +names: "cla1b14" +names: "cla1b15" +names: "cla1b16" +names: "cla1b17" +names: "cla1b18" +names: "cla1b19" +names: "cla1b20" +names: "cla1b21" +names: "cla1b22" +names: "cla1b23" +names: "cla1b24" +names: "cla1b25" +names: "cla1b26" +names: "cla1b27" +names: "cla1b28" +names: "cla1b29" +names: "cla1b30" +names: "cla1b31" +names: "cla1b32" +names: "cla1b33" +names: "cla1b34" +names: "cla1b35" +names: "cla1b36" +names: "cla1b37" +names: "cla1b38" +names: "cla1b39" +names: "cla1b40" +names: "cla1b41" +names: "cla1b42" +names: "cla1b43" +names: "cla1b44" +names: "cla1b45" +names: "cla1b46" +names: "cla1b47" +names: "cla1b48" +names: "cla1b49" +names: "cla1b50" +names: "cla1b51" +names: "cla1b52" +names: "cla1b53" +names: "cla1b54" +names: "cla1b55" +names: "cla1b56" +names: "cla1b57" +names: "cla1b58" +names: "cla1b59" +names: "cla1b60" +names: "cla1b61" +names: "cla1b62" +names: "cla1b63" +names: "cla1b64" +names: "cla1a1" +names: "cla1a2" +names: "cla1a3" +names: "cla1a4" +names: "cla1a5" +names: "cla1a6" +names: "cla1a7" +names: "cla1a8" +names: "cla1a9" +names: "cla1a10" +names: "cla1a11" +names: "cla1a12" +names: "cla1a13" +names: "cla1a14" +names: "cla1a15" +names: "cla1a16" +names: "cla1a17" +names: "cla1a18" +names: "cla1a19" +names: "cla1a20" +names: "cla1a21" +names: "cla1a22" +names: "cla1a23" +names: "cla1a24" +names: "cla1a25" +names: "cla1a26" +names: "cla1a27" +names: "cla1a28" +names: "cla1a29" +names: "cla1a30" +names: "cla1a31" +names: "cla1a32" +names: "cla1a33" +names: "cla1a34" +names: "cla1a35" +names: "cla1a36" +names: "cla1a37" +names: "cla1a38" +names: "cla1a39" +names: "cla1a40" +names: "cla1a41" +names: "cla1a42" +names: "cla1a43" +names: "cla1a44" +names: "cla1a45" +names: "cla1a46" +names: "cla1a47" +names: "cla1a48" +names: "cla1a49" +names: "cla1a50" +names: "cla1a51" +names: "cla1a52" +names: "cla1a53" +names: "cla1a54" +names: "cla1a55" +names: "cla1a56" +names: "cla1a57" +names: "cla1a58" +names: "cla1a59" +names: "cla1a60" +names: "cla1a61" +names: "cla1a62" +names: "cla1a63" +names: "cla1a64" +names: "l0_trigger" +names: "l1_trigger" +names: "l2_trigger" +names: "clum1" +names: "clum2" +names: "clum3" +names: "clum4" +names: "clum5" +names: "clum6" +names: "clu01" +names: "clu02" +names: "clu03" +names: "clu04" +names: "clu05" +names: "clu06" +names: "clu11" +names: "clu12" +names: "clu13" +names: "clu14" +names: "clu15" +names: "clu16" + diff --git a/Detectors/CTP/workflowScalers/src/ctp-proxy.cxx b/Detectors/CTP/workflowScalers/src/ctp-proxy.cxx index 57287ca6ef8f1..eada6bbf82974 100644 --- a/Detectors/CTP/workflowScalers/src/ctp-proxy.cxx +++ b/Detectors/CTP/workflowScalers/src/ctp-proxy.cxx @@ -22,6 +22,7 @@ // example to run: // o2-ctp-proxy --ctp-proxy '--channel-config "name=ctp-proxy,type=sub,method=connect,address=tcp://127.0.0.1:5556,rateLogging=1,transport=zeromq"' +// o2-ctp-proxy --ctp-proxy '--channel-config "name=ctp-proxy,type=sub,method=connect,address=tcp://188.185.88.65:50090,rateLogging=1,transport=zeromq"' -b #include "Framework/WorkflowSpec.h" #include "Framework/DataProcessorSpec.h" @@ -35,6 +36,9 @@ #include "Headers/DataHeaderHelpers.h" #include #include "CommonUtils/StringUtils.h" +#include "DataFormatsCTP/Configuration.h" +#include "CCDB/CcdbApi.h" +#include "CCDB/BasicCCDBManager.h" #include #include @@ -54,35 +58,52 @@ InjectorFunction dcs2dpl() std::string messageHeader{static_cast(parts.At(0)->GetData()), parts.At(0)->GetSize()}; size_t dataSize = parts.At(1)->GetSize(); std::string messageData{static_cast(parts.At(1)->GetData()), parts.At(1)->GetSize()}; - LOG(info) << "received message " << messageHeader << " of size " << dataSize << " Payload:" << messageData; - o2::header::DataHeader hdrF("CTP_COUNTERS", o2::header::gDataOriginCTP, 0); - OutputSpec outsp{hdrF.dataOrigin, hdrF.dataDescription, hdrF.subSpecification}; - auto channel = channelRetriever(outsp, *timesliceId); - if (channel.empty()) { - LOG(error) << "No output channel found for OutputSpec " << outsp; - return; - } + LOG(info) << "received message " << messageHeader << " of size " << dataSize; // << " Payload:" << messageData; + if ((messageHeader.find("ctpconfig") != std::string::npos) && (dataSize < 2000)) { + LOG(info) << "CTP config received"; + o2::ctp::CTPConfiguration ctpconfig; + ctpconfig.loadConfigurationRun3(messageData); + // data base + long tmin = 0; + long tmax = -1; + std::string ccdbHost = "http://ccdb-test.cern.ch:8080"; + o2::ccdb::CcdbApi api; + map metadata; // can be empty + api.init(ccdbHost.c_str()); // or http://localhost:8080 for a local installation + // store abitrary user object in strongly typed manner + api.storeAsTFileAny(&ctpconfig, o2::ctp::CCDBPathCTPConfig, metadata, tmin, tmax); + LOG(info) << "CTP config in database" << std::endl + << std::flush; + } else { + o2::header::DataHeader hdrF("CTP_COUNTERS", o2::header::gDataOriginCTP, 0); + OutputSpec outsp{hdrF.dataOrigin, hdrF.dataDescription, hdrF.subSpecification}; + auto channel = channelRetriever(outsp, *timesliceId); + if (channel.empty()) { + LOG(error) << "No output channel found for OutputSpec " << outsp; + return; + } - hdrF.tfCounter = *timesliceId; // this also - hdrF.payloadSerializationMethod = o2::header::gSerializationMethodNone; - hdrF.splitPayloadParts = 1; - hdrF.splitPayloadIndex = 0; - hdrF.payloadSize = parts.At(1)->GetSize(); - hdrF.firstTForbit = 0; // this should be irrelevant for Counters ? Orbit is in payload + hdrF.tfCounter = *timesliceId; // this also + hdrF.payloadSerializationMethod = o2::header::gSerializationMethodNone; + hdrF.splitPayloadParts = 1; + hdrF.splitPayloadIndex = 0; + hdrF.payloadSize = parts.At(1)->GetSize(); + hdrF.firstTForbit = 0; // this should be irrelevant for Counters ? Orbit is in payload - auto fmqFactory = device.GetChannel(channel).Transport(); + auto fmqFactory = device.GetChannel(channel).Transport(); - o2::header::Stack headerStackF{hdrF, DataProcessingHeader{*timesliceId, 1}}; - auto hdMessageF = fmqFactory->CreateMessage(headerStackF.size(), fair::mq::Alignment{64}); - auto plMessageF = fmqFactory->CreateMessage(hdrF.payloadSize, fair::mq::Alignment{64}); - memcpy(hdMessageF->GetData(), headerStackF.data(), headerStackF.size()); - memcpy(plMessageF->GetData(), parts.At(1)->GetData(), hdrF.payloadSize); + o2::header::Stack headerStackF{hdrF, DataProcessingHeader{*timesliceId, 1}}; + auto hdMessageF = fmqFactory->CreateMessage(headerStackF.size(), fair::mq::Alignment{64}); + auto plMessageF = fmqFactory->CreateMessage(hdrF.payloadSize, fair::mq::Alignment{64}); + memcpy(hdMessageF->GetData(), headerStackF.data(), headerStackF.size()); + memcpy(plMessageF->GetData(), parts.At(1)->GetData(), hdrF.payloadSize); - FairMQParts outParts; - outParts.AddPart(std::move(hdMessageF)); - outParts.AddPart(std::move(plMessageF)); - sendOnChannel(device, outParts, channel); - // LOG(info) << "Sent CTP counters DPL message"; + FairMQParts outParts; + outParts.AddPart(std::move(hdMessageF)); + outParts.AddPart(std::move(plMessageF)); + sendOnChannel(device, outParts, channel); + LOG(info) << "Sent CTP counters DPL message" << std::flush; + } }; } diff --git a/Detectors/PHOS/calib/src/PHOSPedestalCalibDevice.cxx b/Detectors/PHOS/calib/src/PHOSPedestalCalibDevice.cxx index 21e8266e1de95..8abfc0ecbb9fc 100644 --- a/Detectors/PHOS/calib/src/PHOSPedestalCalibDevice.cxx +++ b/Detectors/PHOS/calib/src/PHOSPedestalCalibDevice.cxx @@ -103,7 +103,7 @@ void PHOSPedestalCalibDevice::sendOutput(DataAllocator& output) // prepare all info to be sent to CCDB auto flName = o2::ccdb::CcdbApi::generateFileName("Pedestals"); std::map md; - long validityTime = mRunStartTime + 7776000000; //3 months validity time + long validityTime = mRunStartTime + 7776000000; // 3 months validity time o2::ccdb::CcdbObjectInfo info("PHS/Calib/Pedestals", "Pedestals", flName, md, mRunStartTime, validityTime); info.setMetaData(md); auto image = o2::ccdb::CcdbApi::createObjectImage(mPedestals.get(), &info);