Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
#include "CondCore/Utilities/interface/PayloadInspector.h"
#include "CondCore/CondDB/interface/ConnectionPool.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ServiceRegistry/interface/ServiceRegistry.h"

#include <sstream>
#include <iostream>

namespace cond {

  namespace payloadInspector {

    PlotAnnotations::PlotAnnotations() : m() {}

    std::string PlotAnnotations::get(const std::string& key) const {
      std::string ret("");
      auto im = m.find(key);
      if (im != m.end())
        ret = im->second;
      return ret;
    }

    constexpr const char* const ModuleVersion::label;

    PlotBase::PlotBase()
        : m_plotAnnotations(),
          m_inputParams(),
          m_tagNames(),
          m_tagBoundaries(),
          m_tagIovs(),
          m_inputParamValues(),
          m_data("") {}

    void PlotBase::addInputParam(const std::string& paramName) {
      // maybe add a check for existing params - returning an Exception when found...
      m_inputParams.insert(paramName);
    }

    std::string PlotBase::payloadType() const { return m_plotAnnotations.get(PlotAnnotations::PAYLOAD_TYPE_K); }

    std::string PlotBase::title() const { return m_plotAnnotations.get(PlotAnnotations::TITLE_K); }

    std::string PlotBase::type() const { return m_plotAnnotations.get(PlotAnnotations::PLOT_TYPE_K); }

    bool PlotBase::isSingleIov() const { return m_plotAnnotations.singleIov; }

    unsigned int PlotBase::ntags() const { return m_plotAnnotations.ntags; }

    bool PlotBase::isTwoTags() const { return m_plotAnnotations.ntags == 2; }

    py::list PlotBase::inputParams() const {
      py::list tmp;
      for (const auto& ip : m_inputParams) {
        tmp.append(ip);
      }
      return tmp;
    }

    void PlotBase::setInputParamValues(const py::dict& values) {
      for (auto item : values) {
        std::string k = item.first.cast<std::string>();
        std::string v = item.second.cast<std::string>();
        if (m_inputParams.find(k) != m_inputParams.end()) {
          m_inputParamValues.insert(std::make_pair(k, v));
        }
      }
    }

    std::string PlotBase::data() const { return m_data; }

    bool PlotBase::process(const std::string& connectionString, const py::list& tagsWithTimeBoundaries) {
      size_t nt = py::len(tagsWithTimeBoundaries);
      bool ret = false;
      if (nt) {
        std::vector<std::tuple<std::string, cond::Time_t, cond::Time_t> > tags;
        tags.resize(nt);
        for (size_t i = 0; i < nt; i++) {
          py::tuple entry = tagsWithTimeBoundaries[i].cast<py::tuple>();
          std::string tagName = entry[0].cast<std::string>();
          std::string time0s = entry[1].cast<std::string>();
          std::string time1s = entry[2].cast<std::string>();
          cond::Time_t time0 = std::stoull(time0s);
          cond::Time_t time1 = std::stoull(time1s);
          tags[i] = std::make_tuple(tagName, time0, time1);
        }
        ret = exec_process(connectionString, tags);
      }
      return ret;
    }

    bool PlotBase::exec_process(
        const std::string& connectionString,
        const std::vector<std::tuple<std::string, cond::Time_t, cond::Time_t> >& tagsWithTimeBoundaries) {
      m_tagNames.clear();
      m_tagBoundaries.clear();
      m_tagIovs.clear();
      init();

      std::vector<edm::ParameterSet> psets;
      edm::ParameterSet pSet;
      pSet.addParameter("@service_type", std::string("SiteLocalConfigService"));
      psets.push_back(pSet);
      static const edm::ServiceToken services(edm::ServiceRegistry::createSet(psets));
      const edm::ServiceRegistry::Operate operate(services);
      bool ret = false;
      size_t nt = tagsWithTimeBoundaries.size();
      if (nt) {
        cond::persistency::ConnectionPool connection;
        m_dbSession = connection.createSession(connectionString);
        m_dbSession.transaction().start();
        m_tagNames.resize(nt);
        m_tagBoundaries.resize(nt);
        m_tagIovs.resize(nt);
        for (size_t i = 0; i < nt; i++) {
          const std::string& tagName = std::get<0>(tagsWithTimeBoundaries[i]);
          cond::Time_t time0 = std::get<1>(tagsWithTimeBoundaries[i]);
          cond::Time_t time1 = std::get<2>(tagsWithTimeBoundaries[i]);
          m_tagNames[i] = tagName;
          m_tagBoundaries[i] = std::make_pair(time0, time1);
          auto proxy = m_dbSession.readIov(tagName);
          proxy.selectRange(time0, time1, m_tagIovs[i]);
        }
        m_data = processData();
        m_dbSession.transaction().commit();
        ret = true;
      }
      return ret;
    }

    void PlotBase::init() {}

    std::string PlotBase::processData() { return ""; }

    cond::Tag_t PlotBase::getTagInfo(const std::string& tag) {
      cond::Tag_t info = m_dbSession.readIov(tag).tagInfo();
      return info;
    }

    const std::map<std::string, std::string>& PlotBase::inputParamValues() const { return m_inputParamValues; }

    cond::persistency::Session PlotBase::dbSession() { return m_dbSession; }

  }  // namespace payloadInspector

}  // namespace cond