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