BOSS 7.0.9
BESIII Offline Software System
Loading...
Searching...
No Matches
MeasuredEcmsSvc.cxx
Go to the documentation of this file.
1/***********************************************************************
2 * BES III Software *
3 * Copyright(C) - BES III Collaboration *
4 * *
5 * Author: The BESIII Collaboration *
6 * Contributor: Lianjin Wu *
7 * *
8 ***********************************************************************/
9
11
12using namespace std;
13
14// Constructor
15MeasuredEcmsSvc::MeasuredEcmsSvc(const std::string &name, ISvcLocator *svcLoc) : Service(name, svcLoc)
16{
17 // declare properties
18 declareProperty("ReadOneTime", m_readOneTime=false);
19 declareProperty("RunFrom", m_runFrom=8093);
20 declareProperty("RunTo", m_runTo=9025);
21 m_runflag = -1;
22}
23
24// Destructor
26{
27 MsgStream log(msgSvc(), name());
28 log << MSG::INFO << "destructor" << endreq;
29}
30
31// Initialize
33{
34 MsgStream log(msgSvc(), name());
35 log << MSG::INFO << "initialize begin here" << endreq;
36
37 StatusCode status = Service::initialize();
38 if (! status.isSuccess()) {
39 log << MSG::ERROR << "can not initialize" << endreq;
40 return status;
41 }
42
43 IIncidentSvc *incsvc;
44 status = service("IncidentSvc", incsvc);
45 int priority = 100;
46 if (status.isSuccess()) incsvc->addListener(this, "NewRun", priority);
47
48 status = serviceLocator()->service("DatabaseSvc", m_dbSvc, true);
49 if (! status.isSuccess()) {
50 log << MSG::ERROR<< "unable to find DatabaseSvc" << endreq;
51 return status;
52 }
53
54 status = serviceLocator()->service("EventDataSvc", m_eventSvc, true);
55 if (! status.isSuccess()) {
56 log << MSG::ERROR << "unable to find EventDataSvc " << endreq;
57 return status;
58 }
59
60 if(m_readOneTime){
61 if(m_runFrom>=8093){
63 }
64 else
65 std::cout<<"MeasuredEcmsSvc, invalid RunFrom, RunFrom should be >=8093"<<std::endl;
66 }
67
68 m_sele = 0;
69 log << MSG::INFO << "initialized successfully" << endreq;
70 return StatusCode::SUCCESS;
71}
72
73// Finalize
75{
76 MsgStream log(msgSvc(), name());
77 log << MSG::INFO << "finalize begin here" << endreq;
78
79 StatusCode status = Service::finalize();
80 if (! status.isSuccess()) {
81 log << MSG::ERROR << "can not finalize" << endreq;
82 return status;
83 }
84
85 log << MSG::INFO << "finalized successfully" << endreq;
86 return StatusCode::SUCCESS;
87}
88
89// Query interface
90StatusCode MeasuredEcmsSvc::queryInterface(const InterfaceID &riid, void **ppvIF)
91{
92 if (IMeasuredEcmsSvc::interfaceID().versionMatch(riid)) *ppvIF = dynamic_cast<IMeasuredEcmsSvc*>(this);
93 else return Service::queryInterface(riid, ppvIF);
94
95 addRef();
96
97 return StatusCode::SUCCESS;
98}
99
100// Handle
101void MeasuredEcmsSvc::handle(const Incident &inc)
102{
103 MsgStream log(messageService(), name());
104 log << MSG::DEBUG << "handle: " << inc.type() << endreq;
105
106 SmartDataPtr<Event::EventHeader> eventHeader(m_eventSvc, "/Event/EventHeader");
107 int runNo = eventHeader->runNumber();
108 m_runNo = std::abs(runNo);
109
110 if (inc.type() == "NewRun") {
111 log << MSG::INFO << "RunNo is new, call the readMeasuredEcms again" << endreq;
112 if(!m_readOneTime) {
113 m_sele=0;
115 } else {
116 SmartDataPtr<Event::EventHeader> eventHeader(m_eventSvc,"/Event/EventHeader");
117 int run = eventHeader->runNumber();
118 if(run<0) run=-run;
119 if(m_mapBeamE[run]>=0) {
120 m_isRunNoValid = true;
121 m_sele=m_mapBeamE[run];
122 } else {
123 std::cout<<"MeasuredEcmsSvc, could not get Ecm infor in handle new run"<<std::endl;
124 }
125 }
126 }
127}
128
129// Return Ecms ( Ecms = beam_energy * 2 )
131{
132 switch (m_tableOption) {
133 case 1:
134 return (m_rowNo1 != 0) ? (double)m_dbRecordVector[m_sele]->GetDouble("Ecms") : 0.00;
135 break;
136
137 case 2:
138 return (m_rowNo2 != 0) ? (double)m_dbRecordVector[m_sele]->GetDouble("beam_energy") * 2.00 : 0.00;
139 break;
140
141 default:
142 if (m_rowNo1 != 0) return (double)m_dbRecordVector[m_sele]->GetDouble("Ecms");
143 else if (m_rowNo2 != 0) return (double)m_dbRecordVector[m_sele]->GetDouble("beam_energy") * 2.00;
144 else return 0.00;
145 break;
146 }
147}
148
149
150// Return Ecms depend on runNo only.
152{
153 m_runNo = std::abs(runNo);
154
156
157 switch (m_tableOption) {
158 case 1:
159 return (m_rowNo1 != 0) ? (double)m_dbRecordVector[m_sele]->GetDouble("Ecms") : 0.00;
160 break;
161
162 case 2:
163 return (m_rowNo2 != 0) ? (double)m_dbRecordVector[m_sele]->GetDouble("beam_energy") * 2.00 : 0.00;
164 break;
165
166 default:
167 if (m_rowNo1 != 0) return (double)m_dbRecordVector[m_sele]->GetDouble("Ecms");
168 else if (m_rowNo2 != 0) return (double)m_dbRecordVector[m_sele]->GetDouble("beam_energy") * 2.00;
169 else return 0.00;
170 break;
171 }
172}
173
174// read database table
176{
177 if (runNo == m_runflag) return;
178 m_runflag = runNo;
179
180 MsgStream log(msgSvc(), name());
181 log << MSG::INFO << "begin read database MeasuredEcmsSvc" << endreq;
182
183 m_dbRecordVector.clear();
184
185 m_rowNo1 = 0;
186 m_rowNo2 = 0;
187
188 m_isRunNoValid = false;
189 int runNum = std::abs(runNo);
190
191 if (runNo < 0) log << MSG::INFO << "MeasuredEcmsSvc for MC events" << endreq;
192 else log << MSG::INFO << "MeasuredEcmsSvc for DT events" << endreq;
193
194 triggerDBTable(runNum);
195
196 char stmt[400];
197
198 char stmt1[400];
199 char stmt2[400];
200
201 switch(m_tableOption) {
202 case 1:
203 snprintf(stmt, 1024, "select sample, RunFrom, RunTo, Ecms, Ecms_err, Ave_Ecms, Ave_Ecms_err from MeasuredEcms2 where RunFrom <= %d and RunTo >= %d", runNum, runNum);
204 break;
205
206 case 2:
207 snprintf(stmt, 1024, "select beam_energy, px, py, pz, beam_energy_err from RunParams where run_number = %d", runNum);
208 break;
209
210 default:
211 snprintf(stmt1, 1024, "select sample, RunFrom, RunTo, Ecms, Ecms_err, Ave_Ecms, Ave_Ecms_err from MeasuredEcms2 where RunFrom <= %d and RunTo >= %d", runNum, runNum);
212 snprintf(stmt2, 1024, "select beam_energy, px, py, pz, beam_energy_err from RunParams where run_number = %d", runNum);
213 break;
214 }
215
216 if (m_tableOption == 1 || m_tableOption == 2) {
217 int rowNo = m_dbSvc->query("offlinedb", stmt, m_dbRecordVector);
218
219 if (rowNo == 0) {
220 log << MSG::ERROR << "RowNo can not be 0, failed to read DB for " << runNo << endreq;
221 }
222 else {
223 if (m_tableOption == 1) m_rowNo1 = 1;
224 if (m_tableOption == 2) m_rowNo2 = 1;
225 log << MSG::INFO << "initialize the DatabaseRecordVector OK for " << runNo << endreq;
226 m_isRunNoValid = true;
227 }
228 }
229 else {
230 m_rowNo1 = m_dbSvc->query("offlinedb", stmt1, m_dbRecordVector);
231 if (m_rowNo1 == 0) {
232 m_dbRecordVector.clear();
233 m_rowNo2 = m_dbSvc->query("offlinedb", stmt2, m_dbRecordVector);
234 }
235
236 if (m_rowNo1 == 0 && m_rowNo2 == 0) {
237 log << MSG::ERROR << "RowNo can not be 0, failed to read DB for " << runNo << endreq;
238 }
239 else {
240 log << MSG::INFO << "initialize the DatabaseRecordVector OK for " << runNo << endreq;
241 m_isRunNoValid = true;
242 }
243 }
244}
245
246// read database table
247void MeasuredEcmsSvc::readDBTable(int runFrom, int runTo)
248{
249 MsgStream log(msgSvc(), name());
250 log << MSG::INFO << "begin read database MeasuredEcmsSvc from " << m_runFrom << " to " << m_runTo << endreq;
251 m_dbRecordVector.clear();
252
253 m_rowNo1 = 0;
254 m_rowNo2 = 0;
255 m_isRunNoValid = false;
256 char stmt[400];
257
258 if ((runFrom >= 23463 && runFrom <= 38140) || (runFrom >= 47543 && runFrom <= 51498)) {
259 if ((runTo >= 23463 && runTo <= 38140) || (runTo >= 47543 && runTo <= 51498)) {
260 log << MSG::INFO << "read table MeasuredEcms2 for " << runFrom <<":" << runTo << endreq;
261 snprintf(stmt, 1024, "select sample, RunFrom, RunTo, Ecms, Ecms_err, Ave_Ecms, Ave_Ecms_err from MeasuredEcms2 where RunFrom >= %d and RunTo <= %d", runFrom, runTo);
262 m_tableOption = 1;
263 }
264 }
265 else if ((runFrom >= 11414 && runFrom <= 23454) || (runFrom >= 43716 && runFrom <= 47066)) {
266 if ((runTo >= 11414 && runTo <= 23454) || (runTo >= 43716 && runTo <= 47066)) {
267 log << MSG::INFO << "read table RunParams for " << runFrom <<":" << runTo << endreq;
268 snprintf(stmt, 1024, "select run_number, beam_energy, px, py, pz, beam_energy_err from RunParams where run_number >= %d and run_number <= %d", runFrom, runTo);
269 m_tableOption = 2;
270 }
271 }
272 else {
273 m_tableOption = -1;
274 }
275
276 if (m_tableOption == 1 || m_tableOption == 2) {
277 int rowNo = m_dbSvc->query("offlinedb", stmt, m_dbRecordVector);
278 if (rowNo == 0) {
279 log << MSG::ERROR << "RowNo can not be 0, failed to read DB for " << runFrom <<":" << runTo << endreq;
280 cout << "RowNo can not be 0, failed to read DB for " << runFrom <<":" << runTo << endl;
281 } else {
282 if (m_tableOption == 1) m_rowNo1 = 1;
283 if (m_tableOption == 2) m_rowNo2 = 1;
284 log << MSG::INFO << "initialize the DatabaseRecordVector OK for " << runFrom <<":" << runTo << endreq;
285 cout << "MeasuredEcmsSvc: initialize the DatabaseRecordVector OK for " << runFrom <<":" << runTo << ", Nrecord = " << rowNo << "." << endl;
286 m_isRunNoValid = true;
287 }
288 if (m_rowNo2==1) {
289 for ( int i=0; i<rowNo; i++ ) {
290 int runnumber = m_dbRecordVector[i]->GetInt("run_number");
291 m_mapBeamE[runnumber] = i;
292 }
293 }
294 if (m_rowNo1==1) {
295 for ( int i=0; i<rowNo; i++ ) {
296 int run0 = m_dbRecordVector[i]->GetInt("RunFrom");
297 int run1 = m_dbRecordVector[i]->GetInt("RunTo");
298 for ( int j = run0; j<=run1; j++) {
299 m_mapBeamE[j] = i;
300 }
301 }
302 }
303 }
304}
305
306// triggerDBTable based on runNo
308{
309 MsgStream log(msgSvc(), name());
310 log << MSG::INFO << "triggerDBTable based on runNo" << endl;
311
312 int runNum = std::abs(runNo);
313
314 if ((runNum >= 23463 && runNum <= 38140) || (runNum >= 47543 && runNum <= 51498)) {
315 log << MSG::INFO << "read table MeasuredEcms2 for " << runNo << endreq;
316 m_tableOption = 1;
317 }
318
319 else if ((runNum >= 11414 && runNum <= 23454) || (runNum >= 43716 && runNum <= 47066)) {
320 log << MSG::INFO << "read table RunParams for " << runNo << endreq;
321 m_tableOption = 2;
322 }
323
324 else m_tableOption = -1;
325
326 return m_tableOption;
327}
328
329
330// Return the string depend on the parameters
331std::string MeasuredEcmsSvc::getRecord(int runNo, char *tab, char *col, char *min_col, char *max_col)
332{
333 std::string strRecord;
334 m_isRunNoValid = false;
335
336 MsgStream log(msgSvc(), name());
337 log << MSG::INFO << "MeasuredEcmsSvc begin read database " << tab << "-" << col << endreq;
338
339 int runNum = std::abs(runNo);
340
341 if (runNo < 0) log << MSG::INFO << "MeasuredEcmsSvc for MC events" << endreq;
342 else log << MSG::INFO << "MeasuredEcmsSvc for DT events" << endreq;
343
344 char stmt[500];
345 snprintf(stmt, 1024, "select %s from %s where %s <= %d and %s >= %d", col, tab, min_col, runNum, max_col, runNum);
346
348 int row_no = m_dbSvc->query("offlinedb", stmt, res);
349
350 if(row_no == 0) {
351 log << MSG::ERROR << "RowNo can not be 0 for " << tab << ", failed to read DB for " << runNo << endreq;
352 }
353 else {
354 log << MSG::INFO << "MeasuredEcmsSvc first read the runNo, read the " << tab << " database " << runNo << endreq;
355 strRecord = res[m_sele]->GetString(col);
356 m_isRunNoValid = true;
357 }
358
359 return strRecord;
360}
int runNo
Definition: DQA_TO_DB.cxx:12
IMessageSvc * msgSvc()
virtual int query(const std::string &dbName, const std::string &sql, DatabaseRecordVector &res)=0
static const InterfaceID & interfaceID()
virtual StatusCode queryInterface(const InterfaceID &riid, void **ppvIF)
std::map< int, int > m_mapBeamE
virtual ~MeasuredEcmsSvc()
void handle(const Incident &)
int triggerDBTable(int runNo)
virtual StatusCode initialize()
MeasuredEcmsSvc(const std::string &name, ISvcLocator *svcLoc)
virtual StatusCode finalize()
std::string getRecord(int runNo, char *tab, char *col, char *min_col, char *max_col)
void readDBTable(int runNo)