BOSS 7.0.7
BESIII Offline Software System
Loading...
Searching...
No Matches
RealizationSvc.cxx
Go to the documentation of this file.
3#include "GaudiKernel/Kernel.h"
4#include "GaudiKernel/IInterface.h"
5#include "GaudiKernel/IIncidentSvc.h"
6#include "GaudiKernel/Incident.h"
7#include "GaudiKernel/IIncidentListener.h"
8#include "GaudiKernel/StatusCode.h"
9#include "GaudiKernel/SvcFactory.h"
10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/IDataProviderSvc.h"
12#include "GaudiKernel/SmartDataPtr.h"
13#include "GaudiKernel/DataSvc.h"
14#include <stdint.h>
15#include "CLHEP/Random/RandGauss.h"
16#include <vector>
17
20
21using namespace std;
22
23
24RealizationSvc::RealizationSvc( const string& name, ISvcLocator* svcloc) :
25 Service (name, svcloc) {
26 m_CaliConst = 100;
27 declareProperty("RunIDList", m_runNoList);
28 declareProperty("IfUseDB", m_useDB = true);
29 declareProperty("IfReadBunch", m_ifReadBunch = true);
30 declareProperty("IfUseTrg", m_ifReadTrg = false);
31 declareProperty("IfReadRanTrg", m_ifReadRandTrg = false);
32 declareProperty("IfReadTFEE", m_ifReadTFEE = false);
33 declareProperty("IfReadRunInfo", m_ifReadRunInfo = false);
34 declareProperty("BossRelease", m_bossRelease="default");
35 declareProperty("SftVer", m_SftVer = "default");
36 declareProperty("ParVer", m_ParVer = "default");
37 declareProperty("InitEvtID", m_initEvtID = 0);
38}
39
41 MsgStream log(messageService(), name());
42 log << MSG::INFO << "RealizationSvc::initialize()" << endreq;
43
44 StatusCode sc = Service::initialize();
45 if( sc.isFailure() ) return sc;
46
47 if(m_SftVer == "NONE") m_SftVer = getenv("BES_RELEASE");
48
49 for(unsigned int i = 0; i < m_runNoList.size(); i++) {
50 if(m_runNoList[i] != 0) {
51 std::cout <<"run id : " << m_runNoList[i] << std::endl;
52 if(find(m_runIdList.begin(),m_runIdList.end(),m_runNoList[i]) == m_runIdList.end()) m_runIdList.push_back(m_runNoList[i]);
53 else log << MSG::ALWAYS <<"RunNo "<<m_runNoList[i]<<" repeated in run list"<<endreq;
54 }
55 else {
56 if(i == 0 || (i+1) >= m_runNoList.size()) log << MSG::ERROR << "Please check your run id list, it is wrong" << endreq;
57 if(m_runNoList[i+1] < m_runNoList[i-1]) {
58 for(int j = m_runNoList[i+1]+1; j < m_runNoList[i-1]; j++) {
59 if(find(m_runIdList.begin(),m_runIdList.end(),j) == m_runIdList.end()) m_runIdList.push_back(j);
60 else log << MSG::ALWAYS <<"RunNo "<<j<<" repeated in run list"<<endreq;
61 }
62 }
63 else {
64 for(int j = m_runNoList[i-1]+1; j < m_runNoList[i+1]; j++) {
65 if(find(m_runIdList.begin(),m_runIdList.end(),j) == m_runIdList.end()) m_runIdList.push_back(j);
66 else log << MSG::ALWAYS <<"RunNo "<<j<<" repeated in run list"<<endreq;
67 }
68 }
69 }
70 }
71 m_runID = m_runIdList[0];
72
73 int runMin = m_runID, runMax = m_runID;
74 for ( unsigned int i = 1; i < m_runIdList.size(); ++i ) {
75 int _run = m_runIdList[i];
76 if ( _run < runMin ) {
77 runMin = _run;
78 }
79 else if ( _run > runMax ) {
80 runMax = _run;
81 }
82 }
83 IDetVerSvc* idvSvc;
84 sc = service("DetVerSvc", idvSvc);
85 DetVerSvc* dvSvc = dynamic_cast<DetVerSvc*>(idvSvc);
86 if ( dvSvc->fromRun(abs(runMin)) != dvSvc->fromRun(abs(runMax)) ) {
87 log << MSG::ERROR << "wrong run range ["
88 << runMin << " to " << runMax << "], crossed detector configuration" << endreq;
89 return StatusCode::FAILURE;
90 }
91
92 m_connect = new RealDBUtil::ConnectionProvider();
93 if (!m_connect) {
94 log << MSG::ERROR << "Could not open connection to database" << endreq;
95 }
96
97 IIncidentSvc* incsvc;
98 sc = service("IncidentSvc", incsvc);
99 int priority = 100;
100 if( sc.isSuccess() ){
101 incsvc -> addListener(this, "NewRun", priority);
102 }
103
104 sc = serviceLocator()->service("EventDataSvc", m_eventSvc, true);
105 if (sc.isFailure() ) {
106 log << MSG::ERROR << "Unable to find EventDataSvc " << endreq;
107 return sc;
108 }
109
110 return StatusCode::SUCCESS;
111}
112
114 MsgStream log(messageService(), name());
115 log << MSG::INFO << "RealizationSvc::finalize()" << endreq;
116
117 return StatusCode::SUCCESS;
118}
119
120StatusCode RealizationSvc::queryInterface(const InterfaceID& riid, void** ppvInterface)
121{
122 if ( IRealizationSvc::interfaceID().versionMatch(riid) ) {
123 *ppvInterface = (IRealizationSvc*)this;
124 }else{
125 return Service::queryInterface(riid, ppvInterface);
126 }
127 addRef();
128 return StatusCode::SUCCESS;
129}
130
131void RealizationSvc::handle(const Incident& inc){
132 MsgStream log( messageService(), name() );
133 log << MSG::DEBUG << "handle: " << inc.type() << endreq;
134 if ( inc.type() == "NewRun" ){
135 log << MSG::DEBUG << "Begin New Run" << endreq;
136 if(m_useDB == true) {
137 int runNo;
138 SmartDataPtr<Event::EventHeader> evt(m_eventSvc,"/Event/EventHeader");
139 if( evt ){
140 runNo = evt -> runNumber();
141 log << MSG::INFO <<"The runNumber of current event is "<<runNo<<endreq;
142 }
143 else {
144 log << MSG::ERROR <<"Can not get EventHeader!"<<endreq;
145 }
146 readDB(std::abs(runNo));
147 }
148 }
149}
150
153
154 MsgStream log( messageService(), name() );
155 std::string sLum;
156 ConnectionProvider::eRet e = m_connect->getReadLumInfo(sLum,runNo, m_SftVer, m_ParVer, m_bossRelease);
157 if(e != 0 ) {
158 log << MSG::ERROR << "Could not find Luminosity infor., exit." << endreq;
159 exit(1);
160 }
161 m_lumi = std::atof(sLum.c_str());
162 log << MSG::INFO << "Luminosity is " << m_lumi << " in Run " << runNo << endreq;
163 return m_lumi;
164}
165
166std::vector<std::string> RealizationSvc::getBgFileName(std::string query) {
167 MsgStream log( messageService(), name() );
169
170 std::vector<std::string> Bgfilename;
171 Bgfilename.clear();
172
173 std::vector<std::string> fileInfor;
174 ConnectionProvider::eRet e = m_connect->getReadBackgroundInfo(fileInfor,query);
175 if(e != 0 ) {
176 log << MSG::ERROR << "Could not find background infor., exit." << endreq;
177 exit(1);
178 }
179
180 for(unsigned int i = 0; i < fileInfor.size(); i+=2)
181 {
182 Bgfilename.push_back(fileInfor[i]+"/"+fileInfor[i+1]);
183 }
184 fileInfor.clear();
185
186 for(unsigned int i = 0; i < Bgfilename.size(); i++) {
187 log << MSG::INFO << "Background file name: " << Bgfilename[i] << endreq;
188 }
189
190 return Bgfilename;
191}
192/*
193std::vector<int> RealizationSvc::getRunEvtNum(std::vector<int> inrunList, int EvtMax) {
194 std::vector<int> outrunList;
195 std::vector<int> vRunEvtNum;
196 outrunList.clear();
197 vRunEvtNum.clear();
198
199 for(int i = 0; i < inrunList.size(); i++) {
200 if(inrunList[i] != 0) {
201 std::cout <<"run id : " << inrunList[i] << std::endl;
202 if(find(outrunList.begin(),outrunList.end(),inrunList[i]) == outrunList.end()) outrunList.push_back(inrunList[i]);
203 else std::cout << "RunNo "<<inrunList[i]<<" repeated in run list"<< std::endl;
204 }
205 else {
206 if(i == 0 || (i+1) >= inrunList.size()) std::cerr << "Please check your run id list, it is wrong" << std::endl;
207 if(inrunList[i+1] < inrunList[i-1]) {
208 for(int j = inrunList[i+1]+1; j < inrunList[i-1]; j++) {
209 if(find(outrunList.begin(),outrunList.end(),j) == outrunList.end()) outrunList.push_back(j);
210 else std::cout <<"RunNo "<<j<<" repeated in run list"<< std::endl;
211 }
212 }
213 else {
214 for(int j = inrunList[i-1]+1; j < inrunList[i+1]; j++) {
215 if(find(outrunList.begin(),outrunList.end(),j) == outrunList.end()) outrunList.push_back(j);
216 else std::cout <<"RunNo "<<j<<" repeated in run list"<< std::endl;
217 }
218 }
219 }
220 }
221
222 std::vector<float> lumi;
223 lumi.clear();
224 float totLumi = 0;
225 for(unsigned int i = 0; i < outrunList.size(); i++)
226 {
227 float lumi_value = getLuminosity(outrunList[i]);
228 lumi.push_back(lumi_value);
229 totLumi += lumi_value;
230 }
231
232 int totSimEvt = 0;
233 int evtSubNo = 0;
234 if(totLumi != 0) {
235 for(unsigned int i = 0; i < (lumi.size() - 1); i++) {
236 //if(i == 0) m_evtNoList.push_back(0);
237 double ratio = lumi[i]/totLumi*EvtMax;
238 evtSubNo = int (ratio);
239 if((ratio-evtSubNo) >= 0.5) evtSubNo = evtSubNo + 1;
240 totSimEvt += evtSubNo;
241 if(evtSubNo == 0) {
242 std::cout << "The run " <<outrunList[i]<<" is not simulated, due to the luminosity is too small!" << std::endl;
243 }
244 else {
245 vRunEvtNum.push_back(outrunList[i]);
246 vRunEvtNum.push_back(evtSubNo);
247 }
248 std::cout <<"Total "<< evtSubNo <<" events need to be simulated in run " <<outrunList[i]<< std::endl;
249 }
250 vRunEvtNum.push_back(outrunList[lumi.size() - 1]); //set the last run id
251 vRunEvtNum.push_back(EvtMax - totSimEvt);
252 std::cout <<"Total "<< EvtMax - totSimEvt <<" events need to be simulated in run " <<outrunList[lumi.size() - 1]<< std::endl;
253 }
254 else {
255 std::cerr << "ERORR: " << "Total luminosity is ZERO!!! Please check your run list. " << std::endl;
256 std::abort();
257 }
258
259 return vRunEvtNum;
260}
261*/
263 MsgStream log( messageService(), name() );
264 log << MSG::DEBUG << "In getCaliConst" << endreq;
265
267
268 StatusCode sc;
269
270 //Get bunch infor
271 if(m_ifReadBunch == true) {
272 std::vector<std::string> sbunch;
273 std::vector<double> bunchInfo;
274 ConnectionProvider::eRet e = m_connect->getReadBunchInfo(sbunch,runNo,m_SftVer,m_ParVer,m_bossRelease);
275 if(e == 7 ) {
276 bool last = true;
277 for(int id = 1; true; id++) {
278 e = m_connect->getReadBunchInfo(sbunch,runNo+id,m_SftVer,m_ParVer,m_bossRelease);
279 last = true;
280 if(e == 7) {
281 if((runNo-id) > 0) {
282 e = m_connect->getReadBunchInfo(sbunch,runNo-id,m_SftVer,m_ParVer,m_bossRelease);
283 last = false;
284 }
285 }
286 if(e == 0) {
287 if(last == true) log << MSG::INFO << "Use Bunch infor. of run " << runNo+id << " instead of run " << runNo << endreq;
288 if(last == false) log << MSG::INFO << "Use Bunch infor. of run " << runNo-id << " instead of run " << runNo << endreq;
289 break;
290 }
291 }
292 }
293 if(e != 0 && e != 7) {
294 log << MSG::ERROR << "Could not find Bunch infor., exit." << endreq;
295 exit(1);
296 }
297 for(unsigned int i = 0; i < sbunch.size(); i++)
298 {
299 bunchInfo.push_back(atof(sbunch[i].c_str()));
300 }
301 sbunch.clear();
302
303 if(bunchInfo.size() == 6)
304 {
305 //convert from cm to mm
306 m_bunch_x = 10*bunchInfo[0];
307 m_bunch_y = 10*bunchInfo[1];
308 m_bunch_z = 10*bunchInfo[2];
309 m_sigma_x = 10*bunchInfo[3];
310 m_sigma_y = 10*bunchInfo[4];
311 m_sigma_z = 10*bunchInfo[5];
312 log << MSG::INFO << "BunchPosX: " << m_bunch_x << " BunchPosY: " << m_bunch_y << " BunchPosZ: " << m_bunch_z << " in Run " << runNo << endreq;
313 log << MSG::INFO << "BunchSigmaX: " << m_sigma_x << " BunchSigmaY: " << m_sigma_y << " BunchSigmaZ: " << m_sigma_z << " in Run " << runNo << endreq;
314 }
315 else {
316 log << MSG::ERROR << "Please check the bunch information, the size is " << bunchInfo.size() << endreq;
317 }
318 bunchInfo.clear();
319 }
320
321 //get trigger table
322 if(m_ifReadTrg == true) {
323 m_trgTable.clear();
324 std::vector<std::string> strgTable;
325 ConnectionProvider::eRet e = m_connect->getReadTrgTableInfo(strgTable,runNo);
326 if(e != 0 ) {
327 log << MSG::ERROR << "Could not find TrgTable infor., exit." << endreq;
328 exit(1);
329 }
330 for(unsigned int i = 0; i < strgTable.size(); i++)
331 {
332 long long value = 0;
333 for (unsigned int j = 0; j < (strgTable[i]).length(); j++)
334 {
335 value = value*10 + (strgTable[i][j] - '0');
336 }
337 m_trgTable.push_back(uint32_t(value));
338 }
339 strgTable.clear();
340 if(m_trgTable.size() != 65) log << MSG::ERROR << "Please check the TrgTable information, the size is " << m_trgTable.size() << endreq;
341
342 std::vector<double> vtrgGain;
343 e = m_connect->getEmcGain(vtrgGain,runNo);
344 if(e != 0 ) {
345 log << MSG::ERROR << "Could not find emc gain infor., exit." << endreq;
346 exit(1);
347 }
348 for(unsigned int i = 0; i < vtrgGain.size(); i++) {
349 m_trgGain[i] = vtrgGain[i];
350 }
351
352 //get trigger config information
353 e = m_connect->getTrgConfigInfo(runNo);
354 if(e != 0 ) {
355 log << MSG::ERROR << "Could not find Trigger config infor., exit." << endreq;
356 exit(1);
357 }
358 m_EtotDataSteps = m_connect->getEtotDataSteps();
359 m_VthBEtotH = m_connect->getVthBEtotH();
360 m_VthEEtotH = m_connect->getVthEEtotH();
361 m_VthEtotL = m_connect->getVthEtotL();
362 m_VthEtotM = m_connect->getVthEtotM();
363 m_VthBLZ = m_connect->getVthBLZ();
364 m_VthDiffB = m_connect->getVthDiffB();
365 m_VthDiffE = m_connect->getVthDiffE();
366 m_VthBalBLK = m_connect->getVthBalBLK();
367 m_VthBalEEMC = m_connect->getVthBalEEMC();
368 m_VthDiffMin = m_connect->getVthDiffMin();
369 }
370
371 //get background file
372 if(m_ifReadRandTrg == true) {
373 std::vector<std::string> fileInfor;
374 ConnectionProvider::eRet e = m_connect->getReadBackgroundInfo(fileInfor,runNo);
375 if(e == 7 ) {
376 bool last = true;
377 for(int id = 1; true; id++) {
378 e = m_connect->getReadBackgroundInfo(fileInfor,runNo+id);
379 last = true;
380 if(e == 7) {
381 if((runNo-id) > 0) {
382 e = m_connect->getReadBackgroundInfo(fileInfor,runNo-id);
383 last = false;
384 }
385 }
386 if(e == 0) {
387 if(last == true) log << MSG::INFO << "Use Bg files of run " << runNo+id << " instead of run " << runNo << endreq;
388 if(last == false) log << MSG::INFO << "Use Bg files of run " << runNo-id << " instead of run " << runNo << endreq;
389 break;
390 }
391 }
392 }
393 if(e != 0 && e != 7) {
394 log << MSG::ERROR << "Could not find background infor., exit." << endreq;
395 exit(1);
396 }
397 m_bgfilename.clear();
398 for(unsigned int i = 0; i < fileInfor.size(); i+=2)
399 {
400 m_bgfilename.push_back(fileInfor[i]+"/"+fileInfor[i+1]);
401 }
402 fileInfor.clear();
403 for(unsigned int i = 0; i < m_bgfilename.size(); i++) {
404 log << MSG::INFO << "Background file name: " << m_bgfilename[i] << " in run " << runNo << endreq;
405 }
406
407 //get luminosity curve parameters
408 std::string srunTime;
409 std::string stau_value;
410 e = m_connect->getLumCurvePar(srunTime, stau_value, runNo, m_SftVer, m_ParVer, m_bossRelease);
411 if(e != 0 ) {
412 log << MSG::ERROR << "Could not find Luminosity curve parameters, exit." << endreq;
413 exit(1);
414 }
415 m_runTotalTime = std::atof(srunTime.c_str());
416 m_tauValue = std::atof(stau_value.c_str());
417 log << MSG::INFO << "Total time is " << m_runTotalTime << ", tau is " << m_tauValue << " in run " << runNo << ". " << endreq;
418 }
419
420 //get tof threshold in table TFEE
421 if(m_ifReadTFEE == true) {
422 m_tfee.clear();
423 ConnectionProvider::eRet e = m_connect->getReadTofThreshInfo(m_tfee,runNo);
424 if(e != 0 ) {
425 log << MSG::ERROR << "Could not find TFEE infor., exit." << endreq;
426 exit(1);
427 }
428
429 for(unsigned int i = 0; i < m_tfee.size(); i++) {
430 log << MSG::INFO << "TFEE ----> " << m_tfee[i] << endreq;
431 }
432 }
433
434 //get run infor.
435 if(m_ifReadRunInfo == true) {
436 m_runInfo.clear();
437 std::vector<std::string> srunInfo;
438 ConnectionProvider::eRet e = m_connect->getRunInfo(srunInfo,runNo);
439 if(e != 0 ) {
440 log << MSG::ERROR << "Could not find run infor., exit." << endreq;
441 exit(1);
442 }
443 for(unsigned int i = 0; i < srunInfo.size(); i++)
444 {
445 m_runInfo.push_back(atof(srunInfo[i].c_str()));
446 }
447 srunInfo.clear();
448
449 for(unsigned int i = 0; i < m_runInfo.size(); i++) {
450 log << MSG::INFO << "runInfo ----> " << m_runInfo[i] << endreq;
451 }
452 }
453
454}
455
457}
int runNo
Definition: DQA_TO_DB.cxx:12
int fromRun(unsigned int run)
Definition: DetVerSvc.cxx:84
static const InterfaceID & interfaceID()
ConnectionProvider::eRet getRunInfo(std::vector< std::string > &runInfo, int runNo)
ConnectionProvider::eRet getReadBunchInfo(std::vector< std::string > &bunch, int runNo, std::string SftVer, std::string ParVer, std::string BossRelease)
ConnectionProvider::eRet getLumCurvePar(std::string &runTotalTime, std::string &tau_value, int runNo, std::string SftVer, std::string ParVer, std::string BossRelease)
ConnectionProvider::eRet getTrgConfigInfo(int runNo)
ConnectionProvider::eRet getReadLumInfo(std::string &Lum, int runNo, std::string SftVer, std::string ParVer, std::string BossRelease)
ConnectionProvider::eRet getEmcGain(std::vector< double > &emcGain, int runNo)
ConnectionProvider::eRet getReadTrgTableInfo(std::vector< std::string > &trgTable, int runNo)
ConnectionProvider::eRet getReadBackgroundInfo(std::vector< std::string > &fileInfor, int runNo)
ConnectionProvider::eRet getReadTofThreshInfo(std::vector< std::string > &tofThresh, int runNo)
RealizationSvc(const std::string &name, ISvcLocator *svcloc)
virtual StatusCode finalize()
virtual StatusCode queryInterface(const InterfaceID &riid, void **ppvInterface)
virtual StatusCode initialize()
std::vector< std::string > getBgFileName()
void handle(const Incident &)
void readDB(int runNo)
float getLuminosity()