16# include "GaudiKernel/IDataProviderSvc.h"
17# include "GaudiKernel/IInterface.h"
18# include "GaudiKernel/ISvcLocator.h"
19# include "GaudiKernel/Kernel.h"
20# include "GaudiKernel/MsgStream.h"
21# include "GaudiKernel/PropertyMgr.h"
22# include "GaudiKernel/SmartDataPtr.h"
23# include "GaudiKernel/StatusCode.h"
26# include "GaudiKernel/IIncidentListener.h"
27# include "GaudiKernel/IIncidentSvc.h"
28# include "GaudiKernel/Incident.h"
30# include "EventModel/Event.h"
31# include "EventModel/EventHeader.h"
32# include "EventModel/EventModel.h"
33# include "GaudiKernel/Bootstrap.h"
34# include "GaudiKernel/ISvcLocator.h"
46 : base_class( name, svcloc ) {
48 declareProperty(
"Host", host = std::string(
"bes3db2.ihep.ac.cn" ) );
49 declareProperty(
"DbName", dbName = std::string(
"offlinedb" ) );
50 declareProperty(
"UserName", userName = std::string(
"guest" ) );
51 declareProperty(
"Password", password = std::string(
"guestpass" ) );
52 declareProperty(
"BossVer", m_bossver = std::string(
"default" ) );
53 declareProperty(
"VerPar", m_verpar = std::string(
"default" ) );
54 declareProperty(
"BossRelease", m_bossRelease = std::string(
"default" ) );
55 declareProperty(
"ReadOneTime", m_readOneTime =
false );
56 declareProperty(
"RunFrom", m_runFrom = 8093 );
57 declareProperty(
"RunTo", m_runTo = 9025 );
58 declareProperty(
"RunIdList", m_runIdList );
73 MsgStream log(
msgSvc(), name() );
74 log << MSG::INFO <<
"VertexDbSvc::initialize()" << endmsg;
76 StatusCode sc = Service::initialize();
77 if ( sc.isFailure() )
return sc;
80 sc = service(
"IncidentSvc", incsvc );
82 if ( sc.isSuccess() ) { incsvc->addListener(
this,
"NewRun", priority ); }
84 sc = serviceLocator()->service(
"DatabaseSvc", m_dbsvc,
true );
87 log << MSG::ERROR <<
"Unable to find DatabaseSvc " << endmsg;
91 sc = serviceLocator()->service(
"EventDataSvc", m_eventSvc,
true );
94 log << MSG::ERROR <<
"Unable to find EventDataSvc " << endmsg;
104 for (
unsigned int i = 0; i < m_runIdList.size(); i++ )
106 m_runFrom = m_runIdList[i];
108 m_runTo = m_runIdList[i];
111 if ( m_runFrom >= 8093 ) { getReadBunchInfo( m_runFrom, m_runTo ); }
112 else std::cout <<
"VertexDbSvc, invalid RunFrom, RunFrom should be >=8093" << std::endl;
116 return StatusCode::SUCCESS;
120 MsgStream log(
msgSvc(), name() );
121 log << MSG::INFO <<
"VertexDbSvc::finalize()" << endmsg;
123 return StatusCode::SUCCESS;
127 MsgStream log(
msgSvc(), name() );
128 log << MSG::DEBUG <<
"handle: " << inc.type() << endmsg;
130 if ( inc.type() ==
"NewRun" )
132 log << MSG::DEBUG <<
"NewRun" << endmsg;
133 if ( !m_readOneTime ) { getVertexTableInfo(); }
136 SmartDataPtr<Event::EventHeader> eventHeader( m_eventSvc,
"/Event/EventHeader" );
137 int run = eventHeader->runNumber();
139 if ( run < 0 ) run = -run;
140 if ( ( m_mapPrimaryVertex[run] ).size() > 0 )
142 m_isRunNumberValid =
true;
143 m_primaryVertex[0] = ( m_mapPrimaryVertex[run] )[0];
144 m_primaryVertex[1] = ( m_mapPrimaryVertex[run] )[1];
145 m_primaryVertex[2] = ( m_mapPrimaryVertex[run] )[2];
146 m_sigmaPrimaryVertex[0] = ( m_mapPrimaryVertex[run] )[3];
147 m_sigmaPrimaryVertex[1] = ( m_mapPrimaryVertex[run] )[4];
148 m_sigmaPrimaryVertex[2] = ( m_mapPrimaryVertex[run] )[5];
155 std::cout <<
"VertexDbSvc, could not get vertex infor in handle new run" << std::endl;
171 dbName =
"offlinedb";
172# ifdef ROOTEVENTDATAVERSION
173 m_bossver = ROOTEVENTDATAVERSION;
174 m_bossRelease = ROOTEVENTDATAVERSION;
176 m_bossver =
"default";
177 m_bossRelease =
"default";
179 m_verpar =
"default";
181 m_dbsvc = DatabaseSvc::instance();
188 static int save_run = 0;
189 if ( new_run == save_run )
return;
190 getVertexTableInfo( new_run );
196 if ( !m_isRunNumberValid )
198 cerr <<
"WARNING in VertexDbSvc: runNo is invalid!\n";
199 memset( m_primaryVertex, 0,
sizeof( m_primaryVertex ) );
201 return m_primaryVertex;
205 if ( !m_isRunNumberValid )
207 cerr <<
"WARNING in VertexDbSvc: runNo is invalid!\n";
208 memset( m_sigmaPrimaryVertex, 0,
sizeof( m_sigmaPrimaryVertex ) );
210 return m_sigmaPrimaryVertex;
214StatusCode VertexDbSvc::getVertexTableInfo() {
215 MsgStream log(
msgSvc(), name() );
216 SmartDataPtr<Event::EventHeader> eventHeader( m_eventSvc,
"/Event/EventHeader" );
217 int run = eventHeader->runNumber();
220void VertexDbSvc::getVertexTableInfo(
int run )
224 m_isRunNumberValid =
false;
230 log << MSG::INFO <<
"This data is the MC sample with the Run Number: " << run << endmsg;
232 cout <<
"This data is the MC sample with the Run Number: " << run << endl;
240 bool ret_vtx = getReadBunchInfo( run );
244 cout <<
" VertexDbSvc:: can not found vertex information for run:" << run
245 <<
", boss version " << m_bossver << endl;
278 m_isRunNumberValid =
true;
280 log << MSG::INFO <<
"Successfully fetch the vertex information for run: " << save_run
282 return StatusCode::SUCCESS;
284 cout <<
"Successfully fetch the vertex information for run: " << save_run << endl;
289bool VertexDbSvc::getReadBunchInfo(
int run )
292 if ( m_bossver ==
"default" )
294 if ( m_bossRelease ==
"default" )
297 MsgStream log(
msgSvc(), name() );
298 log << MSG::FATAL <<
"ERROR BossRelease must be set! Current value is " << m_bossRelease
301 cout <<
"ERROR BossRelease must be set! Current value is " << m_bossRelease <<
"."
310 "select SftVer, ParVer from CalVtxLumVer where BossRelease = '%s' and RunFrom "
311 "<= %d and RunTo >= %d and DataType = 'LumVtx'",
312 m_bossRelease.c_str(), run, run );
314 DatabaseRecordVector records;
315 int rowNo = m_dbsvc->query(
"offlinedb", stmt1, records );
319 MsgStream log(
msgSvc(), name() );
320 log << MSG::ERROR <<
"ERROR: can not find records for run = " << run
321 <<
" and BossRelease = " << m_bossRelease << endmsg;
323 cout <<
"ERROR: can not find records for run = " << run
324 <<
" and BossRelease = " << m_bossRelease << endl;
328 DatabaseRecord* recordst = records[0];
329 m_bossver = recordst->
GetString(
"SftVer" );
330 m_verpar = recordst->
GetString(
"ParVer" );
331 cout <<
"Using the SftVer and ParVer (" << m_bossver <<
", " << m_verpar <<
") for run "
332 << run <<
". " << endl;
336 string stmt =
"select Vx, Vy, Vz, SigmaVx, SigmaVy, SigmaVz ";
338 tmp <<
"from BeamPar where RunNo = " << run <<
" and SftVer=\'" << m_bossver <<
"\'";
339 if ( m_verpar ==
"default" ) { tmp <<
" group by ParVer"; }
340 else { tmp <<
" and ParVer = " << m_verpar; }
344 DatabaseRecordVector res;
345 int row_no = m_dbsvc->query( dbName, stmt, res );
349 DatabaseRecord& dbrec = *res[row_no - 1];
350 m_primaryVertex[0] = dbrec.
GetDouble(
"Vx" );
351 m_primaryVertex[1] = dbrec.
GetDouble(
"Vy" );
352 m_primaryVertex[2] = dbrec.
GetDouble(
"Vz" );
353 m_sigmaPrimaryVertex[0] = dbrec.
GetDouble(
"SigmaVx" );
354 m_sigmaPrimaryVertex[1] = dbrec.
GetDouble(
"SigmaVy" );
355 m_sigmaPrimaryVertex[2] = dbrec.
GetDouble(
"SigmaVz" );
362bool VertexDbSvc::getReadBunchInfo(
int runFrom,
int runTo )
365 if ( m_bossver ==
"default" )
367 if ( m_bossRelease ==
"default" )
370 MsgStream log(
msgSvc(), name() );
371 log << MSG::FATAL <<
"ERROR BossRelease must be set! Current value is " << m_bossRelease
374 cout <<
"ERROR BossRelease must be set! Current value is " << m_bossRelease <<
"."
383 "select SftVer, ParVer from CalVtxLumVer where BossRelease = '%s' and RunFrom "
384 "<= %d and RunTo >= %d and DataType = 'LumVtx'",
385 m_bossRelease.c_str(), runFrom, runTo );
387 DatabaseRecordVector records;
388 int rowNo = m_dbsvc->query(
"offlinedb", stmt1, records );
392 MsgStream log(
msgSvc(), name() );
393 log << MSG::ERROR <<
"ERROR: can not find records for run = " << runFrom
394 <<
" and BossRelease = " << m_bossRelease << endmsg;
396 cout <<
"ERROR: can not find records for run = " << runFrom
397 <<
" and BossRelease = " << m_bossRelease << endl;
401 DatabaseRecord* recordst = records[0];
402 m_bossver = recordst->
GetString(
"SftVer" );
403 m_verpar = recordst->
GetString(
"ParVer" );
404 cout <<
"Using the SftVer and ParVer (" << m_bossver <<
", " << m_verpar <<
") for run "
405 << runFrom <<
". " << endl;
409 string stmt =
"select RunNo, Vx, Vy, Vz, SigmaVx, SigmaVy, SigmaVz ";
411 tmp <<
"from BeamPar where RunNo >= " << runFrom <<
" and RunNo <= " << runTo
412 <<
" and SftVer=\'" << m_bossver <<
"\'";
413 if ( m_verpar ==
"default" ) { tmp <<
" group by ParVer"; }
414 else { tmp <<
" and ParVer = " << m_verpar; }
418 DatabaseRecordVector res;
419 int row_no = m_dbsvc->query( dbName, stmt, res );
421 std::cout <<
"VertexDbSvc get all vertex info, row_no: " << row_no << std::endl;
424 for (
int i = 0; i < row_no; i++ )
426 DatabaseRecord& dbrec = *res[i];
427 int run = dbrec.
GetInt(
"RunNo" );
428 std::vector<double> vertex;
429 vertex.push_back( dbrec.
GetDouble(
"Vx" ) );
430 vertex.push_back( dbrec.
GetDouble(
"Vy" ) );
431 vertex.push_back( dbrec.
GetDouble(
"Vz" ) );
432 vertex.push_back( dbrec.
GetDouble(
"SigmaVx" ) );
433 vertex.push_back( dbrec.
GetDouble(
"SigmaVy" ) );
434 vertex.push_back( dbrec.
GetDouble(
"SigmaVz" ) );
435 m_mapPrimaryVertex[run] = vertex;
DECLARE_COMPONENT(BesBdkRc)
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
double GetDouble(std::string key)
int GetInt(std::string key)
std::string GetString(std::string key)
VertexDbSvc(const std::string &name, ISvcLocator *svcloc)
void handle(const Incident &)
virtual StatusCode initialize()
double * SigmaPrimaryVertex()
virtual StatusCode finalize()