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