| 1 | #include "PixelMap.h"
|
|---|
| 2 |
|
|---|
| 3 | #include <boost/regex.hpp>
|
|---|
| 4 |
|
|---|
| 5 | //#ifdef HAS_SQL
|
|---|
| 6 | #include <mysql++/mysql++.h>
|
|---|
| 7 | //#endif
|
|---|
| 8 |
|
|---|
| 9 | using namespace std;
|
|---|
| 10 |
|
|---|
| 11 | const PixelMapEntry PixelMap::empty = { -1, 0, 0, 0, 0 };
|
|---|
| 12 | const BiasMapEntry BiasMap::empty = { -1, 0, 0, 0 };
|
|---|
| 13 |
|
|---|
| 14 | void BiasMap::Read(const std::string &fname)
|
|---|
| 15 | {
|
|---|
| 16 | std::ifstream fin(fname);
|
|---|
| 17 |
|
|---|
| 18 | int l = 0;
|
|---|
| 19 |
|
|---|
| 20 | std::string buf;
|
|---|
| 21 | while (getline(fin, buf, '\n'))
|
|---|
| 22 | {
|
|---|
| 23 | if (l>416)
|
|---|
| 24 | break;
|
|---|
| 25 |
|
|---|
| 26 | buf = Tools::Trim(buf);
|
|---|
| 27 | if (buf[0]=='#')
|
|---|
| 28 | continue;
|
|---|
| 29 |
|
|---|
| 30 | std::stringstream str(buf);
|
|---|
| 31 |
|
|---|
| 32 | BiasMapEntry entry;
|
|---|
| 33 |
|
|---|
| 34 | str >> entry.hv_board;
|
|---|
| 35 | str >> entry.hv_channel;
|
|---|
| 36 | str >> entry.Vnom;
|
|---|
| 37 | str >> entry.Voff;
|
|---|
| 38 |
|
|---|
| 39 | if (entry.hv_channel+32*entry.hv_board>=416)
|
|---|
| 40 | throw runtime_error("Invalid board/channel read from "+fname+".");
|
|---|
| 41 |
|
|---|
| 42 | (*this)[entry.hv()] = entry;
|
|---|
| 43 |
|
|---|
| 44 | l++;
|
|---|
| 45 | }
|
|---|
| 46 |
|
|---|
| 47 | if (l!=416)
|
|---|
| 48 | throw runtime_error("Number of lines read from "+fname+" does not match 416.");
|
|---|
| 49 |
|
|---|
| 50 | if (size()!=416)
|
|---|
| 51 | throw runtime_error("Number of entries read from "+fname+" does not match 416.");
|
|---|
| 52 | }
|
|---|
| 53 |
|
|---|
| 54 | void BiasMap::Retrieve(const std::string &database)
|
|---|
| 55 | {
|
|---|
| 56 | static const boost::regex expr("(([[:word:].-]+)(:(.+))?@)?([[:word:].-]+)(:([[:digit:]]+))?(/([[:word:].-]+))");
|
|---|
| 57 | // 2: user
|
|---|
| 58 | // 4: pass
|
|---|
| 59 | // 5: server
|
|---|
| 60 | // 7: port
|
|---|
| 61 | // 9: db
|
|---|
| 62 |
|
|---|
| 63 | boost::smatch what;
|
|---|
| 64 | if (!boost::regex_match(database, what, expr, boost::match_extra))
|
|---|
| 65 | throw runtime_error("Couldn't parse '"+database+"'.");
|
|---|
| 66 |
|
|---|
| 67 | if (what.size()!=10)
|
|---|
| 68 | throw runtime_error("Error parsing '"+database+"'.");
|
|---|
| 69 |
|
|---|
| 70 | const string user = what[2];
|
|---|
| 71 | const string passwd = what[4];
|
|---|
| 72 | const string server = what[5];
|
|---|
| 73 | const string db = what[9];
|
|---|
| 74 | const int port = atoi(string(what[7]).c_str());
|
|---|
| 75 |
|
|---|
| 76 | mysqlpp::Connection conn(db.c_str(), server.c_str(), user.c_str(), passwd.c_str(), port);
|
|---|
| 77 |
|
|---|
| 78 | const mysqlpp::StoreQueryResult res =
|
|---|
| 79 | conn.query("SELECT fPatchNumber, AVG(fVoltageNom), fOffset "
|
|---|
| 80 | " FROM GapdVoltages "
|
|---|
| 81 | " LEFT JOIN BiasOffsets USING(fPatchNumber) "
|
|---|
| 82 | " GROUP BY fPatchNumber").store();
|
|---|
| 83 |
|
|---|
| 84 | clear();
|
|---|
| 85 |
|
|---|
| 86 | int l = 0;
|
|---|
| 87 | for (vector<mysqlpp::Row>::const_iterator v=res.begin(); v<res.end(); v++)
|
|---|
| 88 | {
|
|---|
| 89 | const int id = (*v)[0];
|
|---|
| 90 |
|
|---|
| 91 | if (id<0 || id>416)
|
|---|
| 92 | {
|
|---|
| 93 | ostringstream str;
|
|---|
| 94 | str << "Invalid channel id " << id << " received from database.";
|
|---|
| 95 | throw runtime_error(str.str());
|
|---|
| 96 | }
|
|---|
| 97 |
|
|---|
| 98 | BiasMapEntry entry;
|
|---|
| 99 |
|
|---|
| 100 | entry.hv_board = id/32;
|
|---|
| 101 | entry.hv_channel = id%32;
|
|---|
| 102 | entry.Vnom = (*v)[1];
|
|---|
| 103 | entry.Voff = (*v)[2];
|
|---|
| 104 |
|
|---|
| 105 | (*this)[id] = entry;
|
|---|
| 106 |
|
|---|
| 107 | l++;
|
|---|
| 108 | }
|
|---|
| 109 |
|
|---|
| 110 | if (l!=416)
|
|---|
| 111 | throw runtime_error("Number of rows retrieved from the database does not match 416.");
|
|---|
| 112 |
|
|---|
| 113 | if (size()!=416)
|
|---|
| 114 | throw runtime_error("Number of entries retrived from database does not match 416.");
|
|---|
| 115 | }
|
|---|