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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include "CondTools/L1TriggerExt/plugins/L1SubsystemKeysOnlineProdExt.h"

#include "CondTools/L1Trigger/interface/Exception.h"
#include "CondTools/L1TriggerExt/interface/DataWriterExt.h"

#include "CondFormats/L1TObjects/interface/L1TriggerKeyListExt.h"
#include "CondFormats/DataRecord/interface/L1TriggerKeyListExtRcd.h"

#include "FWCore/Framework/interface/EventSetup.h"

L1SubsystemKeysOnlineProdExt::L1SubsystemKeysOnlineProdExt(const edm::ParameterSet& iConfig)
    : m_tscKey(iConfig.getParameter<std::string>("tscKey")),
      m_rsKey(iConfig.getParameter<std::string>("rsKey")),
      m_omdsReader(iConfig.getParameter<std::string>("onlineDB"),
                   iConfig.getParameter<std::string>("onlineAuthentication")),
      m_forceGeneration(iConfig.getParameter<bool>("forceGeneration")) {
  //the following line is needed to tell the framework what
  // data is being produced
  setWhatProduced(this, "SubsystemKeysOnly");

  //now do what ever other initialization is needed
}

L1SubsystemKeysOnlineProdExt::~L1SubsystemKeysOnlineProdExt() {
  // do anything here that needs to be done at desctruction time
  // (e.g. close files, deallocate resources etc.)
}

//
// member functions
//

