00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "GaudiKernel/Kernel.h"
00010 #include "GaudiKernel/IInterface.h"
00011 #include "GaudiKernel/StatusCode.h"
00012 #include "GaudiKernel/SvcFactory.h"
00013 #include "GaudiKernel/MsgStream.h"
00014 #include "GaudiKernel/IIncidentSvc.h"
00015 #include "GaudiKernel/Incident.h"
00016 #include "GaudiKernel/IIncidentListener.h"
00017 #include "GaudiKernel/IDataProviderSvc.h"
00018 #include "GaudiKernel/Service.h"
00019 #include "GaudiKernel/SmartDataPtr.h"
00020 #include "EventModel/EventModel.h"
00021 #include "EventModel/Event.h"
00022 #include "EventModel/EventHeader.h"
00023 #include "DedxCurSvc/DedxCurSvc.h"
00024 #include "TTree.h"
00025 #include "TBuffer.h"
00026 #include "TBufferFile.h"
00027
00028 #include <math.h>
00029
00030 using namespace std;
00031
00032 DedxCurSvc::DedxCurSvc( const std::string& name, ISvcLocator* svcloc ) : Service(name, svcloc) {
00033 declareProperty("BossRelease",m_bossRelease="default");
00034 declareProperty("BossVer",m_sftver="default");
00035 declareProperty("ParVer",m_calParVer="default");
00036 declareProperty("DbStatus",m_dbStatus="OK");
00037 declareProperty("Type",m_type="default");
00038 }
00039
00040
00041 StatusCode DedxCurSvc::queryInterface (const InterfaceID& riid, void** ppvInterface ){
00042
00043 if ( IID_IDedxCurSvc.versionMatch(riid) ) {
00044 *ppvInterface = static_cast<IDedxCurSvc*> (this);
00045 }
00046 else return Service::queryInterface(riid, ppvInterface) ;
00047 return StatusCode::SUCCESS;
00048 }
00049
00050
00051 StatusCode DedxCurSvc::initialize ( ) {
00052
00053 MsgStream log(msgSvc(), name());
00054 log << MSG::INFO << name() << ": Start of run initialisation" << endreq;
00055
00056 StatusCode sc = Service::initialize();
00057 if ( sc.isFailure() ) return sc;
00058
00059 IIncidentSvc* incsvc;
00060 sc = service("IncidentSvc", incsvc);
00061 int priority = 100;
00062 if( sc.isSuccess() ){
00063 incsvc -> addListener(this, "NewRun", priority);
00064 }
00065
00066
00067 sc = serviceLocator()->service("DatabaseSvc",m_dbsvc,true);
00068 if (sc .isFailure() ) {
00069 log << MSG::ERROR << "Unable to find DatabaseSvc " << endreq;
00070 return sc;
00071 }
00072
00073
00074 sc = serviceLocator()->service("EventDataSvc", m_eventSvc, true);
00075 if (sc .isFailure() ) {
00076 log << MSG::ERROR << "Unable to find EventDataSvc " << endreq;
00077 return sc;
00078 }
00079
00080 StatusCode scc;
00081 log<<MSG::INFO << "setProperties()" << endreq;
00082 scc = setProperties();
00083
00084 m_runFromMax=0;
00085 m_runToMin=0;
00086
00087 return sc;
00088 }
00089
00090
00091 StatusCode DedxCurSvc::finalize ( ) {
00092 MsgStream log(msgSvc(), name());
00093 log << MSG::INFO << name() << ": End of Run" << endreq;
00094 return StatusCode::SUCCESS;
00095 }
00096
00097
00098 DedxCurSvc::~DedxCurSvc(){
00099 }
00100
00101
00102
00103 void DedxCurSvc::handle(const Incident& inc){
00104 MsgStream log( messageService(), name() );
00105 log << MSG::DEBUG << "handle: " << inc.type() << endreq;
00106
00107 SmartDataPtr<Event::EventHeader> eventHeader(m_eventSvc,"/Event/EventHeader");
00108 int run = eventHeader->runNumber();
00109
00110 if ( inc.type() == "NewRun" ){
00111 log << MSG::DEBUG << "New Run:" << run << endreq;
00112 getDedxCurveInfo();
00113 }
00114 }
00115
00116
00117 void DedxCurSvc::getDedxCurveInfo(){
00118 MsgStream log(messageService(), name());
00119 SmartDataPtr<Event::EventHeader> eventHeader(m_eventSvc,"/Event/EventHeader");
00120 int run = eventHeader->runNumber();
00121 if(run<0){
00122 log << MSG::INFO << "This data is the MC sample with the Run Number: " << run << endreq;
00123 if(m_type=="Sim"){
00124 run=-run;
00125 log << MSG::INFO << "Reverse the sign of Run Number" << endreq;
00126 }
00127 }
00128
00129 MYSQL_RES *res_set;
00130 MYSQL_ROW row;
00131 char stmt1[400];
00132
00133 std::string sftver;
00134
00135 if(m_sftver == "default" && m_bossRelease == "default")
00136 {
00137 log << MSG::FATAL << " BossRelease and BossVer for DedxCurve not set!" << endreq;
00138 exit(1);
00139 }
00140
00141 if( (run<m_runFromMax || run>m_runToMin) )
00142 {
00143 if(m_sftver == "default")
00144 {
00145 sprintf(stmt1,"select RunFrom, RunTo, SftVer, ParVer from CalVtxLumVer where BossRelease = '%s' and RunFrom <= %d and RunTo >= %d and DataType = 'DedxCurve'", m_bossRelease.c_str(), run, run);
00146 std::cout<<stmt1<<std::endl;
00147 DatabaseRecordVector rest;
00148 int row_no = m_dbsvc->query("offlinedb",stmt1,rest);
00149 if(row_no==0) {
00150 log << MSG::FATAL << "can not find result for DedxCur with: " << stmt1 << endreq;
00151 exit(1);
00152 }
00153 if(row_no>1) {
00154 log << MSG::FATAL << "find more than 1 results for DedxCur with: " << stmt1 << endreq;
00155 exit(1);
00156 }
00157 DatabaseRecord* recordst = rest[0];
00158 sftver = recordst->GetString("SftVer");
00159 m_calParVer = recordst->GetString("ParVer");
00160 m_runFromMax = atoi((recordst->GetString("RunFrom")).c_str());
00161 m_runToMin = atoi((recordst->GetString("RunTo")).c_str());
00162 log << MSG::INFO << "get from CalVtxLumVer, m_runFromMax: "<< m_runFromMax << " m_runToMin: "<<m_runToMin<< endreq;
00163 }
00164 else
00165 sftver = m_sftver;
00166
00167 if(m_calParVer!="default")
00168 sprintf(stmt1,"select RunFrom, RunTo, DedxCurvePar,DedxSigmaPar from DedxCurvePar where SftVer = '%s' and RunFrom <= %d and RunTo >= %d and DedxCurveParVer = %s and Status='%s'",sftver.c_str(),run,run,m_calParVer.c_str(), m_dbStatus.c_str());
00169 else
00170 sprintf(stmt1,"select RunFrom, RunTo, DedxCurvePar,DedxSigmaPar from DedxCurvePar where SftVer = '%s' and RunFrom <= %d and RunTo >= %d and Status='%s' order by DedxCurveParVer desc",sftver.c_str(),run,run, m_dbStatus.c_str());
00171 std::cout<<stmt1<<std::endl;
00172
00173 DatabaseRecordVector res;
00174 int row_no = m_dbsvc->query("offlinedb", stmt1, res);
00175 if(row_no==0){
00176 log << MSG::FATAL << "can not find result for DedxCur with: "<< stmt1 << endreq;
00177 exit(1);
00178 }
00179 if(row_no>1){
00180 log << MSG::FATAL << "find more than 1 results for DedxCur with: "<< stmt1 << endreq;
00181 exit(1);
00182 }
00183
00184 DatabaseRecord* records = res[0];
00185 int runFrom = atoi((records->GetString("RunFrom")).c_str());
00186 int runTo = atoi((records->GetString("RunTo")).c_str());
00187 if(m_sftver=="default")
00188 {
00189 m_runFromMax = runFrom>m_runFromMax? runFrom:m_runFromMax;
00190 m_runToMin = runTo<m_runToMin? runTo:m_runToMin;
00191 }
00192 else
00193 {
00194 m_runFromMax = runFrom;
00195 m_runToMin = runTo;
00196 }
00197 log << MSG::INFO << "get from DedxCurvePar runFrom: "<< runFrom << " runTo: "<<runTo<< endreq;
00198 log << MSG::INFO << "m_runFromMax: "<< m_runFromMax << " m_runToMin: "<<m_runToMin<< endreq;
00199
00200 TBuffer *buf1 = new TBufferFile(TBuffer::kRead);
00201 buf1->SetBuffer((*records)["DedxCurvePar"],327680,kFALSE);
00202 TBuffer *buf2 = new TBufferFile(TBuffer::kRead);
00203 buf2->SetBuffer((*records)["DedxSigmaPar"],327680,kFALSE);
00204
00205
00206 TTree* curvetree = new TTree();
00207 curvetree->Streamer(*buf1);
00208
00209 TTree* sigmatree = new TTree();
00210 sigmatree->Streamer(*buf2);
00211
00212 double curve[50];
00213 double sigma[50];
00214 int SigmaSize;
00215 int CurveSize;
00216 curvetree -> SetBranchAddress("curve", curve);
00217 curvetree -> SetBranchAddress("CurveSize", &CurveSize);
00218 sigmatree -> SetBranchAddress("sigma", sigma);
00219 sigmatree -> SetBranchAddress("SigmaSize", &SigmaSize);
00220
00221 Int_t nentries_curve = (Int_t)curvetree ->GetEntries();
00222 Int_t nentries_sigma = (Int_t)sigmatree ->GetEntries();
00223 curvetree -> GetEntry(0);
00224 if(CurveSize>50){
00225 log << MSG::ERROR<<"CurveSize larger than designed number"<<endreq;
00226 exit(1);}
00227 for(int i=0; i<CurveSize;i++){
00228 m_curve[i]=curve[i];
00229 }
00230
00231 sigmatree-> GetEntry(0);
00232 if(SigmaSize>50){
00233 log << MSG::ERROR<<"SigmaSize larger than designed number"<<endreq;
00234 exit(1);}
00235 for(int i=0; i<SigmaSize;i++){
00236 m_sigma[i]=sigma[i];}
00237 m_curve_size=CurveSize;
00238 m_sigma_size=SigmaSize;
00239 delete curvetree;
00240 delete sigmatree;
00241 }
00242 return;
00243 }
00244
00245