CMS 3D CMS Logo

NormDML.cc
Go to the documentation of this file.
2 #include "RelationalAccess/ISchema.h"
3 #include "RelationalAccess/IQuery.h"
4 #include "RelationalAccess/ICursor.h"
5 #include "CoralBase/AttributeList.h"
6 #include "CoralBase/Attribute.h"
7 #include "CoralBase/AttributeSpecification.h"
9 #include <algorithm>
10 #include <map>
11 #include <iostream>
12 #include <sstream>
13 #include <boost/algorithm/string.hpp>
14 #include <boost/tokenizer.hpp>
16 unsigned long long lumi::NormDML::normIdByName(const coral::ISchema& schema, const std::string& normtagname) {
18  unsigned long long result = 0;
19  std::vector<unsigned long long> luminormids;
20  coral::IQuery* qHandle = schema.newQuery();
21  qHandle->addToTableList(lumi::LumiNames::luminormv2TableName());
22  qHandle->addToOutputList("DATA_ID");
23  if (!normtagname.empty()) {
24  std::string qConditionStr("ENTRY_NAME=:normtagname");
25  coral::AttributeList qCondition;
26  qCondition.extend("normtagname", typeid(std::string));
27  qCondition["normtagname"].data<std::string>() = normtagname;
28  qHandle->setCondition(qConditionStr, qCondition);
29  }
30  coral::AttributeList qResult;
31  qResult.extend("DATA_ID", typeid(unsigned long long));
32  qHandle->defineOutput(qResult);
33  coral::ICursor& cursor = qHandle->execute();
34  while (cursor.next()) {
35  const coral::AttributeList& row = cursor.currentRow();
36  luminormids.push_back(row["DATA_ID"].data<unsigned long long>());
37  }
38  delete qHandle;
39  std::vector<unsigned long long>::iterator resultIt;
40  for (resultIt = luminormids.begin(); resultIt != luminormids.end(); ++resultIt) {
41  if ((*resultIt) > result) {
42  result = *resultIt;
43  }
44  }
45  return result;
46 }
47 void lumi::NormDML::normIdByType(const coral::ISchema& schema,
48  std::map<std::string, unsigned long long>& resultMap,
49  lumi::NormDML::LumiType lumitype,
50  bool defaultonly) {
52  coral::IQuery* qHandle = schema.newQuery();
53  qHandle->addToTableList(lumi::LumiNames::luminormv2TableName());
54  qHandle->addToOutputList("DATA_ID");
55  qHandle->addToOutputList("ENTRY_NAME");
56  coral::AttributeList qCondition;
57  std::string qConditionStr("LUMITYPE=:lumitype");
58  qCondition.extend("lumitype", typeid(std::string));
59  std::string lumitypeStr("HF");
60  if (lumitype != lumi::NormDML::HF) {
61  lumitypeStr = "PIXEL";
62  }
63  qCondition["lumitype"].data<std::string>() = lumitypeStr;
64  if (defaultonly) {
65  qConditionStr += " AND ISTYPEDEFAULT=:istypedefault";
66  qCondition.extend("istypedefault", typeid(unsigned int));
67  qCondition["istypedefault"].data<unsigned int>() = 1;
68  }
69  qHandle->setCondition(qConditionStr, qCondition);
70  coral::AttributeList qResult;
71  qResult.extend("DATA_ID", typeid(unsigned long long));
72  qResult.extend("ENTRY_NAME", typeid(std::string));
73  qHandle->defineOutput(qResult);
74  try {
75  coral::ICursor& cursor = qHandle->execute();
76  while (cursor.next()) {
77  const coral::AttributeList& row = cursor.currentRow();
78  const std::string normname = row["ENTRY_NAME"].data<std::string>();
79  unsigned long long normid = row["DATA_ID"].data<unsigned long long>();
80  if (resultMap.find(normname) == resultMap.end()) {
81  resultMap.insert(std::make_pair(normname, normid));
82  } else {
83  if (resultMap[normname] < normid) {
84  resultMap.insert(std::make_pair(normname, normid));
85  }
86  }
87  }
88  } catch (const coral::Exception& er) {
89  std::cout << "database error in NormDML::normIdByType " << er.what() << std::endl;
90  delete qHandle;
91  throw er;
92  } catch (...) {
93  throw;
94  }
95  delete qHandle;
96 }
97 void lumi::NormDML::normById(const coral::ISchema& schema,
98  unsigned long long normid,
99  std::map<unsigned int, lumi::NormDML::normData>& result) {
101  coral::IQuery* qHandle = schema.newQuery();
102  qHandle->addToTableList(lumi::LumiNames::luminormv2dataTableName());
103  std::string qConditionStr("DATA_ID=:normid ");
104  coral::AttributeList qCondition;
105  qCondition.extend("normid", typeid(unsigned long long));
106  qCondition["normid"].data<unsigned long long>() = normid;
107  qHandle->setCondition(qConditionStr, qCondition);
108  coral::AttributeList qResult;
109  coral::ICursor& cursor = qHandle->execute();
110  while (cursor.next()) {
111  const coral::AttributeList& row = cursor.currentRow();
112  unsigned int since = row["SINCE"].data<unsigned int>();
113  if (result.find(since) == result.end()) {
114  lumi::NormDML::normData thisnorm;
115  result.insert(std::make_pair(since, thisnorm));
116  }
117  const std::string correctorStr = row["CORRECTOR"].data<std::string>();
118  if (!row["AMODETAG"].isNull()) {
119  result[since].amodetag = row["AMODETAG"].data<std::string>();
120  }
121  if (!row["NOMINALEGEV"].isNull()) {
122  result[since].beamegev = row["NOMINALEGEV"].data<unsigned int>();
123  }
124 
125  std::vector<std::string> correctorParams;
126  parseLumiCorrector(correctorStr, correctorParams);
127  result[since].corrfunc = *(correctorParams.begin());
128  for (std::vector<std::string>::iterator corrIt = correctorParams.begin() + 1; corrIt != correctorParams.end();
129  corrIt++) {
130  std::string paramName = boost::to_upper_copy(*corrIt);
131  if (paramName == std::string("AFTERGLOW")) {
132  const std::string afterglowStr = row["AFTERGLOW"].data<std::string>();
133  parseAfterglows(afterglowStr, result[since].afterglows);
134  } else {
135  float param = row[paramName].data<float>();
136  result[since].coefficientmap.insert(std::make_pair(paramName, param));
137  }
138  }
139  }
140  delete qHandle;
141 }
142 void lumi::NormDML::parseLumiCorrector(const std::string& correctorStr, std::vector<std::string>& correctorParams) {
143  std::string cleancorrectorStr(correctorStr);
144  boost::trim(cleancorrectorStr);
145  boost::split(correctorParams, cleancorrectorStr, boost::is_any_of(":,"));
146 }
147 void lumi::NormDML::parseAfterglows(const std::string& afterglowStr, std::map<unsigned int, float>& afterglowmap) {
148  typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
149  boost::char_separator<char> sep("[(,)] ");
150  tokenizer tokens(afterglowStr, sep);
151  unsigned int counter = 1;
152  std::string thresholdStr;
153  unsigned int threshold;
154  for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter) {
155  if (counter % 2 == 0) {
156  std::string valStr = *(tok_iter);
157  float val = 0.;
158  std::stringstream strStream(valStr);
159  strStream >> val;
160  afterglowmap.insert(std::make_pair(threshold, val));
161  } else {
162  thresholdStr = *(tok_iter);
163  std::stringstream strStream(thresholdStr);
164  strStream >> threshold;
165  }
166  ++counter;
167  }
168 }
static void trim(std::string &s)
void parseAfterglows(const std::string &afterglowStr, std::map< unsigned int, float > &afterglowmap)
Definition: NormDML.cc:147
static const std::string luminormv2dataTableName()
Definition: LumiNames.cc:10
void parseLumiCorrector(const std::string &correctorStr, std::vector< std::string > &correctorParams)
Definition: NormDML.cc:142
void normById(const coral::ISchema &schema, unsigned long long normid, std::map< unsigned int, normData > &result)
Definition: NormDML.cc:97
static const std::string luminormv2TableName()
Definition: LumiNames.cc:9
static std::atomic< unsigned int > counter
void normIdByType(const coral::ISchema &schema, std::map< std::string, unsigned long long > &resultMap, LumiType=HF, bool defaultonly=true)
Definition: NormDML.cc:47
unsigned long long normIdByName(const coral::ISchema &schema, const std::string &normtagname)
Definition: NormDML.cc:16