CMS 3D CMS Logo

DTUserKeyedConfigHandler.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author Paolo Ronchese INFN Padova
5  *
6  */
7 
8 //-----------------------
9 // This Class' Header --
10 //-----------------------
12 
13 //-------------------------------
14 // Collaborating Class Headers --
15 //-------------------------------
18 
23 
24 #include "RelationalAccess/ISessionProxy.h"
25 #include "RelationalAccess/ITransaction.h"
26 #include "RelationalAccess/ISchema.h"
27 #include "RelationalAccess/ITable.h"
28 #include "RelationalAccess/ICursor.h"
29 #include "RelationalAccess/IQuery.h"
30 #include "CoralBase/AttributeList.h"
31 #include "CoralBase/AttributeSpecification.h"
32 #include "CoralBase/Attribute.h"
33 
34 //---------------
35 // C++ Headers --
36 //---------------
37 
38 #include <iostream>
39 #include <memory>
40 
41 //-------------------
42 // Initializations --
43 //-------------------
44 
45 //----------------
46 // Constructors --
47 //----------------
49  : dataRun(ps.getParameter<int>("run")),
50  dataTag(ps.getParameter<std::string>("tag")),
51  onlineConnect(ps.getParameter<std::string>("onlineDB")),
52  onlineAuthentication(ps.getParameter<std::string>("onlineAuthentication")),
53  onlineAuthSys(ps.getUntrackedParameter<int>("onlineAuthSys", 1)),
54  brickContainer(ps.getParameter<std::string>("container")),
55  writeKeys(ps.getParameter<bool>("writeKeys")),
56  writeData(ps.getParameter<bool>("writeData")),
57  connection(),
58  isession() {
59  std::cout << " PopCon application for DT configuration export " << onlineAuthentication << std::endl;
60 
61  std::vector<edm::ParameterSet> dtConfigKeys(ps.getParameter<std::vector<edm::ParameterSet> >("DTConfigKeys"));
62  std::vector<edm::ParameterSet>::const_iterator iter = dtConfigKeys.begin();
63  std::vector<edm::ParameterSet>::const_iterator iend = dtConfigKeys.end();
64  while (iter != iend) {
65  const edm::ParameterSet& cp = *iter++;
66  int configType = cp.getUntrackedParameter<int>("configType");
67  int configKey = cp.getUntrackedParameter<int>("configKey");
68  std::cout << "config: " << configType << " -> " << configKey << std::endl;
69  DTConfigKey userKey;
70  userKey.confType = configType;
71  userKey.confKey = configKey;
72  userConf.push_back(userKey);
73  }
74 }
75 
76 //--------------
77 // Destructor --
78 //--------------
80 
81 //--------------
82 // Operations --
83 //--------------
85  //to access the information on the tag inside the offline database:
86  cond::TagInfo const& ti = tagInfo();
87  unsigned int last = ti.lastInterval.first;
88  std::cout << "last configuration key already copied for run: " << last << std::endl;
89 
90  std::vector<DTConfigKey> lastKey;
91  // std::cout << "check for last " << std::endl;
92  if (last == 0) {
93  DTCCBConfig* dummyConf = new DTCCBConfig(dataTag);
94  dummyConf->setStamp(0);
95  dummyConf->setFullKey(lastKey);
96  cond::Time_t snc = 1;
97  if (writeKeys && (dataRun > 1))
98  m_to_transfer.push_back(std::make_pair(dummyConf, snc));
99  } else {
100  std::cout << "get last payload" << std::endl;
101  Ref payload = lastPayload();
102  std::cout << "get last full key" << std::endl;
103  lastKey = payload->fullKey();
104  std::cout << "last key: " << std::endl;
105  std::vector<DTConfigKey>::const_iterator keyIter = lastKey.begin();
106  std::vector<DTConfigKey>::const_iterator keyIend = lastKey.end();
107  while (keyIter != keyIend) {
108  const DTConfigKey& keyList = *keyIter++;
109  std::cout << keyList.confType << " : " << keyList.confKey << std::endl;
110  }
111  }
112 
113  std::cout << "configure DbConnection" << std::endl;
114  // conn->configure( cond::CmsDefaults );
118  std::cout << "create/open DbSession" << std::endl;
120  std::cout << "start transaction" << std::endl;
121  isession->transaction().start(true);
122 
123  // get ccb identifiers map
124  std::cout << "retrieve CCB map" << std::endl;
125  std::map<int, DTCCBId> ccbMap;
126  coral::ITable& ccbMapTable = isession->nominalSchema().tableHandle("CCBMAP");
127  std::unique_ptr<coral::IQuery> ccbMapQuery(ccbMapTable.newQuery());
128  ccbMapQuery->addToOutputList("CCBID");
129  ccbMapQuery->addToOutputList("WHEEL");
130  ccbMapQuery->addToOutputList("SECTOR");
131  ccbMapQuery->addToOutputList("STATION");
132  coral::ICursor& ccbMapCursor = ccbMapQuery->execute();
133  while (ccbMapCursor.next()) {
134  const coral::AttributeList& row = ccbMapCursor.currentRow();
135  int ccb = row["CCBID"].data<int>();
136  int wheel = row["WHEEL"].data<int>();
137  int sector = row["SECTOR"].data<int>();
138  int station = row["STATION"].data<int>();
139  DTCCBId ccbId;
140  ccbId.wheelId = wheel;
141  ccbId.stationId = station;
142  ccbId.sectorId = sector;
143  ccbMap.insert(std::pair<int, DTCCBId>(ccb, ccbId));
144  }
145 
146  // get brick types
147  std::cout << "retrieve brick types" << std::endl;
148  std::map<int, int> bktMap;
149  coral::AttributeList emptyBindVariableList;
150  std::unique_ptr<coral::IQuery> brickTypeQuery(isession->nominalSchema().newQuery());
151  brickTypeQuery->addToTableList("CFGBRICKS");
152  brickTypeQuery->addToTableList("BRKT2CSETT");
153  std::string bTypeCondition = "CFGBRICKS.BRKTYPE=BRKT2CSETT.BRKTYPE";
154  brickTypeQuery->addToOutputList("CFGBRICKS.BRKID");
155  brickTypeQuery->addToOutputList("BRKT2CSETT.CSETTYPE");
156  brickTypeQuery->setCondition(bTypeCondition, emptyBindVariableList);
157  coral::ICursor& brickTypeCursor = brickTypeQuery->execute();
158  while (brickTypeCursor.next()) {
159  const coral::AttributeList& row = brickTypeCursor.currentRow();
160  int id = row["CFGBRICKS.BRKID"].data<int>();
161  int bt = row["BRKT2CSETT.CSETTYPE"].data<short>();
162  // std::cout << "brick " << id << " type " << bt << std::endl;
163  // @@FIX - TEMPORARY PATCH
164  // if ( bt > 3 ) bt = 3;
165  bktMap.insert(std::pair<int, int>(id, bt));
166  }
167 
168  // get ccb config keys
169  std::cout << "retrieve CCB configuration keys" << std::endl;
170  std::map<int, std::map<int, int>*> keyMap;
171  std::map<int, int> cckMap;
172  coral::ITable& ccbRelTable = isession->nominalSchema().tableHandle("CCBRELATIONS");
173  std::unique_ptr<coral::IQuery> ccbRelQuery(ccbRelTable.newQuery());
174  ccbRelQuery->addToOutputList("CONFKEY");
175  ccbRelQuery->addToOutputList("CCBID");
176  ccbRelQuery->addToOutputList("CONFCCBKEY");
177  coral::ICursor& ccbRelCursor = ccbRelQuery->execute();
178  // loop over all full configurations
179  while (ccbRelCursor.next()) {
180  const coral::AttributeList& row = ccbRelCursor.currentRow();
181  int cfg = row["CONFKEY"].data<int>();
182  int ccb = row["CCBID"].data<int>();
183  int key = row["CONFCCBKEY"].data<int>();
184  // check for used configurations
185  // if ( cfgMap.find( cfg ) == cfgMap.end() ) continue;
186  if (userDiscardedKey(cfg))
187  continue;
188  std::map<int, std::map<int, int>*>::const_iterator keyIter = keyMap.find(cfg);
189  std::map<int, std::map<int, int>*>::const_iterator keyIend = keyMap.end();
190  std::map<int, int>* mapPtr = nullptr;
191  // check for new full configuration
192  if (keyIter != keyIend)
193  mapPtr = keyIter->second;
194  else
195  keyMap.insert(std::pair<int, std::map<int, int>*>(cfg, mapPtr = new std::map<int, int>));
196  // store ccb config key
197  std::map<int, int>& mapRef(*mapPtr);
198  mapRef.insert(std::pair<int, int>(ccb, key));
199  // check for new ccb config key
200  if (cckMap.find(key) == cckMap.end())
201  cckMap.insert(std::pair<int, int>(key, ccb));
202  }
203 
204  // get brick keys
205  std::cout << "retrieve CCB configuration bricks" << std::endl;
206  std::map<int, std::vector<int>*> brkMap;
207  coral::ITable& confBrickTable = isession->nominalSchema().tableHandle("CFG2BRKREL");
208  std::unique_ptr<coral::IQuery> confBrickQuery(confBrickTable.newQuery());
209  confBrickQuery->addToOutputList("CONFID");
210  confBrickQuery->addToOutputList("BRKID");
211  coral::ICursor& confBrickCursor = confBrickQuery->execute();
212  // loop over all brick keys
213  while (confBrickCursor.next()) {
214  const coral::AttributeList& row = confBrickCursor.currentRow();
215  int key = row["CONFID"].data<int>();
216  int brk = row["BRKID"].data<int>();
217  // check for used ccb config key
218  if (cckMap.find(key) == cckMap.end())
219  continue;
220  std::map<int, std::vector<int>*>::const_iterator brkIter = brkMap.find(key);
221  std::map<int, std::vector<int>*>::const_iterator brkIend = brkMap.end();
222  // check for new ccb config key
223  std::vector<int>* brkPtr = nullptr;
224  if (brkIter != brkIend)
225  brkPtr = brkIter->second;
226  else
227  brkMap.insert(std::pair<int, std::vector<int>*>(key, brkPtr = new std::vector<int>));
228  // store brick key
229  brkPtr->push_back(brk);
230  }
231 
232  // set run and full configuration in payload
233  DTCCBConfig* fullConf = new DTCCBConfig(dataTag);
234  fullConf->setStamp(1);
235  fullConf->setFullKey(userConf);
236  std::map<int, bool> userBricks;
237  std::map<int, bool>::const_iterator uBrkIter = userBricks.begin();
238  std::map<int, bool>::const_iterator uBrkIend = userBricks.end();
239  std::vector<DTConfigKey>::const_iterator cfgIter = userConf.begin();
240  std::vector<DTConfigKey>::const_iterator cfgIend = userConf.end();
241  while (cfgIter != cfgIend) {
242  const DTConfigKey& cfgEntry = *cfgIter++;
243  int cft = cfgEntry.confType;
244  int cfg = cfgEntry.confKey;
245  // retrieve ccb config map
246  std::map<int, std::map<int, int>*>::const_iterator keyIter = keyMap.find(cfg);
247  std::map<int, std::map<int, int>*>::const_iterator keyIend = keyMap.end();
248  std::map<int, int>* mapPtr = nullptr;
249  if (keyIter != keyIend)
250  mapPtr = keyIter->second;
251  if (mapPtr == nullptr)
252  continue;
253  std::map<int, int>::const_iterator ccbIter = mapPtr->begin();
254  std::map<int, int>::const_iterator ccbIend = mapPtr->end();
255  while (ccbIter != ccbIend) {
256  const std::pair<int, int>& ccbEntry = *ccbIter++;
257  // get ccb config key
258  int ccb = ccbEntry.first;
259  int key = ccbEntry.second;
260  // retrieve chamber id
261  std::map<int, DTCCBId>::const_iterator ccbIter = ccbMap.find(ccb);
262  std::map<int, DTCCBId>::const_iterator ccbIend = ccbMap.end();
263  if (ccbIter == ccbIend)
264  continue;
265  const DTCCBId& chaId = ccbIter->second;
266  // retrieve brick id list
267  std::map<int, std::vector<int>*>::const_iterator brkIter = brkMap.find(key);
268  std::map<int, std::vector<int>*>::const_iterator brkIend = brkMap.end();
269  if (brkIter == brkIend)
270  continue;
271  std::vector<int>* brkPtr = brkIter->second;
272  if (brkPtr == nullptr)
273  continue;
274  // brick id lists in payload
275  std::vector<int> bkList;
276  bkList.reserve(20);
277  std::map<int, int>::const_iterator bktIter = bktMap.begin();
278  std::map<int, int>::const_iterator bktIend = bktMap.end();
279  std::vector<int>::const_iterator bkiIter = brkPtr->begin();
280  std::vector<int>::const_iterator bkiIend = brkPtr->end();
281  while (bkiIter != bkiIend) {
282  int brickId = *bkiIter++;
283  bktIter = bktMap.find(brickId);
284  if (bktIter == bktIend)
285  continue;
286  if (bktIter->second == cft) {
287  bkList.push_back(brickId);
288  uBrkIter = userBricks.find(brickId);
289  if (uBrkIter == uBrkIend)
290  userBricks.insert(std::pair<int, bool>(brickId, true));
291  }
292  }
293  fullConf->appendConfigKey(chaId.wheelId, chaId.stationId, chaId.sectorId, bkList);
294  }
295  }
296  cond::Time_t snc = dataRun;
297  if (writeKeys)
298  m_to_transfer.push_back(std::make_pair(fullConf, snc));
299  std::cout << "writing payload : " << sizeof(*fullConf) << " ( " << (fullConf->end() - fullConf->begin()) << " ) "
300  << std::endl;
301  if (writeData)
302  chkConfigList(userBricks);
303 
304  isession->transaction().commit();
305 
306  return;
307 }
308 
309 void DTUserKeyedConfigHandler::chkConfigList(const std::map<int, bool>& userBricks) {
310  std::cout << "open POOL out db " << std::endl;
312 
313  std::map<int, bool>::const_iterator uBrkIter = userBricks.begin();
314  std::map<int, bool>::const_iterator uBrkIend = userBricks.end();
315 
316  coral::ITable& brickConfigTable = isession->nominalSchema().tableHandle("CFGBRICKS");
317  std::unique_ptr<coral::IQuery> brickConfigQuery(brickConfigTable.newQuery());
318  brickConfigQuery->addToOutputList("BRKID");
319  brickConfigQuery->addToOutputList("BRKNAME");
320  coral::ICursor& brickConfigCursor = brickConfigQuery->execute();
321  DTKeyedConfig* brickData = nullptr;
322  std::vector<int> missingList;
323  std::vector<unsigned long long> checkedKeys;
324  while (brickConfigCursor.next()) {
325  const coral::AttributeList& row = brickConfigCursor.currentRow();
326  int brickConfigId = row["BRKID"].data<int>();
327  uBrkIter = userBricks.find(brickConfigId);
328  if (uBrkIter == uBrkIend)
329  continue;
330  if (!(uBrkIter->second))
331  continue;
332  std::string brickConfigName = row["BRKNAME"].data<std::string>();
333  std::cout << "brick " << brickConfigId << " : " << brickConfigName << std::endl;
334  bool brickFound = false;
335  try {
336  std::cout << "load brick " << brickConfigId << std::endl;
337  std::cout << "key list " << keyList << std::endl;
338  std::cout << "get brick..." << std::endl;
339  std::shared_ptr<DTKeyedConfig> brickCheck = keyList->getUsingKey<DTKeyedConfig>(brickConfigId);
340  if (brickCheck.get()) {
341  brickFound = (brickCheck->getId() == brickConfigId);
342  }
343  } catch (std::exception const&) {
344  }
345  if (!brickFound) {
346  std::cout << "brick " << brickConfigId << " missing, copy request" << std::endl;
347  missingList.push_back(brickConfigId);
348  }
349  }
350 
351  std::vector<int>::const_iterator brickIter = missingList.begin();
352  std::vector<int>::const_iterator brickIend = missingList.end();
353  while (brickIter != brickIend) {
354  int brickConfigId = *brickIter++;
355  coral::AttributeList bindVariableList;
356  bindVariableList.extend("brickId", typeid(int));
357  bindVariableList["brickId"].data<int>() = brickConfigId;
358  std::unique_ptr<coral::IQuery> brickDataQuery(isession->nominalSchema().newQuery());
359  brickDataQuery->addToTableList("CFGRELATIONS");
360  brickDataQuery->addToTableList("CONFIGCMDS");
361  std::string brickCondition = "CONFIGCMDS.CMDID=CFGRELATIONS.CMDID";
362  brickCondition += " and CFGRELATIONS.BRKID=:brickId";
363  brickDataQuery->addToOutputList("CFGRELATIONS.BRKID");
364  brickDataQuery->addToOutputList("CONFIGCMDS.CONFDATA");
365  brickDataQuery->setCondition(brickCondition, bindVariableList);
366  coral::ICursor& brickDataCursor = brickDataQuery->execute();
367  brickData = new DTKeyedConfig();
368  brickData->setId(brickConfigId);
369  while (brickDataCursor.next()) {
370  const coral::AttributeList& row = brickDataCursor.currentRow();
371  brickData->add(row["CONFIGCMDS.CONFDATA"].data<std::string>());
372  }
373  cond::KeyedElement k(brickData, brickConfigId);
374  std::cout << "now writing brick: " << brickConfigId << std::endl;
375  outdb->writeOne(k.m_obj, k.m_key, brickContainer);
376  }
377 
378  return;
379 }
380 
382 
383 bool DTUserKeyedConfigHandler::sameConfigList(const std::vector<DTConfigKey>& cfgl,
384  const std::vector<DTConfigKey>& cfgr) {
385  if (cfgl.size() != cfgr.size())
386  return false;
387  std::map<int, int> lmap;
388  std::vector<DTConfigKey>::const_iterator lIter = cfgl.begin();
389  std::vector<DTConfigKey>::const_iterator lIend = cfgl.end();
390  while (lIter != lIend) {
391  const DTConfigKey& entry = *lIter++;
392  lmap.insert(std::pair<int, int>(entry.confType, entry.confKey));
393  }
394  std::map<int, int> rmap;
395  std::vector<DTConfigKey>::const_iterator rIter = cfgr.begin();
396  std::vector<DTConfigKey>::const_iterator rIend = cfgr.end();
397  while (rIter != rIend) {
398  const DTConfigKey& entry = *rIter++;
399  rmap.insert(std::pair<int, int>(entry.confType, entry.confKey));
400  }
401  std::map<int, int>::const_iterator lmIter = lmap.begin();
402  std::map<int, int>::const_iterator lmIend = lmap.end();
403  std::map<int, int>::const_iterator rmIter = rmap.begin();
404  std::map<int, int>::const_iterator rmIend = rmap.end();
405  while ((lmIter != lmIend) && (rmIter != rmIend)) {
406  const std::pair<int, int>& lEntry = *lmIter++;
407  const std::pair<int, int>& rEntry = *rmIter++;
408  if (lEntry.first != rEntry.first)
409  return false;
410  if (lEntry.second != rEntry.second)
411  return false;
412  }
413  return true;
414 }
415 
417  std::vector<DTConfigKey>::const_iterator iter = userConf.begin();
418  std::vector<DTConfigKey>::const_iterator iend = userConf.end();
419  while (iter != iend) {
420  const DTConfigKey& entry = *iter++;
421  if (entry.confKey == key)
422  return false;
423  }
424  return true;
425 }
426 
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
int wheelId
Definition: DTCCBConfig.h:42
void setStamp(int s)
Definition: DTCCBConfig.cc:119
void add(const std::string &data)
const cond::persistency::KeyList * keyList
std::vector< DTConfigKey > userConf
static bool sameConfigList(const std::vector< DTConfigKey > &cfgl, const std::vector< DTConfigKey > &cfgr)
const_iterator end() const
Definition: DTCCBConfig.cc:205
int sectorId
Definition: DTCCBConfig.h:44
cond::ValidityInterval lastInterval
Definition: Types.h:74
void setList(const cond::persistency::KeyList *list)
BaseKeyed * m_obj
Definition: KeyedElement.h:27
unsigned long long Time_t
Definition: Time.h:14
int stationId
Definition: DTCCBConfig.h:43
void setAuthenticationSystem(int authSysCode)
void writeOne(T *payload, Time_t time, const std::string &recordName, bool withlogging=false)
std::string id() const override
DTUserKeyedConfigHandler(const edm::ParameterSet &ps)
void setId(int id)
void chkConfigList(const std::map< int, bool > &userBricks)
std::shared_ptr< coral::ISessionProxy > isession
std::shared_ptr< T > getUsingKey(unsigned long long key) const
Definition: KeyList.h:57
void setFullKey(const std::vector< DTConfigKey > &)
Definition: DTCCBConfig.cc:117
cond::persistency::ConnectionPool connection
const_iterator begin() const
Definition: DTCCBConfig.cc:203
void setAuthenticationPath(const std::string &p)
std::shared_ptr< coral::ISessionProxy > createCoralSession(const std::string &connectionString, bool writeCapable=false)
cond::Time_t m_key
Definition: KeyedElement.h:29
int appendConfigKey(int wheelId, int stationId, int sectorId, const std::vector< int > &confKey)
Definition: DTCCBConfig.cc:166
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
cond::TagInfo_t const & tagInfo() const