File indexing completed on 2024-04-06 12:02:54
0001 #include "CondTools/Ecal/interface/EcalADCToGeVHandler.h"
0002 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
0003 #include "CondFormats/EcalObjects/interface/EcalIntercalibConstants.h"
0004 #include "CondTools/Ecal/interface/EcalADCToGeVXMLTranslator.h"
0005
0006 #include <iostream>
0007
0008 popcon::EcalADCToGeVHandler::EcalADCToGeVHandler(const edm::ParameterSet& ps)
0009 : m_name(ps.getUntrackedParameter<std::string>("name", "EcalADCToGeVHandler")) {
0010 std::cout << "EcalADCToGeV Source handler constructor\n" << std::endl;
0011 m_firstRun = static_cast<unsigned int>(atoi(ps.getParameter<std::string>("firstRun").c_str()));
0012 m_lastRun = static_cast<unsigned int>(atoi(ps.getParameter<std::string>("lastRun").c_str()));
0013 m_sid = ps.getParameter<std::string>("OnlineDBSID");
0014 m_user = ps.getParameter<std::string>("OnlineDBUser");
0015 m_pass = ps.getParameter<std::string>("OnlineDBPassword");
0016 m_locationsource = ps.getParameter<std::string>("LocationSource");
0017 m_location = ps.getParameter<std::string>("Location");
0018 m_gentag = ps.getParameter<std::string>("GenTag");
0019 m_file_lowfield = ps.getParameter<std::string>("FileLowField");
0020 m_file_highfield = ps.getParameter<std::string>("FileHighField");
0021
0022 std::cout << m_sid << "/" << m_user << "/" << m_location << "/" << m_gentag << std::endl;
0023 }
0024
0025 popcon::EcalADCToGeVHandler::~EcalADCToGeVHandler() {}
0026
0027 void popcon::EcalADCToGeVHandler::getNewObjects() {
0028 std::cout << "------- Ecal - > getNewObjects\n";
0029
0030 std::ostringstream ss;
0031 ss << "ECAL ";
0032
0033 unsigned int max_since = 0;
0034 max_since = static_cast<unsigned int>(tagInfo().lastInterval.since);
0035 std::cout << "max_since : " << max_since << std::endl;
0036 bool magnet_high = false;
0037 bool something_to_transfer = false;
0038 if (tagInfo().size) {
0039 Ref ped_db = lastPayload();
0040
0041
0042
0043 std::cout << "retrieved last payload " << std::endl;
0044
0045 EcalADCToGeVConstant the_cal;
0046
0047
0048 float adc_ee = ped_db->getEEValue();
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 float the_value_low_ee = 0.0590975;
0061 if (adc_ee > the_value_low_ee)
0062 magnet_high = true;
0063 }
0064 else
0065 something_to_transfer = true;
0066
0067
0068 std::cout << "Connecting to ONLINE DB ... " << std::endl;
0069 econn = new EcalCondDBInterface(m_sid, m_user, m_pass);
0070 std::cout << "Connection done" << std::endl;
0071
0072 std::cout << "Retrieving last run from ONLINE DB ... " << std::endl;
0073 std::map<EcalLogicID, RunDat> rundat;
0074 RunIOV rp;
0075 run_t runmax = 10000000;
0076 std::string location_p5 = "P5_Co";
0077 econn->fetchValidDataSet(&rundat, &rp, location_p5, runmax);
0078
0079 unsigned long long irun = (unsigned long long)rp.getRunNumber();
0080
0081 std::cout << "retrieved run number " << irun << std::endl;
0082
0083 if (irun > max_since) {
0084
0085
0086
0087 std::map<EcalLogicID, RunDCSMagnetDat> dataset;
0088
0089 econn->fetchDataSet(&dataset, &rp);
0090
0091 if (dataset.empty()) {
0092 throw(std::runtime_error("Zero rows read back"));
0093 } else {
0094 std::cout << "retrieved magnet current" << std::endl;
0095 }
0096
0097 float mag_cur = 0;
0098
0099 std::map<EcalLogicID, RunDCSMagnetDat>::iterator it;
0100 for (it = dataset.begin(); it != dataset.end(); ++it) {
0101 RunDCSMagnetDat a_mag = (*it).second;
0102 mag_cur = a_mag.getMagnetCurrent();
0103 }
0104
0105 std::string file_ = m_file_highfield;
0106 if (tagInfo().size) {
0107 if (mag_cur > 7000. && magnet_high) {
0108 std::cout << " the magnet is ON and the constants are for magnet ON " << std::endl;
0109
0110 } else if (mag_cur > 7000. && !magnet_high) {
0111 something_to_transfer = true;
0112 std::cout << " the magnet is ON and the constants are for magnet OFF " << std::endl;
0113 std::cout << " I transfer the ON constants " << std::endl;
0114 file_ = m_file_highfield;
0115
0116 } else if (mag_cur < 6000. && magnet_high) {
0117 something_to_transfer = true;
0118 std::cout << " the magnet is OFF and the constants are for magnet ON " << std::endl;
0119 std::cout << " I transfer the OFF constants " << std::endl;
0120 file_ = m_file_lowfield;
0121
0122 } else if (mag_cur < 6000. && !magnet_high) {
0123 std::cout << " the magnet is OFF and the constants are for magnet OFF " << std::endl;
0124 file_ = m_file_lowfield;
0125
0126 } else {
0127 std::cout << " the magnet is in a strange situation I do nothing ... just be patient " << std::endl;
0128 }
0129 } else {
0130 if (mag_cur > 7000.)
0131 std::cout << " first payload, the magnet is ON " << std::endl;
0132 else if (mag_cur < 6000.) {
0133 std::cout << " first payload, the magnet is OFF " << std::endl;
0134 file_ = m_file_lowfield;
0135 } else
0136 std::cout << " the magnet is in a strange situation I do nothing ... just be patient " << std::endl;
0137 }
0138
0139 if (something_to_transfer) {
0140 std::cout << "Generating popcon record for run " << irun << " going to open file " << file_ << "\n"
0141 << std::flush;
0142 EcalADCToGeVConstant* payload = new EcalADCToGeVConstant;
0143
0144
0145
0146 std::ifstream fxml;
0147 fxml.open(file_.c_str());
0148 std::string line, bid, bid2;
0149 float val;
0150 for (int il = 0; il < 4; il++) {
0151 std::getline(fxml, line);
0152
0153 }
0154 for (int iPart = 0; iPart < 2; iPart++) {
0155 fxml >> bid;
0156 std::size_t begin = bid.find_first_of('>');
0157 std::size_t end = bid.find_last_of('<');
0158 begin++;
0159 std::string str2 = bid.substr(begin, end - begin);
0160 std::size_t endmantissa = str2.find('e');
0161 std::string mantissa = str2.substr(0, endmantissa);
0162 std::size_t string_size = str2.size();
0163 std::string exponent = str2.substr(endmantissa + 1, string_size);
0164 std::istringstream is(mantissa);
0165 is >> val;
0166 float mult;
0167 std::istringstream ise(exponent);
0168 ise >> mult;
0169 val = val * pow(10, mult);
0170 std::cout << " Partition " << iPart << " ADCToGeV " << val << "\n";
0171 if (iPart < 1)
0172 payload->setEBValue(val);
0173 else
0174 payload->setEEValue(val);
0175 }
0176
0177
0178 Time_t snc = (Time_t)irun;
0179 popcon::PopConSourceHandler<EcalADCToGeVConstant>::m_to_transfer.push_back(std::make_pair(payload, snc));
0180 ss << "Run=" << irun << "_Magnet_changed_" << std::endl;
0181 m_userTextLog = ss.str() + ";";
0182 } else {
0183 std::cout << "Run " << irun << " nothing sent to the DB" << std::endl;
0184 ss << "Run=" << irun << "_Magnet_NOT_changed_" << std::endl;
0185 m_userTextLog = ss.str() + ";";
0186 }
0187
0188 delete econn;
0189 }
0190 else {
0191 std::cout << "Run " << irun << " nothing sent to the DB" << std::endl;
0192 ss << "Run=" << irun << "_no_new_runs_" << std::endl;
0193 m_userTextLog = ss.str() + ";";
0194 }
0195 std::cout << "Ecal - > end of getNewObjects -----------\n";
0196 }