// ------------ method called to produce the data  ------------
L1SubsystemKeysOnlineProdExt::ReturnType L1SubsystemKeysOnlineProdExt::produce(const L1TriggerKeyExtRcd& iRecord) {
  std::unique_ptr<L1TriggerKeyExt> pL1TriggerKey;

  // Get L1TriggerKeyListExt
  L1TriggerKeyListExt keyList;
  if (!m_forceGeneration) {
    l1t::DataWriterExt dataWriter;
    if (!dataWriter.fillLastTriggerKeyList(keyList)) {
      edm::LogError("L1-O2O") << "Problem getting last L1TriggerKeyListExt";
    }
  }
  // For RUN II the subsystem CondFormats for ALGO and RS are merged together -> we join ALGO and RS keys

  // combine the ALGO and RS keys:
  std::string delimeter = ":";
  std::string m_Key = m_tscKey + delimeter + m_rsKey;

  // If L1TriggerKeyListExt does not contain TSC key, token is empty
  if (keyList.token(m_Key).empty() || m_forceGeneration) {
    // Instantiate new L1TriggerKey
    pL1TriggerKey = std::make_unique<L1TriggerKeyExt>();

    pL1TriggerKey->setTSCKey(m_Key);

    edm::LogVerbatim("L1-O2O") << "TSC KEY:	" << m_tscKey;
    edm::LogVerbatim("L1-O2O") << "RS_KEY: 	" << m_rsKey;

    // Get subsystem keys from OMDS

    // select * from CMS_TRG_L1_CONF.L1_TRG_CONF_KEYS where ID = m_tscKey
    std::vector<std::string> queryStrings;
    queryStrings.push_back("UGT_KEY");
    queryStrings.push_back("UGMT_KEY");
    //       queryStrings.push_back( "CALO_KEY"   ) ;
    queryStrings.push_back("BMTF_KEY");
    queryStrings.push_back("OMTF_KEY");
    queryStrings.push_back("EMTF_KEY");
    queryStrings.push_back("TWINMUX_KEY");

    l1t::OMDSReader::QueryResults subkeyResults = m_omdsReader.basicQuery(queryStrings,
                                                                          "CMS_TRG_L1_CONF",
                                                                          "L1_TRG_CONF_KEYS",
                                                                          "L1_TRG_CONF_KEYS.ID",
                                                                          m_omdsReader.singleAttribute(m_tscKey));

    if (subkeyResults.queryFailed() || subkeyResults.numberRows() != 1)  // check query successful
    {
      edm::LogError("L1-O2O") << "Problem with subsystem TSC key: " << m_tscKey;
      return pL1TriggerKey;
    }

    std::string uGTKey, uGMTKey, CALOKey, BMTFKey, OMTFKey, EMTFKey, TWINMUXKey;

    subkeyResults.fillVariable("UGT_KEY", uGTKey);
    subkeyResults.fillVariable("UGMT_KEY", uGMTKey);
    //       subkeyResults.fillVariable( "CALO_KEY",    CALOKey   ) ;
    subkeyResults.fillVariable("BMTF_KEY", BMTFKey);
    subkeyResults.fillVariable("OMTF_KEY", OMTFKey);
    subkeyResults.fillVariable("EMTF_KEY", EMTFKey);
    subkeyResults.fillVariable("TWINMUX_KEY", TWINMUXKey);

    // For RUN II the subsystem CondFormats for ALGO and RS are merged together -> we join ALGO and RS keys

    queryStrings.clear();
    queryStrings.push_back("UGT_RS_KEY");
    queryStrings.push_back("UGMT_RS_KEY");
    //       queryStrings.push_back( "CALO_RS_KEY" );
    queryStrings.push_back("BMTF_RS_KEY");
    queryStrings.push_back("EMTF_RS_KEY");
    queryStrings.push_back("OMTF_RS_KEY");
    queryStrings.push_back("TWINMUX_RS_KEY");

    subkeyResults = m_omdsReader.basicQuery(
        queryStrings, "CMS_TRG_L1_CONF", "L1_TRG_RS_KEYS", "L1_TRG_RS_KEYS.ID", m_omdsReader.singleAttribute(m_rsKey));

    if (subkeyResults.queryFailed() || subkeyResults.numberRows() != 1)  // check query successful
    {
      edm::LogError("L1-O2O") << "Problem with subsystem RS key: " << m_rsKey;
      return pL1TriggerKey;
    }

    std::string uGTrsKey, uGMTrsKey, CALOrsKey, BMTFrsKey, OMTFrsKey, EMTFrsKey, TWINMUXrsKey;

    subkeyResults.fillVariable("UGT_RS_KEY", uGTrsKey);
    subkeyResults.fillVariable("UGMT_RS_KEY", uGMTrsKey);
    //       subkeyResults.fillVariable( "CALO_RS_KEY",    CALOrsKey ) ;
    subkeyResults.fillVariable("BMTF_RS_KEY", BMTFrsKey);
    subkeyResults.fillVariable("OMTF_RS_KEY", OMTFrsKey);
    subkeyResults.fillVariable("EMTF_RS_KEY", EMTFrsKey);
    subkeyResults.fillVariable("TWINMUX_RS_KEY", TWINMUXrsKey);

    // The offline CALO folks want to have CALOL1 and CALOL2 together -> provide the top level TSC key for the kCALO payload and let them handle the rest
    CALOKey = m_tscKey;
    CALOrsKey = m_rsKey;

    pL1TriggerKey->setSubsystemKey(L1TriggerKeyExt::kuGT, uGTKey + delimeter + uGTrsKey);
    pL1TriggerKey->setSubsystemKey(L1TriggerKeyExt::kuGMT, uGMTKey + delimeter + uGMTrsKey);
    pL1TriggerKey->setSubsystemKey(L1TriggerKeyExt::kCALO, CALOKey + delimeter + CALOrsKey);
    pL1TriggerKey->setSubsystemKey(L1TriggerKeyExt::kBMTF, BMTFKey + delimeter + BMTFrsKey);
    pL1TriggerKey->setSubsystemKey(L1TriggerKeyExt::kOMTF, OMTFKey + delimeter + OMTFrsKey);
    pL1TriggerKey->setSubsystemKey(L1TriggerKeyExt::kEMTF, EMTFKey + delimeter + EMTFrsKey);
    pL1TriggerKey->setSubsystemKey(L1TriggerKeyExt::kTWINMUX, TWINMUXKey + delimeter + TWINMUXrsKey);

    edm::LogVerbatim("L1-O2O") << "UGT_KEY:	" << uGTKey;
    edm::LogVerbatim("L1-O2O") << "UGT_RS_KEY:	" << uGTrsKey;
    edm::LogVerbatim("L1-O2O") << "UGMT_KEY:	" << uGMTKey;
    edm::LogVerbatim("L1-O2O") << "UGMT_RS_KEY:	" << uGMTrsKey;
    edm::LogVerbatim("L1-O2O") << "CALO_KEY:	" << CALOKey;
    edm::LogVerbatim("L1-O2O") << "CALO_RS_KEY:	" << CALOrsKey;
    edm::LogVerbatim("L1-O2O") << "BMTF_KEY:	" << BMTFKey;
    edm::LogVerbatim("L1-O2O") << "BMTF_RS_KEY:	" << BMTFrsKey;
    edm::LogVerbatim("L1-O2O") << "OMTF_KEY:	" << OMTFKey;
    edm::LogVerbatim("L1-O2O") << "OMTF_RS_KEY:	" << OMTFrsKey;
    edm::LogVerbatim("L1-O2O") << "EMTF_KEY:	" << EMTFKey;
    edm::LogVerbatim("L1-O2O") << "EMTF_RS_KEY:	" << EMTFrsKey;
    edm::LogVerbatim("L1-O2O") << "TWINMUX_KEY:	" << TWINMUXKey;
    edm::LogVerbatim("L1-O2O") << "TWINMUX_RS_KEY:	" << TWINMUXrsKey;

  } else {
    throw l1t::DataAlreadyPresentException("L1TriggerKeyExt for TSC key " + m_tscKey + " and RS key " + m_rsKey +
                                           " already in CondDB.");
  }

  return pL1TriggerKey;
}

//define this as a plug-in
//DEFINE_FWK_EVENTSETUP_MODULE(L1SubsystemKeysOnlineProdExt);